Merge "Update shortcut IME info before checking availability of it"
diff --git a/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java b/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java
index ae41e74..a787ef1 100644
--- a/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/ContactsBinaryDictionary.java
@@ -16,8 +16,6 @@
 
 package com.android.inputmethod.latin;
 
-import com.android.inputmethod.latin.personalization.AccountUtils;
-
 import android.content.ContentResolver;
 import android.content.Context;
 import android.database.ContentObserver;
@@ -31,6 +29,8 @@
 import android.text.TextUtils;
 import android.util.Log;
 
+import com.android.inputmethod.annotations.UsedForTesting;
+import com.android.inputmethod.latin.personalization.AccountUtils;
 import com.android.inputmethod.latin.utils.StringUtils;
 
 import java.io.File;
@@ -85,6 +85,7 @@
     }
 
     // Dummy constructor for tests.
+    @UsedForTesting
     public ContactsBinaryDictionary(final Context context, final Locale locale, final File file) {
         this(context, locale);
     }
diff --git a/java/src/com/android/inputmethod/latin/DictionaryFacilitatorForSuggest.java b/java/src/com/android/inputmethod/latin/DictionaryFacilitatorForSuggest.java
index c7f0553..c9bcfe3 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryFacilitatorForSuggest.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryFacilitatorForSuggest.java
@@ -29,6 +29,9 @@
 import com.android.inputmethod.latin.settings.SettingsValues;
 import com.android.inputmethod.latin.utils.CollectionUtils;
 
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Locale;
 import java.util.Set;
@@ -103,13 +106,49 @@
     }
 
     @UsedForTesting
-    DictionaryFacilitatorForSuggest(final Context context, final AssetFileAddress[] dictionaryList,
-            final Locale locale) {
-        final Dictionary mainDict = DictionaryFactory.createDictionaryForTest(dictionaryList,
-                false /* useFullEditDistance */, locale);
+    public DictionaryFacilitatorForSuggest(final Context context, final Locale locale,
+            final ArrayList<String> dictionaryTypes, final HashMap<String, File> dictionaryFiles) {
         mContext = context;
         mLocale = locale;
-        setMainDictionary(mainDict);
+        for (final String dictType : dictionaryTypes) {
+            if (dictType.equals(Dictionary.TYPE_MAIN)) {
+                final DictionaryCollection mainDictionary =
+                        DictionaryFactory.createMainDictionaryFromManager(context, locale);
+                setMainDictionary(mainDictionary);
+            } else if (dictType.equals(Dictionary.TYPE_USER_HISTORY)) {
+                final UserHistoryDictionary userHistoryDictionary =
+                        PersonalizationHelper.getUserHistoryDictionary(context, locale);
+                // Staring with an empty user history dictionary for testing.
+                // Testing program may populate this dictionary before actual testing.
+                userHistoryDictionary.reloadDictionaryIfRequired();
+                userHistoryDictionary.waitAllTasksForTests();
+                setUserHistoryDictionary(userHistoryDictionary);
+            } else if (dictType.equals(Dictionary.TYPE_PERSONALIZATION)) {
+                final PersonalizationDictionary personalizationDictionary =
+                        PersonalizationHelper.getPersonalizationDictionary(context, locale);
+                // Staring with an empty personalization dictionary for testing.
+                // Testing program may populate this dictionary before actual testing.
+                personalizationDictionary.reloadDictionaryIfRequired();
+                personalizationDictionary.waitAllTasksForTests();
+                setPersonalizationDictionary(personalizationDictionary);
+            } else if (dictType.equals(Dictionary.TYPE_USER)) {
+                final File file = dictionaryFiles.get(dictType);
+                final UserBinaryDictionary userDictionary = new UserBinaryDictionary(
+                        context, locale, file);
+                userDictionary.reloadDictionaryIfRequired();
+                userDictionary.waitAllTasksForTests();
+                setUserDictionary(userDictionary);
+            } else if (dictType.equals(Dictionary.TYPE_CONTACTS)) {
+                final File file = dictionaryFiles.get(dictType);
+                final ContactsBinaryDictionary contactsDictionary = new ContactsBinaryDictionary(
+                        context, locale, file);
+                contactsDictionary.reloadDictionaryIfRequired();
+                contactsDictionary.waitAllTasksForTests();
+                setContactsDictionary(contactsDictionary);
+            } else {
+                throw new RuntimeException("Unknown dictionary type: " + dictType);
+            }
+        }
     }
 
     // initialize a debug flag for the personalization
@@ -169,8 +208,7 @@
      * Sets an optional user dictionary resource to be loaded. The user dictionary is consulted
      * before the main dictionary, if set. This refers to the system-managed user dictionary.
      */
-    @UsedForTesting
-    public void setUserDictionary(final UserBinaryDictionary userDictionary) {
+    private void setUserDictionary(final UserBinaryDictionary userDictionary) {
         mUserDictionary = userDictionary;
         addOrReplaceDictionary(Dictionary.TYPE_USER, userDictionary);
     }
@@ -180,8 +218,7 @@
      * the contacts dictionary by passing null to this method. In this case no contacts dictionary
      * won't be used.
      */
-    @UsedForTesting
-    public void setContactsDictionary(final ContactsBinaryDictionary contactsDictionary) {
+    private void setContactsDictionary(final ContactsBinaryDictionary contactsDictionary) {
         mContactsDictionary = contactsDictionary;
         addOrReplaceDictionary(Dictionary.TYPE_CONTACTS, contactsDictionary);
     }
diff --git a/java/src/com/android/inputmethod/latin/UserBinaryDictionary.java b/java/src/com/android/inputmethod/latin/UserBinaryDictionary.java
index 68648dd..8011247 100644
--- a/java/src/com/android/inputmethod/latin/UserBinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/UserBinaryDictionary.java
@@ -28,6 +28,7 @@
 import android.text.TextUtils;
 import android.util.Log;
 
+import com.android.inputmethod.annotations.UsedForTesting;
 import com.android.inputmethod.compat.UserDictionaryCompatUtils;
 import com.android.inputmethod.latin.utils.LocaleUtils;
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
@@ -81,6 +82,7 @@
     }
 
     // Dummy constructor for tests.
+    @UsedForTesting
     public UserBinaryDictionary(final Context context, final Locale locale, final File file) {
         this(context, locale);
     }