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