Loading java/src/com/android/inputmethod/latin/LatinIME.java +5 −5 Original line number Diff line number Diff line Loading @@ -161,7 +161,7 @@ public final class LatinIME extends InputMethodService implements KeyboardAction mPositionalInfoForUserDictPendingAddition = null; private final WordComposer mWordComposer = new WordComposer(); private final RichInputConnection mConnection = new RichInputConnection(this); private RecapitalizeStatus mRecapitalizeStatus = null; private final RecapitalizeStatus mRecapitalizeStatus = new RecapitalizeStatus(); // Keep track of the last selection range to decide if we need to show word alternatives private static final int NOT_A_CURSOR_POSITION = -1; Loading Loading @@ -742,6 +742,7 @@ public final class LatinIME extends InputMethodService implements KeyboardAction resetComposingState(true /* alsoResetLastComposedWord */); mDeleteCount = 0; mSpaceState = SPACE_STATE_NONE; mRecapitalizeStatus.deactivate(); mCurrentlyPressedHardwareKeys.clear(); if (mSuggestionStripView != null) { Loading Loading @@ -925,7 +926,7 @@ public final class LatinIME extends InputMethodService implements KeyboardAction // We moved the cursor. If we are touching a word, we need to resume suggestion. mHandler.postResumeSuggestions(); // Reset the last recapitalization. mRecapitalizeStatus = null; mRecapitalizeStatus.deactivate(); mKeyboardSwitcher.updateShiftState(); } mExpectingUpdateSelection = false; Loading Loading @@ -1953,10 +1954,9 @@ public final class LatinIME extends InputMethodService implements KeyboardAction private void handleRecapitalize() { if (mLastSelectionStart == mLastSelectionEnd) return; // No selection // If we have a recapitalize in progress, use it; otherwise, create a new one. if (null == mRecapitalizeStatus if (!mRecapitalizeStatus.isActive() || !mRecapitalizeStatus.isSetAt(mLastSelectionStart, mLastSelectionEnd)) { mRecapitalizeStatus = new RecapitalizeStatus(mLastSelectionStart, mLastSelectionEnd, mRecapitalizeStatus.initialize(mLastSelectionStart, mLastSelectionEnd, mConnection.getSelectedText(0 /* flags, 0 for no styles */).toString(), mSettings.getCurrentLocale(), mSettings.getWordSeparators()); // We trim leading and trailing whitespace. Loading java/src/com/android/inputmethod/latin/RecapitalizeStatus.java +39 −24 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ public class RecapitalizeStatus { CAPS_MODE_FIRST_WORD_UPPER, CAPS_MODE_ALL_UPPER }; private static final int getStringMode(final String string, final String separators) { if (StringUtils.isIdenticalAfterUpcase(string)) { return CAPS_MODE_ALL_UPPER; Loading @@ -50,24 +51,29 @@ public class RecapitalizeStatus { } /** * We store the location of the cursor and the string that was there before the undoable * We store the location of the cursor and the string that was there before the recapitalize * action was done, and the location of the cursor and the string that was there after. */ private int mCursorStartBefore; private int mCursorEndBefore; private String mStringBefore; private int mCursorStartAfter; private int mCursorEndAfter; private int mRotationStyleCurrentIndex; private final boolean mSkipOriginalMixedCaseMode; private final Locale mLocale; private final String mSeparators; private boolean mSkipOriginalMixedCaseMode; private Locale mLocale; private String mSeparators; private String mStringAfter; private boolean mIsActive; public RecapitalizeStatus() { // By default, initialize with dummy values that won't match any real recapitalize. initialize(-1, -1, "", Locale.getDefault(), ""); deactivate(); } public RecapitalizeStatus(final int cursorStart, final int cursorEnd, final String string, public void initialize(final int cursorStart, final int cursorEnd, final String string, final Locale locale, final String separators) { mCursorStartBefore = cursorStart; mCursorEndBefore = cursorEnd; mStringBefore = string; mCursorStartAfter = cursorStart; mCursorEndAfter = cursorEnd; Loading @@ -89,6 +95,15 @@ public class RecapitalizeStatus { mRotationStyleCurrentIndex = currentMode; mSkipOriginalMixedCaseMode = true; } mIsActive = true; } public void deactivate() { mIsActive = false; } public boolean isActive() { return mIsActive; } public boolean isSetAt(final int cursorStart, final int cursorEnd) { Loading Loading @@ -126,7 +141,7 @@ public class RecapitalizeStatus { default: mStringAfter = mStringBefore; } } while (mStringAfter.equals(oldResult) && count < 5); } while (mStringAfter.equals(oldResult) && count < ROTATION_STYLE.length + 1); mCursorEndAfter = mCursorStartAfter + mStringAfter.length(); } Loading @@ -148,7 +163,7 @@ public class RecapitalizeStatus { if (!Character.isWhitespace(codePoint)) break; } if (0 != nonWhitespaceStart || len != nonWhitespaceEnd) { mCursorEndBefore = mCursorEndAfter = mCursorStartBefore + nonWhitespaceEnd; mCursorEndAfter = mCursorStartBefore + nonWhitespaceEnd; mCursorStartBefore = mCursorStartAfter = mCursorStartBefore + nonWhitespaceStart; mStringAfter = mStringBefore = mStringBefore.substring(nonWhitespaceStart, nonWhitespaceEnd); Loading tests/src/com/android/inputmethod/latin/RecapitalizeStatusTests.java +15 −27 Original line number Diff line number Diff line Loading @@ -24,29 +24,26 @@ import java.util.Locale; @SmallTest public class RecapitalizeStatusTests extends AndroidTestCase { public void testTrim() { RecapitalizeStatus status = new RecapitalizeStatus(30, 40, "abcdefghij", Locale.ENGLISH, " "); final RecapitalizeStatus status = new RecapitalizeStatus(); status.initialize(30, 40, "abcdefghij", Locale.ENGLISH, " "); status.trim(); assertEquals("abcdefghij", status.getRecapitalizedString()); assertEquals(30, status.getNewCursorStart()); assertEquals(40, status.getNewCursorEnd()); status = new RecapitalizeStatus(30, 44, " abcdefghij", Locale.ENGLISH, " "); status.initialize(30, 44, " abcdefghij", Locale.ENGLISH, " "); status.trim(); assertEquals("abcdefghij", status.getRecapitalizedString()); assertEquals(34, status.getNewCursorStart()); assertEquals(44, status.getNewCursorEnd()); status = new RecapitalizeStatus(30, 40, "abcdefgh ", Locale.ENGLISH, " "); status.initialize(30, 40, "abcdefgh ", Locale.ENGLISH, " "); status.trim(); assertEquals("abcdefgh", status.getRecapitalizedString()); assertEquals(30, status.getNewCursorStart()); assertEquals(38, status.getNewCursorEnd()); status = new RecapitalizeStatus(30, 45, " abcdefghij ", Locale.ENGLISH, " "); status.initialize(30, 45, " abcdefghij ", Locale.ENGLISH, " "); status.trim(); assertEquals("abcdefghij", status.getRecapitalizedString()); assertEquals(33, status.getNewCursorStart()); Loading @@ -54,8 +51,8 @@ public class RecapitalizeStatusTests extends AndroidTestCase { } public void testRotate() { RecapitalizeStatus status = new RecapitalizeStatus(29, 40, "abcd efghij", Locale.ENGLISH, " "); final RecapitalizeStatus status = new RecapitalizeStatus(); status.initialize(29, 40, "abcd efghij", Locale.ENGLISH, " "); status.rotate(); assertEquals("Abcd Efghij", status.getRecapitalizedString()); assertEquals(29, status.getNewCursorStart()); Loading @@ -67,8 +64,7 @@ public class RecapitalizeStatusTests extends AndroidTestCase { status.rotate(); assertEquals("Abcd Efghij", status.getRecapitalizedString()); status = new RecapitalizeStatus(29, 40, "Abcd Efghij", Locale.ENGLISH, " "); status.initialize(29, 40, "Abcd Efghij", Locale.ENGLISH, " "); status.rotate(); assertEquals("ABCD EFGHIJ", status.getRecapitalizedString()); assertEquals(29, status.getNewCursorStart()); Loading @@ -80,8 +76,7 @@ public class RecapitalizeStatusTests extends AndroidTestCase { status.rotate(); assertEquals("ABCD EFGHIJ", status.getRecapitalizedString()); status = new RecapitalizeStatus(29, 40, "ABCD EFGHIJ", Locale.ENGLISH, " "); status.initialize(29, 40, "ABCD EFGHIJ", Locale.ENGLISH, " "); status.rotate(); assertEquals("abcd efghij", status.getRecapitalizedString()); assertEquals(29, status.getNewCursorStart()); Loading @@ -93,8 +88,7 @@ public class RecapitalizeStatusTests extends AndroidTestCase { status.rotate(); assertEquals("abcd efghij", status.getRecapitalizedString()); status = new RecapitalizeStatus(29, 39, "AbCDefghij", Locale.ENGLISH, " "); status.initialize(29, 39, "AbCDefghij", Locale.ENGLISH, " "); status.rotate(); assertEquals("abcdefghij", status.getRecapitalizedString()); assertEquals(29, status.getNewCursorStart()); Loading @@ -108,8 +102,7 @@ public class RecapitalizeStatusTests extends AndroidTestCase { status.rotate(); assertEquals("abcdefghij", status.getRecapitalizedString()); status = new RecapitalizeStatus(29, 40, "Abcd efghij", Locale.ENGLISH, " "); status.initialize(29, 40, "Abcd efghij", Locale.ENGLISH, " "); status.rotate(); assertEquals("abcd efghij", status.getRecapitalizedString()); assertEquals(29, status.getNewCursorStart()); Loading @@ -123,8 +116,7 @@ public class RecapitalizeStatusTests extends AndroidTestCase { status.rotate(); assertEquals("abcd efghij", status.getRecapitalizedString()); status = new RecapitalizeStatus(30, 34, "grüß", Locale.GERMAN, " "); status.rotate(); status.initialize(30, 34, "grüß", Locale.GERMAN, " "); status.rotate(); assertEquals("Grüß", status.getRecapitalizedString()); assertEquals(30, status.getNewCursorStart()); assertEquals(34, status.getNewCursorEnd()); Loading @@ -141,9 +133,7 @@ public class RecapitalizeStatusTests extends AndroidTestCase { assertEquals(30, status.getNewCursorStart()); assertEquals(34, status.getNewCursorEnd()); status = new RecapitalizeStatus(30, 33, "œuf", Locale.FRENCH, " "); status.rotate(); status.initialize(30, 33, "œuf", Locale.FRENCH, " "); status.rotate(); assertEquals("Œuf", status.getRecapitalizedString()); assertEquals(30, status.getNewCursorStart()); assertEquals(33, status.getNewCursorEnd()); Loading @@ -160,8 +150,7 @@ public class RecapitalizeStatusTests extends AndroidTestCase { assertEquals(30, status.getNewCursorStart()); assertEquals(33, status.getNewCursorEnd()); status = new RecapitalizeStatus(30, 33, "œUf", Locale.FRENCH, " "); status.rotate(); status.initialize(30, 33, "œUf", Locale.FRENCH, " "); status.rotate(); assertEquals("œuf", status.getRecapitalizedString()); assertEquals(30, status.getNewCursorStart()); assertEquals(33, status.getNewCursorEnd()); Loading @@ -182,8 +171,7 @@ public class RecapitalizeStatusTests extends AndroidTestCase { assertEquals(30, status.getNewCursorStart()); assertEquals(33, status.getNewCursorEnd()); status = new RecapitalizeStatus(30, 35, "école", Locale.FRENCH, " "); status.rotate(); status.initialize(30, 35, "école", Locale.FRENCH, " "); status.rotate(); assertEquals("École", status.getRecapitalizedString()); assertEquals(30, status.getNewCursorStart()); assertEquals(35, status.getNewCursorEnd()); Loading Loading
java/src/com/android/inputmethod/latin/LatinIME.java +5 −5 Original line number Diff line number Diff line Loading @@ -161,7 +161,7 @@ public final class LatinIME extends InputMethodService implements KeyboardAction mPositionalInfoForUserDictPendingAddition = null; private final WordComposer mWordComposer = new WordComposer(); private final RichInputConnection mConnection = new RichInputConnection(this); private RecapitalizeStatus mRecapitalizeStatus = null; private final RecapitalizeStatus mRecapitalizeStatus = new RecapitalizeStatus(); // Keep track of the last selection range to decide if we need to show word alternatives private static final int NOT_A_CURSOR_POSITION = -1; Loading Loading @@ -742,6 +742,7 @@ public final class LatinIME extends InputMethodService implements KeyboardAction resetComposingState(true /* alsoResetLastComposedWord */); mDeleteCount = 0; mSpaceState = SPACE_STATE_NONE; mRecapitalizeStatus.deactivate(); mCurrentlyPressedHardwareKeys.clear(); if (mSuggestionStripView != null) { Loading Loading @@ -925,7 +926,7 @@ public final class LatinIME extends InputMethodService implements KeyboardAction // We moved the cursor. If we are touching a word, we need to resume suggestion. mHandler.postResumeSuggestions(); // Reset the last recapitalization. mRecapitalizeStatus = null; mRecapitalizeStatus.deactivate(); mKeyboardSwitcher.updateShiftState(); } mExpectingUpdateSelection = false; Loading Loading @@ -1953,10 +1954,9 @@ public final class LatinIME extends InputMethodService implements KeyboardAction private void handleRecapitalize() { if (mLastSelectionStart == mLastSelectionEnd) return; // No selection // If we have a recapitalize in progress, use it; otherwise, create a new one. if (null == mRecapitalizeStatus if (!mRecapitalizeStatus.isActive() || !mRecapitalizeStatus.isSetAt(mLastSelectionStart, mLastSelectionEnd)) { mRecapitalizeStatus = new RecapitalizeStatus(mLastSelectionStart, mLastSelectionEnd, mRecapitalizeStatus.initialize(mLastSelectionStart, mLastSelectionEnd, mConnection.getSelectedText(0 /* flags, 0 for no styles */).toString(), mSettings.getCurrentLocale(), mSettings.getWordSeparators()); // We trim leading and trailing whitespace. Loading
java/src/com/android/inputmethod/latin/RecapitalizeStatus.java +39 −24 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ public class RecapitalizeStatus { CAPS_MODE_FIRST_WORD_UPPER, CAPS_MODE_ALL_UPPER }; private static final int getStringMode(final String string, final String separators) { if (StringUtils.isIdenticalAfterUpcase(string)) { return CAPS_MODE_ALL_UPPER; Loading @@ -50,24 +51,29 @@ public class RecapitalizeStatus { } /** * We store the location of the cursor and the string that was there before the undoable * We store the location of the cursor and the string that was there before the recapitalize * action was done, and the location of the cursor and the string that was there after. */ private int mCursorStartBefore; private int mCursorEndBefore; private String mStringBefore; private int mCursorStartAfter; private int mCursorEndAfter; private int mRotationStyleCurrentIndex; private final boolean mSkipOriginalMixedCaseMode; private final Locale mLocale; private final String mSeparators; private boolean mSkipOriginalMixedCaseMode; private Locale mLocale; private String mSeparators; private String mStringAfter; private boolean mIsActive; public RecapitalizeStatus() { // By default, initialize with dummy values that won't match any real recapitalize. initialize(-1, -1, "", Locale.getDefault(), ""); deactivate(); } public RecapitalizeStatus(final int cursorStart, final int cursorEnd, final String string, public void initialize(final int cursorStart, final int cursorEnd, final String string, final Locale locale, final String separators) { mCursorStartBefore = cursorStart; mCursorEndBefore = cursorEnd; mStringBefore = string; mCursorStartAfter = cursorStart; mCursorEndAfter = cursorEnd; Loading @@ -89,6 +95,15 @@ public class RecapitalizeStatus { mRotationStyleCurrentIndex = currentMode; mSkipOriginalMixedCaseMode = true; } mIsActive = true; } public void deactivate() { mIsActive = false; } public boolean isActive() { return mIsActive; } public boolean isSetAt(final int cursorStart, final int cursorEnd) { Loading Loading @@ -126,7 +141,7 @@ public class RecapitalizeStatus { default: mStringAfter = mStringBefore; } } while (mStringAfter.equals(oldResult) && count < 5); } while (mStringAfter.equals(oldResult) && count < ROTATION_STYLE.length + 1); mCursorEndAfter = mCursorStartAfter + mStringAfter.length(); } Loading @@ -148,7 +163,7 @@ public class RecapitalizeStatus { if (!Character.isWhitespace(codePoint)) break; } if (0 != nonWhitespaceStart || len != nonWhitespaceEnd) { mCursorEndBefore = mCursorEndAfter = mCursorStartBefore + nonWhitespaceEnd; mCursorEndAfter = mCursorStartBefore + nonWhitespaceEnd; mCursorStartBefore = mCursorStartAfter = mCursorStartBefore + nonWhitespaceStart; mStringAfter = mStringBefore = mStringBefore.substring(nonWhitespaceStart, nonWhitespaceEnd); Loading
tests/src/com/android/inputmethod/latin/RecapitalizeStatusTests.java +15 −27 Original line number Diff line number Diff line Loading @@ -24,29 +24,26 @@ import java.util.Locale; @SmallTest public class RecapitalizeStatusTests extends AndroidTestCase { public void testTrim() { RecapitalizeStatus status = new RecapitalizeStatus(30, 40, "abcdefghij", Locale.ENGLISH, " "); final RecapitalizeStatus status = new RecapitalizeStatus(); status.initialize(30, 40, "abcdefghij", Locale.ENGLISH, " "); status.trim(); assertEquals("abcdefghij", status.getRecapitalizedString()); assertEquals(30, status.getNewCursorStart()); assertEquals(40, status.getNewCursorEnd()); status = new RecapitalizeStatus(30, 44, " abcdefghij", Locale.ENGLISH, " "); status.initialize(30, 44, " abcdefghij", Locale.ENGLISH, " "); status.trim(); assertEquals("abcdefghij", status.getRecapitalizedString()); assertEquals(34, status.getNewCursorStart()); assertEquals(44, status.getNewCursorEnd()); status = new RecapitalizeStatus(30, 40, "abcdefgh ", Locale.ENGLISH, " "); status.initialize(30, 40, "abcdefgh ", Locale.ENGLISH, " "); status.trim(); assertEquals("abcdefgh", status.getRecapitalizedString()); assertEquals(30, status.getNewCursorStart()); assertEquals(38, status.getNewCursorEnd()); status = new RecapitalizeStatus(30, 45, " abcdefghij ", Locale.ENGLISH, " "); status.initialize(30, 45, " abcdefghij ", Locale.ENGLISH, " "); status.trim(); assertEquals("abcdefghij", status.getRecapitalizedString()); assertEquals(33, status.getNewCursorStart()); Loading @@ -54,8 +51,8 @@ public class RecapitalizeStatusTests extends AndroidTestCase { } public void testRotate() { RecapitalizeStatus status = new RecapitalizeStatus(29, 40, "abcd efghij", Locale.ENGLISH, " "); final RecapitalizeStatus status = new RecapitalizeStatus(); status.initialize(29, 40, "abcd efghij", Locale.ENGLISH, " "); status.rotate(); assertEquals("Abcd Efghij", status.getRecapitalizedString()); assertEquals(29, status.getNewCursorStart()); Loading @@ -67,8 +64,7 @@ public class RecapitalizeStatusTests extends AndroidTestCase { status.rotate(); assertEquals("Abcd Efghij", status.getRecapitalizedString()); status = new RecapitalizeStatus(29, 40, "Abcd Efghij", Locale.ENGLISH, " "); status.initialize(29, 40, "Abcd Efghij", Locale.ENGLISH, " "); status.rotate(); assertEquals("ABCD EFGHIJ", status.getRecapitalizedString()); assertEquals(29, status.getNewCursorStart()); Loading @@ -80,8 +76,7 @@ public class RecapitalizeStatusTests extends AndroidTestCase { status.rotate(); assertEquals("ABCD EFGHIJ", status.getRecapitalizedString()); status = new RecapitalizeStatus(29, 40, "ABCD EFGHIJ", Locale.ENGLISH, " "); status.initialize(29, 40, "ABCD EFGHIJ", Locale.ENGLISH, " "); status.rotate(); assertEquals("abcd efghij", status.getRecapitalizedString()); assertEquals(29, status.getNewCursorStart()); Loading @@ -93,8 +88,7 @@ public class RecapitalizeStatusTests extends AndroidTestCase { status.rotate(); assertEquals("abcd efghij", status.getRecapitalizedString()); status = new RecapitalizeStatus(29, 39, "AbCDefghij", Locale.ENGLISH, " "); status.initialize(29, 39, "AbCDefghij", Locale.ENGLISH, " "); status.rotate(); assertEquals("abcdefghij", status.getRecapitalizedString()); assertEquals(29, status.getNewCursorStart()); Loading @@ -108,8 +102,7 @@ public class RecapitalizeStatusTests extends AndroidTestCase { status.rotate(); assertEquals("abcdefghij", status.getRecapitalizedString()); status = new RecapitalizeStatus(29, 40, "Abcd efghij", Locale.ENGLISH, " "); status.initialize(29, 40, "Abcd efghij", Locale.ENGLISH, " "); status.rotate(); assertEquals("abcd efghij", status.getRecapitalizedString()); assertEquals(29, status.getNewCursorStart()); Loading @@ -123,8 +116,7 @@ public class RecapitalizeStatusTests extends AndroidTestCase { status.rotate(); assertEquals("abcd efghij", status.getRecapitalizedString()); status = new RecapitalizeStatus(30, 34, "grüß", Locale.GERMAN, " "); status.rotate(); status.initialize(30, 34, "grüß", Locale.GERMAN, " "); status.rotate(); assertEquals("Grüß", status.getRecapitalizedString()); assertEquals(30, status.getNewCursorStart()); assertEquals(34, status.getNewCursorEnd()); Loading @@ -141,9 +133,7 @@ public class RecapitalizeStatusTests extends AndroidTestCase { assertEquals(30, status.getNewCursorStart()); assertEquals(34, status.getNewCursorEnd()); status = new RecapitalizeStatus(30, 33, "œuf", Locale.FRENCH, " "); status.rotate(); status.initialize(30, 33, "œuf", Locale.FRENCH, " "); status.rotate(); assertEquals("Œuf", status.getRecapitalizedString()); assertEquals(30, status.getNewCursorStart()); assertEquals(33, status.getNewCursorEnd()); Loading @@ -160,8 +150,7 @@ public class RecapitalizeStatusTests extends AndroidTestCase { assertEquals(30, status.getNewCursorStart()); assertEquals(33, status.getNewCursorEnd()); status = new RecapitalizeStatus(30, 33, "œUf", Locale.FRENCH, " "); status.rotate(); status.initialize(30, 33, "œUf", Locale.FRENCH, " "); status.rotate(); assertEquals("œuf", status.getRecapitalizedString()); assertEquals(30, status.getNewCursorStart()); assertEquals(33, status.getNewCursorEnd()); Loading @@ -182,8 +171,7 @@ public class RecapitalizeStatusTests extends AndroidTestCase { assertEquals(30, status.getNewCursorStart()); assertEquals(33, status.getNewCursorEnd()); status = new RecapitalizeStatus(30, 35, "école", Locale.FRENCH, " "); status.rotate(); status.initialize(30, 35, "école", Locale.FRENCH, " "); status.rotate(); assertEquals("École", status.getRecapitalizedString()); assertEquals(30, status.getNewCursorStart()); assertEquals(35, status.getNewCursorEnd()); Loading