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