Merge "Make the DictionaryService stage the downloaded files"
diff --git a/java/res/values-gu-rIN/strings.xml b/java/res/values-gu-rIN/strings.xml
index 550460d..25da7d4 100644
--- a/java/res/values-gu-rIN/strings.xml
+++ b/java/res/values-gu-rIN/strings.xml
@@ -43,7 +43,7 @@
     <string name="clear_sync_data_confirmation" msgid="2811931135574727678">"મેઘમાંથી તમારો સમન્વયિત ડેટા કાઢી નાખવામાં આવશે. શું તમે ખરેખર આ કરવા માંગો છો?"</string>
     <string name="clear_sync_data_ok" msgid="613104067705915132">"કાઢી નાખો"</string>
     <string name="cloud_sync_cancel" msgid="5877481252150919037">"રદ કરો"</string>
-    <string name="cloud_sync_opt_in_text" msgid="9176039655776298248">"તમારો વ્યક્તિગત શબ્દકોશનો Google સર્વર્સ પર બેક અપ લેવાશે અને સમન્વયિત કરવામાં આવશે. અમારા ઉત્પાદનોને બહેતર બનાવવામાં સહાય માટે શબ્દ આવૃત્તિની આંકડાકીય માહિતી ભેગી કરવામાં આવી શકે છે. બધી માહિતીનો સંગ્રહ અને ઉપયોગ "<a href="https://www.google.com/policies/privacy">"Google ની ગોપનીયતા નીતિ"</a>"ની સાથે સંસંગત હશે."</string>
+    <string name="cloud_sync_opt_in_text" msgid="9176039655776298248">"તમારો વ્યક્તિગત શબ્દકોશનો Google સર્વર્સ પર બેક અપ લેવાશે અને સમન્વયિત કરવામાં આવશે. અમારા ઉત્પાદનોને બહેતર બનાવવામાં સહાય માટે શબ્દ આવૃત્તિની આંકડાકીય માહિતી ભેગી કરવામાં આવી શકે છે. બધી માહિતીનો સંગ્રહ અને ઉપયોગ "<a href="https://www.google.com/policies/privacy">"Google ની ગોપનીયતા નીતિ"</a>"ની સાથે સુસંગત હશે."</string>
     <string name="add_account_to_enable_sync" msgid="7836932571852055265">"કૃપા કરીને આ સુવિધા સક્ષમ કરવા માટે આ ઉપકરણ પર Google એકાઉન્ટ ઉમેરો"</string>
     <string name="cloud_sync_summary_disabled_work_profile" msgid="1381770407303129164">"વ્યવસાય એકાઉન્ટ્સ માટે Google Apps સાથેના ઉપકરણો માટે સમન્વયન ઉપલબ્ધ નથી"</string>
     <string name="include_other_imes_in_language_switch_list" msgid="4533689960308565519">"અન્ય ઇનપુટ પદ્ધતિઓ પર સ્વિચ કરો"</string>
diff --git a/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
index 9d8bdb2..9d30ccd 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryFacilitator.java
@@ -107,6 +107,10 @@
 
     Locale getLocale();
 
+    boolean usesContacts();
+
+    String getAccount();
+
     void resetDictionaries(
             final Context context,
             final Locale newLocale,
@@ -162,7 +166,7 @@
 
     boolean isValidSuggestionWord(final String word);
 
-    void clearUserHistoryDictionary(final Context context);
+    boolean clearUserHistoryDictionary(final Context context);
 
     String dump(final Context context);
 
diff --git a/java/src/com/android/inputmethod/latin/DictionaryFacilitatorImpl.java b/java/src/com/android/inputmethod/latin/DictionaryFacilitatorImpl.java
index 6508eb2..6649d55 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryFacilitatorImpl.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryFacilitatorImpl.java
@@ -234,6 +234,16 @@
         return mDictionaryGroup.mLocale;
     }
 
+    @Override
+    public boolean usesContacts() {
+        return mDictionaryGroup.getSubDict(Dictionary.TYPE_CONTACTS) != null;
+    }
+
+    @Override
+    public String getAccount() {
+        return null;
+    }
+
     @Nullable
     private static ExpandableBinaryDictionary getSubDict(final String dictType,
             final Context context, final Locale locale, final File dictFile,
@@ -660,16 +670,18 @@
         return maxFreq;
     }
 
