diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/MainActivity.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/MainActivity.kt
index 2ba713da..3158efc1 100644
--- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/MainActivity.kt
+++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/MainActivity.kt
@@ -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
diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/navigation/components/currentBackStackEntryAsNavbarState.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/navigation/components/currentBackStackEntryAsNavbarState.kt
index 5f0d6ed4..de110c55 100644
--- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/navigation/components/currentBackStackEntryAsNavbarState.kt
+++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/navigation/components/currentBackStackEntryAsNavbarState.kt
@@ -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(
diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsScreen.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsScreen.kt
index 1bcf9723..d0dc788d 100644
--- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsScreen.kt
+++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/SettingsScreen.kt
@@ -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),
+ )
+ },
+ )
}
}
}
diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/TunnelMonitoringScreen.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/TunnelMonitoringScreen.kt
index 30762dd5..2aa94154 100644
--- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/TunnelMonitoringScreen.kt
+++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/TunnelMonitoringScreen.kt
@@ -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,
diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/LogsScreen.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/logs/LogsScreen.kt
similarity index 94%
rename from app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/LogsScreen.kt
rename to app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/logs/LogsScreen.kt
index ccd4ffb5..c738ca4a 100644
--- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/LogsScreen.kt
+++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/logs/LogsScreen.kt
@@ -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
diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components/LogItem.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/logs/components/LogItem.kt
similarity index 98%
rename from app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components/LogItem.kt
rename to app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/logs/components/LogItem.kt
index 3d8b8f89..cf8c6db3 100644
--- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components/LogItem.kt
+++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/logs/components/LogItem.kt
@@ -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
diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components/LogList.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/logs/components/LogList.kt
similarity index 97%
rename from app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components/LogList.kt
rename to app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/logs/components/LogList.kt
index 5a095bf8..c99452a1 100644
--- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components/LogList.kt
+++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/logs/components/LogList.kt
@@ -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
diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components/LogsBottomSheet.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/logs/components/LogsBottomSheet.kt
similarity index 98%
rename from app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components/LogsBottomSheet.kt
rename to app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/logs/components/LogsBottomSheet.kt
index 1e5eae1c..55353ff0 100644
--- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components/LogsBottomSheet.kt
+++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/monitoring/logs/components/LogsBottomSheet.kt
@@ -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
diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/system/AndroidIntegrationsScreen.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/system/AndroidIntegrationsScreen.kt
index d2b323ba..ecbe2b65 100644
--- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/system/AndroidIntegrationsScreen.kt
+++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/system/AndroidIntegrationsScreen.kt
@@ -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) },
+ )
+ }
}
}
diff --git a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/tunneloptions/TunnelOptionsScreen.kt b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/tunneloptions/TunnelOptionsScreen.kt
index a6326b15..74389125 100644
--- a/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/tunneloptions/TunnelOptionsScreen.kt
+++ b/app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/tunneloptions/TunnelOptionsScreen.kt
@@ -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),
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index cb9f0315..6de2681a 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -88,7 +88,7 @@
Enable app lock
Restart on ping fail (beta)
Set as mobile data tunnel
- Tunnel to be used when no preferred tunnel is configured
+ Tunnel used when no preferred tunnel is configured
Use tunnel on wifi name
Edit tunnel
Settings
@@ -139,7 +139,7 @@
Tunnel running
Monitoring state changes
Donate to project
- Local logging
+ Local logs monitor
Enable local logging
Add from clipboard
Stop on no internet
@@ -410,4 +410,6 @@
Wi-Fi settings
Ping
Ping monitor
+ Backup and restore
+ Reliability