release: v0.1.6 — retire le bouton de test VPN, README à jour

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
tuxgyverandClaude Sonnet 5 committed 2026-09-20 18:48:53 +02:00
1 parent 790397da0e
commit d7e55dbb91
5 files changed
+35 -43

No files matched your search

@@ -23,7 +23,6 @@ import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
@@ -34,14 +33,11 @@ import androidx.compose.ui.unit.sp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.jttools.datacontrol.log.AppLog
import com.jttools.datacontrol.service.FirewallVpnService
import com.jttools.datacontrol.ui.SystemActions
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
@Composable
fun JournalScreen(systemActions: SystemActions) {
fun JournalScreen() {
val context = LocalContext.current
val scope = rememberCoroutineScope()
val entries by AppLog.entries.collectAsStateWithLifecycle()
// État en direct du pare-feu, rafraîchi chaque seconde : première chose à regarder si le VPN n'apparaît pas.
@@ -67,18 +63,6 @@ fun JournalScreen(systemActions: SystemActions) {
}) { Text("Partager") }
OutlinedButton(onClick = { AppLog.clear() }) { Text("Effacer") }
}
Button(onClick = {
scope.launch {
if (!FirewallVpnService.isPrepared(context)) {
AppLog.i("Test VPN", "autorisation VPN absente : demande à l'utilisateur")
systemActions.requestVpnPermission { granted ->
AppLog.i("Test VPN", "autorisation VPN ${if (granted) "accordée" else "REFUSÉE"} — relancez le test")
}
return@launch
}
runVpnTest(context)
}
}, modifier = Modifier.fillMaxWidth()) { Text("Tester le VPN (10 s, coupe les autres applications)") }
LazyColumn(Modifier.fillMaxWidth().weight(1f), verticalArrangement = Arrangement.spacedBy(2.dp)) {
items(entries.asReversed()) { line ->
val color = when {
@@ -99,23 +83,3 @@ private fun liveStatus(context: Context): String = buildString {
appendLine("Conservation du journal : ${AppLog.RETENTION_DAYS} jours")
append("Attendu : le tunnel n'est monté QUE sur données mobiles, contrôle activé.")
}
/** Monte le tunnel 10 s quel que soit le réseau : prouve (ou infirme) que le VPN peut se monter sur cet appareil. */
private suspend fun runVpnTest(context: Context) {
val app = context.applicationContext
AppLog.i("Test VPN", "démarrage : demande de montage du tunnel (mode blocage total)")
try {
androidx.core.content.ContextCompat.startForegroundService(app, FirewallVpnService.startBlockAllIntent(app))
} catch (e: Exception) {
AppLog.e("Test VPN", "le service VPN n'a pas pu démarrer", e)
return
}
delay(3_000)
if (FirewallVpnService.tunnelActive) AppLog.i("Test VPN", "SUCCÈS : tunnel monté — l'icône clé doit être visible")
else AppLog.e("Test VPN", "ÉCHEC : tunnel non monté après 3 s (voir les lignes FirewallVpnService ci-dessus)")
delay(7_000)
runCatching {
androidx.core.content.ContextCompat.startForegroundService(app, FirewallVpnService.stopIntent(app))
}
AppLog.i("Test VPN", "fin du test : tunnel arrêté")
}
@@ -75,7 +75,7 @@ fun DataControlNavHost(systemActions: SystemActions) {
composable(Destination.Dashboard.route) { DashboardScreen(systemActions) }
composable(Destination.Settings.route) { SettingsScreen(systemActions) }
composable(Destination.Whitelist.route) { WhitelistScreen() }
composable(Destination.Journal.route) { JournalScreen(systemActions) }
composable(Destination.Journal.route) { JournalScreen() }
composable(Destination.About.route) { AboutScreen() }
}
}