/** * Upgrade settings using the settings structure and/or special upgrade code. * * @param version The content version of the settings in {@code validatedSettings}. * @param upgraders A map of {@link SettingsUpgrader}s for nontrivial settings upgrades. * @param settings The structure describing the different settings, possibly containing multiple * versions. * @param validatedSettings The settings as returned by {@link Settings#validate(int, Map, Map, * boolean)}. This map is modified and contains the upgraded settings when this method * returns. * @return A set of setting names that were removed during the upgrade process or {@code null} if * none were removed. */ public static Set<String> upgrade( int version, Map<Integer, SettingsUpgrader> upgraders, Map<String, TreeMap<Integer, SettingsDescription>> settings, Map<String, Object> validatedSettings) { Map<String, Object> upgradedSettings = validatedSettings; Set<String> deletedSettings = null; for (int toVersion = version + 1; toVersion <= VERSION; toVersion++) { // Check if there's an SettingsUpgrader for that version SettingsUpgrader upgrader = upgraders.get(toVersion); if (upgrader != null) { deletedSettings = upgrader.upgrade(upgradedSettings); } // Deal with settings that don't need special upgrade code for (Entry<String, TreeMap<Integer, SettingsDescription>> versions : settings.entrySet()) { String settingName = versions.getKey(); TreeMap<Integer, SettingsDescription> versionedSettings = versions.getValue(); // Handle newly added settings if (versionedSettings.firstKey().intValue() == toVersion) { // Check if it was already added to upgradedSettings by the SettingsUpgrader if (!upgradedSettings.containsKey(settingName)) { // Insert default value to upgradedSettings SettingsDescription setting = versionedSettings.get(toVersion); Object defaultValue = setting.getDefaultValue(); upgradedSettings.put(settingName, defaultValue); if (K9.DEBUG) { String prettyValue = setting.toPrettyString(defaultValue); Log.v( K9.LOG_TAG, "Added new setting \"" + settingName + "\" with default value \"" + prettyValue + "\""); } } } // Handle removed settings Integer highestVersion = versionedSettings.lastKey(); if (highestVersion.intValue() == toVersion && versionedSettings.get(highestVersion) == null) { upgradedSettings.remove(settingName); if (deletedSettings == null) { deletedSettings = new HashSet<String>(); } deletedSettings.add(settingName); if (K9.DEBUG) { Log.v(K9.LOG_TAG, "Removed setting \"" + settingName + "\""); } } } } return deletedSettings; }