diff options
author | Gilles Debunne <debunne@google.com> | 2012-04-24 18:26:43 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-04-24 18:26:43 -0700 |
commit | 97c03cac4d9a73b75096e1fa1d8927263dce39e1 (patch) | |
tree | 662ac39e168e40828c4478fba43718eb460e72cd /core/java/android | |
parent | 069ac9a78d62a68d5eb640d3b87793f4ac924f6d (diff) | |
parent | d60da058c6a9a63ef7347685f39a9dedebbc6afa (diff) | |
download | frameworks_base-97c03cac4d9a73b75096e1fa1d8927263dce39e1.zip frameworks_base-97c03cac4d9a73b75096e1fa1d8927263dce39e1.tar.gz frameworks_base-97c03cac4d9a73b75096e1fa1d8927263dce39e1.tar.bz2 |
Merge "Do not notify text watchers when replace is a no-op"
Diffstat (limited to 'core/java/android')
-rw-r--r-- | core/java/android/text/SpannableStringBuilder.java | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/core/java/android/text/SpannableStringBuilder.java b/core/java/android/text/SpannableStringBuilder.java index ea9f650..c5e2c42 100644 --- a/core/java/android/text/SpannableStringBuilder.java +++ b/core/java/android/text/SpannableStringBuilder.java @@ -428,6 +428,12 @@ public class SpannableStringBuilder implements CharSequence, GetChars, Spannable final int origLen = end - start; final int newLen = tbend - tbstart; + if (origLen == 0 && newLen == 0 && !hasNonExclusiveExclusiveSpanAt(tb, tbstart)) { + // This is a no-op iif there are no spans in tb that would be added (with a 0-length) + // Early exit so that the text watchers do not get notified + return this; + } + TextWatcher[] textWatchers = getSpans(start, start + origLen, TextWatcher.class); sendBeforeTextChanged(textWatchers, start, origLen, newLen); @@ -470,6 +476,20 @@ public class SpannableStringBuilder implements CharSequence, GetChars, Spannable return this; } + private static boolean hasNonExclusiveExclusiveSpanAt(CharSequence text, int offset) { + if (text instanceof Spanned) { + Spanned spanned = (Spanned) text; + Object[] spans = spanned.getSpans(offset, offset, Object.class); + final int length = spans.length; + for (int i = 0; i < length; i++) { + Object span = spans[i]; + int flags = spanned.getSpanFlags(span); + if (flags != Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) return true; + } + } + return false; + } + private void sendToSpanWatchers(int replaceStart, int replaceEnd, int nbNewChars) { for (int i = 0; i < mSpanCountBeforeAdd; i++) { int spanStart = mSpanStarts[i]; |