diff options
| author | David Göransson <david.goransson@mullvad.net> | 2024-12-23 17:10:27 +0100 |
|---|---|---|
| committer | David Göransson <david.goransson@mullvad.net> | 2025-01-07 16:46:39 +0100 |
| commit | f3301012a957ddcc0ddc0a1d753bb1d10dc9e605 (patch) | |
| tree | 20d459f5e66d1638af4e8d6a426a38d31602fa84 /android/app | |
| parent | 9f4a0ced9991be0932a1805704737324bad1853e (diff) | |
| download | mullvadvpn-f3301012a957ddcc0ddc0a1d753bb1d10dc9e605.tar.xz mullvadvpn-f3301012a957ddcc0ddc0a1d753bb1d10dc9e605.zip | |
Remove debounce in Connect uiState
Diffstat (limited to 'android/app')
| -rw-r--r-- | android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/FlowUtils.kt | 9 | ||||
| -rw-r--r-- | android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModel.kt | 17 |
2 files changed, 21 insertions, 5 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/FlowUtils.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/FlowUtils.kt index 0c88598923..e0fa1d29b4 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/FlowUtils.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/FlowUtils.kt @@ -5,6 +5,7 @@ package net.mullvad.mullvadvpn.util import kotlinx.coroutines.Deferred import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow inline fun <T1, T2, T3, T4, T5, T6, R> combine( flow: Flow<T1>, @@ -61,3 +62,11 @@ fun <T> Deferred<T>.getOrDefault(default: T) = } catch (e: IllegalStateException) { default } + +fun <T> Flow<T>.withPrev(): Flow<Pair<T, T?>> = flow { + var prev: T? = null + collect { curr -> + emit(curr to prev) + prev = curr + } +} diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModel.kt index 42838d75d6..5cded78b62 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModel.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModel.kt @@ -8,7 +8,6 @@ import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filterIsInstance import kotlinx.coroutines.flow.map @@ -36,6 +35,7 @@ import net.mullvad.mullvadvpn.usecase.SelectedLocationTitleUseCase import net.mullvad.mullvadvpn.util.combine import net.mullvad.mullvadvpn.util.daysFromNow import net.mullvad.mullvadvpn.util.isSuccess +import net.mullvad.mullvadvpn.util.withPrev @Suppress("LongParameterList") class ConnectViewModel( @@ -62,14 +62,14 @@ class ConnectViewModel( combine( selectedLocationTitleUseCase(), inAppNotificationController.notifications, - connectionProxy.tunnelState, + connectionProxy.tunnelState.withPrev(), lastKnownLocationUseCase.lastKnownDisconnectedLocation, accountRepository.accountData, deviceRepository.deviceState.map { it?.displayName() }, ) { selectedRelayItemTitle, notifications, - tunnelState, + (tunnelState, prevTunnelState), lastKnownDisconnectedLocation, accountData, deviceName -> @@ -80,7 +80,15 @@ class ConnectViewModel( tunnelState.location ?: lastKnownDisconnectedLocation is TunnelState.Connecting -> tunnelState.location is TunnelState.Connected -> tunnelState.location - is TunnelState.Disconnecting -> lastKnownDisconnectedLocation + is TunnelState.Disconnecting -> + when (tunnelState.actionAfterDisconnect) { + ActionAfterDisconnect.Nothing -> lastKnownDisconnectedLocation + ActionAfterDisconnect.Block -> lastKnownDisconnectedLocation + // Keep the previous connected location when reconnecting, after + // this state we will reach Connecting with the new relay + // location + ActionAfterDisconnect.Reconnect -> prevTunnelState?.location() + } is TunnelState.Error -> lastKnownDisconnectedLocation }, selectedRelayItemTitle = selectedRelayItemTitle, @@ -105,7 +113,6 @@ class ConnectViewModel( isPlayBuild = isPlayBuild, ) } - .debounce(UI_STATE_DEBOUNCE_DURATION_MILLIS) .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), ConnectUiState.INITIAL) init { |
