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:
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() }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user