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 21a28a05e971cc242b338331a3b78276fa95188d19Tadashi G. Takaokapublic final class AlphabetShiftState { 22ca2f051cc173acc3bce384ebfe08068564bc8e07Tadashi G. Takaoka private static final String TAG = AlphabetShiftState.class.getSimpleName(); 23930a55b846a2bdff76bf082879470310ff6eaf36Tadashi G. Takaoka private static final boolean DEBUG = false; 24f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka 25ca2f051cc173acc3bce384ebfe08068564bc8e07Tadashi G. Takaoka private static final int UNSHIFTED = 0; 26f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka private static final int MANUAL_SHIFTED = 1; 27d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka private static final int MANUAL_SHIFTED_FROM_AUTO = 2; 28ca2f051cc173acc3bce384ebfe08068564bc8e07Tadashi G. Takaoka private static final int AUTOMATIC_SHIFTED = 3; 29d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka private static final int SHIFT_LOCKED = 4; 30d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka private static final int SHIFT_LOCK_SHIFTED = 5; 31f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka 32ca2f051cc173acc3bce384ebfe08068564bc8e07Tadashi G. Takaoka private int mState = UNSHIFTED; 33f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka 344f7f61730cbd45871c1e9044da84b494831f97c3Tadashi G. Takaoka public void setShifted(boolean newShiftState) { 35f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka final int oldState = mState; 36f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka if (newShiftState) { 37d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka switch (oldState) { 38ca2f051cc173acc3bce384ebfe08068564bc8e07Tadashi G. Takaoka case UNSHIFTED: 39f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka mState = MANUAL_SHIFTED; 40d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka break; 41ca2f051cc173acc3bce384ebfe08068564bc8e07Tadashi G. Takaoka case AUTOMATIC_SHIFTED: 42d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka mState = MANUAL_SHIFTED_FROM_AUTO; 43d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka break; 44d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka case SHIFT_LOCKED: 45f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka mState = SHIFT_LOCK_SHIFTED; 46d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka break; 47f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 48f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } else { 49d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka switch (oldState) { 50d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka case MANUAL_SHIFTED: 51d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka case MANUAL_SHIFTED_FROM_AUTO: 52ca2f051cc173acc3bce384ebfe08068564bc8e07Tadashi G. Takaoka case AUTOMATIC_SHIFTED: 53ca2f051cc173acc3bce384ebfe08068564bc8e07Tadashi G. Takaoka mState = UNSHIFTED; 54d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka break; 55d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka case SHIFT_LOCK_SHIFTED: 56f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka mState = SHIFT_LOCKED; 57d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka break; 58d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka } 59f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 60f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka if (DEBUG) 6145911256fd4e32880e33c42259b19e8d7af70cb1Tadashi G. Takaoka Log.d(TAG, "setShifted(" + newShiftState + "): " + toString(oldState) + " > " + this); 62f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 63f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka 64f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka public void setShiftLocked(boolean newShiftLockState) { 65f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka final int oldState = mState; 66f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka if (newShiftLockState) { 67d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka switch (oldState) { 68ca2f051cc173acc3bce384ebfe08068564bc8e07Tadashi G. Takaoka case UNSHIFTED: 69d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka case MANUAL_SHIFTED: 70d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka case MANUAL_SHIFTED_FROM_AUTO: 71ca2f051cc173acc3bce384ebfe08068564bc8e07Tadashi G. Takaoka case AUTOMATIC_SHIFTED: 72f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka mState = SHIFT_LOCKED; 73d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka break; 74d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka } 75f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } else { 76ca2f051cc173acc3bce384ebfe08068564bc8e07Tadashi G. Takaoka mState = UNSHIFTED; 77f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 78f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka if (DEBUG) 7945911256fd4e32880e33c42259b19e8d7af70cb1Tadashi G. Takaoka Log.d(TAG, "setShiftLocked(" + newShiftLockState + "): " + toString(oldState) 8045911256fd4e32880e33c42259b19e8d7af70cb1Tadashi G. Takaoka + " > " + this); 81f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 82f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka 83ca2f051cc173acc3bce384ebfe08068564bc8e07Tadashi G. Takaoka public void setAutomaticShifted() { 84f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka final int oldState = mState; 85ca2f051cc173acc3bce384ebfe08068564bc8e07Tadashi G. Takaoka mState = AUTOMATIC_SHIFTED; 86f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka if (DEBUG) 87ca2f051cc173acc3bce384ebfe08068564bc8e07Tadashi G. Takaoka Log.d(TAG, "setAutomaticShifted: " + toString(oldState) + " > " + this); 88f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 89f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka 90f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka public boolean isShiftedOrShiftLocked() { 91ca2f051cc173acc3bce384ebfe08068564bc8e07Tadashi G. Takaoka return mState != UNSHIFTED; 92f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 93f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka 94f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka public boolean isShiftLocked() { 95f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka return mState == SHIFT_LOCKED || mState == SHIFT_LOCK_SHIFTED; 96f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 97f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka 9842e8c64a042476f555da5015558d51f96aaeb7fdTadashi G. Takaoka public boolean isShiftLockShifted() { 9942e8c64a042476f555da5015558d51f96aaeb7fdTadashi G. Takaoka return mState == SHIFT_LOCK_SHIFTED; 10042e8c64a042476f555da5015558d51f96aaeb7fdTadashi G. Takaoka } 10142e8c64a042476f555da5015558d51f96aaeb7fdTadashi G. Takaoka 102ca2f051cc173acc3bce384ebfe08068564bc8e07Tadashi G. Takaoka public boolean isAutomaticShifted() { 103ca2f051cc173acc3bce384ebfe08068564bc8e07Tadashi G. Takaoka return mState == AUTOMATIC_SHIFTED; 104f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 105f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka 106ca2f051cc173acc3bce384ebfe08068564bc8e07Tadashi G. Takaoka public boolean isManualShifted() { 107d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka return mState == MANUAL_SHIFTED || mState == MANUAL_SHIFTED_FROM_AUTO 108d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka || mState == SHIFT_LOCK_SHIFTED; 109d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka } 110d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka 111ca2f051cc173acc3bce384ebfe08068564bc8e07Tadashi G. Takaoka public boolean isManualShiftedFromAutomaticShifted() { 112d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka return mState == MANUAL_SHIFTED_FROM_AUTO; 113f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 114f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka 115f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka @Override 116f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka public String toString() { 117f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka return toString(mState); 118f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 119f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka 120f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka private static String toString(int state) { 121f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka switch (state) { 122ca2f051cc173acc3bce384ebfe08068564bc8e07Tadashi G. Takaoka case UNSHIFTED: return "UNSHIFTED"; 123f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka case MANUAL_SHIFTED: return "MANUAL_SHIFTED"; 124d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka case MANUAL_SHIFTED_FROM_AUTO: return "MANUAL_SHIFTED_FROM_AUTO"; 125ca2f051cc173acc3bce384ebfe08068564bc8e07Tadashi G. Takaoka case AUTOMATIC_SHIFTED: return "AUTOMATIC_SHIFTED"; 126d01ae897d38d4e788e4f089e2b1d6d74655847c6Tadashi G. Takaoka case SHIFT_LOCKED: return "SHIFT_LOCKED"; 127f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka case SHIFT_LOCK_SHIFTED: return "SHIFT_LOCK_SHIFTED"; 128ca2f051cc173acc3bce384ebfe08068564bc8e07Tadashi G. Takaoka default: return "UNKNOWN"; 129f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 130f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka } 1315a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka} 132