diff options
| -rw-r--r-- | api/current.xml | 11 | ||||
| -rw-r--r-- | core/java/android/provider/Settings.java | 14 | ||||
| -rw-r--r-- | core/java/com/android/internal/view/InputMethodAndSubtypeEnabler.java | 319 | ||||
| -rw-r--r-- | core/res/AndroidManifest.xml | 5 | ||||
| -rwxr-xr-x | core/res/res/values/strings.xml | 5 | ||||
| -rw-r--r-- | services/java/com/android/server/InputMethodManagerService.java | 7 |
6 files changed, 28 insertions, 333 deletions
diff --git a/api/current.xml b/api/current.xml index bac65eb..ef3289d 100644 --- a/api/current.xml +++ b/api/current.xml @@ -158702,6 +158702,17 @@ visibility="public" > </field> +<field name="ACTION_INPUT_METHOD_AND_SUBTYPE_ENABLER" + type="java.lang.String" + transient="false" + volatile="false" + value=""android.settings.INPUT_METHOD_AND_SUBTYPE_ENABLER"" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="ACTION_INPUT_METHOD_SETTINGS" type="java.lang.String" transient="false" diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 62d2ff2..2b79037 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -279,6 +279,20 @@ public final class Settings { "android.settings.INPUT_METHOD_SETTINGS"; /** + * Activity Action: Show enabler activity to enable/disable input methods and subtypes. + * <p> + * In some cases, a matching Activity may not exist, so ensure you + * safeguard against this. + * <p> + * Input: Nothing. + * <p> + * Output: Nothing. + */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) + public static final String ACTION_INPUT_METHOD_AND_SUBTYPE_ENABLER = + "android.settings.INPUT_METHOD_AND_SUBTYPE_ENABLER"; + + /** * Activity Action: Show settings to manage the user input dictionary. * <p> * In some cases, a matching Activity may not exist, so ensure you diff --git a/core/java/com/android/internal/view/InputMethodAndSubtypeEnabler.java b/core/java/com/android/internal/view/InputMethodAndSubtypeEnabler.java deleted file mode 100644 index 200d49f..0000000 --- a/core/java/com/android/internal/view/InputMethodAndSubtypeEnabler.java +++ /dev/null @@ -1,319 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.view; - -import android.app.AlertDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; -import android.content.res.Configuration; -import android.os.Bundle; -import android.preference.CheckBoxPreference; -import android.preference.Preference; -import android.preference.PreferenceActivity; -import android.preference.PreferenceCategory; -import android.preference.PreferenceScreen; -import android.provider.Settings; -import android.text.TextUtils; -import android.view.inputmethod.InputMethodInfo; -import android.view.inputmethod.InputMethodManager; -import android.view.inputmethod.InputMethodSubtype; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; - -public class InputMethodAndSubtypeEnabler extends PreferenceActivity { - - private boolean mHaveHardKeyboard; - - private List<InputMethodInfo> mInputMethodProperties; - - private final TextUtils.SimpleStringSplitter mStringColonSplitter - = new TextUtils.SimpleStringSplitter(':'); - - private String mLastInputMethodId; - private String mLastTickedInputMethodId; - - private AlertDialog mDialog = null; - - @Override - protected void onCreate(Bundle icicle) { - super.onCreate(icicle); - Configuration config = getResources().getConfiguration(); - mHaveHardKeyboard = (config.keyboard == Configuration.KEYBOARD_QWERTY); - onCreateIMM(); - setPreferenceScreen(createPreferenceHierarchy()); - } - - @Override - protected void onResume() { - super.onResume(); - loadInputMethodSubtypeList(); - } - - @Override - protected void onPause() { - super.onPause(); - saveInputMethodSubtypeList(); - } - - @Override - public boolean onPreferenceTreeClick( - PreferenceScreen preferenceScreen, Preference preference) { - - if (preference instanceof CheckBoxPreference) { - final CheckBoxPreference chkPref = (CheckBoxPreference) preference; - final String id = chkPref.getKey(); - // TODO: Check subtype or not here - if (chkPref.isChecked()) { - InputMethodInfo selImi = null; - final int N = mInputMethodProperties.size(); - for (int i = 0; i < N; i++) { - InputMethodInfo imi = mInputMethodProperties.get(i); - if (id.equals(imi.getId())) { - selImi = imi; - if (isSystemIme(imi)) { - setSubtypesPreferenceEnabled(id, true); - // This is a built-in IME, so no need to warn. - mLastTickedInputMethodId = id; - return super.onPreferenceTreeClick(preferenceScreen, preference); - } - break; - } - } - if (selImi == null) { - return super.onPreferenceTreeClick(preferenceScreen, preference); - } - chkPref.setChecked(false); - if (mDialog == null) { - mDialog = (new AlertDialog.Builder(this)) - .setTitle(android.R.string.dialog_alert_title) - .setIcon(android.R.drawable.ic_dialog_alert) - .setCancelable(true) - .setPositiveButton(android.R.string.ok, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - chkPref.setChecked(true); - setSubtypesPreferenceEnabled(id, true); - mLastTickedInputMethodId = id; - } - - }) - .setNegativeButton(android.R.string.cancel, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - } - - }) - .create(); - } else { - if (mDialog.isShowing()) { - mDialog.dismiss(); - } - } - mDialog.setMessage(getResources().getString( - com.android.internal.R.string.ime_enabler_security_warning, - selImi.getServiceInfo().applicationInfo.loadLabel(getPackageManager()))); - mDialog.show(); - } else { - if (id.equals(mLastTickedInputMethodId)) { - mLastTickedInputMethodId = null; - } - setSubtypesPreferenceEnabled(id, false); - } - } - return super.onPreferenceTreeClick(preferenceScreen, preference); - } - - @Override - public void onDestroy() { - super.onDestroy(); - if (mDialog != null) { - mDialog.dismiss(); - mDialog = null; - } - } - - private void onCreateIMM() { - InputMethodManager imm = (InputMethodManager) getSystemService( - Context.INPUT_METHOD_SERVICE); - - // TODO: Change mInputMethodProperties to Map - mInputMethodProperties = imm.getInputMethodList(); - - mLastInputMethodId = Settings.Secure.getString(getContentResolver(), - Settings.Secure.DEFAULT_INPUT_METHOD); - } - - private PreferenceScreen createPreferenceHierarchy() { - // Root - PreferenceScreen root = getPreferenceManager().createPreferenceScreen(this); - - int N = (mInputMethodProperties == null ? 0 : mInputMethodProperties.size()); - // TODO: Use iterator. - for (int i = 0; i < N; ++i) { - PreferenceCategory keyboardSettingsCategory = new PreferenceCategory(this); - root.addPreference(keyboardSettingsCategory); - InputMethodInfo property = mInputMethodProperties.get(i); - String prefKey = property.getId(); - - PackageManager pm = getPackageManager(); - CharSequence label = property.loadLabel(pm); - boolean systemIME = isSystemIme(property); - - keyboardSettingsCategory.setTitle(label); - - // Add a check box. - // Don't show the toggle if it's the only keyboard in the system, or it's a system IME. - if (mHaveHardKeyboard || (N > 1 && !systemIME)) { - CheckBoxPreference chkbxPref = new CheckBoxPreference(this); - chkbxPref.setKey(prefKey); - chkbxPref.setTitle(label); - keyboardSettingsCategory.addPreference(chkbxPref); - } - - ArrayList<InputMethodSubtype> subtypes = property.getSubtypes(); - if (subtypes.size() > 0) { - PreferenceCategory subtypesCategory = new PreferenceCategory(this); - subtypesCategory.setTitle(getResources().getString( - com.android.internal.R.string.ime_enabler_subtype_title, label)); - root.addPreference(subtypesCategory); - for (InputMethodSubtype subtype: subtypes) { - CharSequence subtypeLabel; - int nameResId = subtype.getNameResId(); - if (nameResId != 0) { - subtypeLabel = pm.getText(property.getPackageName(), nameResId, - property.getServiceInfo().applicationInfo); - } else { - int modeResId = subtype.getModeResId(); - CharSequence language = subtype.getLocale(); - CharSequence mode = modeResId == 0 ? null - : pm.getText(property.getPackageName(), modeResId, - property.getServiceInfo().applicationInfo); - // TODO: Use more friendly Title and UI - subtypeLabel = (mode == null ? "" : mode) + "," - + (language == null ? "" : language); - } - CheckBoxPreference chkbxPref = new CheckBoxPreference(this); - chkbxPref.setKey(prefKey + subtype.hashCode()); - chkbxPref.setTitle(subtypeLabel); - chkbxPref.setSummary(label); - subtypesCategory.addPreference(chkbxPref); - } - } - } - return root; - } - - private void loadInputMethodSubtypeList() { - final HashSet<String> enabled = new HashSet<String>(); - String enabledStr = Settings.Secure.getString(getContentResolver(), - Settings.Secure.ENABLED_INPUT_METHODS); - if (enabledStr != null) { - final TextUtils.SimpleStringSplitter splitter = mStringColonSplitter; - splitter.setString(enabledStr); - while (splitter.hasNext()) { - enabled.add(splitter.next()); - } - } - - // Update the statuses of the Check Boxes. - int N = mInputMethodProperties.size(); - // TODO: Use iterator. - for (int i = 0; i < N; ++i) { - final String id = mInputMethodProperties.get(i).getId(); - CheckBoxPreference pref = (CheckBoxPreference) findPreference( - mInputMethodProperties.get(i).getId()); - if (pref != null) { - boolean isEnabled = enabled.contains(id); - pref.setChecked(isEnabled); - setSubtypesPreferenceEnabled(id, isEnabled); - } - } - mLastTickedInputMethodId = null; - } - - private void saveInputMethodSubtypeList() { - StringBuilder builder = new StringBuilder(); - StringBuilder disabledSysImes = new StringBuilder(); - - int firstEnabled = -1; - int N = mInputMethodProperties.size(); - for (int i = 0; i < N; ++i) { - final InputMethodInfo property = mInputMethodProperties.get(i); - final String id = property.getId(); - CheckBoxPreference pref = (CheckBoxPreference) findPreference(id); - boolean currentInputMethod = id.equals(mLastInputMethodId); - boolean systemIme = isSystemIme(property); - // TODO: Append subtypes by using the separator ";" - if (((N == 1 || systemIme) && !mHaveHardKeyboard) - || (pref != null && pref.isChecked())) { - if (builder.length() > 0) builder.append(':'); - builder.append(id); - if (firstEnabled < 0) { - firstEnabled = i; - } - } else if (currentInputMethod) { - mLastInputMethodId = mLastTickedInputMethodId; - } - // If it's a disabled system ime, add it to the disabled list so that it - // doesn't get enabled automatically on any changes to the package list - if (pref != null && !pref.isChecked() && systemIme && mHaveHardKeyboard) { - if (disabledSysImes.length() > 0) disabledSysImes.append(":"); - disabledSysImes.append(id); - } - } - - // If the last input method is unset, set it as the first enabled one. - if (TextUtils.isEmpty(mLastInputMethodId)) { - if (firstEnabled >= 0) { - mLastInputMethodId = mInputMethodProperties.get(firstEnabled).getId(); - } else { - mLastInputMethodId = null; - } - } - - Settings.Secure.putString(getContentResolver(), - Settings.Secure.ENABLED_INPUT_METHODS, builder.toString()); - Settings.Secure.putString(getContentResolver(), - Settings.Secure.DISABLED_SYSTEM_INPUT_METHODS, disabledSysImes.toString()); - Settings.Secure.putString(getContentResolver(), - Settings.Secure.DEFAULT_INPUT_METHOD, - mLastInputMethodId != null ? mLastInputMethodId : ""); - } - - private void setSubtypesPreferenceEnabled(String id, boolean enabled) { - PreferenceScreen preferenceScreen = getPreferenceScreen(); - final int N = mInputMethodProperties.size(); - // TODO: Use iterator. - for (int i = 0; i < N; i++) { - InputMethodInfo imi = mInputMethodProperties.get(i); - if (id.equals(imi.getId())) { - for (InputMethodSubtype subtype: imi.getSubtypes()) { - preferenceScreen.findPreference(id + subtype.hashCode()).setEnabled(enabled); - } - } - } - } - - private boolean isSystemIme(InputMethodInfo property) { - return (property.getServiceInfo().applicationInfo.flags - & ApplicationInfo.FLAG_SYSTEM) != 0; - } -} diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 122fdf8..22a80f5 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1352,11 +1352,6 @@ android:permission="android.permission.BIND_WALLPAPER"> </service> - <activity android:name="com.android.internal.view.InputMethodAndSubtypeEnabler" - android:excludeFromRecents="true" - android:exported="true"> - </activity> - <receiver android:name="com.android.server.BootReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 749b3c7..061fa4f 100755 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -2379,11 +2379,6 @@ <item quantity="other"><xliff:g id="index" example="2">%d</xliff:g> of <xliff:g id="total" example="137">%d</xliff:g></item> </plurals> - <!-- Warning message about security implications of enabling an input method, displayed as a dialog message when the user selects to enable an IME. --> - <string name="ime_enabler_security_warning">This input method may be able to collect all the text you type, including personal data like passwords and credit card numbers. It comes from the application <xliff:g id="ime_application_name">%1$s</xliff:g>. Use this input method?</string> - <!-- Label for selecting the input method to use --> - <string name="ime_enabler_subtype_title">Select inputmethods in <xliff:g id="ime_application_name">%1$s</xliff:g></string> - <!-- Label for the "Done" button on the far left of action mode toolbars. --> <string name="action_mode_done">Done</string> diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java index 70bde01..3f378e1 100644 --- a/services/java/com/android/server/InputMethodManagerService.java +++ b/services/java/com/android/server/InputMethodManagerService.java @@ -25,7 +25,6 @@ import com.android.internal.view.IInputMethodClient; import com.android.internal.view.IInputMethodManager; import com.android.internal.view.IInputMethodSession; import com.android.internal.view.InputBindResult; -import com.android.internal.view.InputMethodAndSubtypeEnabler; import com.android.server.StatusBarManagerService; @@ -1549,10 +1548,10 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } private void showInputMethodAndSubtypeEnabler() { - Intent intent = new Intent(); - intent.setClassName("android", InputMethodAndSubtypeEnabler.class.getCanonicalName()); + Intent intent = new Intent(Settings.ACTION_INPUT_METHOD_AND_SUBTYPE_ENABLER); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); + | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED + | Intent.FLAG_ACTIVITY_CLEAR_TOP); mContext.startActivity(intent); } |
