refactor: additional ui changes

This commit is contained in:
Zane Schepke
2025-10-11 21:46:33 -04:00
parent 71461f4d0b
commit 5fddf03523
11 changed files with 118 additions and 103 deletions
@@ -70,8 +70,8 @@ import com.zaneschepke.wireguardautotunnel.ui.screens.settings.appearance.displa
import com.zaneschepke.wireguardautotunnel.ui.screens.settings.appearance.language.LanguageScreen
import com.zaneschepke.wireguardautotunnel.ui.screens.settings.dns.DnsSettingsScreen
import com.zaneschepke.wireguardautotunnel.ui.screens.settings.globals.TunnelGlobalsScreen
import com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs.LogsScreen
import com.zaneschepke.wireguardautotunnel.ui.screens.settings.monitoring.TunnelMonitoringScreen
import com.zaneschepke.wireguardautotunnel.ui.screens.settings.monitoring.logs.LogsScreen
import com.zaneschepke.wireguardautotunnel.ui.screens.settings.system.AndroidIntegrationsScreen
import com.zaneschepke.wireguardautotunnel.ui.screens.support.SupportScreen
import com.zaneschepke.wireguardautotunnel.ui.screens.support.donate.DonateScreen
@@ -176,18 +176,6 @@ fun currentRouteAsNavbarState(
NavbarState(
showBottomItems = true,
topTitle = context.getString(R.string.settings),
topTrailing = {
IconButton(
onClick = {
sharedViewModel.postSideEffect(LocalSideEffect.Sheet.BackupApp)
}
) {
Icon(
Icons.Rounded.SettingsBackupRestore,
stringResource(R.string.quick_actions),
)
}
},
)
Sort ->
NavbarState(
@@ -14,6 +14,7 @@ import androidx.compose.material.icons.outlined.ExpandMore
import androidx.compose.material.icons.outlined.Lan
import androidx.compose.material.icons.outlined.MonitorHeart
import androidx.compose.material.icons.outlined.Pin
import androidx.compose.material.icons.outlined.SettingsBackupRestore
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
@@ -40,14 +41,12 @@ import com.zaneschepke.wireguardautotunnel.ui.common.text.DescriptionText
import com.zaneschepke.wireguardautotunnel.ui.navigation.Route
import com.zaneschepke.wireguardautotunnel.ui.screens.settings.components.*
import com.zaneschepke.wireguardautotunnel.ui.screens.settings.proxy.compoents.AppModeBottomSheet
import com.zaneschepke.wireguardautotunnel.ui.sideeffect.LocalSideEffect
import com.zaneschepke.wireguardautotunnel.util.StringValue
import com.zaneschepke.wireguardautotunnel.util.extensions.asString
import com.zaneschepke.wireguardautotunnel.util.extensions.asTitleString
import com.zaneschepke.wireguardautotunnel.util.extensions.capitalize
import com.zaneschepke.wireguardautotunnel.viewmodel.SettingsViewModel
import java.util.Locale
import org.orbitmvi.orbit.compose.collectSideEffect
@Composable
fun SettingsScreen(viewModel: SettingsViewModel = hiltViewModel()) {
@@ -74,13 +73,6 @@ fun SettingsScreen(viewModel: SettingsViewModel = hiltViewModel()) {
}
val dnsEnabled by rememberSaveable(appMode) { mutableStateOf(appMode != AppMode.KERNEL) }
sharedViewModel.collectSideEffect { sideEffect ->
when (sideEffect) {
LocalSideEffect.Sheet.BackupApp -> showBackupSheet = true
else -> Unit
}
}
val showProxySettings by
remember(settingsState.settings.appMode) {
derivedStateOf {
@@ -239,6 +231,17 @@ fun SettingsScreen(viewModel: SettingsViewModel = hiltViewModel()) {
}
},
)
SurfaceRow(
leading = { Icon(Icons.Outlined.SettingsBackupRestore, contentDescription = null) },
title = stringResource(R.string.backup_and_restore),
onClick = { showBackupSheet = true },
trailing = {
Icon(
Icons.Outlined.ExpandMore,
contentDescription = stringResource(R.string.select),
)
},
)
}
}
}
@@ -31,7 +31,6 @@ import com.zaneschepke.wireguardautotunnel.ui.common.button.SurfaceRow
import com.zaneschepke.wireguardautotunnel.ui.common.button.SwitchWithDivider
import com.zaneschepke.wireguardautotunnel.ui.common.dropdown.LabelledDropdown
import com.zaneschepke.wireguardautotunnel.ui.common.label.GroupLabel
import com.zaneschepke.wireguardautotunnel.ui.common.text.DescriptionText
import com.zaneschepke.wireguardautotunnel.ui.navigation.Route
import com.zaneschepke.wireguardautotunnel.viewmodel.SettingsViewModel
@@ -57,7 +56,7 @@ fun TunnelMonitoringScreen(viewModel: SettingsViewModel = hiltViewModel()) {
title = stringResource(R.string.ping_monitor),
trailing = {
ScaledSwitch(
checked = settingsState.showDetailedPingStats,
checked = settingsState.settings.isPingEnabled,
onClick = { viewModel.setPingEnabled(it) },
)
},
@@ -120,7 +119,6 @@ fun TunnelMonitoringScreen(viewModel: SettingsViewModel = hiltViewModel()) {
SurfaceRow(
leading = { Icon(Icons.Outlined.ViewHeadline, contentDescription = null) },
title = stringResource(R.string.local_logging),
description = { DescriptionText(stringResource(R.string.enable_local_logging)) },
trailing = { modifier ->
SwitchWithDivider(
checked = settingsState.isLocalLoggingEnabled,
@@ -1,4 +1,4 @@
package com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs
package com.zaneschepke.wireguardautotunnel.ui.screens.settings.monitoring.logs
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
@@ -15,8 +15,8 @@ import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.zaneschepke.wireguardautotunnel.R
import com.zaneschepke.wireguardautotunnel.ui.LocalSharedVm
import com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs.components.LogList
import com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs.components.LogsBottomSheet
import com.zaneschepke.wireguardautotunnel.ui.screens.settings.monitoring.logs.components.LogList
import com.zaneschepke.wireguardautotunnel.ui.screens.settings.monitoring.logs.components.LogsBottomSheet
import com.zaneschepke.wireguardautotunnel.ui.sideeffect.LocalSideEffect
import com.zaneschepke.wireguardautotunnel.viewmodel.LoggerViewModel
import org.orbitmvi.orbit.compose.collectSideEffect
@@ -1,4 +1,4 @@
package com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs.components
package com.zaneschepke.wireguardautotunnel.ui.screens.settings.monitoring.logs.components
import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource
@@ -1,4 +1,4 @@
package com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs.components
package com.zaneschepke.wireguardautotunnel.ui.screens.settings.monitoring.logs.components
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.padding
@@ -1,4 +1,4 @@
package com.zaneschepke.wireguardautotunnel.ui.screens.settings.logs.components
package com.zaneschepke.wireguardautotunnel.ui.screens.settings.monitoring.logs.components
import android.net.Uri
import androidx.compose.material.icons.Icons
@@ -5,6 +5,7 @@ import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
@@ -32,6 +33,7 @@ import com.zaneschepke.wireguardautotunnel.ui.common.SecureScreenFromRecording
import com.zaneschepke.wireguardautotunnel.ui.common.button.ScaledSwitch
import com.zaneschepke.wireguardautotunnel.ui.common.button.SurfaceRow
import com.zaneschepke.wireguardautotunnel.ui.common.functions.rememberClipboardHelper
import com.zaneschepke.wireguardautotunnel.ui.common.label.GroupLabel
import com.zaneschepke.wireguardautotunnel.util.extensions.launchVpnSettings
import com.zaneschepke.wireguardautotunnel.viewmodel.SettingsViewModel
@@ -47,78 +49,91 @@ fun AndroidIntegrationsScreen(viewModel: SettingsViewModel = hiltViewModel()) {
Column(
horizontalAlignment = Alignment.Start,
verticalArrangement = Arrangement.spacedBy(12.dp, Alignment.Top),
verticalArrangement = Arrangement.spacedBy(16.dp, Alignment.Top),
modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()),
) {
SurfaceRow(
leading = { Icon(Icons.Outlined.AdminPanelSettings, contentDescription = null) },
title = stringResource(R.string.native_kill_switch),
trailing = { Icon(Icons.AutoMirrored.Outlined.Launch, null) },
onClick = { context.launchVpnSettings() },
)
SurfaceRow(
leading = { Icon(Icons.Outlined.Restore, contentDescription = null) },
trailing = {
ScaledSwitch(
checked = settingsState.settings.isRestoreOnBootEnabled,
onClick = { viewModel.setRestoreOnBootEnabled(it) },
)
},
title = stringResource(R.string.restart_at_boot),
onClick = {
viewModel.setRestoreOnBootEnabled(!settingsState.settings.isRestoreOnBootEnabled)
},
)
SurfaceRow(
leading = { Icon(Icons.Outlined.VpnLock, contentDescription = null) },
trailing = {
ScaledSwitch(
checked = settingsState.settings.isAlwaysOnVpnEnabled,
onClick = { viewModel.setAlwaysOnVpnEnabled(it) },
)
},
title = stringResource(R.string.always_on_vpn_support),
onClick = {
viewModel.setAlwaysOnVpnEnabled(!settingsState.settings.isAlwaysOnVpnEnabled)
},
)
SurfaceRow(
leading = { Icon(Icons.Filled.AppShortcut, contentDescription = null) },
trailing = {
ScaledSwitch(
checked = settingsState.settings.isShortcutsEnabled,
onClick = { viewModel.setShortcutsEnabled(it) },
)
},
title = stringResource(R.string.enabled_app_shortcuts),
onClick = { viewModel.setShortcutsEnabled(!settingsState.settings.isShortcutsEnabled) },
)
SurfaceRow(
leading = { Icon(Icons.Filled.SmartToy, contentDescription = null) },
trailing = {
ScaledSwitch(
checked = settingsState.isRemoteEnabled,
onClick = { viewModel.setRemoteEnabled(it) },
)
},
description = {
settingsState.remoteKey?.let { key ->
AnimatedVisibility(visible = settingsState.isRemoteEnabled) {
Text(
text = stringResource(R.string.remote_key_template, key),
style =
MaterialTheme.typography.bodySmall.copy(
color = MaterialTheme.colorScheme.outline
),
maxLines = 1,
overflow = TextOverflow.Ellipsis,
modifier = Modifier.clickable { clipboard.copy(key) },
)
Column {
GroupLabel(stringResource(id = R.string.vpn), Modifier.padding(horizontal = 16.dp))
SurfaceRow(
leading = { Icon(Icons.Outlined.AdminPanelSettings, contentDescription = null) },
title = stringResource(R.string.native_kill_switch),
trailing = { Icon(Icons.AutoMirrored.Outlined.Launch, null) },
onClick = { context.launchVpnSettings() },
)
SurfaceRow(
leading = { Icon(Icons.Outlined.VpnLock, contentDescription = null) },
trailing = {
ScaledSwitch(
checked = settingsState.settings.isAlwaysOnVpnEnabled,
onClick = { viewModel.setAlwaysOnVpnEnabled(it) },
)
},
title = stringResource(R.string.always_on_vpn_support),
onClick = {
viewModel.setAlwaysOnVpnEnabled(!settingsState.settings.isAlwaysOnVpnEnabled)
},
)
}
Column {
GroupLabel(
stringResource(id = R.string.tunnel_control),
Modifier.padding(horizontal = 16.dp),
)
SurfaceRow(
leading = { Icon(Icons.Outlined.Restore, contentDescription = null) },
trailing = {
ScaledSwitch(
checked = settingsState.settings.isRestoreOnBootEnabled,
onClick = { viewModel.setRestoreOnBootEnabled(it) },
)
},
title = stringResource(R.string.restart_at_boot),
onClick = {
viewModel.setRestoreOnBootEnabled(
!settingsState.settings.isRestoreOnBootEnabled
)
},
)
SurfaceRow(
leading = { Icon(Icons.Filled.AppShortcut, contentDescription = null) },
trailing = {
ScaledSwitch(
checked = settingsState.settings.isShortcutsEnabled,
onClick = { viewModel.setShortcutsEnabled(it) },
)
},
title = stringResource(R.string.enabled_app_shortcuts),
onClick = {
viewModel.setShortcutsEnabled(!settingsState.settings.isShortcutsEnabled)
},
)
SurfaceRow(
leading = { Icon(Icons.Filled.SmartToy, contentDescription = null) },
trailing = {
ScaledSwitch(
checked = settingsState.isRemoteEnabled,
onClick = { viewModel.setRemoteEnabled(it) },
)
},
description = {
settingsState.remoteKey?.let { key ->
AnimatedVisibility(visible = settingsState.isRemoteEnabled) {
Text(
text = stringResource(R.string.remote_key_template, key),
style =
MaterialTheme.typography.bodySmall.copy(
color = MaterialTheme.colorScheme.outline
),
maxLines = 1,
overflow = TextOverflow.Ellipsis,
modifier = Modifier.clickable { clipboard.copy(key) },
)
}
}
}
},
title = stringResource(R.string.enable_remote_app_control),
onClick = { viewModel.setRemoteEnabled(!settingsState.isRemoteEnabled) },
)
},
title = stringResource(R.string.enable_remote_app_control),
onClick = { viewModel.setRemoteEnabled(!settingsState.isRemoteEnabled) },
)
}
}
}
@@ -38,6 +38,7 @@ import com.zaneschepke.wireguardautotunnel.ui.LocalNavController
import com.zaneschepke.wireguardautotunnel.ui.LocalSharedVm
import com.zaneschepke.wireguardautotunnel.ui.common.button.ScaledSwitch
import com.zaneschepke.wireguardautotunnel.ui.common.button.SurfaceRow
import com.zaneschepke.wireguardautotunnel.ui.common.label.GroupLabel
import com.zaneschepke.wireguardautotunnel.ui.common.text.DescriptionText
import com.zaneschepke.wireguardautotunnel.ui.common.textbox.CustomTextField
import com.zaneschepke.wireguardautotunnel.ui.navigation.Route
@@ -73,6 +74,10 @@ fun TunnelOptionsScreen(viewModel: TunnelViewModel) {
modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()),
) {
Column {
GroupLabel(
stringResource(R.string.general),
modifier = Modifier.padding(horizontal = 16.dp),
)
SurfaceRow(
leading = { Icon(Icons.Outlined.Star, contentDescription = null) },
title = stringResource(R.string.primary_tunnel),
@@ -102,6 +107,10 @@ fun TunnelOptionsScreen(viewModel: TunnelViewModel) {
)
}
Column {
GroupLabel(
stringResource(R.string.reliability),
modifier = Modifier.padding(horizontal = 16.dp),
)
SurfaceRow(
leading = { Icon(Icons.Outlined.Dns, contentDescription = null) },
title = stringResource(R.string.ddns_auto_update),
+4 -2
View File
@@ -88,7 +88,7 @@
<string name="enable_app_lock">Enable app lock</string>
<string name="restart_on_ping">Restart on ping fail (beta)</string>
<string name="mobile_data_tunnel">Set as mobile data tunnel</string>
<string name="set_primary_tunnel">Tunnel to be used when no preferred tunnel is configured</string>
<string name="set_primary_tunnel">Tunnel used when no preferred tunnel is configured</string>
<string name="use_tunnel_on_wifi_name">Use tunnel on wifi name</string>
<string name="edit_tunnel">Edit tunnel</string>
<string name="settings">Settings</string>
@@ -139,7 +139,7 @@
<string name="tunnel_running">Tunnel running</string>
<string name="monitoring_state_changes">Monitoring state changes</string>
<string name="donate">Donate to project</string>
<string name="local_logging">Local logging</string>
<string name="local_logging">Local logs monitor</string>
<string name="enable_local_logging">Enable local logging</string>
<string name="add_from_clipboard">Add from clipboard</string>
<string name="stop_on_no_internet">Stop on no internet</string>
@@ -410,4 +410,6 @@
<string name="wifi_settings">Wi-Fi settings</string>
<string name="ping">Ping</string>
<string name="ping_monitor">Ping monitor</string>
<string name="backup_and_restore">Backup and restore</string>
<string name="reliability">Reliability</string>
</resources>