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..e29b4e09a 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(