1923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project/*
2443c360d0afdbab091994244f045f4756feaf2b4Jean-Baptiste Queru * Copyright (C) 2008 The Android Open Source Project
3571bdb401f670b92bd7710a12a990cb65a99b7d3Tadashi G. Takaoka *
48aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License");
58aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * you may not use this file except in compliance with the License.
68aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * You may obtain a copy of the License at
7571bdb401f670b92bd7710a12a990cb65a99b7d3Tadashi G. Takaoka *
88aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka *      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
118aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS,
128aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * See the License for the specific language governing permissions and
148aa9963a895f9dd5bb1bc92ab2e4f461e058f87aTadashi G. Takaoka * limitations under 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;
22f90fc105ab1159f43f536bcacdd1224c2c05bacbTadashi G. Takaokaimport android.preference.PreferenceManager;
2317dae3057c234d9aed83c1ba31dbbc3aceb790caTadashi G. Takaokaimport android.util.DisplayMetrics;
24c150acc7c85ff2f5eeb5bd2c6ff288df4e46a355Tadashi G. Takaokaimport android.util.Log;
2513a741999480343ccebd81ff6349b572bde17b07Tadashi G. Takaokaimport android.view.ContextThemeWrapper;
26c150acc7c85ff2f5eeb5bd2c6ff288df4e46a355Tadashi G. Takaokaimport android.view.LayoutInflater;
27c150acc7c85ff2f5eeb5bd2c6ff288df4e46a355Tadashi G. Takaokaimport android.view.View;
28c150acc7c85ff2f5eeb5bd2c6ff288df4e46a355Tadashi G. Takaokaimport android.view.inputmethod.EditorInfo;
29c150acc7c85ff2f5eeb5bd2c6ff288df4e46a355Tadashi G. Takaoka
305ac4638f999db4fea8a9e24171dbceb640a10858Alan Viveretteimport com.android.inputmethod.accessibility.AccessibleKeyboardViewProxy;
3111d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaokaimport com.android.inputmethod.keyboard.KeyboardLayoutSet.KeyboardLayoutSetException;
320ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaokaimport com.android.inputmethod.keyboard.PointerTracker.TimerProxy;
33b88c9acd88348c160e3d114593660bfd362bee29Tadashi G. Takaokaimport com.android.inputmethod.keyboard.internal.KeyboardState;
348e360c68f1861a70fdb91652334efa513e25fcd2Tadashi G. Takaokaimport com.android.inputmethod.latin.AudioAndHapticFeedbackManager;
35f451ed2012df7eb080de045a93a494aecd2775b4Tadashi G. Takaokaimport com.android.inputmethod.latin.InputView;
36571bdb401f670b92bd7710a12a990cb65a99b7d3Tadashi G. Takaokaimport com.android.inputmethod.latin.LatinIME;
37571bdb401f670b92bd7710a12a990cb65a99b7d3Tadashi G. Takaokaimport com.android.inputmethod.latin.LatinImeLogger;
38571bdb401f670b92bd7710a12a990cb65a99b7d3Tadashi G. Takaokaimport com.android.inputmethod.latin.R;
396fbbab3b8442ad010c53dc53a09535f7b0ef0323Tadashi G. Takaokaimport com.android.inputmethod.latin.RichInputMethodManager;
40d3b0ecec22cda883150851dced32c1eda2910a66Tadashi G. Takaokaimport com.android.inputmethod.latin.Settings;
417a16a061e622539e54d7d649dcb8d4965aea575aJean Chalardimport com.android.inputmethod.latin.SettingsValues;
42571bdb401f670b92bd7710a12a990cb65a99b7d3Tadashi G. Takaokaimport com.android.inputmethod.latin.SubtypeSwitcher;
43adbd9ae105e06287b59379d7f7127d95fd0663f4Jean Chalardimport com.android.inputmethod.latin.WordComposer;
445a309f57155fb95667c2ccdda730eaf175de8876Tadashi G. Takaoka
45a28a05e971cc242b338331a3b78276fa95188d19Tadashi G. Takaokapublic final class KeyboardSwitcher implements KeyboardState.SwitchActions {
46c25e07d21261583d0eeca5aa0fb6e3ffe93dc603Tadashi G. Takaoka    private static final String TAG = KeyboardSwitcher.class.getSimpleName();
47923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project
482d9722e46c774d51c834c3a8b11261a2a22e09d3Ken Wakasa    public static final String PREF_KEYBOARD_LAYOUT = "pref_keyboard_layout_20110916";
49411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka
50a28a05e971cc242b338331a3b78276fa95188d19Tadashi G. Takaoka    static final class KeyboardTheme {
51411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka        public final int mThemeId;
52411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka        public final int mStyleId;
53411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka
541f05cf6dab45c21d1ed334247929434d97c40584Tadashi G. Takaoka        // Note: The themeId should be aligned with "themeId" attribute of Keyboard style
551f05cf6dab45c21d1ed334247929434d97c40584Tadashi G. Takaoka        // in values/style.xml.
56f90fc105ab1159f43f536bcacdd1224c2c05bacbTadashi G. Takaoka        public KeyboardTheme(final int themeId, final int styleId) {
57411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka            mThemeId = themeId;
58411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka            mStyleId = styleId;
59411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka        }
60411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka    }
61411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka
62411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka    private static final KeyboardTheme[] KEYBOARD_THEMES = {
631f05cf6dab45c21d1ed334247929434d97c40584Tadashi G. Takaoka        new KeyboardTheme(0, R.style.KeyboardTheme),
641f05cf6dab45c21d1ed334247929434d97c40584Tadashi G. Takaoka        new KeyboardTheme(1, R.style.KeyboardTheme_HighContrast),
651f05cf6dab45c21d1ed334247929434d97c40584Tadashi G. Takaoka        new KeyboardTheme(6, R.style.KeyboardTheme_Stone),
661f05cf6dab45c21d1ed334247929434d97c40584Tadashi G. Takaoka        new KeyboardTheme(7, R.style.KeyboardTheme_Stone_Bold),
671f05cf6dab45c21d1ed334247929434d97c40584Tadashi G. Takaoka        new KeyboardTheme(8, R.style.KeyboardTheme_Gingerbread),
681f05cf6dab45c21d1ed334247929434d97c40584Tadashi G. Takaoka        new KeyboardTheme(5, R.style.KeyboardTheme_IceCreamSandwich),
6975fde6489039c09056fb5e64d39630ece5ad57cfTadashi G. Takaoka    };
70979f8690967ff5409fe18f5085858ccdb8e0ccf1satok
71b17b88742528d09eaa36adb3dae5348b99c234e0Tadashi G. Takaoka    private final AudioAndHapticFeedbackManager mFeedbackManager =
72b17b88742528d09eaa36adb3dae5348b99c234e0Tadashi G. Takaoka            AudioAndHapticFeedbackManager.getInstance();
730ed7191b4d1013a0b9d2fd1f26733dee7364871dsatok    private SubtypeSwitcher mSubtypeSwitcher;
7427d13713bbb291d25a910f97d88a81fdbabddc0eKen Wakasa    private SharedPreferences mPrefs;
750ed7191b4d1013a0b9d2fd1f26733dee7364871dsatok
76f451ed2012df7eb080de045a93a494aecd2775b4Tadashi G. Takaoka    private InputView mCurrentInputView;
77c8e45ddb032554f4e9d4411d8ef47d98db62d77bTadashi G. Takaoka    private MainKeyboardView mKeyboardView;
7816950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka    private LatinIME mLatinIME;
790a054dd1075d679385434ecef38a3d88c7551d7aTadashi G. Takaoka    private Resources mResources;
8031adfa78e2edae188edb05e869f9f68798857582satok
81b88c9acd88348c160e3d114593660bfd362bee29Tadashi G. Takaoka    private KeyboardState mState;
82889691eca1ad991a85fb721deb37ecba6a913762Tadashi G. Takaoka
8311d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka    private KeyboardLayoutSet mKeyboardLayoutSet;
84353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger
851b1f7f907f6c7d6e849c88ca06c3608bc84d7c5fTadashi G. Takaoka    /** mIsAutoCorrectionActive indicates that auto corrected word will be input instead of
8641feaaadb758a8b31d3e436063b4b5faed104d4dsatok     * what user actually typed. */
871b1f7f907f6c7d6e849c88ca06c3608bc84d7c5fTadashi G. Takaoka    private boolean mIsAutoCorrectionActive;
889e91472285a1b903631f1e3c998f5aa1efd3e98eTadashi G. Takaoka
89411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka    private KeyboardTheme mKeyboardTheme = KEYBOARD_THEMES[0];
905a2d0630474d6df639e97ff48f5f48b220ca4ee9Tadashi G. Takaoka    private Context mThemeContext;
91979f8690967ff5409fe18f5085858ccdb8e0ccf1satok
920ed7191b4d1013a0b9d2fd1f26733dee7364871dsatok    private static final KeyboardSwitcher sInstance = new KeyboardSwitcher();
930ed7191b4d1013a0b9d2fd1f26733dee7364871dsatok
940ed7191b4d1013a0b9d2fd1f26733dee7364871dsatok    public static KeyboardSwitcher getInstance() {
950ed7191b4d1013a0b9d2fd1f26733dee7364871dsatok        return sInstance;
960ed7191b4d1013a0b9d2fd1f26733dee7364871dsatok    }
970ed7191b4d1013a0b9d2fd1f26733dee7364871dsatok
980ed7191b4d1013a0b9d2fd1f26733dee7364871dsatok    private KeyboardSwitcher() {
99e26ef1bccddc942fdaeada3409c8e8ff18a35008Tadashi G. Takaoka        // Intentional empty constructor for singleton.
1000ed7191b4d1013a0b9d2fd1f26733dee7364871dsatok    }
1010ed7191b4d1013a0b9d2fd1f26733dee7364871dsatok
102f90fc105ab1159f43f536bcacdd1224c2c05bacbTadashi G. Takaoka    public static void init(final LatinIME latinIme) {
103f90fc105ab1159f43f536bcacdd1224c2c05bacbTadashi G. Takaoka        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(latinIme);
10416950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        sInstance.initInternal(latinIme, prefs);
105364f1fd1f84cca6c8d396064bfd8bc8fd1efefcbTadashi G. Takaoka    }
106364f1fd1f84cca6c8d396064bfd8bc8fd1efefcbTadashi G. Takaoka
107f90fc105ab1159f43f536bcacdd1224c2c05bacbTadashi G. Takaoka    private void initInternal(final LatinIME latinIme, final SharedPreferences prefs) {
10816950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        mLatinIME = latinIme;
10916950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        mResources = latinIme.getResources();
110364f1fd1f84cca6c8d396064bfd8bc8fd1efefcbTadashi G. Takaoka        mPrefs = prefs;
111364f1fd1f84cca6c8d396064bfd8bc8fd1efefcbTadashi G. Takaoka        mSubtypeSwitcher = SubtypeSwitcher.getInstance();
112eef6238f94b5046054d9ae9c06f775362893c0eeTadashi G. Takaoka        mState = new KeyboardState(this);
11316950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        setContextThemeWrapper(latinIme, getKeyboardTheme(latinIme, prefs));
1145a2d0630474d6df639e97ff48f5f48b220ca4ee9Tadashi G. Takaoka    }
115979f8690967ff5409fe18f5085858ccdb8e0ccf1satok
116f90fc105ab1159f43f536bcacdd1224c2c05bacbTadashi G. Takaoka    private static KeyboardTheme getKeyboardTheme(final Context context,
117f90fc105ab1159f43f536bcacdd1224c2c05bacbTadashi G. Takaoka            final SharedPreferences prefs) {
118411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka        final String defaultIndex = context.getString(R.string.config_default_keyboard_theme_index);
119411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka        final String themeIndex = prefs.getString(PREF_KEYBOARD_LAYOUT, defaultIndex);
12005ddb9a5d2b36f519a4de4b50448e258f40d2c0fTadashi G. Takaoka        try {
121411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka            final int index = Integer.valueOf(themeIndex);
122411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka            if (index >= 0 && index < KEYBOARD_THEMES.length) {
123411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka                return KEYBOARD_THEMES[index];
124411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka            }
12505ddb9a5d2b36f519a4de4b50448e258f40d2c0fTadashi G. Takaoka        } catch (NumberFormatException e) {
1265a2d0630474d6df639e97ff48f5f48b220ca4ee9Tadashi G. Takaoka            // Format error, keyboard theme is default to 0.
1275a2d0630474d6df639e97ff48f5f48b220ca4ee9Tadashi G. Takaoka        }
128411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka        Log.w(TAG, "Illegal keyboard theme in preference: " + themeIndex + ", default to 0");
129411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka        return KEYBOARD_THEMES[0];
1305a2d0630474d6df639e97ff48f5f48b220ca4ee9Tadashi G. Takaoka    }
1315a2d0630474d6df639e97ff48f5f48b220ca4ee9Tadashi G. Takaoka
132f90fc105ab1159f43f536bcacdd1224c2c05bacbTadashi G. Takaoka    private void setContextThemeWrapper(final Context context, final KeyboardTheme keyboardTheme) {
133befc1a05c993106fb6657bb9e188879dafe401ecTadashi G. Takaoka        if (mThemeContext == null || mKeyboardTheme.mThemeId != keyboardTheme.mThemeId) {
134411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka            mKeyboardTheme = keyboardTheme;
135411749a4baddc0fda7720deb6e4d67c1f1558cc5Tadashi G. Takaoka            mThemeContext = new ContextThemeWrapper(context, keyboardTheme.mStyleId);
13611d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka            KeyboardLayoutSet.clearKeyboardCache();
13705ddb9a5d2b36f519a4de4b50448e258f40d2c0fTadashi G. Takaoka        }
138979f8690967ff5409fe18f5085858ccdb8e0ccf1satok    }
139979f8690967ff5409fe18f5085858ccdb8e0ccf1satok
140f90fc105ab1159f43f536bcacdd1224c2c05bacbTadashi G. Takaoka    public void loadKeyboard(final EditorInfo editorInfo, final SettingsValues settingsValues) {
14111d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka        final KeyboardLayoutSet.Builder builder = new KeyboardLayoutSet.Builder(
14211d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka                mThemeContext, editorInfo);
1434731b67629e72d6c7cb391e3d188df78ceaff1e7Tadashi G. Takaoka        final Resources res = mThemeContext.getResources();
14417dae3057c234d9aed83c1ba31dbbc3aceb790caTadashi G. Takaoka        final DisplayMetrics dm = res.getDisplayMetrics();
1459d71a6c968434a95b5a195846ef5276920da6203Tadashi G. Takaoka        builder.setScreenGeometry(dm.widthPixels, dm.heightPixels);
146cb389ef0d6e6eec737c249e1729c2a2cdc30f341Tadashi G. Takaoka        builder.setSubtype(mSubtypeSwitcher.getCurrentSubtype());
1474087ba69faec0dd89fae7d53d7527448091e0aadTadashi G. Takaoka        builder.setOptions(
1484087ba69faec0dd89fae7d53d7527448091e0aadTadashi G. Takaoka                settingsValues.isVoiceKeyEnabled(editorInfo),
14981d4e3cd66a9388c47c7dba55240ddf849b31934Tadashi G. Takaoka                settingsValues.isVoiceKeyOnMain(),
1506fbbab3b8442ad010c53dc53a09535f7b0ef0323Tadashi G. Takaoka                settingsValues.isLanguageSwitchKeyEnabled());
15111d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka        mKeyboardLayoutSet = builder.build();
152979f8690967ff5409fe18f5085858ccdb8e0ccf1satok        try {
153cc2636b4e1b2d340351324f178f7ee990d7538cbTadashi G. Takaoka            mState.onLoadKeyboard();
1548e360c68f1861a70fdb91652334efa513e25fcd2Tadashi G. Takaoka            mFeedbackManager.onSettingsChanged(settingsValues);
15511d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka        } catch (KeyboardLayoutSetException e) {
15688e079ae6bbff1093b28f60e81d2befce1030495Tadashi G. Takaoka            Log.w(TAG, "loading keyboard failed: " + e.mKeyboardId, e.getCause());
15788e079ae6bbff1093b28f60e81d2befce1030495Tadashi G. Takaoka            LatinImeLogger.logOnException(e.mKeyboardId.toString(), e.getCause());
158645128af712961456a42cbcc34c0cdf5f0b40a83Tadashi G. Takaoka            return;
159645128af712961456a42cbcc34c0cdf5f0b40a83Tadashi G. Takaoka        }
160353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger    }
161353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger
1628e360c68f1861a70fdb91652334efa513e25fcd2Tadashi G. Takaoka    public void onRingerModeChanged() {
1638e360c68f1861a70fdb91652334efa513e25fcd2Tadashi G. Takaoka        mFeedbackManager.onRingerModeChanged();
1648e360c68f1861a70fdb91652334efa513e25fcd2Tadashi G. Takaoka    }
1658e360c68f1861a70fdb91652334efa513e25fcd2Tadashi G. Takaoka
16659f8ca752d5f79d4469519623590052c050c9d23Tadashi G. Takaoka    public void saveKeyboardState() {
167ca2f051cc173acc3bce384ebfe08068564bc8e07Tadashi G. Takaoka        if (getKeyboard() != null) {
16810dcc7eb672a561a1d9f510f4d2109dcab251e36Tadashi G. Takaoka            mState.onSaveKeyboardState();
1692e263b70d5769b52cba4a002e44dbf81db5de7f8Tadashi G. Takaoka        }
170055054eef3ccd32c6dfd69a3f76bfb7383ea93bbTadashi G. Takaoka    }
171055054eef3ccd32c6dfd69a3f76bfb7383ea93bbTadashi G. Takaoka
172055054eef3ccd32c6dfd69a3f76bfb7383ea93bbTadashi G. Takaoka    public void onFinishInputView() {
173055054eef3ccd32c6dfd69a3f76bfb7383ea93bbTadashi G. Takaoka        mIsAutoCorrectionActive = false;
174055054eef3ccd32c6dfd69a3f76bfb7383ea93bbTadashi G. Takaoka    }
175055054eef3ccd32c6dfd69a3f76bfb7383ea93bbTadashi G. Takaoka
176c3d175c01ff1956ddb1c2d608d69af1793b4ad8aTadashi G. Takaoka    public void onHideWindow() {
177c3d175c01ff1956ddb1c2d608d69af1793b4ad8aTadashi G. Takaoka        mIsAutoCorrectionActive = false;
178c3d175c01ff1956ddb1c2d608d69af1793b4ad8aTadashi G. Takaoka    }
179c3d175c01ff1956ddb1c2d608d69af1793b4ad8aTadashi G. Takaoka
180055054eef3ccd32c6dfd69a3f76bfb7383ea93bbTadashi G. Takaoka    private void setKeyboard(final Keyboard keyboard) {
1810657b9698a110f8e895448d829478982ce37b6d1Tadashi G. Takaoka        final MainKeyboardView keyboardView = mKeyboardView;
1820657b9698a110f8e895448d829478982ce37b6d1Tadashi G. Takaoka        final Keyboard oldKeyboard = keyboardView.getKeyboard();
1830657b9698a110f8e895448d829478982ce37b6d1Tadashi G. Takaoka        keyboardView.setKeyboard(keyboard);
184f451ed2012df7eb080de045a93a494aecd2775b4Tadashi G. Takaoka        mCurrentInputView.setKeyboardGeometry(keyboard.mTopPadding);
1850657b9698a110f8e895448d829478982ce37b6d1Tadashi G. Takaoka        keyboardView.setKeyPreviewPopupEnabled(
186d3b0ecec22cda883150851dced32c1eda2910a66Tadashi G. Takaoka                Settings.readKeyPreviewPopupEnabled(mPrefs, mResources),
187d3b0ecec22cda883150851dced32c1eda2910a66Tadashi G. Takaoka                Settings.readKeyPreviewPopupDismissDelay(mPrefs, mResources));
1880657b9698a110f8e895448d829478982ce37b6d1Tadashi G. Takaoka        keyboardView.updateAutoCorrectionState(mIsAutoCorrectionActive);
1890657b9698a110f8e895448d829478982ce37b6d1Tadashi G. Takaoka        keyboardView.updateShortcutKey(mSubtypeSwitcher.isShortcutImeReady());
190dabf96896ef4c304c6dad36b307a2a458a58209dTadashi G. Takaoka        final boolean subtypeChanged = (oldKeyboard == null)
191dabf96896ef4c304c6dad36b307a2a458a58209dTadashi G. Takaoka                || !keyboard.mId.mLocale.equals(oldKeyboard.mId.mLocale);
1924c0c638a189c1073b1fb6e43fe5fddb6f9932038Tadashi G. Takaoka        final boolean needsToDisplayLanguage = mSubtypeSwitcher.needsToDisplayLanguage(
1934c0c638a189c1073b1fb6e43fe5fddb6f9932038Tadashi G. Takaoka                keyboard.mId.mLocale);
1940657b9698a110f8e895448d829478982ce37b6d1Tadashi G. Takaoka        keyboardView.startDisplayLanguageOnSpacebar(subtypeChanged, needsToDisplayLanguage,
1956fbbab3b8442ad010c53dc53a09535f7b0ef0323Tadashi G. Takaoka                RichInputMethodManager.getInstance().hasMultipleEnabledIMEsOrSubtypes(true));
196353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger    }
197353da6d207bed3d32ec38b9ce52e4a136adbf060Brandon Ballinger
1983708787fe91227083d2a1874fa41493d3bc9fe10Tadashi G. Takaoka    public Keyboard getKeyboard() {
199c150acc7c85ff2f5eeb5bd2c6ff288df4e46a355Tadashi G. Takaoka        if (mKeyboardView != null) {
2003708787fe91227083d2a1874fa41493d3bc9fe10Tadashi G. Takaoka            return mKeyboardView.getKeyboard();
201050c0462dc2ada5a5afecec5b6745693c5066b85Tadashi G. Takaoka        }
202b643dab73ab9527cc63d896cad81c0cdc92fe5f6Tadashi G. Takaoka        return null;
2031679432d1c8a8cfe6ff09be0a49792f4af91ab35Tadashi G. Takaoka    }
2041679432d1c8a8cfe6ff09be0a49792f4af91ab35Tadashi G. Takaoka
2050f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    /**
2060f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka     * Update keyboard shift state triggered by connected EditText status change.
2070f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka     */
2080f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    public void updateShiftState() {
2098094bf45d73a5f7257076afc97d91d6708ee03c4Jean Chalard        mState.onUpdateShiftState(mLatinIME.getCurrentAutoCapsState(),
2108094bf45d73a5f7257076afc97d91d6708ee03c4Jean Chalard                mLatinIME.getCurrentRecapitalizeState());
2110f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    }
2120f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka
2135d2556b93286f5f1d7d829b586b84a8b7ae55743Ken Wakasa    // TODO: Remove this method. Come up with a more comprehensive way to reset the keyboard layout
2145d2556b93286f5f1d7d829b586b84a8b7ae55743Ken Wakasa    // when a keyboard layout set doesn't get reloaded in LatinIME.onStartInputViewInternal().
2155d2556b93286f5f1d7d829b586b84a8b7ae55743Ken Wakasa    public void resetKeyboardStateToAlphabet() {
2165d2556b93286f5f1d7d829b586b84a8b7ae55743Ken Wakasa        mState.onResetKeyboardStateToAlphabet();
2175d2556b93286f5f1d7d829b586b84a8b7ae55743Ken Wakasa    }
2185d2556b93286f5f1d7d829b586b84a8b7ae55743Ken Wakasa
21941016acacfa21354f59ed51db1f85ea3d99bf6a4Tadashi G. Takaoka    public void onPressKey(final int code, final boolean isSinglePointer) {
220a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka        if (isVibrateAndSoundFeedbackRequired()) {
2218e360c68f1861a70fdb91652334efa513e25fcd2Tadashi G. Takaoka            mFeedbackManager.hapticAndAudioFeedback(code, mKeyboardView);
222a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka        }
22341016acacfa21354f59ed51db1f85ea3d99bf6a4Tadashi G. Takaoka        mState.onPressKey(code, isSinglePointer, mLatinIME.getCurrentAutoCapsState());
2240f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    }
2250f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka
226f90fc105ab1159f43f536bcacdd1224c2c05bacbTadashi G. Takaoka    public void onReleaseKey(final int code, final boolean withSliding) {
2270f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka        mState.onReleaseKey(code, withSliding);
2280f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    }
2290f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka
23041016acacfa21354f59ed51db1f85ea3d99bf6a4Tadashi G. Takaoka    public void onFinishSlidingInput() {
23141016acacfa21354f59ed51db1f85ea3d99bf6a4Tadashi G. Takaoka        mState.onFinishSlidingInput();
2320f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    }
2330f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka
2340f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
2350f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    @Override
2360f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    public void setAlphabetKeyboard() {
23711d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka        setKeyboard(mKeyboardLayoutSet.getKeyboard(KeyboardId.ELEMENT_ALPHABET));
238b643dab73ab9527cc63d896cad81c0cdc92fe5f6Tadashi G. Takaoka    }
239b643dab73ab9527cc63d896cad81c0cdc92fe5f6Tadashi G. Takaoka
2400f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
2410f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    @Override
2420f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    public void setAlphabetManualShiftedKeyboard() {
24311d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka        setKeyboard(mKeyboardLayoutSet.getKeyboard(KeyboardId.ELEMENT_ALPHABET_MANUAL_SHIFTED));
2446c92ee127df50509d364a2b6d428b223d2cbaa6eTadashi G. Takaoka    }
2456c92ee127df50509d364a2b6d428b223d2cbaa6eTadashi G. Takaoka
2460f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
2470f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    @Override
2480f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    public void setAlphabetAutomaticShiftedKeyboard() {
24911d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka        setKeyboard(mKeyboardLayoutSet.getKeyboard(KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED));
2505f922caff80d5067c5af2bbbae2731ef25c9572aTadashi G. Takaoka    }
2515f922caff80d5067c5af2bbbae2731ef25c9572aTadashi G. Takaoka
252eef6238f94b5046054d9ae9c06f775362893c0eeTadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
253eef6238f94b5046054d9ae9c06f775362893c0eeTadashi G. Takaoka    @Override
2540f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    public void setAlphabetShiftLockedKeyboard() {
25511d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka        setKeyboard(mKeyboardLayoutSet.getKeyboard(KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCKED));
2568a70e70c849cc2c5553c6fd79891c22893fd761bTadashi G. Takaoka    }
2578a70e70c849cc2c5553c6fd79891c22893fd761bTadashi G. Takaoka
258eef6238f94b5046054d9ae9c06f775362893c0eeTadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
259eef6238f94b5046054d9ae9c06f775362893c0eeTadashi G. Takaoka    @Override
260757f8d96eea3dfb5951243d2ebb4b763db868471Tadashi G. Takaoka    public void setAlphabetShiftLockShiftedKeyboard() {
26111d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka        setKeyboard(mKeyboardLayoutSet.getKeyboard(KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCK_SHIFTED));
262757f8d96eea3dfb5951243d2ebb4b763db868471Tadashi G. Takaoka    }
263757f8d96eea3dfb5951243d2ebb4b763db868471Tadashi G. Takaoka
264757f8d96eea3dfb5951243d2ebb4b763db868471Tadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
265757f8d96eea3dfb5951243d2ebb4b763db868471Tadashi G. Takaoka    @Override
2660f05076990f1308c34c2f12ed793e1e1c41f8ac1Tadashi G. Takaoka    public void setSymbolsKeyboard() {
26711d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka        setKeyboard(mKeyboardLayoutSet.getKeyboard(KeyboardId.ELEMENT_SYMBOLS));
26846831d5a4b135e5c21f2212d1d8aef09806800edTadashi G. Takaoka    }
26946831d5a4b135e5c21f2212d1d8aef09806800edTadashi G. Takaoka
270eef6238f94b5046054d9ae9c06f775362893c0eeTadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
271eef6238f94b5046054d9ae9c06f775362893c0eeTadashi G. Takaoka    @Override
272eef6238f94b5046054d9ae9c06f775362893c0eeTadashi G. Takaoka    public void setSymbolsShiftedKeyboard() {
27311d9ee742f8ff3fb31b0e3beb32ee4870c63d8e3Tadashi G. Takaoka        setKeyboard(mKeyboardLayoutSet.getKeyboard(KeyboardId.ELEMENT_SYMBOLS_SHIFTED));
2748a70e70c849cc2c5553c6fd79891c22893fd761bTadashi G. Takaoka    }
2758a70e70c849cc2c5553c6fd79891c22893fd761bTadashi G. Takaoka
276c88026e1dfa9dce6d2aee9b9964342a22644dcd1Tadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
277c88026e1dfa9dce6d2aee9b9964342a22644dcd1Tadashi G. Takaoka    @Override
278c88026e1dfa9dce6d2aee9b9964342a22644dcd1Tadashi G. Takaoka    public void requestUpdatingShiftState() {
2798094bf45d73a5f7257076afc97d91d6708ee03c4Jean Chalard        mState.onUpdateShiftState(mLatinIME.getCurrentAutoCapsState(),
2808094bf45d73a5f7257076afc97d91d6708ee03c4Jean Chalard                mLatinIME.getCurrentRecapitalizeState());
281c88026e1dfa9dce6d2aee9b9964342a22644dcd1Tadashi G. Takaoka    }
282c88026e1dfa9dce6d2aee9b9964342a22644dcd1Tadashi G. Takaoka
2830ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
2840ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka    @Override
2850ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka    public void startDoubleTapTimer() {
28627e48447a449d2eb534dfa2dc07060727e1a8fb0Tadashi G. Takaoka        final MainKeyboardView keyboardView = getMainKeyboardView();
2870ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka        if (keyboardView != null) {
2880ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka            final TimerProxy timer = keyboardView.getTimerProxy();
2890ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka            timer.startDoubleTapTimer();
2900ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka        }
2910ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka    }
2920ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka
2930ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
2940ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka    @Override
295beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka    public void cancelDoubleTapTimer() {
29627e48447a449d2eb534dfa2dc07060727e1a8fb0Tadashi G. Takaoka        final MainKeyboardView keyboardView = getMainKeyboardView();
297beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka        if (keyboardView != null) {
298beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka            final TimerProxy timer = keyboardView.getTimerProxy();
299beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka            timer.cancelDoubleTapTimer();
300beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka        }
301beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka    }
302beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka
303beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
304beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka    @Override
3050ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka    public boolean isInDoubleTapTimeout() {
30627e48447a449d2eb534dfa2dc07060727e1a8fb0Tadashi G. Takaoka        final MainKeyboardView keyboardView = getMainKeyboardView();
3070ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka        return (keyboardView != null)
3080ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka                ? keyboardView.getTimerProxy().isInDoubleTapTimeout() : false;
3090ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka    }
3100ed2d3a4491cb0f6142975a15b653be6079b6a4eTadashi G. Takaoka
311a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
312a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka    @Override
313f90fc105ab1159f43f536bcacdd1224c2c05bacbTadashi G. Takaoka    public void startLongPressTimer(final int code) {
31427e48447a449d2eb534dfa2dc07060727e1a8fb0Tadashi G. Takaoka        final MainKeyboardView keyboardView = getMainKeyboardView();
315a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka        if (keyboardView != null) {
316a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka            final TimerProxy timer = keyboardView.getTimerProxy();
317a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka            timer.startLongPressTimer(code);
318a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka        }
319a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka    }
320a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka
321a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
322a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka    @Override
323beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka    public void cancelLongPressTimer() {
32427e48447a449d2eb534dfa2dc07060727e1a8fb0Tadashi G. Takaoka        final MainKeyboardView keyboardView = getMainKeyboardView();
325beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka        if (keyboardView != null) {
326beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka            final TimerProxy timer = keyboardView.getTimerProxy();
327beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka            timer.cancelLongPressTimer();
328beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka        }
329beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka    }
330beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka
331beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka    // Implements {@link KeyboardState.SwitchActions}.
332beb08b398fa73a26f2d42d6feec87e34a96ca2d9Tadashi G. Takaoka    @Override
333f90fc105ab1159f43f536bcacdd1224c2c05bacbTadashi G. Takaoka    public void hapticAndAudioFeedback(final int code) {
3348e360c68f1861a70fdb91652334efa513e25fcd2Tadashi G. Takaoka        mFeedbackManager.hapticAndAudioFeedback(code, mKeyboardView);
335a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka    }
336a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka
337f90fc105ab1159f43f536bcacdd1224c2c05bacbTadashi G. Takaoka    public void onLongPressTimeout(final int code) {
338a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka        mState.onLongPressTimeout(code);
339a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka    }
340a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka
341717cef79ead5d63a01d09b47caab0a3d719c69dfTadashi G. Takaoka    public boolean isInMomentarySwitchState() {
342eef6238f94b5046054d9ae9c06f775362893c0eeTadashi G. Takaoka        return mState.isInMomentarySwitchState();
3439e91472285a1b903631f1e3c998f5aa1efd3e98eTadashi G. Takaoka    }
3449e91472285a1b903631f1e3c998f5aa1efd3e98eTadashi G. Takaoka
345a5c96f376ad57e78a88942bb618e067054ed818aTadashi G. Takaoka    private boolean isVibrateAndSoundFeedbackRequired() {
346416ee19d330f08e329cce4fd7cb66003cfb64f4aTadashi G. Takaoka        return mKeyboardView != null && !mKeyboardView.isInSlidingKeyInput();
347cb2469ae17e0ca8a94767008fef3945cb2a3b406Tadashi G. Takaoka    }
348cb2469ae17e0ca8a94767008fef3945cb2a3b406Tadashi G. Takaoka
349b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani    /**
35006bc1db017b14614353137fde035d2eed666a74fTadashi G. Takaoka     * Updates state machine to figure out when to automatically switch back to the previous mode.
351b19668cfc17ad30afcc3c8c0407d47238ce1a90dAmith Yamasani     */
352f90fc105ab1159f43f536bcacdd1224c2c05bacbTadashi G. Takaoka    public void onCodeInput(final int code) {
35341016acacfa21354f59ed51db1f85ea3d99bf6a4Tadashi G. Takaoka        mState.onCodeInput(code, mLatinIME.getCurrentAutoCapsState());
354923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project    }
355979f8690967ff5409fe18f5085858ccdb8e0ccf1satok
35627e48447a449d2eb534dfa2dc07060727e1a8fb0Tadashi G. Takaoka    public MainKeyboardView getMainKeyboardView() {
357c150acc7c85ff2f5eeb5bd2c6ff288df4e46a355Tadashi G. Takaoka        return mKeyboardView;
358979f8690967ff5409fe18f5085858ccdb8e0ccf1satok    }
359979f8690967ff5409fe18f5085858ccdb8e0ccf1satok
360f90fc105ab1159f43f536bcacdd1224c2c05bacbTadashi G. Takaoka    public View onCreateInputView(final boolean isHardwareAcceleratedDrawingEnabled) {
361f3cd2bb33d1688fd6de01787140a1ef2de4b7723Tadashi G. Takaoka        if (mKeyboardView != null) {
362f3cd2bb33d1688fd6de01787140a1ef2de4b7723Tadashi G. Takaoka            mKeyboardView.closing();
363f3cd2bb33d1688fd6de01787140a1ef2de4b7723Tadashi G. Takaoka        }
364f3cd2bb33d1688fd6de01787140a1ef2de4b7723Tadashi G. Takaoka
3651f05cf6dab45c21d1ed334247929434d97c40584Tadashi G. Takaoka        setContextThemeWrapper(mLatinIME, mKeyboardTheme);
3661f05cf6dab45c21d1ed334247929434d97c40584Tadashi G. Takaoka        mCurrentInputView = (InputView)LayoutInflater.from(mThemeContext).inflate(
3671f05cf6dab45c21d1ed334247929434d97c40584Tadashi G. Takaoka                R.layout.input_view, null);
368f3cd2bb33d1688fd6de01787140a1ef2de4b7723Tadashi G. Takaoka
369c8e45ddb032554f4e9d4411d8ef47d98db62d77bTadashi G. Takaoka        mKeyboardView = (MainKeyboardView) mCurrentInputView.findViewById(R.id.keyboard_view);
370622d6a5b1b3d6a9140765b868abf1cdf412bc4f3Tadashi G. Takaoka        if (isHardwareAcceleratedDrawingEnabled) {
371622d6a5b1b3d6a9140765b868abf1cdf412bc4f3Tadashi G. Takaoka            mKeyboardView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
372622d6a5b1b3d6a9140765b868abf1cdf412bc4f3Tadashi G. Takaoka            // TODO: Should use LAYER_TYPE_SOFTWARE when hardware acceleration is off?
373622d6a5b1b3d6a9140765b868abf1cdf412bc4f3Tadashi G. Takaoka        }
37416950d65c323f99507d97cb7f0403dc653e2506cTadashi G. Takaoka        mKeyboardView.setKeyboardActionListener(mLatinIME);
3755ac4638f999db4fea8a9e24171dbceb640a10858Alan Viverette
3765ac4638f999db4fea8a9e24171dbceb640a10858Alan Viverette        // This always needs to be set since the accessibility state can
3775ac4638f999db4fea8a9e24171dbceb640a10858Alan Viverette        // potentially change without the input view being re-created.
3789a81ce92c381007affe6bb2310bf94c9856eaae1alanv        AccessibleKeyboardViewProxy.getInstance().setView(mKeyboardView);
3795ac4638f999db4fea8a9e24171dbceb640a10858Alan Viverette
380f3cd2bb33d1688fd6de01787140a1ef2de4b7723Tadashi G. Takaoka        return mCurrentInputView;
3818d7ecc70a6572c288064e41235e4ae8ad5b1b47eTadashi G. Takaoka    }
3828d7ecc70a6572c288064e41235e4ae8ad5b1b47eTadashi G. Takaoka
38323d27fefcbfe04df8f8762d5d50117a58fb011e9Tadashi G. Takaoka    public void onNetworkStateChanged() {
3845afc3ae2d9df0c2c93f2c66af13b128889ac3b5dTadashi G. Takaoka        if (mKeyboardView != null) {
385cb389ef0d6e6eec737c249e1729c2a2cdc30f341Tadashi G. Takaoka            mKeyboardView.updateShortcutKey(mSubtypeSwitcher.isShortcutImeReady());
38623d27fefcbfe04df8f8762d5d50117a58fb011e9Tadashi G. Takaoka        }
38723d27fefcbfe04df8f8762d5d50117a58fb011e9Tadashi G. Takaoka    }
38823d27fefcbfe04df8f8762d5d50117a58fb011e9Tadashi G. Takaoka
389f90fc105ab1159f43f536bcacdd1224c2c05bacbTadashi G. Takaoka    public void onAutoCorrectionStateChanged(final boolean isAutoCorrection) {
3905e4e05afd2825bf7acb594fef5e7bd21c751dd63Tadashi G. Takaoka        if (mIsAutoCorrectionActive != isAutoCorrection) {
3911b1f7f907f6c7d6e849c88ca06c3608bc84d7c5fTadashi G. Takaoka            mIsAutoCorrectionActive = isAutoCorrection;
3924112dc05002d7a880e558418639cf25c4bd02a5aTadashi G. Takaoka            if (mKeyboardView != null) {
3934112dc05002d7a880e558418639cf25c4bd02a5aTadashi G. Takaoka                mKeyboardView.updateAutoCorrectionState(isAutoCorrection);
3945e4e05afd2825bf7acb594fef5e7bd21c751dd63Tadashi G. Takaoka            }
39541feaaadb758a8b31d3e436063b4b5faed104d4dsatok        }
39641feaaadb758a8b31d3e436063b4b5faed104d4dsatok    }
397adbd9ae105e06287b59379d7f7127d95fd0663f4Jean Chalard
3986686e63f2158eff07e39ff002ba211d0578f2a4fJean Chalard    public int getKeyboardShiftMode() {
399d445b56ce14152b30143302899790af255691148Tadashi G. Takaoka        final Keyboard keyboard = getKeyboard();
400d445b56ce14152b30143302899790af255691148Tadashi G. Takaoka        if (keyboard == null) {
401d445b56ce14152b30143302899790af255691148Tadashi G. Takaoka            return WordComposer.CAPS_MODE_OFF;
402d445b56ce14152b30143302899790af255691148Tadashi G. Takaoka        }
403d445b56ce14152b30143302899790af255691148Tadashi G. Takaoka        switch (keyboard.mId.mElementId) {
404adbd9ae105e06287b59379d7f7127d95fd0663f4Jean Chalard        case KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCKED:
405adbd9ae105e06287b59379d7f7127d95fd0663f4Jean Chalard        case KeyboardId.ELEMENT_ALPHABET_SHIFT_LOCK_SHIFTED:
406adbd9ae105e06287b59379d7f7127d95fd0663f4Jean Chalard            return WordComposer.CAPS_MODE_MANUAL_SHIFT_LOCKED;
407adbd9ae105e06287b59379d7f7127d95fd0663f4Jean Chalard        case KeyboardId.ELEMENT_ALPHABET_MANUAL_SHIFTED:
408adbd9ae105e06287b59379d7f7127d95fd0663f4Jean Chalard            return WordComposer.CAPS_MODE_MANUAL_SHIFTED;
4096686e63f2158eff07e39ff002ba211d0578f2a4fJean Chalard        case KeyboardId.ELEMENT_ALPHABET_AUTOMATIC_SHIFTED:
4106686e63f2158eff07e39ff002ba211d0578f2a4fJean Chalard            return WordComposer.CAPS_MODE_AUTO_SHIFTED;
411adbd9ae105e06287b59379d7f7127d95fd0663f4Jean Chalard        default:
412adbd9ae105e06287b59379d7f7127d95fd0663f4Jean Chalard            return WordComposer.CAPS_MODE_OFF;
413adbd9ae105e06287b59379d7f7127d95fd0663f4Jean Chalard        }
414adbd9ae105e06287b59379d7f7127d95fd0663f4Jean Chalard    }
415923bf41f853a544fd0d71fbf7dc90359ec35981The Android Open Source Project}
416