/*
|
* Copyright (C) 2014 The Android Open Source Project
|
*
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
* you may not use this file except in compliance with the License.
|
* You may obtain a copy of the License at
|
*
|
* http://www.apache.org/licenses/LICENSE-2.0
|
*
|
* Unless required by applicable law or agreed to in writing, software
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* See the License for the specific language governing permissions and
|
* limitations under the License.
|
*/
|
|
package com.android.camera.settings;
|
|
import android.content.SharedPreferences;
|
|
import com.android.camera.debug.Log;
|
|
/**
|
* The SettingsUpgrader class can be used to define an upgrade flow that
|
* executes upgrade logic to a target version when a version number has changed.
|
*/
|
public abstract class SettingsUpgrader {
|
private static final Log.Tag TAG = new Log.Tag("SettingsUpgrader");
|
|
private final String mVersionKey;
|
private final int mTargetVersion;
|
|
// These values were in use by the original preferences management, before
|
// SettingsManager, to represent string-based booleans via typed string
|
// resource arrays. We no longer utilize such value arrays, and reference
|
// these constants only within SettingsUpgraders to convert to new string-
|
// based booleans.
|
protected static final String OLD_SETTINGS_VALUE_NONE = "none";
|
protected static final String OLD_SETTINGS_VALUE_ON = "on";
|
protected static final String OLD_SETTINGS_VALUE_OFF = "off";
|
|
public SettingsUpgrader(String versionKey, int targetVersion) {
|
mVersionKey = versionKey;
|
mTargetVersion = targetVersion;
|
}
|
|
/**
|
* Execute an upgrade callback if an upgrade version has changed. Third
|
* party modules also use this to upgrade settings local to them.
|
*/
|
public void upgrade(SettingsManager settingsManager) {
|
int lastVersion = getLastVersion(settingsManager);
|
if (lastVersion != mTargetVersion) {
|
upgrade(settingsManager, lastVersion, mTargetVersion);
|
}
|
settingsManager.set(SettingsManager.SCOPE_GLOBAL, mVersionKey, mTargetVersion);
|
}
|
|
/**
|
* Perform upgrades to bring any settings up to date to the version
|
* specified in currentVersion, where the settings were last upgraded to
|
* lastVersion. Typically an Upgrader will check whether lastVersion is less
|
* than some known version for a particular setting, and apply upgrade logic
|
* if lastVersion is less than that known version.
|
*/
|
protected abstract void upgrade(SettingsManager settingsManager, int lastVersion,
|
int targetVersion);
|
|
/**
|
* Retrieve the last persisted version for the particular upgrader.
|
* Typically will be stored in SCOPE_GLOBAL in SettingsManager, but an
|
* Upgrader may need to perform an upgrade analysis on the version
|
* persistence itself and should do so here.
|
*
|
* @throws a {@link ClassCastException} if the value for Version is not a
|
* String
|
*/
|
protected int getLastVersion(SettingsManager settingsManager) {
|
return settingsManager.getInteger(SettingsManager.SCOPE_GLOBAL, mVersionKey);
|
}
|
|
/**
|
* A helper function that is used to remove a setting stored as a boolean,
|
* and return the value that was removed.
|
* <p>
|
* This is used in the upgrade path to change all underlying
|
* SharedPreferences values to Strings. It can be used by third party
|
* modules to upgrade their boolean settings to Strings.
|
*/
|
protected boolean removeBoolean(SharedPreferences oldPreferencesLocation, String key) {
|
boolean value = false;
|
try {
|
value = oldPreferencesLocation.getBoolean(key, value);
|
} catch (ClassCastException e) {
|
Log.e(TAG, "error reading old value, removing and returning default", e);
|
}
|
oldPreferencesLocation.edit().remove(key).apply();
|
return value;
|
}
|
|
/**
|
* A helper function that is used to remove a setting stored as an Integer,
|
* and return the value that was removed.
|
* <p>
|
* This is used in the upgrade path to change all underlying
|
* SharedPreferences values to Strings. It can be used by third party
|
* modules to upgrade their Integer settings to Strings.
|
*/
|
protected int removeInteger(SharedPreferences oldPreferencesLocation, String key) {
|
int value = 0;
|
try {
|
value = oldPreferencesLocation.getInt(key, value);
|
} catch (ClassCastException e) {
|
Log.e(TAG, "error reading old value, removing and returning default", e);
|
}
|
oldPreferencesLocation.edit().remove(key).apply();
|
return value;
|
}
|
|
/**
|
* A helper function that is used to remove a setting stored as a String,
|
* and return the value that was removed.
|
* <p>
|
* This is used in the upgrade path to change all underlying
|
* SharedPreferences values to Strings. It can be used by third party
|
* modules to upgrade their boolean settings to Strings.
|
*/
|
protected String removeString(SharedPreferences oldPreferencesLocation, String key) {
|
String value = null;
|
try {
|
value = oldPreferencesLocation.getString(key, value);
|
} catch (ClassCastException e) {
|
Log.e(TAG, "error reading old value, removing and returning default", e);
|
}
|
oldPreferencesLocation.edit().remove(key).apply();
|
return value;
|
}
|
|
}
|