Fix a long-standing race condition.

Upon autocorrection, there is visual feedback in the text
view that quickly flashes the background of the text that
just changed. This fixes a race condition that happens
upon autocorrection when typing fast, and that results in
flashing one character too far left (typically, the flashing
area includes the whitespace before the corrected word and
not the last character of the corrected word).
This happens because the call to commitCorrection may
happen before or after the IPC sent by sendKeyChar, but the
arguments are fit only for the case where it arrives first.

Change-Id: I9b5442a665aad5a9bc66cd49228075b9056b37fa
main
Jean Chalard 2011-12-14 12:20:58 +09:00
parent edf4995a3b
commit 514beb0992
1 changed files with 15 additions and 15 deletions

View File

@ -1604,6 +1604,21 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
} }
} }
if (pickedDefault) {
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)) {
// This will make the correction flash for a short while as a visual clue
// to the user that auto-correction happened.
InputConnectionCompatUtils.commitCorrection(
ic, mLastSelectionEnd - typedWord.length(), typedWord, autoCorrection);
}
}
final boolean swapMagicSpace; final boolean swapMagicSpace;
if (Keyboard.CODE_ENTER == primaryCode && (SPACE_STATE_MAGIC == spaceState if (Keyboard.CODE_ENTER == primaryCode && (SPACE_STATE_MAGIC == spaceState
|| SPACE_STATE_SWAP_PUNCTUATION == spaceState)) { || SPACE_STATE_SWAP_PUNCTUATION == spaceState)) {
@ -1651,21 +1666,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
Utils.Stats.onSeparator((char)primaryCode, x, y); Utils.Stats.onSeparator((char)primaryCode, x, y);
if (pickedDefault) {
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, autoCorrection);
}
}
mKeyboardSwitcher.updateShiftState(); mKeyboardSwitcher.updateShiftState();
if (ic != null) { if (ic != null) {
ic.endBatchEdit(); ic.endBatchEdit();