Reuse old preferences if possible.
This is an optimization. It also happens to work around what seems to be a framework bug in JB MR1 / MR1.1. Bug: 8771179 Change-Id: I62cc7acdc8656d75f8a50c068c4e9d8c6ceb74a0
This commit is contained in:
parent
b0aabbfbe0
commit
a2ec5e8338
2 changed files with 28 additions and 7 deletions
|
@ -66,6 +66,8 @@ public final class DictionarySettingsFragment extends PreferenceFragment
|
|||
private boolean mChangedSettings;
|
||||
private DictionaryListInterfaceState mDictionaryListInterfaceState =
|
||||
new DictionaryListInterfaceState();
|
||||
private TreeMap<String, WordListPreference> mCurrentPreferenceMap =
|
||||
new TreeMap<String, WordListPreference>(); // never null
|
||||
|
||||
private final BroadcastReceiver mConnectivityChangedReceiver = new BroadcastReceiver() {
|
||||
@Override
|
||||
|
@ -278,7 +280,7 @@ public final class DictionarySettingsFragment extends PreferenceFragment
|
|||
return result;
|
||||
} else {
|
||||
final String systemLocaleString = Locale.getDefault().toString();
|
||||
final TreeMap<String, WordListPreference> prefList =
|
||||
final TreeMap<String, WordListPreference> prefMap =
|
||||
new TreeMap<String, WordListPreference>();
|
||||
final int idIndex = cursor.getColumnIndex(MetadataDbHelper.WORDLISTID_COLUMN);
|
||||
final int versionIndex = cursor.getColumnIndex(MetadataDbHelper.VERSION_COLUMN);
|
||||
|
@ -299,16 +301,31 @@ public final class DictionarySettingsFragment extends PreferenceFragment
|
|||
// The key is sorted in lexicographic order, according to the match level, then
|
||||
// the description.
|
||||
final String key = matchLevelString + "." + description + "." + wordlistId;
|
||||
final WordListPreference existingPref = prefList.get(key);
|
||||
final WordListPreference existingPref = prefMap.get(key);
|
||||
if (null == existingPref || hasPriority(status, existingPref.mStatus)) {
|
||||
final WordListPreference pref = new WordListPreference(activity,
|
||||
mDictionaryListInterfaceState, mClientId, wordlistId, version, locale,
|
||||
description, status, filesize);
|
||||
prefList.put(key, pref);
|
||||
final WordListPreference oldPreference = mCurrentPreferenceMap.get(key);
|
||||
final WordListPreference pref;
|
||||
if (null != oldPreference
|
||||
&& oldPreference.mVersion == version
|
||||
&& 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.
|
||||
pref = oldPreference;
|
||||
pref.mStatus = status;
|
||||
} else {
|
||||
// Otherwise, discard it and create a new one instead.
|
||||
pref = new WordListPreference(activity, mDictionaryListInterfaceState,
|
||||
mClientId, wordlistId, version, locale, description, status,
|
||||
filesize);
|
||||
}
|
||||
prefMap.put(key, pref);
|
||||
}
|
||||
} while (cursor.moveToNext());
|
||||
cursor.close();
|
||||
return prefList.values();
|
||||
mCurrentPreferenceMap = prefMap;
|
||||
return prefMap.values();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -58,6 +58,8 @@ public final class WordListPreference extends Preference {
|
|||
// The metadata word list id and version of this word list.
|
||||
public final String mWordlistId;
|
||||
public final int mVersion;
|
||||
public final Locale mLocale;
|
||||
public final String mDescription;
|
||||
// The status
|
||||
public int mStatus;
|
||||
// The size of the dictionary file
|
||||
|
@ -80,6 +82,8 @@ public final class WordListPreference extends Preference {
|
|||
mVersion = version;
|
||||
mWordlistId = wordlistId;
|
||||
mFilesize = filesize;
|
||||
mLocale = locale;
|
||||
mDescription = description;
|
||||
|
||||
setLayoutResource(R.layout.dictionary_line);
|
||||
|
||||
|
|
Loading…
Reference in a new issue