From 06ec224bb79540d4a8a133238c2648b3087f1cfe Mon Sep 17 00:00:00 2001 From: kirillzyusko Date: Fri, 12 Jan 2024 18:32:34 +0100 Subject: [PATCH] fix: better exceptions handling --- .../extensions/EditText.kt | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/android/src/main/java/com/reactnativekeyboardcontroller/extensions/EditText.kt b/android/src/main/java/com/reactnativekeyboardcontroller/extensions/EditText.kt index 98497b4290..1f92ffa2c0 100644 --- a/android/src/main/java/com/reactnativekeyboardcontroller/extensions/EditText.kt +++ b/android/src/main/java/com/reactnativekeyboardcontroller/extensions/EditText.kt @@ -2,6 +2,7 @@ package com.reactnativekeyboardcontroller.extensions import android.text.Editable import android.text.TextWatcher +import android.util.Log import android.widget.EditText import com.facebook.react.views.textinput.ReactEditText import java.lang.reflect.Field @@ -37,18 +38,25 @@ fun EditText.addOnTextChangedListener(action: (String) -> Unit): TextWatcher { // will be reproducible again. // // so here we push our listener to first position to avoid the soft crash - val clazz: Class<*> = ReactEditText::class.java - val field: Field = clazz.getDeclaredField("mListeners") - field.isAccessible = true - val fieldValue = field[this] - try { - val listeners = fieldValue as ArrayList - - listeners.add(0, listener) + val clazz: Class<*> = ReactEditText::class.java + val field: Field = clazz.getDeclaredField("mListeners") + field.isAccessible = true + val fieldValue = field[this] + val listeners = fieldValue as? ArrayList<*> + + if (listeners != null && listeners.all { it is TextWatcher }) { + // fieldValue is an ArrayList + val textWatchListeners = listeners as ArrayList + + textWatchListeners.add(0, listener) + } else { + Log.w(javaClass.simpleName, "Can not attach listener because `fieldValue` does not belong to `ArrayList`") + } } catch (e: ClassCastException) { - // Handle the case where the cast failed - // in this case we don't attach a listener ¯\_(ツ)_/¯ + Log.w(javaClass.simpleName, "Can not attach listener because casting failed: ${e.message}") + } catch (e: NoSuchFieldException) { + Log.w(javaClass.simpleName, "Can not attach listener because field `mListeners` not found: ${e.message}") } return listener