Refactor shift key state into KeyboardSwitcher

Change-Id: If484d3d7e7a0794ee7fc88f0771229d6f90db466
diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
index fdcf0ad..fce0e34 100644
--- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
+++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
@@ -75,7 +75,9 @@
     private final LatinIME mInputMethodService;
     private final LanguageSwitcher mLanguageSwitcher;
 
+    private ShiftKeyState mShiftState = new ShiftKeyState();
     private ModifierKeyState mSymbolKeyState = new ModifierKeyState();
+
     private KeyboardId mSymbolsId;
     private KeyboardId mSymbolsShiftedId;
 
@@ -383,6 +385,30 @@
         mInputView.setShiftLocked(shiftLocked);
     }
 
+    public void onPressShift() {
+        mShiftState.onPress();
+    }
+
+    public void onPressShiftOnShifted() {
+        mShiftState.onPressOnShifted();
+    }
+
+    public void onReleaseShift() {
+        mShiftState.onRelease();
+    }
+
+    public boolean isShiftMomentary() {
+        return mShiftState.isMomentary();
+    }
+
+    public boolean isShiftPressingOnShifted() {
+        return mShiftState.isPressingOnShifted();
+    }
+
+    public boolean isShiftIgnoring() {
+        return mShiftState.isIgnoring();
+    }
+
     public void onPressSymbol() {
         mSymbolKeyState.onPress();
     }
@@ -396,7 +422,7 @@
     }
 
     public void onOtherKeyPressed() {
-        // TODO: shift key state will be handled too.
+        mShiftState.onOtherKeyPressed();
         mSymbolKeyState.onOtherKeyPressed();
     }
 
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index a432eaa..156d0bc 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -235,9 +235,6 @@
     private int mDeleteCount;
     private long mLastKeyTime;
 
-    // Modifier keys state
-    private final ModifierKeyState mShiftKeyState = new ModifierKeyState();
-
     private Tutorial mTutorial;
 
     private AudioManager mAudioManager;
@@ -1091,8 +1088,8 @@
         if (!switcher.isKeyboardAvailable())
             return;
         if (ic != null && attr != null && switcher.isAlphabetMode()
-                && !mShiftKeyState.isIgnoring()) {
-            switcher.setShifted(mShiftKeyState.isMomentary()
+                && !switcher.isShiftIgnoring()) {
+            switcher.setShifted(switcher.isShiftMomentary()
                     || switcher.isShiftLocked() || getCursorCapsMode(ic, attr) != 0);
         }
     }
@@ -2342,16 +2339,15 @@
             // In alphabet mode, we call handleShift() to go into the shifted mode in this
             // method, onPress(), only when we are in the small letter mode.
             if (switcher.isAlphabetMode() && switcher.isShifted()) {
-                mShiftKeyState.onPressOnShifted();
+                switcher.onPressShiftOnShifted();
             } else {
-                mShiftKeyState.onPress();
+                switcher.onPressShift();
                 handleShift();
             }
         } else if (distinctMultiTouch && primaryCode == BaseKeyboard.KEYCODE_MODE_CHANGE) {
             switcher.onPressSymbol();
             changeKeyboardMode();
         } else {
-            mShiftKeyState.onOtherKeyPressed();
             switcher.onOtherKeyPressed();
         }
     }
@@ -2364,18 +2360,18 @@
         switcher.keyReleased();
         final boolean distinctMultiTouch = switcher.hasDistinctMultitouch();
         if (distinctMultiTouch && primaryCode == BaseKeyboard.KEYCODE_SHIFT) {
-            if (mShiftKeyState.isMomentary()) {
+            if (switcher.isShiftMomentary()) {
                 resetShift();
             }
             if (switcher.isAlphabetMode()) {
                 // In alphabet mode, we call handleShift() to go into the small letter mode in this
                 // method, onRelease(), only when we are in the shifted modes -- temporary shifted
                 // mode or caps lock mode.
-                if (switcher.isShifted() && mShiftKeyState.isPressingOnShifted()) {
+                if (switcher.isShifted() && switcher.isShiftPressingOnShifted()) {
                     handleShift();
                 }
             }
-            mShiftKeyState.onRelease();
+            switcher.onReleaseShift();
         } else if (distinctMultiTouch && primaryCode == BaseKeyboard.KEYCODE_MODE_CHANGE) {
             if (switcher.isSymbolMomentary()) {
                 changeKeyboardMode();
diff --git a/java/src/com/android/inputmethod/latin/ModifierKeyState.java b/java/src/com/android/inputmethod/latin/ModifierKeyState.java
index 75820e7..8139ec5 100644
--- a/java/src/com/android/inputmethod/latin/ModifierKeyState.java
+++ b/java/src/com/android/inputmethod/latin/ModifierKeyState.java
@@ -16,44 +16,26 @@
 
 package com.android.inputmethod.latin;
 
-class ModifierKeyState {
-    private static final int RELEASING = 0;
-    private static final int PRESSING = 1;
-    private static final int PRESSING_ON_SHIFTED = 2; // both temporary shifted & shift locked
-    private static final int MOMENTARY = 3;
-    private static final int IGNORING = 4;
+public class ModifierKeyState {
+    protected static final int RELEASING = 0;
+    protected static final int PRESSING = 1;
+    protected static final int MOMENTARY = 2;
 
-    private int mState = RELEASING;
+    protected int mState = RELEASING;
 
     public void onPress() {
         mState = PRESSING;
     }
 
-    public void onPressOnShifted() {
-        mState = PRESSING_ON_SHIFTED;
-    }
-
     public void onRelease() {
         mState = RELEASING;
     }
 
     public void onOtherKeyPressed() {
-        if (mState == PRESSING) {
-            mState = MOMENTARY;
-        } else if (mState == PRESSING_ON_SHIFTED) {
-            mState = IGNORING;
-        }
+        mState = MOMENTARY;
     }
 
     public boolean isMomentary() {
         return mState == MOMENTARY;
     }
-
-    public boolean isPressingOnShifted() {
-        return mState == PRESSING_ON_SHIFTED;
-    }
-
-    public boolean isIgnoring() {
-        return mState == IGNORING;
-    }
 }
diff --git a/java/src/com/android/inputmethod/latin/ShiftKeyState.java b/java/src/com/android/inputmethod/latin/ShiftKeyState.java
new file mode 100644
index 0000000..5312ce2
--- /dev/null
+++ b/java/src/com/android/inputmethod/latin/ShiftKeyState.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.android.inputmethod.latin;
+
+public class ShiftKeyState extends ModifierKeyState {
+    private static final int PRESSING_ON_SHIFTED = 3; // both temporary shifted & shift locked
+    private static final int IGNORING = 4;
+
+    @Override
+    public void onOtherKeyPressed() {
+        if (mState == PRESSING) {
+            mState = MOMENTARY;
+        } else if (mState == PRESSING_ON_SHIFTED) {
+            mState = IGNORING;
+        }
+    }
+
+    public void onPressOnShifted() {
+        mState = PRESSING_ON_SHIFTED;
+    }
+
+    public boolean isPressingOnShifted() {
+        return mState == PRESSING_ON_SHIFTED;
+    }
+
+    public boolean isIgnoring() {
+        return mState == IGNORING;
+    }
+}