Fix a view-related crash

Bug: 12788164
Change-Id: If0d815518824a8e57b15e80111c5e6e08e93ba7e
diff --git a/java/src/com/android/inputmethod/dictionarypack/DictionarySettingsFragment.java b/java/src/com/android/inputmethod/dictionarypack/DictionarySettingsFragment.java
index 7bbd041..d186397 100644
--- a/java/src/com/android/inputmethod/dictionarypack/DictionarySettingsFragment.java
+++ b/java/src/com/android/inputmethod/dictionarypack/DictionarySettingsFragment.java
@@ -317,15 +317,19 @@
                     final WordListPreference pref;
                     if (null != oldPreference
                             && oldPreference.mVersion == version
+                            && oldPreference.hasStatus(status)
                             && oldPreference.mLocale.equals(locale)) {
-                        // If the old preference has all the new attributes, reuse it. We test
-                        // for version and locale because although attributes other than status
-                        // need to be the same, others have been tested through the key of the
-                        // map. Also, status may differ so we don't want to use #equals() here.
+                        // If the old preference has all the new attributes, reuse it. Ideally, we
+                        // should reuse the old pref even if its status is different and call
+                        // setStatus here, but setStatus calls Preference#setSummary() which needs
+                        // to be done on the UI thread and we're not on the UI thread here. We
+                        // could do all this work on the UI thread, but in this case it's probably
+                        // lighter to stay on a background thread and throw this old preference out.
                         pref = oldPreference;
-                        pref.setStatus(status);
                     } else {
                         // Otherwise, discard it and create a new one instead.
+                        // TODO: when the status is different from the old one, we need to
+                        // animate the old one out before animating the new one in.
                         pref = new WordListPreference(activity, mDictionaryListInterfaceState,
                                 mClientId, wordlistId, version, locale, description, status,
                                 filesize);
diff --git a/java/src/com/android/inputmethod/dictionarypack/WordListPreference.java b/java/src/com/android/inputmethod/dictionarypack/WordListPreference.java
index ba1fce1..aea16af 100644
--- a/java/src/com/android/inputmethod/dictionarypack/WordListPreference.java
+++ b/java/src/com/android/inputmethod/dictionarypack/WordListPreference.java
@@ -98,6 +98,10 @@
         setSummary(getSummary(status));
     }
 
+    public boolean hasStatus(final int status) {
+        return status == mStatus;
+    }
+
     @Override
     public View onCreateView(final ViewGroup parent) {
         final View orphanedView = mInterfaceState.findFirstOrphanedView();
@@ -217,6 +221,7 @@
         progressBar.setIds(mClientId, mWordlistId);
         progressBar.setMax(mFilesize);
         final boolean showProgressBar = (MetadataDbHelper.STATUS_DOWNLOADING == mStatus);
+        setSummary(getSummary(mStatus));
         status.setVisibility(showProgressBar ? View.INVISIBLE : View.VISIBLE);
         progressBar.setVisibility(showProgressBar ? View.VISIBLE : View.INVISIBLE);