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