Skip to content

Commit 3b62e9d

Browse files
ArnyminerZrfc2822
authored andcommitted
Added observeBoolean
Signed-off-by: Arnau Mora <[email protected]>
1 parent c88d65e commit 3b62e9d

File tree

2 files changed

+47
-36
lines changed

2 files changed

+47
-36
lines changed

app/src/main/kotlin/at/bitfire/davdroid/settings/SettingsManager.kt

+45
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ package at.bitfire.davdroid.settings
77
import android.content.Context
88
import android.util.NoSuchPropertyException
99
import androidx.annotation.AnyThread
10+
import androidx.compose.runtime.Composable
11+
import androidx.compose.runtime.DisposableEffect
12+
import androidx.compose.runtime.LaunchedEffect
13+
import androidx.compose.runtime.MutableState
14+
import androidx.compose.runtime.mutableStateOf
15+
import androidx.compose.runtime.remember
1016
import at.bitfire.davdroid.log.Logger
1117
import dagger.Module
1218
import dagger.Provides
@@ -180,6 +186,45 @@ class SettingsManager internal constructor(
180186
}
181187

182188

189+
/*** COMPOSE ***/
190+
191+
/**
192+
* A composable function that observes a boolean setting, and updates the state when the setting
193+
* changes.
194+
* @param key The key of the setting to observe.
195+
* @param valueMapper A function to modify the value before setting it to the state and storing.
196+
*/
197+
@Composable
198+
fun observeBoolean(
199+
key: String,
200+
valueMapper: (Boolean?) -> Boolean = { it == true }
201+
): MutableState<Boolean> {
202+
val state = remember {
203+
mutableStateOf(
204+
getBooleanOrNull(key).let(valueMapper)
205+
)
206+
}
207+
DisposableEffect(Unit) {
208+
val observer = object : OnChangeListener {
209+
override fun onSettingsChanged() {
210+
state.value = getBooleanOrNull(key).let(valueMapper)
211+
}
212+
}
213+
addOnChangeListener(observer)
214+
onDispose {
215+
removeOnChangeListener(observer)
216+
}
217+
}
218+
LaunchedEffect(state) {
219+
val value = getBooleanOrNull(key).let(valueMapper)
220+
if (state.value != value) {
221+
putBoolean(key, state.value.let(valueMapper))
222+
}
223+
}
224+
return state
225+
}
226+
227+
183228
interface OnChangeListener {
184229
/**
185230
* Will be called when something has changed in a [SettingsProvider].

app/src/main/kotlin/at/bitfire/davdroid/ui/intro/BatteryOptimizationsFragment.kt

+2-36
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,10 @@ import androidx.compose.material.OutlinedButton
3434
import androidx.compose.material.Switch
3535
import androidx.compose.material.Text
3636
import androidx.compose.runtime.Composable
37-
import androidx.compose.runtime.DisposableEffect
3837
import androidx.compose.runtime.LaunchedEffect
3938
import androidx.compose.runtime.MutableState
4039
import androidx.compose.runtime.getValue
4140
import androidx.compose.runtime.livedata.observeAsState
42-
import androidx.compose.runtime.mutableStateOf
43-
import androidx.compose.runtime.remember
4441
import androidx.compose.runtime.setValue
4542
import androidx.compose.ui.Alignment
4643
import androidx.compose.ui.Modifier
@@ -329,11 +326,11 @@ class BatteryOptimizationsFragment: Fragment() {
329326
val isWhitelisted = MutableLiveData<Boolean>()
330327
val dontShowBattery: MutableState<Boolean>
331328
@Composable
332-
get() = observePreference(key = HINT_BATTERY_OPTIMIZATIONS) { it == false }
329+
get() = settings.observeBoolean(key = HINT_BATTERY_OPTIMIZATIONS) { it == false }
333330

334331
val dontShowAutostart: MutableState<Boolean>
335332
@Composable
336-
get() = observePreference(key = HINT_AUTOSTART_PERMISSION) { it == false }
333+
get() = settings.observeBoolean(key = HINT_AUTOSTART_PERMISSION) { it == false }
337334

338335
fun checkWhitelisted() {
339336
val whitelisted = isWhitelisted(getApplication())
@@ -344,37 +341,6 @@ class BatteryOptimizationsFragment: Fragment() {
344341
if (whitelisted)
345342
settings.remove(HINT_BATTERY_OPTIMIZATIONS)
346343
}
347-
348-
@Composable
349-
private fun observePreference(
350-
key: String,
351-
map: (Boolean?) -> Boolean = { it == true }
352-
): MutableState<Boolean> {
353-
val state = remember {
354-
mutableStateOf(
355-
settings.getBooleanOrNull(key).let(map)
356-
)
357-
}
358-
DisposableEffect(Unit) {
359-
val observer = object : SettingsManager.OnChangeListener {
360-
override fun onSettingsChanged() {
361-
state.value = settings.getBooleanOrNull(key).let(map)
362-
}
363-
}
364-
settings.addOnChangeListener(observer)
365-
onDispose {
366-
settings.removeOnChangeListener(observer)
367-
}
368-
}
369-
LaunchedEffect(state) {
370-
val value = settings.getBooleanOrNull(key).let(map)
371-
if (state.value != value) {
372-
settings.putBoolean(key, state.value.let(map))
373-
}
374-
}
375-
return state
376-
}
377-
378344
}
379345

380346

0 commit comments

Comments
 (0)