summaryrefslogtreecommitdiffstats
path: root/core/java/android
diff options
context:
space:
mode:
authorGilles Debunne <debunne@google.com>2012-04-18 15:12:20 -0700
committerGilles Debunne <debunne@google.com>2012-04-18 15:12:22 -0700
commitd60da058c6a9a63ef7347685f39a9dedebbc6afa (patch)
tree42d3958d44215e9ad6fa6cdc6386b2eb08eb8691 /core/java/android
parent90985286442340b9ad9433d6bf8d51702c8d0fd9 (diff)
downloadframeworks_base-d60da058c6a9a63ef7347685f39a9dedebbc6afa.zip
frameworks_base-d60da058c6a9a63ef7347685f39a9dedebbc6afa.tar.gz
frameworks_base-d60da058c6a9a63ef7347685f39a9dedebbc6afa.tar.bz2
Do not notify text watchers when replace is a no-op
Bug 6344997 The early exit we used to do when both replaced and replacement strings were empty has been added back. Only this time it correctly also makes sure no spans from the replacement string would get added with a 0-length. Change-Id: Ifc38a7e3619c57aa7647c0a8e63d7627d86f1036
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];