diff options
| author | Qi Wang <zakwang@google.com> | 2021-05-18 18:50:34 +0800 |
|---|---|---|
| committer | Qi Wang <zakwang@google.com> | 2021-05-21 15:15:06 +0800 |
| commit | 7f2343de99be99f27bf1d38422b199ea1a2666bf (patch) | |
| tree | 0c7cc29cc55e3bc64cfccc1486336baccad9afbb /core/java/android/widget/TextView.java | |
| parent | 1d2868c45b52c68ef28b3a84b13dcc7347461c7f (diff) | |
Fix a bug in SpellCheckSpan update logic.
The the text is changed, we need to remove all affected SpellCheckSpan.
However, the previous check logic can not work correctly, and may
leave some out-of-date SpellCheckSpan, which causes problem when the
SpellChecker tries to apply suggestions on those spans later.
Also fixed the bug that the offset is not calculated correctly when we
validate spell checker suggestions.
Fix: 188107864
Change-Id: I8dc806d96b6a75255277d6de013305557835cb6d
Test: atest CtsInputMethodTestCases:SpellCheckerTest
Test: atest android.widget.cts.TextViewTest
Diffstat (limited to 'core/java/android/widget/TextView.java')
| -rw-r--r-- | core/java/android/widget/TextView.java | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 1a37b595287d..374dc1cba5db 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -10746,12 +10746,15 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener Editable text = (Editable) mText; T[] spans = text.getSpans(start, end, type); - final int length = spans.length; - for (int i = 0; i < length; i++) { - final int spanStart = text.getSpanStart(spans[i]); - final int spanEnd = text.getSpanEnd(spans[i]); - if (spanEnd == start || spanStart == end) break; - text.removeSpan(spans[i]); + ArrayList<T> spansToRemove = new ArrayList<>(); + for (T span : spans) { + final int spanStart = text.getSpanStart(span); + final int spanEnd = text.getSpanEnd(span); + if (spanEnd == start || spanStart == end) continue; + spansToRemove.add(span); + } + for (T span : spansToRemove) { + text.removeSpan(span); } } |
