Example #1
0
  /**
   * 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;
  }