summaryrefslogtreecommitdiffhomepage
path: root/android/lib
diff options
context:
space:
mode:
authorJonatan Rhodin <jonatan.rhodin@mullvad.net>2024-11-24 23:18:04 +0100
committerJonatan Rhodin <jonatan.rhodin@mullvad.net>2024-11-27 08:50:54 +0100
commita91a791eed3d4e041357622c3ff509601677eec2 (patch)
tree6c0e7381edea81f2bba4db88aa25eabd46eb9780 /android/lib
parent56e46c5cf783d41937e4eb2531a4d2e287381ee6 (diff)
downloadmullvadvpn-a91a791eed3d4e041357622c3ff509601677eec2.tar.xz
mullvadvpn-a91a791eed3d4e041357622c3ff509601677eec2.zip
Implement multihop
Diffstat (limited to 'android/lib')
-rw-r--r--android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt22
-rw-r--r--android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/FromDomain.kt2
-rw-r--r--android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt4
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/FeatureIndicator.kt2
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayItemSelection.kt12
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardConstraints.kt2
-rw-r--r--android/lib/resource/src/main/res/drawable-hdpi/multihop_illustration.pngbin0 -> 45568 bytes
-rw-r--r--android/lib/resource/src/main/res/drawable-mdpi/multihop_illustration.pngbin0 -> 24763 bytes
-rw-r--r--android/lib/resource/src/main/res/drawable-xhdpi/multihop_illustration.pngbin0 -> 71127 bytes
-rw-r--r--android/lib/resource/src/main/res/drawable-xxhdpi/multihop_illustration.pngbin0 -> 136698 bytes
-rw-r--r--android/lib/resource/src/main/res/drawable-xxxhdpi/multihop_illustration.pngbin0 -> 220713 bytes
-rw-r--r--android/lib/resource/src/main/res/values/strings.xml18
-rw-r--r--android/lib/theme/src/main/kotlin/net/mullvad/mullvadvpn/lib/theme/dimensions/Dimensions.kt3
-rw-r--r--android/lib/theme/src/main/kotlin/net/mullvad/mullvadvpn/lib/theme/shape/Shape.kt6
14 files changed, 53 insertions, 18 deletions
diff --git a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt
index ad4fb20a22..bd27574cbe 100644
--- a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt
+++ b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt
@@ -95,6 +95,7 @@ import net.mullvad.mullvadvpn.lib.model.RedeemVoucherSuccess
import net.mullvad.mullvadvpn.lib.model.RelayConstraints
import net.mullvad.mullvadvpn.lib.model.RelayItem
import net.mullvad.mullvadvpn.lib.model.RelayItemId as ModelRelayItemId
+import net.mullvad.mullvadvpn.lib.model.RelayItemId
import net.mullvad.mullvadvpn.lib.model.RelayList as ModelRelayList
import net.mullvad.mullvadvpn.lib.model.RelayList
import net.mullvad.mullvadvpn.lib.model.RelaySettings
@@ -122,6 +123,8 @@ import net.mullvad.mullvadvpn.lib.model.WebsiteAuthToken
import net.mullvad.mullvadvpn.lib.model.WireguardEndpointData as ModelWireguardEndpointData
import net.mullvad.mullvadvpn.lib.model.addresses
import net.mullvad.mullvadvpn.lib.model.customOptions
+import net.mullvad.mullvadvpn.lib.model.entryLocation
+import net.mullvad.mullvadvpn.lib.model.isMultihopEnabled
import net.mullvad.mullvadvpn.lib.model.location
import net.mullvad.mullvadvpn.lib.model.ownership
import net.mullvad.mullvadvpn.lib.model.port
@@ -131,7 +134,6 @@ import net.mullvad.mullvadvpn.lib.model.selectedObfuscationMode
import net.mullvad.mullvadvpn.lib.model.shadowsocks
import net.mullvad.mullvadvpn.lib.model.state
import net.mullvad.mullvadvpn.lib.model.udp2tcp
-import net.mullvad.mullvadvpn.lib.model.useMultihop
import net.mullvad.mullvadvpn.lib.model.wireguardConstraints
@Suppress("TooManyFunctions")
@@ -757,7 +759,7 @@ class ManagementService(
Either.catch {
val relaySettings = getSettings().relaySettings
val updated =
- RelaySettings.relayConstraints.wireguardConstraints.useMultihop.set(
+ RelaySettings.relayConstraints.wireguardConstraints.isMultihopEnabled.set(
relaySettings,
enabled,
)
@@ -767,6 +769,22 @@ class ManagementService(
.mapLeft(SetWireguardConstraintsError::Unknown)
.mapEmpty()
+ suspend fun setEntryLocation(
+ entryLocation: RelayItemId
+ ): Either<SetWireguardConstraintsError, Unit> =
+ Either.catch {
+ val relaySettings = getSettings().relaySettings
+ val updated =
+ RelaySettings.relayConstraints.wireguardConstraints.entryLocation.set(
+ relaySettings,
+ Constraint.Only(entryLocation),
+ )
+ grpc.setRelaySettings(updated.fromDomain())
+ }
+ .onLeft { Logger.e("Set multihop error") }
+ .mapLeft(SetWireguardConstraintsError::Unknown)
+ .mapEmpty()
+
private fun <A> Either<A, Empty>.mapEmpty() = map {}
private inline fun <B, C> Either<Throwable, B>.mapLeftStatus(
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 622e95d9dd..b3fe88bdc8 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
@@ -126,7 +126,7 @@ internal fun CustomList.fromDomain(): ManagementInterface.CustomList =
internal fun WireguardConstraints.fromDomain(): ManagementInterface.WireguardConstraints =
ManagementInterface.WireguardConstraints.newBuilder()
- .setUseMultihop(useMultihop)
+ .setUseMultihop(isMultihopEnabled)
.setEntryLocation(entryLocation.fromDomain())
.apply {
when (val port = this@fromDomain.port) {
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 236d4aa19c..fe0222596b 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
@@ -336,7 +336,7 @@ internal fun ManagementInterface.WireguardConstraints.toDomain(): WireguardConst
} else {
Constraint.Any
},
- useMultihop = useMultihop,
+ isMultihopEnabled = useMultihop,
entryLocation = entryLocation.toDomain(),
)
@@ -644,8 +644,8 @@ internal fun ManagementInterface.FeatureIndicator.toDomain() =
ManagementInterface.FeatureIndicator.CUSTOM_MTU -> FeatureIndicator.CUSTOM_MTU
ManagementInterface.FeatureIndicator.DAITA -> FeatureIndicator.DAITA
ManagementInterface.FeatureIndicator.SHADOWSOCKS -> FeatureIndicator.SHADOWSOCKS
+ ManagementInterface.FeatureIndicator.MULTIHOP -> FeatureIndicator.MULTIHOP
ManagementInterface.FeatureIndicator.LOCKDOWN_MODE,
- ManagementInterface.FeatureIndicator.MULTIHOP,
ManagementInterface.FeatureIndicator.BRIDGE_MODE,
ManagementInterface.FeatureIndicator.CUSTOM_MSS_FIX,
ManagementInterface.FeatureIndicator.UNRECOGNIZED ->
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 3c8df824f4..0da5704b4b 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
@@ -4,7 +4,7 @@ package net.mullvad.mullvadvpn.lib.model
enum class FeatureIndicator {
DAITA,
QUANTUM_RESISTANCE,
- // MULTIHOP,
+ MULTIHOP,
SPLIT_TUNNELING,
UDP_2_TCP,
SHADOWSOCKS,
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayItemSelection.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayItemSelection.kt
new file mode 100644
index 0000000000..c4c78ffe4c
--- /dev/null
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RelayItemSelection.kt
@@ -0,0 +1,12 @@
+package net.mullvad.mullvadvpn.lib.model
+
+sealed interface RelayItemSelection {
+ val exitLocation: Constraint<RelayItemId>
+
+ data class Single(override val exitLocation: Constraint<RelayItemId>) : RelayItemSelection
+
+ data class Multiple(
+ val entryLocation: Constraint<RelayItemId>,
+ override val exitLocation: Constraint<RelayItemId>,
+ ) : RelayItemSelection
+}
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardConstraints.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardConstraints.kt
index 7af0144cf4..dcc3a957df 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardConstraints.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/WireguardConstraints.kt
@@ -5,7 +5,7 @@ import arrow.optics.optics
@optics
data class WireguardConstraints(
val port: Constraint<Port>,
- val useMultihop: Boolean,
+ val isMultihopEnabled: Boolean,
val entryLocation: Constraint<RelayItemId>,
) {
companion object
diff --git a/android/lib/resource/src/main/res/drawable-hdpi/multihop_illustration.png b/android/lib/resource/src/main/res/drawable-hdpi/multihop_illustration.png
new file mode 100644
index 0000000000..4b39420e31
--- /dev/null
+++ b/android/lib/resource/src/main/res/drawable-hdpi/multihop_illustration.png
Binary files differ
diff --git a/android/lib/resource/src/main/res/drawable-mdpi/multihop_illustration.png b/android/lib/resource/src/main/res/drawable-mdpi/multihop_illustration.png
new file mode 100644
index 0000000000..50d3064f25
--- /dev/null
+++ b/android/lib/resource/src/main/res/drawable-mdpi/multihop_illustration.png
Binary files differ
diff --git a/android/lib/resource/src/main/res/drawable-xhdpi/multihop_illustration.png b/android/lib/resource/src/main/res/drawable-xhdpi/multihop_illustration.png
new file mode 100644
index 0000000000..c7cdd85f7e
--- /dev/null
+++ b/android/lib/resource/src/main/res/drawable-xhdpi/multihop_illustration.png
Binary files differ
diff --git a/android/lib/resource/src/main/res/drawable-xxhdpi/multihop_illustration.png b/android/lib/resource/src/main/res/drawable-xxhdpi/multihop_illustration.png
new file mode 100644
index 0000000000..bccd71a158
--- /dev/null
+++ b/android/lib/resource/src/main/res/drawable-xxhdpi/multihop_illustration.png
Binary files differ
diff --git a/android/lib/resource/src/main/res/drawable-xxxhdpi/multihop_illustration.png b/android/lib/resource/src/main/res/drawable-xxxhdpi/multihop_illustration.png
new file mode 100644
index 0000000000..9246fad11c
--- /dev/null
+++ b/android/lib/resource/src/main/res/drawable-xxxhdpi/multihop_illustration.png
Binary files differ
diff --git a/android/lib/resource/src/main/res/values/strings.xml b/android/lib/resource/src/main/res/values/strings.xml
index b89488bc1a..4625fb3b5f 100644
--- a/android/lib/resource/src/main/res/values/strings.xml
+++ b/android/lib/resource/src/main/res/values/strings.xml
@@ -56,7 +56,6 @@
<string name="owned">Owned</string>
<string name="rented">Rented</string>
<string name="number_of_providers">Providers: %d</string>
- <string name="filtered">Filtered:</string>
<string name="mullvad_owned_only">Mullvad owned only</string>
<string name="all_providers">All providers</string>
<string name="rented_only">Rented only</string>
@@ -223,10 +222,7 @@
<string name="wireguard_port_title">WireGuard port</string>
<string name="wireguard_port_info_description">The automatic setting will randomly choose from the valid port ranges shown below.</string>
<string name="search_placeholder">Search for...</string>
- <string name="select_location_empty_text_first_row">
- <![CDATA[No result for <b>%s</b>.]]>
- </string>
- <string name="select_location_empty_text_second_row">Try a different search.</string>
+ <string name="search_location_empty_text">No result for \"%s\", please try a different search</string>
<string name="wireguard_port_info_port_range">The custom port can be any value inside the valid ranges: %s.</string>
<string name="wireguard_custon_port_title">Custom</string>
<string name="port">Port</string>
@@ -377,6 +373,7 @@
<string name="feature_server_ip_override">Server IP override</string>
<string name="feature_custom_mtu">MTU</string>
<string name="feature_daita">DAITA</string>
+ <string name="feature_multihop">Multihop</string>
<string name="feature_dns_content_blockers">DNS content blockers</string>
<string name="connection_details_ipv4">IPv4</string>
<string name="connection_details_ipv6">IPv6</string>
@@ -399,4 +396,15 @@
<string name="encrypted_dns_proxy_info_message_part1">With the “Encrypted DNS proxy” method, the app will communicate with our Mullvad API through a proxy address. It does this by retrieving an address from a DNS over HTTPS (DoH) server and then using that to reach our API servers.</string>
<string name="encrypted_dns_proxy_info_message_part2">If you are not connected to our VPN, then the Encrypted DNS proxy will use your own non-VPN IP when connecting. The DoH servers are hosted by one of the following providers: Quad 9, CloudFlare, or Google.</string>
<string name="connection_details_out">Out</string>
+ <string name="multihop">Multihop</string>
+ <string name="multihop_description">Multihop routes your traffic into one WireGuard server and out another, making it harder to trace. This results in increased latency but increases anonymity online.</string>
+ <string name="x_via_x">%s via %s</string>
+ <string name="entry">Entry</string>
+ <string name="exit">Exit</string>
+ <string name="clear_input">Clear input</string>
+ <string name="x_entry">%s (Entry)</string>
+ <string name="x_exit">%s (Exit)</string>
+ <string name="search_results">Search results</string>
+ <string name="filters">Filters:</string>
+ <string name="search_query_empty">Type at least 2 characters to start searching.</string>
</resources>
diff --git a/android/lib/theme/src/main/kotlin/net/mullvad/mullvadvpn/lib/theme/dimensions/Dimensions.kt b/android/lib/theme/src/main/kotlin/net/mullvad/mullvadvpn/lib/theme/dimensions/Dimensions.kt
index 2407fda047..6a5da5c18d 100644
--- a/android/lib/theme/src/main/kotlin/net/mullvad/mullvadvpn/lib/theme/dimensions/Dimensions.kt
+++ b/android/lib/theme/src/main/kotlin/net/mullvad/mullvadvpn/lib/theme/dimensions/Dimensions.kt
@@ -56,10 +56,13 @@ data class Dimensions(
val relayCircleSize: Dp = 16.dp,
val screenVerticalMargin: Dp = 22.dp,
val searchFieldHeight: Dp = 42.dp,
+ // Search view full screen header container height (material design guidelines)
+ val searchFieldHeightExpanded: Dp = 72.dp,
val searchFieldHorizontalPadding: Dp = 22.dp,
val searchIconSize: Dp = 24.dp,
val selectLocationTitlePadding: Dp = 12.dp,
val selectableCellTextMargin: Dp = 12.dp,
+ val settingsDetailsImageMaxWidth: Dp = 480.dp,
val sideMargin: Dp = 22.dp,
val smallIconSize: Dp = 16.dp,
val smallPadding: Dp = 8.dp,
diff --git a/android/lib/theme/src/main/kotlin/net/mullvad/mullvadvpn/lib/theme/shape/Shape.kt b/android/lib/theme/src/main/kotlin/net/mullvad/mullvadvpn/lib/theme/shape/Shape.kt
index aa2f40782c..501cb72946 100644
--- a/android/lib/theme/src/main/kotlin/net/mullvad/mullvadvpn/lib/theme/shape/Shape.kt
+++ b/android/lib/theme/src/main/kotlin/net/mullvad/mullvadvpn/lib/theme/shape/Shape.kt
@@ -11,9 +11,3 @@ val Shapes.chipShape: Shape
get() {
return RoundedCornerShape(8.dp)
}
-
-val Shapes.fabShape: Shape
- @Composable
- get() {
- return RoundedCornerShape(16.dp)
- }