diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index 930fc6709b..2b7b09ce93 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -659,7 +659,8 @@ public class AdapterMessage extends RecyclerView.Adapter 0) { - properties.setValue("quotes", message.id, true); + int s = buffer.getSpanStart(ddss[0]); + properties.setValue("quotes", message.id, buffer.charAt(s) != 48); bindBody(message, false); return true; } @@ -2702,7 +2703,7 @@ public class AdapterMessage extends RecyclerView.Adapter= Build.VERSION_CODES.Q) args.putParcelable("actions", getConversationActions(message, document, context)); - // Collapse quotes - if (!show_quotes) - HtmlHelper.collapseQuotes(document); - // Draw images SpannableStringBuilder ssb = HtmlHelper.fromDocument(context, document, new HtmlHelper.ImageGetterEx() { @Override @@ -3092,26 +3091,71 @@ public class AdapterMessage extends RecyclerView.Adapter lqs = new ArrayList<>(); for (QuoteSpan quoteSpan : quoteSpans) { int s = ssb.getSpanStart(quoteSpan); int e = ssb.getSpanEnd(quoteSpan); - ssb.setSpan( - new DynamicDrawableSpan() { - @Override - public Drawable getDrawable() { - Drawable d = ContextCompat.getDrawable(context, R.drawable.twotone_format_quote_24); - d.setTint(colorAccent); - d.setBounds(0, 0, px, px); - return d; - } - }, - s, e, Spanned.SPAN_INCLUSIVE_INCLUSIVE); + + boolean enclosed = false; + for (QuoteSpan eqs : quoteSpans) { + if (eqs == quoteSpan) + continue; + + int es = ssb.getSpanStart(eqs); + int ee = ssb.getSpanEnd(eqs); + if (es <= s && ee >= e) { + enclosed = true; + break; + } + } + + if (!enclosed) + lqs.add(quoteSpan); + } + + final int px = Helper.dp2pixels(context, 24 + (zoom) * 8); + final Drawable d = ContextCompat.getDrawable(context, show_quotes + ? R.drawable.outline_unfold_less_24 + : R.drawable.twotone_format_quote_24); + d.setTint(colorAccent); + d.setBounds(0, 0, px, px); + + for (QuoteSpan quoteSpan : lqs) { + int s = ssb.getSpanStart(quoteSpan); + int e = ssb.getSpanEnd(quoteSpan); + + if (show_quotes) { + ssb.insert(s > 0 ? s - 1 : s, "0"); + ssb.setSpan( + new DynamicDrawableSpan() { + @Override + public Drawable getDrawable() { + return d; + } + }, + s > 0 ? s - 1 : s, s > 0 ? s : s + 1, Spanned.SPAN_INCLUSIVE_INCLUSIVE); + } else { + for (Object span : ssb.getSpans(s, e, Object.class)) + ssb.removeSpan(span); + ssb.delete(s, e); + ssb.insert(s > 0 ? s - 1 : s, "1"); + ssb.setSpan( + new DynamicDrawableSpan() { + @Override + public Drawable getDrawable() { + return d; + } + }, + s > 0 ? s - 1 : s, s > 0 ? s : s + 1, Spanned.SPAN_INCLUSIVE_INCLUSIVE); + } } return ssb; diff --git a/app/src/main/java/eu/faircode/email/HtmlHelper.java b/app/src/main/java/eu/faircode/email/HtmlHelper.java index 8abc49fea6..c43925f72b 100644 --- a/app/src/main/java/eu/faircode/email/HtmlHelper.java +++ b/app/src/main/java/eu/faircode/email/HtmlHelper.java @@ -2643,42 +2643,6 @@ public class HtmlHelper { return result.value; } - static void collapseQuotes(Document document) { - document.body().filter(new NodeFilter() { - private int level = 0; - - @Override - public FilterResult head(Node node, int depth) { - if (level > 0) - return FilterResult.REMOVE; - - if (node instanceof Element) { - Element element = (Element) node; - if ("blockquote".equals(element.tagName()) && hasBorder(element)) { - Element prev = element.previousElementSibling(); - if (prev != null && - "blockquote".equals(prev.tagName()) && hasBorder(prev)) - return FilterResult.REMOVE; - else { - level++; - element.html("…"); - } - } - } - - return FilterResult.CONTINUE; - } - - @Override - public FilterResult tail(Node node, int depth) { - if ("blockquote".equals(node.nodeName())) - level--; - - return FilterResult.CONTINUE; - } - }); - } - static void removeSignatures(Document d) { d.body().filter(new NodeFilter() { private boolean remove = false;