Merge "Always on the valid system default ime" into jb-dev
diff --git a/src/com/android/settings/inputmethod/InputMethodAndSubtypeUtil.java b/src/com/android/settings/inputmethod/InputMethodAndSubtypeUtil.java
index cb4058f..c7d8c89 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndSubtypeUtil.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndSubtypeUtil.java
@@ -22,6 +22,7 @@
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
+import android.content.res.Resources;
 import android.preference.CheckBoxPreference;
 import android.preference.Preference;
 import android.preference.PreferenceScreen;
@@ -36,6 +37,7 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 
 public class InputMethodAndSubtypeUtil {
@@ -46,6 +48,7 @@
     private static final char INPUT_METHOD_SEPARATER = ':';
     private static final char INPUT_METHOD_SUBTYPE_SEPARATER = ';';
     private static final int NOT_A_SUBTYPE_ID = -1;
+    private static final Locale ENGLISH_LOCALE = new Locale("en");
 
     private static final TextUtils.SimpleStringSplitter sStringInputMethodSplitter
             = new TextUtils.SimpleStringSplitter(INPUT_METHOD_SEPARATER);
@@ -183,7 +186,7 @@
                 getEnabledInputMethodsAndSubtypeList(resolver);
         HashSet<String> disabledSystemIMEs = getDisabledSystemIMEs(resolver);
 
-        final boolean onlyOneIME = inputMethodInfos.size() == 1;
+        final int imiCount = inputMethodInfos.size();
         boolean needsToResetSelectedSubtype = false;
         for (InputMethodInfo imi : inputMethodInfos) {
             final String imiId = imi.getId();
@@ -193,11 +196,11 @@
             // pref is instance of CheckBoxPreference in the Configure input method screen.
             final boolean isImeChecked = (pref instanceof CheckBoxPreference) ?
                     ((CheckBoxPreference) pref).isChecked()
-                            : enabledIMEAndSubtypesMap.containsKey(imiId);
+                    : enabledIMEAndSubtypesMap.containsKey(imiId);
             final boolean isCurrentInputMethod = imiId.equals(currentInputMethodId);
-            final boolean auxIme = isAuxiliaryIme(imi);
             final boolean systemIme = isSystemIme(imi);
-            if (((onlyOneIME || (systemIme && !auxIme)) && !hasHardKeyboard) || isImeChecked) {
+            if ((!hasHardKeyboard && isAlwaysCheckedIme(imi, context.getActivity(), imiCount))
+                    || isImeChecked) {
                 if (!enabledIMEAndSubtypesMap.containsKey(imiId)) {
                     // imiId has just been enabled
                     enabledIMEAndSubtypesMap.put(imiId, new HashSet<String>());
@@ -373,4 +376,47 @@
     public static boolean isAuxiliaryIme(InputMethodInfo imi) {
         return imi.isAuxiliaryIme();
     }
+
+    public static boolean isAlwaysCheckedIme(InputMethodInfo imi, Context context, int imiCount) {
+        if (imiCount <= 1) {
+            return true;
+        }
+        if (!isSystemIme(imi)) {
+            return false;
+        }
+        if (isAuxiliaryIme(imi)) {
+            return false;
+        }
+        if (isValidDefaultIme(imi, context)) {
+            return true;
+        }
+        return containsSubtypeOf(imi, ENGLISH_LOCALE.getLanguage());
+    }
+
+    private static boolean isValidDefaultIme(InputMethodInfo imi, Context context) {
+        if (imi.getIsDefaultResourceId() != 0) {
+            try {
+                Resources res = context.createPackageContext(
+                        imi.getPackageName(), 0).getResources();
+                if (res.getBoolean(imi.getIsDefaultResourceId())
+                        && containsSubtypeOf(imi, context.getResources().getConfiguration().
+                                locale.getLanguage())) {
+                    return true;
+                }
+            } catch (PackageManager.NameNotFoundException ex) {
+            } catch (Resources.NotFoundException ex) {
+            }
+        }
+        return false;
+    }
+
+    private static boolean containsSubtypeOf(InputMethodInfo imi, String language) {
+        final int N = imi.getSubtypeCount();
+        for (int i = 0; i < N; ++i) {
+            if (imi.getSubtypeAt(i).getLocale().startsWith(language)) {
+                return true;
+            }
+        }
+        return false;
+    }
 }
diff --git a/src/com/android/settings/inputmethod/InputMethodPreference.java b/src/com/android/settings/inputmethod/InputMethodPreference.java
index 4ecdb8e..90eef85 100644
--- a/src/com/android/settings/inputmethod/InputMethodPreference.java
+++ b/src/com/android/settings/inputmethod/InputMethodPreference.java
@@ -51,7 +51,7 @@
     private final InputMethodInfo mImi;
     private final InputMethodManager mImm;
     private final Intent mSettingsIntent;
-    private final boolean mIsSystemIme;
+    private final boolean mAlwaysChecked;
 
     private AlertDialog mDialog = null;
     private ImageView mInputMethodSettingsButton;
@@ -68,7 +68,7 @@
             if (isChecked()) {
                 setChecked(false);
             } else {
-                if (mIsSystemIme) {
+                if (mAlwaysChecked) {
                     setChecked(true);
                 } else {
                     showSecurityWarnDialog(mImi, InputMethodPreference.this);
@@ -87,9 +87,9 @@
         mImm = imm;
         mImi = imi;
         updateSummary();
-        mIsSystemIme = InputMethodAndSubtypeUtil.isSystemIme(imi);
-        final boolean isAuxIme = InputMethodAndSubtypeUtil.isAuxiliaryIme(imi);
-        if (imiCount <= 1 || (mIsSystemIme && !isAuxIme)) {
+        mAlwaysChecked = InputMethodAndSubtypeUtil.isAlwaysCheckedIme(
+                imi, fragment.getActivity(), imiCount);
+        if (mAlwaysChecked) {
             setEnabled(false);
         }
     }