From f15de28fc26e77377f7c6d1790d370c17fc04306 Mon Sep 17 00:00:00 2001 From: Dan Harris Date: Thu, 23 Jan 2025 23:23:15 -0800 Subject: [PATCH] fix ConcurrentModificationException --- .../inputmask/MaskedTextChangedListener.kt | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/inputmask/src/main/kotlin/com/redmadrobot/inputmask/MaskedTextChangedListener.kt b/inputmask/src/main/kotlin/com/redmadrobot/inputmask/MaskedTextChangedListener.kt index bf687a9..372b387 100644 --- a/inputmask/src/main/kotlin/com/redmadrobot/inputmask/MaskedTextChangedListener.kt +++ b/inputmask/src/main/kotlin/com/redmadrobot/inputmask/MaskedTextChangedListener.kt @@ -47,6 +47,7 @@ open class MaskedTextChangedListener( private var afterText: String = "" private var caretPosition: Int = 0 + private var textWatcherCallbacksEnabled: Boolean = true private val field: WeakReference = WeakReference(field) @@ -209,7 +210,11 @@ open class MaskedTextChangedListener( fun totalValueLength(): Int = this.primaryMask.totalValueLength() override fun afterTextChanged(edit: Editable?) { - this.field.get()?.removeTextChangedListener(this) + if (!textWatcherCallbacksEnabled) { + return + } + + textWatcherCallbacksEnabled = false edit?.replace(0, edit.length, this.afterText) try { @@ -228,15 +233,23 @@ open class MaskedTextChangedListener( ) } - this.field.get()?.addTextChangedListener(this) + textWatcherCallbacksEnabled = true this.listener?.afterTextChanged(edit) } override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + if (!textWatcherCallbacksEnabled) { + return + } + this.listener?.beforeTextChanged(s, start, count, after) } override fun onTextChanged(text: CharSequence, cursorPosition: Int, before: Int, count: Int) { + if (!textWatcherCallbacksEnabled) { + return + } + val isDeletion: Boolean = before > 0 && count == 0 val useAutocomplete = if (isDeletion) false else this.autocomplete val useAutoskip = if (isDeletion) this.autoskip else false