extensions: Strip out logic for shared pref callback into extension
Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
41
app/src/main/java/com/aurora/extensions/SharedPreferences.kt
Normal file
41
app/src/main/java/com/aurora/extensions/SharedPreferences.kt
Normal file
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2025 The Calyx Institute
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
|
||||
package com.aurora.extensions
|
||||
|
||||
import android.content.SharedPreferences
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.channels.awaitClose
|
||||
import kotlinx.coroutines.flow.SharingStarted
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.callbackFlow
|
||||
import kotlinx.coroutines.flow.stateIn
|
||||
|
||||
/**
|
||||
* Extension method to observe changes in shared preferences as a flow
|
||||
*/
|
||||
fun <T> SharedPreferences.observeAsStateFlow(
|
||||
key: String,
|
||||
scope: CoroutineScope,
|
||||
started: SharingStarted = SharingStarted.Eagerly,
|
||||
initial: T,
|
||||
valueProvider: () -> T
|
||||
): StateFlow<T> =
|
||||
callbackFlow {
|
||||
val listener =
|
||||
SharedPreferences.OnSharedPreferenceChangeListener { _, changedKey ->
|
||||
if (changedKey == key) {
|
||||
trySend(valueProvider())
|
||||
}
|
||||
}
|
||||
|
||||
// Emit the initial value
|
||||
trySend(valueProvider())
|
||||
|
||||
registerOnSharedPreferenceChangeListener(listener)
|
||||
awaitClose {
|
||||
unregisterOnSharedPreferenceChangeListener(listener)
|
||||
}
|
||||
}.stateIn(scope, started, initial)
|
||||
Reference in New Issue
Block a user