Merge "[HS2] Move more stuff to onStartInput" into lmp-dev

main
Jean Chalard 2014-08-06 02:16:57 +00:00 committed by Android (Google) Code Review
commit 50c12c83b3
2 changed files with 62 additions and 51 deletions

View File

@ -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); removeMessages(MSG_RESET_CACHES);
sendMessage(obtainMessage(MSG_RESET_CACHES, tryResumeSuggestions ? 1 : 0, sendMessage(obtainMessage(MSG_RESET_CACHES, tryResumeSuggestions ? 1 : 0,
remainingTries, null)); remainingTries, null));
@ -762,9 +763,12 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
private static class EditorChangeInfo { private static class EditorChangeInfo {
public final boolean mIsSameInputType; public final boolean mIsSameInputType;
public final boolean mHasSameOrientation; 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; mIsSameInputType = isSameInputType;
mHasSameOrientation = hasSameOrientation; mHasSameOrientation = hasSameOrientation;
mCanReachInputConnection = canReachInputConnection;
} }
} }
@ -773,15 +777,65 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
private void onStartInputInternal(final EditorInfo editorInfo, final boolean restarting) { private void onStartInputInternal(final EditorInfo editorInfo, final boolean restarting) {
super.onStartInput(editorInfo, restarting); super.onStartInput(editorInfo, restarting);
SettingsValues currentSettingsValues = mSettings.getCurrent(); SettingsValues currentSettingsValues = mSettings.getCurrent();
mLastEditorChangeInfo = new EditorChangeInfo( final boolean isSameInputType = currentSettingsValues.isSameInputType(editorInfo);
currentSettingsValues.isSameInputType(editorInfo), final boolean hasSameOrientation =
currentSettingsValues.hasSameOrientation(getResources().getConfiguration())); 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") @SuppressWarnings("deprecation")
private void onStartInputViewInternal(final EditorInfo editorInfo, final boolean restarting) { private void onStartInputViewInternal(final EditorInfo editorInfo, final boolean restarting) {
super.onStartInputView(editorInfo, restarting); super.onStartInputView(editorInfo, restarting);
mRichImm.clearSubtypeCaches();
final KeyboardSwitcher switcher = mKeyboardSwitcher; final KeyboardSwitcher switcher = mKeyboardSwitcher;
switcher.updateKeyboardTheme(); switcher.updateKeyboardTheme();
final MainKeyboardView mainKeyboardView = switcher.getMainKeyboardView(); final MainKeyboardView mainKeyboardView = switcher.getMainKeyboardView();
@ -837,56 +891,13 @@ 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();
// 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(); final SettingsValues currentSettingsValues = mSettings.getCurrent();
if (isDifferentTextField) { if (isDifferentTextField) {
mainKeyboardView.closing(); mainKeyboardView.closing();
if (currentSettingsValues.mAutoCorrectionEnabledPerUserSettings) {
suggest.setAutoCorrectionThreshold(
currentSettingsValues.mAutoCorrectionThreshold);
}
switcher.loadKeyboard(editorInfo, currentSettingsValues, getCurrentAutoCapsState(), switcher.loadKeyboard(editorInfo, currentSettingsValues, getCurrentAutoCapsState(),
getCurrentRecapitalizeState()); getCurrentRecapitalizeState());
if (!canReachInputConnection) { if (!mLastEditorChangeInfo.mCanReachInputConnection) {
// If we can't reach the input connection, we will call loadKeyboard again later, // 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. // so we need to save its state now. The call will be done in #retryResetCaches.
switcher.saveKeyboardState(); switcher.saveKeyboardState();

View File

@ -2034,7 +2034,7 @@ public final class InputLogic {
mConnection.getExpectedSelectionStart(), mConnection.getExpectedSelectionEnd(), mConnection.getExpectedSelectionStart(), mConnection.getExpectedSelectionEnd(),
shouldFinishComposition)) { shouldFinishComposition)) {
if (0 < remainingTries) { if (0 < remainingTries) {
handler.postResetCaches(tryResumeSuggestions, remainingTries - 1); handler.postResetInputConnectionCaches(tryResumeSuggestions, remainingTries - 1);
return false; return false;
} }
// If remainingTries is 0, we should stop waiting for new tries, however we'll still // If remainingTries is 0, we should stop waiting for new tries, however we'll still