140a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka/*
28632bff2d5a8e1160989008dea6eff4b94b065ddTadashi G. Takaoka * Copyright (C) 2010 The Android Open Source Project
340a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka *
440a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License"); you may not
540a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka * use this file except in compliance with the License. You may obtain a copy of
640a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka * the License at
740a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka *
840a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka * http://www.apache.org/licenses/LICENSE-2.0
940a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka *
1040a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka * Unless required by applicable law or agreed to in writing, software
1140a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
1240a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
1340a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka * License for the specific language governing permissions and limitations under
1440a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka * the License.
1540a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka */
1640a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka
1772934bd5967d0127f71fd4d66158b18b4e6ceefeTadashi G. Takaokapackage com.android.inputmethod.keyboard.internal;
1840a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka
19f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaokaimport android.util.Log;
20f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka
2172934bd5967d0127f71fd4d66158b18b4e6ceefeTadashi G. Takaokaimport com.android.inputmethod.keyboard.KeyboardSwitcher;
2272934bd5967d0127f71fd4d66158b18b4e6ceefeTadashi G. Takaoka
23889691eca1ad991a85fb721deb37ecba6a913762Tadashi G. Takaokapublic class ModifierKeyState {
24f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka    protected static final String TAG = "ModifierKeyState";
25f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka    protected static final boolean DEBUG = KeyboardSwitcher.DEBUG_STATE;
26f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka
27889691eca1ad991a85fb721deb37ecba6a913762Tadashi G. Takaoka    protected static final int RELEASING = 0;
28889691eca1ad991a85fb721deb37ecba6a913762Tadashi G. Takaoka    protected static final int PRESSING = 1;
29889691eca1ad991a85fb721deb37ecba6a913762Tadashi G. Takaoka    protected static final int MOMENTARY = 2;
3040a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka
31f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka    protected final String mName;
32889691eca1ad991a85fb721deb37ecba6a913762Tadashi G. Takaoka    protected int mState = RELEASING;
3340a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka
34f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka    public ModifierKeyState(String name) {
35f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka        mName = name;
36f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka    }
37f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka
3840a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka    public void onPress() {
39f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka        final int oldState = mState;
4040a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka        mState = PRESSING;
41f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka        if (DEBUG)
42f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka            Log.d(TAG, mName + ".onPress: " + toString(oldState) + " > " + this);
4340a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka    }
4440a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka
4540a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka    public void onRelease() {
46f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka        final int oldState = mState;
4740a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka        mState = RELEASING;
48f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka        if (DEBUG)
49f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka            Log.d(TAG, mName + ".onRelease: " + toString(oldState) + " > " + this);
5040a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka    }
5140a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka
5240a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka    public void onOtherKeyPressed() {
53f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka        final int oldState = mState;
546769c67987f323008647f5d029c02f8cc95272eeTadashi G. Takaoka        if (oldState == PRESSING)
55f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka            mState = MOMENTARY;
56f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka        if (DEBUG)
57f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka            Log.d(TAG, mName + ".onOtherKeyPressed: " + toString(oldState) + " > " + this);
5840a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka    }
5940a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka
609e91472285a1b903631f1e3c998f5aa1efd3e98eTadashi G. Takaoka    public boolean isPressing() {
619e91472285a1b903631f1e3c998f5aa1efd3e98eTadashi G. Takaoka        return mState == PRESSING;
629e91472285a1b903631f1e3c998f5aa1efd3e98eTadashi G. Takaoka    }
639e91472285a1b903631f1e3c998f5aa1efd3e98eTadashi G. Takaoka
6445911256fd4e32880e33c42259b19e8d7af70cb1Tadashi G. Takaoka    public boolean isReleasing() {
6545911256fd4e32880e33c42259b19e8d7af70cb1Tadashi G. Takaoka        return mState == RELEASING;
6645911256fd4e32880e33c42259b19e8d7af70cb1Tadashi G. Takaoka    }
6745911256fd4e32880e33c42259b19e8d7af70cb1Tadashi G. Takaoka
6840a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka    public boolean isMomentary() {
6940a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka        return mState == MOMENTARY;
7040a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka    }
71f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka
72f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka    @Override
73f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka    public String toString() {
74f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka        return toString(mState);
75f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka    }
76f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka
776769c67987f323008647f5d029c02f8cc95272eeTadashi G. Takaoka    protected String toString(int state) {
78f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka        switch (state) {
79f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka        case RELEASING: return "RELEASING";
80f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka        case PRESSING: return "PRESSING";
81f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka        case MOMENTARY: return "MOMENTARY";
82f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka        default: return "UNKNOWN";
83f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka        }
84f27364600c742509b48857e6b8f17312033e0dc7Tadashi G. Takaoka    }
8540a05f62edc6cdedb4365a722b48a72826ef2bf6Tadashi G. Takaoka}
86