Remove InputMethodAndSubtypeEnabler and call intent of Settings.ACTION_INPUT_METHOD_AND_SUBTYPE_ENABLER
Change-Id: I467cfba9644ec266f6a98f7aec0886ad205fef4f
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 @@
"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.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 @@
}
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);
}