InputMethodAndLanguageSettings.java revision 4397f406a3c9e09ca2d5174ba46328345faa504e
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;
5271ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalardimport java.util.Set;
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
54c88a7ff1efd10374974e45768bde1658cc1d8483satokpublic class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
55c88a7ff1efd10374974e45768bde1658cc1d8483satok        implements Preference.OnPreferenceChangeListener{
560cc35e444bd71f117b6aed97e40ea4f3d82cd8faDaisuke Miyakawa
570f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani    private static final String KEY_PHONE_LANGUAGE = "phone_language";
58c88a7ff1efd10374974e45768bde1658cc1d8483satok    private static final String KEY_CURRENT_INPUT_METHOD = "current_input_method";
59c88a7ff1efd10374974e45768bde1658cc1d8483satok    private static final String KEY_INPUT_METHOD_SELECTOR = "input_method_selector";
6071ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard    private static final String KEY_USER_DICTIONARY_SETTINGS = "key_user_dictionary_settings";
613fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    // false: on ICS or later
623fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    private static final boolean SHOW_INPUT_METHOD_SWITCHER_SETTINGS = false;
6371ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard
643fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    private static final String[] sSystemSettingNames = {
653fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        System.TEXT_AUTO_REPLACE, System.TEXT_AUTO_CAPS, System.TEXT_AUTO_PUNCTUATE,
663fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    };
673fa13775e805df6cc7244d3f93105c5d3a5b748fsatok
683fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    private static final String[] sHardKeyboardKeys = {
693fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        "auto_replace", "auto_caps", "auto_punctuate",
703fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    };
7186997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project
72c88a7ff1efd10374974e45768bde1658cc1d8483satok    private int mDefaultInputMethodSelectorVisibility = 0;
73c88a7ff1efd10374974e45768bde1658cc1d8483satok    private ListPreference mShowInputMethodSelectorPref;
74e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown    private PreferenceCategory mKeyboardSettingsCategory;
75e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown    private PreferenceCategory mHardKeyboardCategory;
760f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani    private Preference mLanguagePref;
77e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown    private final ArrayList<InputMethodPreference> mInputMethodPreferenceList =
783fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            new ArrayList<InputMethodPreference>();
79e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown    private final ArrayList<PreferenceScreen> mHardKeyboardPreferenceList =
80e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            new ArrayList<PreferenceScreen>();
813fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    private InputMethodManager mImm;
823fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    private List<InputMethodInfo> mImis;
833fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    private boolean mIsOnlyImeSettings;
84b9509d046c911b7b334aa45f693c49a7182ef470satok    private Handler mHandler;
85b9509d046c911b7b334aa45f693c49a7182ef470satok    @SuppressWarnings("unused")
86b9509d046c911b7b334aa45f693c49a7182ef470satok    private SettingsObserver mSettingsObserver;
87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
89d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onCreate(Bundle icicle) {
90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        addPreferencesFromResource(R.xml.language_settings);
93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
94c88a7ff1efd10374974e45768bde1658cc1d8483satok        try {
95c88a7ff1efd10374974e45768bde1658cc1d8483satok            mDefaultInputMethodSelectorVisibility = Integer.valueOf(
96c88a7ff1efd10374974e45768bde1658cc1d8483satok                    getString(R.string.input_method_selector_visibility_default_value));
97c88a7ff1efd10374974e45768bde1658cc1d8483satok        } catch (NumberFormatException e) {
98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
9986997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project
100c88a7ff1efd10374974e45768bde1658cc1d8483satok        if (getActivity().getAssets().getLocales().length == 1) {
101c88a7ff1efd10374974e45768bde1658cc1d8483satok            // No "Select language" pref if there's only one system locale available.
102c88a7ff1efd10374974e45768bde1658cc1d8483satok            getPreferenceScreen().removePreference(findPreference(KEY_PHONE_LANGUAGE));
103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
104c88a7ff1efd10374974e45768bde1658cc1d8483satok            mLanguagePref = findPreference(KEY_PHONE_LANGUAGE);
105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
1063fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) {
1073fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            mShowInputMethodSelectorPref = (ListPreference)findPreference(
1083fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                    KEY_INPUT_METHOD_SELECTOR);
1093fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            mShowInputMethodSelectorPref.setOnPreferenceChangeListener(this);
1103fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            // TODO: Update current input method name on summary
1113fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            updateInputMethodSelectorSummary(loadInputMethodSelectorVisibility());
1123fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        }
113b44161f3ed9b91f39086247d8efbdac42656b93bAmith Yamasani
114b44161f3ed9b91f39086247d8efbdac42656b93bAmith Yamasani        new VoiceInputOutputSettings(this).onCreate();
1153fa13775e805df6cc7244d3f93105c5d3a5b748fsatok
116e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown        // Get references to dynamically constructed categories.
117e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown        mHardKeyboardCategory = (PreferenceCategory)findPreference("hard_keyboard");
118e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown        mKeyboardSettingsCategory = (PreferenceCategory)findPreference(
119e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                "keyboard_settings_category");
1203fa13775e805df6cc7244d3f93105c5d3a5b748fsatok
121e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown        // Filter out irrelevant features if invoked from IME settings button.
1223fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        mIsOnlyImeSettings = Settings.ACTION_INPUT_METHOD_SETTINGS.equals(
1233fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                getActivity().getIntent().getAction());
1248ff6222a9136cdbaeea9191869b90abd179efc85satok        getActivity().getIntent().setAction(null);
125e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown        if (mIsOnlyImeSettings) {
126e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            getPreferenceScreen().removeAll();
127e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            getPreferenceScreen().addPreference(mHardKeyboardCategory);
128e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) {
129e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                getPreferenceScreen().addPreference(mShowInputMethodSelectorPref);
130e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            }
131e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            getPreferenceScreen().addPreference(mKeyboardSettingsCategory);
132e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown        }
133e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown
134e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown        // Build IME preference category.
1353fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        mImm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
1363fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        mImis = mImm.getInputMethodList();
137e077d2b607032fb66a4a046aa4b46945d32d281esatok
138e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown        mKeyboardSettingsCategory.removeAll();
139e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown        if (!mIsOnlyImeSettings) {
140e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            final PreferenceScreen currentIme = new PreferenceScreen(getActivity(), null);
141e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            currentIme.setKey(KEY_CURRENT_INPUT_METHOD);
142e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            currentIme.setTitle(getResources().getString(R.string.current_input_method));
143e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            mKeyboardSettingsCategory.addPreference(currentIme);
144e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown        }
145e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown
146e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown        mInputMethodPreferenceList.clear();
147e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown        final int N = (mImis == null ? 0 : mImis.size());
148e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown        for (int i = 0; i < N; ++i) {
149e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            final InputMethodInfo imi = mImis.get(i);
150e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            final InputMethodPreference pref = getInputMethodPreference(imi, N);
151e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            mInputMethodPreferenceList.add(pref);
152e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown        }
153e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown
154e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown        if (!mInputMethodPreferenceList.isEmpty()) {
155e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            Collections.sort(mInputMethodPreferenceList);
156e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            for (int i = 0; i < N; ++i) {
157e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                mKeyboardSettingsCategory.addPreference(mInputMethodPreferenceList.get(i));
158e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            }
159e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown        }
160e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown
161e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown        // Build hard keyboard preference category.
162e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown        updateHardKeyboards();
163e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown
164e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown        // Spell Checker
165e077d2b607032fb66a4a046aa4b46945d32d281esatok        final Intent intent = new Intent(Intent.ACTION_MAIN);
166e077d2b607032fb66a4a046aa4b46945d32d281esatok        intent.setClass(getActivity(), SpellCheckersSettingsActivity.class);
167c0b569c317fad96abbf0ea23d07eb6d19f634ccfsatok        final SpellCheckersPreference scp = ((SpellCheckersPreference)findPreference(
168c0b569c317fad96abbf0ea23d07eb6d19f634ccfsatok                "spellcheckers_settings"));
169c0b569c317fad96abbf0ea23d07eb6d19f634ccfsatok        if (scp != null) {
170c0b569c317fad96abbf0ea23d07eb6d19f634ccfsatok            scp.setFragmentIntent(this, intent);
171c0b569c317fad96abbf0ea23d07eb6d19f634ccfsatok        }
172b9509d046c911b7b334aa45f693c49a7182ef470satok
173b9509d046c911b7b334aa45f693c49a7182ef470satok        mHandler = new Handler();
174b9509d046c911b7b334aa45f693c49a7182ef470satok        mSettingsObserver = new SettingsObserver(mHandler, getActivity());
175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1769cd11a9aa5ac74ca89432655d019f68d789bc405satok
177c88a7ff1efd10374974e45768bde1658cc1d8483satok    private void updateInputMethodSelectorSummary(int value) {
178c88a7ff1efd10374974e45768bde1658cc1d8483satok        String[] inputMethodSelectorTitles = getResources().getStringArray(
179c88a7ff1efd10374974e45768bde1658cc1d8483satok                R.array.input_method_selector_titles);
180c88a7ff1efd10374974e45768bde1658cc1d8483satok        if (inputMethodSelectorTitles.length > value) {
181c88a7ff1efd10374974e45768bde1658cc1d8483satok            mShowInputMethodSelectorPref.setSummary(inputMethodSelectorTitles[value]);
182c88a7ff1efd10374974e45768bde1658cc1d8483satok            mShowInputMethodSelectorPref.setValue(String.valueOf(value));
183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
18580a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project
18671ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard    private void updateUserDictionaryPreference(Preference userDictionaryPreference) {
187c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard        final Activity activity = getActivity();
18871ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard        final Set<String> localeList = UserDictionaryList.getUserDictionaryLocalesList(activity);
189410e75b15bd7ecfcb8985c4368fec5e355e2c099Jean Chalard        if (null == localeList) {
190410e75b15bd7ecfcb8985c4368fec5e355e2c099Jean Chalard            // The locale list is null if and only if the user dictionary service is
191410e75b15bd7ecfcb8985c4368fec5e355e2c099Jean Chalard            // not present or disabled. In this case we need to remove the preference.
1928ba5c42b213c4cd5b8773595fea2a1be6a18d711Jean Chalard            getPreferenceScreen().removePreference(userDictionaryPreference);
193410e75b15bd7ecfcb8985c4368fec5e355e2c099Jean Chalard        } else if (localeList.size() <= 1) {
1944e658ba969830e8c9617dc8938271df1ed09aa44Jean Chalard            final Intent intent =
1954e658ba969830e8c9617dc8938271df1ed09aa44Jean Chalard                    new Intent(UserDictionaryList.USER_DICTIONARY_SETTINGS_INTENT_ACTION);
19671ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            userDictionaryPreference.setTitle(R.string.user_dict_single_settings_title);
1974e658ba969830e8c9617dc8938271df1ed09aa44Jean Chalard            userDictionaryPreference.setIntent(intent);
19871ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            // If the size of localeList is 0, we don't set the locale parameter in the
19971ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            // extras. This will be interpreted by the UserDictionarySettings class as
20071ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            // meaning "the current locale".
20171ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            // Note that with the current code for UserDictionaryList#getUserDictionaryLocalesList()
20271ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            // the locale list always has at least one element, since it always includes the current
20371ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            // locale explicitly. @see UserDictionaryList.getUserDictionaryLocalesList().
20471ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            if (localeList.size() == 1) {
20571ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard                final String locale = (String)localeList.toArray()[0];
20671ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard                userDictionaryPreference.getExtras().putString("locale", locale);
20771ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            }
208c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard        } else {
20971ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            userDictionaryPreference.setTitle(R.string.user_dict_multiple_settings_title);
21071ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            userDictionaryPreference.setFragment(UserDictionaryList.class.getName());
211c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard        }
212c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard    }
213c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard
214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
215d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onResume() {
216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onResume();
2173fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        if (!mIsOnlyImeSettings) {
2183fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            if (mLanguagePref != null) {
2193fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                Configuration conf = getResources().getConfiguration();
2203fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                String locale = conf.locale.getDisplayName(conf.locale);
2213fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                if (locale != null && locale.length() > 1) {
2223fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                    locale = Character.toUpperCase(locale.charAt(0)) + locale.substring(1);
2233fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                    mLanguagePref.setSummary(locale);
2243fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                }
2253fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            }
2263fa13775e805df6cc7244d3f93105c5d3a5b748fsatok
2273fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            updateUserDictionaryPreference(findPreference(KEY_USER_DICTIONARY_SETTINGS));
2283fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) {
2293fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                mShowInputMethodSelectorPref.setOnPreferenceChangeListener(this);
2303fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            }
2313fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        }
2323fa13775e805df6cc7244d3f93105c5d3a5b748fsatok
2333fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        // Hard keyboard
234e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown        if (!mHardKeyboardPreferenceList.isEmpty()) {
2353fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            for (int i = 0; i < sHardKeyboardKeys.length; ++i) {
236427a7ba1048d81b6b4fdcf29072c7584f6c18b87Jean Chalard                CheckBoxPreference chkPref = (CheckBoxPreference)
2373fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                        mHardKeyboardCategory.findPreference(sHardKeyboardKeys[i]);
2383fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                chkPref.setChecked(
2393fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                        System.getInt(getContentResolver(), sSystemSettingNames[i], 1) > 0);
2400f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani            }
2410f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani        }
242c88a7ff1efd10374974e45768bde1658cc1d8483satok
243e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown        updateHardKeyboards();
244e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown
2453fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        // IME
2463fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        InputMethodAndSubtypeUtil.loadInputMethodSubtypeList(
2473fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                this, getContentResolver(), mImis, null);
2483fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        updateActiveInputMethodsSummary();
249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
251afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
252d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onPause() {
253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onPause();
2543fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) {
2553fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            mShowInputMethodSelectorPref.setOnPreferenceChangeListener(null);
2563fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        }
2573fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        InputMethodAndSubtypeUtil.saveInputMethodSubtypeList(
258e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                this, getContentResolver(), mImis, !mHardKeyboardPreferenceList.isEmpty());
259afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
260afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
26186997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project    @Override
26286997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Input Method stuff
264a718832e28095219a897c6e95e903c1a3fe57c12Ying Wang        if (Utils.isMonkeyRunning()) {
265afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return false;
266afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
267c88a7ff1efd10374974e45768bde1658cc1d8483satok        if (preference instanceof PreferenceScreen) {
268c88c6bbcd0d3901fe9f61bab82a17ec49ad62e6dDaisuke Miyakawa            if (preference.getFragment() != null) {
269c88c6bbcd0d3901fe9f61bab82a17ec49ad62e6dDaisuke Miyakawa                // Fragment will be handled correctly by the super class.
270c88a7ff1efd10374974e45768bde1658cc1d8483satok            } else if (KEY_CURRENT_INPUT_METHOD.equals(preference.getKey())) {
271f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa                final InputMethodManager imm = (InputMethodManager)
272f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa                        getSystemService(Context.INPUT_METHOD_SERVICE);
273103cc7da5f3ff9a46aa0b1dd9fcd0c7759c2d096satok                imm.showInputMethodPicker();
274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
2753fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        } else if (preference instanceof CheckBoxPreference) {
2763fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            final CheckBoxPreference chkPref = (CheckBoxPreference) preference;
277e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            if (!mHardKeyboardPreferenceList.isEmpty()) {
2783fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                for (int i = 0; i < sHardKeyboardKeys.length; ++i) {
2793fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                    if (chkPref == mHardKeyboardCategory.findPreference(sHardKeyboardKeys[i])) {
2803fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                        System.putInt(getContentResolver(), sSystemSettingNames[i],
2813fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                                chkPref.isChecked() ? 1 : 0);
2823fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                        return true;
2833fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                    }
2843fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                }
2853fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            }
286afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return super.onPreferenceTreeClick(preferenceScreen, preference);
288afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
289afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
290c88a7ff1efd10374974e45768bde1658cc1d8483satok    private void saveInputMethodSelectorVisibility(String value) {
291c88a7ff1efd10374974e45768bde1658cc1d8483satok        try {
292c88a7ff1efd10374974e45768bde1658cc1d8483satok            int intValue = Integer.valueOf(value);
293c88a7ff1efd10374974e45768bde1658cc1d8483satok            Settings.Secure.putInt(getContentResolver(),
294c88a7ff1efd10374974e45768bde1658cc1d8483satok                    Settings.Secure.INPUT_METHOD_SELECTOR_VISIBILITY, intValue);
295c88a7ff1efd10374974e45768bde1658cc1d8483satok            updateInputMethodSelectorSummary(intValue);
296c88a7ff1efd10374974e45768bde1658cc1d8483satok        } catch(NumberFormatException e) {
297c88a7ff1efd10374974e45768bde1658cc1d8483satok        }
298c88a7ff1efd10374974e45768bde1658cc1d8483satok    }
299c88a7ff1efd10374974e45768bde1658cc1d8483satok
300c88a7ff1efd10374974e45768bde1658cc1d8483satok    private int loadInputMethodSelectorVisibility() {
301c88a7ff1efd10374974e45768bde1658cc1d8483satok        return Settings.Secure.getInt(getContentResolver(),
302c88a7ff1efd10374974e45768bde1658cc1d8483satok                Settings.Secure.INPUT_METHOD_SELECTOR_VISIBILITY,
303c88a7ff1efd10374974e45768bde1658cc1d8483satok                mDefaultInputMethodSelectorVisibility);
304c88a7ff1efd10374974e45768bde1658cc1d8483satok    }
305c88a7ff1efd10374974e45768bde1658cc1d8483satok
30620108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai    @Override
307c88a7ff1efd10374974e45768bde1658cc1d8483satok    public boolean onPreferenceChange(Preference preference, Object value) {
3083fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) {
3093fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            if (preference == mShowInputMethodSelectorPref) {
3103fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                if (value instanceof String) {
3113fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                    saveInputMethodSelectorVisibility((String)value);
3123fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                }
313c88a7ff1efd10374974e45768bde1658cc1d8483satok            }
31420108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai        }
315c88a7ff1efd10374974e45768bde1658cc1d8483satok        return false;
31620108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai    }
31720108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai
3183fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    private void updateActiveInputMethodsSummary() {
3193fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        for (Preference pref : mInputMethodPreferenceList) {
3203fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            if (pref instanceof InputMethodPreference) {
3213fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                ((InputMethodPreference)pref).updateSummary();
3223fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            }
3233fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        }
324b9509d046c911b7b334aa45f693c49a7182ef470satok        updateCurrentImeName();
325b9509d046c911b7b334aa45f693c49a7182ef470satok    }
326b9509d046c911b7b334aa45f693c49a7182ef470satok
327b9509d046c911b7b334aa45f693c49a7182ef470satok    private void updateCurrentImeName() {
328b9509d046c911b7b334aa45f693c49a7182ef470satok        final Context context = getActivity();
329b9509d046c911b7b334aa45f693c49a7182ef470satok        if (context == null || mImm == null) return;
330b9509d046c911b7b334aa45f693c49a7182ef470satok        final Preference curPref = getPreferenceScreen().findPreference(KEY_CURRENT_INPUT_METHOD);
331b9509d046c911b7b334aa45f693c49a7182ef470satok        if (curPref != null) {
332b9509d046c911b7b334aa45f693c49a7182ef470satok            final CharSequence curIme = InputMethodAndSubtypeUtil.getCurrentInputMethodName(
333b9509d046c911b7b334aa45f693c49a7182ef470satok                    context, getContentResolver(), mImm, mImis, getPackageManager());
334b9509d046c911b7b334aa45f693c49a7182ef470satok            if (!TextUtils.isEmpty(curIme)) {
335b9509d046c911b7b334aa45f693c49a7182ef470satok                synchronized(this) {
336b9509d046c911b7b334aa45f693c49a7182ef470satok                    curPref.setSummary(curIme);
337b9509d046c911b7b334aa45f693c49a7182ef470satok                }
338b9509d046c911b7b334aa45f693c49a7182ef470satok            }
339b9509d046c911b7b334aa45f693c49a7182ef470satok        }
3403fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    }
3413fa13775e805df6cc7244d3f93105c5d3a5b748fsatok
3423fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    private InputMethodPreference getInputMethodPreference(InputMethodInfo imi, int imiSize) {
3433fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        final PackageManager pm = getPackageManager();
3443fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        final CharSequence label = imi.loadLabel(pm);
3453fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        // IME settings
3463fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        final Intent intent;
3473fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        final String settingsActivity = imi.getSettingsActivity();
3483fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        if (!TextUtils.isEmpty(settingsActivity)) {
3493fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            intent = new Intent(Intent.ACTION_MAIN);
3503fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            intent.setClassName(imi.getPackageName(), settingsActivity);
3513fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        } else {
3523fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            intent = null;
3533fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        }
3543fa13775e805df6cc7244d3f93105c5d3a5b748fsatok
3553fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        // Add a check box for enabling/disabling IME
3563fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        InputMethodPreference pref = new InputMethodPreference(this, intent, mImm, imi, imiSize);
3573fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        pref.setKey(imi.getId());
3583fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        pref.setTitle(label);
3593fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        return pref;
3603fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    }
3613fa13775e805df6cc7244d3f93105c5d3a5b748fsatok
362e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown    private void updateHardKeyboards() {
363e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown        mHardKeyboardPreferenceList.clear();
364e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown        if (getResources().getConfiguration().keyboard == Configuration.KEYBOARD_QWERTY) {
365e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            final InputManager im =
366e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                    (InputManager)getActivity().getSystemService(Context.INPUT_SERVICE);
367e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown
368e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            final int[] devices = InputDevice.getDeviceIds();
369e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            for (int i = 0; i < devices.length; i++) {
370e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                InputDevice device = InputDevice.getDevice(devices[i]);
371e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                if (device != null
3724397f406a3c9e09ca2d5174ba46328345faa504eJeff Brown                        && !device.isVirtual()
373e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                        && (device.getSources() & InputDevice.SOURCE_KEYBOARD) != 0
374e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                        && device.getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC) {
375e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                    final String inputDeviceDescriptor = device.getDescriptor();
376e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                    final String keyboardLayoutDescriptor =
3774397f406a3c9e09ca2d5174ba46328345faa504eJeff Brown                            im.getKeyboardLayoutForInputDevice(inputDeviceDescriptor);
378e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                    final KeyboardLayout keyboardLayout = keyboardLayoutDescriptor != null ?
379e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                            im.getKeyboardLayout(keyboardLayoutDescriptor) : null;
380e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown
381e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                    final Intent intent = new Intent(Intent.ACTION_MAIN);
382e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                    intent.setClass(getActivity(), KeyboardLayoutPickerActivity.class);
383e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                    intent.putExtra(KeyboardLayoutPicker.EXTRA_INPUT_DEVICE_DESCRIPTOR,
384e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                            inputDeviceDescriptor);
385e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown
386e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                    final PreferenceScreen pref = new PreferenceScreen(getActivity(), null);
387e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                    pref.setTitle(device.getName());
388e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                    if (keyboardLayout != null) {
389e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                        pref.setSummary(keyboardLayout.getLabel());
390e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                    }
391e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                    pref.setIntent(intent);
392e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                    mHardKeyboardPreferenceList.add(pref);
393e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                }
3943fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            }
3953fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        }
3963fa13775e805df6cc7244d3f93105c5d3a5b748fsatok
397e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown        if (!mHardKeyboardPreferenceList.isEmpty()) {
398e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            for (int i = mHardKeyboardCategory.getPreferenceCount(); i-- > 0; ) {
399e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                final Preference pref = mHardKeyboardCategory.getPreference(i);
400e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                if (pref.getOrder() < 1000) {
401e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                    mHardKeyboardCategory.removePreference(pref);
402e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                }
403e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            }
4043fa13775e805df6cc7244d3f93105c5d3a5b748fsatok
405e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            Collections.sort(mHardKeyboardPreferenceList);
406e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            final int count = mHardKeyboardPreferenceList.size();
407e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            for (int i = 0; i < count; i++) {
408e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                final Preference pref = mHardKeyboardPreferenceList.get(i);
409e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                pref.setOrder(i);
410e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown                mHardKeyboardCategory.addPreference(pref);
411e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            }
412e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown        } else {
413e46c5f30caddb10c69eee62fc2f9db3f26f29bb5Jeff Brown            getPreferenceScreen().removePreference(mHardKeyboardCategory);
4143fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        }
4153fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    }
416b9509d046c911b7b334aa45f693c49a7182ef470satok
417b9509d046c911b7b334aa45f693c49a7182ef470satok    private class SettingsObserver extends ContentObserver {
418b9509d046c911b7b334aa45f693c49a7182ef470satok        public SettingsObserver(Handler handler, Context context) {
419b9509d046c911b7b334aa45f693c49a7182ef470satok            super(handler);
420b9509d046c911b7b334aa45f693c49a7182ef470satok            final ContentResolver cr = context.getContentResolver();
421b9509d046c911b7b334aa45f693c49a7182ef470satok            cr.registerContentObserver(
422b9509d046c911b7b334aa45f693c49a7182ef470satok                    Settings.Secure.getUriFor(Settings.Secure.DEFAULT_INPUT_METHOD), false, this);
423b9509d046c911b7b334aa45f693c49a7182ef470satok            cr.registerContentObserver(Settings.Secure.getUriFor(
424b9509d046c911b7b334aa45f693c49a7182ef470satok                    Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE), false, this);
425b9509d046c911b7b334aa45f693c49a7182ef470satok        }
426b9509d046c911b7b334aa45f693c49a7182ef470satok
427b9509d046c911b7b334aa45f693c49a7182ef470satok        @Override public void onChange(boolean selfChange) {
428b9509d046c911b7b334aa45f693c49a7182ef470satok            updateCurrentImeName();
429b9509d046c911b7b334aa45f693c49a7182ef470satok        }
430b9509d046c911b7b334aa45f693c49a7182ef470satok    }
431afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
432