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