summaryrefslogtreecommitdiffhomepage
path: root/android/lib
diff options
context:
space:
mode:
authorJonatan Rhodin <jonatan.rhodin@mullvad.net>2025-09-01 10:42:49 +0200
committerJonatan Rhodin <jonatan.rhodin@mullvad.net>2025-09-03 15:52:43 +0200
commite266d72875224a0522d50e55f0555a38deb45ff3 (patch)
treed5d07d35aab1c90f094fba9d77b935ce23071b8b /android/lib
parentf9693d2fe31c0c50027f69f5bd930d30dfa5c764 (diff)
downloadmullvadvpn-e266d72875224a0522d50e55f0555a38deb45ff3.tar.xz
mullvadvpn-e266d72875224a0522d50e55f0555a38deb45ff3.zip
Add UI support for QUIC setting
Diffstat (limited to 'android/lib')
-rw-r--r--android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/FromDomain.kt1
-rw-r--r--android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt22
-rw-r--r--android/lib/daemon-grpc/src/test/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/RelayNameComparatorTest.kt40
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/FeatureIndicator.kt1
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ObfuscationMode.kt1
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ObfuscationType.kt1
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Quic.kt8
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayItem.kt2
-rw-r--r--android/lib/resource/src/main/res/values-da/strings.xml2
-rw-r--r--android/lib/resource/src/main/res/values-de/strings.xml2
-rw-r--r--android/lib/resource/src/main/res/values-es/strings.xml2
-rw-r--r--android/lib/resource/src/main/res/values-fi/strings.xml2
-rw-r--r--android/lib/resource/src/main/res/values-fr/strings.xml2
-rw-r--r--android/lib/resource/src/main/res/values-it/strings.xml2
-rw-r--r--android/lib/resource/src/main/res/values-ja/strings.xml2
-rw-r--r--android/lib/resource/src/main/res/values-ko/strings.xml2
-rw-r--r--android/lib/resource/src/main/res/values-my/strings.xml2
-rw-r--r--android/lib/resource/src/main/res/values-nb/strings.xml2
-rw-r--r--android/lib/resource/src/main/res/values-nl/strings.xml2
-rw-r--r--android/lib/resource/src/main/res/values-pl/strings.xml2
-rw-r--r--android/lib/resource/src/main/res/values-pt/strings.xml2
-rw-r--r--android/lib/resource/src/main/res/values-ru/strings.xml2
-rw-r--r--android/lib/resource/src/main/res/values-sv/strings.xml2
-rw-r--r--android/lib/resource/src/main/res/values-th/strings.xml2
-rw-r--r--android/lib/resource/src/main/res/values-tr/strings.xml2
-rw-r--r--android/lib/resource/src/main/res/values-zh-rCN/strings.xml2
-rw-r--r--android/lib/resource/src/main/res/values-zh-rTW/strings.xml2
-rw-r--r--android/lib/resource/src/main/res/values/strings.xml2
-rw-r--r--android/lib/resource/src/main/res/values/strings_non_translatable.xml1
-rw-r--r--android/lib/ui/component/src/main/kotlin/net/mullvad/mullvadvpn/lib/ui/component/relaylist/RelayItemPreviewData.kt2
30 files changed, 71 insertions, 48 deletions
diff --git a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/FromDomain.kt b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/FromDomain.kt
index 113a5fc847..2424ff00a7 100644
--- a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/FromDomain.kt
+++ b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/FromDomain.kt
@@ -92,6 +92,7 @@ internal fun ObfuscationMode.fromDomain():
ManagementInterface.ObfuscationSettings.SelectedObfuscation.UDP2TCP
ObfuscationMode.Shadowsocks ->
ManagementInterface.ObfuscationSettings.SelectedObfuscation.SHADOWSOCKS
+ ObfuscationMode.Quic -> ManagementInterface.ObfuscationSettings.SelectedObfuscation.QUIC
ObfuscationMode.Auto -> ManagementInterface.ObfuscationSettings.SelectedObfuscation.AUTO
ObfuscationMode.Off -> ManagementInterface.ObfuscationSettings.SelectedObfuscation.OFF
}
diff --git a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt
index 140cf5aafb..9b4dd07056 100644
--- a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt
+++ b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt
@@ -59,6 +59,7 @@ import net.mullvad.mullvadvpn.lib.model.PortRange
import net.mullvad.mullvadvpn.lib.model.ProviderId
import net.mullvad.mullvadvpn.lib.model.Providers
import net.mullvad.mullvadvpn.lib.model.QuantumResistantState
+import net.mullvad.mullvadvpn.lib.model.Quic
import net.mullvad.mullvadvpn.lib.model.Recent
import net.mullvad.mullvadvpn.lib.model.Recents
import net.mullvad.mullvadvpn.lib.model.RedeemVoucherSuccess
@@ -207,6 +208,8 @@ internal fun ManagementInterface.ObfuscationEndpoint.toDomain(): ObfuscationEndp
obfuscationType = obfuscationType.toDomain(),
)
+private fun String.toInetAddress(): InetAddress = InetAddress.getByName(this)
+
private fun String.toInetSocketAddress(): InetSocketAddress {
val indexOfSeparator = indexOfLast { it == ':' }
val ipPart = substring(0, indexOfSeparator).filter { it !in listOf('[', ']') }
@@ -219,8 +222,7 @@ internal fun ManagementInterface.ObfuscationEndpoint.ObfuscationType.toDomain():
ManagementInterface.ObfuscationEndpoint.ObfuscationType.UDP2TCP -> ObfuscationType.Udp2Tcp
ManagementInterface.ObfuscationEndpoint.ObfuscationType.SHADOWSOCKS ->
ObfuscationType.Shadowsocks
- ManagementInterface.ObfuscationEndpoint.ObfuscationType.QUIC ->
- throw IllegalArgumentException("Unsupported obfuscation type")
+ ManagementInterface.ObfuscationEndpoint.ObfuscationType.QUIC -> ObfuscationType.Quic
ManagementInterface.ObfuscationEndpoint.ObfuscationType.UNRECOGNIZED ->
throw IllegalArgumentException("Unrecognized obfuscation type")
}
@@ -426,8 +428,7 @@ internal fun ManagementInterface.ObfuscationSettings.SelectedObfuscation.toDomai
ObfuscationMode.Udp2Tcp
ManagementInterface.ObfuscationSettings.SelectedObfuscation.SHADOWSOCKS ->
ObfuscationMode.Shadowsocks
- ManagementInterface.ObfuscationSettings.SelectedObfuscation.QUIC ->
- throw IllegalArgumentException("Unsupported obfuscation type")
+ ManagementInterface.ObfuscationSettings.SelectedObfuscation.QUIC -> ObfuscationMode.Quic
ManagementInterface.ObfuscationSettings.SelectedObfuscation.UNRECOGNIZED ->
throw IllegalArgumentException("Unrecognized selected obfuscation")
}
@@ -592,9 +593,17 @@ internal fun ManagementInterface.Relay.toDomain(
provider = ProviderId(provider),
ownership = if (owned) Ownership.MullvadOwned else Ownership.Rented,
daita = endpointData.wireguard.daita,
- quic = endpointData.wireguard.hasQuic(),
+ quic =
+ if (endpointData.wireguard.hasQuic()) {
+ endpointData.wireguard.quic.toDomain()
+ } else {
+ null
+ },
)
+private fun ManagementInterface.Relay.RelayData.Wireguard.Quic.toDomain(): Quic =
+ Quic(inAddresses = addrInList.map { it.toInetAddress() })
+
private fun Instant.atDefaultZone() = atZone(ZoneId.systemDefault())
internal fun ManagementInterface.Device.toDomain(): Device =
@@ -695,6 +704,7 @@ internal fun ManagementInterface.FeatureIndicators.toDomain(): List<FeatureIndic
internal fun ManagementInterface.TunnelOptions.GenericOptions.toDomain(): GenericOptions =
GenericOptions(enableIpv6 = enableIpv6)
+@Suppress("ComplexMethod")
internal fun ManagementInterface.FeatureIndicator.toDomain() =
when (this) {
ManagementInterface.FeatureIndicator.QUANTUM_RESISTANCE ->
@@ -712,7 +722,7 @@ internal fun ManagementInterface.FeatureIndicator.toDomain() =
ManagementInterface.FeatureIndicator.SHADOWSOCKS -> FeatureIndicator.SHADOWSOCKS
ManagementInterface.FeatureIndicator.MULTIHOP -> FeatureIndicator.MULTIHOP
ManagementInterface.FeatureIndicator.DAITA_MULTIHOP -> FeatureIndicator.DAITA_MULTIHOP
- ManagementInterface.FeatureIndicator.QUIC,
+ ManagementInterface.FeatureIndicator.QUIC -> FeatureIndicator.QUIC
ManagementInterface.FeatureIndicator.LOCKDOWN_MODE,
ManagementInterface.FeatureIndicator.BRIDGE_MODE,
ManagementInterface.FeatureIndicator.CUSTOM_MSS_FIX,
diff --git a/android/lib/daemon-grpc/src/test/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/RelayNameComparatorTest.kt b/android/lib/daemon-grpc/src/test/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/RelayNameComparatorTest.kt
index e45c8087fd..310b2ab1fd 100644
--- a/android/lib/daemon-grpc/src/test/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/RelayNameComparatorTest.kt
+++ b/android/lib/daemon-grpc/src/test/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/RelayNameComparatorTest.kt
@@ -26,7 +26,7 @@ class RelayNameComparatorTest {
provider = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
daita = false,
- quic = false,
+ quic = null,
)
val relay10 =
RelayItem.Location.Relay(
@@ -35,7 +35,7 @@ class RelayNameComparatorTest {
provider = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
daita = false,
- quic = false,
+ quic = null,
)
relay9 assertOrderBothDirection relay10
@@ -50,7 +50,7 @@ class RelayNameComparatorTest {
provider = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
daita = false,
- quic = false,
+ quic = null,
)
val relay9b =
RelayItem.Location.Relay(
@@ -59,7 +59,7 @@ class RelayNameComparatorTest {
provider = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
daita = false,
- quic = false,
+ quic = null,
)
assertTrue(RelayNameComparator.compare(relay9a, relay9b) == 0)
@@ -75,7 +75,7 @@ class RelayNameComparatorTest {
provider = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
daita = false,
- quic = false,
+ quic = null,
)
val relay1 =
RelayItem.Location.Relay(
@@ -84,7 +84,7 @@ class RelayNameComparatorTest {
provider = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
daita = false,
- quic = false,
+ quic = null,
)
val relay3 =
RelayItem.Location.Relay(
@@ -93,7 +93,7 @@ class RelayNameComparatorTest {
provider = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
daita = false,
- quic = false,
+ quic = null,
)
val relay100 =
RelayItem.Location.Relay(
@@ -102,7 +102,7 @@ class RelayNameComparatorTest {
provider = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
daita = false,
- quic = false,
+ quic = null,
)
relay001 assertOrderBothDirection relay1
@@ -120,7 +120,7 @@ class RelayNameComparatorTest {
provider = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
daita = false,
- quic = false,
+ quic = null,
)
val relay9b =
RelayItem.Location.Relay(
@@ -129,7 +129,7 @@ class RelayNameComparatorTest {
provider = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
daita = false,
- quic = false,
+ quic = null,
)
assertTrue(RelayNameComparator.compare(relay9a, relay9b) == 0)
@@ -145,7 +145,7 @@ class RelayNameComparatorTest {
provider = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
daita = false,
- quic = false,
+ quic = null,
)
val relay005 =
RelayItem.Location.Relay(
@@ -154,7 +154,7 @@ class RelayNameComparatorTest {
provider = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
daita = false,
- quic = false,
+ quic = null,
)
relay001 assertOrderBothDirection relay005
@@ -169,7 +169,7 @@ class RelayNameComparatorTest {
provider = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
daita = false,
- quic = false,
+ quic = null,
)
val relayAr8 =
RelayItem.Location.Relay(
@@ -178,7 +178,7 @@ class RelayNameComparatorTest {
provider = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
daita = false,
- quic = false,
+ quic = null,
)
val relaySe5 =
RelayItem.Location.Relay(
@@ -187,7 +187,7 @@ class RelayNameComparatorTest {
provider = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
daita = false,
- quic = false,
+ quic = null,
)
val relaySe10 =
RelayItem.Location.Relay(
@@ -196,7 +196,7 @@ class RelayNameComparatorTest {
provider = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
daita = false,
- quic = false,
+ quic = null,
)
relayAr2 assertOrderBothDirection relayAr8
@@ -213,7 +213,7 @@ class RelayNameComparatorTest {
provider = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
daita = false,
- quic = false,
+ quic = null,
)
val relay2w =
RelayItem.Location.Relay(
@@ -222,7 +222,7 @@ class RelayNameComparatorTest {
provider = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
daita = false,
- quic = false,
+ quic = null,
)
relay2c assertOrderBothDirection relay2w
@@ -237,7 +237,7 @@ class RelayNameComparatorTest {
provider = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
daita = false,
- quic = false,
+ quic = null,
)
val relay22b =
RelayItem.Location.Relay(
@@ -246,7 +246,7 @@ class RelayNameComparatorTest {
provider = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
daita = false,
- quic = false,
+ quic = null,
)
relay22a assertOrderBothDirection relay22b
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/FeatureIndicator.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/FeatureIndicator.kt
index 0213c06cef..6d7951749b 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/FeatureIndicator.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/FeatureIndicator.kt
@@ -9,6 +9,7 @@ enum class FeatureIndicator {
SPLIT_TUNNELING,
UDP_2_TCP,
SHADOWSOCKS,
+ QUIC,
LAN_SHARING,
DNS_CONTENT_BLOCKERS,
CUSTOM_DNS,
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ObfuscationMode.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ObfuscationMode.kt
index 7e4101e973..8926ded829 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ObfuscationMode.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ObfuscationMode.kt
@@ -5,4 +5,5 @@ enum class ObfuscationMode {
Off,
Udp2Tcp,
Shadowsocks,
+ Quic,
}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ObfuscationType.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ObfuscationType.kt
index 80c2f70e13..5eb0ad5548 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ObfuscationType.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/ObfuscationType.kt
@@ -3,4 +3,5 @@ package net.mullvad.mullvadvpn.lib.model
enum class ObfuscationType {
Udp2Tcp,
Shadowsocks,
+ Quic,
}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Quic.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Quic.kt
new file mode 100644
index 0000000000..01ebd96d3e
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/Quic.kt
@@ -0,0 +1,8 @@
+package net.mullvad.mullvadvpn.lib.model
+
+import java.net.InetAddress
+
+data class Quic(val inAddresses: List<InetAddress>) {
+ val supportsIpv4 = inAddresses.any { it is java.net.Inet4Address }
+ val supportsIpv6 = inAddresses.any { it is java.net.Inet6Address }
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayItem.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayItem.kt
index b1df67fea6..197e8e95ce 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayItem.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayItem.kt
@@ -85,7 +85,7 @@ sealed interface RelayItem {
val ownership: Ownership,
override val active: Boolean,
val daita: Boolean,
- val quic: Boolean,
+ val quic: Quic?,
) : Location {
override val name: String = id.code
override val hasChildren: Boolean = false
diff --git a/android/lib/resource/src/main/res/values-da/strings.xml b/android/lib/resource/src/main/res/values-da/strings.xml
index be26ab6e10..a395a1917d 100644
--- a/android/lib/resource/src/main/res/values-da/strings.xml
+++ b/android/lib/resource/src/main/res/values-da/strings.xml
@@ -191,8 +191,8 @@
<string name="feature_custom_dns">Brugerdefineret DNS</string>
<string name="feature_custom_mtu">MTU</string>
<string name="feature_indicators_show_more">%1$s mere ...</string>
+ <string name="feature_obfuscation">Tilsløring</string>
<string name="feature_quantum_resistant">Kvantemodstand</string>
- <string name="feature_udp_2_tcp">Tilsløring</string>
<string name="filter">Filter</string>
<string name="filters">Filtre:</string>
<string name="foreground_notification_channel_description">Viser den aktuelle VPN-tunnelstatus</string>
diff --git a/android/lib/resource/src/main/res/values-de/strings.xml b/android/lib/resource/src/main/res/values-de/strings.xml
index 12e43b5d9f..9070ee0abe 100644
--- a/android/lib/resource/src/main/res/values-de/strings.xml
+++ b/android/lib/resource/src/main/res/values-de/strings.xml
@@ -191,8 +191,8 @@
<string name="feature_custom_dns">Eigenes DNS</string>
<string name="feature_custom_mtu">MTU</string>
<string name="feature_indicators_show_more">%1$s weitere …</string>
+ <string name="feature_obfuscation">Verschleierung</string>
<string name="feature_quantum_resistant">Quantenresistenz</string>
- <string name="feature_udp_2_tcp">Verschleierung</string>
<string name="filter">Filter</string>
<string name="filters">Filter:</string>
<string name="foreground_notification_channel_description">Zeigt den aktuellen Status des VPN-Tunnels an</string>
diff --git a/android/lib/resource/src/main/res/values-es/strings.xml b/android/lib/resource/src/main/res/values-es/strings.xml
index b76ec33c1d..0a35370514 100644
--- a/android/lib/resource/src/main/res/values-es/strings.xml
+++ b/android/lib/resource/src/main/res/values-es/strings.xml
@@ -191,8 +191,8 @@
<string name="feature_custom_dns">DNS personalizado</string>
<string name="feature_custom_mtu">MTU</string>
<string name="feature_indicators_show_more">%1$s más...</string>
+ <string name="feature_obfuscation">Ofuscación</string>
<string name="feature_quantum_resistant">Resistencia cuántica</string>
- <string name="feature_udp_2_tcp">Ofuscación</string>
<string name="filter">Filtrar</string>
<string name="filters">Filtros:</string>
<string name="foreground_notification_channel_description">Muestra el estado actual del túnel VPN</string>
diff --git a/android/lib/resource/src/main/res/values-fi/strings.xml b/android/lib/resource/src/main/res/values-fi/strings.xml
index aca2052934..b90c8f021e 100644
--- a/android/lib/resource/src/main/res/values-fi/strings.xml
+++ b/android/lib/resource/src/main/res/values-fi/strings.xml
@@ -191,8 +191,8 @@
<string name="feature_custom_dns">Mukautettu DNS</string>
<string name="feature_custom_mtu">MTU</string>
<string name="feature_indicators_show_more">%1$s lisää...</string>
+ <string name="feature_obfuscation">Hämäysteknologia</string>
<string name="feature_quantum_resistant">Kvanttihyökkäysten esto</string>
- <string name="feature_udp_2_tcp">Hämäysteknologia</string>
<string name="filter">Suodatin</string>
<string name="filters">Suodattimet:</string>
<string name="foreground_notification_channel_description">Näyttää VPN-tunnelin nykyisen tilan</string>
diff --git a/android/lib/resource/src/main/res/values-fr/strings.xml b/android/lib/resource/src/main/res/values-fr/strings.xml
index e48f6b8bde..d03e810d5a 100644
--- a/android/lib/resource/src/main/res/values-fr/strings.xml
+++ b/android/lib/resource/src/main/res/values-fr/strings.xml
@@ -191,8 +191,8 @@
<string name="feature_custom_dns">DNS personnalisé</string>
<string name="feature_custom_mtu">MTU</string>
<string name="feature_indicators_show_more">%1$s de plus…</string>
+ <string name="feature_obfuscation">Dissimulation</string>
<string name="feature_quantum_resistant">Résistance quantique</string>
- <string name="feature_udp_2_tcp">Dissimulation</string>
<string name="filter">Filtrer</string>
<string name="filters">Filtres :</string>
<string name="foreground_notification_channel_description">Affiche l\'état actuel du tunnel VPN</string>
diff --git a/android/lib/resource/src/main/res/values-it/strings.xml b/android/lib/resource/src/main/res/values-it/strings.xml
index 3c42bff12a..323129f829 100644
--- a/android/lib/resource/src/main/res/values-it/strings.xml
+++ b/android/lib/resource/src/main/res/values-it/strings.xml
@@ -191,8 +191,8 @@
<string name="feature_custom_dns">DNS personalizzato</string>
<string name="feature_custom_mtu">MTU</string>
<string name="feature_indicators_show_more">Altri %1$s...</string>
+ <string name="feature_obfuscation">Offuscamento</string>
<string name="feature_quantum_resistant">Resistenza ad attacchi quantistici</string>
- <string name="feature_udp_2_tcp">Offuscamento</string>
<string name="filter">Filtra</string>
<string name="filters">Filtri:</string>
<string name="foreground_notification_channel_description">Mostra lo stato attuale del tunnel VPN</string>
diff --git a/android/lib/resource/src/main/res/values-ja/strings.xml b/android/lib/resource/src/main/res/values-ja/strings.xml
index 0019bd8cf6..782968ccd7 100644
--- a/android/lib/resource/src/main/res/values-ja/strings.xml
+++ b/android/lib/resource/src/main/res/values-ja/strings.xml
@@ -191,8 +191,8 @@
<string name="feature_custom_dns">カスタムDNS</string>
<string name="feature_custom_mtu">MTU</string>
<string name="feature_indicators_show_more">その他%1$s件…</string>
+ <string name="feature_obfuscation">難読化</string>
<string name="feature_quantum_resistant">耐量子</string>
- <string name="feature_udp_2_tcp">難読化</string>
<string name="filter">絞り込み</string>
<string name="filters">絞り込み:</string>
<string name="foreground_notification_channel_description">現在のVPNトンネルのステータスを表示します</string>
diff --git a/android/lib/resource/src/main/res/values-ko/strings.xml b/android/lib/resource/src/main/res/values-ko/strings.xml
index 4d5e18e0cf..f39d896349 100644
--- a/android/lib/resource/src/main/res/values-ko/strings.xml
+++ b/android/lib/resource/src/main/res/values-ko/strings.xml
@@ -191,8 +191,8 @@
<string name="feature_custom_dns">사용자 지정 DNS</string>
<string name="feature_custom_mtu">MTU</string>
<string name="feature_indicators_show_more">%1$s개 더 보기...</string>
+ <string name="feature_obfuscation">난독 처리</string>
<string name="feature_quantum_resistant">양자 저항</string>
- <string name="feature_udp_2_tcp">난독 처리</string>
<string name="filter">필터</string>
<string name="filters">필터:</string>
<string name="foreground_notification_channel_description">현재 VPN 터널 상태 표시</string>
diff --git a/android/lib/resource/src/main/res/values-my/strings.xml b/android/lib/resource/src/main/res/values-my/strings.xml
index 98b9982cc1..b8fe2478e8 100644
--- a/android/lib/resource/src/main/res/values-my/strings.xml
+++ b/android/lib/resource/src/main/res/values-my/strings.xml
@@ -191,8 +191,8 @@
<string name="feature_custom_dns">စိတ်ကြိုက် DNS</string>
<string name="feature_custom_mtu">MTU</string>
<string name="feature_indicators_show_more">နောက်ထပ် %1$s ...</string>
+ <string name="feature_obfuscation">Obfuscation</string>
<string name="feature_quantum_resistant">Quantum ခုခံမှု</string>
- <string name="feature_udp_2_tcp">Obfuscation</string>
<string name="filter">စစ်ထုတ်မှု</string>
<string name="filters">စစ်ထုတ်မှုများ-</string>
<string name="foreground_notification_channel_description">လက်ရှိ VPN Tunnel အခြေအနေကို ပြသပေးပါသည်</string>
diff --git a/android/lib/resource/src/main/res/values-nb/strings.xml b/android/lib/resource/src/main/res/values-nb/strings.xml
index c0d6622923..ea93ba5503 100644
--- a/android/lib/resource/src/main/res/values-nb/strings.xml
+++ b/android/lib/resource/src/main/res/values-nb/strings.xml
@@ -191,8 +191,8 @@
<string name="feature_custom_dns">Tilpasset DNS</string>
<string name="feature_custom_mtu">MTU</string>
<string name="feature_indicators_show_more">%1$s til …</string>
+ <string name="feature_obfuscation">Tilsløring</string>
<string name="feature_quantum_resistant">Kvantemotstand</string>
- <string name="feature_udp_2_tcp">Tilsløring</string>
<string name="filter">Filter</string>
<string name="filters">Filtre:</string>
<string name="foreground_notification_channel_description">Viser gjeldende VPN-tunnelstatus</string>
diff --git a/android/lib/resource/src/main/res/values-nl/strings.xml b/android/lib/resource/src/main/res/values-nl/strings.xml
index e1d1619d8e..77d03bc2ea 100644
--- a/android/lib/resource/src/main/res/values-nl/strings.xml
+++ b/android/lib/resource/src/main/res/values-nl/strings.xml
@@ -191,8 +191,8 @@
<string name="feature_custom_dns">Aangepaste DNS</string>
<string name="feature_custom_mtu">MTU</string>
<string name="feature_indicators_show_more">Nog %1$s...</string>
+ <string name="feature_obfuscation">Obfuscatie</string>
<string name="feature_quantum_resistant">Kwantumbestendigheid</string>
- <string name="feature_udp_2_tcp">Obfuscatie</string>
<string name="filter">Filter</string>
<string name="filters">Filters:</string>
<string name="foreground_notification_channel_description">Toont de huidige status van de VPN-tunnel</string>
diff --git a/android/lib/resource/src/main/res/values-pl/strings.xml b/android/lib/resource/src/main/res/values-pl/strings.xml
index e9f255c4e2..cd48028048 100644
--- a/android/lib/resource/src/main/res/values-pl/strings.xml
+++ b/android/lib/resource/src/main/res/values-pl/strings.xml
@@ -191,8 +191,8 @@
<string name="feature_custom_dns">Niestandardowy serwer DNS</string>
<string name="feature_custom_mtu">MTU</string>
<string name="feature_indicators_show_more">Jeszcze %1$s...</string>
+ <string name="feature_obfuscation">Zaciemnianie</string>
<string name="feature_quantum_resistant">Odporność na ataki z użyciem komputerów kwantowych</string>
- <string name="feature_udp_2_tcp">Zaciemnianie</string>
<string name="filter">Filtruj</string>
<string name="filters">Filtry:</string>
<string name="foreground_notification_channel_description">Pokazuje bieżący status tunelu VPN</string>
diff --git a/android/lib/resource/src/main/res/values-pt/strings.xml b/android/lib/resource/src/main/res/values-pt/strings.xml
index ee85151bc8..f5f6e733a4 100644
--- a/android/lib/resource/src/main/res/values-pt/strings.xml
+++ b/android/lib/resource/src/main/res/values-pt/strings.xml
@@ -191,8 +191,8 @@
<string name="feature_custom_dns">DNS personalizado</string>
<string name="feature_custom_mtu">MTU</string>
<string name="feature_indicators_show_more">Mais %1$s...</string>
+ <string name="feature_obfuscation">Ofuscação</string>
<string name="feature_quantum_resistant">Resistência quântica</string>
- <string name="feature_udp_2_tcp">Ofuscação</string>
<string name="filter">Filtrar</string>
<string name="filters">Filtros:</string>
<string name="foreground_notification_channel_description">Indica o estado atual do túnel VPN</string>
diff --git a/android/lib/resource/src/main/res/values-ru/strings.xml b/android/lib/resource/src/main/res/values-ru/strings.xml
index ce118dc517..2a0d879d57 100644
--- a/android/lib/resource/src/main/res/values-ru/strings.xml
+++ b/android/lib/resource/src/main/res/values-ru/strings.xml
@@ -191,8 +191,8 @@
<string name="feature_custom_dns">Пользовательский DNS</string>
<string name="feature_custom_mtu">MTU</string>
<string name="feature_indicators_show_more">Еще %1$s...</string>
+ <string name="feature_obfuscation">Обфускация</string>
<string name="feature_quantum_resistant">Квантовая устойчивость</string>
- <string name="feature_udp_2_tcp">Обфускация</string>
<string name="filter">Фильтр</string>
<string name="filters">Фильтры:</string>
<string name="foreground_notification_channel_description">Показывает текущее состояние VPN-туннеля</string>
diff --git a/android/lib/resource/src/main/res/values-sv/strings.xml b/android/lib/resource/src/main/res/values-sv/strings.xml
index 8656246738..265d7b6716 100644
--- a/android/lib/resource/src/main/res/values-sv/strings.xml
+++ b/android/lib/resource/src/main/res/values-sv/strings.xml
@@ -191,8 +191,8 @@
<string name="feature_custom_dns">Anpassad DNS</string>
<string name="feature_custom_mtu">MTU</string>
<string name="feature_indicators_show_more">%1$s till ...</string>
+ <string name="feature_obfuscation">Obfuskering</string>
<string name="feature_quantum_resistant">Kvantresistens</string>
- <string name="feature_udp_2_tcp">Obfuskering</string>
<string name="filter">Filtrera</string>
<string name="filters">Filter:</string>
<string name="foreground_notification_channel_description">Visar nuvarande status för VPN-tunnel</string>
diff --git a/android/lib/resource/src/main/res/values-th/strings.xml b/android/lib/resource/src/main/res/values-th/strings.xml
index ec273c5e66..13f27815d3 100644
--- a/android/lib/resource/src/main/res/values-th/strings.xml
+++ b/android/lib/resource/src/main/res/values-th/strings.xml
@@ -191,8 +191,8 @@
<string name="feature_custom_dns">DNS แบบกำหนดเอง</string>
<string name="feature_custom_mtu">MTU</string>
<string name="feature_indicators_show_more">อีก %1$s...</string>
+ <string name="feature_obfuscation">การทำให้ข้อมูลยุ่งเหยิง</string>
<string name="feature_quantum_resistant">การต่อต้านควอนตัม</string>
- <string name="feature_udp_2_tcp">การทำให้ข้อมูลยุ่งเหยิง</string>
<string name="filter">ตัวกรอง</string>
<string name="filters">ตัวกรอง:</string>
<string name="foreground_notification_channel_description">แสดงสถานะอุโมงค์ VPN ในปัจจุบัน</string>
diff --git a/android/lib/resource/src/main/res/values-tr/strings.xml b/android/lib/resource/src/main/res/values-tr/strings.xml
index 6a802fe7dc..bf1296c709 100644
--- a/android/lib/resource/src/main/res/values-tr/strings.xml
+++ b/android/lib/resource/src/main/res/values-tr/strings.xml
@@ -191,8 +191,8 @@
<string name="feature_custom_dns">Özel DNS</string>
<string name="feature_custom_mtu">MTU</string>
<string name="feature_indicators_show_more">%1$s tane daha...</string>
+ <string name="feature_obfuscation">Gizleme</string>
<string name="feature_quantum_resistant">Kuantum direnci</string>
- <string name="feature_udp_2_tcp">Gizleme</string>
<string name="filter">Filtrele</string>
<string name="filters">Filtreler:</string>
<string name="foreground_notification_channel_description">Mevcut VPN tünelinin durumunu gösterir</string>
diff --git a/android/lib/resource/src/main/res/values-zh-rCN/strings.xml b/android/lib/resource/src/main/res/values-zh-rCN/strings.xml
index fac8961cee..d2ed8c3aff 100644
--- a/android/lib/resource/src/main/res/values-zh-rCN/strings.xml
+++ b/android/lib/resource/src/main/res/values-zh-rCN/strings.xml
@@ -191,8 +191,8 @@
<string name="feature_custom_dns">自定义 DNS</string>
<string name="feature_custom_mtu">MTU</string>
<string name="feature_indicators_show_more">其他 %1$s 个…</string>
+ <string name="feature_obfuscation">混淆</string>
<string name="feature_quantum_resistant">量子阻力</string>
- <string name="feature_udp_2_tcp">混淆</string>
<string name="filter">筛选</string>
<string name="filters">筛选器:</string>
<string name="foreground_notification_channel_description">显示当前的 VPN 隧道状态</string>
diff --git a/android/lib/resource/src/main/res/values-zh-rTW/strings.xml b/android/lib/resource/src/main/res/values-zh-rTW/strings.xml
index d53584ca36..37acbc0a3f 100644
--- a/android/lib/resource/src/main/res/values-zh-rTW/strings.xml
+++ b/android/lib/resource/src/main/res/values-zh-rTW/strings.xml
@@ -191,8 +191,8 @@
<string name="feature_custom_dns">自訂 DNS</string>
<string name="feature_custom_mtu">MTU</string>
<string name="feature_indicators_show_more">其他 %1$s 個…</string>
+ <string name="feature_obfuscation">混淆</string>
<string name="feature_quantum_resistant">抗量子</string>
- <string name="feature_udp_2_tcp">混淆</string>
<string name="filter">篩選</string>
<string name="filters">篩選器:</string>
<string name="foreground_notification_channel_description">顯示目前的 VPN 通道狀態</string>
diff --git a/android/lib/resource/src/main/res/values/strings.xml b/android/lib/resource/src/main/res/values/strings.xml
index 44b41aa99a..a6029aa1f2 100644
--- a/android/lib/resource/src/main/res/values/strings.xml
+++ b/android/lib/resource/src/main/res/values/strings.xml
@@ -351,7 +351,7 @@
<string name="connect_panel_active_features">Active features</string>
<string name="connect_panel_connection_details">Connection details</string>
<string name="feature_quantum_resistant">Quantum resistance</string>
- <string name="feature_udp_2_tcp">Obfuscation</string>
+ <string name="feature_obfuscation">Obfuscation</string>
<string name="feature_custom_dns">Custom DNS</string>
<string name="feature_custom_mtu">MTU</string>
<string name="dns_content_blockers">DNS content blockers</string>
diff --git a/android/lib/resource/src/main/res/values/strings_non_translatable.xml b/android/lib/resource/src/main/res/values/strings_non_translatable.xml
index 837740aa47..3f2c8b5c29 100644
--- a/android/lib/resource/src/main/res/values/strings_non_translatable.xml
+++ b/android/lib/resource/src/main/res/values/strings_non_translatable.xml
@@ -11,6 +11,7 @@
<string name="wireguard" translatable="false">WireGuard</string>
<string name="socks5_remote">SOCKS5</string>
<string name="shadowsocks">Shadowsocks</string>
+ <string name="quic">QUIC</string>
<string name="local_network_sharing_ip_ranges">
<![CDATA[<ul><li>10.0.0.0/8</li><li>172.16.0.0/12</li><li>192.168.0.0/16</li><li>169.254.0.0/16</li><li>fe80::/10</li><li>fc00::/7</li></ul>]]>
</string>
diff --git a/android/lib/ui/component/src/main/kotlin/net/mullvad/mullvadvpn/lib/ui/component/relaylist/RelayItemPreviewData.kt b/android/lib/ui/component/src/main/kotlin/net/mullvad/mullvadvpn/lib/ui/component/relaylist/RelayItemPreviewData.kt
index 724c567595..2e4e228439 100644
--- a/android/lib/ui/component/src/main/kotlin/net/mullvad/mullvadvpn/lib/ui/component/relaylist/RelayItemPreviewData.kt
+++ b/android/lib/ui/component/src/main/kotlin/net/mullvad/mullvadvpn/lib/ui/component/relaylist/RelayItemPreviewData.kt
@@ -51,7 +51,7 @@ private fun generateRelayItemRelay(
provider = ProviderId("Provider"),
ownership = Ownership.MullvadOwned,
daita = daita,
- quic = false,
+ quic = null,
)
private fun String.generateCountryCode() =