Don't produce useless XHTML-IM of multiline text

Stephen Paul Weber created

Change summary

src/cheogram/java/com/cheogram/android/SpannedToXHTML.java | 12 +++++
src/main/java/eu/siacs/conversations/entities/Message.java | 16 ++++----
2 files changed, 19 insertions(+), 9 deletions(-)

Detailed changes

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;
 	}

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());
     }