summaryrefslogtreecommitdiffhomepage
path: root/android/app
diff options
context:
space:
mode:
Diffstat (limited to 'android/app')
-rw-r--r--android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/location/SelectLocationScreenTest.kt2
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/location/SelectLocationScreen.kt24
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/repository/RelayListRepository.kt2
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/location/SelectLocationViewModel.kt11
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
}