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