Skip to content

Instantly share code, notes, and snippets.

@osipxd
Last active May 27, 2020 14:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save osipxd/66ab6b67e7b90dce25baab34608dd2d7 to your computer and use it in GitHub Desktop.
Save osipxd/66ab6b67e7b90dce25baab34608dd2d7 to your computer and use it in GitHub Desktop.
SharedPreferences migration
import android.content.SharedPreferences
import androidx.core.content.edit
/**
* Бридж для обеспечения обратной совместимости при переименовании полей или файла [SharedPreferences].
*
* @param preferences Основной [SharedPreferences].
* @param migratingPreferences Дополнительный [SharedPreferences], поля из которого будут переноситься в
* [preferences], при чтении. По умолчанию используется [preferences], что соответствует случаю
* переименования полей внутри одного [SharedPreferences].
* @param migratedKeysMapping Маппинг ключей [preferences] к ключам [migratingPreferences]. Если ключ не найден в
* маппинге, значение из [migratingPreferences] будет считываться по не измененному ключу. По умолчанию передаётся
* пустой маппинг.
*/
internal class SharedPreferencesMigration(
private val preferences: SharedPreferences,
private val migratingPreferences: SharedPreferences = preferences,
private val migratedKeysMapping: Map<String, String> = emptyMap()
) : SharedPreferences by preferences {
override fun getBoolean(key: String, defValue: Boolean): Boolean {
migrateFieldIfNeed(key, defValue, SharedPreferences::getBoolean, SharedPreferences.Editor::putBoolean)
return preferences.getBoolean(key, defValue)
}
override fun getFloat(key: String, defValue: Float): Float {
migrateFieldIfNeed(key, defValue, SharedPreferences::getFloat, SharedPreferences.Editor::putFloat)
return preferences.getFloat(key, defValue)
}
override fun getInt(key: String, defValue: Int): Int {
migrateFieldIfNeed(key, defValue, SharedPreferences::getInt, SharedPreferences.Editor::putInt)
return preferences.getInt(key, defValue)
}
override fun getLong(key: String, defValue: Long): Long {
migrateFieldIfNeed(key, defValue, SharedPreferences::getLong, SharedPreferences.Editor::putLong)
return preferences.getLong(key, defValue)
}
override fun getString(key: String, defValue: String?): String? {
migrateFieldIfNeed(key, defValue, SharedPreferences::getString, SharedPreferences.Editor::putString)
return preferences.getString(key, defValue)
}
override fun getStringSet(key: String, defValues: Set<String>?): Set<String>? {
migrateFieldIfNeed(key, defValues, SharedPreferences::getStringSet, SharedPreferences.Editor::putStringSet)
return preferences.getStringSet(key, defValues)
}
private fun <T> migrateFieldIfNeed(
key: String,
default: T,
getValue: SharedPreferences.(String, T) -> T,
setValue: SharedPreferences.Editor.(String, T) -> SharedPreferences.Editor
) {
val mappedKey = migratedKeysMapping[key] ?: key
if (mappedKey in migratingPreferences) {
val value = migratingPreferences.getValue(mappedKey, default)
migratingPreferences.edit { remove(mappedKey) }
preferences.edit { setValue(key, value) }
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment