From 0e5e28b4da5f8920563870c524f894b9f8caa014 Mon Sep 17 00:00:00 2001 From: Denozordec Date: Sat, 10 Oct 2026 00:13:08 +0700 Subject: [PATCH] android: spacing tokens - migrate padding/spacing literals and ScreenPadding to ShxSpacing --- .../org/strongswan/android/ui/LogActivity.kt | 5 +-- .../ui/RemediationInstructionsActivity.kt | 22 ++++++------ .../ui/SelectedApplicationsActivity.kt | 5 +-- .../ui/compose/ConnectivityCheckScreen.kt | 14 ++++---- .../android/ui/compose/ImportScreen.kt | 34 +++++++++---------- .../android/ui/compose/PresetPickerSheet.kt | 11 +++--- .../android/ui/compose/ProfileFormScreen.kt | 7 ++-- .../android/ui/compose/ProfileRow.kt | 7 ++-- .../android/ui/compose/ProfilesScreen.kt | 8 ++--- .../android/ui/compose/RouteCheckScreen.kt | 10 +++--- .../android/ui/compose/RoutingScreen.kt | 19 +++++------ .../android/ui/compose/RuleSetEditorSheet.kt | 25 +++++++------- .../android/ui/compose/SettingsScreen.kt | 4 +-- .../strongswan/android/ui/compose/ShxApp.kt | 6 ++-- .../ui/compose/TrustedNetworksScreen.kt | 26 +++++++------- .../android/ui/compose/VpnDialogs.kt | 6 ++-- .../ui/compose/components/ShxComponents.kt | 18 +++++----- .../ui/compose/components/ShxStatusPill.kt | 3 +- .../ui/compose/routing/AdvancedRouting.kt | 31 ++++++++--------- .../android/ui/compose/routing/RoutingHero.kt | 11 +++--- .../android/ui/compose/routing/RuleSetList.kt | 9 +++-- 21 files changed, 141 insertions(+), 140 deletions(-) diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/LogActivity.kt b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/LogActivity.kt index 0c82f4f2a..7a5fe9274 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/LogActivity.kt +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/LogActivity.kt @@ -51,6 +51,7 @@ import org.strongswan.android.data.LogContentProvider import org.strongswan.android.logic.CharonVpnService import org.strongswan.android.logic.DiagLog import org.strongswan.android.ui.compose.SecondaryScaffold +import org.strongswan.android.ui.compose.theme.ShxSpacing import org.strongswan.android.ui.compose.theme.ShxTheme import java.io.BufferedReader import java.io.File @@ -194,7 +195,7 @@ private fun LogScreen(onBack: () -> Unit, onSend: () -> Unit, viewModel: LogView { Text( stringResource(R.string.empty_log), - modifier = Modifier.padding(padding).padding(24.dp), + modifier = Modifier.padding(padding).padding(ShxSpacing.xl), color = MaterialTheme.colorScheme.onSurfaceVariant, ) } @@ -202,7 +203,7 @@ private fun LogScreen(onBack: () -> Unit, onSend: () -> Unit, viewModel: LogView { LazyColumn( state = listState, - modifier = Modifier.fillMaxSize().padding(padding).padding(horizontal = 12.dp), + modifier = Modifier.fillMaxSize().padding(padding).padding(horizontal = ShxSpacing.md), ) { items(lines.size) { index -> val line = lines[index] diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/RemediationInstructionsActivity.kt b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/RemediationInstructionsActivity.kt index 128bb4324..f90d65cbe 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/RemediationInstructionsActivity.kt +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/RemediationInstructionsActivity.kt @@ -65,7 +65,7 @@ import org.strongswan.android.logic.imc.RemediationInstruction import org.strongswan.android.ui.compose.components.ShxCard import org.strongswan.android.ui.compose.components.ShxEmptyState import org.strongswan.android.ui.compose.components.ShxSectionDivider -import org.strongswan.android.ui.compose.theme.ScreenPadding +import org.strongswan.android.ui.compose.theme.ShxSpacing import org.strongswan.android.ui.compose.theme.ShxTheme /** @@ -167,7 +167,7 @@ private fun RemediationUi( ShxEmptyState( icon = Icons.Rounded.CheckCircle, message = stringResource(R.string.remediation_instructions_title), - modifier = Modifier.padding(ScreenPadding), + modifier = Modifier.padding(ShxSpacing.lg), ) } else @@ -179,19 +179,19 @@ private fun RemediationUi( itemsIndexed(instructions) { index, item -> ShxCard( modifier = Modifier - .padding(horizontal = ScreenPadding, vertical = 6.dp) + .padding(horizontal = ShxSpacing.lg, vertical = 6.dp) .animateItem(), ) { Column( Modifier .fillMaxWidth() .clickable { onSelect(item) } - .padding(16.dp), + .padding(ShxSpacing.lg), ) { Text(item.getTitle(), style = MaterialTheme.typography.titleMedium) if (!item.getDescription().isNullOrEmpty()) { - Spacer(Modifier.height(4.dp)) + Spacer(Modifier.height(ShxSpacing.xs)) Text( item.getDescription(), style = MaterialTheme.typography.bodyMedium, @@ -210,12 +210,12 @@ private fun RemediationUi( Modifier .fillMaxSize() .verticalScroll(rememberScrollState()) - .padding(horizontal = ScreenPadding), + .padding(horizontal = ShxSpacing.lg), ) { Text( instruction.getDescription(), style = MaterialTheme.typography.bodyMedium, - modifier = Modifier.padding(top = 8.dp), + modifier = Modifier.padding(top = ShxSpacing.sm), ) if (!instruction.getHeader().isNullOrEmpty()) { @@ -223,15 +223,15 @@ private fun RemediationUi( instruction.getHeader(), style = MaterialTheme.typography.titleSmall, color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(top = 20.dp, bottom = 8.dp), + modifier = Modifier.padding(top = 20.dp, bottom = ShxSpacing.sm), ) ShxCard { - Column(Modifier.padding(vertical = 4.dp)) { + Column(Modifier.padding(vertical = ShxSpacing.xs)) { instruction.getItems().forEachIndexed { index, item -> Text( item, style = MaterialTheme.typography.bodyLarge, - modifier = Modifier.padding(horizontal = 16.dp, vertical = 10.dp), + modifier = Modifier.padding(horizontal = ShxSpacing.lg, vertical = 10.dp), ) if (index < instruction.getItems().lastIndex) { @@ -241,7 +241,7 @@ private fun RemediationUi( } } } - Spacer(Modifier.height(24.dp)) + Spacer(Modifier.height(ShxSpacing.xl)) } } } diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/SelectedApplicationsActivity.kt b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/SelectedApplicationsActivity.kt index 1f6b252e0..6486f5d8f 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/SelectedApplicationsActivity.kt +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/SelectedApplicationsActivity.kt @@ -52,6 +52,7 @@ import org.strongswan.android.R import org.strongswan.android.data.VpnProfileDataSource import org.strongswan.android.ui.adapter.SelectedApplicationEntry import org.strongswan.android.ui.compose.SecondaryScaffold +import org.strongswan.android.ui.compose.theme.ShxSpacing import org.strongswan.android.ui.compose.theme.ShxTheme import java.util.TreeSet @@ -161,11 +162,11 @@ private fun SelectedAppsScreen( onValueChange = { query = it }, label = { Text(stringResource(R.string.search)) }, singleLine = true, - modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp).fillMaxWidth(), + modifier = Modifier.padding(horizontal = ShxSpacing.lg, vertical = ShxSpacing.sm).fillMaxWidth(), ) if (loading) { - LoadingIndicator(Modifier.padding(24.dp).size(32.dp)) + LoadingIndicator(Modifier.padding(ShxSpacing.xl).size(32.dp)) } else { diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/ConnectivityCheckScreen.kt b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/ConnectivityCheckScreen.kt index c9c5248c7..3e5b79e10 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/ConnectivityCheckScreen.kt +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/ConnectivityCheckScreen.kt @@ -61,7 +61,7 @@ import org.strongswan.android.logic.connectivity.HealthCheckManager import org.strongswan.android.logic.connectivity.HealthConfig import org.strongswan.android.logic.connectivity.ProbeTarget import org.strongswan.android.logic.connectivity.ServerCheckMode -import org.strongswan.android.ui.compose.theme.ScreenPadding +import org.strongswan.android.ui.compose.theme.ShxSpacing /** * Connectivity check settings: what to probe, how often, and what to do when @@ -86,7 +86,7 @@ fun ConnectivityCheckScreen() Modifier .fillMaxSize() .verticalScroll(rememberScrollState()) - .padding(bottom = 24.dp), + .padding(bottom = ShxSpacing.xl), ) { ShxSection(title = stringResource(R.string.settings_section_general)) @@ -153,14 +153,14 @@ fun ConnectivityCheckScreen() ShxSection(title = stringResource(R.string.health_check_server_down_title)) { - Column(Modifier.padding(horizontal = 16.dp, vertical = 10.dp)) + Column(Modifier.padding(horizontal = ShxSpacing.lg, vertical = 10.dp)) { Text( stringResource(R.string.health_check_mode), style = MaterialTheme.typography.bodyLarge, color = if (config.enabled) MaterialTheme.colorScheme.onSurface else MaterialTheme.colorScheme.onSurfaceVariant, ) - SingleChoiceSegmentedButtonRow(Modifier.fillMaxWidth().padding(top = 8.dp)) + SingleChoiceSegmentedButtonRow(Modifier.fillMaxWidth().padding(top = ShxSpacing.sm)) { ServerCheckMode.entries.forEachIndexed { index, mode -> SegmentedButton( @@ -270,7 +270,7 @@ fun ConnectivityCheckScreen() ) { RadioButton(selected = config.intervalSec == seconds, onClick = null) - Text(intervalLabel(seconds, false), modifier = Modifier.padding(start = 12.dp)) + Text(intervalLabel(seconds, false), modifier = Modifier.padding(start = ShxSpacing.md)) } } } @@ -331,7 +331,7 @@ private fun AttemptsRow( verticalAlignment = Alignment.CenterVertically, modifier = Modifier .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 10.dp), + .padding(horizontal = ShxSpacing.lg, vertical = 10.dp), ) { Text( @@ -346,7 +346,7 @@ private fun AttemptsRow( Text( text = attempts.toString(), style = MaterialTheme.typography.titleMedium, - modifier = Modifier.padding(horizontal = 8.dp), + modifier = Modifier.padding(horizontal = ShxSpacing.sm), ) IconButton(onClick = onIncrement, enabled = enabled && attempts < 5) { Icon(Icons.Rounded.Add, contentDescription = stringResource(R.string.health_check_attempt_plus)) diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/ImportScreen.kt b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/ImportScreen.kt index 286bdb4da..cef7049d8 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/ImportScreen.kt +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/ImportScreen.kt @@ -54,7 +54,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import org.strongswan.android.R import org.strongswan.android.ui.compose.components.ShxCard -import org.strongswan.android.ui.compose.theme.ScreenPadding +import org.strongswan.android.ui.compose.theme.ShxSpacing import org.strongswan.android.ui.compose.theme.ShxTheme /** @@ -149,8 +149,8 @@ fun ImportScreen( Modifier .fillMaxSize() .verticalScroll(rememberScrollState()) - .padding(horizontal = ScreenPadding) - .padding(bottom = 24.dp), + .padding(horizontal = ShxSpacing.lg) + .padding(bottom = ShxSpacing.xl), ) { if (model.existsWarning != null) @@ -161,7 +161,7 @@ fun ImportScreen( content = MaterialTheme.colorScheme.onErrorContainer, ) } - ShxCard(modifier = Modifier.padding(top = 12.dp)) + ShxCard(modifier = Modifier.padding(top = ShxSpacing.md)) { ImportInfoRow(Icons.Rounded.Language, stringResource(R.string.profile_name_label_simple), model.name) ImportInfoRow(Icons.Rounded.Dns, stringResource(R.string.profile_gateway_label), model.gateway) @@ -174,10 +174,10 @@ fun ImportScreen( stringResource(R.string.profile_username_label).uppercase().replace(":", ""), style = MaterialTheme.typography.labelMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(start = 16.dp, top = 20.dp, bottom = 8.dp), + modifier = Modifier.padding(start = ShxSpacing.lg, top = 20.dp, bottom = ShxSpacing.sm), ) ShxCard { - Column(Modifier.padding(16.dp)) { + Column(Modifier.padding(ShxSpacing.lg)) { OutlinedTextField( value = model.username, onValueChange = { model.username = it }, @@ -187,7 +187,7 @@ fun ImportScreen( isError = model.usernameError, modifier = Modifier.fillMaxWidth(), ) - Spacer(Modifier.height(12.dp)) + Spacer(Modifier.height(ShxSpacing.md)) OutlinedTextField( value = model.password, onValueChange = { model.password = it }, @@ -205,7 +205,7 @@ fun ImportScreen( text = stringResource(R.string.profile_import_shared_secret), container = MaterialTheme.colorScheme.surfaceContainerHigh, content = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(top = 8.dp), + modifier = Modifier.padding(top = ShxSpacing.sm), ) } } @@ -216,7 +216,7 @@ fun ImportScreen( stringResource(R.string.profile_user_certificate_label).uppercase().replace(":", ""), style = MaterialTheme.typography.labelMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(start = 16.dp, top = 20.dp, bottom = 8.dp), + modifier = Modifier.padding(start = ShxSpacing.lg, top = 20.dp, bottom = ShxSpacing.sm), ) ShxCard { Column { @@ -225,7 +225,7 @@ fun ImportScreen( modifier = Modifier .fillMaxWidth() .clickable(onClick = onSelectUserCert) - .padding(horizontal = 16.dp, vertical = 14.dp), + .padding(horizontal = ShxSpacing.lg, vertical = 14.dp), ) { Column(Modifier.weight(1f)) { Text( @@ -248,9 +248,9 @@ fun ImportScreen( } if (model.showImportUserCert) { - TextButton(onClick = onImportPkcs12, modifier = Modifier.padding(start = 8.dp, bottom = 8.dp)) { + TextButton(onClick = onImportPkcs12, modifier = Modifier.padding(start = ShxSpacing.sm, bottom = ShxSpacing.sm)) { Icon(Icons.Rounded.FileDownload, contentDescription = null, modifier = Modifier.size(18.dp)) - Spacer(Modifier.size(8.dp)) + Spacer(Modifier.size(ShxSpacing.sm)) Text(stringResource(R.string.profile_cert_import)) } } @@ -264,7 +264,7 @@ fun ImportScreen( stringResource(R.string.profile_ca_label).uppercase().replace(":", ""), style = MaterialTheme.typography.labelMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(start = 16.dp, top = 20.dp, bottom = 8.dp), + modifier = Modifier.padding(start = ShxSpacing.lg, top = 20.dp, bottom = ShxSpacing.sm), ) ShxCard { ImportInfoRow(Icons.Rounded.Dns, model.remoteCertPrimary ?: "", model.remoteCertSecondary ?: "", divider = false) @@ -288,12 +288,12 @@ private fun ImportBanner( contentColor = content, modifier = modifier .fillMaxWidth() - .padding(top = 8.dp), + .padding(top = ShxSpacing.sm), ) { Text( text, style = MaterialTheme.typography.bodyMedium, - modifier = Modifier.padding(horizontal = 16.dp, vertical = 10.dp), + modifier = Modifier.padding(horizontal = ShxSpacing.lg, vertical = 10.dp), ) } } @@ -306,7 +306,7 @@ private fun ImportInfoRow(icon: ImageVector, label: String, value: String, divid verticalAlignment = Alignment.CenterVertically, modifier = Modifier .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 12.dp), + .padding(horizontal = ShxSpacing.lg, vertical = ShxSpacing.md), ) { Icon( icon, @@ -314,7 +314,7 @@ private fun ImportInfoRow(icon: ImageVector, label: String, value: String, divid tint = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.size(20.dp), ) - Column(Modifier.padding(start = 16.dp)) { + Column(Modifier.padding(start = ShxSpacing.lg)) { Text( label, style = MaterialTheme.typography.labelSmall, diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/PresetPickerSheet.kt b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/PresetPickerSheet.kt index b5b01cf4c..b0ac755c7 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/PresetPickerSheet.kt +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/PresetPickerSheet.kt @@ -41,6 +41,7 @@ import androidx.compose.ui.unit.dp import org.strongswan.android.R import org.strongswan.android.logic.routing.RuleSet import org.strongswan.android.logic.routing.RoutingPresets +import org.strongswan.android.ui.compose.theme.ShxSpacing /** * Searchable list of the built-in presets shown inside the rule set editor @@ -71,7 +72,7 @@ fun PresetPickerContent( { Row( verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(start = 12.dp, end = 12.dp, bottom = 4.dp), + modifier = Modifier.padding(start = ShxSpacing.md, end = ShxSpacing.md, bottom = ShxSpacing.xs), ) { IconButton(onClick = onBack) @@ -103,7 +104,7 @@ fun PresetPickerContent( }, modifier = Modifier .fillMaxWidth() - .padding(horizontal = 24.dp), + .padding(horizontal = ShxSpacing.xl), shape = MaterialTheme.shapes.medium, ) @@ -111,7 +112,7 @@ fun PresetPickerContent( modifier = Modifier .fillMaxWidth() .heightIn(max = 460.dp) - .padding(top = 4.dp), + .padding(top = ShxSpacing.xs), ) { items(filtered, key = { it.name }) @@ -123,7 +124,7 @@ fun PresetPickerContent( modifier = Modifier .fillMaxWidth() .clickable { onToggle(preset) } - .padding(horizontal = 24.dp, vertical = 6.dp), + .padding(horizontal = ShxSpacing.xl, vertical = 6.dp), ) { Column( @@ -151,7 +152,7 @@ fun PresetPickerContent( color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier .fillMaxWidth() - .padding(horizontal = 24.dp, vertical = 16.dp), + .padding(horizontal = ShxSpacing.xl, vertical = ShxSpacing.lg), ) } } diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/ProfileFormScreen.kt b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/ProfileFormScreen.kt index 3687f5387..6c0cb7541 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/ProfileFormScreen.kt +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/ProfileFormScreen.kt @@ -91,6 +91,7 @@ import org.strongswan.android.data.VpnType import org.strongswan.android.data.VpnType.VpnTypeFeature import org.strongswan.android.ui.SelectedApplicationsActivity import org.strongswan.android.ui.TrustedCertificatesActivity +import org.strongswan.android.ui.compose.theme.ShxSpacing import org.strongswan.android.utils.Constants import org.strongswan.android.utils.IPRangeSet import org.strongswan.android.utils.Utils @@ -356,8 +357,8 @@ fun ProfileFormScreen( Row( modifier = Modifier .fillMaxWidth() - .padding(horizontal = 20.dp, vertical = 12.dp), - horizontalArrangement = Arrangement.spacedBy(12.dp), + .padding(horizontal = 20.dp, vertical = ShxSpacing.md), + horizontalArrangement = Arrangement.spacedBy(ShxSpacing.md), ) { OutlinedButton( onClick = onCancel, @@ -516,7 +517,7 @@ fun ProfileFormScreen( enter = expandVertically() + fadeIn(), exit = shrinkVertically() + fadeOut(), ) { - Column(verticalArrangement = Arrangement.spacedBy(12.dp)) { + Column(verticalArrangement = Arrangement.spacedBy(ShxSpacing.md)) { OutlinedTextField(state.remoteId, { onChange(state.copy(remoteId = it)) }, label = { Text(stringResource(R.string.profile_remote_id_label)) }, supportingText = { Text(stringResource(R.string.profile_remote_id_hint)) }, diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/ProfileRow.kt b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/ProfileRow.kt index 9c3cb27c8..0fde27ae0 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/ProfileRow.kt +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/ProfileRow.kt @@ -38,6 +38,7 @@ import androidx.compose.ui.unit.dp import org.strongswan.android.R import org.strongswan.android.data.VpnProfile import org.strongswan.android.ui.compose.theme.LocalShxStatusColors +import org.strongswan.android.ui.compose.theme.ShxSpacing @Composable fun ProfileAvatar(icon: ImageVector, connected: Boolean, modifier: Modifier = Modifier) @@ -81,13 +82,13 @@ fun ShxProfileRow( onLongClick = onLongClick, onLongClickLabel = onLongClickLabel, ) - .padding(horizontal = 16.dp, vertical = 12.dp), + .padding(horizontal = ShxSpacing.lg, vertical = ShxSpacing.md), ) { ProfileAvatar(icon = leadingIcon, connected = active) Column( modifier = Modifier .weight(1f) - .padding(horizontal = 12.dp), + .padding(horizontal = ShxSpacing.md), ) { Text( text = profile.name ?: "", @@ -128,7 +129,7 @@ fun ShxDivider(modifier: Modifier = Modifier, indent: Boolean = true) color = MaterialTheme.colorScheme.outlineVariant.copy(alpha = 0.6f), modifier = modifier .fillMaxWidth() - .padding(start = if (indent) 68.dp else 0.dp, end = if (indent) 16.dp else 0.dp) + .padding(start = if (indent) 68.dp else 0.dp, end = if (indent) ShxSpacing.lg else 0.dp) .height(1.dp), ) {} } diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/ProfilesScreen.kt b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/ProfilesScreen.kt index 2353ea84c..e7c99f3dc 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/ProfilesScreen.kt +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/ProfilesScreen.kt @@ -61,7 +61,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.dp import kotlinx.coroutines.launch import org.strongswan.android.R import org.strongswan.android.data.VpnProfile @@ -69,7 +68,6 @@ import org.strongswan.android.logic.VpnStateService.State import org.strongswan.android.ui.compose.components.ShxCard import org.strongswan.android.ui.compose.components.ShxEmptyState import org.strongswan.android.ui.compose.theme.LocalShxStatusColors -import org.strongswan.android.ui.compose.theme.ScreenPadding @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -136,7 +134,7 @@ fun ProfilesScreen( SearchBar( modifier = Modifier .fillMaxWidth() - .padding(horizontal = ScreenPadding, vertical = 4.dp), + .padding(horizontal = ShxSpacing.lg, vertical = ShxSpacing.xs), inputField = { SearchBarDefaults.InputField( query = query, @@ -170,7 +168,7 @@ fun ProfilesScreen( color = MaterialTheme.colorScheme.surfaceContainerLow, modifier = Modifier .fillMaxWidth() - .padding(horizontal = ScreenPadding, vertical = 12.dp), + .padding(horizontal = ShxSpacing.lg, vertical = ShxSpacing.md), ) { LazyColumn { itemsIndexed(filtered, key = { _, p -> p.getUUID().toString() }) { index, profile -> @@ -275,7 +273,7 @@ private fun EmptyProfilesState(query: String, onAdd: () -> Unit) ShxCard( modifier = Modifier .fillMaxWidth() - .padding(horizontal = ScreenPadding, vertical = 12.dp), + .padding(horizontal = ShxSpacing.lg, vertical = ShxSpacing.md), ) { if (query.isBlank()) 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 965b45ed5..c80cfb9b6 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 @@ -36,7 +36,7 @@ import kotlinx.coroutines.launch import org.strongswan.android.R import org.strongswan.android.logic.CharonVpnService import org.strongswan.android.logic.routing.RouteCheck -import org.strongswan.android.ui.compose.theme.ScreenPadding +import org.strongswan.android.ui.compose.theme.ShxSpacing /** Diagnostic: how a domain resolves and which route its addresses take. */ @Composable @@ -52,7 +52,7 @@ fun RouteCheckScreen() Modifier .fillMaxSize() .verticalScroll(rememberScrollState()) - .padding(horizontal = ScreenPadding, vertical = 12.dp), + .padding(horizontal = ShxSpacing.lg, vertical = ShxSpacing.md), ) { Text( @@ -98,7 +98,7 @@ fun RouteCheckScreen() @Composable private fun RouteCheckResult(report: RouteCheck.Report) { - Column(modifier = Modifier.padding(top = 12.dp)) + Column(modifier = Modifier.padding(top = ShxSpacing.md)) { if (!report.vpnNetworkFound) { @@ -141,7 +141,7 @@ private fun RouteCheckResult(report: RouteCheck.Report) ) } } - Spacer(Modifier.height(8.dp)) + Spacer(Modifier.height(ShxSpacing.sm)) } @Composable @@ -150,7 +150,7 @@ private fun RouteCheckRow(label: String, ips: List) Text( text = label, style = MaterialTheme.typography.titleSmall, - modifier = Modifier.padding(top = 8.dp), + modifier = Modifier.padding(top = ShxSpacing.sm), ) Text( text = ips.joinToString(", ").ifEmpty { stringResource(R.string.route_check_none) }, diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/RoutingScreen.kt b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/RoutingScreen.kt index 6063fe825..9612d4e83 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/RoutingScreen.kt +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/RoutingScreen.kt @@ -124,7 +124,6 @@ import org.strongswan.android.ui.compose.components.ShxIconBadge import org.strongswan.android.ui.compose.components.ShxSection import org.strongswan.android.ui.compose.components.ShxSectionDivider import org.strongswan.android.ui.compose.theme.LocalShxStatusColors -import org.strongswan.android.ui.compose.theme.ScreenPadding import org.strongswan.android.ui.compose.theme.ShxSpacing import org.strongswan.android.ui.compose.routing.RoutingHeroCard import org.strongswan.android.ui.compose.routing.RuToggleRow @@ -236,7 +235,7 @@ private fun RoutingContent(snackbarHostState: SnackbarHostState) Modifier .fillMaxSize() .verticalScroll(rememberScrollState()) - .padding(bottom = 24.dp), + .padding(bottom = ShxSpacing.xl), ) { TopAppBar( @@ -261,7 +260,7 @@ private fun RoutingContent(snackbarHostState: SnackbarHostState) setCount = config.ruleSets.count { it.enabled }, appCount = excludedApps, onToggle = { manager.setGlobalEnabled(it) }, - modifier = Modifier.padding(horizontal = ScreenPadding), + modifier = Modifier.padding(horizontal = ShxSpacing.lg), ) /* kill switch + excluded apps: excluded apps are added to the VPN's disallowed list @@ -273,7 +272,7 @@ private fun RoutingContent(snackbarHostState: SnackbarHostState) text = stringResource(R.string.routing_killswitch_note, excludedApps), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(horizontal = ScreenPadding + ShxSpacing.xs, vertical = ShxSpacing.sm), + modifier = Modifier.padding(horizontal = ShxSpacing.lg + ShxSpacing.xs, vertical = ShxSpacing.sm), ) } @@ -302,16 +301,16 @@ private fun RoutingContent(snackbarHostState: SnackbarHostState) text = stringResource(R.string.dead_targets_summary), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(horizontal = 16.dp, vertical = 6.dp), + modifier = Modifier.padding(horizontal = ShxSpacing.lg, vertical = 6.dp), ) deadTargets.forEachIndexed { index, target -> ShxSectionDivider() Row( verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(12.dp), + horizontalArrangement = Arrangement.spacedBy(ShxSpacing.md), modifier = Modifier .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 10.dp), + .padding(horizontal = ShxSpacing.lg, vertical = 10.dp), ) { Box( modifier = Modifier @@ -400,7 +399,7 @@ private fun RoutingContent(snackbarHostState: SnackbarHostState) modifier = Modifier .fillMaxWidth() .clickable { advancedOpen = !advancedOpen } - .padding(horizontal = ScreenPadding + 16.dp, vertical = 16.dp), + .padding(horizontal = ShxSpacing.lg + ShxSpacing.lg, vertical = ShxSpacing.lg), ) { Text( @@ -433,7 +432,7 @@ private fun RoutingContent(snackbarHostState: SnackbarHostState) LinearWavyProgressIndicator( Modifier .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 4.dp), + .padding(horizontal = ShxSpacing.lg, vertical = ShxSpacing.xs), ) } GeoipChipsRow(state = ruState) @@ -451,7 +450,7 @@ private fun RoutingContent(snackbarHostState: SnackbarHostState) text = stringResource(R.string.routing_force_summary), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(horizontal = 16.dp, vertical = 6.dp), + modifier = Modifier.padding(horizontal = ShxSpacing.lg, vertical = 6.dp), ) } else diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/RuleSetEditorSheet.kt b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/RuleSetEditorSheet.kt index 0ff6744fd..ee199767f 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/RuleSetEditorSheet.kt +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/RuleSetEditorSheet.kt @@ -68,6 +68,7 @@ import org.strongswan.android.R import org.strongswan.android.logic.routing.RuleSet import org.strongswan.android.logic.routing.RoutingPresets import org.strongswan.android.ui.compose.components.ShxIconBadge +import org.strongswan.android.ui.compose.theme.ShxSpacing /** * Editor of one rule set as a modal bottom sheet. The preset picker is a @@ -161,12 +162,12 @@ private fun EditorContent( Modifier .fillMaxWidth() .verticalScroll(rememberScrollState()) - .padding(bottom = 24.dp), + .padding(bottom = ShxSpacing.xl), ) { Row( verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(start = 24.dp, end = 12.dp, bottom = 8.dp), + modifier = Modifier.padding(start = ShxSpacing.xl, end = ShxSpacing.md, bottom = ShxSpacing.sm), ) { Text( @@ -188,7 +189,7 @@ private fun EditorContent( singleLine = true, modifier = Modifier .fillMaxWidth() - .padding(horizontal = 24.dp) + .padding(horizontal = ShxSpacing.xl) .focusRequester(nameFocusRequester), shape = MaterialTheme.shapes.medium, ) @@ -232,7 +233,7 @@ private fun EditorContent( shape = MaterialTheme.shapes.medium, modifier = Modifier .fillMaxWidth() - .padding(horizontal = 24.dp, vertical = 12.dp), + .padding(horizontal = ShxSpacing.xl, vertical = ShxSpacing.md), ) { Icon( @@ -240,7 +241,7 @@ private fun EditorContent( contentDescription = null, modifier = Modifier.size(18.dp), ) - Spacer(Modifier.width(8.dp)) + Spacer(Modifier.width(ShxSpacing.sm)) Text(stringResource(R.string.routing_delete)) } } @@ -262,14 +263,14 @@ private fun ChipGroup( text = label, style = MaterialTheme.typography.titleSmall, color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(start = 24.dp, top = 16.dp), + modifier = Modifier.padding(start = ShxSpacing.xl, top = ShxSpacing.lg), ) FlowRow( modifier = Modifier .fillMaxWidth() - .padding(horizontal = 24.dp, vertical = 4.dp), - horizontalArrangement = Arrangement.spacedBy(8.dp), - verticalArrangement = Arrangement.spacedBy(4.dp), + .padding(horizontal = ShxSpacing.xl, vertical = ShxSpacing.xs), + horizontalArrangement = Arrangement.spacedBy(ShxSpacing.sm), + verticalArrangement = Arrangement.spacedBy(ShxSpacing.xs), ) { values.forEach { value -> @@ -294,11 +295,11 @@ private fun EditorRow(icon: ImageVector, title: String, subtitle: String, onClic modifier = Modifier .fillMaxWidth() .clickable(onClick = onClick) - .padding(horizontal = 24.dp, vertical = 14.dp), + .padding(horizontal = ShxSpacing.xl, vertical = 14.dp), ) { ShxIconBadge(icon) - Spacer(Modifier.width(16.dp)) + Spacer(Modifier.width(ShxSpacing.lg)) Column(Modifier.weight(1f)) { Text(title, style = MaterialTheme.typography.bodyLarge) @@ -346,7 +347,7 @@ private fun AddChipField( }, modifier = Modifier .fillMaxWidth() - .padding(horizontal = 24.dp, vertical = 4.dp), + .padding(horizontal = ShxSpacing.xl, vertical = ShxSpacing.xs), shape = MaterialTheme.shapes.medium, ) } diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/SettingsScreen.kt b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/SettingsScreen.kt index 291969ab9..c94f5625b 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/SettingsScreen.kt +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/SettingsScreen.kt @@ -526,7 +526,7 @@ fun SettingsScreen(profiles: List, showTitle: Boolean = true) color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier .fillMaxWidth() - .padding(top = 16.dp), + .padding(top = ShxSpacing.lg), textAlign = androidx.compose.ui.text.style.TextAlign.Center, ) } @@ -560,7 +560,7 @@ fun SettingsScreen(profiles: List, showTitle: Boolean = true) ) { RadioButton(selected = defaultUuid == value, onClick = null) - Text(label, modifier = Modifier.padding(start = 12.dp)) + Text(label, modifier = Modifier.padding(start = ShxSpacing.md)) } } } diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/ShxApp.kt b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/ShxApp.kt index 9fd3b9070..9d612c272 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/ShxApp.kt +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/ShxApp.kt @@ -66,7 +66,6 @@ import androidx.compose.ui.graphics.compositeOver import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource -import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewmodel.compose.viewModel import org.strongswan.android.R @@ -76,6 +75,7 @@ import org.strongswan.android.logic.StrongSwanApplication import org.strongswan.android.logic.TrustedCertificateManager import org.strongswan.android.ui.LogActivity import org.strongswan.android.ui.VpnProfileDetailActivity +import org.strongswan.android.ui.compose.theme.ShxSpacing import org.strongswan.android.ui.compose.theme.ShxTheme fun ComponentActivity.installShxUi() @@ -209,13 +209,13 @@ private fun ShareProfileDialog(profile: VpnProfile, onDismiss: () -> Unit, onCon text = { Column { Text(stringResource(R.string.share_profile_password_warning), style = MaterialTheme.typography.bodyMedium) - Spacer(Modifier.height(12.dp)) + Spacer(Modifier.height(ShxSpacing.md)) Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier.clickable { includePassword = !includePassword }, ) { Checkbox(checked = includePassword, onCheckedChange = { includePassword = it }) - Spacer(Modifier.width(4.dp)) + Spacer(Modifier.width(ShxSpacing.xs)) Text(stringResource(R.string.share_profile_include_password)) } } diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/TrustedNetworksScreen.kt b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/TrustedNetworksScreen.kt index 814ca677c..117701eca 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/TrustedNetworksScreen.kt +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/TrustedNetworksScreen.kt @@ -69,7 +69,7 @@ import org.strongswan.android.ui.compose.components.ShxSettingRow import org.strongswan.android.ui.compose.components.ShxSettingToggleRow import org.strongswan.android.data.VpnProfile import org.strongswan.android.logic.autoconnect.AutoConnectManager -import org.strongswan.android.ui.compose.theme.ScreenPadding +import org.strongswan.android.ui.compose.theme.ShxSpacing /** * Trusted networks settings: when enabled, the VPN is started on cellular and untrusted @@ -159,7 +159,7 @@ fun TrustedNetworksScreen( Modifier .fillMaxSize() .verticalScroll(rememberScrollState()) - .padding(bottom = 24.dp), + .padding(bottom = ShxSpacing.xl), ) { ShxSection(title = stringResource(R.string.settings_section_general)) @@ -190,19 +190,19 @@ fun TrustedNetworksScreen( if (enabled && !hasBackgroundLocation) { - Spacer(Modifier.size(12.dp)) + Spacer(Modifier.size(ShxSpacing.md)) Surface( shape = MaterialTheme.shapes.large, color = MaterialTheme.colorScheme.errorContainer, modifier = Modifier .fillMaxWidth() - .padding(horizontal = ScreenPadding) + .padding(horizontal = ShxSpacing.lg) .clickable { requestSsidPermissions() }, ) { Row( verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(horizontal = 16.dp, vertical = 12.dp), + modifier = Modifier.padding(horizontal = ShxSpacing.lg, vertical = ShxSpacing.md), ) { Text( @@ -226,7 +226,7 @@ fun TrustedNetworksScreen( color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 8.dp), + .padding(horizontal = ShxSpacing.lg, vertical = ShxSpacing.sm), ) if (config.trustedSsids.isEmpty()) { @@ -236,7 +236,7 @@ fun TrustedNetworksScreen( color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 14.dp), + .padding(horizontal = ShxSpacing.lg, vertical = 14.dp), ) } else @@ -251,7 +251,7 @@ fun TrustedNetworksScreen( verticalAlignment = Alignment.CenterVertically, modifier = Modifier .fillMaxWidth() - .padding(horizontal = 16.dp), + .padding(horizontal = ShxSpacing.lg), ) { Icon( @@ -265,7 +265,7 @@ fun TrustedNetworksScreen( style = MaterialTheme.typography.bodyLarge, modifier = Modifier .weight(1f) - .padding(horizontal = 16.dp, vertical = 14.dp), + .padding(horizontal = ShxSpacing.lg, vertical = 14.dp), ) IconButton(onClick = { pendingDeleteSsid = ssid }) { Icon( @@ -309,7 +309,7 @@ fun TrustedNetworksScreen( selected = config.profileUuid == profile.getUUID().toString(), onClick = null, ) - Text(profile.name ?: "", modifier = Modifier.padding(start = 12.dp)) + Text(profile.name ?: "", modifier = Modifier.padding(start = ShxSpacing.md)) } } } @@ -389,7 +389,7 @@ private fun TrustedAddNetworkRow( horizontalArrangement = androidx.compose.foundation.layout.Arrangement.Center, modifier = Modifier .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 6.dp), + .padding(horizontal = ShxSpacing.lg, vertical = 6.dp), ) { if (currentSsid != null) @@ -397,7 +397,7 @@ private fun TrustedAddNetworkRow( TextButton(onClick = { onAddCurrent(currentSsid) }) { Icon(Icons.Rounded.Add, contentDescription = null, modifier = Modifier.size(18.dp)) - Spacer(Modifier.size(8.dp)) + Spacer(Modifier.size(ShxSpacing.sm)) Text(stringResource(R.string.auto_connect_add_current, currentSsid)) } } @@ -406,7 +406,7 @@ private fun TrustedAddNetworkRow( TextButton(onClick = onAddManual) { Icon(Icons.Rounded.Add, contentDescription = null, modifier = Modifier.size(18.dp)) - Spacer(Modifier.size(8.dp)) + Spacer(Modifier.size(ShxSpacing.sm)) Text(stringResource(R.string.auto_connect_add_network)) } } diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/VpnDialogs.kt b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/VpnDialogs.kt index ba553f6a9..f72daf53c 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/VpnDialogs.kt +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/VpnDialogs.kt @@ -40,12 +40,12 @@ import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.VisualTransformation -import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import org.strongswan.android.R +import org.strongswan.android.ui.compose.theme.ShxSpacing import org.strongswan.android.ui.compose.theme.ShxTheme /** @@ -147,7 +147,7 @@ private fun ConfirmationUi(dialog: VpnDialog.Confirmation) title = { Text(dialog.title) }, text = { Text(stringResource(dialog.message)) }, confirmButton = { - Row(horizontalArrangement = Arrangement.spacedBy(4.dp)) { + Row(horizontalArrangement = Arrangement.spacedBy(ShxSpacing.xs)) { if (dialog.reconnect) { TextButton(onClick = { @@ -193,7 +193,7 @@ private fun LoginUi(dialog: VpnDialog.Login) onDismissRequest = ::cancelDialog, title = { Text(stringResource(R.string.login_title)) }, text = { - Column(verticalArrangement = Arrangement.spacedBy(12.dp)) { + Column(verticalArrangement = Arrangement.spacedBy(ShxSpacing.md)) { OutlinedTextField( value = username, onValueChange = { username = it }, diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/components/ShxComponents.kt b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/components/ShxComponents.kt index 45d24bfee..3ad55cb5e 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/components/ShxComponents.kt +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/components/ShxComponents.kt @@ -40,7 +40,7 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp -import org.strongswan.android.ui.compose.theme.ScreenPadding +import org.strongswan.android.ui.compose.theme.ShxSpacing /** Uppercase section header + grouped card, the standard grouped-list building block. */ @Composable @@ -52,9 +52,9 @@ fun ShxSection(title: String, content: @Composable () -> Unit) color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier .fillMaxWidth() - .padding(start = ScreenPadding + 16.dp, top = 20.dp, bottom = 8.dp), + .padding(start = ShxSpacing.lg + ShxSpacing.lg, top = 20.dp, bottom = ShxSpacing.sm), ) - ShxCard(modifier = Modifier.fillMaxWidth().padding(horizontal = ScreenPadding)) { + ShxCard(modifier = Modifier.fillMaxWidth().padding(horizontal = ShxSpacing.lg)) { Column { content() } } } @@ -83,7 +83,7 @@ fun ShxIconBadge(icon: ImageVector, tint: Color = MaterialTheme.colorScheme.prim contentDescription = null, tint = tint, modifier = Modifier - .padding(8.dp) + .padding(ShxSpacing.sm) .size(20.dp), ) } @@ -95,7 +95,7 @@ private fun RowScope.RowLabels(title: String, subtitle: String?, enabled: Boolea Column( modifier = Modifier .weight(1f) - .padding(horizontal = 16.dp), + .padding(horizontal = ShxSpacing.lg), ) { Text( @@ -129,7 +129,7 @@ fun ShxSettingRow( modifier = Modifier .fillMaxWidth() .clickable(enabled = enabled, onClick = onClick) - .padding(horizontal = 16.dp, vertical = 14.dp), + .padding(horizontal = ShxSpacing.lg, vertical = 14.dp), ) { ShxIconBadge(icon = icon, tint = if (enabled) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant) @@ -158,7 +158,7 @@ fun ShxSettingToggleRow( modifier = Modifier .fillMaxWidth() .clickable(enabled = enabled) { onCheckedChange(!checked) } - .padding(horizontal = 16.dp, vertical = 14.dp), + .padding(horizontal = ShxSpacing.lg, vertical = 14.dp), ) { ShxIconBadge(icon = icon, tint = if (enabled) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant) @@ -198,7 +198,7 @@ fun ShxEmptyState( Column( modifier = modifier .fillMaxWidth() - .padding(24.dp), + .padding(ShxSpacing.xl), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(0.dp), ) @@ -225,7 +225,7 @@ fun ShxEmptyState( ) if (actionLabel != null && onAction != null) { - Spacer(Modifier.height(16.dp)) + Spacer(Modifier.height(ShxSpacing.lg)) OutlinedButton(onClick = onAction, shape = MaterialTheme.shapes.medium) { Text(actionLabel) } } } diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/components/ShxStatusPill.kt b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/components/ShxStatusPill.kt index ebb817ad5..941116024 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/components/ShxStatusPill.kt +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/components/ShxStatusPill.kt @@ -21,6 +21,7 @@ import androidx.compose.ui.graphics.Shape import androidx.compose.ui.text.TextStyle import androidx.compose.ui.unit.dp import org.strongswan.android.ui.compose.theme.LocalShxStatusColors +import org.strongswan.android.ui.compose.theme.ShxSpacing /** Small rounded label with explicit colors, e.g. "Connected". */ @Composable @@ -42,7 +43,7 @@ fun ShxStatusPill( Text( text = text, style = style, - modifier = Modifier.padding(horizontal = 10.dp, vertical = 4.dp), + modifier = Modifier.padding(horizontal = 10.dp, vertical = ShxSpacing.xs), ) } } diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/routing/AdvancedRouting.kt b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/routing/AdvancedRouting.kt index 5a347cbec..a90641ea2 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/routing/AdvancedRouting.kt +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/routing/AdvancedRouting.kt @@ -124,7 +124,6 @@ import org.strongswan.android.ui.compose.components.ShxIconBadge import org.strongswan.android.ui.compose.components.ShxSection import org.strongswan.android.ui.compose.components.ShxSectionDivider import org.strongswan.android.ui.compose.theme.LocalShxStatusColors -import org.strongswan.android.ui.compose.theme.ScreenPadding import org.strongswan.android.ui.compose.theme.ShxSpacing /** Geoip toggle row with a refresh/update slot in front of the switch. */ @@ -143,11 +142,11 @@ internal fun RuToggleRow( modifier = Modifier .fillMaxWidth() .clickable { onCheckedChange(!checked) } - .padding(horizontal = 16.dp, vertical = 14.dp), + .padding(horizontal = ShxSpacing.lg, vertical = 14.dp), ) { ShxIconBadge(Icons.Rounded.Block) - Spacer(Modifier.width(16.dp)) + Spacer(Modifier.width(ShxSpacing.lg)) Column(Modifier.weight(1f)) { Text(title, style = MaterialTheme.typography.bodyLarge) @@ -160,7 +159,7 @@ internal fun RuToggleRow( if (updating) { LoadingIndicator(Modifier.size(14.dp)) - Spacer(Modifier.width(12.dp)) + Spacer(Modifier.width(ShxSpacing.md)) } else { @@ -186,7 +185,7 @@ internal fun RuModeSelector(mode: String, onModeChange: (String) -> Unit) SingleChoiceSegmentedButtonRow( modifier = Modifier .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 10.dp), + .padding(horizontal = ShxSpacing.lg, vertical = 10.dp), ) { SegmentedButton( @@ -218,7 +217,7 @@ internal fun RuDetailsDisclosure(mode: String) modifier = Modifier .fillMaxWidth() .clickable { expanded = !expanded } - .padding(horizontal = 16.dp, vertical = 10.dp), + .padding(horizontal = ShxSpacing.lg, vertical = 10.dp), ) { Text( @@ -226,7 +225,7 @@ internal fun RuDetailsDisclosure(mode: String) style = MaterialTheme.typography.labelLarge, color = MaterialTheme.colorScheme.primary, ) - Spacer(Modifier.width(4.dp)) + Spacer(Modifier.width(ShxSpacing.xs)) Icon( if (expanded) Icons.Rounded.ExpandLess else Icons.Rounded.ExpandMore, contentDescription = null, @@ -242,7 +241,7 @@ internal fun RuDetailsDisclosure(mode: String) fadeOut(tween(90)), ) { - Column(Modifier.padding(start = 16.dp, end = 16.dp, bottom = 12.dp)) + Column(Modifier.padding(start = ShxSpacing.lg, end = ShxSpacing.lg, bottom = ShxSpacing.md)) { Text( text = stringResource( @@ -268,7 +267,7 @@ internal fun RuDetailsDisclosure(mode: String) text = stringResource(R.string.rusplit_beta_note), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(top = 4.dp), + modifier = Modifier.padding(top = ShxSpacing.xs), ) } } @@ -284,9 +283,9 @@ internal fun GeoipChipsRow(state: RuIpListState) FlowRow( modifier = Modifier .fillMaxWidth() - .padding(start = 16.dp, end = 16.dp, bottom = 4.dp), - horizontalArrangement = Arrangement.spacedBy(8.dp), - verticalArrangement = Arrangement.spacedBy(4.dp), + .padding(start = ShxSpacing.lg, end = ShxSpacing.lg, bottom = ShxSpacing.xs), + horizontalArrangement = Arrangement.spacedBy(ShxSpacing.sm), + verticalArrangement = Arrangement.spacedBy(ShxSpacing.xs), ) { InfoChip(text = stringResource(R.string.routing_geoip_ipv4, state.ipv4Ranges)) @@ -341,14 +340,14 @@ internal fun ForcePrefixRow( modifier = Modifier .fillMaxWidth() .clickable(onClick = onEdit) - .padding(horizontal = 16.dp, vertical = 8.dp), + .padding(horizontal = ShxSpacing.lg, vertical = ShxSpacing.sm), ) { ShxIconBadge( Icons.Rounded.Lan, tint = if (entry.enabled) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant, ) - Spacer(Modifier.width(16.dp)) + Spacer(Modifier.width(ShxSpacing.lg)) Text( entry.prefix, style = MaterialTheme.typography.bodyLarge, @@ -378,7 +377,7 @@ internal fun AddForcePrefixRow(onClick: () -> Unit) modifier = Modifier .fillMaxWidth() .clickable(onClick = onClick) - .padding(horizontal = 16.dp, vertical = 14.dp), + .padding(horizontal = ShxSpacing.lg, vertical = 14.dp), ) { Icon( @@ -387,7 +386,7 @@ internal fun AddForcePrefixRow(onClick: () -> Unit) tint = MaterialTheme.colorScheme.primary, modifier = Modifier.size(22.dp), ) - Spacer(Modifier.width(16.dp)) + Spacer(Modifier.width(ShxSpacing.lg)) Text( stringResource(R.string.routing_force_add), style = MaterialTheme.typography.bodyLarge, diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/routing/RoutingHero.kt b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/routing/RoutingHero.kt index a3cd329cb..111dc34a8 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/routing/RoutingHero.kt +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/routing/RoutingHero.kt @@ -124,7 +124,6 @@ import org.strongswan.android.ui.compose.components.ShxIconBadge import org.strongswan.android.ui.compose.components.ShxSection import org.strongswan.android.ui.compose.components.ShxSectionDivider import org.strongswan.android.ui.compose.theme.LocalShxStatusColors -import org.strongswan.android.ui.compose.theme.ScreenPadding import org.strongswan.android.ui.compose.theme.ShxSpacing /** Hero card: master switch plus a live summary of what the rules currently affect. */ @@ -147,7 +146,7 @@ internal fun RoutingHeroCard( { Row( verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(start = 16.dp, top = 14.dp, bottom = 14.dp, end = 8.dp), + modifier = Modifier.padding(start = ShxSpacing.lg, top = 14.dp, bottom = 14.dp, end = ShxSpacing.sm), ) { Icon( @@ -155,7 +154,7 @@ internal fun RoutingHeroCard( contentDescription = null, tint = if (enabled) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant, ) - Spacer(Modifier.width(16.dp)) + Spacer(Modifier.width(ShxSpacing.lg)) Column(Modifier.weight(1f)) { Text( @@ -184,7 +183,7 @@ internal fun RoutingHeroCard( ) } Switch(checked = enabled, onCheckedChange = onToggle) - Spacer(Modifier.width(8.dp)) + Spacer(Modifier.width(ShxSpacing.sm)) } } } @@ -198,11 +197,11 @@ internal fun RfActionRow(onClick: () -> Unit) modifier = Modifier .fillMaxWidth() .clickable(onClick = onClick) - .padding(horizontal = 16.dp, vertical = 14.dp), + .padding(horizontal = ShxSpacing.lg, vertical = 14.dp), ) { ShxIconBadge(Icons.Rounded.Block) - Spacer(Modifier.width(16.dp)) + Spacer(Modifier.width(ShxSpacing.lg)) Column(Modifier.weight(1f)) { Text( diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/routing/RuleSetList.kt b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/routing/RuleSetList.kt index 358fcc30f..9e51d31b3 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/routing/RuleSetList.kt +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/compose/routing/RuleSetList.kt @@ -124,7 +124,6 @@ import org.strongswan.android.ui.compose.components.ShxIconBadge import org.strongswan.android.ui.compose.components.ShxSection import org.strongswan.android.ui.compose.components.ShxSectionDivider import org.strongswan.android.ui.compose.theme.LocalShxStatusColors -import org.strongswan.android.ui.compose.theme.ScreenPadding import org.strongswan.android.ui.compose.theme.ShxSpacing /** Collapsed rule set row: tap opens the editor sheet, the switch toggles in place. */ @@ -140,14 +139,14 @@ internal fun RuleSetRow( modifier = Modifier .fillMaxWidth() .clickable(onClick = onOpen) - .padding(horizontal = 16.dp, vertical = 14.dp), + .padding(horizontal = ShxSpacing.lg, vertical = 14.dp), ) { ShxIconBadge( Icons.Rounded.Rule, tint = if (ruleSet.enabled) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant, ) - Spacer(Modifier.width(16.dp)) + Spacer(Modifier.width(ShxSpacing.lg)) Column(Modifier.weight(1f)) { Text( @@ -179,7 +178,7 @@ internal fun AddRuleRow(onClick: () -> Unit) modifier = Modifier .fillMaxWidth() .clickable(onClick = onClick) - .padding(horizontal = 16.dp, vertical = 14.dp), + .padding(horizontal = ShxSpacing.lg, vertical = 14.dp), ) { Icon( @@ -188,7 +187,7 @@ internal fun AddRuleRow(onClick: () -> Unit) tint = MaterialTheme.colorScheme.primary, modifier = Modifier.size(22.dp), ) - Spacer(Modifier.width(16.dp)) + Spacer(Modifier.width(ShxSpacing.lg)) Text( stringResource(R.string.routing_add_rule), style = MaterialTheme.typography.bodyLarge,