diff options
author | Luca Zanolin <zano@google.com> | 2011-08-01 09:51:29 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-08-01 09:51:29 -0700 |
commit | 7702a5934454bd1665b4c0e5c1e6a805175dcb9c (patch) | |
tree | 381c94c485c93576d295157306c5acc04f77edaf /core/java/android/widget/TextView.java | |
parent | 6031b5de9639a5c32c6e5dac56da991ba63ad444 (diff) | |
parent | e3f89c08f24c88d8758bc8ad2f67ce00790b2120 (diff) | |
download | frameworks_base-7702a5934454bd1665b4c0e5c1e6a805175dcb9c.zip frameworks_base-7702a5934454bd1665b4c0e5c1e6a805175dcb9c.tar.gz frameworks_base-7702a5934454bd1665b4c0e5c1e6a805175dcb9c.tar.bz2 |
Merge "Sort the suggestions based based on the length of the text they are attached too."
Diffstat (limited to 'core/java/android/widget/TextView.java')
-rw-r--r-- | core/java/android/widget/TextView.java | 39 |
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; |