Set additional subtypes before getting current subtype

Bug: 7594188
Change-Id: I1977acb7189f8eb186b9b20a3e5b64b4aaabf191
diff --git a/java/src/com/android/inputmethod/latin/AdditionalSubtypeSettings.java b/java/src/com/android/inputmethod/latin/AdditionalSubtypeSettings.java
index 96c08b3..08f08d2 100644
--- a/java/src/com/android/inputmethod/latin/AdditionalSubtypeSettings.java
+++ b/java/src/com/android/inputmethod/latin/AdditionalSubtypeSettings.java
@@ -386,12 +386,11 @@
     public void onCreate(final Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        RichInputMethodManager.init(getActivity());
+        mPrefs = getPreferenceManager().getSharedPreferences();
+        RichInputMethodManager.init(getActivity(), mPrefs);
         mRichImm = RichInputMethodManager.getInstance();
         addPreferencesFromResource(R.xml.additional_subtype_settings);
         setHasOptionsMenu(true);
-
-        mPrefs = getPreferenceManager().getSharedPreferences();
     }
 
     @Override
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index dc3ad4f..0b49659 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -403,33 +403,28 @@
 
     @Override
     public void onCreate() {
-        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
-        mPrefs = prefs;
-        LatinImeLogger.init(this, prefs);
+        mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
+        mResources = getResources();
+
+        LatinImeLogger.init(this, mPrefs);
         if (ProductionFlag.IS_EXPERIMENTAL) {
-            ResearchLogger.getInstance().init(this, prefs);
+            ResearchLogger.getInstance().init(this, mPrefs);
         }
-        RichInputMethodManager.init(this);
+        RichInputMethodManager.init(this, mPrefs);
+        mRichImm = RichInputMethodManager.getInstance();
         SubtypeSwitcher.init(this);
-        KeyboardSwitcher.init(this, prefs);
+        KeyboardSwitcher.init(this, mPrefs);
         AccessibilityUtils.init(this);
 
         super.onCreate();
 
-        mRichImm = RichInputMethodManager.getInstance();
         mHandler.onCreate();
         DEBUG = LatinImeLogger.sDBG;
 
-        final Resources res = getResources();
-        mResources = res;
-
         loadSettings();
-
-        mRichImm.setAdditionalInputMethodSubtypes(mCurrentSettings.getAdditionalSubtypes());
-
         initSuggest();
 
-        mDisplayOrientation = res.getConfiguration().orientation;
+        mDisplayOrientation = mResources.getConfiguration().orientation;
 
         // Register to receive ringer mode change and network state change.
         // Also receive installation and removal of a dictionary pack.
diff --git a/java/src/com/android/inputmethod/latin/RichInputMethodManager.java b/java/src/com/android/inputmethod/latin/RichInputMethodManager.java
index 63dfd32..af0d61c 100644
--- a/java/src/com/android/inputmethod/latin/RichInputMethodManager.java
+++ b/java/src/com/android/inputmethod/latin/RichInputMethodManager.java
@@ -19,6 +19,7 @@
 import static com.android.inputmethod.latin.Constants.Subtype.KEYBOARD_MODE;
 
 import android.content.Context;
+import android.content.SharedPreferences;
 import android.os.IBinder;
 import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodManager;
@@ -49,19 +50,34 @@
         return sInstance;
     }
 
