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