From 93b00a314e307cb257abf1cab88cb24d57ff3885 Mon Sep 17 00:00:00 2001 From: Jean Chalard Date: Mon, 4 Aug 2014 20:39:34 +0900 Subject: [PATCH] [HS2] Move more stuff to onStartInput Bug: 8152758 Change-Id: Ida05df7d151ceb582886e2ad06c5bdf0b59978ee --- .../android/inputmethod/latin/LatinIME.java | 111 ++++++++++-------- .../latin/inputlogic/InputLogic.java | 2 +- 2 files changed, 62 insertions(+), 51 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index 4adc28d7a..c1adc12f9 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -295,7 +295,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen } } - public void postResetCaches(final boolean tryResumeSuggestions, final int remainingTries) { + public void postResetInputConnectionCaches(final boolean tryResumeSuggestions, + final int remainingTries) { removeMessages(MSG_RESET_CACHES); sendMessage(obtainMessage(MSG_RESET_CACHES, tryResumeSuggestions ? 1 : 0, remainingTries, null)); @@ -762,9 +763,12 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen private static class EditorChangeInfo { public final boolean mIsSameInputType; public final boolean mHasSameOrientation; - public EditorChangeInfo(final boolean isSameInputType, final boolean hasSameOrientation) { + public final boolean mCanReachInputConnection; + public EditorChangeInfo(final boolean isSameInputType, final boolean hasSameOrientation, + final boolean canReachInputConnection) { mIsSameInputType = isSameInputType; mHasSameOrientation = hasSameOrientation; + mCanReachInputConnection = canReachInputConnection; } } @@ -773,15 +777,65 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen private void onStartInputInternal(final EditorInfo editorInfo, final boolean restarting) { super.onStartInput(editorInfo, restarting); SettingsValues currentSettingsValues = mSettings.getCurrent(); - mLastEditorChangeInfo = new EditorChangeInfo( - currentSettingsValues.isSameInputType(editorInfo), - currentSettingsValues.hasSameOrientation(getResources().getConfiguration())); + final boolean isSameInputType = currentSettingsValues.isSameInputType(editorInfo); + final boolean hasSameOrientation = + currentSettingsValues.hasSameOrientation(getResources().getConfiguration()); + mRichImm.clearSubtypeCaches(); + if (editorInfo == null) { + Log.e(TAG, "Null EditorInfo in onStartInput()"); + return; + } + final boolean inputTypeChanged = !isSameInputType; + final boolean isDifferentTextField = !restarting || inputTypeChanged; + if (isDifferentTextField || !hasSameOrientation) { + loadSettings(); + currentSettingsValues = mSettings.getCurrent(); + } + + // Note: the following does a round-trip IPC on the main thread: be careful + final Locale currentLocale = mSubtypeSwitcher.getCurrentSubtypeLocale(); + final Suggest suggest = mInputLogic.mSuggest; + if (null != currentLocale && !currentLocale.equals(suggest.getLocale())) { + // TODO: Do this automatically. + resetSuggest(); + } + if (isDifferentTextField && currentSettingsValues.mAutoCorrectionEnabledPerUserSettings) { + suggest.setAutoCorrectionThreshold(currentSettingsValues.mAutoCorrectionThreshold); + } + + // The app calling setText() has the effect of clearing the composing + // 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 + // it can adjust its combiners if needed. + mInputLogic.startInput(mSubtypeSwitcher.getCombiningRulesExtraValueOfCurrentSubtype()); + // TODO[IL]: Can the following be moved to InputLogic#startInput? + final boolean canReachInputConnection; + if (!mInputLogic.mConnection.resetCachesUponCursorMoveAndReturnSuccess( + editorInfo.initialSelStart, editorInfo.initialSelEnd, + false /* shouldFinishComposition */)) { + // 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. + // We try resetting the caches up to 5 times before giving up. + mHandler.postResetInputConnectionCaches(isDifferentTextField || !hasSameOrientation, + 5 /* remainingTries */); + canReachInputConnection = false; + } else { + // When rotating, initialSelStart and initialSelEnd sometimes are lying. Make a best + // effort to work around this bug. + mInputLogic.mConnection.tryFixLyingCursorPosition(); + mHandler.postResumeSuggestions(true /* shouldIncludeResumedWordInSuggestions */, + true /* shouldDelay */); + canReachInputConnection = true; + } + + mLastEditorChangeInfo = new EditorChangeInfo(isSameInputType, hasSameOrientation, + canReachInputConnection); } @SuppressWarnings("deprecation") private void onStartInputViewInternal(final EditorInfo editorInfo, final boolean restarting) { super.onStartInputView(editorInfo, restarting); - mRichImm.clearSubtypeCaches(); final KeyboardSwitcher switcher = mKeyboardSwitcher; switcher.updateKeyboardTheme(); final MainKeyboardView mainKeyboardView = switcher.getMainKeyboardView(); @@ -837,56 +891,13 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen // Note: This call should be done by InputMethodService? updateFullscreenMode(); - // The app calling setText() has the effect of clearing the composing - // 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 - // it can adjust its combiners if needed. - mInputLogic.startInput(mSubtypeSwitcher.getCombiningRulesExtraValueOfCurrentSubtype()); - - // Note: the following does a round-trip IPC on the main thread: be careful - final Locale currentLocale = mSubtypeSwitcher.getCurrentSubtypeLocale(); - final Suggest suggest = mInputLogic.mSuggest; - if (null != currentLocale && !currentLocale.equals(suggest.getLocale())) { - // TODO: Do this automatically. - resetSuggest(); - } - - // TODO[IL]: Can the following be moved to InputLogic#startInput? - final boolean canReachInputConnection; - if (!mInputLogic.mConnection.resetCachesUponCursorMoveAndReturnSuccess( - editorInfo.initialSelStart, editorInfo.initialSelEnd, - false /* shouldFinishComposition */)) { - // 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. - // We try resetting the caches up to 5 times before giving up. - mHandler.postResetCaches(isDifferentTextField, 5 /* remainingTries */); - // mLastSelection{Start,End} are reset later in this method, don't need to do it here - canReachInputConnection = false; - } else { - // When rotating, initialSelStart and initialSelEnd sometimes are lying. Make a best - // effort to work around this bug. - mInputLogic.mConnection.tryFixLyingCursorPosition(); - mHandler.postResumeSuggestions(true /* shouldIncludeResumedWordInSuggestions */, - true /* shouldDelay */); - canReachInputConnection = true; - } - - if (isDifferentTextField || !mLastEditorChangeInfo.mHasSameOrientation) { - loadSettings(); - } final SettingsValues currentSettingsValues = mSettings.getCurrent(); if (isDifferentTextField) { mainKeyboardView.closing(); - if (currentSettingsValues.mAutoCorrectionEnabledPerUserSettings) { - suggest.setAutoCorrectionThreshold( - currentSettingsValues.mAutoCorrectionThreshold); - } - switcher.loadKeyboard(editorInfo, currentSettingsValues, getCurrentAutoCapsState(), getCurrentRecapitalizeState()); - if (!canReachInputConnection) { + if (!mLastEditorChangeInfo.mCanReachInputConnection) { // If we can't reach the input connection, we will call loadKeyboard again later, // so we need to save its state now. The call will be done in #retryResetCaches. switcher.saveKeyboardState(); diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java index 97457b2f7..b511f69a6 100644 --- a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java +++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java @@ -2034,7 +2034,7 @@ public final class InputLogic { mConnection.getExpectedSelectionStart(), mConnection.getExpectedSelectionEnd(), shouldFinishComposition)) { if (0 < remainingTries) { - handler.postResetCaches(tryResumeSuggestions, remainingTries - 1); + handler.postResetInputConnectionCaches(tryResumeSuggestions, remainingTries - 1); return false; } // If remainingTries is 0, we should stop waiting for new tries, however we'll still