From f91454e0cad9d67a061090ffde3aebe2ecdce06f Mon Sep 17 00:00:00 2001 From: Albin Date: Mon, 26 Aug 2024 17:09:54 +0200 Subject: [PATCH] wip filter relays --- .../compose/preview/RelayItemPreviewData.kt | 2 ++ .../net/mullvad/mullvadvpn/di/UiModule.kt | 2 +- .../relaylist/RelayItemExtensions.kt | 34 +++++++++++-------- .../usecase/FilteredRelayListUseCase.kt | 20 +++++++---- .../FilterCustomListsRelayItemUseCase.kt | 4 +-- .../lib/daemon/grpc/mapper/ToDomain.kt | 6 +++- .../mullvad/mullvadvpn/lib/model/RelayItem.kt | 1 + 7 files changed, 44 insertions(+), 25 deletions(-) diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/RelayItemPreviewData.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/RelayItemPreviewData.kt index c1b42c9415e3..417ddbef978e 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/RelayItemPreviewData.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/preview/RelayItemPreviewData.kt @@ -51,6 +51,7 @@ private fun generateRelayItemRelay( cityCode: GeoLocationId.City, hostName: String, active: Boolean = true, + daita: Boolean = true, ) = RelayItem.Location.Relay( id = @@ -60,6 +61,7 @@ private fun generateRelayItemRelay( ), active = active, provider = Provider(ProviderId("Provider"), Ownership.MullvadOwned), + daita = daita ) private fun String.generateCountryCode() = diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt index 929d1e3b9981..ab428bdd0304 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/di/UiModule.kt @@ -138,7 +138,7 @@ val uiModule = module { single { FilterCustomListsRelayItemUseCase(get(), get()) } single { CustomListsRelayItemUseCase(get(), get()) } single { CustomListRelayItemsUseCase(get(), get()) } - single { FilteredRelayListUseCase(get(), get()) } + single { FilteredRelayListUseCase(get(), get(), get()) } single { LastKnownLocationUseCase(get()) } single { InAppNotificationController(get(), get(), get(), get(), MainScope()) } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayItemExtensions.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayItemExtensions.kt index a3758b25fef9..0a34e5f1aa94 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayItemExtensions.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/relaylist/RelayItemExtensions.kt @@ -53,27 +53,29 @@ private fun RelayItem.Location.hasProvider(providersConstraint: Constraint, - providers: Constraint + providers: Constraint, + isDaitaEnabled: Boolean ): RelayItem.CustomList { val newLocations = locations.mapNotNull { when (it) { is RelayItem.Location.Country -> - it.filterOnOwnershipAndProvider(ownership, providers) - is RelayItem.Location.City -> it.filterOnOwnershipAndProvider(ownership, providers) - is RelayItem.Location.Relay -> it.filterOnOwnershipAndProvider(ownership, providers) + it.applyFilters(ownership, providers, isDaitaEnabled) + is RelayItem.Location.City -> it.applyFilters(ownership, providers, isDaitaEnabled) + is RelayItem.Location.Relay -> it.applyFilters(ownership, providers, isDaitaEnabled) } } return copy(locations = newLocations) } -fun RelayItem.Location.Country.filterOnOwnershipAndProvider( +fun RelayItem.Location.Country.applyFilters( ownership: Constraint, - providers: Constraint + providers: Constraint, + isDaitaEnabled: Boolean ): RelayItem.Location.Country? { - val cities = cities.mapNotNull { it.filterOnOwnershipAndProvider(ownership, providers) } + val cities = cities.mapNotNull { it.applyFilters(ownership, providers, isDaitaEnabled) } return if (cities.isNotEmpty()) { this.copy(cities = cities) } else { @@ -81,11 +83,12 @@ fun RelayItem.Location.Country.filterOnOwnershipAndProvider( } } -private fun RelayItem.Location.City.filterOnOwnershipAndProvider( +private fun RelayItem.Location.City.applyFilters( ownership: Constraint, - providers: Constraint + providers: Constraint, + isDaitaEnabled: Boolean ): RelayItem.Location.City? { - val relays = relays.mapNotNull { it.filterOnOwnershipAndProvider(ownership, providers) } + val relays = relays.mapNotNull { it.applyFilters(ownership, providers, isDaitaEnabled) } return if (relays.isNotEmpty()) { this.copy(relays = relays) } else { @@ -93,11 +96,14 @@ private fun RelayItem.Location.City.filterOnOwnershipAndProvider( } } -private fun RelayItem.Location.Relay.filterOnOwnershipAndProvider( +private fun RelayItem.Location.Relay.applyFilters( ownership: Constraint, - providers: Constraint + providers: Constraint, + isDaitaEnabled: Boolean ): RelayItem.Location.Relay? { - return if (hasOwnership(ownership) && hasProvider(providers)) { + // TODO: Rename and move to separate function. + val isValid = if (isDaitaEnabled) daita else true + return if (isValid && hasOwnership(ownership) && hasProvider(providers)) { this } else { null diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/FilteredRelayListUseCase.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/FilteredRelayListUseCase.kt index c4e05ccc92cc..d0bf88b5befd 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/FilteredRelayListUseCase.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/FilteredRelayListUseCase.kt @@ -5,28 +5,34 @@ import net.mullvad.mullvadvpn.lib.model.Constraint import net.mullvad.mullvadvpn.lib.model.Ownership import net.mullvad.mullvadvpn.lib.model.Providers import net.mullvad.mullvadvpn.lib.model.RelayItem -import net.mullvad.mullvadvpn.relaylist.filterOnOwnershipAndProvider +import net.mullvad.mullvadvpn.relaylist.applyFilters import net.mullvad.mullvadvpn.repository.RelayListFilterRepository import net.mullvad.mullvadvpn.repository.RelayListRepository +import net.mullvad.mullvadvpn.repository.SettingsRepository class FilteredRelayListUseCase( private val relayListRepository: RelayListRepository, - private val relayListFilterRepository: RelayListFilterRepository + private val relayListFilterRepository: RelayListFilterRepository, + private val settingsRepository: SettingsRepository ) { operator fun invoke() = combine( relayListRepository.relayList, relayListFilterRepository.selectedOwnership, relayListFilterRepository.selectedProviders, - ) { relayList, selectedOwnership, selectedProviders -> - relayList.filterOnOwnershipAndProvider( + settingsRepository.settingsUpdates + ) { relayList, selectedOwnership, selectedProviders, settings -> + relayList.applyFilters( selectedOwnership, selectedProviders, + // TODO: How to handle this default value? + settings?.tunnelOptions?.wireguard?.daita ?: false ) } - private fun List.filterOnOwnershipAndProvider( + private fun List.applyFilters( ownership: Constraint, - providers: Constraint - ) = mapNotNull { it.filterOnOwnershipAndProvider(ownership, providers) } + providers: Constraint, + isDaitaEnabled: Boolean + ) = mapNotNull { it.applyFilters(ownership, providers, isDaitaEnabled) } } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/customlists/FilterCustomListsRelayItemUseCase.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/customlists/FilterCustomListsRelayItemUseCase.kt index f82d9eed5e20..671035a377e6 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/customlists/FilterCustomListsRelayItemUseCase.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/usecase/customlists/FilterCustomListsRelayItemUseCase.kt @@ -6,7 +6,7 @@ import net.mullvad.mullvadvpn.lib.model.Constraint import net.mullvad.mullvadvpn.lib.model.Ownership import net.mullvad.mullvadvpn.lib.model.Providers import net.mullvad.mullvadvpn.lib.model.RelayItem -import net.mullvad.mullvadvpn.relaylist.filterOnOwnershipAndProvider +import net.mullvad.mullvadvpn.relaylist.applyFilters import net.mullvad.mullvadvpn.repository.RelayListFilterRepository class FilterCustomListsRelayItemUseCase( @@ -26,5 +26,5 @@ class FilterCustomListsRelayItemUseCase( private fun List.filterOnOwnershipAndProvider( ownership: Constraint, providers: Constraint - ) = mapNotNull { it.filterOnOwnershipAndProvider(ownership, providers) } + ) = mapNotNull { it.applyFilters(ownership, providers, isDaitaEnabled = false) } } 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 4ed285e4bd3e..4102718b33ef 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 @@ -7,6 +7,7 @@ import java.net.InetAddress import java.net.InetSocketAddress import java.util.UUID import mullvad_daemon.management_interface.ManagementInterface +import mullvad_daemon.management_interface.endpointDataOrNull import net.mullvad.mullvadvpn.lib.daemon.grpc.GrpcConnectivityState import net.mullvad.mullvadvpn.lib.daemon.grpc.RelayNameComparator import net.mullvad.mullvadvpn.lib.model.AccountData @@ -512,7 +513,10 @@ internal fun ManagementInterface.Relay.toDomain( Provider( ProviderId(provider), ownership = if (owned) Ownership.MullvadOwned else Ownership.Rented - ) + ), + daita = if (hasEndpointData() && endpointType == ManagementInterface.Relay.RelayType.WIREGUARD) { + ManagementInterface.WireguardRelayEndpointData.parseFrom (endpointData.value).daita + } else false ) internal fun ManagementInterface.Device.toDomain(): Device = 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 17bc563a8ddd..8bfa6c1f64f4 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 @@ -60,6 +60,7 @@ sealed interface RelayItem { override val id: GeoLocationId.Hostname, val provider: Provider, override val active: Boolean, + val daita: Boolean ) : Location { override val name: String = id.code override val hasChildren: Boolean = false