Skip to content

Commit 193a32b

Browse files
committed
Fix: Non-reactive dependant NeoPrefs
1 parent eb1eadd commit 193a32b

5 files changed

Lines changed: 46 additions & 26 deletions

File tree

src/main/java/com/machiav3lli/backup/data/entity/PreferenceItem.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import androidx.compose.ui.graphics.Color
1010
import androidx.compose.ui.graphics.vector.ImageVector
1111
import com.machiav3lli.backup.NeoApp
1212
import com.machiav3lli.backup.data.preferences.PrefDelegate
13+
import com.machiav3lli.backup.data.preferences.PrefsIsEnabled
1314
import com.machiav3lli.backup.data.preferences.traceDebug
1415
import com.machiav3lli.backup.data.preferences.tracePrefs
1516
import com.machiav3lli.backup.manager.handler.LogsHandler
@@ -662,7 +663,8 @@ class NeoPrefAdapter(val dsPref: PrefDelegate<out Any>) : Pref(
662663
summary = dsPref.summary,
663664
icon = dsPref.icon,
664665
iconTint = dsPref.iconTint?.let { tint -> { p -> tint(dsPref) } },
665-
enableIf = dsPref.enableIf,
666+
enableIf = PrefsIsEnabled[dsPref.key]?.let { { it.invoke(NeoApp.context) } }
667+
?: { true },
666668
onChanged = {
667669
dsPref.onChange?.invoke(dsPref)
668670
},

src/main/java/com/machiav3lli/backup/data/preferences/NeoPref.kt

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ class PrefBoolean(
4040
UI: PrefUI? = null,
4141
icon: ImageVector? = null,
4242
iconTint: ((PrefDelegate<out Any>) -> Color)? = null,
43-
enableIf: (() -> Boolean)? = null,
4443
onChanged: (suspend (PrefDelegate<out Any>) -> Unit)? = null,
4544
) : PrefDelegate<Boolean>(
4645
private = private,
@@ -53,7 +52,6 @@ class PrefBoolean(
5352
},
5453
icon = icon,
5554
iconTint = iconTint,
56-
enableIf = enableIf,
5755
onChange = onChanged,
5856
dataStore = dataStore,
5957
dataStoreKey = dataStoreKey,
@@ -71,7 +69,6 @@ class PrefInt(
7169
icon: ImageVector? = null,
7270
iconTint: ((PrefDelegate<out Any>) -> Color)? = null,
7371
val entries: List<Int>,
74-
enableIf: (() -> Boolean)? = null,
7572
onChanged: (suspend (PrefDelegate<out Any>) -> Unit)? = null,
7673
) : PrefDelegate<Int>(
7774
private = private,
@@ -84,7 +81,6 @@ class PrefInt(
8481
},
8582
icon = icon,
8683
iconTint = iconTint,
87-
enableIf = enableIf,
8884
onChange = onChanged,
8985
dataStore = dataStore,
9086
dataStoreKey = dataStoreKey,
@@ -99,7 +95,6 @@ open class PrefString(
9995
UI: PrefUI? = null,
10096
icon: ImageVector? = null,
10197
iconTint: ((PrefDelegate<out Any>) -> Color)? = null,
102-
enableIf: (() -> Boolean)? = null,
10398
onChanged: (suspend (PrefDelegate<out Any>) -> Unit)? = null,
10499
dataStore: DataStore<Preferences>,
105100
dataStoreKey: Preferences.Key<String>,
@@ -119,7 +114,6 @@ open class PrefString(
119114
},
120115
icon = icon,
121116
iconTint = iconTint,
122-
enableIf = enableIf,
123117
onChange = onChanged,
124118
dataStore = dataStore,
125119
dataStoreKey = dataStoreKey,
@@ -136,7 +130,7 @@ class PrefEditString(
136130
UI: PrefUI? = null,
137131
icon: ImageVector? = null,
138132
iconTint: ((PrefDelegate<out Any>) -> Color)? = null,
139-
enableIf: (() -> Boolean)? = null,
133+
enableIf: () -> Boolean = { true },
140134
onChanged: (suspend (PrefDelegate<out Any>) -> Unit)? = null,
141135
) : PrefString(
142136
private = private,
@@ -149,7 +143,6 @@ class PrefEditString(
149143
},
150144
icon = icon,
151145
iconTint = iconTint,
152-
enableIf = enableIf,
153146
onChanged = onChanged,
154147
dataStore = dataStore,
155148
dataStoreKey = dataStoreKey,
@@ -167,7 +160,7 @@ class PrefList(
167160
icon: ImageVector? = null,
168161
iconTint: ((PrefDelegate<out Any>) -> Color)? = null,
169162
val entries: Map<String, String>,
170-
enableIf: (() -> Boolean)? = null,
163+
enableIf: () -> Boolean = { true },
171164
onChanged: (suspend (PrefDelegate<out Any>) -> Unit)? = null,
172165
) : PrefString(
173166
private = private,
@@ -185,7 +178,6 @@ class PrefList(
185178
},
186179
icon = icon,
187180
iconTint = iconTint,
188-
enableIf = enableIf,
189181
onChanged = onChanged,
190182
dataStore = dataStore,
191183
dataStoreKey = dataStoreKey,
@@ -202,7 +194,6 @@ class PrefStringSet(
202194
UI: PrefUI? = null,
203195
icon: ImageVector? = null,
204196
iconTint: ((PrefDelegate<out Any>) -> Color)? = null,
205-
enableIf: (() -> Boolean)? = null,
206197
onChanged: (suspend (PrefDelegate<out Any>) -> Unit)? = null,
207198
) : PrefDelegate<Set<String>>(
208199
private = private,
@@ -215,7 +206,6 @@ class PrefStringSet(
215206
},
216207
icon = icon,
217208
iconTint = iconTint,
218-
enableIf = enableIf,
219209
onChange = onChanged,
220210
dataStore = dataStore,
221211
dataStoreKey = dataStoreKey,
@@ -233,7 +223,6 @@ class PrefEnum(
233223
icon: ImageVector? = null,
234224
iconTint: ((PrefDelegate<out Any>) -> Color)? = null,
235225
val entries: Map<Int, Int>,
236-
enableIf: (() -> Boolean)? = null,
237226
onChanged: (suspend (PrefDelegate<out Any>) -> Unit)? = null,
238227
) : PrefDelegate<Int>(
239228
private = private,
@@ -251,7 +240,6 @@ class PrefEnum(
251240
},
252241
icon = icon,
253242
iconTint = iconTint,
254-
enableIf = enableIf,
255243
onChange = onChanged,
256244
dataStore = dataStore,
257245
dataStoreKey = dataStoreKey,
@@ -268,12 +256,10 @@ abstract class PrefDelegate<T : Any>(
268256
val icon: ImageVector? = null,
269257
var iconTint: ((PrefDelegate<out Any>) -> Color)? = null,
270258
val UI: PrefUI? = null,
271-
val enableIf: (() -> Boolean)? = null,
272259
val onChange: (suspend (PrefDelegate<out Any>) -> Unit)? = null,
273260
) {
274261
val key: String = run {
275-
val parts = dataStoreKey.name.split(".", limit = 2)
276-
if (parts.size == 2) parts[1] else parts[0]
262+
dataStoreKey.name
277263
}
278264

279265
val group: String = run {

src/main/java/com/machiav3lli/backup/data/preferences/NeoPrefs.kt

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import androidx.compose.ui.platform.LocalContext
1111
import androidx.datastore.core.DataStore
1212
import androidx.datastore.preferences.core.PreferenceDataStoreFactory
1313
import androidx.datastore.preferences.core.Preferences
14+
import androidx.datastore.preferences.core.booleanPreferencesKey
1415
import androidx.datastore.preferences.preferencesDataStoreFile
1516
import com.machiav3lli.backup.BACKUP_DIRECTORY_INTENT
1617
import com.machiav3lli.backup.BACKUP_FILTER_DEFAULT
@@ -52,13 +53,14 @@ import com.machiav3lli.backup.utils.backupFolderExists
5253
import com.machiav3lli.backup.utils.extensions.Android
5354
import com.machiav3lli.backup.utils.extensions.combine
5455
import com.machiav3lli.backup.utils.getLanguageList
55-
import com.machiav3lli.backup.utils.isBiometricLockAvailable
56-
import com.machiav3lli.backup.utils.isDeviceLockAvailable
5756
import com.machiav3lli.backup.utils.recreateActivities
5857
import com.machiav3lli.backup.utils.restartApp
5958
import com.machiav3lli.backup.utils.setBackupDir
6059
import com.machiav3lli.backup.utils.setCustomTheme
6160
import kotlinx.coroutines.flow.Flow
61+
import kotlinx.coroutines.flow.distinctUntilChanged
62+
import kotlinx.coroutines.flow.flowOf
63+
import kotlinx.coroutines.flow.map
6264
import org.koin.core.component.KoinComponent
6365
import org.koin.core.component.inject
6466
import org.koin.core.module.dsl.singleOf
@@ -388,7 +390,6 @@ class NeoPrefs private constructor(val context: Context) : KoinComponent {
388390
summaryId = R.string.prefs_devicelock_summary,
389391
icon = Phosphor.Lock,
390392
defaultValue = false,
391-
enableIf = { context.isDeviceLockAvailable() },
392393
dataStore = dataStore,
393394
dataStoreKey = UserPrefKey.DEVICE_LOCK,
394395
)
@@ -398,7 +399,6 @@ class NeoPrefs private constructor(val context: Context) : KoinComponent {
398399
summaryId = R.string.prefs_biometriclock_summary,
399400
icon = Phosphor.FingerprintSimple,
400401
defaultValue = false,
401-
enableIf = { context.isBiometricLockAvailable() && deviceLock.value },
402402
dataStore = dataStore,
403403
dataStoreKey = UserPrefKey.BIOMETRIC_LOCK,
404404
)
@@ -481,6 +481,12 @@ class NeoPrefs private constructor(val context: Context) : KoinComponent {
481481
//recreateActivities()
482482
}
483483

484+
fun observeDependency(key: String) = key.takeIf { it.isNotBlank() }?.let {
485+
dataStore.data.map { preferences ->
486+
preferences[booleanPreferencesKey(key)] ?: false
487+
}.distinctUntilChanged()
488+
} ?: flowOf(true)
489+
484490
fun homeSortFilterFlow(): Flow<SortFilterModel> = combine(
485491
sortHome.flow(),
486492
sortAscHome.flow(),
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.machiav3lli.backup.data.preferences
2+
3+
import android.content.Context
4+
import com.machiav3lli.backup.ui.pages.pref_deviceLock
5+
import com.machiav3lli.backup.utils.isBiometricLockAvailable
6+
import com.machiav3lli.backup.utils.isDeviceLockAvailable
7+
8+
val PrefsIsEnabled: Map<String, (Context) -> Boolean> = mapOf(
9+
UserPrefKey.DEVICE_LOCK.name to { it.isDeviceLockAvailable() },
10+
UserPrefKey.BIOMETRIC_LOCK.name to { it.isBiometricLockAvailable() && pref_deviceLock.value },
11+
)
12+
13+
val PrefsDependency: Map<String, String> = mapOf(
14+
UserPrefKey.BIOMETRIC_LOCK.name to UserPrefKey.DEVICE_LOCK.name,
15+
)

src/main/java/com/machiav3lli/backup/ui/compose/component/Preference.kt

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ import androidx.compose.material3.Switch
2828
import androidx.compose.material3.Text
2929
import androidx.compose.runtime.Composable
3030
import androidx.compose.runtime.LaunchedEffect
31+
import androidx.compose.runtime.collectAsState
32+
import androidx.compose.runtime.derivedStateOf
3133
import androidx.compose.runtime.getValue
3234
import androidx.compose.runtime.mutableStateOf
3335
import androidx.compose.runtime.remember
@@ -38,6 +40,7 @@ import androidx.compose.ui.draw.alpha
3840
import androidx.compose.ui.draw.clip
3941
import androidx.compose.ui.graphics.Color
4042
import androidx.compose.ui.graphics.vector.ImageVector
43+
import androidx.compose.ui.platform.LocalContext
4144
import androidx.compose.ui.res.stringResource
4245
import androidx.compose.ui.tooling.preview.Preview
4346
import androidx.compose.ui.unit.dp
@@ -53,6 +56,7 @@ import com.machiav3lli.backup.data.entity.PasswordPref
5356
import com.machiav3lli.backup.data.entity.Pref
5457
import com.machiav3lli.backup.data.entity.StringEditPref
5558
import com.machiav3lli.backup.data.entity.StringPref
59+
import com.machiav3lli.backup.data.preferences.NeoPrefs
5660
import com.machiav3lli.backup.data.preferences.PrefBoolean
5761
import com.machiav3lli.backup.data.preferences.PrefDelegate
5862
import com.machiav3lli.backup.data.preferences.PrefEditString
@@ -61,13 +65,16 @@ import com.machiav3lli.backup.data.preferences.PrefInt
6165
import com.machiav3lli.backup.data.preferences.PrefList
6266
import com.machiav3lli.backup.data.preferences.PrefString
6367
import com.machiav3lli.backup.data.preferences.PrefStringSet
68+
import com.machiav3lli.backup.data.preferences.PrefsDependency
69+
import com.machiav3lli.backup.data.preferences.PrefsIsEnabled
6470
import com.machiav3lli.backup.data.preferences.traceDebug
6571
import com.machiav3lli.backup.ui.compose.icons.Phosphor
6672
import com.machiav3lli.backup.ui.compose.icons.phosphor.FolderNotch
6773
import com.machiav3lli.backup.ui.compose.icons.phosphor.Hash
6874
import com.machiav3lli.backup.ui.compose.ifThen
6975
import com.machiav3lli.backup.utils.backupFolderExists
7076
import kotlinx.coroutines.delay
77+
import org.koin.compose.koinInject
7178
import kotlin.math.roundToInt
7279

7380
const val UNDEFINED_VALUE = "---"
@@ -108,8 +115,8 @@ fun BasePreference(
108115
interactionSource: MutableInteractionSource? = null,
109116
onClick: (() -> Unit)? = null,
110117
) {
111-
val isEnabled by remember(pref.enableIf?.invoke() ?: true) {
112-
mutableStateOf(pref.enableIf?.invoke() ?: true)
118+
val isEnabled by remember(pref.enableIf) {
119+
derivedStateOf { pref.enableIf?.invoke() ?: true }
113120
}
114121

115122
val base = index.toFloat() / groupSize
@@ -220,8 +227,12 @@ fun BasePreference(
220227
interactionSource: MutableInteractionSource? = null,
221228
onClick: (() -> Unit)? = null,
222229
) {
223-
val isEnabled by remember(pref.enableIf?.invoke() ?: true) {
224-
mutableStateOf(pref.enableIf?.invoke() ?: true)
230+
val context = LocalContext.current
231+
val prefs = koinInject<NeoPrefs>()
232+
val dependencyState by prefs.observeDependency(PrefsDependency[pref.key].orEmpty())
233+
.collectAsState(initial = true)
234+
val isEnabled by remember(dependencyState) {
235+
mutableStateOf(PrefsIsEnabled[pref.key]?.invoke(context) ?: true)
225236
}
226237

227238
val base = index.toFloat() / groupSize

0 commit comments

Comments
 (0)