Close dictionary appropriately

The dictionary that extends ExpandableDictionary must be closed when
it becomes unused.

Bug: 4725930
Change-Id: Ib5d2c39771fb7010d303a26d1ea1c8e237c0101f
diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index 62788fb..d01e3e9 100644
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -117,30 +117,31 @@
     }
 
     private void init(Context context, Dictionary mainDict) {
-        if (mainDict != null) {
-            mMainDict = mainDict;
-            mUnigramDictionaries.put(DICT_KEY_MAIN, mainDict);
-            mBigramDictionaries.put(DICT_KEY_MAIN, mainDict);
-        }
+        mMainDict = mainDict;
+        addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_MAIN, mainDict);
+        addOrReplaceDictionary(mBigramDictionaries, DICT_KEY_MAIN, mainDict);
         mWhiteListDictionary = WhitelistDictionary.init(context);
-        if (mWhiteListDictionary != null) {
-            mUnigramDictionaries.put(DICT_KEY_WHITELIST, mWhiteListDictionary);
-        }
+        addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_WHITELIST, mWhiteListDictionary);
         mAutoCorrection = new AutoCorrection();
         initPool();
     }
 
+    private void addOrReplaceDictionary(Map<String, Dictionary> dictionaries, String key,
+            Dictionary dict) {
+        final Dictionary oldDict = (dict == null)
+                ? dictionaries.remove(key)
+                : dictionaries.put(key, dict);
+        if (oldDict != null && dict != oldDict) {
+            oldDict.close();
+        }
+    }
+
     public void resetMainDict(Context context, int dictionaryResId, Locale locale) {
         final Dictionary newMainDict = DictionaryFactory.createDictionaryFromManager(
                 context, locale, dictionaryResId);
         mMainDict = newMainDict;
-        if (null == newMainDict) {
-            mUnigramDictionaries.remove(DICT_KEY_MAIN);
-            mBigramDictionaries.remove(DICT_KEY_MAIN);
-        } else {
-            mUnigramDictionaries.put(DICT_KEY_MAIN, newMainDict);
-            mBigramDictionaries.put(DICT_KEY_MAIN, newMainDict);
-        }
+        addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_MAIN, newMainDict);
+        addOrReplaceDictionary(mBigramDictionaries, DICT_KEY_MAIN, newMainDict);
     }
 
     private void initPool() {
@@ -179,8 +180,7 @@
      * before the main dictionary, if set.
      */
     public void setUserDictionary(Dictionary userDictionary) {
-        if (userDictionary != null)
-            mUnigramDictionaries.put(DICT_KEY_USER, userDictionary);
+        addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_USER, userDictionary);
     }
 
     /**
@@ -189,23 +189,16 @@
      * won't be used.
      */
     public void setContactsDictionary(Dictionary contactsDictionary) {
-        if (contactsDictionary != null) {
-            mUnigramDictionaries.put(DICT_KEY_CONTACTS, contactsDictionary);
-            mBigramDictionaries.put(DICT_KEY_CONTACTS, contactsDictionary);
-        } else {
-            mUnigramDictionaries.remove(DICT_KEY_CONTACTS);
-            mBigramDictionaries.remove(DICT_KEY_CONTACTS);
-        }
+        addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_CONTACTS, contactsDictionary);
+        addOrReplaceDictionary(mBigramDictionaries, DICT_KEY_CONTACTS, contactsDictionary);
     }
 
     public void setAutoDictionary(Dictionary autoDictionary) {
-        if (autoDictionary != null)
-            mUnigramDictionaries.put(DICT_KEY_AUTO, autoDictionary);
+        addOrReplaceDictionary(mUnigramDictionaries, DICT_KEY_AUTO, autoDictionary);
     }
 
     public void setUserBigramDictionary(Dictionary userBigramDictionary) {
-        if (userBigramDictionary != null)
-            mBigramDictionaries.put(DICT_KEY_USER_BIGRAM, userBigramDictionary);
+        addOrReplaceDictionary(mBigramDictionaries, DICT_KEY_USER_BIGRAM, userBigramDictionary);
     }
 
     public void setAutoCorrectionThreshold(double threshold) {