aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean Chalard <jchalard@google.com>2014-03-20 14:35:19 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-03-20 14:35:19 +0000
commit1dda9107ca03fff08009eb865022ba707e174e15 (patch)
tree731c02be746c981f300d5118df1429dacc62c9a8
parent4df6bc0853fa5211416614130d1c027e6d0da210 (diff)
parent72b67f65411cf07cb8cb2d52e859f46d9d5b91d4 (diff)
downloadlatinime-1dda9107ca03fff08009eb865022ba707e174e15.tar.gz
latinime-1dda9107ca03fff08009eb865022ba707e174e15.tar.xz
latinime-1dda9107ca03fff08009eb865022ba707e174e15.zip
Merge "Rework the logic that tells if the cursor touches words"
-rw-r--r--java/src/com/android/inputmethod/latin/RichInputConnection.java24
-rw-r--r--tests/src/com/android/inputmethod/latin/RichInputConnectionAndTextRangeTests.java93
2 files changed, 106 insertions, 11 deletions
diff --git a/java/src/com/android/inputmethod/latin/RichInputConnection.java b/java/src/com/android/inputmethod/latin/RichInputConnection.java
index 965518e34..606bb775e 100644
--- a/java/src/com/android/inputmethod/latin/RichInputConnection.java
+++ b/java/src/com/android/inputmethod/latin/RichInputConnection.java
@@ -687,13 +687,23 @@ public final class RichInputConnection {
}
public boolean isCursorTouchingWord(final SpacingAndPunctuations spacingAndPunctuations) {
- final int codePointBeforeCursor = getCodePointBeforeCursor();
- if (Constants.NOT_A_CODE == codePointBeforeCursor
- || spacingAndPunctuations.isWordSeparator(codePointBeforeCursor)
- || spacingAndPunctuations.isWordConnector(codePointBeforeCursor)) {
- return isCursorFollowedByWordCharacter(spacingAndPunctuations);
- }
- return true;
+ if (isCursorFollowedByWordCharacter(spacingAndPunctuations)) {
+ // If what's after the cursor is a word character, then we're touching a word.
+ return true;
+ }
+ final String textBeforeCursor = mCommittedTextBeforeComposingText.toString();
+ int indexOfCodePointInJavaChars = textBeforeCursor.length();
+ int consideredCodePoint = 0 == indexOfCodePointInJavaChars ? Constants.NOT_A_CODE
+ : textBeforeCursor.codePointBefore(indexOfCodePointInJavaChars);
+ // Search for the first non word-connector char
+ if (spacingAndPunctuations.isWordConnector(consideredCodePoint)) {
+ indexOfCodePointInJavaChars -= Character.charCount(consideredCodePoint);
+ consideredCodePoint = 0 == indexOfCodePointInJavaChars ? Constants.NOT_A_CODE
+ : textBeforeCursor.codePointBefore(indexOfCodePointInJavaChars);
+ }
+ return !(Constants.NOT_A_CODE == consideredCodePoint
+ || spacingAndPunctuations.isWordSeparator(consideredCodePoint)
+ || spacingAndPunctuations.isWordConnector(consideredCodePoint));
}
public boolean isCursorFollowedByWordCharacter(
diff --git a/tests/src/com/android/inputmethod/latin/RichInputConnectionAndTextRangeTests.java b/tests/src/com/android/inputmethod/latin/RichInputConnectionAndTextRangeTests.java
index 7f0743543..842f3f3a9 100644
--- a/tests/src/com/android/inputmethod/latin/RichInputConnectionAndTextRangeTests.java
+++ b/tests/src/com/android/inputmethod/latin/RichInputConnectionAndTextRangeTests.java
@@ -89,6 +89,10 @@ public class RichInputConnectionAndTextRangeTests extends AndroidTestCase {
mExtractedText = extractedText;
}
+ public int cursorPos() {
+ return mTextBefore.length();
+ }
+
/* (non-Javadoc)
* @see android.view.inputmethod.InputConnectionWrapper#getTextBeforeCursor(int, int)
*/
@@ -131,13 +135,16 @@ public class RichInputConnectionAndTextRangeTests extends AndroidTestCase {
}
private class MockInputMethodService extends InputMethodService {
- InputConnection mInputConnection;
- public void setInputConnection(final InputConnection inputConnection) {
- mInputConnection = inputConnection;
+ private MockConnection mMockConnection;
+ public void setInputConnection(final MockConnection mockConnection) {
+ mMockConnection = mockConnection;
+ }
+ public int cursorPos() {
+ return mMockConnection.cursorPos();
}
@Override
public InputConnection getCurrentInputConnection() {
- return mInputConnection;
+ return mMockConnection;
}
}
@@ -336,4 +343,82 @@ public class RichInputConnectionAndTextRangeTests extends AndroidTestCase {
suggestions = r.getSuggestionSpansAtWord();
assertEquals(suggestions.length, 0);
}
+
+ public void testCursorTouchingWord() {
+ final MockInputMethodService ims = new MockInputMethodService();
+ final RichInputConnection ic = new RichInputConnection(ims);
+ final SpacingAndPunctuations sap = mSpacingAndPunctuations;
+
+ ims.setInputConnection(new MockConnection("users", 5));
+ ic.resetCachesUponCursorMoveAndReturnSuccess(ims.cursorPos(), ims.cursorPos(), true);
+ assertTrue(ic.isCursorTouchingWord(sap));
+
+ ims.setInputConnection(new MockConnection("users'", 5));
+ ic.resetCachesUponCursorMoveAndReturnSuccess(ims.cursorPos(), ims.cursorPos(), true);
+ assertTrue(ic.isCursorTouchingWord(sap));
+
+ ims.setInputConnection(new MockConnection("users'", 6));
+ ic.resetCachesUponCursorMoveAndReturnSuccess(ims.cursorPos(), ims.cursorPos(), true);
+ assertTrue(ic.isCursorTouchingWord(sap));
+
+ ims.setInputConnection(new MockConnection("'users'", 6));
+ ic.resetCachesUponCursorMoveAndReturnSuccess(ims.cursorPos(), ims.cursorPos(), true);
+ assertTrue(ic.isCursorTouchingWord(sap));
+
+ ims.setInputConnection(new MockConnection("'users'", 7));
+ ic.resetCachesUponCursorMoveAndReturnSuccess(ims.cursorPos(), ims.cursorPos(), true);
+ assertTrue(ic.isCursorTouchingWord(sap));
+
+ ims.setInputConnection(new MockConnection("users '", 6));
+ ic.resetCachesUponCursorMoveAndReturnSuccess(ims.cursorPos(), ims.cursorPos(), true);
+ assertFalse(ic.isCursorTouchingWord(sap));
+
+ ims.setInputConnection(new MockConnection("users '", 7));
+ ic.resetCachesUponCursorMoveAndReturnSuccess(ims.cursorPos(), ims.cursorPos(), true);
+ assertFalse(ic.isCursorTouchingWord(sap));
+
+ ims.setInputConnection(new MockConnection("re-", 3));
+ ic.resetCachesUponCursorMoveAndReturnSuccess(ims.cursorPos(), ims.cursorPos(), true);
+ assertTrue(ic.isCursorTouchingWord(sap));
+
+ ims.setInputConnection(new MockConnection("re--", 4));
+ ic.resetCachesUponCursorMoveAndReturnSuccess(ims.cursorPos(), ims.cursorPos(), true);
+ assertFalse(ic.isCursorTouchingWord(sap));
+
+ ims.setInputConnection(new MockConnection("-", 1));
+ ic.resetCachesUponCursorMoveAndReturnSuccess(ims.cursorPos(), ims.cursorPos(), true);
+ assertFalse(ic.isCursorTouchingWord(sap));
+
+ ims.setInputConnection(new MockConnection("--", 2));
+ ic.resetCachesUponCursorMoveAndReturnSuccess(ims.cursorPos(), ims.cursorPos(), true);
+ assertFalse(ic.isCursorTouchingWord(sap));
+
+ ims.setInputConnection(new MockConnection(" -", 2));
+ ic.resetCachesUponCursorMoveAndReturnSuccess(ims.cursorPos(), ims.cursorPos(), true);
+ assertFalse(ic.isCursorTouchingWord(sap));
+
+ ims.setInputConnection(new MockConnection(" --", 3));
+ ic.resetCachesUponCursorMoveAndReturnSuccess(ims.cursorPos(), ims.cursorPos(), true);
+ assertFalse(ic.isCursorTouchingWord(sap));
+
+ ims.setInputConnection(new MockConnection(" users '", 1));
+ ic.resetCachesUponCursorMoveAndReturnSuccess(ims.cursorPos(), ims.cursorPos(), true);
+ assertTrue(ic.isCursorTouchingWord(sap));
+
+ ims.setInputConnection(new MockConnection(" users '", 3));
+ ic.resetCachesUponCursorMoveAndReturnSuccess(ims.cursorPos(), ims.cursorPos(), true);
+ assertTrue(ic.isCursorTouchingWord(sap));
+
+ ims.setInputConnection(new MockConnection(" users '", 7));
+ ic.resetCachesUponCursorMoveAndReturnSuccess(ims.cursorPos(), ims.cursorPos(), true);
+ assertFalse(ic.isCursorTouchingWord(sap));
+
+ ims.setInputConnection(new MockConnection(" users are", 7));
+ ic.resetCachesUponCursorMoveAndReturnSuccess(ims.cursorPos(), ims.cursorPos(), true);
+ assertTrue(ic.isCursorTouchingWord(sap));
+
+ ims.setInputConnection(new MockConnection(" users 'are", 7));
+ ic.resetCachesUponCursorMoveAndReturnSuccess(ims.cursorPos(), ims.cursorPos(), true);
+ assertFalse(ic.isCursorTouchingWord(sap));
+ }
}