From 7f2343de99be99f27bf1d38422b199ea1a2666bf Mon Sep 17 00:00:00 2001 From: Qi Wang Date: Tue, 18 May 2021 18:50:34 +0800 Subject: 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 --- core/java/android/widget/TextView.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'core/java/android/widget/TextView.java') 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 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); } } -- cgit v1.2.3