Fix a bug with a concurrent modification of a map.

Bug: 6538848
Change-Id: I1a8422356d9909213e53cfdc8c5bcc12eb48f19d
diff --git a/java/src/com/android/inputmethod/latin/AutoCorrection.java b/java/src/com/android/inputmethod/latin/AutoCorrection.java
index da1936a..32b213e 100644
--- a/java/src/com/android/inputmethod/latin/AutoCorrection.java
+++ b/java/src/com/android/inputmethod/latin/AutoCorrection.java
@@ -22,7 +22,7 @@
 import android.util.Log;
 
 import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.concurrent.ConcurrentHashMap;
 
 public class AutoCorrection {
     private static final boolean DBG = LatinImeLogger.sDBG;
@@ -33,10 +33,10 @@
     }
 
     public static CharSequence computeAutoCorrectionWord(
-            HashMap<String, Dictionary> dictionaries,
-            WordComposer wordComposer, ArrayList<SuggestedWordInfo> suggestions,
-            CharSequence consideredWord, float autoCorrectionThreshold,
-            CharSequence whitelistedWord) {
+            final ConcurrentHashMap<String, Dictionary> dictionaries,
+            final WordComposer wordComposer, final ArrayList<SuggestedWordInfo> suggestions,
+            final CharSequence consideredWord, final float autoCorrectionThreshold,
+            final CharSequence whitelistedWord) {
         if (hasAutoCorrectionForWhitelistedWord(whitelistedWord)) {
             return whitelistedWord;
         } else if (hasAutoCorrectionForConsideredWord(
@@ -49,8 +49,8 @@
         return null;
     }
 
-    public static boolean isValidWord(
-            HashMap<String, Dictionary> dictionaries, CharSequence word, boolean ignoreCase) {
+    public static boolean isValidWord(final ConcurrentHashMap<String, Dictionary> dictionaries,
+           CharSequence word, boolean ignoreCase) {
         if (TextUtils.isEmpty(word)) {
             return false;
         }
@@ -75,7 +75,8 @@
     }
 
     public static boolean allowsToBeAutoCorrected(
-            HashMap<String, Dictionary> dictionaries, CharSequence word, boolean ignoreCase) {
+            final ConcurrentHashMap<String, Dictionary> dictionaries,
+            final CharSequence word, final boolean ignoreCase) {
         final WhitelistDictionary whitelistDictionary =
                 (WhitelistDictionary)dictionaries.get(Suggest.DICT_KEY_WHITELIST);
         // If "word" is in the whitelist dictionary, it should not be auto corrected.
@@ -91,8 +92,9 @@
     }
 
     private static boolean hasAutoCorrectionForConsideredWord(
-            HashMap<String, Dictionary> dictionaries, WordComposer wordComposer,
-            ArrayList<SuggestedWordInfo> suggestions, CharSequence consideredWord) {
+            final ConcurrentHashMap<String, Dictionary> dictionaries,
+            final WordComposer wordComposer, final ArrayList<SuggestedWordInfo> suggestions,
+            final CharSequence consideredWord) {
         if (TextUtils.isEmpty(consideredWord)) return false;
         return wordComposer.size() > 1 && suggestions.size() > 0
                 && !allowsToBeAutoCorrected(dictionaries, consideredWord, false);
diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index c98a27b..336a76f 100644
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -26,9 +26,9 @@
 
 import java.io.File;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Locale;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * This class loads a dictionary and provides a list of suggestions for a given sequence of
@@ -68,10 +68,10 @@
     private boolean mHasMainDictionary;
     private Dictionary mContactsDict;
     private WhitelistDictionary mWhiteListDictionary;
-    private final HashMap<String, Dictionary> mUnigramDictionaries =
-            new HashMap<String, Dictionary>();
-    private final HashMap<String, Dictionary> mBigramDictionaries =
-            new HashMap<String, Dictionary>();
+    private final ConcurrentHashMap<String, Dictionary> mUnigramDictionaries =
+            new ConcurrentHashMap<String, Dictionary>();
+    private final ConcurrentHashMap<String, Dictionary> mBigramDictionaries =
+            new ConcurrentHashMap<String, Dictionary>();
 
     private int mPrefMaxSuggestions = 18;
 
@@ -117,8 +117,9 @@
         initWhitelistAndAutocorrectAndPool(context, locale);
     }
 
-    private static void addOrReplaceDictionary(HashMap<String, Dictionary> dictionaries, String key,
-            Dictionary dict) {
+    private static void addOrReplaceDictionary(
+            final ConcurrentHashMap<String, Dictionary> dictionaries,
+            final String key, final Dictionary dict) {
         final Dictionary oldDict = (dict == null)
                 ? dictionaries.remove(key)
                 : dictionaries.put(key, dict);
@@ -151,7 +152,7 @@
         return mContactsDict;
     }
 
-    public HashMap<String, Dictionary> getUnigramDictionaries() {
+    public ConcurrentHashMap<String, Dictionary> getUnigramDictionaries() {
         return mUnigramDictionaries;
     }