Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ef74e737 authored by Jean Chalard's avatar Jean Chalard
Browse files

Introduce onEvent() to improve testability

...and prepare for the future

Change-Id: Ieed96ab552993fd148e80b9c3355f1b569bd716f
parent 2d8f1b65
Loading
Loading
Loading
Loading
+26 −17
Original line number Diff line number Diff line
@@ -1261,10 +1261,26 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
        mSubtypeState.switchSubtype(token, mRichImm);
    }

    // TODO: Instead of checking for alphabetic keyboard here, separate keycodes for
    // alphabetic shift and shift while in symbol layout and get rid of this method.
    private int getCodePointForKeyboard(final int codePoint) {
        if (Constants.CODE_SHIFT == codePoint) {
            final Keyboard currentKeyboard = mKeyboardSwitcher.getKeyboard();
            if (null != currentKeyboard && currentKeyboard.mId.isAlphabetKeyboard()) {
                return codePoint;
            } else {
                return Constants.CODE_SYMBOL_SHIFT;
            }
        } else {
            return codePoint;
        }
    }

    // Implementation of {@link KeyboardActionListener}.
    @Override
    public void onCodeInput(final int codePoint, final int x, final int y,
            final boolean isKeyRepeat) {
        // TODO: this processing does not belong inside LatinIME, the caller should be doing this.
        final MainKeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView();
        // x and y include some padding, but everything down the line (especially native
        // code) needs the coordinates in the keyboard frame.
@@ -1273,30 +1289,23 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
        // this transformation, it should be done already before calling onCodeInput.
        final int keyX = mainKeyboardView.getKeyX(x);
        final int keyY = mainKeyboardView.getKeyY(y);
        final int codeToSend;
        if (Constants.CODE_SHIFT == codePoint) {
            // TODO: Instead of checking for alphabetic keyboard here, separate keycodes for
            // alphabetic shift and shift while in symbol layout.
            final Keyboard currentKeyboard = mKeyboardSwitcher.getKeyboard();
            if (null != currentKeyboard && currentKeyboard.mId.isAlphabetKeyboard()) {
                codeToSend = codePoint;
            } else {
                codeToSend = Constants.CODE_SYMBOL_SHIFT;
            }
        } else {
            codeToSend = codePoint;
        final Event event = createSoftwareKeypressEvent(getCodePointForKeyboard(codePoint),
                keyX, keyY, isKeyRepeat);
        onEvent(event);
    }
        if (Constants.CODE_SHORTCUT == codePoint) {

    // This method is public for testability of LatinIME, but also in the future it should
    // completely replace #onCodeInput.
    public void onEvent(final Event event) {
        if (Constants.CODE_SHORTCUT == event.mCodePoint) {
            mSubtypeSwitcher.switchToShortcutIME(this);
            // Still call the *#onCodeInput methods for readability.
        }
        final Event event = createSoftwareKeypressEvent(codeToSend, keyX, keyY, isKeyRepeat);
        final InputTransaction completeInputTransaction =
                mInputLogic.onCodeInput(mSettings.getCurrent(), event,
                        mKeyboardSwitcher.getKeyboardShiftMode(),
                        mKeyboardSwitcher.getCurrentKeyboardScriptId(), mHandler);
        updateStateAfterInputTransaction(completeInputTransaction);
        mKeyboardSwitcher.onCodeInput(codePoint, getCurrentAutoCapsState(),
        mKeyboardSwitcher.onCodeInput(event.mCodePoint, getCurrentAutoCapsState(),
                getCurrentRecapitalizeState());
    }

+7 −3
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import android.widget.EditText;
import android.widget.FrameLayout;

import com.android.inputmethod.compat.InputMethodSubtypeCompatUtils;
import com.android.inputmethod.event.Event;
import com.android.inputmethod.keyboard.Key;
import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
@@ -263,14 +264,17 @@ public class InputTestsBase extends ServiceTestCase<LatinIMEForTests> {
        // but keep them in mind if something breaks. Commenting them out as is should work.
        //mLatinIME.onPressKey(codePoint, 0 /* repeatCount */, true /* isSinglePointer */);
        final Key key = mKeyboard.getKey(codePoint);
        final Event event;
        if (key == null) {
            mLatinIME.onCodeInput(codePoint, Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE,
                    isKeyRepeat);
            event = Event.createSoftwareKeypressEvent(codePoint, Event.NOT_A_KEY_CODE,
                    Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE, isKeyRepeat);
        } else {
            final int x = key.getX() + key.getWidth() / 2;
            final int y = key.getY() + key.getHeight() / 2;
            mLatinIME.onCodeInput(codePoint, x, y, isKeyRepeat);
            event = Event.createSoftwareKeypressEvent(codePoint, Event.NOT_A_KEY_CODE,
                    x, y, isKeyRepeat);
        }
        mLatinIME.onEvent(event);
        // Also see the comment at the top of this function about onReleaseKey
        //mLatinIME.onReleaseKey(codePoint, false /* withSliding */);
    }