am 205f9ca3
: Merge "Straighten out logic for revert word paths"
* commit '205f9ca3101f36e5375beddd453b771c8a92c352': Straighten out logic for revert word paths
This commit is contained in:
commit
2648acb0de
1 changed files with 69 additions and 32 deletions
|
@ -209,6 +209,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
|
|
||||||
private int mCorrectionMode;
|
private int mCorrectionMode;
|
||||||
private int mCommittedLength;
|
private int mCommittedLength;
|
||||||
|
private String mWordSavedForAutoCorrectCancellation;
|
||||||
// Keep track of the last selection range to decide if we need to show word alternatives
|
// Keep track of the last selection range to decide if we need to show word alternatives
|
||||||
private int mLastSelectionStart;
|
private int mLastSelectionStart;
|
||||||
private int mLastSelectionEnd;
|
private int mLastSelectionEnd;
|
||||||
|
@ -1431,11 +1432,15 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
|
|
||||||
// TODO: Merge space state with TextEntryState
|
// TODO: Merge space state with TextEntryState
|
||||||
TextEntryState.backspace();
|
TextEntryState.backspace();
|
||||||
if (TextEntryState.isUndoCommit()) {
|
if (null != mWordSavedForAutoCorrectCancellation) {
|
||||||
revertLastWord(ic);
|
cancelAutoCorrect(ic);
|
||||||
|
mWordSavedForAutoCorrectCancellation = null;
|
||||||
ic.endBatchEdit();
|
ic.endBatchEdit();
|
||||||
return;
|
return;
|
||||||
|
} else {
|
||||||
|
mWordSavedForAutoCorrectCancellation = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SPACE_STATE_DOUBLE == spaceState) {
|
if (SPACE_STATE_DOUBLE == spaceState) {
|
||||||
if (revertDoubleSpace(ic)) {
|
if (revertDoubleSpace(ic)) {
|
||||||
ic.endBatchEdit();
|
ic.endBatchEdit();
|
||||||
|
@ -1452,6 +1457,9 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mEnteredText != null && sameAsTextBeforeCursor(ic, mEnteredText)) {
|
if (mEnteredText != null && sameAsTextBeforeCursor(ic, mEnteredText)) {
|
||||||
|
// Cancel multi-character input: remove the text we just entered.
|
||||||
|
// This is triggered on backspace after a key that inputs multiple characters,
|
||||||
|
// like the smiley key or the .com key.
|
||||||
ic.deleteSurroundingText(mEnteredText.length(), 0);
|
ic.deleteSurroundingText(mEnteredText.length(), 0);
|
||||||
} else if (deleteChar) {
|
} else if (deleteChar) {
|
||||||
if (mSuggestionsView != null && mSuggestionsView.dismissAddToDictionaryHint()) {
|
if (mSuggestionsView != null && mSuggestionsView.dismissAddToDictionaryHint()) {
|
||||||
|
@ -1462,7 +1470,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
// different behavior only in the case of picking the first
|
// different behavior only in the case of picking the first
|
||||||
// suggestion (typed word). It's intentional to have made this
|
// suggestion (typed word). It's intentional to have made this
|
||||||
// inconsistent with backspacing after selecting other suggestions.
|
// inconsistent with backspacing after selecting other suggestions.
|
||||||
revertLastWord(ic);
|
restartSuggestionsOnManuallyPickedTypedWord(ic);
|
||||||
} else {
|
} else {
|
||||||
ic.deleteSurroundingText(1, 0);
|
ic.deleteSurroundingText(1, 0);
|
||||||
if (mDeleteCount > DELETE_ACCELERATE_AT) {
|
if (mDeleteCount > DELETE_ACCELERATE_AT) {
|
||||||
|
@ -1601,6 +1609,8 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
} else {
|
} else {
|
||||||
commitTyped(ic);
|
commitTyped(ic);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
mWordSavedForAutoCorrectCancellation = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
final boolean swapMagicSpace;
|
final boolean swapMagicSpace;
|
||||||
|
@ -1863,6 +1873,9 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
TextEntryState.acceptedDefault(mWordComposer.getTypedWord(), mBestWord, separatorCode);
|
TextEntryState.acceptedDefault(mWordComposer.getTypedWord(), mBestWord, separatorCode);
|
||||||
mExpectingUpdateSelection = true;
|
mExpectingUpdateSelection = true;
|
||||||
commitBestWord(mBestWord);
|
commitBestWord(mBestWord);
|
||||||
|
if (!mBestWord.equals(mWordComposer.getTypedWord())) {
|
||||||
|
mWordSavedForAutoCorrectCancellation = mBestWord.toString();
|
||||||
|
}
|
||||||
// Add the word to the user unigram dictionary if it's not a known word
|
// Add the word to the user unigram dictionary if it's not a known word
|
||||||
addToUserUnigramAndBigramDictionaries(mBestWord,
|
addToUserUnigramAndBigramDictionaries(mBestWord,
|
||||||
UserUnigramDictionary.FREQUENCY_FOR_TYPED);
|
UserUnigramDictionary.FREQUENCY_FOR_TYPED);
|
||||||
|
@ -2160,37 +2173,61 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
||||||
}
|
}
|
||||||
|
|
||||||
// "ic" must not be null
|
// "ic" must not be null
|
||||||
private void revertLastWord(final InputConnection ic) {
|
private void cancelAutoCorrect(final InputConnection ic) {
|
||||||
if (mHasUncommittedTypedChars || mWordComposer.size() <= 0) {
|
final int cancelLength = mWordSavedForAutoCorrectCancellation.length();
|
||||||
sendDownUpKeyEvents(KeyEvent.KEYCODE_DEL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final CharSequence separator = ic.getTextBeforeCursor(1, 0);
|
final CharSequence separator = ic.getTextBeforeCursor(1, 0);
|
||||||
ic.deleteSurroundingText(1, 0);
|
if (DEBUG) {
|
||||||
final CharSequence textToTheLeft = ic.getTextBeforeCursor(mCommittedLength, 0);
|
final String wordBeforeCursor =
|
||||||
ic.deleteSurroundingText(mCommittedLength, 0);
|
ic.getTextBeforeCursor(cancelLength + 1, 0).subSequence(0, cancelLength)
|
||||||
|
.toString();
|
||||||
// Re-insert "separator" only when the deleted character was word separator and the
|
if (!mWordSavedForAutoCorrectCancellation.equals(wordBeforeCursor)) {
|
||||||
// composing text wasn't equal to the auto-corrected text which can be found before
|
throw new RuntimeException("cancelAutoCorrect check failed: we thought we were "
|
||||||
// the cursor.
|
+ "reverting \"" + mWordSavedForAutoCorrectCancellation
|
||||||
if (!TextUtils.isEmpty(separator)
|
+ "\", but before the cursor we found \"" + wordBeforeCursor + "\"");
|
||||||
&& mSettingsValues.isWordSeparator(separator.charAt(0))
|
}
|
||||||
&& !TextUtils.equals(mWordComposer.getTypedWord(), textToTheLeft)) {
|
if (mWordComposer.getTypedWord().equals(wordBeforeCursor)) {
|
||||||
ic.commitText(mWordComposer.getTypedWord(), 1);
|
throw new RuntimeException("cancelAutoCorrect check failed: we wanted to cancel "
|
||||||
TextEntryState.acceptedTyped(mWordComposer.getTypedWord());
|
+ "auto correction and revert to \"" + mWordComposer.getTypedWord()
|
||||||
ic.commitText(separator, 1);
|
+ "\" but we found this very string before the cursor");
|
||||||
TextEntryState.typedCharacter(separator.charAt(0), true,
|
}
|
||||||
WordComposer.NOT_A_COORDINATE, WordComposer.NOT_A_COORDINATE);
|
|
||||||
} else {
|
|
||||||
// Note: this relies on the last word still being held in the WordComposer
|
|
||||||
// Note: in the interest of code simplicity, we may want to just call
|
|
||||||
// restartSuggestionsOnWordBeforeCursorIfAtEndOfWord instead, but retrieving
|
|
||||||
// the old WordComposer allows to reuse the actual typed coordinates.
|
|
||||||
mHasUncommittedTypedChars = true;
|
|
||||||
ic.setComposingText(mWordComposer.getTypedWord(), 1);
|
|
||||||
TextEntryState.backspace();
|
|
||||||
}
|
}
|
||||||
|
ic.deleteSurroundingText(cancelLength + 1, 0);
|
||||||
|
|
||||||
|
// Re-insert the separator
|
||||||
|
ic.commitText(mWordComposer.getTypedWord(), 1);
|
||||||
|
TextEntryState.acceptedTyped(mWordComposer.getTypedWord());
|
||||||
|
ic.commitText(separator, 1);
|
||||||
|
TextEntryState.typedCharacter(separator.charAt(0), true,
|
||||||
|
WordComposer.NOT_A_COORDINATE, WordComposer.NOT_A_COORDINATE);
|
||||||
|
mHandler.cancelUpdateBigramPredictions();
|
||||||
|
mHandler.postUpdateSuggestions();
|
||||||
|
}
|
||||||
|
|
||||||
|
// "ic" must not be null
|
||||||
|
private void restartSuggestionsOnManuallyPickedTypedWord(final InputConnection ic) {
|
||||||
|
final CharSequence separator = ic.getTextBeforeCursor(1, 0);
|
||||||
|
final int restartLength = mCommittedLength;
|
||||||
|
if (DEBUG) {
|
||||||
|
final String wordBeforeCursor =
|
||||||
|
ic.getTextBeforeCursor(restartLength + 1, 0).subSequence(0, restartLength)
|
||||||
|
.toString();
|
||||||
|
if (!mWordComposer.getTypedWord().equals(wordBeforeCursor)) {
|
||||||
|
throw new RuntimeException("restartSuggestionsOnManuallyPickedTypedWord "
|
||||||
|
+ "check failed: we thought we were reverting \""
|
||||||
|
+ mWordComposer.getTypedWord()
|
||||||
|
+ "\", but before the cursor we found \""
|
||||||
|
+ wordBeforeCursor + "\"");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ic.deleteSurroundingText(restartLength + 1, 0);
|
||||||
|
|
||||||
|
// Note: this relies on the last word still being held in the WordComposer
|
||||||
|
// Note: in the interest of code simplicity, we may want to just call
|
||||||
|
// restartSuggestionsOnWordBeforeCursorIfAtEndOfWord instead, but retrieving
|
||||||
|
// the old WordComposer allows to reuse the actual typed coordinates.
|
||||||
|
mHasUncommittedTypedChars = true;
|
||||||
|
ic.setComposingText(mWordComposer.getTypedWord(), 1);
|
||||||
|
TextEntryState.backspace();
|
||||||
mHandler.cancelUpdateBigramPredictions();
|
mHandler.cancelUpdateBigramPredictions();
|
||||||
mHandler.postUpdateSuggestions();
|
mHandler.postUpdateSuggestions();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue