summaryrefslogtreecommitdiffhomepage
path: root/android/app/src/main
diff options
context:
space:
mode:
authorDavid Göransson <david.goransson@mullvad.net>2025-01-07 16:46:51 +0100
committerDavid Göransson <david.goransson@mullvad.net>2025-01-07 16:46:51 +0100
commitcd277a1e2c7251b4b142e5b58c33d3b95bc7ba6c (patch)
treecc5486d5a7c2b608251e3f218674325459427885 /android/app/src/main
parent21078398c10370a049768701ac57e85bc90d2e98 (diff)
parent770cf2c1449dadd2fc9890b7218c3e71e14a3e10 (diff)
downloadmullvadvpn-cd277a1e2c7251b4b142e5b58c33d3b95bc7ba6c.tar.xz
mullvadvpn-cd277a1e2c7251b4b142e5b58c33d3b95bc7ba6c.zip
Merge branch 'be-honest-with-connection-state-droid-1690'
Diffstat (limited to 'android/app/src/main')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/ConnectionStatusText.kt4
-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.kt19
3 files changed, 24 insertions, 8 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/ConnectionStatusText.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/ConnectionStatusText.kt
index 535dcf2bb8..a5b1cff000 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/ConnectionStatusText.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/ConnectionStatusText.kt
@@ -47,8 +47,8 @@ private fun TunnelState.text() =
is TunnelState.Disconnected -> textResource(id = R.string.disconnected)
is TunnelState.Disconnecting ->
when (actionAfterDisconnect) {
- ActionAfterDisconnect.Nothing -> textResource(id = R.string.disconnected)
- ActionAfterDisconnect.Block -> textResource(id = R.string.connected)
+ ActionAfterDisconnect.Nothing -> textResource(id = R.string.disconnecting)
+ ActionAfterDisconnect.Block -> textResource(id = R.string.blocking)
ActionAfterDisconnect.Reconnect -> textResource(id = R.string.connecting)
}
is TunnelState.Error ->
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..5fb08bcc48 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,14 +80,22 @@ 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,
tunnelState = tunnelState,
showLocation =
when (tunnelState) {
- is TunnelState.Disconnected -> true
+ is TunnelState.Disconnected -> tunnelState.location != null
is TunnelState.Disconnecting -> {
when (tunnelState.actionAfterDisconnect) {
ActionAfterDisconnect.Nothing -> false
@@ -105,7 +113,6 @@ class ConnectViewModel(
isPlayBuild = isPlayBuild,
)
}
- .debounce(UI_STATE_DEBOUNCE_DURATION_MILLIS)
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), ConnectUiState.INITIAL)
init {