From 60ef15c6d8219ea111675040caac71352091f554 Mon Sep 17 00:00:00 2001 From: IvanIhnatsiuk Date: Fri, 26 Jun 2026 17:16:38 +0200 Subject: [PATCH 1/2] fix: text classifier class on android --- .../enriched/EnrichedTextClassifier.kt | 39 +++++++++++++++++++ .../enriched/EnrichedTextInputView.kt | 16 ++++++++ 2 files changed, 55 insertions(+) create mode 100644 android/src/main/java/com/swmansion/enriched/EnrichedTextClassifier.kt diff --git a/android/src/main/java/com/swmansion/enriched/EnrichedTextClassifier.kt b/android/src/main/java/com/swmansion/enriched/EnrichedTextClassifier.kt new file mode 100644 index 000000000..3559471c2 --- /dev/null +++ b/android/src/main/java/com/swmansion/enriched/EnrichedTextClassifier.kt @@ -0,0 +1,39 @@ +package com.swmansion.enriched + +import android.os.Build +import android.view.textclassifier.TextClassification +import android.view.textclassifier.TextClassifier +import android.view.textclassifier.TextSelection +import androidx.annotation.RequiresApi +import com.swmansion.enriched.constants.Strings + +@RequiresApi(Build.VERSION_CODES.O) +internal class EnrichedTextClassifier( + private val delegate: TextClassifier, +) : TextClassifier { + @RequiresApi(Build.VERSION_CODES.P) + override fun suggestSelection(request: TextSelection.Request): TextSelection = + if (touchesReplacementBlock(request.text, request.startIndex, request.endIndex)) { + TextSelection.Builder(request.startIndex, request.endIndex).build() + } else { + delegate.suggestSelection(request) + } + + @RequiresApi(Build.VERSION_CODES.P) + override fun classifyText(request: TextClassification.Request): TextClassification = + if (touchesReplacementBlock(request.text, request.startIndex, request.endIndex)) { + TextClassification.Builder().build() + } else { + delegate.classifyText(request) + } + + private fun touchesReplacementBlock( + text: CharSequence, + start: Int, + end: Int, + ): Boolean { + val from = (start - 1).coerceAtLeast(0) + val to = (end + 1).coerceAtMost(text.length) + return (from until to).any { text[it] == Strings.OBJECT_REPLACEMENT_CHAR } + } +} diff --git a/android/src/main/java/com/swmansion/enriched/EnrichedTextInputView.kt b/android/src/main/java/com/swmansion/enriched/EnrichedTextInputView.kt index a0f581f35..c7f6a6f49 100644 --- a/android/src/main/java/com/swmansion/enriched/EnrichedTextInputView.kt +++ b/android/src/main/java/com/swmansion/enriched/EnrichedTextInputView.kt @@ -121,6 +121,7 @@ class EnrichedTextInputView : AppCompatEditText { private var typefaceDirty = false private var inputMethodManager: InputMethodManager? = null + private var enrichedTextClassifier: EnrichedTextClassifier? = null private var autoFocus = false private var didAttachToWindow = false @@ -210,6 +211,12 @@ class EnrichedTextInputView : AppCompatEditText { transformationMethod = LineSeparatorTransformationMethod() addTextChangedListener(EnrichedTextWatcher(this)) filters = arrayOf(NonEditableParagraphFilter(), ParagraphLimitFilter(this)) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + enrichedTextClassifier = + EnrichedTextClassifier(textClassifier).also { + setTextClassifier(it) + } + } } override fun onLayout( @@ -826,6 +833,15 @@ class EnrichedTextInputView : AppCompatEditText { return if (parentWidth > 0) return parentWidth - paddingLeft - paddingRight else 0 } + private fun updateTextClassifierSnapshot( + selStart: Int = selectionStart, + selEnd: Int = selectionEnd, + ) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + enrichedTextClassifier?.updateText(text, selStart, selEnd) + } + } + companion object { const val CLIPBOARD_TAG = "react-native-enriched-clipboard" } From e5f9094701fd1859dd3f7e4faf98ea9b139a9cf0 Mon Sep 17 00:00:00 2001 From: IvanIhnatsiuk Date: Sat, 27 Jun 2026 12:20:21 +0200 Subject: [PATCH 2/2] fix: remove unused code --- .../java/com/swmansion/enriched/EnrichedTextInputView.kt | 9 --------- 1 file changed, 9 deletions(-) diff --git a/android/src/main/java/com/swmansion/enriched/EnrichedTextInputView.kt b/android/src/main/java/com/swmansion/enriched/EnrichedTextInputView.kt index c7f6a6f49..e29b4e09a 100644 --- a/android/src/main/java/com/swmansion/enriched/EnrichedTextInputView.kt +++ b/android/src/main/java/com/swmansion/enriched/EnrichedTextInputView.kt @@ -833,15 +833,6 @@ class EnrichedTextInputView : AppCompatEditText { return if (parentWidth > 0) return parentWidth - paddingLeft - paddingRight else 0 } - private fun updateTextClassifierSnapshot( - selStart: Int = selectionStart, - selEnd: Int = selectionEnd, - ) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - enrichedTextClassifier?.updateText(text, selStart, selEnd) - } - } - companion object { const val CLIPBOARD_TAG = "react-native-enriched-clipboard" }