KeyboardSwitcher.java revision b19668cfc17ad30afcc3c8c0407d47238ce1a90d
1923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project/*
2923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * Copyright (C) 2008 Google Inc.
3923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project *
4923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * use this file except in compliance with the License. You may obtain a copy of
6923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * the License at
7923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project *
8923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0
9923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project *
10923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * License for the specific language governing permissions and limitations under
14923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * the License.
15923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project */
16923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
17923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectpackage com.android.inputmethod.latin;
18923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
19353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballingerimport java.util.HashMap;
20353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballingerimport java.util.Map;
21923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
22923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Projectpublic class KeyboardSwitcher {
23923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
24923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    public static final int MODE_TEXT = 1;
25923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    public static final int MODE_SYMBOLS = 2;
26923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    public static final int MODE_PHONE = 3;
27923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    public static final int MODE_URL = 4;
28923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    public static final int MODE_EMAIL = 5;
29923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    public static final int MODE_IM = 6;
30923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
31923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    public static final int MODE_TEXT_QWERTY = 0;
32923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    public static final int MODE_TEXT_ALPHA = 1;
33923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    public static final int MODE_TEXT_COUNT = 2;
34923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
35923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    public static final int KEYBOARDMODE_NORMAL = R.id.mode_normal;
36923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    public static final int KEYBOARDMODE_URL = R.id.mode_url;
37923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    public static final int KEYBOARDMODE_EMAIL = R.id.mode_email;
38923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    public static final int KEYBOARDMODE_IM = R.id.mode_im;
39923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
40b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani    private static final int SYMBOLS_MODE_STATE_NONE = 0;
41b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani    private static final int SYMBOLS_MODE_STATE_BEGIN = 1;
42b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani    private static final int SYMBOLS_MODE_STATE_SYMBOL = 2;
43b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani
44923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    LatinKeyboardView mInputView;
45923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    LatinIME mContext;
46923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
47353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger    private KeyboardId mSymbolsId;
48353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger    private KeyboardId mSymbolsShiftedId;
49353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger
50353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger    private KeyboardId mCurrentId;
51353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger    private Map<KeyboardId, LatinKeyboard> mKeyboards;
52923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
53923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    private int mMode;
54923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    private int mImeOptions;
55923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    private int mTextMode = MODE_TEXT_QWERTY;
56353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger    private boolean mIsSymbols;
57b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani    private int mSymbolsModeState = SYMBOLS_MODE_STATE_NONE;
58923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
59923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    private int mLastDisplayWidth;
60923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
61923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    KeyboardSwitcher(LatinIME context) {
62923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        mContext = context;
63353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        mKeyboards = new HashMap<KeyboardId, LatinKeyboard>();
64353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        mSymbolsId = new KeyboardId(R.xml.kbd_symbols);
65353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        mSymbolsShiftedId = new KeyboardId(R.xml.kbd_symbols_shift);
66923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    }
67923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
68923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    void setInputView(LatinKeyboardView inputView) {
69923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        mInputView = inputView;
70923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    }
71923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
72923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    void makeKeyboards() {
73923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        // Configuration change is coming after the keyboard gets recreated. So don't rely on that.
74923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        // If keyboards have already been made, check if we have a screen width change and
75923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        // create the keyboard layouts again at the correct orientation
76353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        int displayWidth = mContext.getMaxWidth();
77353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        if (displayWidth == mLastDisplayWidth) return;
78353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        mLastDisplayWidth = displayWidth;
79353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        mKeyboards.clear();
800221514bd1360c7bfcf6eeaa920da49557c5fd2aBrandon Ballinger        mSymbolsId = new KeyboardId(R.xml.kbd_symbols);
810221514bd1360c7bfcf6eeaa920da49557c5fd2aBrandon Ballinger        mSymbolsShiftedId = new KeyboardId(R.xml.kbd_symbols_shift);
82353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger    }
83353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger
84353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger    /**
85353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger     * Represents the parameters necessary to construct a new LatinKeyboard,
86353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger     * which also serve as a unique identifier for each keyboard type.
87353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger     */
88353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger    private static class KeyboardId {
89353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        public int mXml;
90353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        public int mMode;
91353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        public boolean mEnableShiftLock;
92353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger
93353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        public KeyboardId(int xml, int mode, boolean enableShiftLock) {
94353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            this.mXml = xml;
95353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            this.mMode = mode;
96353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            this.mEnableShiftLock = enableShiftLock;
97353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        }
98353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger
99353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        public KeyboardId(int xml) {
100353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            this(xml, 0, false);
101353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        }
102353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger
103353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        public boolean equals(Object other) {
104353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            return other instanceof KeyboardId && equals((KeyboardId) other);
105353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        }
106353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger
107353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        public boolean equals(KeyboardId other) {
108353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            return other.mXml == this.mXml && other.mMode == this.mMode;
109353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        }
110353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger
111353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        public int hashCode() {
112353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            return (mXml + 1) * (mMode + 1) * (mEnableShiftLock ? 2 : 1);
113923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        }
114923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    }
115923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
116923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    void setKeyboardMode(int mode, int imeOptions) {
117353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        setKeyboardMode(mode, imeOptions, false);
118353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger    }
119353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger
120353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger    void setKeyboardMode(int mode, int imeOptions, boolean isSymbols) {
121923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        mMode = mode;
122923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        mImeOptions = imeOptions;
123c5bb4591b67b165f007e29bd9424d319ac3c7c28Brandon Ballinger        mIsSymbols = isSymbols;
124923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        mInputView.setPreviewEnabled(true);
125353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        KeyboardId id = getKeyboardId(mode, imeOptions, isSymbols);
126353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        LatinKeyboard keyboard = getKeyboard(id);
127353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger
128353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        if (mode == MODE_PHONE) {
129353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            mInputView.setPhoneKeyboard(keyboard);
130353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            mInputView.setPreviewEnabled(false);
131353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        }
132353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger
133353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        mCurrentId = id;
134353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        mInputView.setKeyboard(keyboard);
135353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        keyboard.setShifted(false);
136353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        keyboard.setShiftLocked(keyboard.isShiftLocked());
137353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        keyboard.setImeOptions(mContext.getResources(), mMode, imeOptions);
138353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger
139353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger    }
140353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger
141353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger    private LatinKeyboard getKeyboard(KeyboardId id) {
142353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        if (!mKeyboards.containsKey(id)) {
143353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            LatinKeyboard keyboard = new LatinKeyboard(
144353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger                mContext, id.mXml, id.mMode);
145353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            if (id.mEnableShiftLock) {
146353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger                keyboard.enableShiftLock();
147353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            }
148353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            mKeyboards.put(id, keyboard);
149353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        }
150353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        return mKeyboards.get(id);
151353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger    }
152353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger
153353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger    private KeyboardId getKeyboardId(int mode, int imeOptions, boolean isSymbols) {
154353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        if (isSymbols) {
155353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            return (mode == MODE_PHONE)
156353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger                ? new KeyboardId(R.xml.kbd_phone_symbols) : new KeyboardId(R.xml.kbd_symbols);
157353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        }
158353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger
159923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        switch (mode) {
160923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project            case MODE_TEXT:
161923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project                if (mTextMode == MODE_TEXT_QWERTY) {
162353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger                    return new KeyboardId(R.xml.kbd_qwerty, KEYBOARDMODE_NORMAL, true);
163923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project                } else if (mTextMode == MODE_TEXT_ALPHA) {
164353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger                    return new KeyboardId(R.xml.kbd_alpha, KEYBOARDMODE_NORMAL, true);
165923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project                }
166923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project                break;
167923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project            case MODE_SYMBOLS:
168353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger                return new KeyboardId(R.xml.kbd_symbols);
169923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project            case MODE_PHONE:
170353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger                return new KeyboardId(R.xml.kbd_phone);
171923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project            case MODE_URL:
172353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger                return new KeyboardId(R.xml.kbd_qwerty, KEYBOARDMODE_URL, true);
173923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project            case MODE_EMAIL:
174353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger                return new KeyboardId(R.xml.kbd_qwerty, KEYBOARDMODE_EMAIL, true);
175923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project            case MODE_IM:
176353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger                return new KeyboardId(R.xml.kbd_qwerty, KEYBOARDMODE_IM, true);
177923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        }
178353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        return null;
179923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    }
180923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
181923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    int getKeyboardMode() {
182923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        return mMode;
183923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    }
184923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
185923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    boolean isTextMode() {
186923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        return mMode == MODE_TEXT;
187923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    }
188923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
189923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    int getTextMode() {
190923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        return mTextMode;
191923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    }
192923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
193923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    void setTextMode(int position) {
194923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        if (position < MODE_TEXT_COUNT && position >= 0) {
195923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project            mTextMode = position;
196923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        }
197923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        if (isTextMode()) {
198923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project            setKeyboardMode(MODE_TEXT, mImeOptions);
199923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        }
200923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    }
201923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
202923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    int getTextModeCount() {
203923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        return MODE_TEXT_COUNT;
204923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    }
205923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
206923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    boolean isAlphabetMode() {
207353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        KeyboardId current = mCurrentId;
208353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        return current.mMode == KEYBOARDMODE_NORMAL
209353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            || current.mMode == KEYBOARDMODE_URL
210353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            || current.mMode == KEYBOARDMODE_EMAIL
211353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            || current.mMode == KEYBOARDMODE_IM;
212923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    }
213923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
214923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    void toggleShift() {
215353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        if (mCurrentId.equals(mSymbolsId)) {
216353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            LatinKeyboard symbolsKeyboard = getKeyboard(mSymbolsId);
217353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            LatinKeyboard symbolsShiftedKeyboard = getKeyboard(mSymbolsShiftedId);
218353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            symbolsKeyboard.setShifted(true);
219353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            mCurrentId = mSymbolsShiftedId;
220353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            mInputView.setKeyboard(symbolsShiftedKeyboard);
221353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            symbolsShiftedKeyboard.setShifted(true);
222353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            symbolsShiftedKeyboard.setImeOptions(mContext.getResources(), mMode, mImeOptions);
223353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger        } else if (mCurrentId.equals(mSymbolsShiftedId)) {
224353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            LatinKeyboard symbolsKeyboard = getKeyboard(mSymbolsId);
225353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            LatinKeyboard symbolsShiftedKeyboard = getKeyboard(mSymbolsShiftedId);
226353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            symbolsShiftedKeyboard.setShifted(false);
227353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            mCurrentId = mSymbolsId;
228353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            mInputView.setKeyboard(getKeyboard(mSymbolsId));
229353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            symbolsKeyboard.setShifted(false);
230353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger            symbolsKeyboard.setImeOptions(mContext.getResources(), mMode, mImeOptions);
231923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project        }
232923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    }
233923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
234923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    void toggleSymbols() {
235c5bb4591b67b165f007e29bd9424d319ac3c7c28Brandon Ballinger        setKeyboardMode(mMode, mImeOptions, !mIsSymbols);
236b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani        if (mIsSymbols) {
237b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani            mSymbolsModeState = SYMBOLS_MODE_STATE_BEGIN;
238b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani        } else {
239b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani            mSymbolsModeState = SYMBOLS_MODE_STATE_NONE;
240b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani        }
241b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani    }
242b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani
243b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani    /**
244b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani     * Updates state machine to figure out when to automatically switch back to alpha mode.
245b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani     * Returns true if the keyboard needs to switch back
246b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani     */
247b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani    boolean onKey(int key) {
248b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani        // Switch back to alpha mode if user types one or more non-space characters followed by
249b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani        // a space.
250b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani        switch (mSymbolsModeState) {
251b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani            case SYMBOLS_MODE_STATE_BEGIN:
252b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani                if (key != ' ' && key > 0) mSymbolsModeState = SYMBOLS_MODE_STATE_SYMBOL;
253b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani                break;
254b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani            case SYMBOLS_MODE_STATE_SYMBOL:
255b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani                if (key == ' ') return true;
256b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani                break;
257b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani        }
258b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani        return false;
259923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    }
260923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project}
261