diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7dd53b8..f126e5a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
# Changelog
+## v0.9.0 – 2026-10-25
+
+- 🛠️ **Modifié** — **Quatre modes réseau distincts** décidés par le serveur, affichés sur le tableau de bord et la notification : *Accès libre* (aucun filtrage), *Liste noire* (tout sauf les services bloqués), *Liste blanche* (rien sauf les domaines autorisés), *Internet coupé*. La liste noire ne s'applique désormais que dans le mode qui lui correspond.
+
## v0.8.0 – 2026-10-25
- ✨ **Ajouté** — **Verrouillage parental à distance** : depuis l'espace parents, le parent verrouille le téléphone sur un écran de blocage plein écran que seul un **code à usage unique** (généré par le serveur et dicté à l'enfant) permet de lever. En mode propriétaire, l'écran est épinglé (accueil et récents neutralisés) ; sinon il revient de lui-même si l'enfant tente de le quitter. Le parent peut aussi déverrouiller à distance.
diff --git a/README.md b/README.md
index cc35c57..d1ff3fc 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# DataControl
-🚀 v0.8.0 · 🤖 Android · 🟣 Kotlin · 🎨 Jetpack Compose · 🔒 WireGuard · 🛡️ mode propriétaire · 👨👩👧 contrôle parental · 🧪 tests · 📄 licence non déclarée
+🚀 v0.9.0 · 🤖 Android · 🟣 Kotlin · 🎨 Jetpack Compose · 🔒 WireGuard · 🛡️ mode propriétaire · 👨👩👧 contrôle parental · 🧪 tests · 📄 licence non déclarée
**DataControl** est l'application Android du téléphone de l'enfant. Elle relie le téléphone en permanence, par un tunnel **WireGuard**, au serveur de contrôle parental **familyd** du parent : tout le trafic (Wi-Fi comme données mobiles) passe par ce serveur, qui décide de ce qui passe. Sur le téléphone, elle bloque les applications interdites, compte le temps d'écran et suit la consommation de données mobiles.
diff --git a/app/src/main/java/com/jttools/datacontrol/guard/AppGuardService.kt b/app/src/main/java/com/jttools/datacontrol/guard/AppGuardService.kt
index b44865c..9df44b7 100644
--- a/app/src/main/java/com/jttools/datacontrol/guard/AppGuardService.kt
+++ b/app/src/main/java/com/jttools/datacontrol/guard/AppGuardService.kt
@@ -248,6 +248,7 @@ class AppGuardService : AccessibilityService() {
return when (snap.serverMode) {
"cut" -> "BLOQUÉ (Internet coupé par le serveur) [$net]" to true
"allowlist" -> "LIMITÉ (liste blanche du serveur) [$net]" to true
+ "blocklist" -> "filtré (liste noire du serveur) [$net]" to false
else -> "filtré par le serveur (accès libre) [$net]" to false
}
}
diff --git a/app/src/main/java/com/jttools/datacontrol/service/DataMonitorService.kt b/app/src/main/java/com/jttools/datacontrol/service/DataMonitorService.kt
index 9abd99c..a246f82 100644
--- a/app/src/main/java/com/jttools/datacontrol/service/DataMonitorService.kt
+++ b/app/src/main/java/com/jttools/datacontrol/service/DataMonitorService.kt
@@ -166,7 +166,8 @@ class DataMonitorService : LifecycleService() {
val dataState = when {
!settings.controlEnabled -> if (percent >= WARNING_THRESHOLD) DataState.WARNING else DataState.OK
- settings.serverMode != "open" -> DataState.CUT
+ // « blocklist » laisse tout passer (sauf la liste noire DNS) : traité comme « open », pas comme coupé.
+ settings.serverMode == "allowlist" || settings.serverMode == "cut" -> DataState.CUT
latestTransport == NetworkTransport.WIFI -> DataState.WIFI
percent >= WARNING_THRESHOLD -> DataState.WARNING
else -> DataState.OK
@@ -295,6 +296,7 @@ class DataMonitorService : LifecycleService() {
val modeLabel = when (snapshot.serverMode) {
"cut" -> getString(R.string.mode_cut)
"allowlist" -> getString(R.string.mode_allowlist)
+ "blocklist" -> getString(R.string.mode_blocklist)
else -> getString(R.string.mode_open)
}
val (emoji, stateLabel, color) = when {
diff --git a/app/src/main/java/com/jttools/datacontrol/ui/dashboard/DashboardScreen.kt b/app/src/main/java/com/jttools/datacontrol/ui/dashboard/DashboardScreen.kt
index 89150e1..4bf31bb 100644
--- a/app/src/main/java/com/jttools/datacontrol/ui/dashboard/DashboardScreen.kt
+++ b/app/src/main/java/com/jttools/datacontrol/ui/dashboard/DashboardScreen.kt
@@ -211,6 +211,7 @@ fun DashboardScreen(systemActions: SystemActions) {
val modeText = when (snapshot.serverMode) {
"cut" -> stringResource(R.string.mode_cut)
"allowlist" -> stringResource(R.string.mode_allowlist)
+ "blocklist" -> stringResource(R.string.mode_blocklist)
else -> stringResource(R.string.mode_open)
}
val tunnelText = when {
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 36cc0c0..a3bf07e 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -127,6 +127,7 @@
Activer le service
Accès libre
+ Liste noire (certains services bloqués)
Liste blanche seulement
Internet coupé
Tunnel
diff --git a/version.properties b/version.properties
index 9412b5d..3f38107 100644
--- a/version.properties
+++ b/version.properties
@@ -1,2 +1,2 @@
-versionName=0.8.0
-versionCode=18
+versionName=0.9.0
+versionCode=19