From 3ad5b9bedb6a9d688544a6bc213649108d55c2b8 Mon Sep 17 00:00:00 2001 From: M66B Date: Wed, 12 Aug 2020 21:37:17 +0200 Subject: [PATCH] Optimize removing bullets --- .../eu/faircode/email/FragmentCompose.java | 52 ++++++++----------- 1 file changed, 22 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index 2b783b019b..d0f3ebb890 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -476,39 +476,12 @@ public class FragmentCompose extends FragmentBase { // https://developer.android.com/reference/android/text/TextWatcher etBody.addTextChangedListener(new TextWatcher() { private Integer added = null; + private Integer removed = null; @Override public void beforeTextChanged(CharSequence text, int start, int count, int after) { - // Do nothing - if (count == 1 && text.charAt(start) == '\n' && after == 0 && start > 0) { - SpannableStringBuilder ssb = new SpannableStringBuilder(text); - BulletSpan[] bullets = ssb.getSpans(start + 1, start + 1, BulletSpan.class); - int min = -1; - int max = -1; - BulletSpan clone = null; - for (BulletSpan span : bullets) { - int s = ssb.getSpanStart(span); - int e = ssb.getSpanEnd(span); - Log.i("Span " + s + "..." + e + " start=" + start); - - if (min < 0 || s < min) - min = s; - if (max < 0 || e > max) - max = e; - - if (clone == null) - clone = clone(span, span.getClass(), etBody.getContext()); - - ssb.removeSpan(span); - } - - if (clone != null) { - ssb.setSpan(clone, min, max, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE | Spanned.SPAN_PARAGRAPH); - ssb.delete(start, start + 1); - etBody.setText(ssb); - etBody.setSelection(start); - } - } + if (count == 1 && text.charAt(start) == '\n' && after == 0 && start > 0) + removed = start; } @Override @@ -604,6 +577,25 @@ public class FragmentCompose extends FragmentBase { } finally { added = null; } + + if (removed != null) + try { + BulletSpan[] spans = text.getSpans(removed - 1, removed - 1, BulletSpan.class); + if (spans.length == 1) { + int end = text.getSpanEnd(spans[0]); + BulletSpan[] bs = text.getSpans(end, end, BulletSpan.class); + for (BulletSpan b : bs) { + int s = text.getSpanStart(b); + int e = text.getSpanEnd(b); + if (s == e) + text.removeSpan(b); + } + } + } catch (Throwable ex) { + Log.e(ex); + } finally { + removed = null; + } } public T clone(Object span, Class type, Context context) {