@@ -9,6 +9,7 @@ import android.os.Bundle
99import android.os.Handler
1010import android.os.Looper
1111import android.text.Editable
12+ import android.text.SpannableStringBuilder
1213import android.text.TextUtils
1314import android.text.TextWatcher
1415import android.text.method.PasswordTransformationMethod
@@ -266,12 +267,24 @@ class AddCard : AppCompatActivity() {
266267 if (s.isNotEmpty() && s.length % 5 == 0 ) {
267268 val c = s[s.length - 1 ]
268269 if (space == c) s.delete(s.length - 1 , s.length)
269- }
270-
271- if (s.isNotEmpty() && s.length % 5 == 0 ) {
272- val c = s[s.length - 1 ]
273270 if (Character .isDigit(c) && TextUtils .split(s.toString(), space.toString()).size <= 3 ) s.insert(s.length - 1 , space.toString())
274271 }
272+ if (s.toString().replace(" " , " " ).length in 0 .. 16 ) {
273+ cardNumberInput.removeTextChangedListener(this )
274+ cardNumberInput.setText(s.toString().replace(" " , " " ).replace(" ...." .toRegex(), " $0 " )?.trim())
275+ cardNumberInput.addTextChangedListener(this )
276+ cardNumberInput.setSelection(cardNumberInput.text.toString().length)
277+ }
278+ if (s.toString().replace(" " , " " ).length in 17 .. 18 ) {
279+ for (c in s) {
280+ if (c == ' ' ) {
281+ s.delete(s.indexOf(c), s.indexOf(c)+ 1 )
282+ }
283+ }
284+ }
285+ if (s.toString().replace(" " , " " ).length > 19 ) {
286+ s.delete(s.length - 1 , s.length)
287+ }
275288 }
276289 override fun beforeTextChanged (cardNumber : CharSequence , start : Int , count : Int , after : Int ) { }
277290 override fun onTextChanged (cardNumber : CharSequence , start : Int , before : Int , count : Int ) {
@@ -372,7 +385,9 @@ class AddCard : AppCompatActivity() {
372385 vault.card?.remove(io.getCard(itemId!! , vault))
373386 }
374387
375- if (cardNumberInput.text.toString().length < 16 ) cardNumberInput.error = " Enter a valid 16 digit card number"
388+ if (cardNumberInput.text.toString().replace(" " , " " ).length < 16 ) cardNumberInput.error = " Enter a valid 16 digit card number"
389+ else if (cardNumberInput.text.toString().replace(" " , " " ).length in 17 .. 18
390+ || cardNumberInput.text.toString().replace(" " , " " ).length > 19 ) cardNumberInput.error = " Enter a valid 19 digit card number"
376391 else if (securityCode.text.toString().length !in 3 .. 4 ) securityCode.error = " Enter a valid security code"
377392 else if (toDate.text.toString().isEmpty()) toDate.error = " Enter an expiry date"
378393 else if (cardholderNameInput.text.toString().isEmpty()) cardholderNameInput.error = " Enter card holder's name"
@@ -438,7 +453,9 @@ class AddCard : AppCompatActivity() {
438453
439454 notesInput.setText(card.notes)
440455
441- cardNumberInput.setText(card.cardNumber?.replace(" ...." .toRegex(), " $0 " ))
456+ if (card.cardNumber?.length!! == 16 ) cardNumberInput.setText(card.cardNumber.replace(" ...." .toRegex(), " $0 " ))
457+ else cardNumberInput.setText(card.cardNumber)
458+
442459 toDate.setText(card.expiry)
443460 securityCode.setText(card.securityCode)
444461 cardholderNameInput.setText(card.cardholderName)
0 commit comments