From 30fb0d2dd2fe77c23d3ade51b4f57d9f79d9d633 Mon Sep 17 00:00:00 2001 From: machiav3lli Date: Sat, 17 Sep 2022 22:08:35 +0200 Subject: [PATCH] Update: Manage dependencies decentralized --- .../ui/compose/components/prefs/BasicPrefs.kt | 51 ++++++++++++++++--- .../compose/components/prefs/PrefsBuilder.kt | 13 +---- .../ui/compose/components/prefs/PrefsGroup.kt | 9 ---- 3 files changed, 46 insertions(+), 27 deletions(-) diff --git a/src/main/kotlin/com/machiav3lli/fdroid/ui/compose/components/prefs/BasicPrefs.kt b/src/main/kotlin/com/machiav3lli/fdroid/ui/compose/components/prefs/BasicPrefs.kt index 68ab26cd..b361e7c8 100644 --- a/src/main/kotlin/com/machiav3lli/fdroid/ui/compose/components/prefs/BasicPrefs.kt +++ b/src/main/kotlin/com/machiav3lli/fdroid/ui/compose/components/prefs/BasicPrefs.kt @@ -34,6 +34,7 @@ import androidx.compose.ui.unit.sp import com.machiav3lli.fdroid.content.BooleanPrefsMeta import com.machiav3lli.fdroid.content.NonBooleanPrefsMeta import com.machiav3lli.fdroid.content.Preferences +import com.machiav3lli.fdroid.content.PrefsDependencies import com.machiav3lli.fdroid.content.PrefsEntries import com.machiav3lli.fdroid.ui.compose.utils.addIf import com.machiav3lli.fdroid.utility.Utils @@ -124,11 +125,25 @@ fun SwitchPreference( prefKey: Preferences.Key, index: Int = 0, groupSize: Int = 1, - enabled: Boolean = true, onCheckedChange: ((Boolean) -> Unit) = {}, ) { val context = LocalContext.current val (checked, check) = remember(Preferences[prefKey]) { mutableStateOf(Preferences[prefKey]) } + val dependency = PrefsDependencies[prefKey] + var isEnabled by remember { + mutableStateOf(dependency?.let { Preferences[dependency] != it.default.value } ?: true) + } + + SideEffect { + CoroutineScope(Dispatchers.Default).launch { + Preferences.subject.collect { + when (it) { + dependency -> isEnabled = Preferences[it] != it.default.value + else -> {} + } + } + } + } BasePreference( modifier = modifier, @@ -136,7 +151,7 @@ fun SwitchPreference( summaryId = BooleanPrefsMeta[prefKey]?.second ?: -1, index = index, groupSize = groupSize, - isEnabled = enabled, + isEnabled = isEnabled, onClick = { onCheckedChange(!checked) Preferences[prefKey] = !checked @@ -152,22 +167,36 @@ fun SwitchPreference( Preferences[prefKey] = it check(it) }, - enabled = enabled, + enabled = isEnabled, ) } ) } @Composable -fun StringPreference( +fun LanguagePreference( modifier: Modifier = Modifier, prefKey: Preferences.Key, index: Int = 1, groupSize: Int = 1, - isEnabled: Boolean = true, onClick: (() -> Unit) = {}, ) { val context = LocalContext.current + val dependency = PrefsDependencies[prefKey] + var isEnabled by remember { + mutableStateOf(dependency?.let { Preferences[dependency] != it.default.value } ?: true) + } + + SideEffect { + CoroutineScope(Dispatchers.Default).launch { + Preferences.subject.collect { + when (it) { + dependency -> isEnabled = Preferences[it] != it.default.value + else -> {} + } + } + } + } BasePreference( modifier = modifier, @@ -186,9 +215,12 @@ fun EnumPreference( prefKey: Preferences.Key>, index: Int = 1, groupSize: Int = 1, - isEnabled: Boolean = true, onClick: (() -> Unit) = {}, ) { + val dependency = PrefsDependencies[prefKey] + var isEnabled by remember { + mutableStateOf(dependency?.let { Preferences[dependency] != it.default.value } ?: true) + } var prefValue by remember { mutableStateOf(Preferences[prefKey]) } @@ -197,6 +229,7 @@ fun EnumPreference( Preferences.subject.collect { when (it) { prefKey -> prefValue = Preferences[prefKey] + dependency -> isEnabled = Preferences[it] != it.default.value else -> {} } } @@ -221,9 +254,12 @@ fun IntPreference( prefKey: Preferences.Key, index: Int = 1, groupSize: Int = 1, - isEnabled: Boolean = true, onClick: (() -> Unit) = {}, ) { + val dependency = PrefsDependencies[prefKey] + var isEnabled by remember { + mutableStateOf(dependency?.let { Preferences[dependency] != it.default.value } ?: true) + } var prefValue by remember { mutableStateOf(Preferences[prefKey]) } @@ -232,6 +268,7 @@ fun IntPreference( Preferences.subject.collect { when (it) { prefKey -> prefValue = Preferences[prefKey] + dependency -> isEnabled = Preferences[it] != it.default.value else -> {} } } diff --git a/src/main/kotlin/com/machiav3lli/fdroid/ui/compose/components/prefs/PrefsBuilder.kt b/src/main/kotlin/com/machiav3lli/fdroid/ui/compose/components/prefs/PrefsBuilder.kt index aaceb939..1cdada30 100644 --- a/src/main/kotlin/com/machiav3lli/fdroid/ui/compose/components/prefs/PrefsBuilder.kt +++ b/src/main/kotlin/com/machiav3lli/fdroid/ui/compose/components/prefs/PrefsBuilder.kt @@ -1,15 +1,12 @@ package com.machiav3lli.fdroid.ui.compose.components.prefs import androidx.compose.runtime.Composable -import androidx.compose.runtime.snapshots.SnapshotStateList import com.machiav3lli.fdroid.content.Preferences -import com.machiav3lli.fdroid.content.PrefsDependencies @Composable fun PrefsBuilder( prefKey: Preferences.Key<*>, onDialogPref: (Preferences.Key<*>) -> Unit, - enabledSetState: SnapshotStateList>, index: Int, size: Int ) { @@ -18,14 +15,8 @@ fun PrefsBuilder( prefKey = prefKey as Preferences.Key, index = index, groupSize = size, - enabled = enabledSetState.contains(prefKey) - ) { - val dependents = - PrefsDependencies.entries.filter { it.value == prefKey }.map { it.key }.toSet() - if (it) enabledSetState.addAll(dependents) - else enabledSetState.removeAll(dependents) - } - prefKey.default is Preferences.Value.StringValue -> StringPreference( + ) + prefKey.default is Preferences.Value.StringValue -> LanguagePreference( prefKey = prefKey as Preferences.Key, index = index, groupSize = size, diff --git a/src/main/kotlin/com/machiav3lli/fdroid/ui/compose/components/prefs/PrefsGroup.kt b/src/main/kotlin/com/machiav3lli/fdroid/ui/compose/components/prefs/PrefsGroup.kt index cb259df3..984f37bb 100644 --- a/src/main/kotlin/com/machiav3lli/fdroid/ui/compose/components/prefs/PrefsGroup.kt +++ b/src/main/kotlin/com/machiav3lli/fdroid/ui/compose/components/prefs/PrefsGroup.kt @@ -13,15 +13,12 @@ import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.mutableStateListOf -import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.machiav3lli.fdroid.content.Preferences -import com.machiav3lli.fdroid.content.PrefsDependencies @Composable fun PreferenceGroup( @@ -49,11 +46,6 @@ fun PreferenceGroup( onPrefDialog: (Preferences.Key<*>) -> Unit, ) { val size = keys.size - val enabledList = remember() { - mutableStateListOf( - *keys.filter { PrefsDependencies[it]?.let { Preferences[it] } ?: true }.toTypedArray() - ) - } PreferenceGroup( modifier = modifier, @@ -63,7 +55,6 @@ fun PreferenceGroup( PrefsBuilder( item, onPrefDialog, - enabledList, index, size )