aboutsummaryrefslogtreecommitdiffstats
path: root/java/src
diff options
context:
space:
mode:
authorJean Chalard <jchalard@google.com>2014-01-08 16:47:21 +0900
committerJean Chalard <jchalard@google.com>2014-01-08 18:04:44 +0900
commite5cdcaff658f5366621115a728cb683eab5fda0a (patch)
tree1b7f67cdceb08af9ea3b19cf8ac07193c484f6f4 /java/src
parent1e7f2809d2ec544b07956bdbe89c905c981b75fc (diff)
downloadlatinime-e5cdcaff658f5366621115a728cb683eab5fda0a.tar.gz
latinime-e5cdcaff658f5366621115a728cb683eab5fda0a.tar.xz
latinime-e5cdcaff658f5366621115a728cb683eab5fda0a.zip
Fix a race condition, take 2.
Don't use absolute cursor positions when making edits, this leads to race conditions. This is a bit ugly and will need to be fixed soon. Plans are underway to clean this up. Bug: 12390573 Change-Id: I69c09fc41b979880d0800c55a710e39373287cff
Diffstat (limited to 'java/src')
-rw-r--r--java/src/com/android/inputmethod/latin/RichInputConnection.java4
-rw-r--r--java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java19
2 files changed, 18 insertions, 5 deletions
diff --git a/java/src/com/android/inputmethod/latin/RichInputConnection.java b/java/src/com/android/inputmethod/latin/RichInputConnection.java
index 4d174ddb8..7cf64a3bc 100644
--- a/java/src/com/android/inputmethod/latin/RichInputConnection.java
+++ b/java/src/com/android/inputmethod/latin/RichInputConnection.java
@@ -685,6 +685,10 @@ public final class RichInputConnection {
&& !settingsValues.isWordConnector(codePointBeforeCursor)) {
return true;
}
+ return isCursorFollowedByWordCharacter(settingsValues);
+ }
+
+ public boolean isCursorFollowedByWordCharacter(final SettingsValues settingsValues) {
final CharSequence after = getTextAfterCursor(1, 0);
if (!TextUtils.isEmpty(after) && !settingsValues.isWordSeparator(after.charAt(0))
&& !settingsValues.isWordConnector(after.charAt(0))) {
diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
index c867ab3d3..20ba48d0e 100644
--- a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
+++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
@@ -813,7 +813,8 @@ public final class InputLogic {
}
}
if (settingsValues.isSuggestionStripVisible()
- && settingsValues.mCurrentLanguageHasSpaces) {
+ && settingsValues.mCurrentLanguageHasSpaces
+ && !mConnection.isCursorFollowedByWordCharacter(settingsValues)) {
restartSuggestionsOnWordTouchedByCursor(settingsValues,
deleteCountAtStart - mDeleteCount /* offset */,
true /* includeResumedWordInSuggestions */, keyboardSwitcher);
@@ -1113,11 +1114,19 @@ public final class InputLogic {
keyboardSwitcher.getKeyboard());
mWordComposer.setCursorPositionWithinWord(
typedWord.codePointCount(0, numberOfCharsInWordBeforeCursor));
- // TODO: Change these two lines to setComposingRegion(cursorPosition,
+ // TODO: Change these lines to setComposingRegion(cursorPosition,
// cursorPosition + range.getNumberOfCharsInWordAfterCursor());
- mConnection.deleteSurroundingText(numberOfCharsInWordBeforeCursor,
- typedWord.length() - numberOfCharsInWordBeforeCursor);
- mConnection.setComposingText(typedWord, 1);
+ if (0 != offset) {
+ // Backspace was pressed. We are at the end of a word, and we don't know the cursor
+ // position for sure, so use relative methods.
+ mConnection.deleteSurroundingText(numberOfCharsInWordBeforeCursor, 0);
+ mConnection.setComposingText(typedWord, 1);
+ } else {
+ // This is recorrection. The cursor position is reasonably reliable, and the cursor
+ // may be in the middle of a word so use setComposingRegion.
+ mConnection.setComposingRegion(expectedCursorPosition - numberOfCharsInWordBeforeCursor,
+ expectedCursorPosition + range.getNumberOfCharsInWordAfterCursor());
+ }
if (suggestions.isEmpty()) {
// We come here if there weren't any suggestion spans on this word. We will try to
// compute suggestions for it instead.