15a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka/* 28632bff2d5a8e1160989008dea6eff4b94b065ddTadashi G. Takaoka * Copyright (C) 2010 The Android Open Source Project 35a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka * 45a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License"); you may not 55a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka * use this file except in compliance with the License. You may obtain a copy of 65a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka * the License at 75a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka * 85a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka * http://www.apache.org/licenses/LICENSE-2.0 95a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka * 105a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka * Unless required by applicable law or agreed to in writing, software 115a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 125a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 135a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka * License for the specific language governing permissions and limitations under 145a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka * the License. 155a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka */ 165a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka 1772934bd5967d0127f71fd4d66158b18b4e6ceefeTadashi G. Takaokapackage com.android.inputmethod.keyboard.internal; 185a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka 19f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaokaimport android.util.Log; 20f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka 2172934bd5967d0127f71fd4d66158b18b4e6ceefeTadashi G. Takaokaimport com.android.inputmethod.keyboard.KeyboardSwitcher; 2272934bd5967d0127f71fd4d66158b18b4e6ceefeTadashi G. Takaoka 23571bdb401f670b92bd7710a12a990cb65a99b7d3Tadashi G. Takaokapublic class KeyboardShiftState { 24286a5bf1c68c8dd06ece9701a904593af2457586Ken Wakasa private static final String TAG = KeyboardShiftState.class.getSimpleName(); 25f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka private static final boolean DEBUG = KeyboardSwitcher.DEBUG_STATE; 26f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka 27f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka private static final int NORMAL = 0; 28f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka private static final int MANUAL_SHIFTED = 1; 29d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka private static final int MANUAL_SHIFTED_FROM_AUTO = 2; 30f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka private static final int AUTO_SHIFTED = 3; 31d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka private static final int SHIFT_LOCKED = 4; 32d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka private static final int SHIFT_LOCK_SHIFTED = 5; 33f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka 34f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka private int mState = NORMAL; 35f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka 36f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka public boolean setShifted(boolean newShiftState) { 37f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka final int oldState = mState; 38f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka if (newShiftState) { 39d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka switch (oldState) { 40d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka case NORMAL: 41f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka mState = MANUAL_SHIFTED; 42d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka break; 43d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka case AUTO_SHIFTED: 44d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka mState = MANUAL_SHIFTED_FROM_AUTO; 45d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka break; 46d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka case SHIFT_LOCKED: 47f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka mState = SHIFT_LOCK_SHIFTED; 48d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka break; 49f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 50f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } else { 51d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka switch (oldState) { 52d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka case MANUAL_SHIFTED: 53d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka case MANUAL_SHIFTED_FROM_AUTO: 54d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka case AUTO_SHIFTED: 55f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka mState = NORMAL; 56d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka break; 57d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka case SHIFT_LOCK_SHIFTED: 58f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka mState = SHIFT_LOCKED; 59d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka break; 60d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka } 61f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 62f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka if (DEBUG) 6345911256fd4e32880e33c42259b19e8d7af70cb1Tadashi G. Takaoka Log.d(TAG, "setShifted(" + newShiftState + "): " + toString(oldState) + " > " + this); 64f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka return mState != oldState; 65f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 66f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka 67f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka public void setShiftLocked(boolean newShiftLockState) { 68f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka final int oldState = mState; 69f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka if (newShiftLockState) { 70d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka switch (oldState) { 71d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka case NORMAL: 72d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka case MANUAL_SHIFTED: 73d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka case MANUAL_SHIFTED_FROM_AUTO: 74d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka case AUTO_SHIFTED: 75f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka mState = SHIFT_LOCKED; 76d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka break; 77d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka } 78f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } else { 79d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka switch (oldState) { 80d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka case SHIFT_LOCKED: 81d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka case SHIFT_LOCK_SHIFTED: 82f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka mState = NORMAL; 83d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka break; 84d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka } 85f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 86f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka if (DEBUG) 8745911256fd4e32880e33c42259b19e8d7af70cb1Tadashi G. Takaoka Log.d(TAG, "setShiftLocked(" + newShiftLockState + "): " + toString(oldState) 8845911256fd4e32880e33c42259b19e8d7af70cb1Tadashi G. Takaoka + " > " + this); 89f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 90f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka 91f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka public void setAutomaticTemporaryUpperCase() { 92f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka final int oldState = mState; 93f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka mState = AUTO_SHIFTED; 94f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka if (DEBUG) 95f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka Log.d(TAG, "setAutomaticTemporaryUpperCase: " + toString(oldState) + " > " + this); 96f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 97f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka 98f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka public boolean isShiftedOrShiftLocked() { 99f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka return mState != NORMAL; 100f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 101f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka 102f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka public boolean isShiftLocked() { 103f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka return mState == SHIFT_LOCKED || mState == SHIFT_LOCK_SHIFTED; 104f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 105f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka 106628ca7a8549ddbb908f6aacb8fd9707f852e653fTadashi G. Takaoka public boolean isShiftLockShifted() { 107628ca7a8549ddbb908f6aacb8fd9707f852e653fTadashi G. Takaoka return mState == SHIFT_LOCK_SHIFTED; 108628ca7a8549ddbb908f6aacb8fd9707f852e653fTadashi G. Takaoka } 109628ca7a8549ddbb908f6aacb8fd9707f852e653fTadashi G. Takaoka 110f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka public boolean isAutomaticTemporaryUpperCase() { 111f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka return mState == AUTO_SHIFTED; 112f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 113f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka 114f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka public boolean isManualTemporaryUpperCase() { 115d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka return mState == MANUAL_SHIFTED || mState == MANUAL_SHIFTED_FROM_AUTO 116d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka || mState == SHIFT_LOCK_SHIFTED; 117d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka } 118d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka 119d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka public boolean isManualTemporaryUpperCaseFromAuto() { 120d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka return mState == MANUAL_SHIFTED_FROM_AUTO; 121f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 122f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka 123f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka @Override 124f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka public String toString() { 125f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka return toString(mState); 126f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 127f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka 128f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka private static String toString(int state) { 129f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka switch (state) { 130f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka case NORMAL: return "NORMAL"; 131f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka case MANUAL_SHIFTED: return "MANUAL_SHIFTED"; 132d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka case MANUAL_SHIFTED_FROM_AUTO: return "MANUAL_SHIFTED_FROM_AUTO"; 133f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka case AUTO_SHIFTED: return "AUTO_SHIFTED"; 134d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka case SHIFT_LOCKED: return "SHIFT_LOCKED"; 135f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka case SHIFT_LOCK_SHIFTED: return "SHIFT_LOCK_SHIFTED"; 136f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka default: return "UKNOWN"; 137f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 138f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 1395a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka} 140