summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
authorJonatan Rhodin <jonatan.rhodin@mullvad.net>2023-10-29 23:16:52 +0100
committerJonatan Rhodin <jonatan.rhodin@mullvad.net>2023-11-08 08:55:59 +0100
commit5e9ea351730db33da12193d96363a3b79374d361 (patch)
tree977dfbac479d66ca328a153b7bd24d7f127d126d /android
parent37353fb8909445192d2cd07bd9868a0186f6cf08 (diff)
downloadmullvadvpn-5e9ea351730db33da12193d96363a3b79374d361.tar.xz
mullvadvpn-5e9ea351730db33da12193d96363a3b79374d361.zip
Add relay list filter use case
Diffstat (limited to 'android')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/RelayListListener.kt11
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/RelayListFilterUseCase.kt46
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/RelayListUseCase.kt4
-rw-r--r--android/lib/ipc/src/main/kotlin/net/mullvad/mullvadvpn/lib/ipc/Request.kt7
-rw-r--r--android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelaySettings.kt2
5 files changed, 66 insertions, 4 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/RelayListListener.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/RelayListListener.kt
index 7f316bacb8..386f7e3bf4 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/RelayListListener.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/RelayListListener.kt
@@ -9,7 +9,10 @@ import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn
import net.mullvad.mullvadvpn.lib.ipc.Event
import net.mullvad.mullvadvpn.lib.ipc.Request
+import net.mullvad.mullvadvpn.model.Constraint
import net.mullvad.mullvadvpn.model.GeographicLocationConstraint
+import net.mullvad.mullvadvpn.model.Ownership
+import net.mullvad.mullvadvpn.model.Providers
import net.mullvad.mullvadvpn.model.RelayList
import net.mullvad.mullvadvpn.model.WireguardConstraints
import net.mullvad.mullvadvpn.model.WireguardEndpointData
@@ -32,5 +35,13 @@ class RelayListListener(
messageHandler.trySendRequest(Request.SetWireguardConstraints(value))
}
+ fun updateSelectedOwnershipFilter(value: Constraint<Ownership>) {
+ messageHandler.trySendRequest(Request.SetOwnership(value))
+ }
+
+ fun updateSelectedProvidersFilter(value: Constraint<Providers>) {
+ messageHandler.trySendRequest(Request.SetProviders(value))
+ }
+
private fun defaultRelayList() = RelayList(ArrayList(), WireguardEndpointData(ArrayList()))
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/RelayListFilterUseCase.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/RelayListFilterUseCase.kt
new file mode 100644
index 0000000000..f15b2535cb
--- /dev/null
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/RelayListFilterUseCase.kt
@@ -0,0 +1,46 @@
+package net.mullvad.mullvadvpn.usecase
+
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.map
+import net.mullvad.mullvadvpn.model.Constraint
+import net.mullvad.mullvadvpn.model.Ownership
+import net.mullvad.mullvadvpn.model.Providers
+import net.mullvad.mullvadvpn.model.RelayListCity
+import net.mullvad.mullvadvpn.model.RelayListCountry
+import net.mullvad.mullvadvpn.repository.SettingsRepository
+import net.mullvad.mullvadvpn.ui.serviceconnection.RelayListListener
+
+class RelayListFilterUseCase(
+ private val relayListListener: RelayListListener,
+ private val settingsRepository: SettingsRepository
+) {
+ fun updateOwnershipFilter(ownership: Constraint<Ownership>) {
+ relayListListener.updateSelectedOwnershipFilter(ownership)
+ }
+
+ fun updateProviderFilter(providers: Constraint<Providers>) {
+ relayListListener.updateSelectedProvidersFilter(providers)
+ }
+
+ fun selectedOwnership(): Flow<Constraint<Ownership>> =
+ settingsRepository.settingsUpdates.map { settings ->
+ settings?.relaySettings?.relayConstraints()?.ownership ?: Constraint.Any()
+ }
+
+ fun selectedProviders(): Flow<Constraint<Providers>> =
+ settingsRepository.settingsUpdates.map { settings ->
+ settings?.relaySettings?.relayConstraints()?.providers ?: Constraint.Any()
+ }
+
+ fun availableProviders(): Flow<List<Pair<String, Boolean>>> =
+ relayListListener.relayListEvents.map { relayList ->
+ relayList
+ ?.countries
+ ?.flatMap(RelayListCountry::cities)
+ ?.flatMap(RelayListCity::relays)
+ ?.filter { relay -> relay.isWireguardRelay }
+ ?.map { relay -> relay.provider to relay.owned }
+ ?.distinct()
+ ?: emptyList()
+ }
+}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/RelayListUseCase.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/RelayListUseCase.kt
index 37dce1dda5..0bfe1d038c 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/RelayListUseCase.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/RelayListUseCase.kt
@@ -6,7 +6,6 @@ import kotlinx.coroutines.flow.map
import net.mullvad.mullvadvpn.lib.common.util.toGeographicLocationConstraint
import net.mullvad.mullvadvpn.model.Constraint
import net.mullvad.mullvadvpn.model.GeographicLocationConstraint
-import net.mullvad.mullvadvpn.model.RelayConstraints
import net.mullvad.mullvadvpn.model.RelaySettings
import net.mullvad.mullvadvpn.model.WireguardConstraints
import net.mullvad.mullvadvpn.relaylist.RelayCountry
@@ -55,7 +54,4 @@ class RelayListUseCase(
val location = relaySettings?.relayConstraints()?.location
return location?.let { this.findItemForLocation(location.toGeographicLocationConstraint()) }
}
-
- private fun RelaySettings.relayConstraints(): RelayConstraints? =
- (this as? RelaySettings.Normal)?.relayConstraints
}
diff --git a/android/lib/ipc/src/main/kotlin/net/mullvad/mullvadvpn/lib/ipc/Request.kt b/android/lib/ipc/src/main/kotlin/net/mullvad/mullvadvpn/lib/ipc/Request.kt
index cbd1f28b27..704013fb39 100644
--- a/android/lib/ipc/src/main/kotlin/net/mullvad/mullvadvpn/lib/ipc/Request.kt
+++ b/android/lib/ipc/src/main/kotlin/net/mullvad/mullvadvpn/lib/ipc/Request.kt
@@ -4,9 +4,12 @@ import android.os.Message as RawMessage
import android.os.Messenger
import java.net.InetAddress
import kotlinx.parcelize.Parcelize
+import net.mullvad.mullvadvpn.model.Constraint
import net.mullvad.mullvadvpn.model.DnsOptions
import net.mullvad.mullvadvpn.model.GeographicLocationConstraint
import net.mullvad.mullvadvpn.model.ObfuscationSettings
+import net.mullvad.mullvadvpn.model.Ownership
+import net.mullvad.mullvadvpn.model.Providers
import net.mullvad.mullvadvpn.model.QuantumResistantState
import net.mullvad.mullvadvpn.model.WireguardConstraints
@@ -95,6 +98,10 @@ sealed class Request : Message.RequestMessage() {
data class SetWireGuardQuantumResistant(val quantumResistant: QuantumResistantState) :
Request()
+ @Parcelize data class SetOwnership(val ownership: Constraint<Ownership>) : Request()
+
+ @Parcelize data class SetProviders(val providers: Constraint<Providers>) : Request()
+
companion object {
private const val MESSAGE_KEY = "request"
diff --git a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelaySettings.kt b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelaySettings.kt
index 381305f2c3..642046f1b8 100644
--- a/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelaySettings.kt
+++ b/android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/model/RelaySettings.kt
@@ -7,4 +7,6 @@ sealed class RelaySettings : Parcelable {
@Parcelize data object CustomTunnelEndpoint : RelaySettings()
@Parcelize data class Normal(val relayConstraints: RelayConstraints) : RelaySettings()
+
+ fun relayConstraints(): RelayConstraints? = (this as? Normal)?.relayConstraints
}