Fix 2242164 Soft keyboard keeps getting enabled even if I disable it

On keyboardful devices, it is possible to disable the system soft input
method. Something changed in eclair that caused the ime to be re-enabled
on every package manager update (packages added/deleted).

Now keep track of disabled system imes in the settings db and search
in that list before enabling a system IME on package changes.

Every time the user goes to settings to enable/disable imes, the list
is re-created.

Any new system IMEs that may be added via an OTA will get enabled if
they have a different package name.
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index fc207ac..c4d11e7 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -2313,6 +2313,14 @@
         public static final String ENABLED_INPUT_METHODS = "enabled_input_methods";
 
         /**
+         * List of system input methods that are currently disabled.  This is a string
+         * containing the IDs of all disabled input methods, each ID separated
+         * by ':'.
+         * @hide
+         */
+        public static final String DISABLED_SYSTEM_INPUT_METHODS = "disabled_system_input_methods";
+
+        /**
          * Host name and port for a user-selected proxy.
          */
         public static final String HTTP_PROXY = "http_proxy";
diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java
index 1179500..0c205ca 100644
--- a/services/java/com/android/server/InputMethodManagerService.java
+++ b/services/java/com/android/server/InputMethodManagerService.java
@@ -46,6 +46,7 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
+import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.database.ContentObserver;
@@ -60,6 +61,7 @@
 import android.os.ServiceManager;
 import android.os.SystemClock;
 import android.provider.Settings;
+import android.provider.Settings.Secure;
 import android.text.TextUtils;
 import android.util.EventLog;
 import android.util.Slog;
@@ -1418,6 +1420,11 @@
         map.clear();
 
         PackageManager pm = mContext.getPackageManager();
+        final Configuration config = mContext.getResources().getConfiguration();
+        final boolean haveHardKeyboard = config.keyboard == Configuration.KEYBOARD_QWERTY;
+        String disabledSysImes = Settings.Secure.getString(mContext.getContentResolver(),
+                Secure.DISABLED_SYSTEM_INPUT_METHODS);
+        if (disabledSysImes == null) disabledSysImes = "";
 
         List<ResolveInfo> services = pm.queryIntentServices(
                 new Intent(InputMethod.SERVICE_INTERFACE),
@@ -1440,11 +1447,13 @@
             try {
                 InputMethodInfo p = new InputMethodInfo(mContext, ri);
                 list.add(p);
-                map.put(p.getId(), p);
+                final String id = p.getId();
+                map.put(id, p);
 
-                // System IMEs are enabled by default
-                if (isSystemIme(p)) {
-                    setInputMethodEnabledLocked(p.getId(), true);
+                // System IMEs are enabled by default, unless there's a hard keyboard
+                // and the system IME was explicitly disabled
+                if (isSystemIme(p) && (!haveHardKeyboard || disabledSysImes.indexOf(id) < 0)) {
+                    setInputMethodEnabledLocked(id, true);
                 }
 
                 if (DEBUG) {