mirror of
https://github.com/wgtunnel/android.git
synced 2026-07-03 14:07:49 +02:00
refactor: additional ui changes
This commit is contained in:
@@ -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
|
||||
|
||||
-12
@@ -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(
|
||||
|
||||
+12
-9
@@ -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),
|
||||
)
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-3
@@ -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,
|
||||
|
||||
+3
-3
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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
|
||||
+85
-70
@@ -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) },
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+9
@@ -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),
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user