From 268123344981c2d2a7ebbf19ff03a2ba51b22407 Mon Sep 17 00:00:00 2001 From: Denozordec Date: Sat, 10 Oct 2026 00:32:24 +0700 Subject: [PATCH] android: route check results as cards with status pills --- .../android/ui/compose/RouteCheckScreen.kt | 93 ++++++++++++------- .../app/src/main/res/values-de/strings.xml | 1 + .../app/src/main/res/values-ru/strings.xml | 1 + .../app/src/main/res/values/strings.xml | 1 + 4 files changed, 61 insertions(+), 35 deletions(-) diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/RouteCheckScreen.kt b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/RouteCheckScreen.kt index c80cfb9b6..631f6c539 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/RouteCheckScreen.kt +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/RouteCheckScreen.kt @@ -33,6 +33,11 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.unit.dp import kotlinx.coroutines.launch +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import org.strongswan.android.ui.compose.components.ShxStatusPill +import org.strongswan.android.ui.compose.components.ShxSectionCard +import org.strongswan.android.ui.compose.theme.LocalShxStatusColors import org.strongswan.android.R import org.strongswan.android.logic.CharonVpnService import org.strongswan.android.logic.routing.RouteCheck @@ -98,50 +103,68 @@ fun RouteCheckScreen() @Composable private fun RouteCheckResult(report: RouteCheck.Report) { - Column(modifier = Modifier.padding(top = ShxSpacing.md)) + val status = LocalShxStatusColors.current + Column( + modifier = Modifier.padding(top = ShxSpacing.lg), + verticalArrangement = Arrangement.spacedBy(ShxSpacing.md), + ) { if (!report.vpnNetworkFound) { - Text( + ShxStatusPill( text = stringResource(R.string.route_check_no_vpn), - style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.error, + containerColor = status.disconnectedContainer, + contentColor = status.onDisconnectedContainer, + shape = MaterialTheme.shapes.small, + style = MaterialTheme.typography.labelMedium, ) } - RouteCheckRow(stringResource(R.string.route_check_via_vpn_dns), report.vpnDnsIps) - RouteCheckRow(stringResource(R.string.route_check_via_direct_dns), report.directDnsIps) - Text( - text = stringResource(R.string.route_check_routes), - style = MaterialTheme.typography.titleSmall, - modifier = Modifier.padding(top = 10.dp), - ) - for (route in report.routes) + ShxSectionCard(title = stringResource(R.string.route_check_dns_section)) { - val label = stringResource( - when (route.kind) + RouteCheckRow(stringResource(R.string.route_check_via_vpn_dns), report.vpnDnsIps) + RouteCheckRow(stringResource(R.string.route_check_via_direct_dns), report.directDnsIps) + } + ShxSectionCard(title = stringResource(R.string.route_check_routes)) + { + for (route in report.routes) + { + val label = stringResource( + when (route.kind) + { + RouteCheck.RouteKind.TUNNEL -> R.string.route_verdict_tunnel + RouteCheck.RouteKind.DIRECT_RU -> R.string.route_verdict_direct + RouteCheck.RouteKind.TUNNEL_DNS -> R.string.route_verdict_dns + }, + ) + val direct = route.kind == RouteCheck.RouteKind.DIRECT_RU + Row( + verticalAlignment = androidx.compose.ui.Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(ShxSpacing.md), + ) { - RouteCheck.RouteKind.TUNNEL -> R.string.route_verdict_tunnel - RouteCheck.RouteKind.DIRECT_RU -> R.string.route_verdict_direct - RouteCheck.RouteKind.TUNNEL_DNS -> R.string.route_verdict_dns - }, - ) - Text( - text = "${route.ip} — $label", - style = MaterialTheme.typography.bodySmall, - fontFamily = FontFamily.Monospace, - modifier = Modifier.padding(top = 2.dp), - ) - } - if (report.routes.isEmpty()) - { - Text( - text = stringResource(R.string.route_check_resolve_failed), - style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.error, - ) + Text( + text = route.ip, + style = MaterialTheme.typography.bodySmall, + fontFamily = FontFamily.Monospace, + modifier = Modifier.weight(1f), + ) + ShxStatusPill( + text = label, + containerColor = if (direct) status.connectingContainer else status.connectedContainer, + contentColor = if (direct) status.onConnectingContainer else status.onConnectedContainer, + ) + } + } + if (report.routes.isEmpty()) + { + Text( + text = stringResource(R.string.route_check_resolve_failed), + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.error, + ) + } } } - Spacer(Modifier.height(ShxSpacing.sm)) } @Composable @@ -150,7 +173,7 @@ private fun RouteCheckRow(label: String, ips: List) Text( text = label, style = MaterialTheme.typography.titleSmall, - modifier = Modifier.padding(top = ShxSpacing.sm), + color = MaterialTheme.colorScheme.onSurfaceVariant, ) Text( text = ips.joinToString(", ").ifEmpty { stringResource(R.string.route_check_none) }, diff --git a/src/frontends/android/app/src/main/res/values-de/strings.xml b/src/frontends/android/app/src/main/res/values-de/strings.xml index c0c04b691..1a949f94d 100644 --- a/src/frontends/android/app/src/main/res/values-de/strings.xml +++ b/src/frontends/android/app/src/main/res/values-de/strings.xml @@ -512,4 +512,5 @@ Systemapps anzeigen Standortzugriff erforderlich Android gibt den WLAN-Namen nur an Apps mit Standortzugriff weiter. Er dient ausschließlich dem Erkennen Ihrer vertrauenswürdigen Netzwerke; der Standort selbst wird nie gelesen oder gesendet. + DNS diff --git a/src/frontends/android/app/src/main/res/values-ru/strings.xml b/src/frontends/android/app/src/main/res/values-ru/strings.xml index 89bfcfe24..a2d4fa04b 100644 --- a/src/frontends/android/app/src/main/res/values-ru/strings.xml +++ b/src/frontends/android/app/src/main/res/values-ru/strings.xml @@ -509,4 +509,5 @@ Показывать системные приложения Нужен доступ к геолокации Android сообщает имя Wi-Fi сети только приложениям с доступом к геолокации. Оно нужно лишь для распознавания доверенных сетей; сама геолокация не читается и не передаётся. + DNS diff --git a/src/frontends/android/app/src/main/res/values/strings.xml b/src/frontends/android/app/src/main/res/values/strings.xml index 27672dc3d..b71193fdf 100644 --- a/src/frontends/android/app/src/main/res/values/strings.xml +++ b/src/frontends/android/app/src/main/res/values/strings.xml @@ -514,4 +514,5 @@ Show system apps Location access needed Android only reveals the Wi-Fi network name to apps with location access. The app uses it solely to recognize your trusted networks; the location itself is never read or sent. + DNS