InputMethodAndLanguageSettings.java revision a718832e28095219a897c6e95e903c1a3fe57c12
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
4686997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project    private boolean mHaveHardKeyboard;
4786997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project
48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private List<InputMethodInfo> mInputMethodProperties;
4986997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project    private List<CheckBoxPreference> mCheckboxes;
50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    final TextUtils.SimpleStringSplitter mStringColonSplitter
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            = new TextUtils.SimpleStringSplitter(':');
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private String mLastInputMethodId;
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private String mLastTickedInputMethodId;
5680a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    static public String getInputMethodIdFromKey(String key) {
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return key;
59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onCreate(Bundle icicle) {
63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        addPreferencesFromResource(R.xml.language_settings);
66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (getAssets().getLocales().length == 1) {
68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            getPreferenceScreen().
69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                removePreference(findPreference("language_category"));
70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
7186997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project
72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Configuration config = getResources().getConfiguration();
73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (config.keyboard != Configuration.KEYBOARD_QWERTY) {
74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            getPreferenceScreen().removePreference(
75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    getPreferenceScreen().findPreference("hardkeyboard_category"));
76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
7786997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project            mHaveHardKeyboard = true;
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
7986997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project        mCheckboxes = new ArrayList<CheckBoxPreference>();
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        onCreateIMM();
81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
8380a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project    private boolean isSystemIme(InputMethodInfo property) {
84e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project        return (property.getServiceInfo().applicationInfo.flags
85e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                & ApplicationInfo.FLAG_SYSTEM) != 0;
8680a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project    }
8780a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project
88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void onCreateIMM() {
89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mInputMethodProperties = imm.getInputMethodList();
92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mLastInputMethodId = Settings.Secure.getString(getContentResolver(),
94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Settings.Secure.DEFAULT_INPUT_METHOD);
95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        PreferenceGroup textCategory = (PreferenceGroup) findPreference("text_category");
97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int N = (mInputMethodProperties == null ? 0 : mInputMethodProperties
99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                .size());
100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        for (int i = 0; i < N; ++i) {
101afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            InputMethodInfo property = mInputMethodProperties.get(i);
102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            String prefKey = property.getId();
103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            CharSequence label = property.loadLabel(getPackageManager());
10580a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            boolean systemIME = isSystemIme(property);
106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Add a check box.
10780a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            // Don't show the toggle if it's the only keyboard in the system, or it's a system IME.
10880a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            if (mHaveHardKeyboard || (N > 1 && !systemIME)) {
10986997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                CheckBoxPreference chkbxPref = new CheckBoxPreference(this);
11086997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                chkbxPref.setKey(prefKey);
11186997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                chkbxPref.setTitle(label);
11286997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                textCategory.addPreference(chkbxPref);
11386997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                mCheckboxes.add(chkbxPref);
11486997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project            }
115afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
116afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // If setting activity is available, add a setting screen entry.
117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (null != property.getSettingsActivity()) {
118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                PreferenceScreen prefScreen = new PreferenceScreen(this, null);
119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                prefScreen.setKey(property.getSettingsActivity());
12086997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                prefScreen.setTitle(label);
12186997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                if (N == 1) {
12286997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                    prefScreen.setSummary(getString(R.string.onscreen_keyboard_settings_summary));
12386997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                } else {
12486997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                    CharSequence settingsLabel = getResources().getString(
12586997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                            R.string.input_methods_settings_label_format, label);
12686997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                    prefScreen.setSummary(settingsLabel);
12786997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                }
128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                textCategory.addPreference(prefScreen);
129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
13280a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project
133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onResume() {
135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onResume();
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        final HashSet<String> enabled = new HashSet<String>();
138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String enabledStr = Settings.Secure.getString(getContentResolver(),
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                Settings.Secure.ENABLED_INPUT_METHODS);
140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (enabledStr != null) {
141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;
142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            splitter.setString(enabledStr);
143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            while (splitter.hasNext()) {
144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                enabled.add(splitter.next());
145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Update the statuses of the Check Boxes.
149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int N = mInputMethodProperties.size();
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        for (int i = 0; i < N; ++i) {
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final String id = mInputMethodProperties.get(i).getId();
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            CheckBoxPreference pref = (CheckBoxPreference) findPreference(mInputMethodProperties
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    .get(i).getId());
15486997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project            if (pref != null) {
15586997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                pref.setChecked(enabled.contains(id));
15686997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project            }
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mLastTickedInputMethodId = null;
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onPause() {
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onPause();
164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        StringBuilder builder = new StringBuilder(256);
166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int firstEnabled = -1;
168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int N = mInputMethodProperties.size();
169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        for (int i = 0; i < N; ++i) {
17080a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            final InputMethodInfo property = mInputMethodProperties.get(i);
17180a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            final String id = property.getId();
172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            CheckBoxPreference pref = (CheckBoxPreference) findPreference(id);
173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            boolean hasIt = id.equals(mLastInputMethodId);
17480a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            boolean systemIme = isSystemIme(property);
17580a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            if (((N == 1 || systemIme) && !mHaveHardKeyboard)
17680a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project                    || (pref != null && pref.isChecked())) {
177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                if (builder.length() > 0) builder.append(':');
178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                builder.append(id);
179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                if (firstEnabled < 0) {
180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    firstEnabled = i;
181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else if (hasIt) {
183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mLastInputMethodId = mLastTickedInputMethodId;
184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // If the last input method is unset, set it as the first enabled one.
188afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (null == mLastInputMethodId || "".equals(mLastInputMethodId)) {
189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (firstEnabled >= 0) {
190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mLastInputMethodId = mInputMethodProperties.get(firstEnabled).getId();
191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else {
192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mLastInputMethodId = null;
193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
195afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
196afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Settings.Secure.putString(getContentResolver(),
197afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Settings.Secure.ENABLED_INPUT_METHODS, builder.toString());
198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Settings.Secure.putString(getContentResolver(),
199e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project            Settings.Secure.DEFAULT_INPUT_METHOD,
200e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project            mLastInputMethodId != null ? mLastInputMethodId : "");
201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
20386997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project    @Override
20486997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
20586997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project
206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Input Method stuff
207a718832e28095219a897c6e95e903c1a3fe57c12Ying Wang        if (Utils.isMonkeyRunning()) {
208afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return false;
209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
210afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (preference instanceof CheckBoxPreference) {
212e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project            final CheckBoxPreference chkPref = (CheckBoxPreference) preference;
213e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project            final String id = getInputMethodIdFromKey(chkPref.getKey());
214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (chkPref.isChecked()) {
215e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                InputMethodInfo selImi = null;
216e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                final int N = mInputMethodProperties.size();
217e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                for (int i=0; i<N; i++) {
218e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                    InputMethodInfo imi = mInputMethodProperties.get(i);
219e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                    if (id.equals(imi.getId())) {
220e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        selImi = imi;
221e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        if (isSystemIme(imi)) {
222e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                            // This is a built-in IME, so no need to warn.
223e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                            mLastTickedInputMethodId = id;
224e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                            return super.onPreferenceTreeClick(preferenceScreen, preference);
225e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        }
226e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                    }
227e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                }
228e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                chkPref.setChecked(false);
229e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                if (selImi == null) {
230e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                    return super.onPreferenceTreeClick(preferenceScreen, preference);
231e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                }
232e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                AlertDialog d = (new AlertDialog.Builder(this))
233e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        .setTitle(android.R.string.dialog_alert_title)
234e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        .setIcon(android.R.drawable.ic_dialog_alert)
235e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        .setMessage(getString(R.string.ime_security_warning,
236e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                                selImi.getServiceInfo().applicationInfo.loadLabel(
237e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                                        getPackageManager())))
238e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        .setCancelable(true)
239e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        .setPositiveButton(android.R.string.ok,
240e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                                new DialogInterface.OnClickListener() {
241e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                                    public void onClick(DialogInterface dialog, int which) {
242e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                                        chkPref.setChecked(true);
243e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                                        mLastTickedInputMethodId = id;
244e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                                    }
245e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project
246e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        })
247e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        .setNegativeButton(android.R.string.cancel,
248e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                                new DialogInterface.OnClickListener() {
249e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                                    public void onClick(DialogInterface dialog, int which) {
250e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                                    }
251e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project
252e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        })
253e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        .create();
254e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                d.show();
255afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else if (id.equals(mLastTickedInputMethodId)) {
256afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mLastTickedInputMethodId = null;
257afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
258afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference instanceof PreferenceScreen) {
259afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (preference.getIntent() == null) {
260afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                PreferenceScreen pref = (PreferenceScreen) preference;
261afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                String activityName = pref.getKey();
262afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                String packageName = activityName.substring(0, activityName
263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                        .lastIndexOf("."));
264afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                if (activityName.length() > 0) {
265afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    Intent i = new Intent(Intent.ACTION_MAIN);
266afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    i.setClassName(packageName, activityName);
267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    startActivity(i);
268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
269afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
270afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
271afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return super.onPreferenceTreeClick(preferenceScreen, preference);
272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
275