authorgravatar for n.anisimov.23@gmail.comNick Anisimov <n.anisimov.23@gmail.com> 2026-09-11 00:17:49+04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-09-10 13:17:49-07:00
log32b690934039ea31c8bf8079aea8e9c088e97d9f
tree5081aff59485ea6ea03250693cec1dba5bd3ccc1
parentdfa345b3697a9117364cc6730a1598d6c27096f2
signature Signed by PGP key B5690EEEBB952194

fix(mobile): keep Android markdown icons aligned (#11118)


1 files changed, 11 insertions(+), 0 deletions(-)

apps/mobile/modules/t3-markdown-text/android/src/main/java/expo/modules/t3markdowntext/T3MarkdownTextSelectionModule.kt+11
......@@ -3,6 +3,8 @@ package expo.modules.t3markdowntext
33import android.content.ClipData
44import android.content.ClipboardManager
55import android.content.Context
6import android.text.Spannable
7import android.text.SpannableStringBuilder
68import android.text.Spanned
79import android.text.style.ReplacementSpan
810import android.view.ActionMode
......@@ -18,6 +20,14 @@ import kotlin.math.min
1820
1921private const val OBJECT_REPLACEMENT_CHARACTER = "\uFFFC"
2022
23// Match React Native's measurement buffer. Android orders tied line-height
24// spans differently in SpannableString, shifting inline images once RN's
25// span priorities are exhausted.
26private object MarkdownSpannableFactory : Spannable.Factory() {
27 override fun newSpannable(source: CharSequence): Spannable =
28 SpannableStringBuilder(source)
29}
30
2131private fun copyTextWithoutInlineImages(
2232 text: CharSequence,
2333 start: Int,
......@@ -85,6 +95,7 @@ class T3MarkdownTextSelectionModule : Module() {
8595 if (currentCallback is SanitizingSelectionActionModeCallback) {
8696 return@runOnUiQueueThread
8797 }
98 textView.setSpannableFactory(MarkdownSpannableFactory)
8899 textView.customSelectionActionModeCallback =
89100 SanitizingSelectionActionModeCallback(textView, currentCallback)
90101 }