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