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; 23b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataokaimport com.android.settings.UserDictionarySettings; 240417e4094713c5f4dac700b645000d0959bf62fasatokimport com.android.settings.Utils; 25b44161f3ed9b91f39086247d8efbdac42656b93bAmith Yamasaniimport com.android.settings.VoiceInputOutputSettings; 26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 27c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalardimport android.app.Activity; 28b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataokaimport android.app.Fragment; 29b9509d046c911b7b334aa45f693c49a7182ef470satokimport android.content.ContentResolver; 30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 313fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport android.content.Intent; 323fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport android.content.pm.PackageManager; 33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.res.Configuration; 34140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasaniimport android.content.res.Resources; 35b9509d046c911b7b334aa45f693c49a7182ef470satokimport android.database.ContentObserver; 36e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brownimport android.hardware.input.InputManager; 374397f406a3c9e09ca2d5174ba46328345faa504eJeff Brownimport android.hardware.input.KeyboardLayout; 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 39b9509d046c911b7b334aa45f693c49a7182ef470satokimport android.os.Handler; 403fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport android.preference.CheckBoxPreference; 41c88a7ff1efd10374974e45768bde1658cc1d8483satokimport android.preference.ListPreference; 42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference; 43c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataokaimport android.preference.Preference.OnPreferenceChangeListener; 44b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataokaimport android.preference.Preference.OnPreferenceClickListener; 453fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport android.preference.PreferenceCategory; 46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceScreen; 47c88a7ff1efd10374974e45768bde1658cc1d8483satokimport android.provider.Settings; 483fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport android.provider.Settings.System; 493fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport android.text.TextUtils; 50e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brownimport android.view.InputDevice; 513fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport android.view.inputmethod.InputMethodInfo; 52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.inputmethod.InputMethodManager; 53c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataokaimport android.widget.BaseAdapter; 54c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard 553fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport java.util.ArrayList; 563fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport java.util.Collections; 573fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport java.util.List; 58f54622e46c9164e4ab46c09c9c3ff173828d5940Jean Chalardimport java.util.TreeSet; 59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 60c88a7ff1efd10374974e45768bde1658cc1d8483satokpublic class InputMethodAndLanguageSettings extends SettingsPreferenceFragment 61766b286187d02b3da6e0142376a4478072f30a16Jeff Brown implements Preference.OnPreferenceChangeListener, InputManager.InputDeviceListener, 62766b286187d02b3da6e0142376a4478072f30a16Jeff Brown KeyboardLayoutDialogFragment.OnSetupKeyboardLayoutsListener { 630cc35e444bd71f117b6aed97e40ea4f3d82cd8faDaisuke Miyakawa 640f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani private static final String KEY_PHONE_LANGUAGE = "phone_language"; 65c88a7ff1efd10374974e45768bde1658cc1d8483satok private static final String KEY_CURRENT_INPUT_METHOD = "current_input_method"; 66c88a7ff1efd10374974e45768bde1658cc1d8483satok private static final String KEY_INPUT_METHOD_SELECTOR = "input_method_selector"; 6771ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard private static final String KEY_USER_DICTIONARY_SETTINGS = "key_user_dictionary_settings"; 683fa13775e805df6cc7244d3f93105c5d3a5b748fsatok // false: on ICS or later 693fa13775e805df6cc7244d3f93105c5d3a5b748fsatok private static final boolean SHOW_INPUT_METHOD_SWITCHER_SETTINGS = false; 7071ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard 713fa13775e805df6cc7244d3f93105c5d3a5b748fsatok private static final String[] sSystemSettingNames = { 723fa13775e805df6cc7244d3f93105c5d3a5b748fsatok System.TEXT_AUTO_REPLACE, System.TEXT_AUTO_CAPS, System.TEXT_AUTO_PUNCTUATE, 733fa13775e805df6cc7244d3f93105c5d3a5b748fsatok }; 743fa13775e805df6cc7244d3f93105c5d3a5b748fsatok 753fa13775e805df6cc7244d3f93105c5d3a5b748fsatok private static final String[] sHardKeyboardKeys = { 763fa13775e805df6cc7244d3f93105c5d3a5b748fsatok "auto_replace", "auto_caps", "auto_punctuate", 773fa13775e805df6cc7244d3f93105c5d3a5b748fsatok }; 7886997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project 79c88a7ff1efd10374974e45768bde1658cc1d8483satok private int mDefaultInputMethodSelectorVisibility = 0; 80c88a7ff1efd10374974e45768bde1658cc1d8483satok private ListPreference mShowInputMethodSelectorPref; 81e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown private PreferenceCategory mKeyboardSettingsCategory; 82e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown private PreferenceCategory mHardKeyboardCategory; 83f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown private PreferenceCategory mGameControllerCategory; 840f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani private Preference mLanguagePref; 85e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown private final ArrayList<InputMethodPreference> mInputMethodPreferenceList = 863fa13775e805df6cc7244d3f93105c5d3a5b748fsatok new ArrayList<InputMethodPreference>(); 87e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown private final ArrayList<PreferenceScreen> mHardKeyboardPreferenceList = 88e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown new ArrayList<PreferenceScreen>(); 8996cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown private InputManager mIm; 903fa13775e805df6cc7244d3f93105c5d3a5b748fsatok private InputMethodManager mImm; 913fa13775e805df6cc7244d3f93105c5d3a5b748fsatok private boolean mIsOnlyImeSettings; 92b9509d046c911b7b334aa45f693c49a7182ef470satok private Handler mHandler; 93b9509d046c911b7b334aa45f693c49a7182ef470satok private SettingsObserver mSettingsObserver; 94766b286187d02b3da6e0142376a4478072f30a16Jeff Brown private Intent mIntentWaitingForResult; 951ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka private InputMethodSettingValuesWrapper mInputMethodSettingValues; 96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 97c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka private final OnPreferenceChangeListener mOnImePreferenceChangedListener = 98c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka new OnPreferenceChangeListener() { 99c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka @Override 100c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka public boolean onPreferenceChange(Preference arg0, Object arg1) { 101cabde98bcddc2c609a5929b019ebe73f1a68e004Satoshi Kataoka InputMethodSettingValuesWrapper.getInstance( 102cabde98bcddc2c609a5929b019ebe73f1a68e004Satoshi Kataoka arg0.getContext()).refreshAllInputMethodAndSubtypes(); 103c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka ((BaseAdapter)getPreferenceScreen().getRootAdapter()).notifyDataSetChanged(); 104c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka updateInputMethodPreferenceViews(); 105c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka return true; 106c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka } 107c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka }; 108c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka 109afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 110d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onCreate(Bundle icicle) { 111afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(icicle); 112afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 113afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project addPreferencesFromResource(R.xml.language_settings); 114afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 115c88a7ff1efd10374974e45768bde1658cc1d8483satok try { 116c88a7ff1efd10374974e45768bde1658cc1d8483satok mDefaultInputMethodSelectorVisibility = Integer.valueOf( 117c88a7ff1efd10374974e45768bde1658cc1d8483satok getString(R.string.input_method_selector_visibility_default_value)); 118c88a7ff1efd10374974e45768bde1658cc1d8483satok } catch (NumberFormatException e) { 119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 12086997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project 121c88a7ff1efd10374974e45768bde1658cc1d8483satok if (getActivity().getAssets().getLocales().length == 1) { 122c88a7ff1efd10374974e45768bde1658cc1d8483satok // No "Select language" pref if there's only one system locale available. 123c88a7ff1efd10374974e45768bde1658cc1d8483satok getPreferenceScreen().removePreference(findPreference(KEY_PHONE_LANGUAGE)); 124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 125c88a7ff1efd10374974e45768bde1658cc1d8483satok mLanguagePref = findPreference(KEY_PHONE_LANGUAGE); 126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1273fa13775e805df6cc7244d3f93105c5d3a5b748fsatok if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) { 1283fa13775e805df6cc7244d3f93105c5d3a5b748fsatok mShowInputMethodSelectorPref = (ListPreference)findPreference( 1293fa13775e805df6cc7244d3f93105c5d3a5b748fsatok KEY_INPUT_METHOD_SELECTOR); 1303fa13775e805df6cc7244d3f93105c5d3a5b748fsatok mShowInputMethodSelectorPref.setOnPreferenceChangeListener(this); 1313fa13775e805df6cc7244d3f93105c5d3a5b748fsatok // TODO: Update current input method name on summary 1323fa13775e805df6cc7244d3f93105c5d3a5b748fsatok updateInputMethodSelectorSummary(loadInputMethodSelectorVisibility()); 1333fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 134b44161f3ed9b91f39086247d8efbdac42656b93bAmith Yamasani 135b44161f3ed9b91f39086247d8efbdac42656b93bAmith Yamasani new VoiceInputOutputSettings(this).onCreate(); 1363fa13775e805df6cc7244d3f93105c5d3a5b748fsatok 137e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown // Get references to dynamically constructed categories. 138e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown mHardKeyboardCategory = (PreferenceCategory)findPreference("hard_keyboard"); 139e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown mKeyboardSettingsCategory = (PreferenceCategory)findPreference( 140e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown "keyboard_settings_category"); 141f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown mGameControllerCategory = (PreferenceCategory)findPreference( 142f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown "game_controller_settings_category"); 1433fa13775e805df6cc7244d3f93105c5d3a5b748fsatok 144e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown // Filter out irrelevant features if invoked from IME settings button. 1453fa13775e805df6cc7244d3f93105c5d3a5b748fsatok mIsOnlyImeSettings = Settings.ACTION_INPUT_METHOD_SETTINGS.equals( 1463fa13775e805df6cc7244d3f93105c5d3a5b748fsatok getActivity().getIntent().getAction()); 1478ff6222a9136cdbaeea9191869b90abd179efc85satok getActivity().getIntent().setAction(null); 148e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown if (mIsOnlyImeSettings) { 149e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown getPreferenceScreen().removeAll(); 150e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown getPreferenceScreen().addPreference(mHardKeyboardCategory); 151e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) { 152e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown getPreferenceScreen().addPreference(mShowInputMethodSelectorPref); 153e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown } 154e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown getPreferenceScreen().addPreference(mKeyboardSettingsCategory); 155e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown } 156e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown 157e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown // Build IME preference category. 1583fa13775e805df6cc7244d3f93105c5d3a5b748fsatok mImm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 1591ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka mInputMethodSettingValues = InputMethodSettingValuesWrapper.getInstance(getActivity()); 160e077d2b607032fb66a4a046aa4b46945d32d281esatok 161e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown mKeyboardSettingsCategory.removeAll(); 162e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown if (!mIsOnlyImeSettings) { 163e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown final PreferenceScreen currentIme = new PreferenceScreen(getActivity(), null); 164e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown currentIme.setKey(KEY_CURRENT_INPUT_METHOD); 165e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown currentIme.setTitle(getResources().getString(R.string.current_input_method)); 166e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown mKeyboardSettingsCategory.addPreference(currentIme); 167e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown } 168e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown 169f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown // Build hard keyboard and game controller preference categories. 17096cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown mIm = (InputManager)getActivity().getSystemService(Context.INPUT_SERVICE); 171f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown updateInputDevices(); 172e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown 173e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown // Spell Checker 174e077d2b607032fb66a4a046aa4b46945d32d281esatok final Intent intent = new Intent(Intent.ACTION_MAIN); 175e077d2b607032fb66a4a046aa4b46945d32d281esatok intent.setClass(getActivity(), SpellCheckersSettingsActivity.class); 176c0b569c317fad96abbf0ea23d07eb6d19f634ccfsatok final SpellCheckersPreference scp = ((SpellCheckersPreference)findPreference( 177c0b569c317fad96abbf0ea23d07eb6d19f634ccfsatok "spellcheckers_settings")); 178c0b569c317fad96abbf0ea23d07eb6d19f634ccfsatok if (scp != null) { 179c0b569c317fad96abbf0ea23d07eb6d19f634ccfsatok scp.setFragmentIntent(this, intent); 180c0b569c317fad96abbf0ea23d07eb6d19f634ccfsatok } 181b9509d046c911b7b334aa45f693c49a7182ef470satok 182b9509d046c911b7b334aa45f693c49a7182ef470satok mHandler = new Handler(); 183b9509d046c911b7b334aa45f693c49a7182ef470satok mSettingsObserver = new SettingsObserver(mHandler, getActivity()); 184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1859cd11a9aa5ac74ca89432655d019f68d789bc405satok 186c88a7ff1efd10374974e45768bde1658cc1d8483satok private void updateInputMethodSelectorSummary(int value) { 187c88a7ff1efd10374974e45768bde1658cc1d8483satok String[] inputMethodSelectorTitles = getResources().getStringArray( 188c88a7ff1efd10374974e45768bde1658cc1d8483satok R.array.input_method_selector_titles); 189c88a7ff1efd10374974e45768bde1658cc1d8483satok if (inputMethodSelectorTitles.length > value) { 190c88a7ff1efd10374974e45768bde1658cc1d8483satok mShowInputMethodSelectorPref.setSummary(inputMethodSelectorTitles[value]); 191c88a7ff1efd10374974e45768bde1658cc1d8483satok mShowInputMethodSelectorPref.setValue(String.valueOf(value)); 192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 19480a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project 19571ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard private void updateUserDictionaryPreference(Preference userDictionaryPreference) { 196c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard final Activity activity = getActivity(); 19771c915b67213c38875a687d42f957b6fa2fa990bSatoshi Kataoka final TreeSet<String> localeSet = UserDictionaryList.getUserDictionaryLocalesSet(activity); 19871c915b67213c38875a687d42f957b6fa2fa990bSatoshi Kataoka if (null == localeSet) { 199410e75b15bd7ecfcb8985c4368fec5e355e2c099Jean Chalard // The locale list is null if and only if the user dictionary service is 200410e75b15bd7ecfcb8985c4368fec5e355e2c099Jean Chalard // not present or disabled. In this case we need to remove the preference. 2018ba5c42b213c4cd5b8773595fea2a1be6a18d711Jean Chalard getPreferenceScreen().removePreference(userDictionaryPreference); 202c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard } else { 203b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka userDictionaryPreference.setOnPreferenceClickListener( 204b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka new OnPreferenceClickListener() { 205b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka @Override 206b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka public boolean onPreferenceClick(Preference arg0) { 207b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka // Redirect to UserDictionarySettings if the user needs only one 208b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka // language. 209b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka final Bundle extras = new Bundle(); 210b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka final Class<? extends Fragment> targetFragment; 211b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka if (localeSet.size() <= 1) { 212b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka if (!localeSet.isEmpty()) { 213b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka // If the size of localeList is 0, we don't set the locale 214b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka // parameter in the extras. This will be interpreted by the 215b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka // UserDictionarySettings class as meaning 216b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka // "the current locale". Note that with the current code for 217b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka // UserDictionaryList#getUserDictionaryLocalesSet() 218b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka // the locale list always has at least one element, since it 219b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka // always includes the current locale explicitly. 220b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka // @see UserDictionaryList.getUserDictionaryLocalesSet(). 221b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka extras.putString("locale", localeSet.first()); 222b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka } 223b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka targetFragment = UserDictionarySettings.class; 224b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka } else { 225b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka targetFragment = UserDictionaryList.class; 226b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka } 227b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka startFragment(InputMethodAndLanguageSettings.this, 228b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka targetFragment.getCanonicalName(), -1, extras); 229b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka return true; 230b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka } 231b355683253506fbe6112ee81775caf02c1b7485cSatoshi Kataoka }); 232c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard } 233c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard } 234c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard 235afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 236d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onResume() { 237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onResume(); 23896cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown 2399bcc60704991879a0f8c9098eef26233942d6fe2Shuhrat Dehkanov mSettingsObserver.resume(); 240093cf6094c2fdf6d84e3ae7ecb53aa955e893c38Jean-Baptiste Queru mIm.registerInputDeviceListener(this, null); 24196cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown 2423fa13775e805df6cc7244d3f93105c5d3a5b748fsatok if (!mIsOnlyImeSettings) { 2433fa13775e805df6cc7244d3f93105c5d3a5b748fsatok if (mLanguagePref != null) { 2443fa13775e805df6cc7244d3f93105c5d3a5b748fsatok Configuration conf = getResources().getConfiguration(); 245140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani String language = conf.locale.getLanguage(); 246140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani String localeString; 247140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani // TODO: This is not an accurate way to display the locale, as it is 248140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani // just working around the fact that we support limited dialects 249140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani // and want to pretend that the language is valid for all locales. 250140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani // We need a way to support languages that aren't tied to a particular 251140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani // locale instead of hiding the locale qualifier. 252cbde502ebb2ffe00eec713a91e1f05d753b2b603Benjamin Poiesz if (language.equals("zz")) { 253cbde502ebb2ffe00eec713a91e1f05d753b2b603Benjamin Poiesz String country = conf.locale.getCountry(); 254cbde502ebb2ffe00eec713a91e1f05d753b2b603Benjamin Poiesz if (country.equals("ZZ")) { 255cbde502ebb2ffe00eec713a91e1f05d753b2b603Benjamin Poiesz localeString = "[Developer] Accented English (zz_ZZ)"; 256cbde502ebb2ffe00eec713a91e1f05d753b2b603Benjamin Poiesz } else if (country.equals("ZY")) { 257cbde502ebb2ffe00eec713a91e1f05d753b2b603Benjamin Poiesz localeString = "[Developer] Fake Bi-Directional (zz_ZY)"; 258cbde502ebb2ffe00eec713a91e1f05d753b2b603Benjamin Poiesz } else { 259cbde502ebb2ffe00eec713a91e1f05d753b2b603Benjamin Poiesz localeString = ""; 260cbde502ebb2ffe00eec713a91e1f05d753b2b603Benjamin Poiesz } 261cbde502ebb2ffe00eec713a91e1f05d753b2b603Benjamin Poiesz } else if (hasOnlyOneLanguageInstance(language, 262140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani Resources.getSystem().getAssets().getLocales())) { 263140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani localeString = conf.locale.getDisplayLanguage(conf.locale); 264140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani } else { 265140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani localeString = conf.locale.getDisplayName(conf.locale); 266140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani } 267140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani if (localeString.length() > 1) { 268140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani localeString = Character.toUpperCase(localeString.charAt(0)) 269140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani + localeString.substring(1); 270140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani mLanguagePref.setSummary(localeString); 2713fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 2723fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 2733fa13775e805df6cc7244d3f93105c5d3a5b748fsatok 2743fa13775e805df6cc7244d3f93105c5d3a5b748fsatok updateUserDictionaryPreference(findPreference(KEY_USER_DICTIONARY_SETTINGS)); 2753fa13775e805df6cc7244d3f93105c5d3a5b748fsatok if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) { 2763fa13775e805df6cc7244d3f93105c5d3a5b748fsatok mShowInputMethodSelectorPref.setOnPreferenceChangeListener(this); 2773fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 2783fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 2793fa13775e805df6cc7244d3f93105c5d3a5b748fsatok 2803fa13775e805df6cc7244d3f93105c5d3a5b748fsatok // Hard keyboard 281e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown if (!mHardKeyboardPreferenceList.isEmpty()) { 2823fa13775e805df6cc7244d3f93105c5d3a5b748fsatok for (int i = 0; i < sHardKeyboardKeys.length; ++i) { 283427a7ba1048d81b6b4fdcf29072c7584f6c18b87Jean Chalard CheckBoxPreference chkPref = (CheckBoxPreference) 2843fa13775e805df6cc7244d3f93105c5d3a5b748fsatok mHardKeyboardCategory.findPreference(sHardKeyboardKeys[i]); 2853fa13775e805df6cc7244d3f93105c5d3a5b748fsatok chkPref.setChecked( 2863fa13775e805df6cc7244d3f93105c5d3a5b748fsatok System.getInt(getContentResolver(), sSystemSettingNames[i], 1) > 0); 2870f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani } 2880f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani } 289c88a7ff1efd10374974e45768bde1658cc1d8483satok 290f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown updateInputDevices(); 291e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown 2921ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka // Refresh internal states in mInputMethodSettingValues to keep the latest 2931ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka // "InputMethodInfo"s and "InputMethodSubtype"s 2941ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka mInputMethodSettingValues.refreshAllInputMethodAndSubtypes(); 295c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka updateInputMethodPreferenceViews(); 296afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 297afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 298afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 299d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani public void onPause() { 300afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onPause(); 30196cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown 30296cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown mIm.unregisterInputDeviceListener(this); 303093cf6094c2fdf6d84e3ae7ecb53aa955e893c38Jean-Baptiste Queru mSettingsObserver.pause(); 30496cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown 3053fa13775e805df6cc7244d3f93105c5d3a5b748fsatok if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) { 3063fa13775e805df6cc7244d3f93105c5d3a5b748fsatok mShowInputMethodSelectorPref.setOnPreferenceChangeListener(null); 3073fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 3081ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka // TODO: Consolidate the logic to InputMethodSettingsWrapper 3093fa13775e805df6cc7244d3f93105c5d3a5b748fsatok InputMethodAndSubtypeUtil.saveInputMethodSubtypeList( 3101ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka this, getContentResolver(), mInputMethodSettingValues.getInputMethodList(), 3111ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka !mHardKeyboardPreferenceList.isEmpty()); 312afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 313afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 31486997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project @Override 31596cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown public void onInputDeviceAdded(int deviceId) { 316f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown updateInputDevices(); 31796cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown } 31896cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown 31996cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown @Override 32096cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown public void onInputDeviceChanged(int deviceId) { 321f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown updateInputDevices(); 32296cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown } 32396cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown 32496cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown @Override 32596cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown public void onInputDeviceRemoved(int deviceId) { 326f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown updateInputDevices(); 32796cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown } 32896cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown 32996cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown @Override 33086997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 331afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Input Method stuff 332a718832e28095219a897c6e95e903c1a3fe57c12Ying Wang if (Utils.isMonkeyRunning()) { 333afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return false; 334afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 335c88a7ff1efd10374974e45768bde1658cc1d8483satok if (preference instanceof PreferenceScreen) { 336c88c6bbcd0d3901fe9f61bab82a17ec49ad62e6dDaisuke Miyakawa if (preference.getFragment() != null) { 337c88c6bbcd0d3901fe9f61bab82a17ec49ad62e6dDaisuke Miyakawa // Fragment will be handled correctly by the super class. 338c88a7ff1efd10374974e45768bde1658cc1d8483satok } else if (KEY_CURRENT_INPUT_METHOD.equals(preference.getKey())) { 339f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa final InputMethodManager imm = (InputMethodManager) 340f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa getSystemService(Context.INPUT_METHOD_SERVICE); 341103cc7da5f3ff9a46aa0b1dd9fcd0c7759c2d096satok imm.showInputMethodPicker(); 342afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 3433fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } else if (preference instanceof CheckBoxPreference) { 3443fa13775e805df6cc7244d3f93105c5d3a5b748fsatok final CheckBoxPreference chkPref = (CheckBoxPreference) preference; 345e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown if (!mHardKeyboardPreferenceList.isEmpty()) { 3463fa13775e805df6cc7244d3f93105c5d3a5b748fsatok for (int i = 0; i < sHardKeyboardKeys.length; ++i) { 3473fa13775e805df6cc7244d3f93105c5d3a5b748fsatok if (chkPref == mHardKeyboardCategory.findPreference(sHardKeyboardKeys[i])) { 3483fa13775e805df6cc7244d3f93105c5d3a5b748fsatok System.putInt(getContentResolver(), sSystemSettingNames[i], 3493fa13775e805df6cc7244d3f93105c5d3a5b748fsatok chkPref.isChecked() ? 1 : 0); 3503fa13775e805df6cc7244d3f93105c5d3a5b748fsatok return true; 3513fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 3523fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 3533fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 354f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown if (chkPref == mGameControllerCategory.findPreference("vibrate_input_devices")) { 355f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown System.putInt(getContentResolver(), Settings.System.VIBRATE_INPUT_DEVICES, 356f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown chkPref.isChecked() ? 1 : 0); 357f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown return true; 358f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown } 359afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 360afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return super.onPreferenceTreeClick(preferenceScreen, preference); 361afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 362afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 363140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani private boolean hasOnlyOneLanguageInstance(String languageCode, String[] locales) { 364140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani int count = 0; 365140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani for (String localeCode : locales) { 366140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani if (localeCode.length() > 2 367140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani && localeCode.startsWith(languageCode)) { 368140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani count++; 369140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani if (count > 1) { 370140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani return false; 371140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani } 372140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani } 373140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani } 374140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani return count == 1; 375140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani } 376140b6f5234a9b49dd1ec431e7adcf10754daeab1Amith Yamasani 377c88a7ff1efd10374974e45768bde1658cc1d8483satok private void saveInputMethodSelectorVisibility(String value) { 378c88a7ff1efd10374974e45768bde1658cc1d8483satok try { 379c88a7ff1efd10374974e45768bde1658cc1d8483satok int intValue = Integer.valueOf(value); 380c88a7ff1efd10374974e45768bde1658cc1d8483satok Settings.Secure.putInt(getContentResolver(), 381c88a7ff1efd10374974e45768bde1658cc1d8483satok Settings.Secure.INPUT_METHOD_SELECTOR_VISIBILITY, intValue); 382c88a7ff1efd10374974e45768bde1658cc1d8483satok updateInputMethodSelectorSummary(intValue); 383c88a7ff1efd10374974e45768bde1658cc1d8483satok } catch(NumberFormatException e) { 384c88a7ff1efd10374974e45768bde1658cc1d8483satok } 385c88a7ff1efd10374974e45768bde1658cc1d8483satok } 386c88a7ff1efd10374974e45768bde1658cc1d8483satok 387c88a7ff1efd10374974e45768bde1658cc1d8483satok private int loadInputMethodSelectorVisibility() { 388c88a7ff1efd10374974e45768bde1658cc1d8483satok return Settings.Secure.getInt(getContentResolver(), 389c88a7ff1efd10374974e45768bde1658cc1d8483satok Settings.Secure.INPUT_METHOD_SELECTOR_VISIBILITY, 390c88a7ff1efd10374974e45768bde1658cc1d8483satok mDefaultInputMethodSelectorVisibility); 391c88a7ff1efd10374974e45768bde1658cc1d8483satok } 392c88a7ff1efd10374974e45768bde1658cc1d8483satok 39320108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai @Override 394c88a7ff1efd10374974e45768bde1658cc1d8483satok public boolean onPreferenceChange(Preference preference, Object value) { 3953fa13775e805df6cc7244d3f93105c5d3a5b748fsatok if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) { 3963fa13775e805df6cc7244d3f93105c5d3a5b748fsatok if (preference == mShowInputMethodSelectorPref) { 3973fa13775e805df6cc7244d3f93105c5d3a5b748fsatok if (value instanceof String) { 3983fa13775e805df6cc7244d3f93105c5d3a5b748fsatok saveInputMethodSelectorVisibility((String)value); 3993fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 400c88a7ff1efd10374974e45768bde1658cc1d8483satok } 40120108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai } 402c88a7ff1efd10374974e45768bde1658cc1d8483satok return false; 40320108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai } 40420108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai 405c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka private void updateInputMethodPreferenceViews() { 406c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka synchronized (mInputMethodPreferenceList) { 407ea90cd2fca08e5c65e54d8df1c208337e08fc541Satoshi Kataoka // Clear existing "InputMethodPreference"s 408ea90cd2fca08e5c65e54d8df1c208337e08fc541Satoshi Kataoka for (final InputMethodPreference imp : mInputMethodPreferenceList) { 409ea90cd2fca08e5c65e54d8df1c208337e08fc541Satoshi Kataoka mKeyboardSettingsCategory.removePreference(imp); 410ea90cd2fca08e5c65e54d8df1c208337e08fc541Satoshi Kataoka } 411ea90cd2fca08e5c65e54d8df1c208337e08fc541Satoshi Kataoka mInputMethodPreferenceList.clear(); 412ea90cd2fca08e5c65e54d8df1c208337e08fc541Satoshi Kataoka final List<InputMethodInfo> imis = mInputMethodSettingValues.getInputMethodList(); 413ea90cd2fca08e5c65e54d8df1c208337e08fc541Satoshi Kataoka final int N = (imis == null ? 0 : imis.size()); 414ea90cd2fca08e5c65e54d8df1c208337e08fc541Satoshi Kataoka for (int i = 0; i < N; ++i) { 415ea90cd2fca08e5c65e54d8df1c208337e08fc541Satoshi Kataoka final InputMethodInfo imi = imis.get(i); 416ea90cd2fca08e5c65e54d8df1c208337e08fc541Satoshi Kataoka final InputMethodPreference pref = getInputMethodPreference(imi); 417ea90cd2fca08e5c65e54d8df1c208337e08fc541Satoshi Kataoka pref.setOnImePreferenceChangeListener(mOnImePreferenceChangedListener); 418ea90cd2fca08e5c65e54d8df1c208337e08fc541Satoshi Kataoka mInputMethodPreferenceList.add(pref); 419ea90cd2fca08e5c65e54d8df1c208337e08fc541Satoshi Kataoka } 420ea90cd2fca08e5c65e54d8df1c208337e08fc541Satoshi Kataoka 421ea90cd2fca08e5c65e54d8df1c208337e08fc541Satoshi Kataoka if (!mInputMethodPreferenceList.isEmpty()) { 422ea90cd2fca08e5c65e54d8df1c208337e08fc541Satoshi Kataoka Collections.sort(mInputMethodPreferenceList); 423ea90cd2fca08e5c65e54d8df1c208337e08fc541Satoshi Kataoka for (int i = 0; i < N; ++i) { 424ea90cd2fca08e5c65e54d8df1c208337e08fc541Satoshi Kataoka mKeyboardSettingsCategory.addPreference(mInputMethodPreferenceList.get(i)); 425ea90cd2fca08e5c65e54d8df1c208337e08fc541Satoshi Kataoka } 426ea90cd2fca08e5c65e54d8df1c208337e08fc541Satoshi Kataoka } 427ea90cd2fca08e5c65e54d8df1c208337e08fc541Satoshi Kataoka 428ea90cd2fca08e5c65e54d8df1c208337e08fc541Satoshi Kataoka // update views status 429c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka for (Preference pref : mInputMethodPreferenceList) { 430c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka if (pref instanceof InputMethodPreference) { 431c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka ((InputMethodPreference) pref).updatePreferenceViews(); 432c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka } 4333fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 4343fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 435b9509d046c911b7b334aa45f693c49a7182ef470satok updateCurrentImeName(); 436aa4fa0ea0950ecd61af64a6bdeea109cfed64362Satoshi Kataoka // TODO: Consolidate the logic with InputMethodSettingsWrapper 437aa4fa0ea0950ecd61af64a6bdeea109cfed64362Satoshi Kataoka // CAVEAT: The preference class here does not know about the default value - that is 438aa4fa0ea0950ecd61af64a6bdeea109cfed64362Satoshi Kataoka // managed by the Input Method Manager Service, so in this case it could save the wrong 439aa4fa0ea0950ecd61af64a6bdeea109cfed64362Satoshi Kataoka // value. Hence we must update the checkboxes here. 440aa4fa0ea0950ecd61af64a6bdeea109cfed64362Satoshi Kataoka InputMethodAndSubtypeUtil.loadInputMethodSubtypeList( 441aa4fa0ea0950ecd61af64a6bdeea109cfed64362Satoshi Kataoka this, getContentResolver(), 442aa4fa0ea0950ecd61af64a6bdeea109cfed64362Satoshi Kataoka mInputMethodSettingValues.getInputMethodList(), null); 443b9509d046c911b7b334aa45f693c49a7182ef470satok } 444b9509d046c911b7b334aa45f693c49a7182ef470satok 445b9509d046c911b7b334aa45f693c49a7182ef470satok private void updateCurrentImeName() { 446b9509d046c911b7b334aa45f693c49a7182ef470satok final Context context = getActivity(); 447b9509d046c911b7b334aa45f693c49a7182ef470satok if (context == null || mImm == null) return; 448b9509d046c911b7b334aa45f693c49a7182ef470satok final Preference curPref = getPreferenceScreen().findPreference(KEY_CURRENT_INPUT_METHOD); 449b9509d046c911b7b334aa45f693c49a7182ef470satok if (curPref != null) { 4501ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka final CharSequence curIme = 4511ecdb22b4e7b97e34a0b5e557732b65aa00af4b7Satoshi Kataoka mInputMethodSettingValues.getCurrentInputMethodName(context); 452b9509d046c911b7b334aa45f693c49a7182ef470satok if (!TextUtils.isEmpty(curIme)) { 453b9509d046c911b7b334aa45f693c49a7182ef470satok synchronized(this) { 454b9509d046c911b7b334aa45f693c49a7182ef470satok curPref.setSummary(curIme); 455b9509d046c911b7b334aa45f693c49a7182ef470satok } 456b9509d046c911b7b334aa45f693c49a7182ef470satok } 457b9509d046c911b7b334aa45f693c49a7182ef470satok } 4583fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 4593fa13775e805df6cc7244d3f93105c5d3a5b748fsatok 460c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka private InputMethodPreference getInputMethodPreference(InputMethodInfo imi) { 4613fa13775e805df6cc7244d3f93105c5d3a5b748fsatok final PackageManager pm = getPackageManager(); 4623fa13775e805df6cc7244d3f93105c5d3a5b748fsatok final CharSequence label = imi.loadLabel(pm); 4633fa13775e805df6cc7244d3f93105c5d3a5b748fsatok // IME settings 4643fa13775e805df6cc7244d3f93105c5d3a5b748fsatok final Intent intent; 4653fa13775e805df6cc7244d3f93105c5d3a5b748fsatok final String settingsActivity = imi.getSettingsActivity(); 4663fa13775e805df6cc7244d3f93105c5d3a5b748fsatok if (!TextUtils.isEmpty(settingsActivity)) { 4673fa13775e805df6cc7244d3f93105c5d3a5b748fsatok intent = new Intent(Intent.ACTION_MAIN); 4683fa13775e805df6cc7244d3f93105c5d3a5b748fsatok intent.setClassName(imi.getPackageName(), settingsActivity); 4693fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } else { 4703fa13775e805df6cc7244d3f93105c5d3a5b748fsatok intent = null; 4713fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 4723fa13775e805df6cc7244d3f93105c5d3a5b748fsatok 4733fa13775e805df6cc7244d3f93105c5d3a5b748fsatok // Add a check box for enabling/disabling IME 474c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka final InputMethodPreference pref = 475c6fc8e46f2e78187cb751f2ae81e6101181c93c0Satoshi Kataoka new InputMethodPreference(this, intent, mImm, imi); 4763fa13775e805df6cc7244d3f93105c5d3a5b748fsatok pref.setKey(imi.getId()); 4773fa13775e805df6cc7244d3f93105c5d3a5b748fsatok pref.setTitle(label); 4783fa13775e805df6cc7244d3f93105c5d3a5b748fsatok return pref; 4793fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 4803fa13775e805df6cc7244d3f93105c5d3a5b748fsatok 481f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown private void updateInputDevices() { 482f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown updateHardKeyboards(); 483f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown updateGameControllers(); 484f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown } 485f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown 486e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown private void updateHardKeyboards() { 487e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown mHardKeyboardPreferenceList.clear(); 488e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown if (getResources().getConfiguration().keyboard == Configuration.KEYBOARD_QWERTY) { 489e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown final int[] devices = InputDevice.getDeviceIds(); 490e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown for (int i = 0; i < devices.length; i++) { 491e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown InputDevice device = InputDevice.getDevice(devices[i]); 492e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown if (device != null 4934397f406a3c9e09ca2d5174ba46328345faa504eJeff Brown && !device.isVirtual() 494bf677f48b73fc8d6fea9f09ad9d0e423f982d260Jeff Brown && device.isFullKeyboard()) { 495e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown final String inputDeviceDescriptor = device.getDescriptor(); 496e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown final String keyboardLayoutDescriptor = 497766b286187d02b3da6e0142376a4478072f30a16Jeff Brown mIm.getCurrentKeyboardLayoutForInputDevice(inputDeviceDescriptor); 498e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown final KeyboardLayout keyboardLayout = keyboardLayoutDescriptor != null ? 49996cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown mIm.getKeyboardLayout(keyboardLayoutDescriptor) : null; 500e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown 501e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown final PreferenceScreen pref = new PreferenceScreen(getActivity(), null); 502e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown pref.setTitle(device.getName()); 503e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown if (keyboardLayout != null) { 504a350352e03a1cd08942cce99d7e5f6a1b48c224fJeff Brown pref.setSummary(keyboardLayout.toString()); 505512d0cb3eb82d3e95807f018b035fba8a6d48f34Jeff Brown } else { 506512d0cb3eb82d3e95807f018b035fba8a6d48f34Jeff Brown pref.setSummary(R.string.keyboard_layout_default_label); 507e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown } 508766b286187d02b3da6e0142376a4478072f30a16Jeff Brown pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { 509766b286187d02b3da6e0142376a4478072f30a16Jeff Brown @Override 510766b286187d02b3da6e0142376a4478072f30a16Jeff Brown public boolean onPreferenceClick(Preference preference) { 511766b286187d02b3da6e0142376a4478072f30a16Jeff Brown showKeyboardLayoutDialog(inputDeviceDescriptor); 512766b286187d02b3da6e0142376a4478072f30a16Jeff Brown return true; 513766b286187d02b3da6e0142376a4478072f30a16Jeff Brown } 514766b286187d02b3da6e0142376a4478072f30a16Jeff Brown }); 515e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown mHardKeyboardPreferenceList.add(pref); 516e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown } 5173fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 5183fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 5193fa13775e805df6cc7244d3f93105c5d3a5b748fsatok 520e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown if (!mHardKeyboardPreferenceList.isEmpty()) { 521e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown for (int i = mHardKeyboardCategory.getPreferenceCount(); i-- > 0; ) { 522e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown final Preference pref = mHardKeyboardCategory.getPreference(i); 523e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown if (pref.getOrder() < 1000) { 524e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown mHardKeyboardCategory.removePreference(pref); 525e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown } 526e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown } 5273fa13775e805df6cc7244d3f93105c5d3a5b748fsatok 528e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown Collections.sort(mHardKeyboardPreferenceList); 529e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown final int count = mHardKeyboardPreferenceList.size(); 530e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown for (int i = 0; i < count; i++) { 531e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown final Preference pref = mHardKeyboardPreferenceList.get(i); 532e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown pref.setOrder(i); 533e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown mHardKeyboardCategory.addPreference(pref); 534e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown } 53596cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown 53696cdcd80a8ba9d9a808a712037c3e4fa3fdcf084Jeff Brown getPreferenceScreen().addPreference(mHardKeyboardCategory); 537e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown } else { 538e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown getPreferenceScreen().removePreference(mHardKeyboardCategory); 5393fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 5403fa13775e805df6cc7244d3f93105c5d3a5b748fsatok } 541b9509d046c911b7b334aa45f693c49a7182ef470satok 542766b286187d02b3da6e0142376a4478072f30a16Jeff Brown private void showKeyboardLayoutDialog(String inputDeviceDescriptor) { 543766b286187d02b3da6e0142376a4478072f30a16Jeff Brown KeyboardLayoutDialogFragment fragment = 544766b286187d02b3da6e0142376a4478072f30a16Jeff Brown new KeyboardLayoutDialogFragment(inputDeviceDescriptor); 545766b286187d02b3da6e0142376a4478072f30a16Jeff Brown fragment.setTargetFragment(this, 0); 546766b286187d02b3da6e0142376a4478072f30a16Jeff Brown fragment.show(getActivity().getFragmentManager(), "keyboardLayout"); 547766b286187d02b3da6e0142376a4478072f30a16Jeff Brown } 548766b286187d02b3da6e0142376a4478072f30a16Jeff Brown 549766b286187d02b3da6e0142376a4478072f30a16Jeff Brown @Override 550766b286187d02b3da6e0142376a4478072f30a16Jeff Brown public void onSetupKeyboardLayouts(String inputDeviceDescriptor) { 551766b286187d02b3da6e0142376a4478072f30a16Jeff Brown final Intent intent = new Intent(Intent.ACTION_MAIN); 552766b286187d02b3da6e0142376a4478072f30a16Jeff Brown intent.setClass(getActivity(), KeyboardLayoutPickerActivity.class); 553766b286187d02b3da6e0142376a4478072f30a16Jeff Brown intent.putExtra(KeyboardLayoutPickerFragment.EXTRA_INPUT_DEVICE_DESCRIPTOR, 554766b286187d02b3da6e0142376a4478072f30a16Jeff Brown inputDeviceDescriptor); 555766b286187d02b3da6e0142376a4478072f30a16Jeff Brown mIntentWaitingForResult = intent; 556766b286187d02b3da6e0142376a4478072f30a16Jeff Brown startActivityForResult(intent, 0); 557766b286187d02b3da6e0142376a4478072f30a16Jeff Brown } 558766b286187d02b3da6e0142376a4478072f30a16Jeff Brown 559766b286187d02b3da6e0142376a4478072f30a16Jeff Brown @Override 560766b286187d02b3da6e0142376a4478072f30a16Jeff Brown public void onActivityResult(int requestCode, int resultCode, Intent data) { 561766b286187d02b3da6e0142376a4478072f30a16Jeff Brown super.onActivityResult(requestCode, resultCode, data); 562766b286187d02b3da6e0142376a4478072f30a16Jeff Brown 563766b286187d02b3da6e0142376a4478072f30a16Jeff Brown if (mIntentWaitingForResult != null) { 564766b286187d02b3da6e0142376a4478072f30a16Jeff Brown String inputDeviceDescriptor = mIntentWaitingForResult.getStringExtra( 565766b286187d02b3da6e0142376a4478072f30a16Jeff Brown KeyboardLayoutPickerFragment.EXTRA_INPUT_DEVICE_DESCRIPTOR); 566766b286187d02b3da6e0142376a4478072f30a16Jeff Brown mIntentWaitingForResult = null; 567766b286187d02b3da6e0142376a4478072f30a16Jeff Brown showKeyboardLayoutDialog(inputDeviceDescriptor); 568766b286187d02b3da6e0142376a4478072f30a16Jeff Brown } 569766b286187d02b3da6e0142376a4478072f30a16Jeff Brown } 570766b286187d02b3da6e0142376a4478072f30a16Jeff Brown 571f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown private void updateGameControllers() { 572f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown if (haveInputDeviceWithVibrator()) { 573f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown getPreferenceScreen().addPreference(mGameControllerCategory); 574f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown 575f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown CheckBoxPreference chkPref = (CheckBoxPreference) 576f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown mGameControllerCategory.findPreference("vibrate_input_devices"); 577f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown chkPref.setChecked(System.getInt(getContentResolver(), 578f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown Settings.System.VIBRATE_INPUT_DEVICES, 1) > 0); 579f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown } else { 580f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown getPreferenceScreen().removePreference(mGameControllerCategory); 581f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown } 582f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown } 583f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown 584f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown private boolean haveInputDeviceWithVibrator() { 585f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown final int[] devices = InputDevice.getDeviceIds(); 586f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown for (int i = 0; i < devices.length; i++) { 587f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown InputDevice device = InputDevice.getDevice(devices[i]); 588f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown if (device != null && !device.isVirtual() && device.getVibrator().hasVibrator()) { 589f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown return true; 590f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown } 591f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown } 592f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown return false; 593f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown } 594f8fb0e5b240b1e954660b8221eaa9a18a310a1dfJeff Brown 595b9509d046c911b7b334aa45f693c49a7182ef470satok private class SettingsObserver extends ContentObserver { 5969bcc60704991879a0f8c9098eef26233942d6fe2Shuhrat Dehkanov private Context mContext; 5979bcc60704991879a0f8c9098eef26233942d6fe2Shuhrat Dehkanov 598b9509d046c911b7b334aa45f693c49a7182ef470satok public SettingsObserver(Handler handler, Context context) { 599b9509d046c911b7b334aa45f693c49a7182ef470satok super(handler); 6009bcc60704991879a0f8c9098eef26233942d6fe2Shuhrat Dehkanov mContext = context; 6019bcc60704991879a0f8c9098eef26233942d6fe2Shuhrat Dehkanov } 6029bcc60704991879a0f8c9098eef26233942d6fe2Shuhrat Dehkanov 6039bcc60704991879a0f8c9098eef26233942d6fe2Shuhrat Dehkanov @Override public void onChange(boolean selfChange) { 6049bcc60704991879a0f8c9098eef26233942d6fe2Shuhrat Dehkanov updateCurrentImeName(); 6059bcc60704991879a0f8c9098eef26233942d6fe2Shuhrat Dehkanov } 6069bcc60704991879a0f8c9098eef26233942d6fe2Shuhrat Dehkanov 6079bcc60704991879a0f8c9098eef26233942d6fe2Shuhrat Dehkanov public void resume() { 6089bcc60704991879a0f8c9098eef26233942d6fe2Shuhrat Dehkanov final ContentResolver cr = mContext.getContentResolver(); 609b9509d046c911b7b334aa45f693c49a7182ef470satok cr.registerContentObserver( 610b9509d046c911b7b334aa45f693c49a7182ef470satok Settings.Secure.getUriFor(Settings.Secure.DEFAULT_INPUT_METHOD), false, this); 611b9509d046c911b7b334aa45f693c49a7182ef470satok cr.registerContentObserver(Settings.Secure.getUriFor( 612b9509d046c911b7b334aa45f693c49a7182ef470satok Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE), false, this); 613b9509d046c911b7b334aa45f693c49a7182ef470satok } 614b9509d046c911b7b334aa45f693c49a7182ef470satok 6159bcc60704991879a0f8c9098eef26233942d6fe2Shuhrat Dehkanov public void pause() { 6169bcc60704991879a0f8c9098eef26233942d6fe2Shuhrat Dehkanov mContext.getContentResolver().unregisterContentObserver(this); 617b9509d046c911b7b334aa45f693c49a7182ef470satok } 618b9509d046c911b7b334aa45f693c49a7182ef470satok } 619afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 620