release: v0.1.8 — configuration Firebase saisie dans l'application

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
tuxgyverandClaude Sonnet 5 committed 2026-09-21 13:39:37 +02:00
1 parent eecad06eea
commit f33776bbb5
14 files changed
+210 -53

No files matched your search

@@ -10,6 +10,8 @@ import com.jttools.datacontrol.data.SettingsRepository
import com.jttools.datacontrol.data.TrafficDay
import com.jttools.datacontrol.log.AppLog
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flatMapLatest
@@ -44,6 +46,7 @@ class RemoteSync @Inject constructor(
private val installedApps: InstalledAppsRepository
) {
val available: Boolean get() = gateway.enabled
val gatewayState = gateway.state
private fun deviceDoc(s: AppSettings): DocumentReference? {
val db = gateway.db ?: return null
@@ -82,37 +85,43 @@ class RemoteSync @Inject constructor(
settingsRepository.setPairing(null, null)
}
/** Écoute les consignes du parent et les applique aux réglages locaux. */
/** Écoute les consignes du parent et les applique ; relancé à chaque (ré)initialisation de Firebase. */
@OptIn(ExperimentalCoroutinesApi::class)
fun start(scope: CoroutineScope) {
if (!gateway.enabled) return
scope.launch {
settingsRepository.settingsFlow
.map { it.familyId to it.deviceId }
.distinctUntilChanged()
.flatMapLatest { (fid, did) ->
if (fid == null || did == null) flowOf(null) else configFlow(fid, did)
}
.collect { cfg -> if (cfg != null) apply(cfg) }
}
scope.launch {
// Si le parent supprime l'appareil de la famille, on se dissocie localement (plus de règles,
// plus d'envois qui échoueraient en silence).
settingsRepository.settingsFlow
.map { it.familyId to it.deviceId }
.distinctUntilChanged()
.flatMapLatest { (fid, did) -> if (fid == null || did == null) flowOf(null) else existenceFlow(fid, did) }
.collect { exists ->
if (exists == false) {
AppLog.w("FamilyControl", "Appareil supprimé par le parent : dissociation locale")
settingsRepository.setPairing(null, null)
gateway.state.collectLatest { st ->
if (!st.enabled) return@collectLatest
coroutineScope {
launch {
settingsRepository.settingsFlow
.map { it.familyId to it.deviceId }
.distinctUntilChanged()
.flatMapLatest { (fid, did) ->
if (fid == null || did == null) flowOf(null) else configFlow(fid, did)
}
.collect { cfg -> if (cfg != null) apply(cfg) }
}
launch {
// Si le parent supprime l'appareil de la famille, on se dissocie localement (plus de règles,
// plus d'envois qui échoueraient en silence).
settingsRepository.settingsFlow
.map { it.familyId to it.deviceId }
.distinctUntilChanged()
.flatMapLatest { (fid, did) -> if (fid == null || did == null) flowOf(null) else existenceFlow(fid, did) }
.collect { exists ->
if (exists == false) {
AppLog.w("FamilyControl", "Appareil supprimé par le parent : dissociation locale")
settingsRepository.setPairing(null, null)
}
}
}
launch {
// Liste des applications installées, pour que le parent puisse choisir lesquelles autoriser.
settingsRepository.settingsFlow.map { it.isPaired }.distinctUntilChanged().collect { paired ->
if (paired) pushApps()
}
}
}
}
scope.launch {
// Liste des applications installées, pour que le parent puisse choisir lesquelles autoriser.
settingsRepository.settingsFlow.map { it.isPaired }.distinctUntilChanged().collect { paired ->
if (paired) pushApps()
}
}
}