summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
Diffstat (limited to 'android')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/FlowUtils.kt9
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModel.kt17
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 {