Quit sorting suggestions in AndroidSpellCheckerService.
Suggestions have been sorted in SuggestionResults. Bug: 13689011 Change-Id: Iec21e97119ceb7c71673d5b15bb1f06040b59fef
This commit is contained in:
parent
9e76304d60
commit
86dee2295d
2 changed files with 19 additions and 55 deletions
|
@ -231,66 +231,43 @@ public final class AndroidSpellCheckerService extends SpellCheckerService
|
||||||
}
|
}
|
||||||
|
|
||||||
private final ArrayList<String> mSuggestions;
|
private final ArrayList<String> mSuggestions;
|
||||||
private final int[] mScores;
|
private final ArrayList<Integer> mScores;
|
||||||
private final String mOriginalText;
|
private final String mOriginalText;
|
||||||
private final float mRecommendedThreshold;
|
private final float mRecommendedThreshold;
|
||||||
private final int mMaxLength;
|
private final int mMaxLength;
|
||||||
private int mLength = 0;
|
|
||||||
|
|
||||||
SuggestionsGatherer(final String originalText, final float recommendedThreshold,
|
SuggestionsGatherer(final String originalText, final float recommendedThreshold,
|
||||||
final int maxLength) {
|
final int maxLength) {
|
||||||
mOriginalText = originalText;
|
mOriginalText = originalText;
|
||||||
mRecommendedThreshold = recommendedThreshold;
|
mRecommendedThreshold = recommendedThreshold;
|
||||||
mMaxLength = maxLength;
|
mMaxLength = maxLength;
|
||||||
mSuggestions = new ArrayList<>(maxLength + 1);
|
mSuggestions = new ArrayList<>();
|
||||||
mScores = new int[mMaxLength];
|
mScores = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
synchronized public boolean addWord(char[] word, int[] spaceIndices, int wordOffset,
|
public void addResults(final SuggestionResults suggestionResults) {
|
||||||
int wordLength, int score) {
|
if (suggestionResults == null) {
|
||||||
final int positionIndex = Arrays.binarySearch(mScores, 0, mLength, score);
|
return;
|
||||||
// binarySearch returns the index if the element exists, and -<insertion index> - 1
|
|
||||||
// if it doesn't. See documentation for binarySearch.
|
|
||||||
final int insertIndex = positionIndex >= 0 ? positionIndex : -positionIndex - 1;
|
|
||||||
|
|
||||||
// Weak <- insertIndex == 0, ..., insertIndex == mLength -> Strong
|
|
||||||
if (insertIndex == 0 && mLength >= mMaxLength) {
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
// suggestionResults is sorted.
|
||||||
final String wordString = new String(word, wordOffset, wordLength);
|
for (final SuggestedWordInfo suggestedWordInfo : suggestionResults) {
|
||||||
if (mLength < mMaxLength) {
|
mSuggestions.add(suggestedWordInfo.mWord);
|
||||||
final int copyLen = mLength - insertIndex;
|
mScores.add(suggestedWordInfo.mScore);
|
||||||
++mLength;
|
|
||||||
System.arraycopy(mScores, insertIndex, mScores, insertIndex + 1, copyLen);
|
|
||||||
mSuggestions.add(insertIndex, wordString);
|
|
||||||
mScores[insertIndex] = score;
|
|
||||||
} else {
|
|
||||||
System.arraycopy(mScores, 1, mScores, 0, insertIndex - 1);
|
|
||||||
mSuggestions.add(insertIndex, wordString);
|
|
||||||
mSuggestions.remove(0);
|
|
||||||
mScores[insertIndex - 1] = score;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Result getResults(final int capitalizeType, final Locale locale) {
|
public Result getResults(final int capitalizeType, final Locale locale) {
|
||||||
final String[] gatheredSuggestions;
|
final String[] gatheredSuggestions;
|
||||||
final boolean hasRecommendedSuggestions;
|
final boolean hasRecommendedSuggestions;
|
||||||
if (0 == mLength) {
|
if (mSuggestions.isEmpty()) {
|
||||||
gatheredSuggestions = null;
|
gatheredSuggestions = null;
|
||||||
hasRecommendedSuggestions = false;
|
hasRecommendedSuggestions = false;
|
||||||
} else {
|
} else {
|
||||||
if (DBG) {
|
if (DBG) {
|
||||||
if (mLength != mSuggestions.size()) {
|
for (int i = 0; i < mSuggestions.size(); i++) {
|
||||||
Log.e(TAG, "Suggestion size is not the same as stored mLength");
|
Log.i(TAG, "" + mScores.get(i) + " " + mSuggestions.get(i));
|
||||||
}
|
|
||||||
for (int i = mLength - 1; i >= 0; --i) {
|
|
||||||
Log.i(TAG, "" + mScores[i] + " " + mSuggestions.get(i));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Collections.reverse(mSuggestions);
|
|
||||||
StringUtils.removeDupes(mSuggestions);
|
StringUtils.removeDupes(mSuggestions);
|
||||||
if (StringUtils.CAPITALIZE_ALL == capitalizeType) {
|
if (StringUtils.CAPITALIZE_ALL == capitalizeType) {
|
||||||
for (int i = 0; i < mSuggestions.size(); ++i) {
|
for (int i = 0; i < mSuggestions.size(); ++i) {
|
||||||
|
@ -309,7 +286,7 @@ public final class AndroidSpellCheckerService extends SpellCheckerService
|
||||||
// into a String[].
|
// into a String[].
|
||||||
gatheredSuggestions = mSuggestions.toArray(EMPTY_STRING_ARRAY);
|
gatheredSuggestions = mSuggestions.toArray(EMPTY_STRING_ARRAY);
|
||||||
|
|
||||||
final int bestScore = mScores[mLength - 1];
|
final int bestScore = mScores.get(0);
|
||||||
final String bestSuggestion = mSuggestions.get(0);
|
final String bestSuggestion = mSuggestions.get(0);
|
||||||
final float normalizedScore =
|
final float normalizedScore =
|
||||||
BinaryDictionaryUtils.calcNormalizedScore(
|
BinaryDictionaryUtils.calcNormalizedScore(
|
||||||
|
|
|
@ -259,14 +259,6 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session {
|
||||||
}
|
}
|
||||||
final String text = inText.replaceAll(
|
final String text = inText.replaceAll(
|
||||||
AndroidSpellCheckerService.APOSTROPHE, AndroidSpellCheckerService.SINGLE_QUOTE);
|
AndroidSpellCheckerService.APOSTROPHE, AndroidSpellCheckerService.SINGLE_QUOTE);
|
||||||
|
|
||||||
// TODO: Don't gather suggestions if the limit is <= 0 unless necessary
|
|
||||||
//final SuggestionsGatherer suggestionsGatherer = new SuggestionsGatherer(text,
|
|
||||||
//mService.mSuggestionThreshold, mService.mRecommendedThreshold,
|
|
||||||
//suggestionsLimit);
|
|
||||||
final SuggestionsGatherer suggestionsGatherer = mService.newSuggestionsGatherer(
|
|
||||||
text, suggestionsLimit);
|
|
||||||
|
|
||||||
final int capitalizeType = StringUtils.getCapitalizationType(text);
|
final int capitalizeType = StringUtils.getCapitalizationType(text);
|
||||||
boolean isInDict = true;
|
boolean isInDict = true;
|
||||||
if (!mService.hasMainDictionaryForLocale(mLocale)) {
|
if (!mService.hasMainDictionaryForLocale(mLocale)) {
|
||||||
|
@ -289,18 +281,13 @@ public abstract class AndroidWordLevelSpellCheckerSession extends Session {
|
||||||
composer.setComposingWord(codePoints, coordinates);
|
composer.setComposingWord(codePoints, coordinates);
|
||||||
final SuggestionResults suggestionResults = mService.getSuggestionResults(
|
final SuggestionResults suggestionResults = mService.getSuggestionResults(
|
||||||
mLocale, composer, prevWordsInfo, proximityInfo);
|
mLocale, composer, prevWordsInfo, proximityInfo);
|
||||||
if (suggestionResults != null) {
|
// TODO: Don't gather suggestions if the limit is <= 0 unless necessary
|
||||||
for (final SuggestedWordInfo suggestion : suggestionResults) {
|
final SuggestionsGatherer suggestionsGatherer = mService.newSuggestionsGatherer(
|
||||||
final String suggestionStr = suggestion.mWord;
|
text, suggestionsLimit);
|
||||||
suggestionsGatherer.addWord(suggestionStr.toCharArray(), null, 0,
|
suggestionsGatherer.addResults(suggestionResults);
|
||||||
suggestionStr.length(), suggestion.mScore);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
isInDict = isInDictForAnyCapitalization(text, capitalizeType);
|
|
||||||
|
|
||||||
final SuggestionsGatherer.Result result = suggestionsGatherer.getResults(
|
final SuggestionsGatherer.Result result = suggestionsGatherer.getResults(
|
||||||
capitalizeType, mLocale);
|
capitalizeType, mLocale);
|
||||||
|
isInDict = isInDictForAnyCapitalization(text, capitalizeType);
|
||||||
if (DBG) {
|
if (DBG) {
|
||||||
Log.i(TAG, "Spell checking results for " + text + " with suggestion limit "
|
Log.i(TAG, "Spell checking results for " + text + " with suggestion limit "
|
||||||
+ suggestionsLimit);
|
+ suggestionsLimit);
|
||||||
|
|
Loading…
Reference in a new issue