-    private void clearSubDictionary(final String dictName) {
+    private boolean clearSubDictionary(final String dictName) {
         final ExpandableBinaryDictionary dictionary = mDictionaryGroup.getSubDict(dictName);
-        if (dictionary != null) {
-            dictionary.clear();
+        if (dictionary == null) {
+            return false;
         }
+        dictionary.clear();
+        return true;
     }
 
     @Override
-    public void clearUserHistoryDictionary(final Context context) {
-        clearSubDictionary(Dictionary.TYPE_USER_HISTORY);
+    public boolean clearUserHistoryDictionary(final Context context) {
+        return clearSubDictionary(Dictionary.TYPE_USER_HISTORY);
     }
 
     @Override
diff --git a/java/src/com/android/inputmethod/latin/SystemBroadcastReceiver.java b/java/src/com/android/inputmethod/latin/SystemBroadcastReceiver.java
index a093ec6..26c5e00 100644
--- a/java/src/com/android/inputmethod/latin/SystemBroadcastReceiver.java
+++ b/java/src/com/android/inputmethod/latin/SystemBroadcastReceiver.java
@@ -29,13 +29,14 @@
 import android.view.inputmethod.InputMethodManager;
 import android.view.inputmethod.InputMethodSubtype;
 
-import com.android.inputmethod.dictionarypack.CommonPreferences;
 import com.android.inputmethod.dictionarypack.DictionaryPackConstants;
 import com.android.inputmethod.keyboard.KeyboardLayoutSet;
 import com.android.inputmethod.latin.settings.Settings;
 import com.android.inputmethod.latin.setup.SetupActivity;
 import com.android.inputmethod.latin.utils.UncachedInputMethodManagerUtils;
 
+import java.util.Locale;
+
 /**
  * This class detects the {@link Intent#ACTION_MY_PACKAGE_REPLACED} broadcast intent when this IME
  * package has been replaced by a newer version of the same package. This class also detects
@@ -76,6 +77,22 @@
             richImm.setAdditionalInputMethodSubtypes(additionalSubtypes);
             toggleAppIcon(context);
             downloadLatestDictionaries(context);
+            // TODO: This is only for dogfood builds. Remove this from the final release.
+            DictionaryFacilitator keyboardFacilitator =
+                    DictionaryFacilitatorProvider.getDictionaryFacilitator(false);
+            boolean historyCleared = keyboardFacilitator.clearUserHistoryDictionary(context);
+            Locale keyboardLocale = keyboardFacilitator.getLocale();
+            if (historyCleared && keyboardLocale != null) {
+                keyboardFacilitator.resetDictionaries(
+                        context,
+                        keyboardLocale,
+                        keyboardFacilitator.usesContacts(),
+                        true /* history */,
+                        true /* force */,
+                        keyboardFacilitator.getAccount(),
+                        "" /* prefix */,
+                        null /* listener */);
+            }
         } else if (Intent.ACTION_BOOT_COMPLETED.equals(intentAction)) {
             Log.i(TAG, "Boot has been completed");
             toggleAppIcon(context);
diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
index f7dbc0a..975ed7c 100644
--- a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
+++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
@@ -398,9 +398,8 @@
             if (!TextUtils.isEmpty(mWordBeingCorrectedByCursor)) {
                 final int timeStampInSeconds = (int)TimeUnit.MILLISECONDS.toSeconds(
                         System.currentTimeMillis());
-                mDictionaryFacilitator.addToUserHistory(mWordBeingCorrectedByCursor, false,
-                        NgramContext.EMPTY_PREV_WORDS_INFO, timeStampInSeconds,
-                        settingsValues.mBlockPotentiallyOffensive);
+                performAdditionToUserHistoryDictionary(settingsValues, mWordBeingCorrectedByCursor,
+                        NgramContext.EMPTY_PREV_WORDS_INFO);
             }
         } else {
             // resetEntireInputState calls resetCachesUponCursorMove, but forcing the