summaryrefslogtreecommitdiffstats
path: root/core/java/android/widget/TextView.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/widget/TextView.java')
-rw-r--r--core/java/android/widget/TextView.java39
1 files changed, 36 insertions, 3 deletions
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 6dcae6d..ab66676 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -143,6 +143,9 @@ import java.io.IOException;
import java.lang.ref.WeakReference;
import java.text.BreakIterator;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashMap;
/**
* Displays text to the user and optionally allows them to edit it. A TextView
@@ -8812,12 +8815,42 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
int suggestionIndex; // the index of the suggestion inside suggestionSpan
}
+ /**
+ * Returns the suggestion spans that cover the current cursor position. The suggestion
+ * spans are sorted according to the length of text that they are attached to.
+ */
+ private SuggestionSpan[] getSuggestionSpans() {
+ int pos = TextView.this.getSelectionStart();
+ Spannable spannable = (Spannable) TextView.this.mText;
+ SuggestionSpan[] suggestionSpans = spannable.getSpans(pos, pos, SuggestionSpan.class);
+
+ // Cache the span length for performance reason.
+ final HashMap<SuggestionSpan, Integer> spanLengthMap =
+ new HashMap<SuggestionSpan, Integer>();
+
+ for (SuggestionSpan suggestionSpan : suggestionSpans) {
+ int start = spannable.getSpanStart(suggestionSpan);
+ int end = spannable.getSpanEnd(suggestionSpan);
+ spanLengthMap.put(suggestionSpan, end - start);
+ }
+
+ // The suggestions are sorted according to the lenght of the text that they cover
+ // (shorter first)
+ Arrays.sort(suggestionSpans, new Comparator<SuggestionSpan>() {
+ public int compare(SuggestionSpan span1, SuggestionSpan span2) {
+ return spanLengthMap.get(span1) - spanLengthMap.get(span2);
+ }
+ });
+
+ return suggestionSpans;
+ }
+
public void show() {
if (!(mText instanceof Editable)) return;
- final int pos = TextView.this.getSelectionStart();
- Spannable spannable = (Spannable)TextView.this.mText;
- SuggestionSpan[] suggestionSpans = spannable.getSpans(pos, pos, SuggestionSpan.class);
+ Spannable spannable = (Spannable) TextView.this.mText;
+ SuggestionSpan[] suggestionSpans = getSuggestionSpans();
+
final int nbSpans = suggestionSpans.length;
int totalNbSuggestions = 0;