Don't resume suggestions with H/W keyboard

...unless we do support a hardware keyboard, which we still
do not at the moment.

Change-Id: Iec24b1ae8ba5e23e0bbb7e5a468b7404296d4b18
main
Jean Chalard 2014-09-05 20:07:23 +09:00
parent 914078fd91
commit 9395014e76
1 changed files with 72 additions and 41 deletions

View File

@ -713,11 +713,27 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
@Override @Override
public void onConfigurationChanged(final Configuration conf) { public void onConfigurationChanged(final Configuration conf) {
final SettingsValues settingsValues = mSettings.getCurrent(); SettingsValues settingsValues = mSettings.getCurrent();
if (settingsValues.mDisplayOrientation != conf.orientation) { if (settingsValues.mDisplayOrientation != conf.orientation) {
mHandler.startOrientationChanging(); mHandler.startOrientationChanging();
mInputLogic.onOrientationChange(mSettings.getCurrent()); mInputLogic.onOrientationChange(mSettings.getCurrent());
} }
if (settingsValues.mHasHardwareKeyboard != Settings.readHasHardwareKeyboard(conf)) {
// If the state of having a hardware keyboard changed, then we want to reload the
// settings to adjust for that.
// TODO: we should probably do this unconditionally here, rather than only when we
// have a change in hardware keyboard configuration.
loadSettings();
settingsValues = mSettings.getCurrent();
if (settingsValues.mHasHardwareKeyboard) {
// We call cleanupInternalStateForFinishInput() because it's the right thing to do;
// however, it seems at the moment the framework is passing us a seemingly valid
// but actually non-functional InputConnection object. So if this bug ever gets
// fixed we'll be able to remove the composition, but until it is this code is
// actually not doing much.
cleanupInternalStateForFinishInput();
}
}
// TODO: Remove this test. // TODO: Remove this test.
if (!conf.locale.equals(mPersonalizationDictionaryUpdater.getLocale())) { if (!conf.locale.equals(mPersonalizationDictionaryUpdater.getLocale())) {
refreshPersonalizationDictionarySession(settingsValues); refreshPersonalizationDictionarySession(settingsValues);
@ -843,6 +859,16 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
// Note: This call should be done by InputMethodService? // Note: This call should be done by InputMethodService?
updateFullscreenMode(); updateFullscreenMode();
// ALERT: settings have not been reloaded and there is a chance they may be stale.
// In the practice, if it is, we should have gotten onConfigurationChanged so it should
// be fine, but this is horribly confusing and must be fixed AS SOON AS POSSIBLE.
// In some cases the input connection has not been reset yet and we can't access it. In
// this case we will need to call loadKeyboard() later, when it's accessible, so that we
// can go into the correct mode, so we need to do some housekeeping here.
final boolean needToCallLoadKeyboardLater;
final Suggest suggest = mInputLogic.mSuggest;
if (!currentSettingsValues.mHasHardwareKeyboard) {
// The app calling setText() has the effect of clearing the composing // The app calling setText() has the effect of clearing the composing
// span, so we should reset our state unconditionally, even if restarting is true. // span, so we should reset our state unconditionally, even if restarting is true.
// We also tell the input logic about the combining rules for the current subtype, so // We also tell the input logic about the combining rules for the current subtype, so
@ -852,31 +878,33 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
// Note: the following does a round-trip IPC on the main thread: be careful // Note: the following does a round-trip IPC on the main thread: be careful
final Locale currentLocale = mSubtypeSwitcher.getCurrentSubtypeLocale(); final Locale currentLocale = mSubtypeSwitcher.getCurrentSubtypeLocale();
final Suggest suggest = mInputLogic.mSuggest;
if (null != currentLocale && !currentLocale.equals(suggest.getLocale())) { if (null != currentLocale && !currentLocale.equals(suggest.getLocale())) {
// TODO: Do this automatically. // TODO: Do this automatically.
resetSuggest(); resetSuggest();
} }
// TODO[IL]: Can the following be moved to InputLogic#startInput? // TODO[IL]: Can the following be moved to InputLogic#startInput?
final boolean canReachInputConnection;
if (!mInputLogic.mConnection.resetCachesUponCursorMoveAndReturnSuccess( if (!mInputLogic.mConnection.resetCachesUponCursorMoveAndReturnSuccess(
editorInfo.initialSelStart, editorInfo.initialSelEnd, editorInfo.initialSelStart, editorInfo.initialSelEnd,
false /* shouldFinishComposition */)) { false /* shouldFinishComposition */)) {
// Sometimes, while rotating, for some reason the framework tells the app we are not // 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 // connected to it and that means we can't refresh the cache. In this case, schedule
// refresh later. // a refresh later.
// We try resetting the caches up to 5 times before giving up. // We try resetting the caches up to 5 times before giving up.
mHandler.postResetCaches(isDifferentTextField, 5 /* remainingTries */); mHandler.postResetCaches(isDifferentTextField, 5 /* remainingTries */);
// mLastSelection{Start,End} are reset later in this method, don't need to do it here // mLastSelection{Start,End} are reset later in this method, no need to do it here
canReachInputConnection = false; needToCallLoadKeyboardLater = true;
} else { } else {
// When rotating, initialSelStart and initialSelEnd sometimes are lying. Make a best // When rotating, initialSelStart and initialSelEnd sometimes are lying. Make a best
// effort to work around this bug. // effort to work around this bug.
mInputLogic.mConnection.tryFixLyingCursorPosition(); mInputLogic.mConnection.tryFixLyingCursorPosition();
mHandler.postResumeSuggestions(true /* shouldIncludeResumedWordInSuggestions */, mHandler.postResumeSuggestions(true /* shouldIncludeResumedWordInSuggestions */,
true /* shouldDelay */); true /* shouldDelay */);
canReachInputConnection = true; needToCallLoadKeyboardLater = false;
}
} else {
// If we have a hardware keyboard we don't need to call loadKeyboard later anyway.
needToCallLoadKeyboardLater = false;
} }
if (isDifferentTextField || if (isDifferentTextField ||
@ -894,9 +922,9 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
switcher.loadKeyboard(editorInfo, currentSettingsValues, getCurrentAutoCapsState(), switcher.loadKeyboard(editorInfo, currentSettingsValues, getCurrentAutoCapsState(),
getCurrentRecapitalizeState()); getCurrentRecapitalizeState());
if (!canReachInputConnection) { if (needToCallLoadKeyboardLater) {
// If we can't reach the input connection, we will call loadKeyboard again later, // If we need to call loadKeyboard again later, we need to save its state now. The
// so we need to save its state now. The call will be done in #retryResetCaches. // later call will be done in #retryResetCaches.
switcher.saveKeyboardState(); switcher.saveKeyboardState();
} }
} else if (restarting) { } else if (restarting) {
@ -953,6 +981,10 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
private void onFinishInputViewInternal(final boolean finishingInput) { private void onFinishInputViewInternal(final boolean finishingInput) {
super.onFinishInputView(finishingInput); super.onFinishInputView(finishingInput);
cleanupInternalStateForFinishInput();
}
private void cleanupInternalStateForFinishInput() {
mKeyboardSwitcher.deallocateMemory(); mKeyboardSwitcher.deallocateMemory();
// Remove pending messages related to update suggestions // Remove pending messages related to update suggestions
mHandler.cancelUpdateSuggestionStrip(); mHandler.cancelUpdateSuggestionStrip();
@ -972,13 +1004,12 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
+ ", cs=" + composingSpanStart + ", ce=" + composingSpanEnd); + ", cs=" + composingSpanStart + ", ce=" + composingSpanEnd);
} }
// If the keyboard is not visible, we don't need to do all the housekeeping work, as it // This call happens when we have a hardware keyboard as well as when we don't. While we
// will be reset when the keyboard shows up anyway. // don't support hardware keyboards yet we should avoid doing the processing associated
// TODO: revisit this when LatinIME supports hardware keyboards. // with cursor movement when we have a hardware keyboard since we are not in charge.
// NOTE: the test harness subclasses LatinIME and overrides isInputViewShown(). final SettingsValues settingsValues = mSettings.getCurrent();
// TODO: find a better way to simulate actual execution. if ((!settingsValues.mHasHardwareKeyboard || ProductionFlags.IS_HARDWARE_KEYBOARD_SUPPORTED)
if (isInputViewShown() && && mInputLogic.onUpdateSelection(oldSelStart, oldSelEnd, newSelStart, newSelEnd)) {
mInputLogic.onUpdateSelection(oldSelStart, oldSelEnd, newSelStart, newSelEnd)) {
mKeyboardSwitcher.requestUpdatingShiftState(getCurrentAutoCapsState(), mKeyboardSwitcher.requestUpdatingShiftState(getCurrentAutoCapsState(),
getCurrentRecapitalizeState()); getCurrentRecapitalizeState());
} }