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
diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
index ed6adce..d049303 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.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 @@
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 3df0a15..9bd16ad 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -195,6 +195,7 @@
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 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 @@
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 @@
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 @@
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 @@
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 bce2cde..38d9cef 100644
--- a/java/src/com/android/inputmethod/latin/LatinKeyboardView.java
+++ b/java/src/com/android/inputmethod/latin/LatinKeyboardView.java
@@ -124,6 +124,16 @@
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.