diff options
| author | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2023-10-29 23:16:52 +0100 |
|---|---|---|
| committer | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2023-11-08 08:55:59 +0100 |
| commit | 5e9ea351730db33da12193d96363a3b79374d361 (patch) | |
| tree | 977dfbac479d66ca328a153b7bd24d7f127d126d /android | |
| parent | 37353fb8909445192d2cd07bd9868a0186f6cf08 (diff) | |
| download | mullvadvpn-5e9ea351730db33da12193d96363a3b79374d361.tar.xz mullvadvpn-5e9ea351730db33da12193d96363a3b79374d361.zip | |
Add relay list filter use case
Diffstat (limited to 'android')
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 } |
