Merge "Load the binary dictionary asynchronously."
diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index 8ae653f..c2452b9 100644
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -102,6 +102,8 @@
 
     private ArrayList<CharSequence> mSuggestions = new ArrayList<CharSequence>();
     ArrayList<CharSequence> mBigramSuggestions  = new ArrayList<CharSequence>();
+    // TODO: maybe this should be synchronized, it's quite scary as it is.
+    // TODO: if it becomes synchronized, also move initPool in the thread in initAsynchronously
     private ArrayList<CharSequence> mStringPool = new ArrayList<CharSequence>();
     private CharSequence mTypedWord;
 
@@ -111,27 +113,39 @@
 
     private int mCorrectionMode = CORRECTION_BASIC;
 
-    public Suggest(Context context, int dictionaryResId, Locale locale) {
-        init(context, DictionaryFactory.createDictionaryFromManager(context, locale,
-                dictionaryResId));
+    public Suggest(final Context context, final int dictionaryResId, final Locale locale) {
+        initAsynchronously(context, dictionaryResId, locale);
     }
 
     /* package for test */ Suggest(Context context, File dictionary, long startOffset, long length,
             Flag[] flagArray) {
-        init(null, DictionaryFactory.createDictionaryForTest(context, dictionary, startOffset,
-                length, flagArray));
+        initSynchronously(null, DictionaryFactory.createDictionaryForTest(context, dictionary,
+                startOffset, length, flagArray));
     }
 
-    private void init(Context context, Dictionary mainDict) {
-        mMainDict = mainDict;
-        addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_MAIN, mainDict);
-        addOrReplaceDictionary(mBigramDictionaries, DICT_KEY_MAIN, mainDict);
+    private void initWhitelistAndAutocorrectAndPool(final Context context) {
         mWhiteListDictionary = WhitelistDictionary.init(context);
         addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_WHITELIST, mWhiteListDictionary);
         mAutoCorrection = new AutoCorrection();
         initPool();
     }
 
+    private void initAsynchronously(final Context context, final int dictionaryResId,
+            final Locale locale) {
+        resetMainDict(context, dictionaryResId, locale);
+
+        // TODO: read the whitelist and init the pool asynchronously too.
+        // initPool should be done asynchronously but the pool is not thread-safe at the moment.
+        initWhitelistAndAutocorrectAndPool(context);
+    }
+
+    private void initSynchronously(Context context, Dictionary mainDict) {
+        mMainDict = mainDict;
+        addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_MAIN, mainDict);
+        addOrReplaceDictionary(mBigramDictionaries, DICT_KEY_MAIN, mainDict);
+        initWhitelistAndAutocorrectAndPool(context);
+    }
+
     private void addOrReplaceDictionary(Map<String, Dictionary> dictionaries, String key,
             Dictionary dict) {
         final Dictionary oldDict = (dict == null)
@@ -142,12 +156,18 @@
         }
     }
 
-    public void resetMainDict(Context context, int dictionaryResId, Locale locale) {
-        final Dictionary newMainDict = DictionaryFactory.createDictionaryFromManager(
-                context, locale, dictionaryResId);
-        mMainDict = newMainDict;
-        addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_MAIN, newMainDict);
-        addOrReplaceDictionary(mBigramDictionaries, DICT_KEY_MAIN, newMainDict);
+    public void resetMainDict(final Context context, final int dictionaryResId,
+            final Locale locale) {
+        mMainDict = null;
+        new Thread("InitializeBinaryDictionary") {
+            public void run() {
+                final Dictionary newMainDict = DictionaryFactory.createDictionaryFromManager(
+                        context, locale, dictionaryResId);
+                mMainDict = newMainDict;
+                addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_MAIN, newMainDict);
+                addOrReplaceDictionary(mBigramDictionaries, DICT_KEY_MAIN, newMainDict);
+            }
+        }.start();
     }
 
     private void initPool() {