Rework the logic that tells if the cursor touches words

Bug: 13312942
Change-Id: I6be6a558bbc6c88508150f9c25cadbd0240ff88e
main
Jean Chalard 2014-03-05 18:42:00 +09:00
parent c9498827f6
commit 72b67f6541
2 changed files with 105 additions and 10 deletions

View File

@ -687,13 +687,23 @@ public final class RichInputConnection {
} }
public boolean isCursorTouchingWord(final SpacingAndPunctuations spacingAndPunctuations) { public boolean isCursorTouchingWord(final SpacingAndPunctuations spacingAndPunctuations) {
final int codePointBeforeCursor = getCodePointBeforeCursor(); if (isCursorFollowedByWordCharacter(spacingAndPunctuations)) {
if (Constants.NOT_A_CODE == codePointBeforeCursor // If what's after the cursor is a word character, then we're touching a word.
|| spacingAndPunctuations.isWordSeparator(codePointBeforeCursor) return true;
|| spacingAndPunctuations.isWordConnector(codePointBeforeCursor)) {
return isCursorFollowedByWordCharacter(spacingAndPunctuations);
} }
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( public boolean isCursorFollowedByWordCharacter(

View File

@ -89,6 +89,10 @@ public class RichInputConnectionAndTextRangeTests extends AndroidTestCase {
mExtractedText = extractedText; mExtractedText = extractedText;
} }
public int cursorPos() {
return mTextBefore.length();
}
/* (non-Javadoc) /* (non-Javadoc)
* @see android.view.inputmethod.InputConnectionWrapper#getTextBeforeCursor(int, int) * @see android.view.inputmethod.InputConnectionWrapper#getTextBeforeCursor(int, int)
*/ */
@ -131,13 +135,16 @@ public class RichInputConnectionAndTextRangeTests extends AndroidTestCase {
} }
private class MockInputMethodService extends InputMethodService { private class MockInputMethodService extends InputMethodService {
InputConnection mInputConnection; private MockConnection mMockConnection;
public void setInputConnection(final InputConnection inputConnection) { public void setInputConnection(final MockConnection mockConnection) {
mInputConnection = inputConnection; mMockConnection = mockConnection;
}
public int cursorPos() {
return mMockConnection.cursorPos();
} }
@Override @Override
public InputConnection getCurrentInputConnection() { public InputConnection getCurrentInputConnection() {
return mInputConnection; return mMockConnection;
} }
} }
@ -336,4 +343,82 @@ public class RichInputConnectionAndTextRangeTests extends AndroidTestCase {
suggestions = r.getSuggestionSpansAtWord(); suggestions = r.getSuggestionSpansAtWord();
assertEquals(suggestions.length, 0); 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));
}
} }