sharedprefs because Why Not©
This commit is contained in:
parent
4adbb69c37
commit
975a8b9d8c
2 changed files with 33 additions and 17 deletions
|
@ -49,7 +49,7 @@ fun Peers(
|
|||
modifier: Modifier = Modifier,
|
||||
dataStoreViewModel: DataStoreViewModel = viewModel(factory = DataStoreViewModel.Factory),
|
||||
) {
|
||||
val username = dataStoreViewModel.usernameSetting.collectAsStateWithLifecycle("")
|
||||
val username = dataStoreViewModel.username.collectAsStateWithLifecycle("")
|
||||
|
||||
LaunchedEffect(Unit) {
|
||||
// Test: it'll change the username setting after 2s and this should refresh the UI as expected
|
||||
|
|
|
@ -1,33 +1,49 @@
|
|||
package pet.catcomm.ui.viewmodel
|
||||
|
||||
import android.content.Context
|
||||
import androidx.datastore.core.DataStore
|
||||
import androidx.datastore.preferences.core.Preferences
|
||||
import androidx.datastore.preferences.core.edit
|
||||
import androidx.datastore.preferences.core.stringPreferencesKey
|
||||
import androidx.datastore.preferences.preferencesDataStore
|
||||
import android.content.SharedPreferences
|
||||
import android.content.SharedPreferences.OnSharedPreferenceChangeListener
|
||||
import androidx.core.content.edit
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
import androidx.lifecycle.viewmodel.CreationExtras
|
||||
import kotlinx.coroutines.flow.map
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.asStateFlow
|
||||
import pet.catcomm.CatCommApplication
|
||||
|
||||
private const val PREFERENCES = "settings"
|
||||
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = PREFERENCES)
|
||||
|
||||
const val SETTINGS_USERNAME_KEY = "cat_comm_username"
|
||||
val SETTINGS_USERNAME = stringPreferencesKey(SETTINGS_USERNAME_KEY)
|
||||
|
||||
class DataStoreViewModel(
|
||||
private val settingsDataStore: DataStore<Preferences>,
|
||||
) : ViewModel() {
|
||||
val usernameSetting = settingsDataStore.data.map { preferences ->
|
||||
preferences[SETTINGS_USERNAME] ?: ""
|
||||
private val prefs: SharedPreferences,
|
||||
) : ViewModel(), OnSharedPreferenceChangeListener {
|
||||
private var _username: MutableStateFlow<String> =
|
||||
MutableStateFlow(prefs.getString(SETTINGS_USERNAME_KEY, "")!!)
|
||||
val username: StateFlow<String>
|
||||
get() = _username.asStateFlow()
|
||||
|
||||
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
|
||||
if (sharedPreferences != prefs) {
|
||||
println("wat? received changes from another sharedPreferences than ours")
|
||||
}
|
||||
|
||||
_username.value = prefs.getString(SETTINGS_USERNAME_KEY, null)!!
|
||||
}
|
||||
|
||||
suspend fun changeUsername(new: String) {
|
||||
settingsDataStore.edit { settings ->
|
||||
settings[SETTINGS_USERNAME] = new
|
||||
init {
|
||||
prefs.registerOnSharedPreferenceChangeListener(this)
|
||||
}
|
||||
|
||||
override fun onCleared() {
|
||||
super.onCleared()
|
||||
prefs.unregisterOnSharedPreferenceChangeListener(this)
|
||||
}
|
||||
|
||||
fun changeUsername(new: String) {
|
||||
prefs.edit(true) {
|
||||
putString(SETTINGS_USERNAME_KEY, new)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -42,7 +58,7 @@ class DataStoreViewModel(
|
|||
checkNotNull(extras[ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY]) as CatCommApplication
|
||||
|
||||
return DataStoreViewModel(
|
||||
settingsDataStore = app.baseContext.dataStore,
|
||||
prefs = app.baseContext.getSharedPreferences(PREFERENCES, Context.MODE_PRIVATE),
|
||||
) as T
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue