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