summaryrefslogtreecommitdiffhomepage
path: root/android/app
diff options
context:
space:
mode:
authorDavid Göransson <david.goransson@mullvad.net>2024-06-03 13:48:17 +0200
committerDavid Göransson <david.goransson@mullvad.net>2024-06-04 08:27:03 +0200
commit270c44a7a5e0f427d2fb4efc3de7a2dda178cb30 (patch)
treed6dfc363ad439b0284100ff6a2500844082c8109 /android/app
parent3ac0f264402e42a16f0bd6c76e1a6a67e01ed4ef (diff)
downloadmullvadvpn-270c44a7a5e0f427d2fb4efc3de7a2dda178cb30.tar.xz
mullvadvpn-270c44a7a5e0f427d2fb4efc3de7a2dda178cb30.zip
Add support for UDP-over-TCP port
Diffstat (limited to 'android/app')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt35
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/VpnSettingsUiState.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/constant/WireguardConstant.kt1
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/SettingsRepository.kt5
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt15
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModelState.kt3
6 files changed, 58 insertions, 4 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt
index 7eee7c1398..46420583c3 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt
@@ -84,6 +84,7 @@ import net.mullvad.mullvadvpn.compose.transitions.SlideInFromRightTransition
import net.mullvad.mullvadvpn.compose.util.LaunchedEffectCollect
import net.mullvad.mullvadvpn.compose.util.OnNavResultValue
import net.mullvad.mullvadvpn.compose.util.showSnackbarImmediately
+import net.mullvad.mullvadvpn.constant.UDP2TCP_PRESET_PORTS
import net.mullvad.mullvadvpn.constant.WIREGUARD_PRESET_PORTS
import net.mullvad.mullvadvpn.lib.model.Constraint
import net.mullvad.mullvadvpn.lib.model.Mtu
@@ -258,6 +259,7 @@ fun VpnSettings(
onSelectObfuscationSetting = vm::onSelectObfuscationSetting,
onSelectQuantumResistanceSetting = vm::onSelectQuantumResistanceSetting,
onWireguardPortSelected = vm::onWireguardPortSelected,
+ onObfuscationPortSelected = vm::onObfuscationPortSelected,
)
}
@@ -293,8 +295,10 @@ fun VpnSettingsScreen(
onSelectObfuscationSetting: (selectedObfuscation: SelectedObfuscation) -> Unit = {},
onSelectQuantumResistanceSetting: (quantumResistant: QuantumResistantState) -> Unit = {},
onWireguardPortSelected: (port: Constraint<Port>) -> Unit = {},
+ onObfuscationPortSelected: (port: Constraint<Port>) -> Unit = {},
) {
var expandContentBlockersState by rememberSaveable { mutableStateOf(false) }
+ var expandUdp2TcpPortSettings by rememberSaveable { mutableStateOf(false) }
val biggerPadding = 54.dp
val topPadding = 6.dp
@@ -583,6 +587,37 @@ fun VpnSettingsScreen(
}
itemWithDivider {
+ ExpandableComposeCell(
+ title = stringResource(R.string.udp_over_tcp_port_title),
+ isExpanded = expandUdp2TcpPortSettings,
+ onInfoClicked = navigateUdp2TcpInfo,
+ onCellClicked = { expandUdp2TcpPortSettings = !expandUdp2TcpPortSettings }
+ )
+ }
+
+ if (expandUdp2TcpPortSettings) {
+ itemWithDivider {
+ SelectableCell(
+ title = stringResource(id = R.string.automatic),
+ isSelected = state.selectedObfuscationPort is Constraint.Any,
+ onCellClicked = { onObfuscationPortSelected(Constraint.Any) }
+ )
+ }
+
+ UDP2TCP_PRESET_PORTS.forEach { port ->
+ itemWithDivider {
+ SelectableCell(
+ title = port.toString(),
+ isSelected = state.selectedObfuscationPort.hasValue(port),
+ onCellClicked = {
+ onObfuscationPortSelected(Constraint.Only(Port(port)))
+ }
+ )
+ }
+ }
+ }
+
+ itemWithDivider {
Spacer(modifier = Modifier.height(Dimens.cellLabelVerticalPadding))
InformationComposeCell(
title = stringResource(R.string.quantum_resistant_title),
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/VpnSettingsUiState.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/VpnSettingsUiState.kt
index dd9802db2c..cefc5edb7a 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/VpnSettingsUiState.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/state/VpnSettingsUiState.kt
@@ -17,6 +17,7 @@ data class VpnSettingsUiState(
val customDnsItems: List<CustomDnsItem>,
val contentBlockersOptions: DefaultDnsOptions,
val selectedObfuscation: SelectedObfuscation,
+ val selectedObfuscationPort: Constraint<Port>,
val quantumResistant: QuantumResistantState,
val selectedWireguardPort: Constraint<Port>,
val customWireguardPort: Constraint<Port>?,
@@ -33,6 +34,7 @@ data class VpnSettingsUiState(
customDnsItems: List<CustomDnsItem> = emptyList(),
contentBlockersOptions: DefaultDnsOptions = DefaultDnsOptions(),
selectedObfuscation: SelectedObfuscation = SelectedObfuscation.Off,
+ selectedObfuscationPort: Constraint<Port> = Constraint.Any,
quantumResistant: QuantumResistantState = QuantumResistantState.Off,
selectedWireguardPort: Constraint<Port> = Constraint.Any,
customWireguardPort: Constraint.Only<Port>? = null,
@@ -47,6 +49,7 @@ data class VpnSettingsUiState(
customDnsItems,
contentBlockersOptions,
selectedObfuscation,
+ selectedObfuscationPort,
quantumResistant,
selectedWireguardPort,
customWireguardPort,
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/constant/WireguardConstant.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/constant/WireguardConstant.kt
index b4ed1e29a9..6f6cb5a79b 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/constant/WireguardConstant.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/constant/WireguardConstant.kt
@@ -1,3 +1,4 @@
package net.mullvad.mullvadvpn.constant
val WIREGUARD_PRESET_PORTS = listOf(51820, 53)
+val UDP2TCP_PRESET_PORTS = listOf(80, 5001)
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/SettingsRepository.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/SettingsRepository.kt
index b721442197..a1a1ed007a 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/SettingsRepository.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/SettingsRepository.kt
@@ -8,12 +8,14 @@ import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.stateIn
import net.mullvad.mullvadvpn.lib.daemon.grpc.ManagementService
+import net.mullvad.mullvadvpn.lib.model.Constraint
import net.mullvad.mullvadvpn.lib.model.CustomDnsOptions
import net.mullvad.mullvadvpn.lib.model.DefaultDnsOptions
import net.mullvad.mullvadvpn.lib.model.DnsOptions
import net.mullvad.mullvadvpn.lib.model.DnsState
import net.mullvad.mullvadvpn.lib.model.Mtu
import net.mullvad.mullvadvpn.lib.model.ObfuscationSettings
+import net.mullvad.mullvadvpn.lib.model.Port
import net.mullvad.mullvadvpn.lib.model.QuantumResistantState
import net.mullvad.mullvadvpn.lib.model.Settings
@@ -52,6 +54,9 @@ class SettingsRepository(
suspend fun addCustomDns(address: InetAddress) = managementService.addCustomDns(address)
+ suspend fun setCustomObfuscationPort(constraint: Constraint<Port>) =
+ managementService.setObfuscationPort(constraint)
+
suspend fun setWireguardMtu(mtu: Mtu) = managementService.setWireguardMtu(mtu.value)
suspend fun resetWireguardMtu() = managementService.resetWireguardMtu()
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt
index 864d402fb3..0ad91af8cc 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModel.kt
@@ -57,10 +57,11 @@ class VpnSettingsViewModel(
private val customPort = MutableStateFlow<Constraint<Port>?>(null)
private val vmState =
- combine(repository.settingsUpdates, relayListRepository.portRanges, customPort) {
- settings,
- portRanges,
- customWgPort ->
+ combine(
+ repository.settingsUpdates,
+ relayListRepository.portRanges,
+ customPort,
+ ) { settings, portRanges, customWgPort ->
VpnSettingsViewModelState(
mtuValue = settings?.tunnelOptions?.wireguard?.mtu,
isAutoConnectEnabled = settings?.autoConnect ?: false,
@@ -71,6 +72,8 @@ class VpnSettingsViewModel(
settings?.contentBlockersSettings() ?: DefaultDnsOptions(),
selectedObfuscation =
settings?.selectedObfuscationSettings() ?: SelectedObfuscation.Off,
+ selectedObfuscationPort =
+ settings?.obfuscationSettings?.udp2tcp?.port ?: Constraint.Any,
quantumResistant = settings?.quantumResistant() ?: QuantumResistantState.Off,
selectedWireguardPort = settings?.getWireguardPort() ?: Constraint.Any,
customWireguardPort = customWgPort,
@@ -214,6 +217,10 @@ class VpnSettingsViewModel(
}
}
+ fun onObfuscationPortSelected(port: Constraint<Port>) {
+ viewModelScope.launch { repository.setCustomObfuscationPort(port) }
+ }
+
fun onSelectQuantumResistanceSetting(quantumResistant: QuantumResistantState) {
viewModelScope.launch(dispatcher) {
repository.setWireguardQuantumResistant(quantumResistant).onLeft {
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModelState.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModelState.kt
index f8e4f0b799..d8be8d1cf2 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModelState.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VpnSettingsViewModelState.kt
@@ -17,6 +17,7 @@ data class VpnSettingsViewModelState(
val customDnsList: List<CustomDnsItem>,
val contentBlockersOptions: DefaultDnsOptions,
val selectedObfuscation: SelectedObfuscation,
+ val selectedObfuscationPort: Constraint<Port>,
val quantumResistant: QuantumResistantState,
val selectedWireguardPort: Constraint<Port>,
val customWireguardPort: Constraint<Port>?,
@@ -32,6 +33,7 @@ data class VpnSettingsViewModelState(
customDnsList,
contentBlockersOptions,
selectedObfuscation,
+ selectedObfuscationPort,
quantumResistant,
selectedWireguardPort,
customWireguardPort,
@@ -49,6 +51,7 @@ data class VpnSettingsViewModelState(
customDnsList = listOf(),
contentBlockersOptions = DefaultDnsOptions(),
selectedObfuscation = SelectedObfuscation.Auto,
+ selectedObfuscationPort = Constraint.Any,
quantumResistant = QuantumResistantState.Off,
selectedWireguardPort = Constraint.Any,
customWireguardPort = null,