|
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) } |
|
} |
|
} |
|
} |