Remove duplicate spans

master
M66B 8 months ago
parent 2629ee39b4
commit f0a7773372

@ -52,6 +52,8 @@ import android.text.style.QuoteSpan;
import android.text.style.RelativeSizeSpan; import android.text.style.RelativeSizeSpan;
import android.text.style.StrikethroughSpan; import android.text.style.StrikethroughSpan;
import android.text.style.StyleSpan; import android.text.style.StyleSpan;
import android.text.style.SubscriptSpan;
import android.text.style.SuperscriptSpan;
import android.text.style.TypefaceSpan; import android.text.style.TypefaceSpan;
import android.text.style.URLSpan; import android.text.style.URLSpan;
import android.text.style.UnderlineSpan; import android.text.style.UnderlineSpan;
@ -4075,11 +4077,60 @@ public class HtmlHelper {
if (start == end) if (start == end)
return; return;
int len = ssb.length(); 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); ssb.setSpan(span, start, end, flags);
else } else
Log.e("Invalid span " + start + "..." + end + " len=" + len + " type=" + span.getClass().getName()); 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()); }, document.body());
for (LineSpan line : ssb.getSpans(0, ssb.length(), LineSpan.class)) { for (LineSpan line : ssb.getSpans(0, ssb.length(), LineSpan.class)) {

Loading…
Cancel
Save