Call loadKeyboard later if it can't be called right away

Since loadKeyboard relies on the input connection being
available to give it the auto-caps state, but also can't
be called twice in a row because it needs to save and
restore its state and invalidates it after the restore,
we need to wait until we know we have a valid input
connection to call it.

Bug: 11107229
Change-Id: I1c7baf3215682df6f6ceb357bd37254f9e7418c7
This commit is contained in:
Jean Chalard 2013-10-07 21:43:05 +09:00
parent 291ef1c9c3
commit 3c4e8cb693
2 changed files with 15 additions and 6 deletions

View file

@ -178,8 +178,6 @@ public final class KeyboardState {
if (!state.mIsAlphabetShiftLocked) {
setShifted(state.mShiftMode);
}
// TODO: is this the right place to do this? Should we do this in setShift* instead?
mSwitchActions.requestUpdatingShiftState();
} else {
mPrevMainKeyboardWasShiftLocked = state.mIsAlphabetShiftLocked;
}

View file

@ -904,12 +904,17 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
// Sometimes, while rotating, for some reason the framework tells the app we are not
// connected to it and that means we can't refresh the cache. In this case, schedule a
// refresh later.
final boolean canReachInputConnection;
if (!mConnection.resetCachesUponCursorMoveAndReturnSuccess(editorInfo.initialSelStart,
false /* shouldFinishComposition */)) {
// We try resetting the caches up to 5 times before giving up.
mHandler.postResetCaches(isDifferentTextField, 5 /* remainingTries */);
canReachInputConnection = false;
} else {
if (isDifferentTextField) mHandler.postResumeSuggestions();
if (isDifferentTextField) {
mHandler.postResumeSuggestions();
}
canReachInputConnection = true;
}
if (isDifferentTextField) {
@ -921,7 +926,11 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
suggest.setAutoCorrectionThreshold(currentSettingsValues.mAutoCorrectionThreshold);
}
switcher.loadKeyboard(editorInfo, currentSettingsValues);
if (canReachInputConnection) {
// If we can't reach the input connection, we don't want to call loadKeyboard yet.
// It will be done in #retryResetCaches.
switcher.loadKeyboard(editorInfo, currentSettingsValues);
}
} else if (restarting) {
// TODO: Come up with a more comprehensive way to reset the keyboard layout when
// a keyboard layout set doesn't get reloaded in this method.
@ -2955,11 +2964,13 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
if (!mConnection.resetCachesUponCursorMoveAndReturnSuccess(mLastSelectionStart, false)) {
if (0 < remainingTries) {
mHandler.postResetCaches(tryResumeSuggestions, remainingTries - 1);
return;
}
return;
// If remainingTries is 0, we should stop waiting for new tries, but it's still
// better to load the keyboard (less things will be broken).
}
tryFixLyingCursorPosition();
mKeyboardSwitcher.updateShiftState();
mKeyboardSwitcher.loadKeyboard(getCurrentInputEditorInfo(), mSettings.getCurrent());
if (tryResumeSuggestions) mHandler.postResumeSuggestions();
}