From 9433ce86b702bf33ff6d1bd020266ffcb7b133ea Mon Sep 17 00:00:00 2001 From: Jean Chalard Date: Tue, 26 Jun 2012 18:58:52 +0900 Subject: [PATCH] Refactor and squash long-standing bugs (A2) This is awesome. - Improve performance by stopping useless string/array conversions. - Simplify method interface. - Fix localization bugs - we now know our locale - Fix bugs with surrogate code points Bug: 4769095 Change-Id: I8a8ee224b713429ee0a4ce5bd52f1b63378cf56f --- .../android/inputmethod/latin/Suggest.java | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java index a4332936d..0861a616c 100644 --- a/java/src/com/android/inputmethod/latin/Suggest.java +++ b/java/src/com/android/inputmethod/latin/Suggest.java @@ -252,7 +252,7 @@ public class Suggest { } for (final SuggestedWordInfo suggestion : localSuggestions) { final String suggestionStr = suggestion.mWord.toString(); - addWord(suggestionStr.toCharArray(), null, 0, suggestionStr.length(), + addWord(suggestionStr, null, suggestion.mScore, dicTypeId, Dictionary.BIGRAM, suggestions, consideredWord); } @@ -279,7 +279,7 @@ public class Suggest { wordComposerForLookup, prevWordForBigram, proximityInfo); for (final SuggestedWordInfo suggestion : localSuggestions) { final String suggestionStr = suggestion.mWord.toString(); - addWord(suggestionStr.toCharArray(), null, 0, suggestionStr.length(), + addWord(suggestionStr, null, suggestion.mScore, dicTypeId, Dictionary.UNIGRAM, suggestions, consideredWord); } @@ -388,17 +388,17 @@ public class Suggest { return suggestionsList; } - // TODO: Use codepoint instead of char - public boolean addWord(final char[] word, int[] indices, final int offset, final int length, + public boolean addWord(final String word, int[] indices, int score, final int dicTypeId, final int dataType, final ArrayList suggestions, final String consideredWord) { int dataTypeForLog = dataType; final int prefMaxSuggestions = MAX_SUGGESTIONS; + final int length = word.codePointCount(0, word.length()); int pos = 0; // Check if it's the same word, only caps are different - if (StringUtils.equalsIgnoreCase(consideredWord, word, offset, length)) { + if (StringUtils.equalsIgnoreCase(consideredWord, word)) { // TODO: remove this surrounding if clause and move this logic to // getSuggestedWordBuilder. if (suggestions.size() > 0) { @@ -407,7 +407,7 @@ public class Suggest { // frequency to determine the insertion position. This does not ensure strictly // correct ordering, but ensures the top score is on top which is enough for // removing duplicates correctly. - if (StringUtils.equalsIgnoreCase(currentHighestWord.mWord, word, offset, length) + if (StringUtils.equalsIgnoreCase(currentHighestWord.mWord, word) && score <= currentHighestWord.mScore) { pos = 1; } @@ -430,16 +430,12 @@ public class Suggest { } final StringBuilder sb = new StringBuilder(getApproxMaxWordLength()); - // TODO: Must pay attention to locale when changing case. if (mIsAllUpperCase) { - sb.append(new String(word, offset, length).toUpperCase()); + sb.append(word.toUpperCase(mLocale)); } else if (mIsFirstCharCapitalized) { - sb.append(Character.toUpperCase(word[offset])); - if (length > 1) { - sb.append(word, offset + 1, length - 1); - } + sb.append(StringUtils.toTitleCase(word, mLocale)); } else { - sb.append(word, offset, length); + sb.append(word); } for (int i = mTrailingSingleQuotesCount - 1; i >= 0; --i) { sb.appendCodePoint(Keyboard.CODE_SINGLE_QUOTE);