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
This commit is contained in:
parent
edf4995a3b
commit
514beb0992
1 changed files with 15 additions and 15 deletions
|
@ -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;
|
||||
if (Keyboard.CODE_ENTER == primaryCode && (SPACE_STATE_MAGIC == spaceState
|
||||
|| SPACE_STATE_SWAP_PUNCTUATION == spaceState)) {
|
||||
|
@ -1651,21 +1666,6 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
|
|||
|
||||
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();
|
||||
if (ic != null) {
|
||||
ic.endBatchEdit();
|
||||
|
|
Loading…
Reference in a new issue