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