-    public static void init(final Context context) {
-        sInstance.initInternal(context);
+    public static void init(final Context context, final SharedPreferences prefs) {
+        sInstance.initInternal(context, prefs);
+    }
+
+    private boolean isInitialized() {
+        return mImmWrapper != null;
     }
 
     private void checkInitialized() {
-        if (mImmWrapper == null) {
+        if (!isInitialized()) {
             throw new RuntimeException(TAG + " is used before initialization");
         }
     }
 
-    private void initInternal(final Context context) {
+    private void initInternal(final Context context, final SharedPreferences prefs) {
+        if (isInitialized()) {
+            return;
+        }
         mImmWrapper = new InputMethodManagerCompatWrapper(context);
         mInputMethodInfoOfThisIme = getInputMethodInfoOfThisIme(context);
+
+        // Initialize additional subtypes.
+        SubtypeLocale.init(context);
+        final String prefAdditionalSubtypes = SettingsValues.getPrefAdditionalSubtypes(
+                prefs, context.getResources());
+        final InputMethodSubtype[] additionalSubtypes =
+                AdditionalSubtype.createAdditionalSubtypesArray(prefAdditionalSubtypes);
+        setAdditionalInputMethodSubtypes(additionalSubtypes);
     }
 
     public InputMethodManager getInputMethodManager() {
diff --git a/java/src/com/android/inputmethod/latin/SettingsValues.java b/java/src/com/android/inputmethod/latin/SettingsValues.java
index d6daa0d..8de64c1 100644
--- a/java/src/com/android/inputmethod/latin/SettingsValues.java
+++ b/java/src/com/android/inputmethod/latin/SettingsValues.java
@@ -22,7 +22,6 @@
 import android.content.res.Resources;
 import android.util.Log;
 import android.view.inputmethod.EditorInfo;
-import android.view.inputmethod.InputMethodSubtype;
 
 import com.android.inputmethod.keyboard.internal.KeySpecParser;
 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
@@ -82,7 +81,6 @@
     private final int mVibrationDurationSettingsRawValue;
     @SuppressWarnings("unused") // TODO: Use this
     private final float mKeypressSoundVolumeRawValue;
-    private final InputMethodSubtype[] mAdditionalSubtypes;
     public final boolean mGestureInputEnabled;
     public final boolean mGesturePreviewTrailEnabled;
     public final boolean mGestureFloatingPreviewTextEnabled;
@@ -170,8 +168,6 @@
                 mAutoCorrectionThresholdRawValue);
         mVoiceKeyEnabled = mVoiceMode != null && !mVoiceMode.equals(voiceModeOff);
         mVoiceKeyOnMain = mVoiceMode != null && mVoiceMode.equals(voiceModeMain);
-        mAdditionalSubtypes = AdditionalSubtype.createAdditionalSubtypesArray(
-                getPrefAdditionalSubtypes(prefs, res));
         final boolean gestureInputEnabledByBuildConfig = res.getBoolean(
                 R.bool.config_gesture_input_enabled_by_build_config);
         mGestureInputEnabled = gestureInputEnabledByBuildConfig
@@ -375,10 +371,6 @@
         return res.getBoolean(R.bool.config_use_fullscreen_mode);
     }
 
-    public InputMethodSubtype[] getAdditionalSubtypes() {
-        return mAdditionalSubtypes;
-    }
-
     public static String getPrefAdditionalSubtypes(final SharedPreferences prefs,
             final Resources res) {
         final String predefinedPrefSubtypes = AdditionalSubtype.createPrefSubtypes(
diff --git a/tests/src/com/android/inputmethod/keyboard/SpacebarTextTests.java b/tests/src/com/android/inputmethod/keyboard/SpacebarTextTests.java
index 015c271..de323b0 100644
--- a/tests/src/com/android/inputmethod/keyboard/SpacebarTextTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/SpacebarTextTests.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.content.res.Resources;
+import android.preference.PreferenceManager;
 import android.test.AndroidTestCase;
 import android.view.inputmethod.InputMethodSubtype;
 
@@ -41,7 +42,8 @@
     protected void setUp() throws Exception {
         super.setUp();
         final Context context = getContext();
-        RichInputMethodManager.init(context);
+        RichInputMethodManager.init(
+                context, PreferenceManager.getDefaultSharedPreferences(context));
         mRichImm = RichInputMethodManager.getInstance();
         mRes = context.getResources();
         SubtypeLocale.init(context);
diff --git a/tests/src/com/android/inputmethod/latin/SubtypeLocaleTests.java b/tests/src/com/android/inputmethod/latin/SubtypeLocaleTests.java
index 4e81de6..0f6fb73 100644
--- a/tests/src/com/android/inputmethod/latin/SubtypeLocaleTests.java
+++ b/tests/src/com/android/inputmethod/latin/SubtypeLocaleTests.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.content.res.Resources;
+import android.preference.PreferenceManager;
 import android.test.AndroidTestCase;
 import android.view.inputmethod.InputMethodSubtype;
 
@@ -37,7 +38,8 @@
     protected void setUp() throws Exception {
         super.setUp();
         final Context context = getContext();
-        RichInputMethodManager.init(context);
+        RichInputMethodManager.init(
+                context, PreferenceManager.getDefaultSharedPreferences(context));
         mRichImm = RichInputMethodManager.getInstance();
         mRes = context.getResources();
         SubtypeLocale.init(context);