From 028671e5fca651e66916bc3ca880fb359f21f513 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Thu, 7 Sep 2023 21:52:25 -0500 Subject: [PATCH] Don't produce useless XHTML-IM of multiline text --- .../com/cheogram/android/SpannedToXHTML.java | 12 +++++++++++- .../eu/siacs/conversations/entities/Message.java | 16 ++++++++-------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/cheogram/java/com/cheogram/android/SpannedToXHTML.java b/src/cheogram/java/com/cheogram/android/SpannedToXHTML.java index 331d5f412c146b4be7d94149b7068b6a000fab7a..306d73536b45c22e4d883e1f8f41bed809bbb543 100644 --- a/src/cheogram/java/com/cheogram/android/SpannedToXHTML.java +++ b/src/cheogram/java/com/cheogram/android/SpannedToXHTML.java @@ -30,13 +30,23 @@ import eu.siacs.conversations.xml.Element; import eu.siacs.conversations.xml.TextNode; public class SpannedToXHTML { - public static Element append(Element out, Spanned text) { + private static SpannableStringBuilder cleanSpans(Spanned text) { SpannableStringBuilder newText = new SpannableStringBuilder(text); SuggestionSpan[] spans = newText.getSpans(0, newText.length(), SuggestionSpan.class); for (SuggestionSpan span : spans) { newText.removeSpan(span); } BaseInputConnection.removeComposingSpans(newText); + return newText; + } + + public static boolean isPlainText(Spanned text) { + SpannableStringBuilder cleanText = cleanSpans(text); + return cleanText.nextSpanTransition(0, cleanText.length(), CharacterStyle.class) >= cleanText.length(); + } + + public static Element append(Element out, Spanned text) { + SpannableStringBuilder newText = cleanSpans(text); withinParagraph(out, newText, 0, newText.length()); return out; } diff --git a/src/main/java/eu/siacs/conversations/entities/Message.java b/src/main/java/eu/siacs/conversations/entities/Message.java index 4f39e1bb664b3fcaa415e97e6220d2ba01bb66c9..17e676c43f11188e6348080449fd58055203a470 100644 --- a/src/main/java/eu/siacs/conversations/entities/Message.java +++ b/src/main/java/eu/siacs/conversations/entities/Message.java @@ -554,11 +554,12 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable public synchronized void setBody(Spanned span) { setBody(span.toString()); - final Element body = getOrMakeHtml(); - body.clearChildren(); - SpannedToXHTML.append(body, span); - if (body.getContent().equals(span.toString())) { + if (SpannedToXHTML.isPlainText(span)) { this.payloads.remove(getHtml(true)); + } else { + final Element body = getOrMakeHtml(); + body.clearChildren(); + SpannedToXHTML.append(body, span); } } @@ -576,10 +577,9 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable } public synchronized void appendBody(Spanned append) { - final Element body = getOrMakeHtml(); - SpannedToXHTML.append(body, append); - if (body.getContent().equals(this.body + append.toString())) { - this.payloads.remove(getHtml()); + if (!SpannedToXHTML.isPlainText(append) || getHtml() != null) { + final Element body = getOrMakeHtml(); + SpannedToXHTML.append(body, append); } appendBody(append.toString()); }