From f95e94722345ef291adc5833103c1e9210f67fc9 Mon Sep 17 00:00:00 2001
From: "Tadashi G. Takaoka" <takaoka@google.com>
Date: Thu, 19 Aug 2010 18:20:09 +0900
Subject: [PATCH] Refactor shift state and caps lock state handling code.

Move setShifted and setShifLocked methods to KeyboardSwitcher, then
delegate to LatinKeyboardView.

Bug: 2910379

Change-Id: I5dba70ec0dfc7a1ed67f1e05d54a2bd92252ed24
---
 .../inputmethod/latin/KeyboardSwitcher.java   | 13 ++++
 .../android/inputmethod/latin/LatinIME.java   | 64 ++++++++++---------
 .../inputmethod/latin/LatinKeyboardView.java  | 10 +++
 3 files changed, 56 insertions(+), 31 deletions(-)

diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
index ed6adce9e..d04930303 100644
--- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
+++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
@@ -24,6 +24,7 @@ import android.content.Context;
 import android.content.SharedPreferences;
 import android.content.res.Configuration;
 import android.content.res.Resources;
+import android.inputmethodservice.Keyboard;
 import android.preference.PreferenceManager;
 import android.view.InflateException;
 
@@ -343,6 +344,18 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
         return false;
     }
 
+    void setShifted(boolean shifted) {
+        if (mInputView != null) {
+            mInputView.setShifted(shifted);
+        }
+    }
+
+    void setShiftLocked(boolean shiftLocked) {
+        if (mInputView != null) {
+            mInputView.setShiftLocked(shiftLocked);
+        }
+    }
+
     void toggleShift() {
         if (mCurrentId.equals(mSymbolsId)) {
             LatinKeyboard symbolsKeyboard = getKeyboard(mSymbolsId);
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 3df0a152e..9bd16adb2 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -195,6 +195,7 @@ public class LatinIME extends InputMethodService
     private boolean mAutoCorrectEnabled;
     private boolean mBigramSuggestionEnabled;
     private boolean mAutoCorrectOn;
+    // TODO move this state variable outside LatinIME
     private boolean mCapsLock;
     private boolean mPasswordText;
     private boolean mVibrateOn;
@@ -967,10 +968,8 @@ public class LatinIME extends InputMethodService
 
     public void updateShiftKeyState(EditorInfo attr) {
         InputConnection ic = getCurrentInputConnection();
-        if (attr != null && mKeyboardSwitcher.getInputView() != null
-                && mKeyboardSwitcher.isAlphabetMode() && ic != null) {
-            mKeyboardSwitcher.getInputView().setShifted(
-                    mCapsLock || getCursorCapsMode(ic, attr) != 0);
+        if (attr != null && mKeyboardSwitcher.isAlphabetMode() && ic != null) {
+            mKeyboardSwitcher.setShifted(mCapsLock || getCursorCapsMode(ic, attr) != 0);
         }
     }
 
@@ -1106,11 +1105,7 @@ public class LatinIME extends InputMethodService
                 toggleLanguage(false, false);
                 break;
             case LatinKeyboardView.KEYCODE_SHIFT_LONGPRESS:
-                if (mCapsLock) {
-                    handleShift();
-                } else {
-                    toggleCapsLock();
-                }
+                handleCapsLock();
                 break;
             case Keyboard.KEYCODE_MODE_CHANGE:
                 changeKeyboardMode();
@@ -1235,13 +1230,35 @@ public class LatinIME extends InputMethodService
 
     private void handleShift() {
         mHandler.removeMessages(MSG_UPDATE_SHIFT_STATE);
-        if (mKeyboardSwitcher.isAlphabetMode()) {
-            // Alphabet keyboard
-            checkToggleCapsLock();
-            mKeyboardSwitcher.getInputView().setShifted(mCapsLock
-                    || !mKeyboardSwitcher.getInputView().isShifted());
+        KeyboardSwitcher switcher = mKeyboardSwitcher;
+        LatinKeyboardView inputView = switcher.getInputView();
+        if (switcher.isAlphabetMode()) {
+            if (mCapsLock) {
+                mCapsLock = false;
+                switcher.setShifted(false);
+            } else if (inputView != null) {
+                if (inputView.isShifted()) {
+                    mCapsLock = true;
+                    switcher.setShiftLocked(true);
+                } else {
+                    switcher.setShifted(true);
+                }
+            }
         } else {
-            mKeyboardSwitcher.toggleShift();
+            switcher.toggleShift();
+        }
+    }
+
+    private void handleCapsLock() {
+        mHandler.removeMessages(MSG_UPDATE_SHIFT_STATE);
+        KeyboardSwitcher switcher = mKeyboardSwitcher;
+        if (switcher.isAlphabetMode()) {
+            mCapsLock = !mCapsLock;
+            if (mCapsLock) {
+                switcher.setShiftLocked(true);
+            } else {
+                switcher.setShifted(false);
+            }
         }
     }
 
@@ -1405,20 +1422,6 @@ public class LatinIME extends InputMethodService
         mWordHistory.add(entry);
     }
 
-    private void checkToggleCapsLock() {
-        if (mKeyboardSwitcher.getInputView().getKeyboard().isShifted()) {
-            toggleCapsLock();
-        }
-    }
-
-    private void toggleCapsLock() {
-        mCapsLock = !mCapsLock;
-        if (mKeyboardSwitcher.isAlphabetMode()) {
-            ((LatinKeyboard) mKeyboardSwitcher.getInputView().getKeyboard()).setShiftLocked(
-                    mCapsLock);
-        }
-    }
-
     private void postUpdateSuggestions() {
         mHandler.removeMessages(MSG_UPDATE_SUGGESTIONS);
         mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE_SUGGESTIONS), 100);
@@ -2414,8 +2417,7 @@ public class LatinIME extends InputMethodService
     private void changeKeyboardMode() {
         mKeyboardSwitcher.toggleSymbols();
         if (mCapsLock && mKeyboardSwitcher.isAlphabetMode()) {
-            ((LatinKeyboard) mKeyboardSwitcher.getInputView().getKeyboard()).setShiftLocked(
-                    mCapsLock);
+            mKeyboardSwitcher.setShiftLocked(mCapsLock);
         }
 
         updateShiftKeyState(getCurrentInputEditorInfo());
diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java
index bce2cde25..38d9cefb1 100644
--- a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java
+++ b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java
@@ -124,6 +124,16 @@ public class LatinKeyboardView extends LatinKeyboardBaseView {
         return label;
     }
 
+    public boolean setShiftLocked(boolean shiftLocked) {
+        Keyboard keyboard = getKeyboard();
+        if (keyboard != null && keyboard instanceof LatinKeyboard) {
+            ((LatinKeyboard)keyboard).setShiftLocked(shiftLocked);
+            invalidateAllKeys();
+            return true;
+        }
+        return false;
+    }
+
     /**
      * This function checks to see if we need to handle any sudden jumps in the pointer location
      * that could be due to a multi-touch being treated as a move by the firmware or hardware.