InputMethodAndLanguageSettings.java revision c88c6bbcd0d3901fe9f61bab82a17ec49ad62e6d
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
190cc35e444bd71f117b6aed97e40ea4f3d82cd8faDaisuke Miyakawaimport android.app.Activity;
20e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Projectimport android.app.AlertDialog;
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;
27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.CheckBoxPreference;
28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceGroup;
30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceScreen;
31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings;
32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.TextUtils;
330cc35e444bd71f117b6aed97e40ea4f3d82cd8faDaisuke Miyakawaimport android.util.Log;
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.inputmethod.InputMethodInfo;
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.inputmethod.InputMethodManager;
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
3786997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Projectimport java.util.ArrayList;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.HashSet;
39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List;
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
41d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasanipublic class LanguageSettings extends SettingsPreferenceFragment {
420cc35e444bd71f117b6aed97e40ea4f3d82cd8faDaisuke Miyakawa    private static final String TAG = LanguageSettings.class.getSimpleName();
430cc35e444bd71f117b6aed97e40ea4f3d82cd8faDaisuke Miyakawa
440f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani    private static final String KEY_PHONE_LANGUAGE = "phone_language";
45e7739d1ab51cfe5998e897d7d0d8e97ae54eecfaAmith Yamasani    private static final String KEY_INPUT_METHOD = "input_method";
46e7739d1ab51cfe5998e897d7d0d8e97ae54eecfaAmith Yamasani
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;
5820108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai
5920108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai    private AlertDialog mDialog = null;
6080a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    static public String getInputMethodIdFromKey(String key) {
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return key;
63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
66d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onCreate(Bundle icicle) {
67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        addPreferencesFromResource(R.xml.language_settings);
70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
71d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        if (getActivity().getAssets().getLocales().length == 1) {
72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            getPreferenceScreen().
73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                removePreference(findPreference("language_category"));
740f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani        } else {
750f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani            mLanguagePref = findPreference(KEY_PHONE_LANGUAGE);
76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
7786997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Configuration config = getResources().getConfiguration();
79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (config.keyboard != Configuration.KEYBOARD_QWERTY) {
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            getPreferenceScreen().removePreference(
81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    getPreferenceScreen().findPreference("hardkeyboard_category"));
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
8386997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project            mHaveHardKeyboard = true;
84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
8586997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project        mCheckboxes = new ArrayList<CheckBoxPreference>();
86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        onCreateIMM();
87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
8980a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project    private boolean isSystemIme(InputMethodInfo property) {
90e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project        return (property.getServiceInfo().applicationInfo.flags
91e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                & ApplicationInfo.FLAG_SYSTEM) != 0;
9280a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project    }
9380a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project
94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void onCreateIMM() {
95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mInputMethodProperties = imm.getInputMethodList();
98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mLastInputMethodId = Settings.Secure.getString(getContentResolver(),
100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Settings.Secure.DEFAULT_INPUT_METHOD);
101afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        PreferenceGroup textCategory = (PreferenceGroup) findPreference("text_category");
103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int N = (mInputMethodProperties == null ? 0 : mInputMethodProperties
105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                .size());
106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        for (int i = 0; i < N; ++i) {
107afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            InputMethodInfo property = mInputMethodProperties.get(i);
108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            String prefKey = property.getId();
109afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
110d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani            CharSequence label = property.loadLabel(getActivity().getPackageManager());
11180a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            boolean systemIME = isSystemIme(property);
112afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Add a check box.
11380a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            // Don't show the toggle if it's the only keyboard in the system, or it's a system IME.
11480a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            if (mHaveHardKeyboard || (N > 1 && !systemIME)) {
115d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                CheckBoxPreference chkbxPref = new CheckBoxPreference(getActivity());
11686997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                chkbxPref.setKey(prefKey);
11786997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                chkbxPref.setTitle(label);
11886997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                textCategory.addPreference(chkbxPref);
11986997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                mCheckboxes.add(chkbxPref);
12086997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project            }
121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // If setting activity is available, add a setting screen entry.
123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (null != property.getSettingsActivity()) {
124d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                PreferenceScreen prefScreen = new PreferenceScreen(getActivity(), null);
125e086d9ad6118d2a7a3132305c2e7d719cd6fe030Amith Yamasani                String settingsActivity = property.getSettingsActivity();
126e086d9ad6118d2a7a3132305c2e7d719cd6fe030Amith Yamasani                if (settingsActivity.lastIndexOf("/") < 0) {
127e086d9ad6118d2a7a3132305c2e7d719cd6fe030Amith Yamasani                    settingsActivity = property.getPackageName() + "/" + settingsActivity;
128e086d9ad6118d2a7a3132305c2e7d719cd6fe030Amith Yamasani                }
129e086d9ad6118d2a7a3132305c2e7d719cd6fe030Amith Yamasani                prefScreen.setKey(settingsActivity);
13086997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                prefScreen.setTitle(label);
13186997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                if (N == 1) {
132d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    prefScreen.setSummary(getResources().getString(
133d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                            R.string.onscreen_keyboard_settings_summary));
13486997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                } else {
13586997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                    CharSequence settingsLabel = getResources().getString(
13686997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                            R.string.input_methods_settings_label_format, label);
13786997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                    prefScreen.setSummary(settingsLabel);
13886997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                }
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                textCategory.addPreference(prefScreen);
140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
14380a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project
144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
145d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onResume() {
146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onResume();
147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        final HashSet<String> enabled = new HashSet<String>();
149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String enabledStr = Settings.Secure.getString(getContentResolver(),
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                Settings.Secure.ENABLED_INPUT_METHODS);
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (enabledStr != null) {
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            splitter.setString(enabledStr);
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            while (splitter.hasNext()) {
155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                enabled.add(splitter.next());
156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Update the statuses of the Check Boxes.
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int N = mInputMethodProperties.size();
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        for (int i = 0; i < N; ++i) {
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final String id = mInputMethodProperties.get(i).getId();
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            CheckBoxPreference pref = (CheckBoxPreference) findPreference(mInputMethodProperties
164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    .get(i).getId());
16586997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project            if (pref != null) {
16686997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                pref.setChecked(enabled.contains(id));
16786997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project            }
168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mLastTickedInputMethodId = null;
1700f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani
1710f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani        if (mLanguagePref != null) {
1720f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani            Configuration conf = getResources().getConfiguration();
1730f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani            String locale = conf.locale.getDisplayName(conf.locale);
1740f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani            if (locale != null && locale.length() > 1) {
1750f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani                locale = Character.toUpperCase(locale.charAt(0)) + locale.substring(1);
1760f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani                mLanguagePref.setSummary(locale);
1770f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani            }
1780f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani        }
179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
182d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onPause() {
183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onPause();
184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        StringBuilder builder = new StringBuilder(256);
186305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani        StringBuilder disabledSysImes = new StringBuilder(256);
187305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani
188afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int firstEnabled = -1;
189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int N = mInputMethodProperties.size();
190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        for (int i = 0; i < N; ++i) {
19180a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            final InputMethodInfo property = mInputMethodProperties.get(i);
19280a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            final String id = property.getId();
193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            CheckBoxPreference pref = (CheckBoxPreference) findPreference(id);
194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            boolean hasIt = id.equals(mLastInputMethodId);
19580a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            boolean systemIme = isSystemIme(property);
19680a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            if (((N == 1 || systemIme) && !mHaveHardKeyboard)
19780a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project                    || (pref != null && pref.isChecked())) {
198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                if (builder.length() > 0) builder.append(':');
199afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                builder.append(id);
200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                if (firstEnabled < 0) {
201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    firstEnabled = i;
202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
203afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else if (hasIt) {
204afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mLastInputMethodId = mLastTickedInputMethodId;
205afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
206305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani            // If it's a disabled system ime, add it to the disabled list so that it
207305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani            // doesn't get enabled automatically on any changes to the package list
208305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani            if (pref != null && !pref.isChecked() && systemIme && mHaveHardKeyboard) {
209305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani                if (disabledSysImes.length() > 0) disabledSysImes.append(":");
210305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani                disabledSysImes.append(id);
211305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani            }
212afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // If the last input method is unset, set it as the first enabled one.
215afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (null == mLastInputMethodId || "".equals(mLastInputMethodId)) {
216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (firstEnabled >= 0) {
217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mLastInputMethodId = mInputMethodProperties.get(firstEnabled).getId();
218afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else {
219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mLastInputMethodId = null;
220afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
221afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
222afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
223afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Settings.Secure.putString(getContentResolver(),
224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Settings.Secure.ENABLED_INPUT_METHODS, builder.toString());
225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Settings.Secure.putString(getContentResolver(),
226305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani                Settings.Secure.DISABLED_SYSTEM_INPUT_METHODS, disabledSysImes.toString());
227305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani        Settings.Secure.putString(getContentResolver(),
228e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project            Settings.Secure.DEFAULT_INPUT_METHOD,
229e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project            mLastInputMethodId != null ? mLastInputMethodId : "");
230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
231afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
23286997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project    @Override
23386997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
23486997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project
235afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Input Method stuff
236a718832e28095219a897c6e95e903c1a3fe57c12Ying Wang        if (Utils.isMonkeyRunning()) {
237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return false;
238afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
240afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (preference instanceof CheckBoxPreference) {
241e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project            final CheckBoxPreference chkPref = (CheckBoxPreference) preference;
242e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project            final String id = getInputMethodIdFromKey(chkPref.getKey());
243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (chkPref.isChecked()) {
244e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                InputMethodInfo selImi = null;
245e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                final int N = mInputMethodProperties.size();
246e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                for (int i=0; i<N; i++) {
247e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                    InputMethodInfo imi = mInputMethodProperties.get(i);
248e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                    if (id.equals(imi.getId())) {
249e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        selImi = imi;
250e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        if (isSystemIme(imi)) {
251e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                            // This is a built-in IME, so no need to warn.
252e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                            mLastTickedInputMethodId = id;
253e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                            return super.onPreferenceTreeClick(preferenceScreen, preference);
254e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        }
255e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                    }
256e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                }
257e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                chkPref.setChecked(false);
258e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                if (selImi == null) {
259e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                    return super.onPreferenceTreeClick(preferenceScreen, preference);
260e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                }
26120108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                if (mDialog == null) {
262d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    // TODO: DialogFragment?
263d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    mDialog = (new AlertDialog.Builder(getActivity()))
26420108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                            .setTitle(android.R.string.dialog_alert_title)
26520108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                            .setIcon(android.R.drawable.ic_dialog_alert)
26620108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                            .setCancelable(true)
26720108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                            .setPositiveButton(android.R.string.ok,
26820108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                                    new DialogInterface.OnClickListener() {
26920108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                                        public void onClick(DialogInterface dialog, int which) {
27020108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                                            chkPref.setChecked(true);
27120108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                                            mLastTickedInputMethodId = id;
27220108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                                        }
27320108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai
27420108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                            })
27520108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                            .setNegativeButton(android.R.string.cancel,
27620108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                                    new DialogInterface.OnClickListener() {
27720108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                                        public void onClick(DialogInterface dialog, int which) {
27820108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                                        }
27920108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai
28020108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                            })
28120108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                            .create();
28220108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                } else {
28320108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                    if (mDialog.isShowing()) {
28420108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                        mDialog.dismiss();
28520108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                    }
28620108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                }
287d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                mDialog.setMessage(getResources().getString(
288d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                        R.string.ime_security_warning,
289d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                        selImi.getServiceInfo().applicationInfo.loadLabel(getPackageManager())));
29020108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                mDialog.show();
291afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else if (id.equals(mLastTickedInputMethodId)) {
292afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mLastTickedInputMethodId = null;
293afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
294afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference instanceof PreferenceScreen) {
295c88c6bbcd0d3901fe9f61bab82a17ec49ad62e6dDaisuke Miyakawa            if (preference.getFragment() != null) {
296c88c6bbcd0d3901fe9f61bab82a17ec49ad62e6dDaisuke Miyakawa                // Fragment will be handled correctly by the super class.
297c88c6bbcd0d3901fe9f61bab82a17ec49ad62e6dDaisuke Miyakawa            } else if (KEY_INPUT_METHOD.equals(preference.getKey())) {
298e7739d1ab51cfe5998e897d7d0d8e97ae54eecfaAmith Yamasani                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
299e7739d1ab51cfe5998e897d7d0d8e97ae54eecfaAmith Yamasani                imm.showInputMethodPicker();
300e7739d1ab51cfe5998e897d7d0d8e97ae54eecfaAmith Yamasani            } else if (preference.getIntent() == null) {
301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                PreferenceScreen pref = (PreferenceScreen) preference;
302afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                String activityName = pref.getKey();
303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                String packageName = activityName.substring(0, activityName
304afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                        .lastIndexOf("."));
305e086d9ad6118d2a7a3132305c2e7d719cd6fe030Amith Yamasani                int slash = activityName.indexOf("/");
306e086d9ad6118d2a7a3132305c2e7d719cd6fe030Amith Yamasani                if (slash > 0) {
307e086d9ad6118d2a7a3132305c2e7d719cd6fe030Amith Yamasani                    packageName = activityName.substring(0, slash);
308e086d9ad6118d2a7a3132305c2e7d719cd6fe030Amith Yamasani                    activityName = activityName.substring(slash + 1);
309e086d9ad6118d2a7a3132305c2e7d719cd6fe030Amith Yamasani                }
310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                if (activityName.length() > 0) {
311afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    Intent i = new Intent(Intent.ACTION_MAIN);
312afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    i.setClassName(packageName, activityName);
313afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    startActivity(i);
314afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
315afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
316afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
317afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return super.onPreferenceTreeClick(preferenceScreen, preference);
318afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
319afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
32020108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai    @Override
321d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onDestroy() {
32220108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai        super.onDestroy();
32320108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai        if (mDialog != null) {
32420108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai            mDialog.dismiss();
32520108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai            mDialog = null;
32620108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai        }
32720108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai    }
32820108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai
329afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
330