diff options
Diffstat (limited to 'java/src/com/android/inputmethod/latin/inputlogic')
-rw-r--r-- | java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java | 81 |
1 files changed, 54 insertions, 27 deletions
diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java index fa7c4b4fc..36b30eabe 100644 --- a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java +++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java @@ -28,7 +28,6 @@ import android.view.inputmethod.EditorInfo; import com.android.inputmethod.compat.SuggestionSpanUtils; import com.android.inputmethod.event.Event; -import com.android.inputmethod.event.EventInterpreter; import com.android.inputmethod.event.InputTransaction; import com.android.inputmethod.keyboard.KeyboardSwitcher; import com.android.inputmethod.latin.Constants; @@ -96,6 +95,7 @@ public final class InputLogic { // TODO: This boolean is persistent state and causes large side effects at unexpected times. // Find a way to remove it for readability. private boolean mIsAutoCorrectionIndicatorOn; + private long mDoubleSpacePeriodCountdownStart; public InputLogic(final LatinIME latinIME, final SuggestionStripViewAccessor suggestionStripViewAccessor) { @@ -138,6 +138,7 @@ public final class InputLogic { // In some cases (namely, after rotation of the device) editorInfo.initialSelStart is lying // so we try using some heuristics to find out about these and fix them. mConnection.tryFixLyingCursorPosition(); + cancelDoubleSpacePeriodCountdown(); mInputLogicHandler = new InputLogicHandler(mLatinIME, this); } @@ -160,11 +161,12 @@ public final class InputLogic { * some additional keys for example. * * @param settingsValues the current values of the settings. - * @param rawText the text to input. + * @param event the input event containing the data. */ - public void onTextInput(final SettingsValues settingsValues, final String rawText, + public void onTextInput(final SettingsValues settingsValues, final Event event, // TODO: remove this argument final LatinIME.UIHandler handler) { + final String rawText = event.mText.toString(); mConnection.beginBatchEdit(); if (mWordComposer.isComposingWord()) { commitCurrentAutoCorrection(settingsValues, rawText, handler); @@ -196,13 +198,16 @@ public final class InputLogic { * @param settingsValues the current values of the settings. * @param index the index of the suggestion. * @param suggestionInfo the suggestion info. + * @param keyboardShiftState the shift state of the keyboard, as returned by + * {@link com.android.inputmethod.keyboard.KeyboardSwitcher#getKeyboardShiftMode()} + * @return the complete transaction object */ // Called from {@link SuggestionStripView} through the {@link SuggestionStripView#Listener} // interface - public void onPickSuggestionManually(final SettingsValues settingsValues, - final int index, final SuggestedWordInfo suggestionInfo, - // TODO: remove these two arguments - final LatinIME.UIHandler handler, final KeyboardSwitcher keyboardSwitcher) { + public InputTransaction onPickSuggestionManually(final SettingsValues settingsValues, + final int index, final SuggestedWordInfo suggestionInfo, final int keyboardShiftState, + // TODO: remove this argument + final LatinIME.UIHandler handler) { final SuggestedWords suggestedWords = mSuggestedWords; final String suggestion = suggestionInfo.mWord; // If this is a punctuation picked from the suggestion strip, pass it to onCodeInput @@ -212,16 +217,26 @@ public final class InputLogic { LatinImeLogger.logOnManualSuggestion("", suggestion, index, suggestedWords); // Rely on onCodeInput to do the complicated swapping/stripping logic consistently. final int primaryCode = suggestion.charAt(0); - final Event event = Event.createSoftwareKeypressEvent(primaryCode, Event.NOT_A_KEY_CODE, - Constants.SUGGESTION_STRIP_COORDINATE, Constants.SUGGESTION_STRIP_COORDINATE); - onCodeInput(settingsValues, event, keyboardSwitcher.getKeyboardShiftMode(), handler); + // TODO: we should be using createSuggestionPickedEvent here, but for legacy reasons, + // onCodeInput is expected a software keypress event for a suggested punctuation + // because the current code is descended from a time where this information used not + // to be available. Fix this. + final Event event = Event.createSoftwareKeypressEvent(primaryCode, + Event.NOT_A_KEY_CODE /* keyCode*/, + Constants.SUGGESTION_STRIP_COORDINATE /* x */, + Constants.SUGGESTION_STRIP_COORDINATE /* y */); + final InputTransaction completeTransaction = onCodeInput(settingsValues, event, + keyboardShiftState, handler); if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { ResearchLogger.latinIME_punctuationSuggestion(index, suggestion, false /* isBatchMode */, suggestedWords.mIsPrediction); } - return; + return completeTransaction; } + final Event event = Event.createSuggestionPickedEvent(suggestionInfo); + final InputTransaction inputTransaction = new InputTransaction(settingsValues, + event, SystemClock.uptimeMillis(), mSpaceState, keyboardShiftState); mConnection.beginBatchEdit(); if (SpaceState.PHANTOM == mSpaceState && suggestion.length() > 0 // In the batch input mode, a manually picked suggested word should just replace @@ -241,11 +256,11 @@ public final class InputLogic { if (SuggestedWordInfo.KIND_APP_DEFINED == suggestionInfo.mKind) { mSuggestedWords = SuggestedWords.EMPTY; mSuggestionStripViewAccessor.setNeutralSuggestionStrip(); - keyboardSwitcher.updateShiftState(); + inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW); resetComposingState(true /* alsoResetLastComposedWord */); mConnection.commitCompletion(suggestionInfo.mApplicationSpecifiedCompletionInfo); mConnection.endBatchEdit(); - return; + return inputTransaction; } // We need to log before we commit, because the word composer will store away the user @@ -264,7 +279,7 @@ public final class InputLogic { mLastComposedWord.deactivate(); // Space state must be updated before calling updateShiftState mSpaceState = SpaceState.PHANTOM; - keyboardSwitcher.updateShiftState(); + inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW); // We should show the "Touch again to save" hint if the user pressed the first entry // AND it's in none of our current dictionaries (main, user or otherwise). @@ -290,6 +305,7 @@ public final class InputLogic { // If we're not showing the "Touch again to save", then update the suggestion strip. handler.postUpdateSuggestionStrip(); } + return inputTransaction; } /** @@ -392,7 +408,7 @@ public final class InputLogic { // TODO: Consolidate the double-space period timer, mLastKeyTime, and the space state. if (event.mCodePoint != Constants.CODE_SPACE) { - handler.cancelDoubleSpacePeriodTimer(); + cancelDoubleSpacePeriodCountdown(); } boolean didAutoCorrect = false; @@ -833,7 +849,7 @@ public final class InputLogic { if (Constants.CODE_SPACE == codePoint) { if (inputTransaction.mSettingsValues.isSuggestionsRequested()) { - if (maybeDoubleSpacePeriod(inputTransaction.mSettingsValues, handler)) { + if (maybeDoubleSpacePeriod(inputTransaction)) { inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW); mSpaceState = SpaceState.DOUBLE; } else if (!mSuggestedWords.isPunctuationSuggestions()) { @@ -841,7 +857,7 @@ public final class InputLogic { } } - handler.startDoubleSpacePeriodTimer(); + startDoubleSpacePeriodCountdown(inputTransaction); handler.postUpdateSuggestionStrip(); } else { if (swapWeakSpace) { @@ -938,7 +954,7 @@ public final class InputLogic { return; } if (SpaceState.DOUBLE == inputTransaction.mSpaceState) { - handler.cancelDoubleSpacePeriodTimer(); + cancelDoubleSpacePeriodCountdown(); if (mConnection.revertDoubleSpacePeriod()) { // No need to reset mSpaceState, it has already be done (that's why we // receive it as a parameter) @@ -1086,6 +1102,19 @@ public final class InputLogic { return false; } + public void startDoubleSpacePeriodCountdown(final InputTransaction inputTransaction) { + mDoubleSpacePeriodCountdownStart = inputTransaction.mTimestamp; + } + + public void cancelDoubleSpacePeriodCountdown() { + mDoubleSpacePeriodCountdownStart = 0; + } + + public boolean isDoubleSpacePeriodCountdownActive(final InputTransaction inputTransaction) { + return inputTransaction.mTimestamp - mDoubleSpacePeriodCountdownStart + < inputTransaction.mSettingsValues.mDoubleSpacePeriodTimeout; + } + /** * Apply the double-space-to-period transformation if applicable. * @@ -1098,14 +1127,12 @@ public final class InputLogic { * method applies the transformation and returns true. Otherwise, it does nothing and * returns false. * - * @param settingsValues the current values of the settings. + * @param inputTransaction The transaction in progress. * @return true if we applied the double-space-to-period transformation, false otherwise. */ - private boolean maybeDoubleSpacePeriod(final SettingsValues settingsValues, - // TODO: remove this argument - final LatinIME.UIHandler handler) { - if (!settingsValues.mUseDoubleSpacePeriod) return false; - if (!handler.isAcceptingDoubleSpacePeriod()) return false; + private boolean maybeDoubleSpacePeriod(final InputTransaction inputTransaction) { + if (!inputTransaction.mSettingsValues.mUseDoubleSpacePeriod) return false; + if (!isDoubleSpacePeriodCountdownActive(inputTransaction)) return false; // We only do this when we see two spaces and an accepted code point before the cursor. // The code point may be a surrogate pair but the two spaces may not, so we need 4 chars. final CharSequence lastThree = mConnection.getTextBeforeCursor(4, 0); @@ -1121,10 +1148,10 @@ public final class InputLogic { Character.isSurrogatePair(lastThree.charAt(0), lastThree.charAt(1)) ? Character.codePointAt(lastThree, 0) : lastThree.charAt(length - 3); if (canBeFollowedByDoubleSpacePeriod(firstCodePoint)) { - handler.cancelDoubleSpacePeriodTimer(); + cancelDoubleSpacePeriodCountdown(); mConnection.deleteSurroundingText(2, 0); - final String textToInsert = - settingsValues.mSpacingAndPunctuations.mSentenceSeparatorAndSpace; + final String textToInsert = inputTransaction.mSettingsValues.mSpacingAndPunctuations + .mSentenceSeparatorAndSpace; mConnection.commitText(textToInsert, 1); if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { ResearchLogger.latinIME_maybeDoubleSpacePeriod(textToInsert, |