summaryrefslogtreecommitdiffhomepage
path: root/android/lib
diff options
context:
space:
mode:
authorDavid Göransson <david.goransson@mullvad.net>2025-03-31 09:36:52 +0200
committerJonatan Rhodin <jonatan.rhodin@mullvad.net>2025-04-10 17:29:33 +0200
commit042820a80d994a09a58dfcdc7dce1ee1d891ac39 (patch)
treeb35efcceebded11d98cec4adc08a52febb2eedf8 /android/lib
parent1c5712f028250920fe34ce7686c77a7d80da9481 (diff)
downloadmullvadvpn-042820a80d994a09a58dfcdc7dce1ee1d891ac39.tar.xz
mullvadvpn-042820a80d994a09a58dfcdc7dce1ee1d891ac39.zip
Implement quick access to active features
- Add Daita: Multihop feature indicator - Make feature indicators clickable - Add animations when accessing the features through the indicators - Rework VpnSettings in order to support navigating to a feature in the list
Diffstat (limited to 'android/lib')
-rw-r--r--android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt41
-rw-r--r--android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt1
-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/IpVersion.kt9
-rw-r--r--android/lib/resource/src/main/res/values/strings_non_translatable.xml1
5 files changed, 45 insertions, 8 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 4d1baab550..5e0077d1f8 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
@@ -62,6 +62,7 @@ import net.mullvad.mullvadvpn.lib.model.CustomList as ModelCustomList
import net.mullvad.mullvadvpn.lib.model.CustomListAlreadyExists
import net.mullvad.mullvadvpn.lib.model.CustomListId
import net.mullvad.mullvadvpn.lib.model.CustomListName
+import net.mullvad.mullvadvpn.lib.model.DefaultDnsOptions
import net.mullvad.mullvadvpn.lib.model.DeleteCustomListError
import net.mullvad.mullvadvpn.lib.model.DeleteDeviceError
import net.mullvad.mullvadvpn.lib.model.Device
@@ -71,6 +72,7 @@ import net.mullvad.mullvadvpn.lib.model.DeviceUpdateError
import net.mullvad.mullvadvpn.lib.model.DnsOptions as ModelDnsOptions
import net.mullvad.mullvadvpn.lib.model.DnsOptions
import net.mullvad.mullvadvpn.lib.model.DnsState as ModelDnsState
+import net.mullvad.mullvadvpn.lib.model.DnsState
import net.mullvad.mullvadvpn.lib.model.GetAccountDataError
import net.mullvad.mullvadvpn.lib.model.GetAccountHistoryError
import net.mullvad.mullvadvpn.lib.model.GetDeviceListError
@@ -124,7 +126,7 @@ 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.enabled
+import net.mullvad.mullvadvpn.lib.model.defaultOptions
import net.mullvad.mullvadvpn.lib.model.entryLocation
import net.mullvad.mullvadvpn.lib.model.ipVersion
import net.mullvad.mullvadvpn.lib.model.isMultihopEnabled
@@ -139,7 +141,7 @@ import net.mullvad.mullvadvpn.lib.model.state
import net.mullvad.mullvadvpn.lib.model.udp2tcp
import net.mullvad.mullvadvpn.lib.model.wireguardConstraints
-@Suppress("TooManyFunctions")
+@Suppress("TooManyFunctions", "LargeClass")
class ManagementService(
rpcSocketFile: File,
private val extensiveLogging: Boolean,
@@ -389,6 +391,19 @@ class ManagementService(
.onLeft { Logger.e("Create account error") }
.mapLeft(CreateAccountError::Unknown)
+ suspend fun updateDnsContentBlockers(
+ update: (DefaultDnsOptions) -> DefaultDnsOptions
+ ): Either<SetDnsOptionsError, Unit> =
+ Either.catch {
+ val currentDnsOptions = getSettings().tunnelOptions.dnsOptions
+ val newDefaultDnsOptions = update(currentDnsOptions.defaultOptions)
+ val updated = DnsOptions.defaultOptions.set(currentDnsOptions, newDefaultDnsOptions)
+ grpc.setDnsOptions(updated.fromDomain())
+ }
+ .onLeft { Logger.e("Set dns state error") }
+ .mapLeft(SetDnsOptionsError::Unknown)
+ .mapEmpty()
+
suspend fun setDnsOptions(dnsOptions: ModelDnsOptions): Either<SetDnsOptionsError, Unit> =
Either.catch { grpc.setDnsOptions(dnsOptions.fromDomain()) }
.onLeft { Logger.e("Set dns options error") }
@@ -423,7 +438,14 @@ class ManagementService(
Either.catch {
val currentDnsOptions = getSettings().tunnelOptions.dnsOptions
val updatedDnsOptions =
- DnsOptions.customOptions.addresses.modify(currentDnsOptions) { it + address }
+ currentDnsOptions.copy {
+ DnsOptions.customOptions.addresses set
+ currentDnsOptions.customOptions.addresses + address
+ // If it is the first address, then turn on Custom Dns
+ DnsOptions.state set
+ if (currentDnsOptions.customOptions.addresses.isEmpty()) DnsState.Custom
+ else currentDnsOptions.state
+ }
grpc.setDnsOptions(updatedDnsOptions.fromDomain())
updatedDnsOptions.customOptions.addresses.lastIndex
}
@@ -433,11 +455,16 @@ class ManagementService(
suspend fun deleteCustomDns(index: Int): Either<SetDnsOptionsError, Unit> =
Either.catch {
val currentDnsOptions = getSettings().tunnelOptions.dnsOptions
+ val mutableAddresses = currentDnsOptions.customOptions.addresses.toMutableList()
+ mutableAddresses.removeAt(index)
+
val updatedDnsOptions =
- DnsOptions.customOptions.addresses.modify(currentDnsOptions) {
- val mutableAddresses = it.toMutableList()
- mutableAddresses.removeAt(index)
- mutableAddresses.toList()
+ currentDnsOptions.copy {
+ DnsOptions.customOptions.addresses set mutableAddresses.toList()
+ // If it is the last address, then turn off Custom Dns
+ DnsOptions.state set
+ if (mutableAddresses.isEmpty()) DnsState.Default
+ else currentDnsOptions.state
}
grpc.setDnsOptions(updatedDnsOptions.fromDomain())
}
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 10c417cf1c..eab0bc60a9 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
@@ -708,6 +708,7 @@ internal fun ManagementInterface.FeatureIndicator.toDomain() =
ManagementInterface.FeatureIndicator.DAITA -> FeatureIndicator.DAITA
ManagementInterface.FeatureIndicator.SHADOWSOCKS -> FeatureIndicator.SHADOWSOCKS
ManagementInterface.FeatureIndicator.MULTIHOP -> FeatureIndicator.MULTIHOP
+ ManagementInterface.FeatureIndicator.DAITA_MULTIHOP -> FeatureIndicator.DAITA_MULTIHOP
ManagementInterface.FeatureIndicator.LOCKDOWN_MODE,
ManagementInterface.FeatureIndicator.BRIDGE_MODE,
ManagementInterface.FeatureIndicator.CUSTOM_MSS_FIX,
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 0da5704b4b..0213c06cef 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
@@ -3,6 +3,7 @@ package net.mullvad.mullvadvpn.lib.model
// The order of the variants match the priority order and can be sorted on.
enum class FeatureIndicator {
DAITA,
+ DAITA_MULTIHOP,
QUANTUM_RESISTANCE,
MULTIHOP,
SPLIT_TUNNELING,
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/IpVersion.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/IpVersion.kt
index 176809244c..4ca0a0be5f 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/IpVersion.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/IpVersion.kt
@@ -2,5 +2,12 @@ package net.mullvad.mullvadvpn.lib.model
enum class IpVersion {
IPV4,
- IPV6,
+ IPV6;
+
+ companion object {
+ val constraints: List<Constraint<IpVersion>> = buildList {
+ add(Constraint.Any)
+ addAll(IpVersion.entries.map { Constraint.Only(it) })
+ }
+ }
}
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..c53332f663 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
@@ -15,5 +15,6 @@
<![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>
<string name="daita">DAITA</string>
+ <string name="daita_multihop">DAITA: Multihop</string>
<string name="daita_full">Defence against AI-guided Traffic Analysis</string>
</resources>