InputMethodAndLanguageSettings.java revision 0f2e6dec7c8dc136783eacb5b62c9d3248c4845a
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
17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings;
18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
19e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Projectimport android.app.AlertDialog;
20e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Projectimport android.app.Dialog;
21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
22e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Projectimport android.content.DialogInterface;
23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
24e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Projectimport android.content.pm.ApplicationInfo;
25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.res.Configuration;
26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
2780a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Projectimport android.os.Environment;
28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.SystemProperties;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.CheckBoxPreference;
30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference;
31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceActivity;
32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceGroup;
33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceScreen;
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings;
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.TextUtils;
36e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Projectimport android.view.View.OnClickListener;
37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.inputmethod.InputMethodInfo;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.inputmethod.InputMethodManager;
39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
4086997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Projectimport java.util.ArrayList;
41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.HashSet;
42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List;
43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpublic class LanguageSettings extends PreferenceActivity {
45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
460f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani    private static final String KEY_PHONE_LANGUAGE = "phone_language";
4786997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project    private boolean mHaveHardKeyboard;
4886997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project
49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private List<InputMethodInfo> mInputMethodProperties;
5086997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project    private List<CheckBoxPreference> mCheckboxes;
510f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani    private Preference mLanguagePref;
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    final TextUtils.SimpleStringSplitter mStringColonSplitter
54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            = new TextUtils.SimpleStringSplitter(':');
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private String mLastInputMethodId;
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private String mLastTickedInputMethodId;
5880a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project
59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    static public String getInputMethodIdFromKey(String key) {
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return key;
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onCreate(Bundle icicle) {
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        addPreferencesFromResource(R.xml.language_settings);
68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (getAssets().getLocales().length == 1) {
70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            getPreferenceScreen().
71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                removePreference(findPreference("language_category"));
720f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani        } else {
730f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani            mLanguagePref = findPreference(KEY_PHONE_LANGUAGE);
74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
7586997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project
76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Configuration config = getResources().getConfiguration();
77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (config.keyboard != Configuration.KEYBOARD_QWERTY) {
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            getPreferenceScreen().removePreference(
79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    getPreferenceScreen().findPreference("hardkeyboard_category"));
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
8186997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project            mHaveHardKeyboard = true;
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
8386997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project        mCheckboxes = new ArrayList<CheckBoxPreference>();
84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        onCreateIMM();
85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
8780a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project    private boolean isSystemIme(InputMethodInfo property) {
88e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project        return (property.getServiceInfo().applicationInfo.flags
89e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                & ApplicationInfo.FLAG_SYSTEM) != 0;
9080a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project    }
9180a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project
92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void onCreateIMM() {
93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mInputMethodProperties = imm.getInputMethodList();
96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mLastInputMethodId = Settings.Secure.getString(getContentResolver(),
98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Settings.Secure.DEFAULT_INPUT_METHOD);
99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        PreferenceGroup textCategory = (PreferenceGroup) findPreference("text_category");
101afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int N = (mInputMethodProperties == null ? 0 : mInputMethodProperties
103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                .size());
104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        for (int i = 0; i < N; ++i) {
105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            InputMethodInfo property = mInputMethodProperties.get(i);
106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            String prefKey = property.getId();
107afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            CharSequence label = property.loadLabel(getPackageManager());
10980a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            boolean systemIME = isSystemIme(property);
110afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Add a check box.
11180a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            // Don't show the toggle if it's the only keyboard in the system, or it's a system IME.
11280a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            if (mHaveHardKeyboard || (N > 1 && !systemIME)) {
11386997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                CheckBoxPreference chkbxPref = new CheckBoxPreference(this);
11486997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                chkbxPref.setKey(prefKey);
11586997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                chkbxPref.setTitle(label);
11686997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                textCategory.addPreference(chkbxPref);
11786997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                mCheckboxes.add(chkbxPref);
11886997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project            }
119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // If setting activity is available, add a setting screen entry.
121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (null != property.getSettingsActivity()) {
122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                PreferenceScreen prefScreen = new PreferenceScreen(this, null);
123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                prefScreen.setKey(property.getSettingsActivity());
12486997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                prefScreen.setTitle(label);
12586997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                if (N == 1) {
12686997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                    prefScreen.setSummary(getString(R.string.onscreen_keyboard_settings_summary));
12786997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                } else {
12886997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                    CharSequence settingsLabel = getResources().getString(
12986997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                            R.string.input_methods_settings_label_format, label);
13086997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                    prefScreen.setSummary(settingsLabel);
13186997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                }
132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                textCategory.addPreference(prefScreen);
133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
13680a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onResume() {
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onResume();
140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        final HashSet<String> enabled = new HashSet<String>();
142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String enabledStr = Settings.Secure.getString(getContentResolver(),
143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                Settings.Secure.ENABLED_INPUT_METHODS);
144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (enabledStr != null) {
145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;
146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            splitter.setString(enabledStr);
147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            while (splitter.hasNext()) {
148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                enabled.add(splitter.next());
149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Update the statuses of the Check Boxes.
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int N = mInputMethodProperties.size();
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        for (int i = 0; i < N; ++i) {
155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final String id = mInputMethodProperties.get(i).getId();
156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            CheckBoxPreference pref = (CheckBoxPreference) findPreference(mInputMethodProperties
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    .get(i).getId());
15886997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project            if (pref != null) {
15986997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                pref.setChecked(enabled.contains(id));
16086997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project            }
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mLastTickedInputMethodId = null;
1630f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani
1640f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani        if (mLanguagePref != null) {
1650f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani            Configuration conf = getResources().getConfiguration();
1660f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani            String locale = conf.locale.getDisplayName(conf.locale);
1670f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani            if (locale != null && locale.length() > 1) {
1680f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani                locale = Character.toUpperCase(locale.charAt(0)) + locale.substring(1);
1690f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani                mLanguagePref.setSummary(locale);
1700f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani            }
1710f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani        }
172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onPause() {
176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onPause();
177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        StringBuilder builder = new StringBuilder(256);
179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int firstEnabled = -1;
181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int N = mInputMethodProperties.size();
182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        for (int i = 0; i < N; ++i) {
18380a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            final InputMethodInfo property = mInputMethodProperties.get(i);
18480a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            final String id = property.getId();
185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            CheckBoxPreference pref = (CheckBoxPreference) findPreference(id);
186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            boolean hasIt = id.equals(mLastInputMethodId);
18780a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            boolean systemIme = isSystemIme(property);
18880a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            if (((N == 1 || systemIme) && !mHaveHardKeyboard)
18980a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project                    || (pref != null && pref.isChecked())) {
190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                if (builder.length() > 0) builder.append(':');
191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                builder.append(id);
192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                if (firstEnabled < 0) {
193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    firstEnabled = i;
194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
195afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else if (hasIt) {
196afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mLastInputMethodId = mLastTickedInputMethodId;
197afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
199afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // If the last input method is unset, set it as the first enabled one.
201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (null == mLastInputMethodId || "".equals(mLastInputMethodId)) {
202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (firstEnabled >= 0) {
203afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mLastInputMethodId = mInputMethodProperties.get(firstEnabled).getId();
204afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else {
205afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mLastInputMethodId = null;
206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
207afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
208afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Settings.Secure.putString(getContentResolver(),
210afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Settings.Secure.ENABLED_INPUT_METHODS, builder.toString());
211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Settings.Secure.putString(getContentResolver(),
212e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project            Settings.Secure.DEFAULT_INPUT_METHOD,
213e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project            mLastInputMethodId != null ? mLastInputMethodId : "");
214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
215afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
21686997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project    @Override
21786997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
21886997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project
219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Input Method stuff
220a718832e28095219a897c6e95e903c1a3fe57c12Ying Wang        if (Utils.isMonkeyRunning()) {
221afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return false;
222afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
223afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (preference instanceof CheckBoxPreference) {
225e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project            final CheckBoxPreference chkPref = (CheckBoxPreference) preference;
226e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project            final String id = getInputMethodIdFromKey(chkPref.getKey());
227afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (chkPref.isChecked()) {
228e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                InputMethodInfo selImi = null;
229e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                final int N = mInputMethodProperties.size();
230e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                for (int i=0; i<N; i++) {
231e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                    InputMethodInfo imi = mInputMethodProperties.get(i);
232e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                    if (id.equals(imi.getId())) {
233e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        selImi = imi;
234e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        if (isSystemIme(imi)) {
235e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                            // This is a built-in IME, so no need to warn.
236e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                            mLastTickedInputMethodId = id;
237e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                            return super.onPreferenceTreeClick(preferenceScreen, preference);
238e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        }
239e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                    }
240e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                }
241e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                chkPref.setChecked(false);
242e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                if (selImi == null) {
243e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                    return super.onPreferenceTreeClick(preferenceScreen, preference);
244e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                }
245e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                AlertDialog d = (new AlertDialog.Builder(this))
246e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        .setTitle(android.R.string.dialog_alert_title)
247e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        .setIcon(android.R.drawable.ic_dialog_alert)
248e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        .setMessage(getString(R.string.ime_security_warning,
249e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                                selImi.getServiceInfo().applicationInfo.loadLabel(
250e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                                        getPackageManager())))
251e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        .setCancelable(true)
252e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        .setPositiveButton(android.R.string.ok,
253e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                                new DialogInterface.OnClickListener() {
254e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                                    public void onClick(DialogInterface dialog, int which) {
255e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                                        chkPref.setChecked(true);
256e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                                        mLastTickedInputMethodId = id;
257e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                                    }
258e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project
259e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        })
260e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        .setNegativeButton(android.R.string.cancel,
261e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                                new DialogInterface.OnClickListener() {
262e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                                    public void onClick(DialogInterface dialog, int which) {
263e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                                    }
264e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project
265e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        })
266e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        .create();
267e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                d.show();
268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else if (id.equals(mLastTickedInputMethodId)) {
269afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mLastTickedInputMethodId = null;
270afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
271afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference instanceof PreferenceScreen) {
272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (preference.getIntent() == null) {
273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                PreferenceScreen pref = (PreferenceScreen) preference;
274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                String activityName = pref.getKey();
275afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                String packageName = activityName.substring(0, activityName
276afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                        .lastIndexOf("."));
277afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                if (activityName.length() > 0) {
278afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    Intent i = new Intent(Intent.ACTION_MAIN);
279afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    i.setClassName(packageName, activityName);
280afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    startActivity(i);
281afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
282afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
283afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
284afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return super.onPreferenceTreeClick(preferenceScreen, preference);
285afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
286afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
288