sharedprefs because Why Not©

This commit is contained in:
Artemis 2025-03-07 15:16:55 +01:00
parent 4adbb69c37
commit 975a8b9d8c
2 changed files with 33 additions and 17 deletions

View file

@ -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

View file

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