From becf3474cef305ac01c15a53c1223e01ffe5623d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20=C5=BB=C3=B3=C5=82kiewski?= Date: Mon, 9 Mar 2026 13:23:06 +0100 Subject: [PATCH 1/2] fix: extending paragraph style on paste --- .../textinput/utils/EnrichedSpannable.kt | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpannable.kt b/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpannable.kt index 1433e78de..ebc5e83c2 100644 --- a/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpannable.kt +++ b/android/src/main/java/com/swmansion/enriched/textinput/utils/EnrichedSpannable.kt @@ -66,6 +66,10 @@ fun Spannable.mergeSpannables( val isNewLineStart = startBlockSpans.isNotEmpty() || startParagraphSpans.isNotEmpty() val isNewLineEnd = endBlockSpans.isNotEmpty() || endParagraphSpans.isNotEmpty() + val pastedHasOwnStyles = + spannable.getSpans(0, spannable.length, EnrichedBlockSpan::class.java).isNotEmpty() || + spannable.getSpans(0, spannable.length, EnrichedParagraphSpan::class.java).isNotEmpty() + if (isNewLineStart && start != paragraphStart) { builder.insert(start, "\n") finalStart = start + 1 @@ -78,5 +82,25 @@ fun Spannable.mergeSpannables( builder.replace(finalStart, finalEnd, spannable) + // Manually extend existing paragraph/block spans to cover the pasted text. + if (!pastedHasOwnStyles) { + val pasteEnd = finalStart + spannable.length + + val affectedParagraphSpans = builder.getSpans(finalStart, finalStart, EnrichedParagraphSpan::class.java) + val affectedBlockSpans = builder.getSpans(finalStart, finalStart, EnrichedBlockSpan::class.java) + val affectedSpans = affectedBlockSpans.toList() + affectedParagraphSpans.toList() + + for (span in affectedSpans) { + val spanStart = builder.getSpanStart(span) + val spanEnd = builder.getSpanEnd(span) + if (spanStart == -1 || spanEnd >= pasteEnd) continue + + val (_, newParagraphEnd) = builder.getParagraphBounds(spanStart, pasteEnd) + val flags = builder.getSpanFlags(span) + builder.removeSpan(span) + builder.setSpan(span, spanStart, newParagraphEnd, flags) + } + } + return builder } From e5c45462d57ed3a620cd292b234a1730b9807b96 Mon Sep 17 00:00:00 2001 From: Piotr Karamon Date: Tue, 24 Mar 2026 10:03:21 +0100 Subject: [PATCH 2/2] test: added a copy test for this fix --- ...g_paragraph_style_on_paste_after_copy.yaml | 45 ++++++++++++++++++ ...ng_paragraph_style_on_paste_after_copy.png | Bin 0 -> 18850 bytes 2 files changed, 45 insertions(+) create mode 100644 .maestro/flows/extending_paragraph_style_on_paste_after_copy.yaml create mode 100644 .maestro/screenshots/android/extending_paragraph_style_on_paste_after_copy.png diff --git a/.maestro/flows/extending_paragraph_style_on_paste_after_copy.yaml b/.maestro/flows/extending_paragraph_style_on_paste_after_copy.yaml new file mode 100644 index 000000000..9b8dde963 --- /dev/null +++ b/.maestro/flows/extending_paragraph_style_on_paste_after_copy.yaml @@ -0,0 +1,45 @@ +appId: swmansion.enriched.example +tags: + - android-only +--- +- launchApp +- tapOn: + id: "toggle-screen-button" + +- tapOn: + id: "focus-button" + +- inputText: "EADING" +- doubleTapOn: + id: "editor-input" + point: "10%, 50%" + +- tapOn: + id: "android:id/floating_toolbar_menu_item_text" + text: "Copy" + +# Dismiss toolbar with Copy/Cut etc. options +- tapOn: + id: "editor-input" +- tapOn: + id: "clear-button" +- tapOn: + id: "focus-button" + +- tapOn: + id: "toolbar-heading-1" + +- inputText: "H" + +- longPressOn: + id: "editor-input" + point: "50%, 50%" + +- tapOn: + id: "android:id/floating_toolbar_menu_item_text" + text: "Paste" + +- runFlow: + file: "../subflows/capture_or_assert_screenshot.yaml" + env: + SCREENSHOT_NAME: "extending_paragraph_style_on_paste_after_copy" diff --git a/.maestro/screenshots/android/extending_paragraph_style_on_paste_after_copy.png b/.maestro/screenshots/android/extending_paragraph_style_on_paste_after_copy.png new file mode 100644 index 0000000000000000000000000000000000000000..f717ac4fae13b8b9bce4f56004c64988cd512caf GIT binary patch literal 18850 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