Move mBestWord to the word composer.
mBestWord has a confusing name - it's actually an auto-correction. It's cleaner if it lives in the word composer because an auto-correction should be tied to a specific user input, and should be reset each time the user input changes to avoid race conditions. Change-Id: I718d29395bc747372067e6440e090c6a181994ae
This commit is contained in:
parent
7e6f4daa19
commit
117fc93f37
2 changed files with 55 additions and 19 deletions
|
@ -203,7 +203,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
|||
private boolean mApplicationSpecifiedCompletionOn;
|
||||
|
||||
private WordComposer mWordComposer = new WordComposer();
|
||||
private CharSequence mBestWord;
|
||||
private boolean mHasUncommittedTypedChars;
|
||||
|
||||
private int mCorrectionMode;
|
||||
|
@ -1019,7 +1018,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
|||
.setHasMinimalSuggestion(false);
|
||||
// When in fullscreen mode, show completions generated by the application
|
||||
setSuggestions(builder.build());
|
||||
mBestWord = null;
|
||||
mWordComposer.deleteAutoCorrection();
|
||||
setSuggestionStripShown(true);
|
||||
}
|
||||
}
|
||||
|
@ -1649,10 +1648,18 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
|||
Utils.Stats.onSeparator((char)primaryCode, x, y);
|
||||
|
||||
if (pickedDefault) {
|
||||
CharSequence typedWord = mWordComposer.getTypedWord();
|
||||
if (!TextUtils.isEmpty(typedWord) && !typedWord.equals(mBestWord)) {
|
||||
final CharSequence autoCorrection = mWordComposer.getAutoCorrectionOrNull();
|
||||
final String typedWord = mWordComposer.getTypedWord();
|
||||
if (TextUtils.isEmpty(typedWord)) {
|
||||
throw new RuntimeException("We have non-committed chars but the typed word "
|
||||
+ "is empty? Impossible! I must commit suicide.");
|
||||
}
|
||||
if (!typedWord.equals(autoCorrection)) {
|
||||
// TODO: if the commitCorrection method is not supported by the platform
|
||||
// this will do nothing and the correction will not be committed at all. What
|
||||
// happens on Froyo/Gingerbread, where this API is not present?
|
||||
InputConnectionCompatUtils.commitCorrection(
|
||||
ic, mLastSelectionEnd - typedWord.length(), typedWord, mBestWord);
|
||||
ic, mLastSelectionEnd - typedWord.length(), typedWord, autoCorrection);
|
||||
}
|
||||
}
|
||||
mKeyboardSwitcher.updateShiftState();
|
||||
|
@ -1847,14 +1854,15 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
|||
setSuggestions(suggestedWords);
|
||||
if (suggestedWords.size() > 0) {
|
||||
if (shouldBlockAutoCorrectionBySafetyNet) {
|
||||
mBestWord = typedWord;
|
||||
mWordComposer.setAutoCorrection(typedWord);
|
||||
} else if (suggestedWords.hasAutoCorrectionWord()) {
|
||||
mBestWord = suggestedWords.getWord(1);
|
||||
mWordComposer.setAutoCorrection(suggestedWords.getWord(1));
|
||||
} else {
|
||||
mBestWord = typedWord;
|
||||
mWordComposer.setAutoCorrection(typedWord);
|
||||
}
|
||||
} else {
|
||||
mBestWord = null;
|
||||
// TODO: replace with mWordComposer.deleteAutoCorrection()?
|
||||
mWordComposer.setAutoCorrection(null);
|
||||
}
|
||||
setSuggestionStripShown(isSuggestionsStripVisible());
|
||||
}
|
||||
|
@ -1865,16 +1873,17 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
|||
mHandler.cancelUpdateSuggestions();
|
||||
updateSuggestions();
|
||||
}
|
||||
if (mBestWord != null && mBestWord.length() > 0) {
|
||||
Utils.Stats.onAutoCorrection(mWordComposer.getTypedWord(), mBestWord.toString(),
|
||||
separatorCode);
|
||||
final CharSequence autoCorrection = mWordComposer.getAutoCorrectionOrNull();
|
||||
if (autoCorrection != null) {
|
||||
final String typedWord = mWordComposer.getTypedWord();
|
||||
Utils.Stats.onAutoCorrection(typedWord, autoCorrection.toString(), separatorCode);
|
||||
mExpectingUpdateSelection = true;
|
||||
commitBestWord(mBestWord);
|
||||
if (!mBestWord.equals(mWordComposer.getTypedWord())) {
|
||||
mWordSavedForAutoCorrectCancellation = mBestWord.toString();
|
||||
commitBestWord(autoCorrection);
|
||||
if (!autoCorrection.equals(typedWord)) {
|
||||
mWordSavedForAutoCorrectCancellation = autoCorrection.toString();
|
||||
}
|
||||
// Add the word to the user unigram dictionary if it's not a known word
|
||||
addToUserUnigramAndBigramDictionaries(mBestWord,
|
||||
addToUserUnigramAndBigramDictionaries(autoCorrection,
|
||||
UserUnigramDictionary.FREQUENCY_FOR_TYPED);
|
||||
return true;
|
||||
}
|
||||
|
@ -2153,8 +2162,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
|||
private void restartSuggestionsOnWordBeforeCursor(final InputConnection ic,
|
||||
final CharSequence word) {
|
||||
mWordComposer.setComposingWord(word, mKeyboardSwitcher.getLatinKeyboard());
|
||||
// mBestWord will be set appropriately by updateSuggestions() called by the handler
|
||||
mBestWord = null;
|
||||
mHasUncommittedTypedChars = true;
|
||||
mComposingStateManager.onStartComposingText();
|
||||
ic.deleteSurroundingText(word.length(), 0);
|
||||
|
|
|
@ -41,6 +41,8 @@ public class WordComposer {
|
|||
private int[] mYCoordinates;
|
||||
|
||||
private StringBuilder mTypedWord;
|
||||
// An auto-correction for this word out of the dictionary.
|
||||
private CharSequence mAutoCorrection;
|
||||
|
||||
private int mCapsCount;
|
||||
|
||||
|
@ -60,6 +62,7 @@ public class WordComposer {
|
|||
mXCoordinates = new int[N];
|
||||
mYCoordinates = new int[N];
|
||||
mTrailingSingleQuotesCount = 0;
|
||||
mAutoCorrection = null;
|
||||
}
|
||||
|
||||
public WordComposer(WordComposer source) {
|
||||
|
@ -75,6 +78,7 @@ public class WordComposer {
|
|||
mIsFirstCharCapitalized = source.mIsFirstCharCapitalized;
|
||||
mAutoCapitalized = source.mAutoCapitalized;
|
||||
mTrailingSingleQuotesCount = source.mTrailingSingleQuotesCount;
|
||||
mAutoCorrection = null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -86,6 +90,7 @@ public class WordComposer {
|
|||
mCapsCount = 0;
|
||||
mIsFirstCharCapitalized = false;
|
||||
mTrailingSingleQuotesCount = 0;
|
||||
mAutoCorrection = null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -140,6 +145,7 @@ public class WordComposer {
|
|||
} else {
|
||||
mTrailingSingleQuotesCount = 0;
|
||||
}
|
||||
mAutoCorrection = null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -173,6 +179,7 @@ public class WordComposer {
|
|||
int codePoint = word.charAt(i);
|
||||
addKeyInfo(codePoint, keyboard, keyDetector);
|
||||
}
|
||||
mAutoCorrection = null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -224,11 +231,12 @@ public class WordComposer {
|
|||
++mTrailingSingleQuotesCount;
|
||||
}
|
||||
}
|
||||
mAutoCorrection = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the word as it was typed, without any correction applied.
|
||||
* @return the word that was typed so far
|
||||
* @return the word that was typed so far. Never returns null.
|
||||
*/
|
||||
public String getTypedWord() {
|
||||
return mTypedWord.toString();
|
||||
|
@ -277,4 +285,25 @@ public class WordComposer {
|
|||
public boolean isAutoCapitalized() {
|
||||
return mAutoCapitalized;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the auto-correction for this word.
|
||||
*/
|
||||
public void setAutoCorrection(final CharSequence correction) {
|
||||
mAutoCorrection = correction;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove any auto-correction that may have been set.
|
||||
*/
|
||||
public void deleteAutoCorrection() {
|
||||
mAutoCorrection = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the auto-correction for this world, or null if none.
|
||||
*/
|
||||
public CharSequence getAutoCorrectionOrNull() {
|
||||
return mAutoCorrection;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue