Implemented "SlidingKeyInput" to Numpad (#101)

This commit is contained in:
BlackyHawky 2023-12-28 13:16:11 +01:00 committed by GitHub
parent ebd7e3fa24
commit 43fc92d974
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 68 additions and 7 deletions

View file

@ -26,6 +26,7 @@ import java.util.Arrays;
import java.util.Locale; import java.util.Locale;
import static org.dslul.openboard.inputmethod.keyboard.internal.KeyboardIconsSet.ICON_UNDEFINED; import static org.dslul.openboard.inputmethod.keyboard.internal.KeyboardIconsSet.ICON_UNDEFINED;
import static org.dslul.openboard.inputmethod.latin.common.Constants.CODE_ALPHA_FROM_NUMPAD;
import static org.dslul.openboard.inputmethod.latin.common.Constants.CODE_OUTPUT_TEXT; import static org.dslul.openboard.inputmethod.latin.common.Constants.CODE_OUTPUT_TEXT;
import static org.dslul.openboard.inputmethod.latin.common.Constants.CODE_SHIFT; import static org.dslul.openboard.inputmethod.latin.common.Constants.CODE_SHIFT;
import static org.dslul.openboard.inputmethod.latin.common.Constants.CODE_SWITCH_ALPHA_SYMBOL; import static org.dslul.openboard.inputmethod.latin.common.Constants.CODE_SWITCH_ALPHA_SYMBOL;
@ -518,7 +519,7 @@ public class Key implements Comparable<Key> {
} }
public final boolean isModifier() { public final boolean isModifier() {
return mCode == CODE_SHIFT || mCode == CODE_SWITCH_ALPHA_SYMBOL; return mCode == CODE_SHIFT || mCode == CODE_SWITCH_ALPHA_SYMBOL || mCode == CODE_ALPHA_FROM_NUMPAD;
} }
public final boolean isRepeatable() { public final boolean isRepeatable() {

View file

@ -65,8 +65,9 @@ public final class KeyboardState {
private final SwitchActions mSwitchActions; private final SwitchActions mSwitchActions;
private final ShiftKeyState mShiftKeyState = new ShiftKeyState("Shift"); private ShiftKeyState mShiftKeyState = new ShiftKeyState("Shift");
private final ModifierKeyState mSymbolKeyState = new ModifierKeyState("Symbol"); private ModifierKeyState mSymbolKeyState = new ModifierKeyState("Symbol");
private ModifierKeyState mAlphaNumpadKeyState = new ModifierKeyState("AlphaNumpad");
private final AlphabetShiftState mAlphabetShiftState = new AlphabetShiftState(); private final AlphabetShiftState mAlphabetShiftState = new AlphabetShiftState();
// TODO: Merge {@link #mSwitchState}, {@link #mIsAlphabetMode}, {@link #mAlphabetShiftState}, // TODO: Merge {@link #mSwitchState}, {@link #mIsAlphabetMode}, {@link #mAlphabetShiftState},
@ -79,6 +80,8 @@ public final class KeyboardState {
private static final int SWITCH_STATE_MOMENTARY_SYMBOL_AND_MORE = 4; private static final int SWITCH_STATE_MOMENTARY_SYMBOL_AND_MORE = 4;
private static final int SWITCH_STATE_MOMENTARY_ALPHA_SHIFT = 5; private static final int SWITCH_STATE_MOMENTARY_ALPHA_SHIFT = 5;
private int mSwitchState = SWITCH_STATE_ALPHA; private int mSwitchState = SWITCH_STATE_ALPHA;
private static final int SWITCH_STATE_NUMPAD = 6;
private static final int SWITCH_STATE_MOMENTARY_NUMPAD_AND_ALPHA = 7;
private static final int MODE_ALPHABET = 0; private static final int MODE_ALPHABET = 0;
private static final int MODE_SYMBOLS = 1; private static final int MODE_SYMBOLS = 1;
@ -287,6 +290,23 @@ public final class KeyboardState {
} }
} }
private void toggleNumpadAndAlphabet(final int autoCapsFlags, final int recapitalizeMode) {
if (DEBUG_INTERNAL_ACTION) {
Log.d(TAG, "toggleNumpadAndAlphabet: "
+ stateToString(autoCapsFlags, recapitalizeMode));
}
if (mMode == MODE_NUMPAD) {
mPrevMainKeyboardWasShiftLocked = mAlphabetShiftState.isShiftLocked();
setAlphabetKeyboard(autoCapsFlags, recapitalizeMode);
if (mPrevMainKeyboardWasShiftLocked) {
setShiftLocked(true);
}
mPrevMainKeyboardWasShiftLocked = false;
} else {
setNumpadKeyboard();
}
}
// TODO: Remove this method. Come up with a more comprehensive way to reset the keyboard layout // TODO: Remove this method. Come up with a more comprehensive way to reset the keyboard layout
// when a keyboard layout set doesn't get reloaded in LatinIME.onStartInputViewInternal(). // when a keyboard layout set doesn't get reloaded in LatinIME.onStartInputViewInternal().
private void resetKeyboardStateToAlphabet(final int autoCapsFlags, final int recapitalizeMode) { private void resetKeyboardStateToAlphabet(final int autoCapsFlags, final int recapitalizeMode) {
@ -385,7 +405,7 @@ public final class KeyboardState {
mPrevMainKeyboardWasShiftLocked = mAlphabetShiftState.isShiftLocked(); mPrevMainKeyboardWasShiftLocked = mAlphabetShiftState.isShiftLocked();
mAlphabetShiftState.setShiftLocked(false); mAlphabetShiftState.setShiftLocked(false);
mSwitchActions.setNumpadKeyboard(); mSwitchActions.setNumpadKeyboard();
mSwitchState = SWITCH_STATE_NUMPAD;
} }
private void setOneHandedModeEnabled(boolean enabled) { private void setOneHandedModeEnabled(boolean enabled) {
@ -420,6 +440,8 @@ public final class KeyboardState {
// Nothing to do here. See {@link #onReleaseKey(int,boolean)}. // Nothing to do here. See {@link #onReleaseKey(int,boolean)}.
} else if (code == Constants.CODE_SWITCH_ALPHA_SYMBOL) { } else if (code == Constants.CODE_SWITCH_ALPHA_SYMBOL) {
onPressSymbol(autoCapsFlags, recapitalizeMode); onPressSymbol(autoCapsFlags, recapitalizeMode);
} else if (code == Constants.CODE_ALPHA_FROM_NUMPAD) {
onPressAlphaNumpad(autoCapsFlags, recapitalizeMode);
} else { } else {
mShiftKeyState.onOtherKeyPressed(); mShiftKeyState.onOtherKeyPressed();
mSymbolKeyState.onOtherKeyPressed(); mSymbolKeyState.onOtherKeyPressed();
@ -455,6 +477,8 @@ public final class KeyboardState {
setShiftLocked(!mAlphabetShiftState.isShiftLocked()); setShiftLocked(!mAlphabetShiftState.isShiftLocked());
} else if (code == Constants.CODE_SWITCH_ALPHA_SYMBOL) { } else if (code == Constants.CODE_SWITCH_ALPHA_SYMBOL) {
onReleaseSymbol(withSliding, autoCapsFlags, recapitalizeMode); onReleaseSymbol(withSliding, autoCapsFlags, recapitalizeMode);
} else if (code == Constants.CODE_ALPHA_FROM_NUMPAD) {
onReleaseAlphaNumpad(withSliding, autoCapsFlags, recapitalizeMode);
} }
} }
@ -480,6 +504,29 @@ public final class KeyboardState {
mSymbolKeyState.onRelease(); mSymbolKeyState.onRelease();
} }
private void onPressAlphaNumpad(final int autoCapsFlags,
final int recapitalizeMode) {
toggleNumpadAndAlphabet(autoCapsFlags, recapitalizeMode);
mAlphaNumpadKeyState.onPress();
mSwitchState = SWITCH_STATE_MOMENTARY_NUMPAD_AND_ALPHA;
}
private void onReleaseAlphaNumpad(final boolean withSliding, final int autoCapsFlags,
final int recapitalizeMode) {
if (mAlphaNumpadKeyState.isChording()) {
// Switch back to the previous keyboard mode if the user chords the mode change key and
// another key, then releases the mode change key.
toggleNumpadAndAlphabet(autoCapsFlags, recapitalizeMode);
} else if (!withSliding) {
// If the mode change key is being released without sliding, we should remember
// caps lock mode and reset alphabet shift state.
mPrevMainKeyboardWasShiftLocked = mAlphabetShiftState.isShiftLocked();
mAlphabetShiftState.setShiftLocked(false);
}
mAlphaNumpadKeyState.onRelease();
}
public void onUpdateShiftState(final int autoCapsFlags, final int recapitalizeMode) { public void onUpdateShiftState(final int autoCapsFlags, final int recapitalizeMode) {
if (DEBUG_EVENT) { if (DEBUG_EVENT) {
Log.d(TAG, "onUpdateShiftState: " + stateToString(autoCapsFlags, recapitalizeMode)); Log.d(TAG, "onUpdateShiftState: " + stateToString(autoCapsFlags, recapitalizeMode));
@ -663,6 +710,9 @@ public final class KeyboardState {
case SWITCH_STATE_MOMENTARY_ALPHA_SHIFT: case SWITCH_STATE_MOMENTARY_ALPHA_SHIFT:
setAlphabetKeyboard(autoCapsFlags, recapitalizeMode); setAlphabetKeyboard(autoCapsFlags, recapitalizeMode);
break; break;
case SWITCH_STATE_MOMENTARY_NUMPAD_AND_ALPHA:
toggleNumpadAndAlphabet(autoCapsFlags, recapitalizeMode);
break;
} }
} }
@ -688,6 +738,16 @@ public final class KeyboardState {
} }
} }
break; break;
case SWITCH_STATE_MOMENTARY_NUMPAD_AND_ALPHA:
if (code == Constants.CODE_ALPHA_FROM_NUMPAD) {
// Detected only the mode change key has been pressed, and then released.
if (mMode == MODE_NUMPAD) {
mSwitchState = SWITCH_STATE_NUMPAD;
} else {
mSwitchState = SWITCH_STATE_ALPHA;
}
}
break;
case SWITCH_STATE_MOMENTARY_SYMBOL_AND_MORE: case SWITCH_STATE_MOMENTARY_SYMBOL_AND_MORE:
if (code == Constants.CODE_SHIFT) { if (code == Constants.CODE_SHIFT) {
// Detected only the shift key has been pressed on symbol layout, and then // Detected only the shift key has been pressed on symbol layout, and then
@ -702,7 +762,7 @@ public final class KeyboardState {
} }
break; break;
case SWITCH_STATE_SYMBOL_BEGIN: case SWITCH_STATE_SYMBOL_BEGIN:
if (mMode == MODE_EMOJI || mMode == MODE_CLIPBOARD || mMode == MODE_NUMPAD) { if (mMode == MODE_EMOJI || mMode == MODE_CLIPBOARD) {
// When in the Emoji keyboard or clipboard one, we don't want to switch back to the main layout even // When in the Emoji keyboard or clipboard one, we don't want to switch back to the main layout even
// after the user hits an emoji letter followed by an enter or a space. // after the user hits an emoji letter followed by an enter or a space.
break; break;
@ -745,8 +805,6 @@ public final class KeyboardState {
setAlphabetKeyboard(autoCapsFlags, recapitalizeMode); setAlphabetKeyboard(autoCapsFlags, recapitalizeMode);
} else if (code == Constants.CODE_NUMPAD) { } else if (code == Constants.CODE_NUMPAD) {
setNumpadKeyboard(); setNumpadKeyboard();
} else if (code == Constants.CODE_ALPHA_FROM_NUMPAD) {
setAlphabetKeyboard(autoCapsFlags, recapitalizeMode);
} else if (code == Constants.CODE_SYMBOL_FROM_NUMPAD) { } else if (code == Constants.CODE_SYMBOL_FROM_NUMPAD) {
setSymbolsKeyboard(); setSymbolsKeyboard();
} else if (code == Constants.CODE_START_ONE_HANDED_MODE) { } else if (code == Constants.CODE_START_ONE_HANDED_MODE) {
@ -775,6 +833,8 @@ public final class KeyboardState {
case SWITCH_STATE_MOMENTARY_ALPHA_AND_SYMBOL: return "MOMENTARY-ALPHA-SYMBOL"; case SWITCH_STATE_MOMENTARY_ALPHA_AND_SYMBOL: return "MOMENTARY-ALPHA-SYMBOL";
case SWITCH_STATE_MOMENTARY_SYMBOL_AND_MORE: return "MOMENTARY-SYMBOL-MORE"; case SWITCH_STATE_MOMENTARY_SYMBOL_AND_MORE: return "MOMENTARY-SYMBOL-MORE";
case SWITCH_STATE_MOMENTARY_ALPHA_SHIFT: return "MOMENTARY-ALPHA_SHIFT"; case SWITCH_STATE_MOMENTARY_ALPHA_SHIFT: return "MOMENTARY-ALPHA_SHIFT";
case SWITCH_STATE_NUMPAD: return "NUMPAD";
case SWITCH_STATE_MOMENTARY_NUMPAD_AND_ALPHA: return "MOMENTARY-NUMPAD-ALPHA";
default: return null; default: return null;
} }
} }