InputMethodAndLanguageSettings.java revision 20108e2ed6d7fdc889d85702f7cbda906db141cf
1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/* 2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License. 6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at 7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and 14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License. 15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings; 18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 19e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Projectimport android.app.AlertDialog; 20e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Projectimport android.app.Dialog; 21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 22e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Projectimport android.content.DialogInterface; 23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 24e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Projectimport android.content.pm.ApplicationInfo; 25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.res.Configuration; 26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 2780a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Projectimport android.os.Environment; 28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.SystemProperties; 29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.CheckBoxPreference; 30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference; 31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceActivity; 32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceGroup; 33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceScreen; 34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings; 35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.TextUtils; 36e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Projectimport android.view.View.OnClickListener; 37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.inputmethod.InputMethodInfo; 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.inputmethod.InputMethodManager; 39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 4086997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Projectimport java.util.ArrayList; 41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.HashSet; 42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List; 43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpublic class LanguageSettings extends PreferenceActivity { 45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 460f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani private static final String KEY_PHONE_LANGUAGE = "phone_language"; 4786997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project private boolean mHaveHardKeyboard; 4886997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project 49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private List<InputMethodInfo> mInputMethodProperties; 5086997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project private List<CheckBoxPreference> mCheckboxes; 510f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani private Preference mLanguagePref; 52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final TextUtils.SimpleStringSplitter mStringColonSplitter 54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project = new TextUtils.SimpleStringSplitter(':'); 55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String mLastInputMethodId; 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String mLastTickedInputMethodId; 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 66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project protected 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 71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (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 110afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project CharSequence label = property.loadLabel(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)) { 11586997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project CheckBoxPreference chkbxPref = new CheckBoxPreference(this); 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()) { 124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project PreferenceScreen prefScreen = new PreferenceScreen(this, 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) { 13286997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project prefScreen.setSummary(getString(R.string.onscreen_keyboard_settings_summary)); 13386997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project } else { 13486997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project CharSequence settingsLabel = getResources().getString( 13586997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project R.string.input_methods_settings_label_format, label); 13686997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project prefScreen.setSummary(settingsLabel); 13786997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project } 138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project textCategory.addPreference(prefScreen); 139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 14280a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project 143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project protected void onResume() { 145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onResume(); 146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final HashSet<String> enabled = new HashSet<String>(); 148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String enabledStr = Settings.Secure.getString(getContentResolver(), 149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Settings.Secure.ENABLED_INPUT_METHODS); 150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (enabledStr != null) { 151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final TextUtils.SimpleStringSplitter splitter = mStringColonSplitter; 152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project splitter.setString(enabledStr); 153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project while (splitter.hasNext()) { 154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project enabled.add(splitter.next()); 155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Update the statuses of the Check Boxes. 159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int N = mInputMethodProperties.size(); 160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project for (int i = 0; i < N; ++i) { 161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final String id = mInputMethodProperties.get(i).getId(); 162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project CheckBoxPreference pref = (CheckBoxPreference) findPreference(mInputMethodProperties 163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .get(i).getId()); 16486997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project if (pref != null) { 16586997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project pref.setChecked(enabled.contains(id)); 16686997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project } 167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mLastTickedInputMethodId = null; 1690f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani 1700f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani if (mLanguagePref != null) { 1710f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani Configuration conf = getResources().getConfiguration(); 1720f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani String locale = conf.locale.getDisplayName(conf.locale); 1730f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani if (locale != null && locale.length() > 1) { 1740f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani locale = Character.toUpperCase(locale.charAt(0)) + locale.substring(1); 1750f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani mLanguagePref.setSummary(locale); 1760f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani } 1770f2e6dec7c8dc136783eacb5b62c9d3248c4845aAmith Yamasani } 178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project protected void onPause() { 182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onPause(); 183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project StringBuilder builder = new StringBuilder(256); 185305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani StringBuilder disabledSysImes = new StringBuilder(256); 186305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani 187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int firstEnabled = -1; 188afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int N = mInputMethodProperties.size(); 189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project for (int i = 0; i < N; ++i) { 19080a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project final InputMethodInfo property = mInputMethodProperties.get(i); 19180a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project final String id = property.getId(); 192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project CheckBoxPreference pref = (CheckBoxPreference) findPreference(id); 193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project boolean hasIt = id.equals(mLastInputMethodId); 19480a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project boolean systemIme = isSystemIme(property); 19580a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project if (((N == 1 || systemIme) && !mHaveHardKeyboard) 19680a7a1dbf22d689723d39bad9ba319b6f4b0201dThe Android Open Source Project || (pref != null && pref.isChecked())) { 197afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (builder.length() > 0) builder.append(':'); 198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project builder.append(id); 199afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (firstEnabled < 0) { 200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project firstEnabled = i; 201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (hasIt) { 203afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mLastInputMethodId = mLastTickedInputMethodId; 204afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 205305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani // If it's a disabled system ime, add it to the disabled list so that it 206305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani // doesn't get enabled automatically on any changes to the package list 207305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani if (pref != null && !pref.isChecked() && systemIme && mHaveHardKeyboard) { 208305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani if (disabledSysImes.length() > 0) disabledSysImes.append(":"); 209305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani disabledSysImes.append(id); 210305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani } 211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 212afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // If the last input method is unset, set it as the first enabled one. 214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (null == mLastInputMethodId || "".equals(mLastInputMethodId)) { 215afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (firstEnabled >= 0) { 216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mLastInputMethodId = mInputMethodProperties.get(firstEnabled).getId(); 217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 218afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mLastInputMethodId = null; 219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 220afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 221afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 222afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Settings.Secure.putString(getContentResolver(), 223afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Settings.Secure.ENABLED_INPUT_METHODS, builder.toString()); 224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Settings.Secure.putString(getContentResolver(), 225305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani Settings.Secure.DISABLED_SYSTEM_INPUT_METHODS, disabledSysImes.toString()); 226305b0fb47c16f5ded987a9fcd7a9aa22fc70c2ebAmith Yamasani Settings.Secure.putString(getContentResolver(), 227e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project Settings.Secure.DEFAULT_INPUT_METHOD, 228e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project mLastInputMethodId != null ? mLastInputMethodId : ""); 229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 23186997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project @Override 23286997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 23386997beac8ccd3d9e1deedb4a7afe6ddeb3a0bd7The Android Open Source Project 234afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Input Method stuff 235a718832e28095219a897c6e95e903c1a3fe57c12Ying Wang if (Utils.isMonkeyRunning()) { 236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return false; 237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 238afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (preference instanceof CheckBoxPreference) { 240e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project final CheckBoxPreference chkPref = (CheckBoxPreference) preference; 241e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project final String id = getInputMethodIdFromKey(chkPref.getKey()); 242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (chkPref.isChecked()) { 243e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project InputMethodInfo selImi = null; 244e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project final int N = mInputMethodProperties.size(); 245e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project for (int i=0; i<N; i++) { 246e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project InputMethodInfo imi = mInputMethodProperties.get(i); 247e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project if (id.equals(imi.getId())) { 248e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project selImi = imi; 249e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project if (isSystemIme(imi)) { 250e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project // This is a built-in IME, so no need to warn. 251e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project mLastTickedInputMethodId = id; 252e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project return super.onPreferenceTreeClick(preferenceScreen, preference); 253e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project } 254e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project } 255e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project } 256e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project chkPref.setChecked(false); 257e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project if (selImi == null) { 258e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project return super.onPreferenceTreeClick(preferenceScreen, preference); 259e6dd1fa1851302710ac7845d25d8ad8a5b6ee438The Android Open Source Project } 26020108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai if (mDialog == null) { 26120108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai mDialog = (new AlertDialog.Builder(this)) 26220108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai .setTitle(android.R.string.dialog_alert_title) 26320108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai .setIcon(android.R.drawable.ic_dialog_alert) 26420108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai .setCancelable(true) 26520108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai .setPositiveButton(android.R.string.ok, 26620108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai new DialogInterface.OnClickListener() { 26720108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai public void onClick(DialogInterface dialog, int which) { 26820108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai chkPref.setChecked(true); 26920108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai mLastTickedInputMethodId = id; 27020108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai } 27120108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai 27220108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai }) 27320108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai .setNegativeButton(android.R.string.cancel, 27420108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai new DialogInterface.OnClickListener() { 27520108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai public void onClick(DialogInterface dialog, int which) { 27620108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai } 27720108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai 27820108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai }) 27920108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai .create(); 28020108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai } else { 28120108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai if (mDialog.isShowing()) { 28220108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai mDialog.dismiss(); 28320108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai } 28420108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai } 28520108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai mDialog.setMessage(getString(R.string.ime_security_warning, 28620108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai selImi.getServiceInfo().applicationInfo.loadLabel( 28720108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai getPackageManager()))); 28820108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai mDialog.show(); 289afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (id.equals(mLastTickedInputMethodId)) { 290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mLastTickedInputMethodId = null; 291afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 292afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (preference instanceof PreferenceScreen) { 293afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (preference.getIntent() == null) { 294afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project PreferenceScreen pref = (PreferenceScreen) preference; 295afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String activityName = pref.getKey(); 296afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String packageName = activityName.substring(0, activityName 297afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .lastIndexOf(".")); 298e086d9ad6118d2a7a3132305c2e7d719cd6fe030Amith Yamasani int slash = activityName.indexOf("/"); 299e086d9ad6118d2a7a3132305c2e7d719cd6fe030Amith Yamasani if (slash > 0) { 300e086d9ad6118d2a7a3132305c2e7d719cd6fe030Amith Yamasani packageName = activityName.substring(0, slash); 301e086d9ad6118d2a7a3132305c2e7d719cd6fe030Amith Yamasani activityName = activityName.substring(slash + 1); 302e086d9ad6118d2a7a3132305c2e7d719cd6fe030Amith Yamasani } 303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (activityName.length() > 0) { 304afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Intent i = new Intent(Intent.ACTION_MAIN); 305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project i.setClassName(packageName, activityName); 306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project startActivity(i); 307afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 309afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return super.onPreferenceTreeClick(preferenceScreen, preference); 311afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 312afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 31320108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai @Override 31420108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai protected void onDestroy() { 31520108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai super.onDestroy(); 31620108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai if (mDialog != null) { 31720108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai mDialog.dismiss(); 31820108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai mDialog = null; 31920108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai } 32020108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai } 32120108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai 322afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 323