InputMethodAndLanguageSettings.java revision e077d2b607032fb66a4a046aa4b46945d32d281e
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;
20e077d2b607032fb66a4a046aa4b46945d32d281esatokimport com.android.settings.Settings.SpellCheckersSettingsActivity;
210417e4094713c5f4dac700b645000d0959bf62fasatokimport com.android.settings.SettingsPreferenceFragment;
2271ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalardimport com.android.settings.UserDictionarySettings;
230417e4094713c5f4dac700b645000d0959bf62fasatokimport com.android.settings.Utils;
24b44161f3ed9b91f39086247d8efbdac42656b93bAmith Yamasaniimport com.android.settings.VoiceInputOutputSettings;
25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
26c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalardimport android.app.Activity;
27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
283fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport android.content.Intent;
293fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport android.content.pm.PackageManager;
30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.res.Configuration;
31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
323fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport android.preference.CheckBoxPreference;
33c88a7ff1efd10374974e45768bde1658cc1d8483satokimport android.preference.ListPreference;
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference;
353fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport android.preference.PreferenceCategory;
363fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport android.preference.PreferenceGroup;
37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceScreen;
38c88a7ff1efd10374974e45768bde1658cc1d8483satokimport android.provider.Settings;
393fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport android.provider.Settings.System;
403fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport android.text.TextUtils;
413fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport android.view.inputmethod.InputMethodInfo;
42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.inputmethod.InputMethodManager;
43c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard
443fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport java.util.ArrayList;
453fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport java.util.Collections;
463fa13775e805df6cc7244d3f93105c5d3a5b748fsatokimport java.util.List;
4771ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalardimport java.util.Set;
48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
49c88a7ff1efd10374974e45768bde1658cc1d8483satokpublic class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
50c88a7ff1efd10374974e45768bde1658cc1d8483satok        implements Preference.OnPreferenceChangeListener{
510cc35e444bd71f117b6aed97e40ea4f3d82cd8faDaisuke Miyakawa
520f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani    private static final String KEY_PHONE_LANGUAGE = "phone_language";
53c88a7ff1efd10374974e45768bde1658cc1d8483satok    private static final String KEY_CURRENT_INPUT_METHOD = "current_input_method";
54c88a7ff1efd10374974e45768bde1658cc1d8483satok    private static final String KEY_INPUT_METHOD_SELECTOR = "input_method_selector";
5571ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard    private static final String KEY_USER_DICTIONARY_SETTINGS = "key_user_dictionary_settings";
563fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    // false: on ICS or later
573fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    private static final boolean SHOW_INPUT_METHOD_SWITCHER_SETTINGS = false;
5871ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard
593fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    private static final String[] sSystemSettingNames = {
603fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        System.TEXT_AUTO_REPLACE, System.TEXT_AUTO_CAPS, System.TEXT_AUTO_PUNCTUATE,
613fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    };
623fa13775e805df6cc7244d3f93105c5d3a5b748fsatok
633fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    private static final String[] sHardKeyboardKeys = {
643fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        "auto_replace", "auto_caps", "auto_punctuate",
653fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    };
6686997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project
67c88a7ff1efd10374974e45768bde1658cc1d8483satok    private int mDefaultInputMethodSelectorVisibility = 0;
68c88a7ff1efd10374974e45768bde1658cc1d8483satok    private ListPreference mShowInputMethodSelectorPref;
690f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani    private Preference mLanguagePref;
703fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    private ArrayList<InputMethodPreference> mInputMethodPreferenceList =
713fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            new ArrayList<InputMethodPreference>();
723fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    private boolean mHaveHardKeyboard;
733fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    private PreferenceCategory mHardKeyboardCategory;
743fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    private InputMethodManager mImm;
753fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    private List<InputMethodInfo> mImis;
763fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    private boolean mIsOnlyImeSettings;
77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
79d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onCreate(Bundle icicle) {
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        addPreferencesFromResource(R.xml.language_settings);
83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
84c88a7ff1efd10374974e45768bde1658cc1d8483satok        try {
85c88a7ff1efd10374974e45768bde1658cc1d8483satok            mDefaultInputMethodSelectorVisibility = Integer.valueOf(
86c88a7ff1efd10374974e45768bde1658cc1d8483satok                    getString(R.string.input_method_selector_visibility_default_value));
87c88a7ff1efd10374974e45768bde1658cc1d8483satok        } catch (NumberFormatException e) {
88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
8986997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project
90c88a7ff1efd10374974e45768bde1658cc1d8483satok        if (getActivity().getAssets().getLocales().length == 1) {
91c88a7ff1efd10374974e45768bde1658cc1d8483satok            // No "Select language" pref if there's only one system locale available.
92c88a7ff1efd10374974e45768bde1658cc1d8483satok            getPreferenceScreen().removePreference(findPreference(KEY_PHONE_LANGUAGE));
93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
94c88a7ff1efd10374974e45768bde1658cc1d8483satok            mLanguagePref = findPreference(KEY_PHONE_LANGUAGE);
95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
963fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) {
973fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            mShowInputMethodSelectorPref = (ListPreference)findPreference(
983fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                    KEY_INPUT_METHOD_SELECTOR);
993fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            mShowInputMethodSelectorPref.setOnPreferenceChangeListener(this);
1003fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            // TODO: Update current input method name on summary
1013fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            updateInputMethodSelectorSummary(loadInputMethodSelectorVisibility());
1023fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        }
103b44161f3ed9b91f39086247d8efbdac42656b93bAmith Yamasani
104b44161f3ed9b91f39086247d8efbdac42656b93bAmith Yamasani        new VoiceInputOutputSettings(this).onCreate();
1053fa13775e805df6cc7244d3f93105c5d3a5b748fsatok
1063fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        // Hard keyboard
1073fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        final Configuration config = getResources().getConfiguration();
1083fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        mHaveHardKeyboard = (config.keyboard == Configuration.KEYBOARD_QWERTY);
1093fa13775e805df6cc7244d3f93105c5d3a5b748fsatok
1103fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        // IME
1113fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        mIsOnlyImeSettings = Settings.ACTION_INPUT_METHOD_SETTINGS.equals(
1123fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                getActivity().getIntent().getAction());
1133fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        mImm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
1143fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        mImis = mImm.getInputMethodList();
1153fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        createImePreferenceHierarchy((PreferenceGroup)findPreference("keyboard_settings_category"));
116e077d2b607032fb66a4a046aa4b46945d32d281esatok
117e077d2b607032fb66a4a046aa4b46945d32d281esatok        final Intent intent = new Intent(Intent.ACTION_MAIN);
118e077d2b607032fb66a4a046aa4b46945d32d281esatok        intent.setClass(getActivity(), SpellCheckersSettingsActivity.class);
119e077d2b607032fb66a4a046aa4b46945d32d281esatok        ((SpellCheckersPreference)findPreference("spellcheckers_settings")).setFragmentIntent(
120e077d2b607032fb66a4a046aa4b46945d32d281esatok                this, intent);
121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
1229cd11a9aa5ac74ca89432655d019f68d789bc405satok
123c88a7ff1efd10374974e45768bde1658cc1d8483satok    private void updateInputMethodSelectorSummary(int value) {
124c88a7ff1efd10374974e45768bde1658cc1d8483satok        String[] inputMethodSelectorTitles = getResources().getStringArray(
125c88a7ff1efd10374974e45768bde1658cc1d8483satok                R.array.input_method_selector_titles);
126c88a7ff1efd10374974e45768bde1658cc1d8483satok        if (inputMethodSelectorTitles.length > value) {
127c88a7ff1efd10374974e45768bde1658cc1d8483satok            mShowInputMethodSelectorPref.setSummary(inputMethodSelectorTitles[value]);
128c88a7ff1efd10374974e45768bde1658cc1d8483satok            mShowInputMethodSelectorPref.setValue(String.valueOf(value));
129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
13180a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project
13271ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard    private void updateUserDictionaryPreference(Preference userDictionaryPreference) {
133c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard        final Activity activity = getActivity();
13471ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard        final Set<String> localeList = UserDictionaryList.getUserDictionaryLocalesList(activity);
135410e75b15bd7ecfcb8985c4368fec5e355e2c099Jean Chalard        if (null == localeList) {
136410e75b15bd7ecfcb8985c4368fec5e355e2c099Jean Chalard            // The locale list is null if and only if the user dictionary service is
137410e75b15bd7ecfcb8985c4368fec5e355e2c099Jean Chalard            // not present or disabled. In this case we need to remove the preference.
138410e75b15bd7ecfcb8985c4368fec5e355e2c099Jean Chalard            ((PreferenceGroup)findPreference("language_settings_category")).removePreference(
139410e75b15bd7ecfcb8985c4368fec5e355e2c099Jean Chalard                    userDictionaryPreference);
140410e75b15bd7ecfcb8985c4368fec5e355e2c099Jean Chalard        } else if (localeList.size() <= 1) {
14171ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            userDictionaryPreference.setTitle(R.string.user_dict_single_settings_title);
14271ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            userDictionaryPreference.setFragment(UserDictionarySettings.class.getName());
14371ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            // If the size of localeList is 0, we don't set the locale parameter in the
14471ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            // extras. This will be interpreted by the UserDictionarySettings class as
14571ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            // meaning "the current locale".
14671ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            // Note that with the current code for UserDictionaryList#getUserDictionaryLocalesList()
14771ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            // the locale list always has at least one element, since it always includes the current
14871ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            // locale explicitly. @see UserDictionaryList.getUserDictionaryLocalesList().
14971ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            if (localeList.size() == 1) {
15071ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard                final String locale = (String)localeList.toArray()[0];
15171ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard                userDictionaryPreference.getExtras().putString("locale", locale);
15271ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            }
153c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard        } else {
15471ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            userDictionaryPreference.setTitle(R.string.user_dict_multiple_settings_title);
15571ad1f4e3e819a40a830a148a2d1bd7b10fed09dJean Chalard            userDictionaryPreference.setFragment(UserDictionaryList.class.getName());
156c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard        }
157c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard    }
158c087e35d7f9a968ea035e931aa318cf36a3e1b90Jean Chalard
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
160d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onResume() {
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onResume();
1623fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        if (!mIsOnlyImeSettings) {
1633fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            if (mLanguagePref != null) {
1643fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                Configuration conf = getResources().getConfiguration();
1653fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                String locale = conf.locale.getDisplayName(conf.locale);
1663fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                if (locale != null && locale.length() > 1) {
1673fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                    locale = Character.toUpperCase(locale.charAt(0)) + locale.substring(1);
1683fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                    mLanguagePref.setSummary(locale);
1693fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                }
1703fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            }
1713fa13775e805df6cc7244d3f93105c5d3a5b748fsatok
1723fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            updateUserDictionaryPreference(findPreference(KEY_USER_DICTIONARY_SETTINGS));
1733fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) {
1743fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                mShowInputMethodSelectorPref.setOnPreferenceChangeListener(this);
1753fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            }
1763fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        }
1773fa13775e805df6cc7244d3f93105c5d3a5b748fsatok
1783fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        // Hard keyboard
1793fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        if (mHaveHardKeyboard) {
1803fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            for (int i = 0; i < sHardKeyboardKeys.length; ++i) {
1813fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                InputMethodPreference chkPref = (InputMethodPreference)
1823fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                        mHardKeyboardCategory.findPreference(sHardKeyboardKeys[i]);
1833fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                chkPref.setChecked(
1843fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                        System.getInt(getContentResolver(), sSystemSettingNames[i], 1) > 0);
1850f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani            }
1860f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani        }
187c88a7ff1efd10374974e45768bde1658cc1d8483satok
1883fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        // IME
1893fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        InputMethodAndSubtypeUtil.loadInputMethodSubtypeList(
1903fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                this, getContentResolver(), mImis, null);
1913fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        updateActiveInputMethodsSummary();
192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
195d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onPause() {
196afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onPause();
1973fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) {
1983fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            mShowInputMethodSelectorPref.setOnPreferenceChangeListener(null);
1993fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        }
2003fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        InputMethodAndSubtypeUtil.saveInputMethodSubtypeList(
2013fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                this, getContentResolver(), mImis, mHaveHardKeyboard);
202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
203afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
20486997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project    @Override
20586997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Input Method stuff
207a718832e28095219a897c6e95e903c1a3fe57c12Ying Wang        if (Utils.isMonkeyRunning()) {
208afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return false;
209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
210c88a7ff1efd10374974e45768bde1658cc1d8483satok        if (preference instanceof PreferenceScreen) {
211c88c6bbcd0d3901fe9f61bab82a17ec49ad62e6dDaisuke Miyakawa            if (preference.getFragment() != null) {
212c88c6bbcd0d3901fe9f61bab82a17ec49ad62e6dDaisuke Miyakawa                // Fragment will be handled correctly by the super class.
213c88a7ff1efd10374974e45768bde1658cc1d8483satok            } else if (KEY_CURRENT_INPUT_METHOD.equals(preference.getKey())) {
214f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa                final InputMethodManager imm = (InputMethodManager)
215f58090d5224fa03e8f4d8a980306952686a152f0Daisuke Miyakawa                        getSystemService(Context.INPUT_METHOD_SERVICE);
216103cc7da5f3ff9a46aa0b1dd9fcd0c7759c2d096satok                imm.showInputMethodPicker();
217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
2183fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        } else if (preference instanceof CheckBoxPreference) {
2193fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            final CheckBoxPreference chkPref = (CheckBoxPreference) preference;
2203fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            if (mHaveHardKeyboard) {
2213fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                for (int i = 0; i < sHardKeyboardKeys.length; ++i) {
2223fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                    if (chkPref == mHardKeyboardCategory.findPreference(sHardKeyboardKeys[i])) {
2233fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                        System.putInt(getContentResolver(), sSystemSettingNames[i],
2243fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                                chkPref.isChecked() ? 1 : 0);
2253fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                        return true;
2263fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                    }
2273fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                }
2283fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            }
229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return super.onPreferenceTreeClick(preferenceScreen, preference);
231afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
232afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
233c88a7ff1efd10374974e45768bde1658cc1d8483satok    private void saveInputMethodSelectorVisibility(String value) {
234c88a7ff1efd10374974e45768bde1658cc1d8483satok        try {
235c88a7ff1efd10374974e45768bde1658cc1d8483satok            int intValue = Integer.valueOf(value);
236c88a7ff1efd10374974e45768bde1658cc1d8483satok            Settings.Secure.putInt(getContentResolver(),
237c88a7ff1efd10374974e45768bde1658cc1d8483satok                    Settings.Secure.INPUT_METHOD_SELECTOR_VISIBILITY, intValue);
238c88a7ff1efd10374974e45768bde1658cc1d8483satok            updateInputMethodSelectorSummary(intValue);
239c88a7ff1efd10374974e45768bde1658cc1d8483satok        } catch(NumberFormatException e) {
240c88a7ff1efd10374974e45768bde1658cc1d8483satok        }
241c88a7ff1efd10374974e45768bde1658cc1d8483satok    }
242c88a7ff1efd10374974e45768bde1658cc1d8483satok
243c88a7ff1efd10374974e45768bde1658cc1d8483satok    private int loadInputMethodSelectorVisibility() {
244c88a7ff1efd10374974e45768bde1658cc1d8483satok        return Settings.Secure.getInt(getContentResolver(),
245c88a7ff1efd10374974e45768bde1658cc1d8483satok                Settings.Secure.INPUT_METHOD_SELECTOR_VISIBILITY,
246c88a7ff1efd10374974e45768bde1658cc1d8483satok                mDefaultInputMethodSelectorVisibility);
247c88a7ff1efd10374974e45768bde1658cc1d8483satok    }
248c88a7ff1efd10374974e45768bde1658cc1d8483satok
24920108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai    @Override
250c88a7ff1efd10374974e45768bde1658cc1d8483satok    public boolean onPreferenceChange(Preference preference, Object value) {
2513fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) {
2523fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            if (preference == mShowInputMethodSelectorPref) {
2533fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                if (value instanceof String) {
2543fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                    saveInputMethodSelectorVisibility((String)value);
2553fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                }
256c88a7ff1efd10374974e45768bde1658cc1d8483satok            }
25720108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai        }
258c88a7ff1efd10374974e45768bde1658cc1d8483satok        return false;
25920108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai    }
26020108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai
2613fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    private void updateActiveInputMethodsSummary() {
2623fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        for (Preference pref : mInputMethodPreferenceList) {
2633fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            if (pref instanceof InputMethodPreference) {
2643fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                ((InputMethodPreference)pref).updateSummary();
2653fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            }
2663fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        }
2673fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    }
2683fa13775e805df6cc7244d3f93105c5d3a5b748fsatok
2693fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    private InputMethodPreference getInputMethodPreference(InputMethodInfo imi, int imiSize) {
2703fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        final PackageManager pm = getPackageManager();
2713fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        final CharSequence label = imi.loadLabel(pm);
2723fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        // IME settings
2733fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        final Intent intent;
2743fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        final String settingsActivity = imi.getSettingsActivity();
2753fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        if (!TextUtils.isEmpty(settingsActivity)) {
2763fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            intent = new Intent(Intent.ACTION_MAIN);
2773fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            intent.setClassName(imi.getPackageName(), settingsActivity);
2783fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        } else {
2793fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            intent = null;
2803fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        }
2813fa13775e805df6cc7244d3f93105c5d3a5b748fsatok
2823fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        // Add a check box for enabling/disabling IME
2833fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        InputMethodPreference pref = new InputMethodPreference(this, intent, mImm, imi, imiSize);
2843fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        pref.setKey(imi.getId());
2853fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        pref.setTitle(label);
2863fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        return pref;
2873fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    }
2883fa13775e805df6cc7244d3f93105c5d3a5b748fsatok
2893fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    private void createImePreferenceHierarchy(PreferenceGroup root) {
2903fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        final Preference hardKeyPref = findPreference("hard_keyboard");
2913fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        if (mIsOnlyImeSettings) {
2923fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            getPreferenceScreen().removeAll();
2933fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            if (hardKeyPref != null && mHaveHardKeyboard) {
2943fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                getPreferenceScreen().addPreference(hardKeyPref);
2953fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            }
2963fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) {
2973fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                getPreferenceScreen().addPreference(mShowInputMethodSelectorPref);
2983fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            }
2993fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            getPreferenceScreen().addPreference(root);
3003fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        }
3013fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        if (hardKeyPref != null) {
3023fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            if (mHaveHardKeyboard) {
3033fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                mHardKeyboardCategory = (PreferenceCategory) hardKeyPref;
3043fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            } else {
3053fa13775e805df6cc7244d3f93105c5d3a5b748fsatok                getPreferenceScreen().removePreference(hardKeyPref);
3063fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            }
3073fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        }
3083fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        root.removeAll();
3093fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        mInputMethodPreferenceList.clear();
3103fa13775e805df6cc7244d3f93105c5d3a5b748fsatok
3113fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        if (!mIsOnlyImeSettings) {
3123fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            // Current IME selection
3133fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            final PreferenceScreen currentIme = new PreferenceScreen(getActivity(), null);
3143fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            currentIme.setKey(KEY_CURRENT_INPUT_METHOD);
3153fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            currentIme.setTitle(getResources().getString(R.string.current_input_method));
3163fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            root.addPreference(currentIme);
3173fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        }
3183fa13775e805df6cc7244d3f93105c5d3a5b748fsatok
3193fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        final int N = (mImis == null ? 0 : mImis.size());
3203fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        for (int i = 0; i < N; ++i) {
3213fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            final InputMethodInfo imi = mImis.get(i);
3223fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            final InputMethodPreference pref = getInputMethodPreference(imi, N);
3233fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            mInputMethodPreferenceList.add(pref);
3243fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        }
3253fa13775e805df6cc7244d3f93105c5d3a5b748fsatok
3263fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        Collections.sort(mInputMethodPreferenceList);
3273fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        for (int i = 0; i < N; ++i) {
3283fa13775e805df6cc7244d3f93105c5d3a5b748fsatok            root.addPreference(mInputMethodPreferenceList.get(i));
3293fa13775e805df6cc7244d3f93105c5d3a5b748fsatok        }
3303fa13775e805df6cc7244d3f93105c5d3a5b748fsatok    }
331afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
332