KeyboardSwitcher.java revision 6686e63f2158eff07e39ff002ba211d0578f2a4f
1923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project/*
2443c360d0afdbab091994244f045f4756feaf2b4Jean-Baptiste Queru * Copyright (C) 2008 The Android Open Source Project
3571bdb401f670b92bd7710a12a990cb65a99b7d3Tadashi G. Takaoka *
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
7571bdb401f670b92bd7710a12a990cb65a99b7d3Tadashi G. Takaoka *
8923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0
9571bdb401f670b92bd7710a12a990cb65a99b7d3Tadashi G. Takaoka *
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
17571bdb401f670b92bd7710a12a990cb65a99b7d3Tadashi G. Takaokapackage com.android.inputmethod.keyboard;
18923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
19c150acc7c85ff2f5eeb5bd2c6ff288df4e46a355Tadashi G. Takaokaimport android.content.Context;
20c150acc7c85ff2f5eeb5bd2c6ff288df4e46a355Tadashi G. Takaokaimport android.content.SharedPreferences;
21c150acc7c85ff2f5eeb5bd2c6ff288df4e46a355Tadashi G. Takaokaimport android.content.res.Resources;
22c150acc7c85ff2f5eeb5bd2c6ff288df4e46a355Tadashi G. Takaokaimport android.util.Log;
2313a741999480343ccebd81ff6349b572bde17b07Tadashi G. Takaokaimport android.view.ContextThemeWrapper;
24c150acc7c85ff2f5eeb5bd2c6ff288df4e46a355Tadashi G. Takaokaimport android.view.LayoutInflater;
25c150acc7c85ff2f5eeb5bd2c6ff288df4e46a355Tadashi G. Takaokaimport android.view.View;
26c150acc7c85ff2f5eeb5bd2c6ff288df4e46a355Tadashi G. Takaokaimport android.view.inputmethod.EditorInfo;
27c150acc7c85ff2f5eeb5bd2c6ff288df4e46a355Tadashi G. Takaoka
285ac4638f999db4fea8a9e24171dbceb640a10858Alan Viveretteimport com.android.inputmethod.accessibility.AccessibleKeyboardViewProxy;
2911d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaokaimport com.android.inputmethod.keyboard.KeyboardLayoutSet.KeyboardLayoutSetException;
300ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaokaimport com.android.inputmethod.keyboard.PointerTracker.TimerProxy;
31b88c9acd88348c160e3d114593660bfd362bee29Tadashi G. Takaokaimport com.android.inputmethod.keyboard.internal.KeyboardState;
3206b7c256b1992f93aab0e2cdb90f57718f0631fdTadashi G. Takaokaimport com.android.inputmethod.latin.DebugSettings;
33fd60b2f97035382b14dce207b3613711982a613eTadashi G. Takaokaimport com.android.inputmethod.latin.ImfUtils;
34f451ed2012df7eb080de045a93a494aecd2775b4Tadashi G. Takaokaimport com.android.inputmethod.latin.InputView;
35571bdb401f670b92bd7710a12a990cb65a99b7d3Tadashi G. Takaokaimport com.android.inputmethod.latin.LatinIME;
36571bdb401f670b92bd7710a12a990cb65a99b7d3Tadashi G. Takaokaimport com.android.inputmethod.latin.LatinImeLogger;
37571bdb401f670b92bd7710a12a990cb65a99b7d3Tadashi G. Takaokaimport com.android.inputmethod.latin.R;
387a16a061e622539e54d7d649dcb8d4965aea575aJean Chalardimport com.android.inputmethod.latin.SettingsValues;
39571bdb401f670b92bd7710a12a990cb65a99b7d3Tadashi G. Takaokaimport com.android.inputmethod.latin.SubtypeSwitcher;
40adbd9ae105e06287b59379d7f7127d95fd0663f4Jean Chalardimport com.android.inputmethod.latin.WordComposer;
415a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka
42a28a05e971cc242b338331a3b78276fa95188d19Tadashi G. Takaokapublic final class KeyboardSwitcher implements KeyboardState.SwitchActions {
43c25e07d21261583d0eeca5aa0fb6e3ffe93dc603Tadashi G. Takaoka    private static final String TAG = KeyboardSwitcher.class.getSimpleName();
44923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
452d9722e46c774d51c834c3a8b11261a2a22e09d3Ken Wakasa    public static final String PREF_KEYBOARD_LAYOUT = "pref_keyboard_layout_20110916";
46411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka
47a28a05e971cc242b338331a3b78276fa95188d19Tadashi G. Takaoka    static final class KeyboardTheme {
48411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka        public final int mThemeId;
49411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka        public final int mStyleId;
50411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka
511f05cf6dab45c21d1ed334247929434d97c40584Tadashi G. Takaoka        // Note: The themeId should be aligned with "themeId" attribute of Keyboard style
521f05cf6dab45c21d1ed334247929434d97c40584Tadashi G. Takaoka        // in values/style.xml.
531f05cf6dab45c21d1ed334247929434d97c40584Tadashi G. Takaoka        public KeyboardTheme(int themeId, int styleId) {
54411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka            mThemeId = themeId;
55411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka            mStyleId = styleId;
56411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka        }
57411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka    }
58411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka
59411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka    private static final KeyboardTheme[] KEYBOARD_THEMES = {
601f05cf6dab45c21d1ed334247929434d97c40584Tadashi G. Takaoka        new KeyboardTheme(0, R.style.KeyboardTheme),
611f05cf6dab45c21d1ed334247929434d97c40584Tadashi G. Takaoka        new KeyboardTheme(1, R.style.KeyboardTheme_HighContrast),
621f05cf6dab45c21d1ed334247929434d97c40584Tadashi G. Takaoka        new KeyboardTheme(6, R.style.KeyboardTheme_Stone),
631f05cf6dab45c21d1ed334247929434d97c40584Tadashi G. Takaoka        new KeyboardTheme(7, R.style.KeyboardTheme_Stone_Bold),
641f05cf6dab45c21d1ed334247929434d97c40584Tadashi G. Takaoka        new KeyboardTheme(8, R.style.KeyboardTheme_Gingerbread),
651f05cf6dab45c21d1ed334247929434d97c40584Tadashi G. Takaoka        new KeyboardTheme(5, R.style.KeyboardTheme_IceCreamSandwich),
6675fde6489039c09056fb5e64d39630ece5ad57cfTadashi G. Takaoka    };
67979f8690967ff5409fe18f5085858ccdb8e0ccf1satok
680ed7191b4d1013a0b9d2fd1f26733dee7364871dsatok    private SubtypeSwitcher mSubtypeSwitcher;
6927d13713bbb291d25a910f97d88a81fdbabddc0eKen Wakasa    private SharedPreferences mPrefs;
7006b7c256b1992f93aab0e2cdb90f57718f0631fdTadashi G. Takaoka    private boolean mForceNonDistinctMultitouch;
710ed7191b4d1013a0b9d2fd1f26733dee7364871dsatok
72f451ed2012df7eb080de045a93a494aecd2775b4Tadashi G. Takaoka    private InputView mCurrentInputView;
73c8e45ddb032554f4e9d4411d8ef47d98db62d77bTadashi G. Takaoka    private MainKeyboardView mKeyboardView;
7416950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka    private LatinIME mLatinIME;
750a054dd1075d679385434ecef38a3d88c7551d7aTadashi G. Takaoka    private Resources mResources;
7631adfa78e2edae188edb05e869f9f68798857582satok
77b88c9acd88348c160e3d114593660bfd362bee29Tadashi G. Takaoka    private KeyboardState mState;
78889691eca1ad991a85fb721deb37ecba6a913762Tadashi G. Takaoka
7911d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka    private KeyboardLayoutSet mKeyboardLayoutSet;
80353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger
811b1f7f907f6c7d6e849c88ca06c3608bc84d7c5fTadashi G. Takaoka    /** mIsAutoCorrectionActive indicates that auto corrected word will be input instead of
8241feaaadb758a8b31d3e436063b4b5faed104d4dsatok     * what user actually typed. */
831b1f7f907f6c7d6e849c88ca06c3608bc84d7c5fTadashi G. Takaoka    private boolean mIsAutoCorrectionActive;
849e91472285a1b903631f1e3c998f5aa1efd3e98eTadashi G. Takaoka
85411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka    private KeyboardTheme mKeyboardTheme = KEYBOARD_THEMES[0];
865a2d0630474d6df639e97ff48f5f48b220ca4ee9Tadashi G. Takaoka    private Context mThemeContext;
87979f8690967ff5409fe18f5085858ccdb8e0ccf1satok
880ed7191b4d1013a0b9d2fd1f26733dee7364871dsatok    private static final KeyboardSwitcher sInstance = new KeyboardSwitcher();
890ed7191b4d1013a0b9d2fd1f26733dee7364871dsatok
900ed7191b4d1013a0b9d2fd1f26733dee7364871dsatok    public static KeyboardSwitcher getInstance() {
910ed7191b4d1013a0b9d2fd1f26733dee7364871dsatok        return sInstance;
920ed7191b4d1013a0b9d2fd1f26733dee7364871dsatok    }
930ed7191b4d1013a0b9d2fd1f26733dee7364871dsatok
940ed7191b4d1013a0b9d2fd1f26733dee7364871dsatok    private KeyboardSwitcher() {
95e26ef1bccddc942fdaeada3409c8e8ff18a35008Tadashi G. Takaoka        // Intentional empty constructor for singleton.
960ed7191b4d1013a0b9d2fd1f26733dee7364871dsatok    }
970ed7191b4d1013a0b9d2fd1f26733dee7364871dsatok
9816950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka    public static void init(LatinIME latinIme, SharedPreferences prefs) {
9916950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        sInstance.initInternal(latinIme, prefs);
100364f1fd1f84cca6c8d396064bfd8bc8fd1efefcbTadashi G. Takaoka    }
101364f1fd1f84cca6c8d396064bfd8bc8fd1efefcbTadashi G. Takaoka
10216950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka    private void initInternal(LatinIME latinIme, SharedPreferences prefs) {
10316950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        mLatinIME = latinIme;
10416950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        mResources = latinIme.getResources();
105364f1fd1f84cca6c8d396064bfd8bc8fd1efefcbTadashi G. Takaoka        mPrefs = prefs;
106364f1fd1f84cca6c8d396064bfd8bc8fd1efefcbTadashi G. Takaoka        mSubtypeSwitcher = SubtypeSwitcher.getInstance();
107eef6238f94b5046054d9ae9c06f775362893c0eeTadashi G. Takaoka        mState = new KeyboardState(this);
10816950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        setContextThemeWrapper(latinIme, getKeyboardTheme(latinIme, prefs));
10906b7c256b1992f93aab0e2cdb90f57718f0631fdTadashi G. Takaoka        mForceNonDistinctMultitouch = prefs.getBoolean(
11006b7c256b1992f93aab0e2cdb90f57718f0631fdTadashi G. Takaoka                DebugSettings.FORCE_NON_DISTINCT_MULTITOUCH_KEY, false);
1115a2d0630474d6df639e97ff48f5f48b220ca4ee9Tadashi G. Takaoka    }
112979f8690967ff5409fe18f5085858ccdb8e0ccf1satok
113411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka    private static KeyboardTheme getKeyboardTheme(Context context, SharedPreferences prefs) {
114411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka        final String defaultIndex = context.getString(R.string.config_default_keyboard_theme_index);
115411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka        final String themeIndex = prefs.getString(PREF_KEYBOARD_LAYOUT, defaultIndex);
11605ddb9a5d2b36f519a4de4b50448e258f40d2c0fTadashi G. Takaoka        try {
117411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka            final int index = Integer.valueOf(themeIndex);
118411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka            if (index >= 0 && index < KEYBOARD_THEMES.length) {
119411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka                return KEYBOARD_THEMES[index];
120411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka            }
12105ddb9a5d2b36f519a4de4b50448e258f40d2c0fTadashi G. Takaoka        } catch (NumberFormatException e) {
1225a2d0630474d6df639e97ff48f5f48b220ca4ee9Tadashi G. Takaoka            // Format error, keyboard theme is default to 0.
1235a2d0630474d6df639e97ff48f5f48b220ca4ee9Tadashi G. Takaoka        }
124411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka        Log.w(TAG, "Illegal keyboard theme in preference: " + themeIndex + ", default to 0");
125411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka        return KEYBOARD_THEMES[0];
1265a2d0630474d6df639e97ff48f5f48b220ca4ee9Tadashi G. Takaoka    }
1275a2d0630474d6df639e97ff48f5f48b220ca4ee9Tadashi G. Takaoka
128411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka    private void setContextThemeWrapper(Context context, KeyboardTheme keyboardTheme) {
129411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka        if (mKeyboardTheme.mThemeId != keyboardTheme.mThemeId) {
130411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka            mKeyboardTheme = keyboardTheme;
131411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka            mThemeContext = new ContextThemeWrapper(context, keyboardTheme.mStyleId);
13211d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka            KeyboardLayoutSet.clearKeyboardCache();
13305ddb9a5d2b36f519a4de4b50448e258f40d2c0fTadashi G. Takaoka        }
134979f8690967ff5409fe18f5085858ccdb8e0ccf1satok    }
135979f8690967ff5409fe18f5085858ccdb8e0ccf1satok
1367a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard    public void loadKeyboard(EditorInfo editorInfo, SettingsValues settingsValues) {
13711d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka        final KeyboardLayoutSet.Builder builder = new KeyboardLayoutSet.Builder(
13811d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka                mThemeContext, editorInfo);
1394731b67629e72d6c7cb391e3d188df78ceaff1e7Tadashi G. Takaoka        final Resources res = mThemeContext.getResources();
1404731b67629e72d6c7cb391e3d188df78ceaff1e7Tadashi G. Takaoka        builder.setScreenGeometry(res.getInteger(R.integer.config_device_form_factor),
1414731b67629e72d6c7cb391e3d188df78ceaff1e7Tadashi G. Takaoka                res.getConfiguration().orientation, res.getDisplayMetrics().widthPixels);
142cb389ef0d6e6eec737c249e1729c2a2cdc30f341Tadashi G. Takaoka        builder.setSubtype(mSubtypeSwitcher.getCurrentSubtype());
1434087ba69faec0dd89fae7d53d7527448091e0aadTadashi G. Takaoka        builder.setOptions(
1444087ba69faec0dd89fae7d53d7527448091e0aadTadashi G. Takaoka                settingsValues.isVoiceKeyEnabled(editorInfo),
14581d4e3cd66a9388c47c7dba55240ddf849b31934Tadashi G. Takaoka                settingsValues.isVoiceKeyOnMain(),
14681d4e3cd66a9388c47c7dba55240ddf849b31934Tadashi G. Takaoka                settingsValues.isLanguageSwitchKeyEnabled(mThemeContext));
14711d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka        mKeyboardLayoutSet = builder.build();
148979f8690967ff5409fe18f5085858ccdb8e0ccf1satok        try {
14960c4594ee6415b266b3418e46d09e6a5b3ed23e1Tadashi G. Takaoka            mState.onLoadKeyboard(mResources.getString(R.string.layout_switch_back_symbols));
15011d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka        } catch (KeyboardLayoutSetException e) {
15188e079ae6bbff1093b28f60e81d2befce1030495Tadashi G. Takaoka            Log.w(TAG, "loading keyboard failed: " + e.mKeyboardId, e.getCause());
15288e079ae6bbff1093b28f60e81d2befce1030495Tadashi G. Takaoka            LatinImeLogger.logOnException(e.mKeyboardId.toString(), e.getCause());
153645128af712961456a42cbcc34c0cdf5f0b40a83Tadashi G. Takaoka            return;
154645128af712961456a42cbcc34c0cdf5f0b40a83Tadashi G. Takaoka        }
155353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger    }
156353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger
15759f8ca752d5f79d4469519623590052c050c9d23Tadashi G. Takaoka    public void saveKeyboardState() {
158ca2f051cc173acc3bce384ebfe08068564bc8e07Tadashi G. Takaoka        if (getKeyboard() != null) {
15910dcc7eb672a561a1d9f510f4d2109dcab251e36Tadashi G. Takaoka            mState.onSaveKeyboardState();
1602e263b70d5769b52cba4a002e44dbf81db5de7f8Tadashi G. Takaoka        }
161055054eef3ccd32c6dfd69a3f76bfb7383ea93bbTadashi G. Takaoka    }
162055054eef3ccd32c6dfd69a3f76bfb7383ea93bbTadashi G. Takaoka
163055054eef3ccd32c6dfd69a3f76bfb7383ea93bbTadashi G. Takaoka    public void onFinishInputView() {
164055054eef3ccd32c6dfd69a3f76bfb7383ea93bbTadashi G. Takaoka        mIsAutoCorrectionActive = false;
165055054eef3ccd32c6dfd69a3f76bfb7383ea93bbTadashi G. Takaoka    }
166055054eef3ccd32c6dfd69a3f76bfb7383ea93bbTadashi G. Takaoka
167c3d175c01ff1956ddb1c2d608d69af1793b4ad8aTadashi G. Takaoka    public void onHideWindow() {
168c3d175c01ff1956ddb1c2d608d69af1793b4ad8aTadashi G. Takaoka        mIsAutoCorrectionActive = false;
169c3d175c01ff1956ddb1c2d608d69af1793b4ad8aTadashi G. Takaoka    }
170c3d175c01ff1956ddb1c2d608d69af1793b4ad8aTadashi G. Takaoka
171055054eef3ccd32c6dfd69a3f76bfb7383ea93bbTadashi G. Takaoka    private void setKeyboard(final Keyboard keyboard) {
1720657b9698a110f8e895448d829478982ce37b6d1Tadashi G. Takaoka        final MainKeyboardView keyboardView = mKeyboardView;
1730657b9698a110f8e895448d829478982ce37b6d1Tadashi G. Takaoka        final Keyboard oldKeyboard = keyboardView.getKeyboard();
1740657b9698a110f8e895448d829478982ce37b6d1Tadashi G. Takaoka        keyboardView.setKeyboard(keyboard);
175f451ed2012df7eb080de045a93a494aecd2775b4Tadashi G. Takaoka        mCurrentInputView.setKeyboardGeometry(keyboard.mTopPadding);
1760657b9698a110f8e895448d829478982ce37b6d1Tadashi G. Takaoka        keyboardView.setKeyPreviewPopupEnabled(
1777a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard                SettingsValues.isKeyPreviewPopupEnabled(mPrefs, mResources),
1787a16a061e622539e54d7d649dcb8d4965aea575aJean Chalard                SettingsValues.getKeyPreviewPopupDismissDelay(mPrefs, mResources));
1790657b9698a110f8e895448d829478982ce37b6d1Tadashi G. Takaoka        keyboardView.updateAutoCorrectionState(mIsAutoCorrectionActive);
1800657b9698a110f8e895448d829478982ce37b6d1Tadashi G. Takaoka        keyboardView.updateShortcutKey(mSubtypeSwitcher.isShortcutImeReady());
181dabf96896ef4c304c6dad36b307a2a458a58209dTadashi G. Takaoka        final boolean subtypeChanged = (oldKeyboard == null)
182dabf96896ef4c304c6dad36b307a2a458a58209dTadashi G. Takaoka                || !keyboard.mId.mLocale.equals(oldKeyboard.mId.mLocale);
1834c0c638a189c1073b1fb6e43fe5fddb6f9932038Tadashi G. Takaoka        final boolean needsToDisplayLanguage = mSubtypeSwitcher.needsToDisplayLanguage(
1844c0c638a189c1073b1fb6e43fe5fddb6f9932038Tadashi G. Takaoka                keyboard.mId.mLocale);
1850657b9698a110f8e895448d829478982ce37b6d1Tadashi G. Takaoka        keyboardView.startDisplayLanguageOnSpacebar(subtypeChanged, needsToDisplayLanguage,
186fd60b2f97035382b14dce207b3613711982a613eTadashi G. Takaoka                ImfUtils.hasMultipleEnabledIMEsOrSubtypes(mLatinIME, true));
187353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger    }
188353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger
1893708787fe91227083d2a1874fa41493d3bc9fe10Tadashi G. Takaoka    public Keyboard getKeyboard() {
190c150acc7c85ff2f5eeb5bd2c6ff288df4e46a355Tadashi G. Takaoka        if (mKeyboardView != null) {
1913708787fe91227083d2a1874fa41493d3bc9fe10Tadashi G. Takaoka            return mKeyboardView.getKeyboard();
192050c0462dc2ada5a5afecec5b6745693c5066b85Tadashi G. Takaoka        }
193b643dab73ab9527cc63d896cad81c0cdc92fe5f6Tadashi G. Takaoka        return null;
1941679432d1c8a8cfe6ff09be0a49792f4af91ab35Tadashi G. Takaoka    }
1951679432d1c8a8cfe6ff09be0a49792f4af91ab35Tadashi G. Takaoka
1960f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    /**
1970f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka     * Update keyboard shift state triggered by connected EditText status change.
1980f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka     */
1990f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    public void updateShiftState() {
20016950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        mState.onUpdateShiftState(mLatinIME.getCurrentAutoCapsState());
2010f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    }
2020f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka
2030f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    public void onPressKey(int code) {
204a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka        if (isVibrateAndSoundFeedbackRequired()) {
20516950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka            mLatinIME.hapticAndAudioFeedback(code);
206a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka        }
20716950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        mState.onPressKey(code, isSinglePointer(), mLatinIME.getCurrentAutoCapsState());
2080f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    }
2090f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka
2100f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    public void onReleaseKey(int code, boolean withSliding) {
2110f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka        mState.onReleaseKey(code, withSliding);
2120f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    }
2130f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka
2140f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    public void onCancelInput() {
2150f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka        mState.onCancelInput(isSinglePointer());
2160f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    }
2170f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka
2180f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
2190f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    @Override
2200f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    public void setAlphabetKeyboard() {
22111d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka        setKeyboard(mKeyboardLayoutSet.getKeyboard(KeyboardId.ELEMENT_ALPHABET));
222b643dab73ab9527cc63d896cad81c0cdc92fe5f6Tadashi G. Takaoka    }
223b643dab73ab9527cc63d896cad81c0cdc92fe5f6Tadashi G. Takaoka
2240f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
2250f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    @Override
2260f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    public void setAlphabetManualShiftedKeyboard() {
22711d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka        setKeyboard(mKeyboardLayoutSet.getKeyboard(KeyboardId.ELEMENT_ALPHABET_MANUAL_SHIFTED));
2286c92ee127df50509d364a2b6d428b223d2cbaa6eTadashi G. Takaoka    }
2296c92ee127df50509d364a2b6d428b223d2cbaa6eTadashi G. Takaoka
2300f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
2310f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    @Override
2320f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    public void setAlphabetAutomaticShiftedKeyboard() {
23311d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka        setKeyboard(mKeyboardLayoutSet.getKeyboard(KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED));
2345f922caff80d5067c5af2bbbae2731ef25c9572aTadashi G. Takaoka    }
2355f922caff80d5067c5af2bbbae2731ef25c9572aTadashi G. Takaoka
236eef6238f94b5046054d9ae9c06f775362893c0eeTadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
237eef6238f94b5046054d9ae9c06f775362893c0eeTadashi G. Takaoka    @Override
2380f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    public void setAlphabetShiftLockedKeyboard() {
23911d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka        setKeyboard(mKeyboardLayoutSet.getKeyboard(KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCKED));
2408a70e70c849cc2c5553c6fd79891c22893fd761bTadashi G. Takaoka    }
2418a70e70c849cc2c5553c6fd79891c22893fd761bTadashi G. Takaoka
242eef6238f94b5046054d9ae9c06f775362893c0eeTadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
243eef6238f94b5046054d9ae9c06f775362893c0eeTadashi G. Takaoka    @Override
244757f8d96eea3dfb5951243d2ebb4b763db868471Tadashi G. Takaoka    public void setAlphabetShiftLockShiftedKeyboard() {
24511d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka        setKeyboard(mKeyboardLayoutSet.getKeyboard(KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCK_SHIFTED));
246757f8d96eea3dfb5951243d2ebb4b763db868471Tadashi G. Takaoka    }
247757f8d96eea3dfb5951243d2ebb4b763db868471Tadashi G. Takaoka
248757f8d96eea3dfb5951243d2ebb4b763db868471Tadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
249757f8d96eea3dfb5951243d2ebb4b763db868471Tadashi G. Takaoka    @Override
2500f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    public void setSymbolsKeyboard() {
25111d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka        setKeyboard(mKeyboardLayoutSet.getKeyboard(KeyboardId.ELEMENT_SYMBOLS));
25246831d5a4b135e5c21f2212d1d8aef09806800edTadashi G. Takaoka    }
25346831d5a4b135e5c21f2212d1d8aef09806800edTadashi G. Takaoka
254eef6238f94b5046054d9ae9c06f775362893c0eeTadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
255eef6238f94b5046054d9ae9c06f775362893c0eeTadashi G. Takaoka    @Override
256eef6238f94b5046054d9ae9c06f775362893c0eeTadashi G. Takaoka    public void setSymbolsShiftedKeyboard() {
25711d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka        setKeyboard(mKeyboardLayoutSet.getKeyboard(KeyboardId.ELEMENT_SYMBOLS_SHIFTED));
2588a70e70c849cc2c5553c6fd79891c22893fd761bTadashi G. Takaoka    }
2598a70e70c849cc2c5553c6fd79891c22893fd761bTadashi G. Takaoka
260c88026e1dfa9dce6d2aee9b9964342a22644dcd1Tadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
261c88026e1dfa9dce6d2aee9b9964342a22644dcd1Tadashi G. Takaoka    @Override
262c88026e1dfa9dce6d2aee9b9964342a22644dcd1Tadashi G. Takaoka    public void requestUpdatingShiftState() {
26316950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        mState.onUpdateShiftState(mLatinIME.getCurrentAutoCapsState());
264c88026e1dfa9dce6d2aee9b9964342a22644dcd1Tadashi G. Takaoka    }
265c88026e1dfa9dce6d2aee9b9964342a22644dcd1Tadashi G. Takaoka
2660ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
2670ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka    @Override
2680ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka    public void startDoubleTapTimer() {
26927e48447a449d2eb534dfa2dc07060727e1a8fb0Tadashi G. Takaoka        final MainKeyboardView keyboardView = getMainKeyboardView();
2700ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka        if (keyboardView != null) {
2710ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka            final TimerProxy timer = keyboardView.getTimerProxy();
2720ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka            timer.startDoubleTapTimer();
2730ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka        }
2740ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka    }
2750ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka
2760ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
2770ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka    @Override
278beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka    public void cancelDoubleTapTimer() {
27927e48447a449d2eb534dfa2dc07060727e1a8fb0Tadashi G. Takaoka        final MainKeyboardView keyboardView = getMainKeyboardView();
280beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka        if (keyboardView != null) {
281beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka            final TimerProxy timer = keyboardView.getTimerProxy();
282beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka            timer.cancelDoubleTapTimer();
283beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka        }
284beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka    }
285beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka
286beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
287beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka    @Override
2880ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka    public boolean isInDoubleTapTimeout() {
28927e48447a449d2eb534dfa2dc07060727e1a8fb0Tadashi G. Takaoka        final MainKeyboardView keyboardView = getMainKeyboardView();
2900ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka        return (keyboardView != null)
2910ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka                ? keyboardView.getTimerProxy().isInDoubleTapTimeout() : false;
2920ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka    }
2930ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka
294a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
295a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka    @Override
296a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka    public void startLongPressTimer(int code) {
29727e48447a449d2eb534dfa2dc07060727e1a8fb0Tadashi G. Takaoka        final MainKeyboardView keyboardView = getMainKeyboardView();
298a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka        if (keyboardView != null) {
299a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka            final TimerProxy timer = keyboardView.getTimerProxy();
300a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka            timer.startLongPressTimer(code);
301a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka        }
302a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka    }
303a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka
304a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
305a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka    @Override
306beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka    public void cancelLongPressTimer() {
30727e48447a449d2eb534dfa2dc07060727e1a8fb0Tadashi G. Takaoka        final MainKeyboardView keyboardView = getMainKeyboardView();
308beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka        if (keyboardView != null) {
309beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka            final TimerProxy timer = keyboardView.getTimerProxy();
310beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka            timer.cancelLongPressTimer();
311beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka        }
312beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka    }
313beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka
314beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
315beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka    @Override
316a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka    public void hapticAndAudioFeedback(int code) {
31716950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        mLatinIME.hapticAndAudioFeedback(code);
318a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka    }
319a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka
320a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka    public void onLongPressTimeout(int code) {
321a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka        mState.onLongPressTimeout(code);
322a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka    }
323a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka
324717cef79ead5d63a01d09b47caab0a3d719c69dfTadashi G. Takaoka    public boolean isInMomentarySwitchState() {
325eef6238f94b5046054d9ae9c06f775362893c0eeTadashi G. Takaoka        return mState.isInMomentarySwitchState();
3269e91472285a1b903631f1e3c998f5aa1efd3e98eTadashi G. Takaoka    }
3279e91472285a1b903631f1e3c998f5aa1efd3e98eTadashi G. Takaoka
328a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka    private boolean isVibrateAndSoundFeedbackRequired() {
329416ee19d330f08e329cce4fd7cb66003cfb64f4aTadashi G. Takaoka        return mKeyboardView != null && !mKeyboardView.isInSlidingKeyInput();
330cb2469ae17e0ca8a94767008fef3945cb2a3b406Tadashi G. Takaoka    }
331cb2469ae17e0ca8a94767008fef3945cb2a3b406Tadashi G. Takaoka
33246831d5a4b135e5c21f2212d1d8aef09806800edTadashi G. Takaoka    private boolean isSinglePointer() {
33346831d5a4b135e5c21f2212d1d8aef09806800edTadashi G. Takaoka        return mKeyboardView != null && mKeyboardView.getPointerCount() == 1;
334b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani    }
335b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani
336c8b9afe0378e3f33c3f83271bd1df9678a70c2a2Tadashi G. Takaoka    public boolean hasDistinctMultitouch() {
337c150acc7c85ff2f5eeb5bd2c6ff288df4e46a355Tadashi G. Takaoka        return mKeyboardView != null && mKeyboardView.hasDistinctMultitouch();
338c8b9afe0378e3f33c3f83271bd1df9678a70c2a2Tadashi G. Takaoka    }
339c8b9afe0378e3f33c3f83271bd1df9678a70c2a2Tadashi G. Takaoka
340b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani    /**
34106bc1db017b14614353137fde035d2eed666a74fTadashi G. Takaoka     * Updates state machine to figure out when to automatically switch back to the previous mode.
342b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani     */
343eef6238f94b5046054d9ae9c06f775362893c0eeTadashi G. Takaoka    public void onCodeInput(int code) {
34416950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        mState.onCodeInput(code, isSinglePointer(), mLatinIME.getCurrentAutoCapsState());
345923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    }
346979f8690967ff5409fe18f5085858ccdb8e0ccf1satok
34727e48447a449d2eb534dfa2dc07060727e1a8fb0Tadashi G. Takaoka    public MainKeyboardView getMainKeyboardView() {
348c150acc7c85ff2f5eeb5bd2c6ff288df4e46a355Tadashi G. Takaoka        return mKeyboardView;
349979f8690967ff5409fe18f5085858ccdb8e0ccf1satok    }
350979f8690967ff5409fe18f5085858ccdb8e0ccf1satok
351622d6a5b1b3d6a9140765b868abf1cdf412bc4f3Tadashi G. Takaoka    public View onCreateInputView(boolean isHardwareAcceleratedDrawingEnabled) {
352f3cd2bb33d1688fd6de01787140a1ef2de4b7723Tadashi G. Takaoka        if (mKeyboardView != null) {
353f3cd2bb33d1688fd6de01787140a1ef2de4b7723Tadashi G. Takaoka            mKeyboardView.closing();
354f3cd2bb33d1688fd6de01787140a1ef2de4b7723Tadashi G. Takaoka        }
355f3cd2bb33d1688fd6de01787140a1ef2de4b7723Tadashi G. Takaoka
3561f05cf6dab45c21d1ed334247929434d97c40584Tadashi G. Takaoka        setContextThemeWrapper(mLatinIME, mKeyboardTheme);
3571f05cf6dab45c21d1ed334247929434d97c40584Tadashi G. Takaoka        mCurrentInputView = (InputView)LayoutInflater.from(mThemeContext).inflate(
3581f05cf6dab45c21d1ed334247929434d97c40584Tadashi G. Takaoka                R.layout.input_view, null);
359f3cd2bb33d1688fd6de01787140a1ef2de4b7723Tadashi G. Takaoka
360c8e45ddb032554f4e9d4411d8ef47d98db62d77bTadashi G. Takaoka        mKeyboardView = (MainKeyboardView) mCurrentInputView.findViewById(R.id.keyboard_view);
361622d6a5b1b3d6a9140765b868abf1cdf412bc4f3Tadashi G. Takaoka        if (isHardwareAcceleratedDrawingEnabled) {
362622d6a5b1b3d6a9140765b868abf1cdf412bc4f3Tadashi G. Takaoka            mKeyboardView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
363622d6a5b1b3d6a9140765b868abf1cdf412bc4f3Tadashi G. Takaoka            // TODO: Should use LAYER_TYPE_SOFTWARE when hardware acceleration is off?
364622d6a5b1b3d6a9140765b868abf1cdf412bc4f3Tadashi G. Takaoka        }
36516950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        mKeyboardView.setKeyboardActionListener(mLatinIME);
36606b7c256b1992f93aab0e2cdb90f57718f0631fdTadashi G. Takaoka        if (mForceNonDistinctMultitouch) {
36706b7c256b1992f93aab0e2cdb90f57718f0631fdTadashi G. Takaoka            mKeyboardView.setDistinctMultitouch(false);
36806b7c256b1992f93aab0e2cdb90f57718f0631fdTadashi G. Takaoka        }
3695ac4638f999db4fea8a9e24171dbceb640a10858Alan Viverette
3705ac4638f999db4fea8a9e24171dbceb640a10858Alan Viverette        // This always needs to be set since the accessibility state can
3715ac4638f999db4fea8a9e24171dbceb640a10858Alan Viverette        // potentially change without the input view being re-created.
3729a81ce92c381007affe6bb2310bf94c9856eaae1alanv        AccessibleKeyboardViewProxy.getInstance().setView(mKeyboardView);
3735ac4638f999db4fea8a9e24171dbceb640a10858Alan Viverette
374f3cd2bb33d1688fd6de01787140a1ef2de4b7723Tadashi G. Takaoka        return mCurrentInputView;
3758d7ecc70a6572c288064e41235e4ae8ad5b1b47eTadashi G. Takaoka    }
3768d7ecc70a6572c288064e41235e4ae8ad5b1b47eTadashi G. Takaoka
37723d27fefcbfe04df8f8762d5d50117a58fb011e9Tadashi G. Takaoka    public void onNetworkStateChanged() {
3785afc3ae2d9df0c2c93f2c66af13b128889ac3b5dTadashi G. Takaoka        if (mKeyboardView != null) {
379cb389ef0d6e6eec737c249e1729c2a2cdc30f341Tadashi G. Takaoka            mKeyboardView.updateShortcutKey(mSubtypeSwitcher.isShortcutImeReady());
38023d27fefcbfe04df8f8762d5d50117a58fb011e9Tadashi G. Takaoka        }
38123d27fefcbfe04df8f8762d5d50117a58fb011e9Tadashi G. Takaoka    }
38223d27fefcbfe04df8f8762d5d50117a58fb011e9Tadashi G. Takaoka
3831b1f7f907f6c7d6e849c88ca06c3608bc84d7c5fTadashi G. Takaoka    public void onAutoCorrectionStateChanged(boolean isAutoCorrection) {
3845e4e05afd2825bf7acb594fef5e7bd21c751dd63Tadashi G. Takaoka        if (mIsAutoCorrectionActive != isAutoCorrection) {
3851b1f7f907f6c7d6e849c88ca06c3608bc84d7c5fTadashi G. Takaoka            mIsAutoCorrectionActive = isAutoCorrection;
3864112dc05002d7a880e558418639cf25c4bd02a5aTadashi G. Takaoka            if (mKeyboardView != null) {
3874112dc05002d7a880e558418639cf25c4bd02a5aTadashi G. Takaoka                mKeyboardView.updateAutoCorrectionState(isAutoCorrection);
3885e4e05afd2825bf7acb594fef5e7bd21c751dd63Tadashi G. Takaoka            }
38941feaaadb758a8b31d3e436063b4b5faed104d4dsatok        }
39041feaaadb758a8b31d3e436063b4b5faed104d4dsatok    }
391adbd9ae105e06287b59379d7f7127d95fd0663f4Jean Chalard
3926686e63f2158eff07e39ff002ba211d0578f2a4fJean Chalard    public int getKeyboardShiftMode() {
393d445b56ce14152b30143302899790af255691148Tadashi G. Takaoka        final Keyboard keyboard = getKeyboard();
394d445b56ce14152b30143302899790af255691148Tadashi G. Takaoka        if (keyboard == null) {
395d445b56ce14152b30143302899790af255691148Tadashi G. Takaoka            return WordComposer.CAPS_MODE_OFF;
396d445b56ce14152b30143302899790af255691148Tadashi G. Takaoka        }
397d445b56ce14152b30143302899790af255691148Tadashi G. Takaoka        switch (keyboard.mId.mElementId) {
398adbd9ae105e06287b59379d7f7127d95fd0663f4Jean Chalard        case KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCKED:
399adbd9ae105e06287b59379d7f7127d95fd0663f4Jean Chalard        case KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCK_SHIFTED:
400adbd9ae105e06287b59379d7f7127d95fd0663f4Jean Chalard            return WordComposer.CAPS_MODE_MANUAL_SHIFT_LOCKED;
401adbd9ae105e06287b59379d7f7127d95fd0663f4Jean Chalard        case KeyboardId.ELEMENT_ALPHABET_MANUAL_SHIFTED:
402adbd9ae105e06287b59379d7f7127d95fd0663f4Jean Chalard            return WordComposer.CAPS_MODE_MANUAL_SHIFTED;
4036686e63f2158eff07e39ff002ba211d0578f2a4fJean Chalard        case KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED:
4046686e63f2158eff07e39ff002ba211d0578f2a4fJean Chalard            return WordComposer.CAPS_MODE_AUTO_SHIFTED;
405adbd9ae105e06287b59379d7f7127d95fd0663f4Jean Chalard        default:
406adbd9ae105e06287b59379d7f7127d95fd0663f4Jean Chalard            return WordComposer.CAPS_MODE_OFF;
407adbd9ae105e06287b59379d7f7127d95fd0663f4Jean Chalard        }
408adbd9ae105e06287b59379d7f7127d95fd0663f4Jean Chalard    }
409923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project}
410