InputMethodAndLanguageSettings.java revision bf677f48b73fc8d6fea9f09ad9d0e423f982d260
1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/* 2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License. 6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at 7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and 14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License. 15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 170417e4094713c5f4dac700b645000d0959bf62fasatokpackage com.android.settings.inputmethod; 180417e4094713c5f4dac700b645000d0959bf62fasatok 190417e4094713c5f4dac700b645000d0959bf62fasatokimport com.android.settings.R; 20e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brownimport com.android.settings.Settings.KeyboardLayoutPickerActivity; 21e077d2b607032fb66a4a046aa4b46945d32d281esatokimport com.android.settings.Settings.SpellCheckersSettingsActivity; 220417e4094713c5f4dac700b645000d0959bf62fasatokimport com.android.settings.SettingsPreferenceFragment; 230417e4094713c5f4dac700b645000d0959bf62fasatokimport com.android.settings.Utils; 24b44161f3ed9b91f39086247d8efbdac42656b93bAmith Yamasaniimport com.android.settings.VoiceInputOutputSettings; 25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 26c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalardimport android.app.Activity; 27b9509d046c911b7b334aa45f693c49a7182ef470satokimport android.content.ContentResolver; 28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 293fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport android.content.Intent; 303fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport android.content.pm.PackageManager; 31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.res.Configuration; 32b9509d046c911b7b334aa45f693c49a7182ef470satokimport android.database.ContentObserver; 33e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brownimport android.hardware.input.InputManager; 344397f406a3c9e09ca2d5174ba46328345faa504eJeff Brownimport android.hardware.input.KeyboardLayout; 35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 36b9509d046c911b7b334aa45f693c49a7182ef470satokimport android.os.Handler; 373fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport android.preference.CheckBoxPreference; 38c88a7ff1efd10374974e45768bde1658cc1d8483satokimport android.preference.ListPreference; 39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference; 403fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport android.preference.PreferenceCategory; 41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceScreen; 42c88a7ff1efd10374974e45768bde1658cc1d8483satokimport android.provider.Settings; 433fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport android.provider.Settings.System; 443fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport android.text.TextUtils; 45e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brownimport android.view.InputDevice; 463fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport android.view.inputmethod.InputMethodInfo; 47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.inputmethod.InputMethodManager; 48c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard 493fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport java.util.ArrayList; 503fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport java.util.Collections; 513fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport java.util.List; 52f54622e46c9164e4ab46c09c9c3ff173828d5940Jean Chalardimport java.util.TreeSet; 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 54c88a7ff1efd10374974e45768bde1658cc1d8483satokpublic class InputMethodAndLanguageSettings extends SettingsPreferenceFragment 55766b286187d02b3da6e0142376a4478072f30a16Jeff Brown implements Preference.OnPreferenceChangeListener, InputManager.InputDeviceListener, 56766b286187d02b3da6e0142376a4478072f30a16Jeff Brown KeyboardLayoutDialogFragment.OnSetupKeyboardLayoutsListener { 570cc35e444bd71f117b6aed97e40ea4f3d82cd8faDaisuke Miyakawa 580f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani private static final String KEY_PHONE_LANGUAGE = "phone_language"; 59c88a7ff1efd10374974e45768bde1658cc1d8483satok private static final String KEY_CURRENT_INPUT_METHOD = "current_input_method"; 60c88a7ff1efd10374974e45768bde1658cc1d8483satok private static final String KEY_INPUT_METHOD_SELECTOR = "input_method_selector"; 6171ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard private static final String KEY_USER_DICTIONARY_SETTINGS = "key_user_dictionary_settings"; 623fa13775e805df6cc7244d3f93105c5d3a5b748fsatok // false: on ICS or later 633fa13775e805df6cc7244d3f93105c5d3a5b748fsatok private static final boolean SHOW_INPUT_METHOD_SWITCHER_SETTINGS = false; 6471ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard 653fa13775e805df6cc7244d3f93105c5d3a5b748fsatok private static final String[] sSystemSettingNames = { 663fa13775e805df6cc7244d3f93105c5d3a5b748fsatok System.TEXT_AUTO_REPLACE, System.TEXT_AUTO_CAPS, System.TEXT_AUTO_PUNCTUATE, 673fa13775e805df6cc7244d3f93105c5d3a5b748fsatok }; 683fa13775e805df6cc7244d3f93105c5d3a5b748fsatok 693fa13775e805df6cc7244d3f93105c5d3a5b748fsatok private static final String[] sHardKeyboardKeys = { 703fa13775e805df6cc7244d3f93105c5d3a5b748fsatok "auto_replace", "auto_caps", "auto_punctuate", 713fa13775e805df6cc7244d3f93105c5d3a5b748fsatok }; 7286997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project 73c88a7ff1efd10374974e45768bde1658cc1d8483satok private int mDefaultInputMethodSelectorVisibility = 0; 74c88a7ff1efd10374974e45768bde1658cc1d8483satok private ListPreference mShowInputMethodSelectorPref; 75e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown private PreferenceCategory mKeyboardSettingsCategory; 76e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown private PreferenceCategory mHardKeyboardCategory; 77f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown private PreferenceCategory mGameControllerCategory; 780f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani private Preference mLanguagePref; 79e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown private final ArrayList<InputMethodPreference> mInputMethodPreferenceList = 803fa13775e805df6cc7244d3f93105c5d3a5b748fsatok new ArrayList<InputMethodPreference>(); 81e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown private final ArrayList<PreferenceScreen> mHardKeyboardPreferenceList = 82e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown new ArrayList<PreferenceScreen>(); 8396cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown private InputManager mIm; 843fa13775e805df6cc7244d3f93105c5d3a5b748fsatok private InputMethodManager mImm; 853fa13775e805df6cc7244d3f93105c5d3a5b748fsatok private List<InputMethodInfo> mImis; 863fa13775e805df6cc7244d3f93105c5d3a5b748fsatok private boolean mIsOnlyImeSettings; 87b9509d046c911b7b334aa45f693c49a7182ef470satok private Handler mHandler; 88b9509d046c911b7b334aa45f693c49a7182ef470satok @SuppressWarnings("unused") 89b9509d046c911b7b334aa45f693c49a7182ef470satok private SettingsObserver mSettingsObserver; 90766b286187d02b3da6e0142376a4478072f30a16Jeff Brown private Intent mIntentWaitingForResult; 91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 93d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onCreate(Bundle icicle) { 94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(icicle); 95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project addPreferencesFromResource(R.xml.language_settings); 97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 98c88a7ff1efd10374974e45768bde1658cc1d8483satok try { 99c88a7ff1efd10374974e45768bde1658cc1d8483satok mDefaultInputMethodSelectorVisibility = Integer.valueOf( 100c88a7ff1efd10374974e45768bde1658cc1d8483satok getString(R.string.input_method_selector_visibility_default_value)); 101c88a7ff1efd10374974e45768bde1658cc1d8483satok } catch (NumberFormatException e) { 102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 10386997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project 104c88a7ff1efd10374974e45768bde1658cc1d8483satok if (getActivity().getAssets().getLocales().length == 1) { 105c88a7ff1efd10374974e45768bde1658cc1d8483satok // No "Select language" pref if there's only one system locale available. 106c88a7ff1efd10374974e45768bde1658cc1d8483satok getPreferenceScreen().removePreference(findPreference(KEY_PHONE_LANGUAGE)); 107afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 108c88a7ff1efd10374974e45768bde1658cc1d8483satok mLanguagePref = findPreference(KEY_PHONE_LANGUAGE); 109afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1103fa13775e805df6cc7244d3f93105c5d3a5b748fsatok if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) { 1113fa13775e805df6cc7244d3f93105c5d3a5b748fsatok mShowInputMethodSelectorPref = (ListPreference)findPreference( 1123fa13775e805df6cc7244d3f93105c5d3a5b748fsatok KEY_INPUT_METHOD_SELECTOR); 1133fa13775e805df6cc7244d3f93105c5d3a5b748fsatok mShowInputMethodSelectorPref.setOnPreferenceChangeListener(this); 1143fa13775e805df6cc7244d3f93105c5d3a5b748fsatok // TODO: Update current input method name on summary 1153fa13775e805df6cc7244d3f93105c5d3a5b748fsatok updateInputMethodSelectorSummary(loadInputMethodSelectorVisibility()); 1163fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 117b44161f3ed9b91f39086247d8efbdac42656b93bAmith Yamasani 118b44161f3ed9b91f39086247d8efbdac42656b93bAmith Yamasani new VoiceInputOutputSettings(this).onCreate(); 1193fa13775e805df6cc7244d3f93105c5d3a5b748fsatok 120e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown // Get references to dynamically constructed categories. 121e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown mHardKeyboardCategory = (PreferenceCategory)findPreference("hard_keyboard"); 122e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown mKeyboardSettingsCategory = (PreferenceCategory)findPreference( 123e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown "keyboard_settings_category"); 124f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown mGameControllerCategory = (PreferenceCategory)findPreference( 125f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown "game_controller_settings_category"); 1263fa13775e805df6cc7244d3f93105c5d3a5b748fsatok 127e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown // Filter out irrelevant features if invoked from IME settings button. 1283fa13775e805df6cc7244d3f93105c5d3a5b748fsatok mIsOnlyImeSettings = Settings.ACTION_INPUT_METHOD_SETTINGS.equals( 1293fa13775e805df6cc7244d3f93105c5d3a5b748fsatok getActivity().getIntent().getAction()); 1308ff6222a9136cdbaeea9191869b90abd179efc85satok getActivity().getIntent().setAction(null); 131e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown if (mIsOnlyImeSettings) { 132e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown getPreferenceScreen().removeAll(); 133e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown getPreferenceScreen().addPreference(mHardKeyboardCategory); 134e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) { 135e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown getPreferenceScreen().addPreference(mShowInputMethodSelectorPref); 136e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown } 137e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown getPreferenceScreen().addPreference(mKeyboardSettingsCategory); 138e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown } 139e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown 140e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown // Build IME preference category. 1413fa13775e805df6cc7244d3f93105c5d3a5b748fsatok mImm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 1423fa13775e805df6cc7244d3f93105c5d3a5b748fsatok mImis = mImm.getInputMethodList(); 143e077d2b607032fb66a4a046aa4b46945d32d281esatok 144e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown mKeyboardSettingsCategory.removeAll(); 145e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown if (!mIsOnlyImeSettings) { 146e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown final PreferenceScreen currentIme = new PreferenceScreen(getActivity(), null); 147e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown currentIme.setKey(KEY_CURRENT_INPUT_METHOD); 148e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown currentIme.setTitle(getResources().getString(R.string.current_input_method)); 149e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown mKeyboardSettingsCategory.addPreference(currentIme); 150e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown } 151e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown 152e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown mInputMethodPreferenceList.clear(); 153e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown final int N = (mImis == null ? 0 : mImis.size()); 154e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown for (int i = 0; i < N; ++i) { 155e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown final InputMethodInfo imi = mImis.get(i); 156e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown final InputMethodPreference pref = getInputMethodPreference(imi, N); 157e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown mInputMethodPreferenceList.add(pref); 158e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown } 159e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown 160e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown if (!mInputMethodPreferenceList.isEmpty()) { 161e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown Collections.sort(mInputMethodPreferenceList); 162e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown for (int i = 0; i < N; ++i) { 163e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown mKeyboardSettingsCategory.addPreference(mInputMethodPreferenceList.get(i)); 164e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown } 165e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown } 166e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown 167f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown // Build hard keyboard and game controller preference categories. 16896cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown mIm = (InputManager)getActivity().getSystemService(Context.INPUT_SERVICE); 169f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown updateInputDevices(); 170e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown 171e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown // Spell Checker 172e077d2b607032fb66a4a046aa4b46945d32d281esatok final Intent intent = new Intent(Intent.ACTION_MAIN); 173e077d2b607032fb66a4a046aa4b46945d32d281esatok intent.setClass(getActivity(), SpellCheckersSettingsActivity.class); 174c0b569c317fad96abbf0ea23d07eb6d19f634ccfsatok final SpellCheckersPreference scp = ((SpellCheckersPreference)findPreference( 175c0b569c317fad96abbf0ea23d07eb6d19f634ccfsatok "spellcheckers_settings")); 176c0b569c317fad96abbf0ea23d07eb6d19f634ccfsatok if (scp != null) { 177c0b569c317fad96abbf0ea23d07eb6d19f634ccfsatok scp.setFragmentIntent(this, intent); 178c0b569c317fad96abbf0ea23d07eb6d19f634ccfsatok } 179b9509d046c911b7b334aa45f693c49a7182ef470satok 180b9509d046c911b7b334aa45f693c49a7182ef470satok mHandler = new Handler(); 181b9509d046c911b7b334aa45f693c49a7182ef470satok mSettingsObserver = new SettingsObserver(mHandler, getActivity()); 182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1839cd11a9aa5ac74ca89432655d019f68d789bc405satok 184c88a7ff1efd10374974e45768bde1658cc1d8483satok private void updateInputMethodSelectorSummary(int value) { 185c88a7ff1efd10374974e45768bde1658cc1d8483satok String[] inputMethodSelectorTitles = getResources().getStringArray( 186c88a7ff1efd10374974e45768bde1658cc1d8483satok R.array.input_method_selector_titles); 187c88a7ff1efd10374974e45768bde1658cc1d8483satok if (inputMethodSelectorTitles.length > value) { 188c88a7ff1efd10374974e45768bde1658cc1d8483satok mShowInputMethodSelectorPref.setSummary(inputMethodSelectorTitles[value]); 189c88a7ff1efd10374974e45768bde1658cc1d8483satok mShowInputMethodSelectorPref.setValue(String.valueOf(value)); 190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 19280a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project 19371ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard private void updateUserDictionaryPreference(Preference userDictionaryPreference) { 194c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard final Activity activity = getActivity(); 195f54622e46c9164e4ab46c09c9c3ff173828d5940Jean Chalard final TreeSet<String> localeList = UserDictionaryList.getUserDictionaryLocalesSet(activity); 196410e75b15bd7ecfcb8985c4368fec5e355e2c099Jean Chalard if (null == localeList) { 197410e75b15bd7ecfcb8985c4368fec5e355e2c099Jean Chalard // The locale list is null if and only if the user dictionary service is 198410e75b15bd7ecfcb8985c4368fec5e355e2c099Jean Chalard // not present or disabled. In this case we need to remove the preference. 1998ba5c42b213c4cd5b8773595fea2a1be6a18d711Jean Chalard getPreferenceScreen().removePreference(userDictionaryPreference); 200410e75b15bd7ecfcb8985c4368fec5e355e2c099Jean Chalard } else if (localeList.size() <= 1) { 2014e658ba969830e8c9617dc8938271df1ed09aa44Jean Chalard final Intent intent = 2024e658ba969830e8c9617dc8938271df1ed09aa44Jean Chalard new Intent(UserDictionaryList.USER_DICTIONARY_SETTINGS_INTENT_ACTION); 20371ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard userDictionaryPreference.setTitle(R.string.user_dict_single_settings_title); 2044e658ba969830e8c9617dc8938271df1ed09aa44Jean Chalard userDictionaryPreference.setIntent(intent); 205b9f837dd1da22f41c72e0cdc1454a486dbc6c448Jean Chalard userDictionaryPreference.setFragment( 206b9f837dd1da22f41c72e0cdc1454a486dbc6c448Jean Chalard com.android.settings.UserDictionarySettings.class.getName()); 20771ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard // If the size of localeList is 0, we don't set the locale parameter in the 20871ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard // extras. This will be interpreted by the UserDictionarySettings class as 20971ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard // meaning "the current locale". 210f54622e46c9164e4ab46c09c9c3ff173828d5940Jean Chalard // Note that with the current code for UserDictionaryList#getUserDictionaryLocalesSet() 21171ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard // the locale list always has at least one element, since it always includes the current 212f54622e46c9164e4ab46c09c9c3ff173828d5940Jean Chalard // locale explicitly. @see UserDictionaryList.getUserDictionaryLocalesSet(). 21371ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard if (localeList.size() == 1) { 21471ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard final String locale = (String)localeList.toArray()[0]; 21571ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard userDictionaryPreference.getExtras().putString("locale", locale); 21671ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard } 217c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard } else { 21871ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard userDictionaryPreference.setTitle(R.string.user_dict_multiple_settings_title); 21971ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard userDictionaryPreference.setFragment(UserDictionaryList.class.getName()); 220c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard } 221c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard } 222c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard 223afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 224d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onResume() { 225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onResume(); 22696cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown 22796cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown mIm.registerInputDeviceListener(this, null); 22896cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown 2293fa13775e805df6cc7244d3f93105c5d3a5b748fsatok if (!mIsOnlyImeSettings) { 2303fa13775e805df6cc7244d3f93105c5d3a5b748fsatok if (mLanguagePref != null) { 2313fa13775e805df6cc7244d3f93105c5d3a5b748fsatok Configuration conf = getResources().getConfiguration(); 2323fa13775e805df6cc7244d3f93105c5d3a5b748fsatok String locale = conf.locale.getDisplayName(conf.locale); 2333fa13775e805df6cc7244d3f93105c5d3a5b748fsatok if (locale != null && locale.length() > 1) { 2343fa13775e805df6cc7244d3f93105c5d3a5b748fsatok locale = Character.toUpperCase(locale.charAt(0)) + locale.substring(1); 2353fa13775e805df6cc7244d3f93105c5d3a5b748fsatok mLanguagePref.setSummary(locale); 2363fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 2373fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 2383fa13775e805df6cc7244d3f93105c5d3a5b748fsatok 2393fa13775e805df6cc7244d3f93105c5d3a5b748fsatok updateUserDictionaryPreference(findPreference(KEY_USER_DICTIONARY_SETTINGS)); 2403fa13775e805df6cc7244d3f93105c5d3a5b748fsatok if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) { 2413fa13775e805df6cc7244d3f93105c5d3a5b748fsatok mShowInputMethodSelectorPref.setOnPreferenceChangeListener(this); 2423fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 2433fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 2443fa13775e805df6cc7244d3f93105c5d3a5b748fsatok 2453fa13775e805df6cc7244d3f93105c5d3a5b748fsatok // Hard keyboard 246e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown if (!mHardKeyboardPreferenceList.isEmpty()) { 2473fa13775e805df6cc7244d3f93105c5d3a5b748fsatok for (int i = 0; i < sHardKeyboardKeys.length; ++i) { 248427a7ba1048d81b6b4fdcf29072c7584f6c18b87Jean Chalard CheckBoxPreference chkPref = (CheckBoxPreference) 2493fa13775e805df6cc7244d3f93105c5d3a5b748fsatok mHardKeyboardCategory.findPreference(sHardKeyboardKeys[i]); 2503fa13775e805df6cc7244d3f93105c5d3a5b748fsatok chkPref.setChecked( 2513fa13775e805df6cc7244d3f93105c5d3a5b748fsatok System.getInt(getContentResolver(), sSystemSettingNames[i], 1) > 0); 2520f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani } 2530f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani } 254c88a7ff1efd10374974e45768bde1658cc1d8483satok 255f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown updateInputDevices(); 256e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown 2573fa13775e805df6cc7244d3f93105c5d3a5b748fsatok // IME 2583fa13775e805df6cc7244d3f93105c5d3a5b748fsatok InputMethodAndSubtypeUtil.loadInputMethodSubtypeList( 2593fa13775e805df6cc7244d3f93105c5d3a5b748fsatok this, getContentResolver(), mImis, null); 2603fa13775e805df6cc7244d3f93105c5d3a5b748fsatok updateActiveInputMethodsSummary(); 261afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 262afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 264d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onPause() { 265afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onPause(); 26696cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown 26796cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown mIm.unregisterInputDeviceListener(this); 26896cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown 2693fa13775e805df6cc7244d3f93105c5d3a5b748fsatok if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) { 2703fa13775e805df6cc7244d3f93105c5d3a5b748fsatok mShowInputMethodSelectorPref.setOnPreferenceChangeListener(null); 2713fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 2723fa13775e805df6cc7244d3f93105c5d3a5b748fsatok InputMethodAndSubtypeUtil.saveInputMethodSubtypeList( 273e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown this, getContentResolver(), mImis, !mHardKeyboardPreferenceList.isEmpty()); 274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 275afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 27686997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project @Override 27796cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown public void onInputDeviceAdded(int deviceId) { 278f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown updateInputDevices(); 27996cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown } 28096cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown 28196cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown @Override 28296cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown public void onInputDeviceChanged(int deviceId) { 283f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown updateInputDevices(); 28496cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown } 28596cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown 28696cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown @Override 28796cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown public void onInputDeviceRemoved(int deviceId) { 288f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown updateInputDevices(); 28996cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown } 29096cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown 29196cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown @Override 29286997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 293afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Input Method stuff 294a718832e28095219a897c6e95e903c1a3fe57c12Ying Wang if (Utils.isMonkeyRunning()) { 295afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return false; 296afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 297c88a7ff1efd10374974e45768bde1658cc1d8483satok if (preference instanceof PreferenceScreen) { 298c88c6bbcd0d3901fe9f61bab82a17ec49ad62e6dDaisuke Miyakawa if (preference.getFragment() != null) { 299c88c6bbcd0d3901fe9f61bab82a17ec49ad62e6dDaisuke Miyakawa // Fragment will be handled correctly by the super class. 300c88a7ff1efd10374974e45768bde1658cc1d8483satok } else if (KEY_CURRENT_INPUT_METHOD.equals(preference.getKey())) { 301f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa final InputMethodManager imm = (InputMethodManager) 302f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa getSystemService(Context.INPUT_METHOD_SERVICE); 303103cc7da5f3ff9a46aa0b1dd9fcd0c7759c2d096satok imm.showInputMethodPicker(); 304afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 3053fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } else if (preference instanceof CheckBoxPreference) { 3063fa13775e805df6cc7244d3f93105c5d3a5b748fsatok final CheckBoxPreference chkPref = (CheckBoxPreference) preference; 307e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown if (!mHardKeyboardPreferenceList.isEmpty()) { 3083fa13775e805df6cc7244d3f93105c5d3a5b748fsatok for (int i = 0; i < sHardKeyboardKeys.length; ++i) { 3093fa13775e805df6cc7244d3f93105c5d3a5b748fsatok if (chkPref == mHardKeyboardCategory.findPreference(sHardKeyboardKeys[i])) { 3103fa13775e805df6cc7244d3f93105c5d3a5b748fsatok System.putInt(getContentResolver(), sSystemSettingNames[i], 3113fa13775e805df6cc7244d3f93105c5d3a5b748fsatok chkPref.isChecked() ? 1 : 0); 3123fa13775e805df6cc7244d3f93105c5d3a5b748fsatok return true; 3133fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 3143fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 3153fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 316f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown if (chkPref == mGameControllerCategory.findPreference("vibrate_input_devices")) { 317f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown System.putInt(getContentResolver(), Settings.System.VIBRATE_INPUT_DEVICES, 318f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown chkPref.isChecked() ? 1 : 0); 319f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown return true; 320f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown } 321afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 322afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return super.onPreferenceTreeClick(preferenceScreen, preference); 323afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 324afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 325c88a7ff1efd10374974e45768bde1658cc1d8483satok private void saveInputMethodSelectorVisibility(String value) { 326c88a7ff1efd10374974e45768bde1658cc1d8483satok try { 327c88a7ff1efd10374974e45768bde1658cc1d8483satok int intValue = Integer.valueOf(value); 328c88a7ff1efd10374974e45768bde1658cc1d8483satok Settings.Secure.putInt(getContentResolver(), 329c88a7ff1efd10374974e45768bde1658cc1d8483satok Settings.Secure.INPUT_METHOD_SELECTOR_VISIBILITY, intValue); 330c88a7ff1efd10374974e45768bde1658cc1d8483satok updateInputMethodSelectorSummary(intValue); 331c88a7ff1efd10374974e45768bde1658cc1d8483satok } catch(NumberFormatException e) { 332c88a7ff1efd10374974e45768bde1658cc1d8483satok } 333c88a7ff1efd10374974e45768bde1658cc1d8483satok } 334c88a7ff1efd10374974e45768bde1658cc1d8483satok 335c88a7ff1efd10374974e45768bde1658cc1d8483satok private int loadInputMethodSelectorVisibility() { 336c88a7ff1efd10374974e45768bde1658cc1d8483satok return Settings.Secure.getInt(getContentResolver(), 337c88a7ff1efd10374974e45768bde1658cc1d8483satok Settings.Secure.INPUT_METHOD_SELECTOR_VISIBILITY, 338c88a7ff1efd10374974e45768bde1658cc1d8483satok mDefaultInputMethodSelectorVisibility); 339c88a7ff1efd10374974e45768bde1658cc1d8483satok } 340c88a7ff1efd10374974e45768bde1658cc1d8483satok 34120108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai @Override 342c88a7ff1efd10374974e45768bde1658cc1d8483satok public boolean onPreferenceChange(Preference preference, Object value) { 3433fa13775e805df6cc7244d3f93105c5d3a5b748fsatok if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) { 3443fa13775e805df6cc7244d3f93105c5d3a5b748fsatok if (preference == mShowInputMethodSelectorPref) { 3453fa13775e805df6cc7244d3f93105c5d3a5b748fsatok if (value instanceof String) { 3463fa13775e805df6cc7244d3f93105c5d3a5b748fsatok saveInputMethodSelectorVisibility((String)value); 3473fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 348c88a7ff1efd10374974e45768bde1658cc1d8483satok } 34920108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai } 350c88a7ff1efd10374974e45768bde1658cc1d8483satok return false; 35120108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai } 35220108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai 3533fa13775e805df6cc7244d3f93105c5d3a5b748fsatok private void updateActiveInputMethodsSummary() { 3543fa13775e805df6cc7244d3f93105c5d3a5b748fsatok for (Preference pref : mInputMethodPreferenceList) { 3553fa13775e805df6cc7244d3f93105c5d3a5b748fsatok if (pref instanceof InputMethodPreference) { 3563fa13775e805df6cc7244d3f93105c5d3a5b748fsatok ((InputMethodPreference)pref).updateSummary(); 3573fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 3583fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 359b9509d046c911b7b334aa45f693c49a7182ef470satok updateCurrentImeName(); 360b9509d046c911b7b334aa45f693c49a7182ef470satok } 361b9509d046c911b7b334aa45f693c49a7182ef470satok 362b9509d046c911b7b334aa45f693c49a7182ef470satok private void updateCurrentImeName() { 363b9509d046c911b7b334aa45f693c49a7182ef470satok final Context context = getActivity(); 364b9509d046c911b7b334aa45f693c49a7182ef470satok if (context == null || mImm == null) return; 365b9509d046c911b7b334aa45f693c49a7182ef470satok final Preference curPref = getPreferenceScreen().findPreference(KEY_CURRENT_INPUT_METHOD); 366b9509d046c911b7b334aa45f693c49a7182ef470satok if (curPref != null) { 367b9509d046c911b7b334aa45f693c49a7182ef470satok final CharSequence curIme = InputMethodAndSubtypeUtil.getCurrentInputMethodName( 368b9509d046c911b7b334aa45f693c49a7182ef470satok context, getContentResolver(), mImm, mImis, getPackageManager()); 369b9509d046c911b7b334aa45f693c49a7182ef470satok if (!TextUtils.isEmpty(curIme)) { 370b9509d046c911b7b334aa45f693c49a7182ef470satok synchronized(this) { 371b9509d046c911b7b334aa45f693c49a7182ef470satok curPref.setSummary(curIme); 372b9509d046c911b7b334aa45f693c49a7182ef470satok } 373b9509d046c911b7b334aa45f693c49a7182ef470satok } 374b9509d046c911b7b334aa45f693c49a7182ef470satok } 3753fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 3763fa13775e805df6cc7244d3f93105c5d3a5b748fsatok 3773fa13775e805df6cc7244d3f93105c5d3a5b748fsatok private InputMethodPreference getInputMethodPreference(InputMethodInfo imi, int imiSize) { 3783fa13775e805df6cc7244d3f93105c5d3a5b748fsatok final PackageManager pm = getPackageManager(); 3793fa13775e805df6cc7244d3f93105c5d3a5b748fsatok final CharSequence label = imi.loadLabel(pm); 3803fa13775e805df6cc7244d3f93105c5d3a5b748fsatok // IME settings 3813fa13775e805df6cc7244d3f93105c5d3a5b748fsatok final Intent intent; 3823fa13775e805df6cc7244d3f93105c5d3a5b748fsatok final String settingsActivity = imi.getSettingsActivity(); 3833fa13775e805df6cc7244d3f93105c5d3a5b748fsatok if (!TextUtils.isEmpty(settingsActivity)) { 3843fa13775e805df6cc7244d3f93105c5d3a5b748fsatok intent = new Intent(Intent.ACTION_MAIN); 3853fa13775e805df6cc7244d3f93105c5d3a5b748fsatok intent.setClassName(imi.getPackageName(), settingsActivity); 3863fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } else { 3873fa13775e805df6cc7244d3f93105c5d3a5b748fsatok intent = null; 3883fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 3893fa13775e805df6cc7244d3f93105c5d3a5b748fsatok 3903fa13775e805df6cc7244d3f93105c5d3a5b748fsatok // Add a check box for enabling/disabling IME 3913fa13775e805df6cc7244d3f93105c5d3a5b748fsatok InputMethodPreference pref = new InputMethodPreference(this, intent, mImm, imi, imiSize); 3923fa13775e805df6cc7244d3f93105c5d3a5b748fsatok pref.setKey(imi.getId()); 3933fa13775e805df6cc7244d3f93105c5d3a5b748fsatok pref.setTitle(label); 3943fa13775e805df6cc7244d3f93105c5d3a5b748fsatok return pref; 3953fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 3963fa13775e805df6cc7244d3f93105c5d3a5b748fsatok 397f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown private void updateInputDevices() { 398f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown updateHardKeyboards(); 399f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown updateGameControllers(); 400f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown } 401f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown 402e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown private void updateHardKeyboards() { 403e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown mHardKeyboardPreferenceList.clear(); 404e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown if (getResources().getConfiguration().keyboard == Configuration.KEYBOARD_QWERTY) { 405e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown final int[] devices = InputDevice.getDeviceIds(); 406e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown for (int i = 0; i < devices.length; i++) { 407e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown InputDevice device = InputDevice.getDevice(devices[i]); 408e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown if (device != null 4094397f406a3c9e09ca2d5174ba46328345faa504eJeff Brown && !device.isVirtual() 410bf677f48b73fc8d6fea9f09ad9d0e423f982d260Jeff Brown && device.isFullKeyboard()) { 411e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown final String inputDeviceDescriptor = device.getDescriptor(); 412e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown final String keyboardLayoutDescriptor = 413766b286187d02b3da6e0142376a4478072f30a16Jeff Brown mIm.getCurrentKeyboardLayoutForInputDevice(inputDeviceDescriptor); 414e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown final KeyboardLayout keyboardLayout = keyboardLayoutDescriptor != null ? 41596cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown mIm.getKeyboardLayout(keyboardLayoutDescriptor) : null; 416e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown 417e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown final PreferenceScreen pref = new PreferenceScreen(getActivity(), null); 418e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown pref.setTitle(device.getName()); 419e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown if (keyboardLayout != null) { 420a350352e03a1cd08942cce99d7e5f6a1b48c224fJeff Brown pref.setSummary(keyboardLayout.toString()); 421512d0cb3eb82d3e95807f018b035fba8a6d48f34Jeff Brown } else { 422512d0cb3eb82d3e95807f018b035fba8a6d48f34Jeff Brown pref.setSummary(R.string.keyboard_layout_default_label); 423e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown } 424766b286187d02b3da6e0142376a4478072f30a16Jeff Brown pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { 425766b286187d02b3da6e0142376a4478072f30a16Jeff Brown @Override 426766b286187d02b3da6e0142376a4478072f30a16Jeff Brown public boolean onPreferenceClick(Preference preference) { 427766b286187d02b3da6e0142376a4478072f30a16Jeff Brown showKeyboardLayoutDialog(inputDeviceDescriptor); 428766b286187d02b3da6e0142376a4478072f30a16Jeff Brown return true; 429766b286187d02b3da6e0142376a4478072f30a16Jeff Brown } 430766b286187d02b3da6e0142376a4478072f30a16Jeff Brown }); 431e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown mHardKeyboardPreferenceList.add(pref); 432e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown } 4333fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 4343fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 4353fa13775e805df6cc7244d3f93105c5d3a5b748fsatok 436e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown if (!mHardKeyboardPreferenceList.isEmpty()) { 437e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown for (int i = mHardKeyboardCategory.getPreferenceCount(); i-- > 0; ) { 438e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown final Preference pref = mHardKeyboardCategory.getPreference(i); 439e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown if (pref.getOrder() < 1000) { 440e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown mHardKeyboardCategory.removePreference(pref); 441e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown } 442e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown } 4433fa13775e805df6cc7244d3f93105c5d3a5b748fsatok 444e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown Collections.sort(mHardKeyboardPreferenceList); 445e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown final int count = mHardKeyboardPreferenceList.size(); 446e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown for (int i = 0; i < count; i++) { 447e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown final Preference pref = mHardKeyboardPreferenceList.get(i); 448e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown pref.setOrder(i); 449e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown mHardKeyboardCategory.addPreference(pref); 450e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown } 45196cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown 45296cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown getPreferenceScreen().addPreference(mHardKeyboardCategory); 453e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown } else { 454e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown getPreferenceScreen().removePreference(mHardKeyboardCategory); 4553fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 4563fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 457b9509d046c911b7b334aa45f693c49a7182ef470satok 458766b286187d02b3da6e0142376a4478072f30a16Jeff Brown private void showKeyboardLayoutDialog(String inputDeviceDescriptor) { 459766b286187d02b3da6e0142376a4478072f30a16Jeff Brown KeyboardLayoutDialogFragment fragment = 460766b286187d02b3da6e0142376a4478072f30a16Jeff Brown new KeyboardLayoutDialogFragment(inputDeviceDescriptor); 461766b286187d02b3da6e0142376a4478072f30a16Jeff Brown fragment.setTargetFragment(this, 0); 462766b286187d02b3da6e0142376a4478072f30a16Jeff Brown fragment.show(getActivity().getFragmentManager(), "keyboardLayout"); 463766b286187d02b3da6e0142376a4478072f30a16Jeff Brown } 464766b286187d02b3da6e0142376a4478072f30a16Jeff Brown 465766b286187d02b3da6e0142376a4478072f30a16Jeff Brown @Override 466766b286187d02b3da6e0142376a4478072f30a16Jeff Brown public void onSetupKeyboardLayouts(String inputDeviceDescriptor) { 467766b286187d02b3da6e0142376a4478072f30a16Jeff Brown final Intent intent = new Intent(Intent.ACTION_MAIN); 468766b286187d02b3da6e0142376a4478072f30a16Jeff Brown intent.setClass(getActivity(), KeyboardLayoutPickerActivity.class); 469766b286187d02b3da6e0142376a4478072f30a16Jeff Brown intent.putExtra(KeyboardLayoutPickerFragment.EXTRA_INPUT_DEVICE_DESCRIPTOR, 470766b286187d02b3da6e0142376a4478072f30a16Jeff Brown inputDeviceDescriptor); 471766b286187d02b3da6e0142376a4478072f30a16Jeff Brown mIntentWaitingForResult = intent; 472766b286187d02b3da6e0142376a4478072f30a16Jeff Brown startActivityForResult(intent, 0); 473766b286187d02b3da6e0142376a4478072f30a16Jeff Brown } 474766b286187d02b3da6e0142376a4478072f30a16Jeff Brown 475766b286187d02b3da6e0142376a4478072f30a16Jeff Brown @Override 476766b286187d02b3da6e0142376a4478072f30a16Jeff Brown public void onActivityResult(int requestCode, int resultCode, Intent data) { 477766b286187d02b3da6e0142376a4478072f30a16Jeff Brown super.onActivityResult(requestCode, resultCode, data); 478766b286187d02b3da6e0142376a4478072f30a16Jeff Brown 479766b286187d02b3da6e0142376a4478072f30a16Jeff Brown if (mIntentWaitingForResult != null) { 480766b286187d02b3da6e0142376a4478072f30a16Jeff Brown String inputDeviceDescriptor = mIntentWaitingForResult.getStringExtra( 481766b286187d02b3da6e0142376a4478072f30a16Jeff Brown KeyboardLayoutPickerFragment.EXTRA_INPUT_DEVICE_DESCRIPTOR); 482766b286187d02b3da6e0142376a4478072f30a16Jeff Brown mIntentWaitingForResult = null; 483766b286187d02b3da6e0142376a4478072f30a16Jeff Brown showKeyboardLayoutDialog(inputDeviceDescriptor); 484766b286187d02b3da6e0142376a4478072f30a16Jeff Brown } 485766b286187d02b3da6e0142376a4478072f30a16Jeff Brown } 486766b286187d02b3da6e0142376a4478072f30a16Jeff Brown 487f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown private void updateGameControllers() { 488f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown if (haveInputDeviceWithVibrator()) { 489f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown getPreferenceScreen().addPreference(mGameControllerCategory); 490f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown 491f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown CheckBoxPreference chkPref = (CheckBoxPreference) 492f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown mGameControllerCategory.findPreference("vibrate_input_devices"); 493f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown chkPref.setChecked(System.getInt(getContentResolver(), 494f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown Settings.System.VIBRATE_INPUT_DEVICES, 1) > 0); 495f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown } else { 496f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown getPreferenceScreen().removePreference(mGameControllerCategory); 497f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown } 498f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown } 499f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown 500f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown private boolean haveInputDeviceWithVibrator() { 501f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown final int[] devices = InputDevice.getDeviceIds(); 502f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown for (int i = 0; i < devices.length; i++) { 503f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown InputDevice device = InputDevice.getDevice(devices[i]); 504f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown if (device != null && !device.isVirtual() && device.getVibrator().hasVibrator()) { 505f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown return true; 506f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown } 507f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown } 508f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown return false; 509f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown } 510f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown 511b9509d046c911b7b334aa45f693c49a7182ef470satok private class SettingsObserver extends ContentObserver { 512b9509d046c911b7b334aa45f693c49a7182ef470satok public SettingsObserver(Handler handler, Context context) { 513b9509d046c911b7b334aa45f693c49a7182ef470satok super(handler); 514b9509d046c911b7b334aa45f693c49a7182ef470satok final ContentResolver cr = context.getContentResolver(); 515b9509d046c911b7b334aa45f693c49a7182ef470satok cr.registerContentObserver( 516b9509d046c911b7b334aa45f693c49a7182ef470satok Settings.Secure.getUriFor(Settings.Secure.DEFAULT_INPUT_METHOD), false, this); 517b9509d046c911b7b334aa45f693c49a7182ef470satok cr.registerContentObserver(Settings.Secure.getUriFor( 518b9509d046c911b7b334aa45f693c49a7182ef470satok Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE), false, this); 519b9509d046c911b7b334aa45f693c49a7182ef470satok } 520b9509d046c911b7b334aa45f693c49a7182ef470satok 521b9509d046c911b7b334aa45f693c49a7182ef470satok @Override public void onChange(boolean selfChange) { 522b9509d046c911b7b334aa45f693c49a7182ef470satok updateCurrentImeName(); 523b9509d046c911b7b334aa45f693c49a7182ef470satok } 524b9509d046c911b7b334aa45f693c49a7182ef470satok } 525afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 526