Introduce onEvent() to improve testability
...and prepare for the future Change-Id: Ieed96ab552993fd148e80b9c3355f1b569bd716fmain
parent
19a7012db5
commit
908f0ed154
|
@ -1258,10 +1258,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.
|
||||
|
@ -1270,36 +1286,30 @@ 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;
|
||||
}
|
||||
if (Constants.CODE_SHORTCUT == codePoint) {
|
||||
final Event event = createSoftwareKeypressEvent(getCodePointForKeyboard(codePoint),
|
||||
keyX, keyY, isKeyRepeat);
|
||||
onEvent(event);
|
||||
}
|
||||
|
||||
// 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());
|
||||
}
|
||||
|
||||
// A helper method to split the code point and the key code. Ultimately, they should not be
|
||||
// squashed into the same variable, and this method should be removed.
|
||||
private static Event createSoftwareKeypressEvent(final int keyCodeOrCodePoint, final int keyX,
|
||||
// public for testing, as we don't want to copy the same logic into test code
|
||||
public static Event createSoftwareKeypressEvent(final int keyCodeOrCodePoint, final int keyX,
|
||||
final int keyY, final boolean isKeyRepeat) {
|
||||
final int keyCode;
|
||||
final int codePoint;
|
||||
|
|
|
@ -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,16 @@ 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 = mLatinIME.createSoftwareKeypressEvent(codePoint, x, y, isKeyRepeat);
|
||||
}
|
||||
mLatinIME.onEvent(event);
|
||||
// Also see the comment at the top of this function about onReleaseKey
|
||||
//mLatinIME.onReleaseKey(codePoint, false /* withSliding */);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue