[HS3] Fix a bug on ICS

There is a bug in ICS where the input connection won't take
any writing commands after rotation until the cursor moves.
This fixes it by wiggling the cursor position once before trying
to do anything.

Bug: 16810766
Change-Id: Ib14c70bd0550420cecfa86dea501d13a1a91e296
main
Jean Chalard 2014-08-05 23:21:59 +09:00
parent 50c12c83b3
commit 9273f3832b
2 changed files with 23 additions and 0 deletions

View File

@ -17,6 +17,7 @@
package com.android.inputmethod.latin;
import android.inputmethodservice.InputMethodService;
import android.os.Build;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
@ -811,4 +812,25 @@ public final class RichInputConnection {
public boolean isCursorPositionKnown() {
return INVALID_CURSOR_POSITION != mExpectedSelStart;
}
/**
* Work around a bug that was present before Jelly Bean upon rotation.
*
* Before Jelly Bean, there is a bug where setComposingRegion and other committing
* functions on the input connection get ignored until the cursor moves. This method works
* around the bug by wiggling the cursor first, which reactivates the connection and has
* the subsequent methods work, then restoring it to its original position.
*
* On platforms on which this method is not present, this is a no-op.
*/
public void maybeMoveTheCursorAroundAndRestoreToWorkaroundABug() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
if (mExpectedSelStart > 0) {
mIC.setSelection(mExpectedSelStart - 1, mExpectedSelStart - 1);
} else {
mIC.setSelection(mExpectedSelStart + 1, mExpectedSelStart + 1);
}
mIC.setSelection(mExpectedSelStart, mExpectedSelEnd);
}
}
}

View File

@ -1437,6 +1437,7 @@ public final class InputLogic {
mLatinIME.getCoordinatesForCurrentKeyboard(codePoints));
mWordComposer.setCursorPositionWithinWord(
typedWord.codePointCount(0, numberOfCharsInWordBeforeCursor));
mConnection.maybeMoveTheCursorAroundAndRestoreToWorkaroundABug();
mConnection.setComposingRegion(expectedCursorPosition - numberOfCharsInWordBeforeCursor,
expectedCursorPosition + range.getNumberOfCharsInWordAfterCursor());
if (suggestions.size() <= (shouldIncludeResumedWordInSuggestions ? 1 : 0)) {