diff options
| author | David Göransson <david.goransson@mullvad.net> | 2025-10-02 08:17:35 +0200 |
|---|---|---|
| committer | David Göransson <david.goransson@mullvad.net> | 2025-10-03 10:48:44 +0200 |
| commit | 489c3930e129830b9fedcbca894d64f418d725ae (patch) | |
| tree | 60b711b71a753f8d89b9556d0cc270390e8e34db /android/app | |
| parent | 2a5afe1ed0eda951f20670754dd445b2863df5d7 (diff) | |
| download | mullvadvpn-489c3930e129830b9fedcbca894d64f418d725ae.tar.xz mullvadvpn-489c3930e129830b9fedcbca894d64f418d725ae.zip | |
Allow of refreshing of server list
Diffstat (limited to 'android/app')
4 files changed, 37 insertions, 2 deletions
diff --git a/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/location/SelectLocationScreenTest.kt b/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/location/SelectLocationScreenTest.kt index 09a0fa9be3..96dd9ae1cc 100644 --- a/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/location/SelectLocationScreenTest.kt +++ b/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/location/SelectLocationScreenTest.kt @@ -81,6 +81,7 @@ class SelectLocationScreenTest { onSelectRelayList: (MultihopRelayListType) -> Unit = {}, openDaitaSettings: () -> Unit = {}, onRecentsToggleEnableClick: () -> Unit = {}, + onRefreshRelayList: () -> Unit = {}, ) { setContentWithTheme { @@ -103,6 +104,7 @@ class SelectLocationScreenTest { onSelectRelayList = onSelectRelayList, openDaitaSettings = openDaitaSettings, onRecentsToggleEnableClick = onRecentsToggleEnableClick, + onRefreshRelayList = onRefreshRelayList, ) } } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/location/SelectLocationScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/location/SelectLocationScreen.kt index 7e83680499..c1d4df8c12 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/location/SelectLocationScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/location/SelectLocationScreen.kt @@ -19,6 +19,7 @@ import androidx.compose.material.icons.filled.Close import androidx.compose.material.icons.filled.FilterList import androidx.compose.material.icons.filled.History import androidx.compose.material.icons.filled.MoreVert +import androidx.compose.material.icons.filled.Refresh import androidx.compose.material.icons.filled.Search import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem @@ -121,13 +122,14 @@ private fun PreviewSelectLocationScreen( onDeleteCustomList = {}, onSelectRelayList = {}, openDaitaSettings = {}, + onRefreshRelayList = {}, ) } } @SuppressLint("CheckResult") @Destination<RootGraph>(style = TopLevelTransition::class) -@Suppress("LongMethod") +@Suppress("LongMethod", "CyclomaticComplexMethod") @Composable fun SelectLocation( navigator: DestinationsNavigator, @@ -204,6 +206,12 @@ fun SelectLocation( message = context.getString(R.string.entry_and_exit_are_same) ) } + SelectLocationSideEffect.RelayListUpdating -> + launch { + snackbarHostState.showSnackbarImmediately( + message = context.getString(R.string.updating_server_list_in_the_background) + ) + } is SelectLocationSideEffect.FocusExitList -> launch { // If multihop is enabled and the user selects a location or custom list in the @@ -292,6 +300,7 @@ fun SelectLocation( onRecentsToggleEnableClick = vm::toggleRecentsEnabled, openDaitaSettings = dropUnlessResumed { navigator.navigate(DaitaDestination(isModal = true)) }, + onRefreshRelayList = vm::refreshRelayList, ) } @@ -317,6 +326,7 @@ fun SelectLocationScreen( onDeleteCustomList: (RelayItem.CustomList) -> Unit, onSelectRelayList: (MultihopRelayListType) -> Unit, openDaitaSettings: () -> Unit, + onRefreshRelayList: () -> Unit, ) { val backgroundColor = MaterialTheme.colorScheme.surface @@ -364,6 +374,7 @@ fun SelectLocationScreen( } onRecentsToggleEnableClick() }, + onRefreshRelayList = onRefreshRelayList, ) }, ) { modifier -> @@ -454,6 +465,7 @@ private fun SelectLocationDropdownMenu( onFilterClick: () -> Unit, recentsEnabled: Boolean, onRecentsToggleEnableClick: () -> Unit, + onRefreshRelayList: () -> Unit, ) { var showMenu by remember { mutableStateOf(false) } @@ -507,6 +519,16 @@ private fun SelectLocationDropdownMenu( colors = colors, leadingIcon = { Icon(Icons.Filled.History, contentDescription = null) }, ) + + DropdownMenuItem( + text = { Text(text = stringResource(R.string.refresh_server_list)) }, + onClick = { + showMenu = false + onRefreshRelayList() + }, + colors = colors, + leadingIcon = { Icon(Icons.Filled.Refresh, contentDescription = null) }, + ) } } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/RelayListRepository.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/RelayListRepository.kt index 5347a4666e..065e1409ce 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/RelayListRepository.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/RelayListRepository.kt @@ -84,6 +84,8 @@ class RelayListRepository( suspend fun updateSelectedRelayLocationMultihop(entry: RelayItemId, exit: RelayItemId) = managementService.setRelayLocationMultihop(entry, exit) + suspend fun refreshRelayList() = managementService.updateRelayLocations() + fun find(geoLocationId: GeoLocationId) = relayList.value.findByGeoLocationId(geoLocationId) private fun defaultWireguardEndpointData() = WireguardEndpointData(emptyList(), emptyList()) diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/location/SelectLocationViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/location/SelectLocationViewModel.kt index 8db8da3c35..763ffc9890 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/location/SelectLocationViewModel.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/location/SelectLocationViewModel.kt @@ -47,7 +47,7 @@ class SelectLocationViewModel( private val relayListFilterRepository: RelayListFilterRepository, private val customListsRepository: CustomListsRepository, private val customListActionUseCase: CustomListActionUseCase, - relayListRepository: RelayListRepository, + private val relayListRepository: RelayListRepository, wireguardConstraintsRepository: WireguardConstraintsRepository, private val filterChipUseCase: FilterChipUseCase, private val settingsRepository: SettingsRepository, @@ -204,6 +204,13 @@ class SelectLocationViewModel( } } + fun refreshRelayList() { + viewModelScope.launch { + relayListRepository.refreshRelayList() + _uiSideEffect.send(SelectLocationSideEffect.RelayListUpdating) + } + } + private fun ModifyMultihopError.toSideEffect( multihopRelayListType: MultihopRelayListType ): SelectLocationSideEffect = @@ -245,5 +252,7 @@ sealed interface SelectLocationSideEffect { data object EntryAndExitAreSame : SelectLocationSideEffect + data object RelayListUpdating : SelectLocationSideEffect + data class FocusExitList(val relayItem: RelayItem) : SelectLocationSideEffect } |
