Merge "Refactor ime settings"
diff --git a/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnabler.java b/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnabler.java
index f3addf3..6ceb55e 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnabler.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnabler.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.inputmethod;
 
+import com.android.internal.inputmethod.InputMethodUtils;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 
@@ -145,7 +146,7 @@
                     InputMethodInfo imi = mInputMethodProperties.get(i);
                     if (id.equals(imi.getId())) {
                         selImi = imi;
-                        if (InputMethodAndSubtypeUtil.isSystemIme(imi)) {
+                        if (InputMethodUtils.isSystemIme(imi)) {
                             InputMethodAndSubtypeUtil.setSubtypesPreferenceEnabled(
                                     this, mInputMethodProperties, id, true);
                             // This is a built-in IME, so no need to warn.
diff --git a/src/com/android/settings/inputmethod/InputMethodAndSubtypeUtil.java b/src/com/android/settings/inputmethod/InputMethodAndSubtypeUtil.java
index 918b87e..936b1a6 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndSubtypeUtil.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndSubtypeUtil.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.inputmethod;
 
+import com.android.internal.inputmethod.InputMethodUtils;
 import com.android.settings.SettingsPreferenceFragment;
 
 import android.content.ContentResolver;
@@ -176,8 +177,9 @@
                     ((CheckBoxPreference) pref).isChecked()
                     : enabledIMEAndSubtypesMap.containsKey(imiId);
             final boolean isCurrentInputMethod = imiId.equals(currentInputMethodId);
-            final boolean systemIme = isSystemIme(imi);
-            if ((!hasHardKeyboard && isAlwaysCheckedIme(imi, context.getActivity(), imiCount))
+            final boolean systemIme = InputMethodUtils.isSystemIme(imi);
+            if ((!hasHardKeyboard && InputMethodSettingValuesWrapper.getInstance(
+                    context.getActivity()).isAlwaysCheckedIme(imi, context.getActivity()))
                     || isImeChecked) {
                 if (!enabledIMEAndSubtypesMap.containsKey(imiId)) {
                     // imiId has just been enabled
@@ -345,56 +347,4 @@
             }
         }
     }
-
-    public static boolean isSystemIme(InputMethodInfo property) {
-        return (property.getServiceInfo().applicationInfo.flags
-                & ApplicationInfo.FLAG_SYSTEM) != 0;
-    }
-
-    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 56b6e67..e85b3fc 100644
--- a/src/com/android/settings/inputmethod/InputMethodPreference.java
+++ b/src/com/android/settings/inputmethod/InputMethodPreference.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.inputmethod;
 
+import com.android.internal.inputmethod.InputMethodUtils;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
@@ -44,7 +45,6 @@
 import android.widget.Toast;
 
 import java.text.Collator;
-import java.util.Comparator;
 import java.util.List;
 
 public class InputMethodPreference extends CheckBoxPreference {
@@ -91,9 +91,10 @@
         mImm = imm;
         mImi = imi;
         updateSummary();
-        mAlwaysChecked = InputMethodAndSubtypeUtil.isAlwaysCheckedIme(
-                imi, fragment.getActivity(), imiCount);
-        mIsSystemIme = InputMethodAndSubtypeUtil.isSystemIme(imi);
+        mAlwaysChecked = InputMethodSettingValuesWrapper.getInstance(
+                fragment.getActivity()).isAlwaysCheckedIme(
+                        imi, fragment.getActivity());
+        mIsSystemIme = InputMethodUtils.isSystemIme(imi);
         if (mAlwaysChecked) {
             setEnabled(false);
         }
diff --git a/src/com/android/settings/inputmethod/InputMethodSettingValuesWrapper.java b/src/com/android/settings/inputmethod/InputMethodSettingValuesWrapper.java
index 9575f72..b14f041 100644
--- a/src/com/android/settings/inputmethod/InputMethodSettingValuesWrapper.java
+++ b/src/com/android/settings/inputmethod/InputMethodSettingValuesWrapper.java
@@ -31,6 +31,7 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Locale;
 
 /**
  * This class is a wrapper for InputMethodSettings. You need to refresh internal states
@@ -39,6 +40,8 @@
  */
 public class InputMethodSettingValuesWrapper {
     private static final String TAG = InputMethodSettingValuesWrapper.class.getSimpleName();
+    private static final Locale ENGLISH_LOCALE = new Locale("en");
+
     private static volatile InputMethodSettingValuesWrapper sInstance;
     private final ArrayList<InputMethodInfo> mMethodList = new ArrayList<InputMethodInfo>();
     private final HashMap<String, InputMethodInfo> mMethodMap =
@@ -104,4 +107,26 @@
             return InputMethodUtils.getImeAndSubtypeDisplayName(context, imi, subtype);
         }
     }
+
+    public boolean isAlwaysCheckedIme(InputMethodInfo imi, Context context) {
+        if (getInputMethodList().size() <= 1) {
+            return true;
+        }
+        if (!InputMethodUtils.isSystemIme(imi)) {
+            return false;
+        }
+        return isValidSystemNonAuxAsciiCapableIme(imi, context);
+    }
+
+    private static boolean isValidSystemNonAuxAsciiCapableIme(
+            InputMethodInfo imi, Context context) {
+        if (imi.isAuxiliaryIme()) {
+            return false;
+        }
+        if (InputMethodUtils.isValidSystemDefaultIme(true /* isSystemReady */, imi, context)) {
+            return true;
+        }
+        return InputMethodUtils.containsSubtypeOf(
+                imi, ENGLISH_LOCALE.getLanguage(), null /* mode */);
+    }
 }