diff --git a/app/src/main/java/eu/faircode/email/HtmlHelper.java b/app/src/main/java/eu/faircode/email/HtmlHelper.java index d20d29540b..3a12916cc1 100644 --- a/app/src/main/java/eu/faircode/email/HtmlHelper.java +++ b/app/src/main/java/eu/faircode/email/HtmlHelper.java @@ -52,6 +52,8 @@ import android.text.style.QuoteSpan; import android.text.style.RelativeSizeSpan; import android.text.style.StrikethroughSpan; import android.text.style.StyleSpan; +import android.text.style.SubscriptSpan; +import android.text.style.SuperscriptSpan; import android.text.style.TypefaceSpan; import android.text.style.URLSpan; import android.text.style.UnderlineSpan; @@ -4075,11 +4077,60 @@ public class HtmlHelper { if (start == end) return; int len = ssb.length(); - if (start >= 0 && start < len && end <= len) + if (start >= 0 && start < len && end <= len) { + Object[] spans = ssb.getSpans(start, ssb.length(), Object.class); + if (spans != null) + for (Object s : spans) + if (equal(s, span)) { + int sstart = ssb.getSpanStart(s); + int send = ssb.getSpanEnd(s); + int sflags = ssb.getSpanFlags(s); + if (sstart == start && send == ssb.length() && sflags == flags) { + Log.i("Duplicate span " + s.getClass() + " " + sstart + "..." + send); + ssb.removeSpan(s); + } + } + ssb.setSpan(span, start, end, flags); - else + } else Log.e("Invalid span " + start + "..." + end + " len=" + len + " type=" + span.getClass().getName()); } + + private boolean equal(Object span, Object existing) { + if (!span.getClass().equals(existing.getClass())) + return false; + + if (span instanceof StyleSpan) { + if (((StyleSpan) span).getStyle() == ((StyleSpan) existing).getStyle() && + ((StyleSpan) span).getFontWeightAdjustment() == ((StyleSpan) existing).getFontWeightAdjustment()) + return true; + } else if (span instanceof UnderlineSpan) + return true; + else if (span instanceof RelativeSizeSpan) + return false; + else if (span instanceof BackgroundColorSpan || span instanceof ForegroundColorSpan) + return true; + else if (span instanceof AlignmentSpan || span instanceof AlignmentSpan.Standard) + return true; + else if (span instanceof BulletSpan || span instanceof NumberSpan) + return false; + else if (span instanceof QuoteSpan || span instanceof IndentSpan) + return false; + else if (span instanceof SubscriptSpan || span instanceof SuperscriptSpan) + return false; + else if (span instanceof StrikethroughSpan) + return true; + else if (span instanceof URLSpan) + return false; + else if (span instanceof TypefaceSpan) + return true; + else if (span instanceof StyleHelper.MarkSpan) + return true; + else if (span instanceof StyleHelper.InsertedSpan) + return false; + + return false; + } }, document.body()); for (LineSpan line : ssb.getSpans(0, ssb.length(), LineSpan.class)) {