tinkoff-mobile-tech / decoro

Android library designed for automatic formatting of text input by custom rules
Apache License 2.0
391 stars 31 forks source link

Update MaskImpl.java #52

Closed vovaksenov99 closed 4 years ago

vovaksenov99 commented 4 years ago

Как написано в комментариях перед этой строкой

// if there were any non-hardcoded slots skipped while looking for next slot offset // and we don't allow 'spots' in the input - we should stop inserting right now

Проблема в том, что по факту мы не пропускам символы, а просто заканчивам вставку. Это критично

Пример c edittext с установленным ограничением в inputType "phone":

val passportMask: MaskImpl = MaskImpl.createTerminated(UnderscoreDigitSlotsParser().parseSlots("____ ______"))
MaskFormatWatcher(passportMask).installOn(passportInput.editText)

Все работает хорошо, до тех пор, пока мы не попытаемся вставить текст из буфера.

Например текст в буфере "паспорт 2222 серия 555555" При вставке, в цикл приходит строка отфильтрованная согласно input фильтр т.е " 2222 555555" Проблема начинается если эта строка содержит захардкоженных символ (Неважно где, вставка прекращается с того места, где есть захардкоженный символ). И начиная с этого символа, мы выходим из цикла игнорируя все остальное. Т.е в данном случае в поле просто ничего не вставится т.к начинается с пробела. Но это неверно, мы хотим получить "2222 555555" в поле ввода. Для этого вместо break мы делаем continue, пропуская все захардкоженные символы и вставляя только значащие.

Потестил, работает