From e0f7cc9fa7271a5ab3e28734ece61c3f6cedd087 Mon Sep 17 00:00:00 2001 From: M66B Date: Fri, 14 Feb 2020 11:06:48 +0100 Subject: [PATCH] Truncate large messages --- .../eu/faircode/email/AdapterMessage.java | 6 +++ .../eu/faircode/email/FragmentMessages.java | 1 + .../java/eu/faircode/email/HtmlHelper.java | 41 ++++++++++++------- .../main/java/eu/faircode/email/JsoupEx.java | 12 +++++- app/src/main/res/values/strings.xml | 1 + 5 files changed, 46 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index 864b7772fb..942fa9b7ed 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -1734,6 +1734,12 @@ public class AdapterMessage extends RecyclerView.Adapter heads = Collections.unmodifiableList(Arrays.asList( @@ -327,17 +328,7 @@ public class HtmlHelper { } // Limit length - - int length = 0; - for (Element elm : parsed.select("*")) { - for (Node child : elm.childNodes()) - if (child instanceof TextNode) - length += ((TextNode) child).text().length(); - if (length > MAX_TEXT_SIZE) - elm.remove(); - } - - if (length > MAX_TEXT_SIZE) { + if (truncate(parsed, true)) { parsed.body() .appendElement("p") .appendElement("em") @@ -1082,7 +1073,11 @@ public class HtmlHelper { if (body == null) return null; - String text = JsoupEx.parse(body).text(); + Document d = JsoupEx.parse(body); + + truncate(d, !full); + + String text = d.text(); if (full) return text; @@ -1098,6 +1093,10 @@ public class HtmlHelper { html = html.replace("
", "
"); + Document d = JsoupEx.parse(html); + + truncate(d, true); + NodeTraversor.traverse(new NodeVisitor() { private int qlevel = 0; private int tlevel = 0; @@ -1176,7 +1175,7 @@ public class HtmlHelper { for (int i = 0; i < qlevel; i++) sb.append("> "); } - }, JsoupEx.parse(html)); + }, d); sb.append("\n"); @@ -1198,6 +1197,20 @@ public class HtmlHelper { return ssb; } + static boolean truncate(Document d, boolean reformat) { + int at = (reformat ? MAX_FORMAT_TEXT_SIZE : MAX_FULL_TEXT_SIZE); + + int length = 0; + for (Element elm : d.select("*")) { + for (Node child : elm.childNodes()) + if (child instanceof TextNode) + length += ((TextNode) child).text().length(); + if (length > at) + elm.remove(); + } + return (length > at); + } + static Spanned fromHtml(@NonNull String html) { return fromHtml(html, null, null); } diff --git a/app/src/main/java/eu/faircode/email/JsoupEx.java b/app/src/main/java/eu/faircode/email/JsoupEx.java index bffd00a5ea..17bde2a0b4 100644 --- a/app/src/main/java/eu/faircode/email/JsoupEx.java +++ b/app/src/main/java/eu/faircode/email/JsoupEx.java @@ -21,6 +21,7 @@ package eu.faircode.email; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; public class JsoupEx { static Document parse(String html) { @@ -35,6 +36,15 @@ org.jsoup.UncheckedIOException: java.io.IOException: Input is binary and unsuppo at org.jsoup.parser.Parser.parse(SourceFile:107) at org.jsoup.Jsoup.parse(SourceFile:58) */ - return Jsoup.parse(html.replace("\0", "")); + try { + return Jsoup.parse(html.replace("\0", "")); + } catch (OutOfMemoryError ex) { + Log.e(ex); + Document document = Document.createShell(""); + Element strong = document.createElement("strong"); + strong.text(Log.formatThrowable(ex)); + document.body().appendChild(strong); + return document; + } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 23fbcdd230..117c234475 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -697,6 +697,7 @@ Image could not be decoded Search on server is not available for this account Message too large to completely reformat + Message too large to display completely Show full message Unused inline images will be removed on send Messages moved across accounts will be downloaded again resulting in extra data usage