Skip to content

Instantly share code, notes, and snippets.

@yaraki
Created September 21, 2018 05:12
Show Gist options
  • Save yaraki/3d26737d689861d0688595e20afb9822 to your computer and use it in GitHub Desktop.
Save yaraki/3d26737d689861d0688595e20afb9822 to your computer and use it in GitHub Desktop.
SharedPreferences as LiveData
package io.github.yaraki.playground
import android.app.Application
import android.arch.lifecycle.AndroidViewModel
import android.content.Context
class MainViewModel(application: Application) : AndroidViewModel(application) {
companion object {
const val PREF = "main"
const val PREF_MESSAGE = "message"
}
private val prefs = application.getSharedPreferences(PREF, Context.MODE_PRIVATE)
val message = prefs.liveString(PREF_MESSAGE, "")
fun saveMessage(message: String) {
prefs.edit().putString(PREF_MESSAGE, message).apply()
}
}
/*
* Copyright (C) 2018 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 io.github.yaraki.playground
import android.arch.lifecycle.LiveData
import android.content.SharedPreferences
fun SharedPreferences.liveString(key: String, defaultValue: String): LiveData<String> {
return SharedPreferenceLiveData(this, key, defaultValue, SharedPreferences::getString)
}
fun SharedPreferences.liveInt(key: String, defaultValue: Int): LiveData<Int> {
return SharedPreferenceLiveData(this, key, defaultValue, SharedPreferences::getInt)
}
fun SharedPreferences.liveBoolean(key: String, defaultValue: Boolean): LiveData<Boolean> {
return SharedPreferenceLiveData(this, key, defaultValue, SharedPreferences::getBoolean)
}
fun SharedPreferences.liveFloat(key: String, defaultValue: Float): LiveData<Float> {
return SharedPreferenceLiveData(this, key, defaultValue, SharedPreferences::getFloat)
}
fun SharedPreferences.liveLong(key: String, defaultValue: Long): LiveData<Long> {
return SharedPreferenceLiveData(this, key, defaultValue, SharedPreferences::getLong)
}
fun SharedPreferences.liveStringSet(key: String, defaultValue: Set<String>): LiveData<Set<String>> {
return SharedPreferenceLiveData(this, key, defaultValue, SharedPreferences::getStringSet)
}
internal class SharedPreferenceLiveData<T>(
private val prefs: SharedPreferences,
private val key: String,
private val defaultValue: T,
private val getter: (SharedPreferences).(String, T) -> T
) : LiveData<T>() {
private val listener = SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
if (key == this.key) {
value = prefs.getter(key, defaultValue)
}
}
override fun onActive() {
super.onActive()
value = prefs.getter(key, defaultValue)
prefs.registerOnSharedPreferenceChangeListener(listener)
}
override fun onInactive() {
super.onInactive()
prefs.unregisterOnSharedPreferenceChangeListener(listener)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment