Merge "Cleanup KeyboardState a bit"

This commit is contained in:
Tadashi G. Takaoka 2012-01-19 02:14:10 -08:00 committed by Android (Google) Code Review
commit 4d229410f0
2 changed files with 33 additions and 28 deletions

View file

@ -58,7 +58,7 @@ public class KeyboardState {
public void requestUpdatingShiftState(); public void requestUpdatingShiftState();
} }
private KeyboardShiftState mKeyboardShiftState = new KeyboardShiftState(); private final SwitchActions mSwitchActions;
private ShiftKeyState mShiftKeyState = new ShiftKeyState("Shift"); private ShiftKeyState mShiftKeyState = new ShiftKeyState("Shift");
private ModifierKeyState mSymbolKeyState = new ModifierKeyState("Symbol"); private ModifierKeyState mSymbolKeyState = new ModifierKeyState("Symbol");
@ -72,16 +72,14 @@ public class KeyboardState {
private static final int SWITCH_STATE_CHORDING_ALPHA = 5; private static final int SWITCH_STATE_CHORDING_ALPHA = 5;
private static final int SWITCH_STATE_CHORDING_SYMBOL = 6; private static final int SWITCH_STATE_CHORDING_SYMBOL = 6;
private int mSwitchState = SWITCH_STATE_ALPHA; private int mSwitchState = SWITCH_STATE_ALPHA;
private String mLayoutSwitchBackSymbols; private String mLayoutSwitchBackSymbols;
private final SwitchActions mSwitchActions;
private boolean mIsAlphabetMode; private boolean mIsAlphabetMode;
private KeyboardShiftState mAlphabetShiftState = new KeyboardShiftState();
private boolean mIsSymbolShifted; private boolean mIsSymbolShifted;
private boolean mPrevMainKeyboardWasShiftLocked;
private final SavedKeyboardState mSavedKeyboardState = new SavedKeyboardState(); private final SavedKeyboardState mSavedKeyboardState = new SavedKeyboardState();
private boolean mPrevMainKeyboardWasShiftLocked;
static class SavedKeyboardState { static class SavedKeyboardState {
public boolean mIsValid; public boolean mIsValid;
@ -99,11 +97,11 @@ public class KeyboardState {
Log.d(TAG, "onLoadKeyboard"); Log.d(TAG, "onLoadKeyboard");
} }
mLayoutSwitchBackSymbols = layoutSwitchBackSymbols; mLayoutSwitchBackSymbols = layoutSwitchBackSymbols;
mKeyboardShiftState.setShifted(false); // Reset alphabet shift state.
mKeyboardShiftState.setShiftLocked(false); mAlphabetShiftState.setShiftLocked(false);
mPrevMainKeyboardWasShiftLocked = false;
mShiftKeyState.onRelease(); mShiftKeyState.onRelease();
mSymbolKeyState.onRelease(); mSymbolKeyState.onRelease();
mPrevMainKeyboardWasShiftLocked = false;
onRestoreKeyboardState(); onRestoreKeyboardState();
} }
@ -111,9 +109,9 @@ public class KeyboardState {
final SavedKeyboardState state = mSavedKeyboardState; final SavedKeyboardState state = mSavedKeyboardState;
state.mIsAlphabetMode = mIsAlphabetMode; state.mIsAlphabetMode = mIsAlphabetMode;
if (mIsAlphabetMode) { if (mIsAlphabetMode) {
state.mIsShiftLocked = mKeyboardShiftState.isShiftLocked(); state.mIsShiftLocked = mAlphabetShiftState.isShiftLocked();
state.mIsShifted = !state.mIsShiftLocked state.mIsShifted = !state.mIsShiftLocked
&& mKeyboardShiftState.isShiftedOrShiftLocked(); && mAlphabetShiftState.isShiftedOrShiftLocked();
} else { } else {
state.mIsShiftLocked = false; state.mIsShiftLocked = false;
state.mIsShifted = mIsSymbolShifted; state.mIsShifted = mIsSymbolShifted;
@ -155,7 +153,7 @@ public class KeyboardState {
// TODO: Remove this method. // TODO: Remove this method.
public boolean isShiftLocked() { public boolean isShiftLocked() {
return mKeyboardShiftState.isShiftLocked(); return mAlphabetShiftState.isShiftLocked();
} }
private void setShifted(int shiftMode) { private void setShifted(int shiftMode) {
@ -164,13 +162,13 @@ public class KeyboardState {
} }
switch (shiftMode) { switch (shiftMode) {
case SwitchActions.AUTOMATIC_SHIFT: case SwitchActions.AUTOMATIC_SHIFT:
mKeyboardShiftState.setAutomaticTemporaryUpperCase(); mAlphabetShiftState.setAutomaticTemporaryUpperCase();
break; break;
case SwitchActions.MANUAL_SHIFT: case SwitchActions.MANUAL_SHIFT:
mKeyboardShiftState.setShifted(true); mAlphabetShiftState.setShifted(true);
break; break;
case SwitchActions.UNSHIFT: case SwitchActions.UNSHIFT:
mKeyboardShiftState.setShifted(false); mAlphabetShiftState.setShifted(false);
break; break;
} }
mSwitchActions.setShifted(shiftMode); mSwitchActions.setShifted(shiftMode);
@ -180,7 +178,7 @@ public class KeyboardState {
if (DEBUG_ACTION) { if (DEBUG_ACTION) {
Log.d(TAG, "setShiftLocked: shiftLocked=" + shiftLocked); Log.d(TAG, "setShiftLocked: shiftLocked=" + shiftLocked);
} }
mKeyboardShiftState.setShiftLocked(shiftLocked); mAlphabetShiftState.setShiftLocked(shiftLocked);
mSwitchActions.setShiftLocked(shiftLocked); mSwitchActions.setShiftLocked(shiftLocked);
} }
@ -215,13 +213,15 @@ public class KeyboardState {
// TODO: Make this method private // TODO: Make this method private
public void setSymbolsKeyboard() { public void setSymbolsKeyboard() {
mPrevMainKeyboardWasShiftLocked = mAlphabetShiftState.isShiftLocked();
if (DEBUG_ACTION) { if (DEBUG_ACTION) {
Log.d(TAG, "setSymbolsKeyboard"); Log.d(TAG, "setSymbolsKeyboard");
} }
mPrevMainKeyboardWasShiftLocked = mKeyboardShiftState.isShiftLocked();
mSwitchActions.setSymbolsKeyboard(); mSwitchActions.setSymbolsKeyboard();
mIsAlphabetMode = false; mIsAlphabetMode = false;
mIsSymbolShifted = false; mIsSymbolShifted = false;
// Reset alphabet shift state.
mAlphabetShiftState.setShiftLocked(false);
mSwitchState = SWITCH_STATE_SYMBOL_BEGIN; mSwitchState = SWITCH_STATE_SYMBOL_BEGIN;
} }
@ -232,6 +232,8 @@ public class KeyboardState {
mSwitchActions.setSymbolsShiftedKeyboard(); mSwitchActions.setSymbolsShiftedKeyboard();
mIsAlphabetMode = false; mIsAlphabetMode = false;
mIsSymbolShifted = true; mIsSymbolShifted = true;
// Reset alphabet shift state.
mAlphabetShiftState.setShiftLocked(false);
mSwitchState = SWITCH_STATE_SYMBOL_BEGIN; mSwitchState = SWITCH_STATE_SYMBOL_BEGIN;
} }
@ -286,7 +288,7 @@ public class KeyboardState {
private void onUpdateShiftStateInternal(boolean autoCaps) { private void onUpdateShiftStateInternal(boolean autoCaps) {
if (mIsAlphabetMode) { if (mIsAlphabetMode) {
if (!mKeyboardShiftState.isShiftLocked() && !mShiftKeyState.isIgnoring()) { if (!mAlphabetShiftState.isShiftLocked() && !mShiftKeyState.isIgnoring()) {
if (mShiftKeyState.isReleasing() && autoCaps) { if (mShiftKeyState.isReleasing() && autoCaps) {
// Only when shift key is releasing, automatic temporary upper case will be set. // Only when shift key is releasing, automatic temporary upper case will be set.
setShifted(SwitchActions.AUTOMATIC_SHIFT); setShifted(SwitchActions.AUTOMATIC_SHIFT);
@ -304,17 +306,17 @@ public class KeyboardState {
private void onPressShift() { private void onPressShift() {
if (mIsAlphabetMode) { if (mIsAlphabetMode) {
if (mKeyboardShiftState.isShiftLocked()) { if (mAlphabetShiftState.isShiftLocked()) {
// Shift key is pressed while caps lock state, we will treat this state as shifted // Shift key is pressed while caps lock state, we will treat this state as shifted
// caps lock state and mark as if shift key pressed while normal state. // caps lock state and mark as if shift key pressed while normal state.
setShifted(SwitchActions.MANUAL_SHIFT); setShifted(SwitchActions.MANUAL_SHIFT);
mShiftKeyState.onPress(); mShiftKeyState.onPress();
} else if (mKeyboardShiftState.isAutomaticTemporaryUpperCase()) { } else if (mAlphabetShiftState.isAutomaticTemporaryUpperCase()) {
// Shift key is pressed while automatic temporary upper case, we have to move to // Shift key is pressed while automatic temporary upper case, we have to move to
// manual temporary upper case. // manual temporary upper case.
setShifted(SwitchActions.MANUAL_SHIFT); setShifted(SwitchActions.MANUAL_SHIFT);
mShiftKeyState.onPress(); mShiftKeyState.onPress();
} else if (mKeyboardShiftState.isShiftedOrShiftLocked()) { } else if (mAlphabetShiftState.isShiftedOrShiftLocked()) {
// In manual upper case state, we just record shift key has been pressing while // In manual upper case state, we just record shift key has been pressing while
// shifted state. // shifted state.
mShiftKeyState.onPressOnShifted(); mShiftKeyState.onPressOnShifted();
@ -333,22 +335,22 @@ public class KeyboardState {
private void onReleaseShift(boolean withSliding) { private void onReleaseShift(boolean withSliding) {
if (mIsAlphabetMode) { if (mIsAlphabetMode) {
final boolean isShiftLocked = mKeyboardShiftState.isShiftLocked(); final boolean isShiftLocked = mAlphabetShiftState.isShiftLocked();
if (mShiftKeyState.isMomentary()) { if (mShiftKeyState.isMomentary()) {
// After chording input while normal state. // After chording input while normal state.
setShifted(SwitchActions.UNSHIFT); setShifted(SwitchActions.UNSHIFT);
} else if (isShiftLocked && !mKeyboardShiftState.isShiftLockShifted() } else if (isShiftLocked && !mAlphabetShiftState.isShiftLockShifted()
&& (mShiftKeyState.isPressing() || mShiftKeyState.isPressingOnShifted()) && (mShiftKeyState.isPressing() || mShiftKeyState.isPressingOnShifted())
&& !withSliding) { && !withSliding) {
// Shift has been long pressed, ignore this release. // Shift has been long pressed, ignore this release.
} else if (isShiftLocked && !mShiftKeyState.isIgnoring() && !withSliding) { } else if (isShiftLocked && !mShiftKeyState.isIgnoring() && !withSliding) {
// Shift has been pressed without chording while caps lock state. // Shift has been pressed without chording while caps lock state.
setShiftLocked(false); setShiftLocked(false);
} else if (mKeyboardShiftState.isShiftedOrShiftLocked() } else if (mAlphabetShiftState.isShiftedOrShiftLocked()
&& mShiftKeyState.isPressingOnShifted() && !withSliding) { && mShiftKeyState.isPressingOnShifted() && !withSliding) {
// Shift has been pressed without chording while shifted state. // Shift has been pressed without chording while shifted state.
setShifted(SwitchActions.UNSHIFT); setShifted(SwitchActions.UNSHIFT);
} else if (mKeyboardShiftState.isManualTemporaryUpperCaseFromAuto() } else if (mAlphabetShiftState.isManualTemporaryUpperCaseFromAuto()
&& mShiftKeyState.isPressing() && !withSliding) { && mShiftKeyState.isPressing() && !withSliding) {
// Shift has been pressed without chording while manual temporary upper case // Shift has been pressed without chording while manual temporary upper case
// transited from automatic temporary upper case. // transited from automatic temporary upper case.
@ -401,7 +403,7 @@ public class KeyboardState {
} }
if (mIsAlphabetMode && code == Keyboard.CODE_CAPSLOCK) { if (mIsAlphabetMode && code == Keyboard.CODE_CAPSLOCK) {
if (mKeyboardShiftState.isShiftLocked()) { if (mAlphabetShiftState.isShiftLocked()) {
setShiftLocked(false); setShiftLocked(false);
// Shift key is long pressed or double tapped while caps lock state, we will // Shift key is long pressed or double tapped while caps lock state, we will
// toggle back to normal state. And mark as if shift key is released. // toggle back to normal state. And mark as if shift key is released.
@ -503,7 +505,8 @@ public class KeyboardState {
@Override @Override
public String toString() { public String toString() {
return "[keyboard=" + mKeyboardShiftState return "[keyboard=" + (mIsAlphabetMode ? mAlphabetShiftState.toString()
: (mIsSymbolShifted ? "SYMBOLS_SHIFTED" : "SYMBOLS"))
+ " shift=" + mShiftKeyState + " shift=" + mShiftKeyState
+ " symbol=" + mSymbolKeyState + " symbol=" + mSymbolKeyState
+ " switch=" + switchStateToString(mSwitchState) + "]"; + " switch=" + switchStateToString(mSwitchState) + "]";

View file

@ -53,9 +53,11 @@ public class KeyboardStateMultiTouchTests extends KeyboardStateTestsBase {
chordingPressAndReleaseKey('X', ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED); chordingPressAndReleaseKey('X', ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED);
// TODO: This test fails due to bug, though external behavior is correct. // TODO: This test fails due to bug, though external behavior is correct.
// Release shift key, switch back to alphabet shift locked. // // Release shift key, switch back to alphabet shift locked.
// releaseKey(CODE_SHIFT, ALPHABET_SHIFT_LOCKED); // releaseKey(CODE_SHIFT, ALPHABET_SHIFT_LOCKED);
// releaseKey(CODE_SHIFT, ALPHABET_UNSHIFTED);
// TODO: This test fails due to bug, though external behavior is correct.
// // Press symbols key and hold, enter into choring symbols state. // // Press symbols key and hold, enter into choring symbols state.
// pressKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED); // pressKey(CODE_SYMBOL, SYMBOLS_UNSHIFTED);
// //