diff options
| author | David Göransson <david.goransson90@gmail.com> | 2023-12-19 15:44:11 +0100 |
|---|---|---|
| committer | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2024-01-04 14:58:53 +0100 |
| commit | 301d8a76a7781c6db0b170c1455c80253d221c69 (patch) | |
| tree | dffd97d37b1bf9efb9005f587aec32694ab12eb7 /android | |
| parent | dc9de3171f1c0e1e169c29be1098d8563dbb159f (diff) | |
| download | mullvadvpn-301d8a76a7781c6db0b170c1455c80253d221c69.tar.xz mullvadvpn-301d8a76a7781c6db0b170c1455c80253d221c69.zip | |
Logout user when "Go to login" is clicked.
Diffstat (limited to 'android')
3 files changed, 35 insertions, 8 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/DeviceRevokedScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/DeviceRevokedScreen.kt index 11e929c905..71ec904de5 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/DeviceRevokedScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/DeviceRevokedScreen.kt @@ -6,10 +6,10 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier @@ -34,6 +34,7 @@ import net.mullvad.mullvadvpn.compose.destinations.SettingsDestination import net.mullvad.mullvadvpn.compose.state.DeviceRevokedUiState import net.mullvad.mullvadvpn.lib.theme.AppTheme import net.mullvad.mullvadvpn.lib.theme.Dimens +import net.mullvad.mullvadvpn.viewmodel.DeviceRevokedSideEffect import net.mullvad.mullvadvpn.viewmodel.DeviceRevokedViewModel import org.koin.androidx.compose.koinViewModel @@ -49,15 +50,24 @@ fun DeviceRevoked(navigator: DestinationsNavigator) { val viewModel = koinViewModel<DeviceRevokedViewModel>() val state by viewModel.uiState.collectAsState() + + LaunchedEffect(Unit) { + viewModel.uiSideEffect.collect { sideEffect -> + when (sideEffect) { + DeviceRevokedSideEffect.NavigateToLogin -> { + navigator.navigate(LoginDestination()) { + launchSingleTop = true + popUpTo(NavGraphs.root) { inclusive = true } + } + } + } + } + } + DeviceRevokedScreen( state = state, onSettingsClicked = { navigator.navigate(SettingsDestination) { launchSingleTop = true } }, - onGoToLoginClicked = { - navigator.navigate(LoginDestination(null)) { - launchSingleTop = true - popUpTo(NavGraphs.root) { inclusive = true } - } - } + onGoToLoginClicked = viewModel::onGoToLoginClicked ) } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/DeviceRevokedViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/DeviceRevokedViewModel.kt index f5e9024c58..fed7399050 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/DeviceRevokedViewModel.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/DeviceRevokedViewModel.kt @@ -1,14 +1,19 @@ package net.mullvad.mullvadvpn.viewmodel import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.channels.BufferOverflow +import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.launch import net.mullvad.mullvadvpn.compose.state.DeviceRevokedUiState import net.mullvad.mullvadvpn.repository.AccountRepository import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionManager @@ -42,12 +47,21 @@ class DeviceRevokedViewModel( initialValue = DeviceRevokedUiState.UNKNOWN ) + private val _uiSideEffect = Channel<DeviceRevokedSideEffect>(1, BufferOverflow.DROP_OLDEST) + val uiSideEffect = _uiSideEffect.receiveAsFlow() + fun onGoToLoginClicked() { serviceConnectionManager.connectionProxy()?.let { proxy -> if (proxy.state.isSecured()) { proxy.disconnect() } - accountRepository.logout() } + accountRepository.logout() + + viewModelScope.launch { _uiSideEffect.send(DeviceRevokedSideEffect.NavigateToLogin) } } } + +sealed interface DeviceRevokedSideEffect { + data object NavigateToLogin : DeviceRevokedSideEffect +} diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/DeviceRevokedViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/DeviceRevokedViewModelTest.kt index a73ecfc4e7..0fcf684afc 100644 --- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/DeviceRevokedViewModelTest.kt +++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/DeviceRevokedViewModelTest.kt @@ -16,6 +16,7 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.UnconfinedTestDispatcher import kotlinx.coroutines.test.runTest import net.mullvad.mullvadvpn.compose.state.DeviceRevokedUiState +import net.mullvad.mullvadvpn.lib.common.test.TestCoroutineRule import net.mullvad.mullvadvpn.model.TunnelState import net.mullvad.mullvadvpn.repository.AccountRepository import net.mullvad.mullvadvpn.ui.serviceconnection.ConnectionProxy @@ -26,9 +27,11 @@ import net.mullvad.talpid.util.EventNotifier import net.mullvad.talpid.util.callbackFlowFromSubscription import org.junit.After import org.junit.Before +import org.junit.Rule import org.junit.Test class DeviceRevokedViewModelTest { + @get:Rule val testCoroutineRule = TestCoroutineRule() @MockK private lateinit var mockedAccountRepository: AccountRepository |
