summaryrefslogtreecommitdiffstats
path: root/core/java/android
diff options
context:
space:
mode:
authorGilles Debunne <debunne@google.com>2012-04-24 18:26:43 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2012-04-24 18:26:43 -0700
commit97c03cac4d9a73b75096e1fa1d8927263dce39e1 (patch)
tree662ac39e168e40828c4478fba43718eb460e72cd /core/java/android
parent069ac9a78d62a68d5eb640d3b87793f4ac924f6d (diff)
parentd60da058c6a9a63ef7347685f39a9dedebbc6afa (diff)
downloadframeworks_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.java20
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];