InputMethodAndLanguageSettings.java revision d79934731c8d33f6fc63b21c120b9ffba5d06f54
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;
20afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
21e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Projectimport android.content.DialogInterface;
22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
23e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Projectimport android.content.pm.ApplicationInfo;
24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.res.Configuration;
25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.CheckBoxPreference;
27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference;
28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceGroup;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceScreen;
30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings;
31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.TextUtils;
32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.inputmethod.InputMethodInfo;
33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.inputmethod.InputMethodManager;
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
3586997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Projectimport java.util.ArrayList;
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.HashSet;
37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
39d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasanipublic class LanguageSettings extends SettingsPreferenceFragment {
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
410f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani    private static final String KEY_PHONE_LANGUAGE = "phone_language";
42e7739d1ab51cfe5998e897d7d0d8e97ae54eecfaAmith Yamasani    private static final String KEY_INPUT_METHOD = "input_method";
43e7739d1ab51cfe5998e897d7d0d8e97ae54eecfaAmith Yamasani
4486997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project    private boolean mHaveHardKeyboard;
4586997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project
46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private List<InputMethodInfo> mInputMethodProperties;
4786997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project    private List<CheckBoxPreference> mCheckboxes;
480f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani    private Preference mLanguagePref;
49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    final TextUtils.SimpleStringSplitter mStringColonSplitter
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            = new TextUtils.SimpleStringSplitter(':');
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private String mLastInputMethodId;
54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private String mLastTickedInputMethodId;
5520108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai
5620108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai    private AlertDialog mDialog = null;
5780a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    static public String getInputMethodIdFromKey(String key) {
59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return key;
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
63d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onCreate(Bundle icicle) {
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        addPreferencesFromResource(R.xml.language_settings);
67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
68d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani        if (getActivity().getAssets().getLocales().length == 1) {
69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            getPreferenceScreen().
70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                removePreference(findPreference("language_category"));
710f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani        } else {
720f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani            mLanguagePref = findPreference(KEY_PHONE_LANGUAGE);
73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
7486997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project
75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Configuration config = getResources().getConfiguration();
76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (config.keyboard != Configuration.KEYBOARD_QWERTY) {
77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            getPreferenceScreen().removePreference(
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    getPreferenceScreen().findPreference("hardkeyboard_category"));
79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
8086997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project            mHaveHardKeyboard = true;
81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
8286997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project        mCheckboxes = new ArrayList<CheckBoxPreference>();
83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        onCreateIMM();
84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
8680a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project    private boolean isSystemIme(InputMethodInfo property) {
87e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project        return (property.getServiceInfo().applicationInfo.flags
88e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                & ApplicationInfo.FLAG_SYSTEM) != 0;
8980a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project    }
9080a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project
91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void onCreateIMM() {
92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mInputMethodProperties = imm.getInputMethodList();
95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mLastInputMethodId = Settings.Secure.getString(getContentResolver(),
97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Settings.Secure.DEFAULT_INPUT_METHOD);
98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        PreferenceGroup textCategory = (PreferenceGroup) findPreference("text_category");
100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
101afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int N = (mInputMethodProperties == null ? 0 : mInputMethodProperties
102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                .size());
103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        for (int i = 0; i < N; ++i) {
104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            InputMethodInfo property = mInputMethodProperties.get(i);
105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            String prefKey = property.getId();
106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
107d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani            CharSequence label = property.loadLabel(getActivity().getPackageManager());
10880a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            boolean systemIME = isSystemIme(property);
109afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Add a check box.
11080a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            // Don't show the toggle if it's the only keyboard in the system, or it's a system IME.
11180a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            if (mHaveHardKeyboard || (N > 1 && !systemIME)) {
112d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                CheckBoxPreference chkbxPref = new CheckBoxPreference(getActivity());
11386997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                chkbxPref.setKey(prefKey);
11486997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                chkbxPref.setTitle(label);
11586997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                textCategory.addPreference(chkbxPref);
11686997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                mCheckboxes.add(chkbxPref);
11786997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project            }
118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // If setting activity is available, add a setting screen entry.
120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (null != property.getSettingsActivity()) {
121d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                PreferenceScreen prefScreen = new PreferenceScreen(getActivity(), null);
122e086d9ad6118d2a7a3132305c2e7d719cd6fe030Amith Yamasani                String settingsActivity = property.getSettingsActivity();
123e086d9ad6118d2a7a3132305c2e7d719cd6fe030Amith Yamasani                if (settingsActivity.lastIndexOf("/") < 0) {
124e086d9ad6118d2a7a3132305c2e7d719cd6fe030Amith Yamasani                    settingsActivity = property.getPackageName() + "/" + settingsActivity;
125e086d9ad6118d2a7a3132305c2e7d719cd6fe030Amith Yamasani                }
126e086d9ad6118d2a7a3132305c2e7d719cd6fe030Amith Yamasani                prefScreen.setKey(settingsActivity);
12786997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                prefScreen.setTitle(label);
12886997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                if (N == 1) {
129d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    prefScreen.setSummary(getResources().getString(
130d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                            R.string.onscreen_keyboard_settings_summary));
13186997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                } else {
13286997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                    CharSequence settingsLabel = getResources().getString(
13386997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                            R.string.input_methods_settings_label_format, label);
13486997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                    prefScreen.setSummary(settingsLabel);
13586997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                }
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                textCategory.addPreference(prefScreen);
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
14080a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project
141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
142d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onResume() {
143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onResume();
144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        final HashSet<String> enabled = new HashSet<String>();
146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String enabledStr = Settings.Secure.getString(getContentResolver(),
147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                Settings.Secure.ENABLED_INPUT_METHODS);
148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (enabledStr != null) {
149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            splitter.setString(enabledStr);
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            while (splitter.hasNext()) {
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                enabled.add(splitter.next());
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Update the statuses of the Check Boxes.
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int N = mInputMethodProperties.size();
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        for (int i = 0; i < N; ++i) {
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final String id = mInputMethodProperties.get(i).getId();
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            CheckBoxPreference pref = (CheckBoxPreference) findPreference(mInputMethodProperties
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    .get(i).getId());
16286997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project            if (pref != null) {
16386997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project                pref.setChecked(enabled.contains(id));
16486997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project            }
165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mLastTickedInputMethodId = null;
1670f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani
1680f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani        if (mLanguagePref != null) {
1690f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani            Configuration conf = getResources().getConfiguration();
1700f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani            String locale = conf.locale.getDisplayName(conf.locale);
1710f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani            if (locale != null && locale.length() > 1) {
1720f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani                locale = Character.toUpperCase(locale.charAt(0)) + locale.substring(1);
1730f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani                mLanguagePref.setSummary(locale);
1740f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani            }
1750f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani        }
176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
179d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onPause() {
180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onPause();
181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        StringBuilder builder = new StringBuilder(256);
183305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani        StringBuilder disabledSysImes = new StringBuilder(256);
184305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani
185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int firstEnabled = -1;
186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int N = mInputMethodProperties.size();
187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        for (int i = 0; i < N; ++i) {
18880a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            final InputMethodInfo property = mInputMethodProperties.get(i);
18980a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            final String id = property.getId();
190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            CheckBoxPreference pref = (CheckBoxPreference) findPreference(id);
191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            boolean hasIt = id.equals(mLastInputMethodId);
19280a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            boolean systemIme = isSystemIme(property);
19380a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project            if (((N == 1 || systemIme) && !mHaveHardKeyboard)
19480a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project                    || (pref != null && pref.isChecked())) {
195afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                if (builder.length() > 0) builder.append(':');
196afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                builder.append(id);
197afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                if (firstEnabled < 0) {
198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    firstEnabled = i;
199afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else if (hasIt) {
201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mLastInputMethodId = mLastTickedInputMethodId;
202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
203305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani            // If it's a disabled system ime, add it to the disabled list so that it
204305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani            // doesn't get enabled automatically on any changes to the package list
205305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani            if (pref != null && !pref.isChecked() && systemIme && mHaveHardKeyboard) {
206305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani                if (disabledSysImes.length() > 0) disabledSysImes.append(":");
207305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani                disabledSysImes.append(id);
208305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani            }
209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
210afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // If the last input method is unset, set it as the first enabled one.
212afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (null == mLastInputMethodId || "".equals(mLastInputMethodId)) {
213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (firstEnabled >= 0) {
214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mLastInputMethodId = mInputMethodProperties.get(firstEnabled).getId();
215afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else {
216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mLastInputMethodId = null;
217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
218afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
220afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Settings.Secure.putString(getContentResolver(),
221afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Settings.Secure.ENABLED_INPUT_METHODS, builder.toString());
222afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Settings.Secure.putString(getContentResolver(),
223305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani                Settings.Secure.DISABLED_SYSTEM_INPUT_METHODS, disabledSysImes.toString());
224305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani        Settings.Secure.putString(getContentResolver(),
225e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project            Settings.Secure.DEFAULT_INPUT_METHOD,
226e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project            mLastInputMethodId != null ? mLastInputMethodId : "");
227afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
228afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
22986997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project    @Override
23086997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
23186997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project
232afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Input Method stuff
233a718832e28095219a897c6e95e903c1a3fe57c12Ying Wang        if (Utils.isMonkeyRunning()) {
234afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return false;
235afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (preference instanceof CheckBoxPreference) {
238e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project            final CheckBoxPreference chkPref = (CheckBoxPreference) preference;
239e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project            final String id = getInputMethodIdFromKey(chkPref.getKey());
240afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (chkPref.isChecked()) {
241e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                InputMethodInfo selImi = null;
242e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                final int N = mInputMethodProperties.size();
243e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                for (int i=0; i<N; i++) {
244e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                    InputMethodInfo imi = mInputMethodProperties.get(i);
245e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                    if (id.equals(imi.getId())) {
246e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        selImi = imi;
247e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        if (isSystemIme(imi)) {
248e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                            // This is a built-in IME, so no need to warn.
249e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                            mLastTickedInputMethodId = id;
250e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                            return super.onPreferenceTreeClick(preferenceScreen, preference);
251e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                        }
252e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                    }
253e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                }
254e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                chkPref.setChecked(false);
255e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                if (selImi == null) {
256e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                    return super.onPreferenceTreeClick(preferenceScreen, preference);
257e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project                }
25820108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                if (mDialog == null) {
259d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    // TODO: DialogFragment?
260d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                    mDialog = (new AlertDialog.Builder(getActivity()))
26120108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                            .setTitle(android.R.string.dialog_alert_title)
26220108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                            .setIcon(android.R.drawable.ic_dialog_alert)
26320108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                            .setCancelable(true)
26420108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                            .setPositiveButton(android.R.string.ok,
26520108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                                    new DialogInterface.OnClickListener() {
26620108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                                        public void onClick(DialogInterface dialog, int which) {
26720108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                                            chkPref.setChecked(true);
26820108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                                            mLastTickedInputMethodId = id;
26920108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                                        }
27020108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai
27120108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                            })
27220108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                            .setNegativeButton(android.R.string.cancel,
27320108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                                    new DialogInterface.OnClickListener() {
27420108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                                        public void onClick(DialogInterface dialog, int which) {
27520108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                                        }
27620108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai
27720108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                            })
27820108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                            .create();
27920108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                } else {
28020108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                    if (mDialog.isShowing()) {
28120108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                        mDialog.dismiss();
28220108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                    }
28320108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                }
284d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                mDialog.setMessage(getResources().getString(
285d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                        R.string.ime_security_warning,
286d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani                        selImi.getServiceInfo().applicationInfo.loadLabel(getPackageManager())));
28720108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai                mDialog.show();
288afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else if (id.equals(mLastTickedInputMethodId)) {
289afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mLastTickedInputMethodId = null;
290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
291afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference instanceof PreferenceScreen) {
292e7739d1ab51cfe5998e897d7d0d8e97ae54eecfaAmith Yamasani            if (KEY_INPUT_METHOD.equals(preference.getKey())) {
293e7739d1ab51cfe5998e897d7d0d8e97ae54eecfaAmith Yamasani                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
294e7739d1ab51cfe5998e897d7d0d8e97ae54eecfaAmith Yamasani                imm.showInputMethodPicker();
295e7739d1ab51cfe5998e897d7d0d8e97ae54eecfaAmith Yamasani            } else if (preference.getIntent() == null) {
296afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                PreferenceScreen pref = (PreferenceScreen) preference;
297afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                String activityName = pref.getKey();
298afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                String packageName = activityName.substring(0, activityName
299afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                        .lastIndexOf("."));
300e086d9ad6118d2a7a3132305c2e7d719cd6fe030Amith Yamasani                int slash = activityName.indexOf("/");
301e086d9ad6118d2a7a3132305c2e7d719cd6fe030Amith Yamasani                if (slash > 0) {
302e086d9ad6118d2a7a3132305c2e7d719cd6fe030Amith Yamasani                    packageName = activityName.substring(0, slash);
303e086d9ad6118d2a7a3132305c2e7d719cd6fe030Amith Yamasani                    activityName = activityName.substring(slash + 1);
304e086d9ad6118d2a7a3132305c2e7d719cd6fe030Amith Yamasani                }
305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                if (activityName.length() > 0) {
306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    Intent i = new Intent(Intent.ACTION_MAIN);
307afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    i.setClassName(packageName, activityName);
308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    startActivity(i);
309afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
311afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
312afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return super.onPreferenceTreeClick(preferenceScreen, preference);
313afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
314afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
31520108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai    @Override
316d79934731c8d33f6fc63b21c120b9ffba5d06f54Amith Yamasani    public void onDestroy() {
31720108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai        super.onDestroy();
31820108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai        if (mDialog != null) {
31920108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai            mDialog.dismiss();
32020108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai            mDialog = null;
32120108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai        }
32220108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai    }
32320108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai
324afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
325