Skip to content

Commit 8aef066

Browse files
ArnyminerZrfc2822
authored andcommitted
Simplified settings interaction
Signed-off-by: Arnau Mora Gras <[email protected]>
1 parent 3b62e9d commit 8aef066

File tree

2 files changed

+33
-55
lines changed

2 files changed

+33
-55
lines changed

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

-45
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,6 @@ 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
1610
import at.bitfire.davdroid.log.Logger
1711
import dagger.Module
1812
import dagger.Provides
@@ -186,45 +180,6 @@ class SettingsManager internal constructor(
186180
}
187181

188182

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-
228183
interface OnChangeListener {
229184
/**
230185
* Will be called when something has changed in a [SettingsProvider].

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

+33-10
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ import androidx.compose.runtime.LaunchedEffect
3838
import androidx.compose.runtime.MutableState
3939
import androidx.compose.runtime.getValue
4040
import androidx.compose.runtime.livedata.observeAsState
41+
import androidx.compose.runtime.mutableStateOf
42+
import androidx.compose.runtime.remember
4143
import androidx.compose.runtime.setValue
4244
import androidx.compose.ui.Alignment
4345
import androidx.compose.ui.Modifier
@@ -47,6 +49,7 @@ import androidx.compose.ui.res.stringResource
4749
import androidx.compose.ui.tooling.preview.Preview
4850
import androidx.compose.ui.unit.dp
4951
import androidx.core.content.getSystemService
52+
import androidx.databinding.ObservableBoolean
5053
import androidx.fragment.app.Fragment
5154
import androidx.fragment.app.viewModels
5255
import androidx.lifecycle.AndroidViewModel
@@ -86,8 +89,8 @@ class BatteryOptimizationsFragment: Fragment() {
8689
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
8790
setContent {
8891
MdcTheme {
89-
var dontShowBattery by model.dontShowBattery
90-
var dontShowAutostart by model.dontShowAutostart
92+
var dontShowBattery by remember { mutableStateOf(model.dontShowBattery.get()) }
93+
var dontShowAutostart by remember { mutableStateOf(model.dontShowAutostart.get()) }
9194
val shouldBeWhitelisted by model.shouldBeWhitelisted.observeAsState(false)
9295
val isWhitelisted by model.isWhitelisted.observeAsState(false)
9396

@@ -98,12 +101,18 @@ class BatteryOptimizationsFragment: Fragment() {
98101

99102
Content(
100103
dontShowBattery = dontShowBattery,
101-
onChangeDontShowBattery = { dontShowBattery = it },
104+
onChangeDontShowBattery = {
105+
model.dontShowBattery.set(it)
106+
dontShowBattery = it
107+
},
102108
isWhitelisted = isWhitelisted,
103109
shouldBeWhitelisted = shouldBeWhitelisted,
104110
onChangeShouldBeWhitelisted = model.shouldBeWhitelisted::postValue,
105111
dontShowAutostart = dontShowAutostart,
106-
onChangeDontShowAutostart = { dontShowAutostart = it },
112+
onChangeDontShowAutostart = {
113+
model.dontShowAutostart.set(it)
114+
dontShowAutostart = it
115+
},
107116
manufacturerWarning = Model.manufacturerWarning
108117
)
109118
}
@@ -324,13 +333,27 @@ class BatteryOptimizationsFragment: Fragment() {
324333

325334
val shouldBeWhitelisted = MutableLiveData<Boolean>()
326335
val isWhitelisted = MutableLiveData<Boolean>()
327-
val dontShowBattery: MutableState<Boolean>
328-
@Composable
329-
get() = settings.observeBoolean(key = HINT_BATTERY_OPTIMIZATIONS) { it == false }
336+
val dontShowBattery = object: ObservableBoolean() {
337+
override fun get() = settings.getBooleanOrNull(HINT_BATTERY_OPTIMIZATIONS) == false
338+
override fun set(dontShowAgain: Boolean) {
339+
if (dontShowAgain)
340+
settings.putBoolean(HINT_BATTERY_OPTIMIZATIONS, false)
341+
else
342+
settings.remove(HINT_BATTERY_OPTIMIZATIONS)
343+
notifyChange()
344+
}
345+
}
330346

331-
val dontShowAutostart: MutableState<Boolean>
332-
@Composable
333-
get() = settings.observeBoolean(key = HINT_AUTOSTART_PERMISSION) { it == false }
347+
val dontShowAutostart = object: ObservableBoolean() {
348+
override fun get() = settings.getBooleanOrNull(HINT_AUTOSTART_PERMISSION) == false
349+
override fun set(dontShowAgain: Boolean) {
350+
if (dontShowAgain)
351+
settings.putBoolean(HINT_AUTOSTART_PERMISSION, false)
352+
else
353+
settings.remove(HINT_AUTOSTART_PERMISSION)
354+
notifyChange()
355+
}
356+
}
334357

335358
fun checkWhitelisted() {
336359
val whitelisted = isWhitelisted(getApplication())

0 commit comments

Comments
 (0)