summaryrefslogtreecommitdiffhomepage
path: root/android/app/src
diff options
context:
space:
mode:
Diffstat (limited to 'android/app/src')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt4
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/LoginScreen.kt24
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/OutOfTimeScreen.kt13
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/WelcomeScreen.kt11
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModel.kt10
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModel.kt18
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModel.kt14
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/OutOfTimeViewModel.kt7
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/WelcomeViewModel.kt6
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModelTest.kt4
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModelTest.kt6
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/DeviceRevokedViewModelTest.kt11
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModelTest.kt3
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/OutOfTimeViewModelTest.kt3
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/WelcomeViewModelTest.kt3
15 files changed, 109 insertions, 28 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt
index 6969e56518..bd64cc3561 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt
@@ -57,6 +57,7 @@ import net.mullvad.mullvadvpn.compose.transitions.SlideInFromBottomTransition
import net.mullvad.mullvadvpn.compose.util.LaunchedEffectCollect
import net.mullvad.mullvadvpn.compose.util.SecureScreenWhileInView
import net.mullvad.mullvadvpn.compose.util.createCopyToClipboardHandle
+import net.mullvad.mullvadvpn.compose.util.showSnackbarImmediately
import net.mullvad.mullvadvpn.lib.model.AccountNumber
import net.mullvad.mullvadvpn.lib.payment.model.PaymentProduct
import net.mullvad.mullvadvpn.lib.payment.model.PaymentStatus
@@ -164,6 +165,7 @@ fun AccountScreen(
val snackbarHostState = remember { SnackbarHostState() }
val copyTextString = stringResource(id = R.string.copied_mullvad_account_number)
+ val errorString = stringResource(id = R.string.error_occurred)
val copyToClipboard = createCopyToClipboardHandle(snackbarHostState = snackbarHostState)
val openAccountPage = LocalUriHandler.current.createOpenAccountPageHook()
LaunchedEffectCollect(uiSideEffect) { sideEffect ->
@@ -173,6 +175,8 @@ fun AccountScreen(
openAccountPage(sideEffect.token)
is AccountViewModel.UiSideEffect.CopyAccountNumber ->
launch { copyToClipboard(sideEffect.accountNumber, copyTextString) }
+ AccountViewModel.UiSideEffect.GenericError ->
+ snackbarHostState.showSnackbarImmediately(message = errorString)
}
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/LoginScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/LoginScreen.kt
index 8a31520aad..1758a31432 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/LoginScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/LoginScreen.kt
@@ -24,6 +24,7 @@ import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.runtime.Composable
@@ -37,6 +38,7 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusProperties
import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
@@ -73,6 +75,7 @@ import net.mullvad.mullvadvpn.compose.textfield.mullvadWhiteTextFieldColors
import net.mullvad.mullvadvpn.compose.transitions.LoginTransition
import net.mullvad.mullvadvpn.compose.util.CollectSideEffectWithLifecycle
import net.mullvad.mullvadvpn.compose.util.accountNumberVisualTransformation
+import net.mullvad.mullvadvpn.compose.util.showSnackbarImmediately
import net.mullvad.mullvadvpn.lib.theme.AppTheme
import net.mullvad.mullvadvpn.lib.theme.Dimens
import net.mullvad.mullvadvpn.viewmodel.LoginUiSideEffect
@@ -126,6 +129,8 @@ fun Login(
}
}
+ val context = LocalContext.current
+ val snackbarHostState = remember { SnackbarHostState() }
CollectSideEffectWithLifecycle(vm.uiSideEffect) {
when (it) {
LoginUiSideEffect.NavigateToWelcome ->
@@ -147,21 +152,27 @@ fun Login(
launchSingleTop = true
popUpTo(NavGraphs.root) { inclusive = true }
}
+ LoginUiSideEffect.GenericError ->
+ snackbarHostState.showSnackbarImmediately(
+ message = context.getString(R.string.error_occurred),
+ )
}
}
LoginScreen(
- state,
- vm::login,
- vm::createAccount,
- vm::clearAccountHistory,
- vm::onAccountNumberChange,
- dropUnlessResumed { navigator.navigate(SettingsDestination) }
+ state = state,
+ snackbarHostState = snackbarHostState,
+ onLoginClick = vm::login,
+ onCreateAccountClick = vm::createAccount,
+ onDeleteHistoryClick = vm::clearAccountHistory,
+ onAccountNumberChange = vm::onAccountNumberChange,
+ onSettingsClick = dropUnlessResumed { navigator.navigate(SettingsDestination) }
)
}
@Composable
private fun LoginScreen(
state: LoginUiState,
+ snackbarHostState: SnackbarHostState = SnackbarHostState(),
onLoginClick: (String) -> Unit = {},
onCreateAccountClick: () -> Unit = {},
onDeleteHistoryClick: () -> Unit = {},
@@ -169,6 +180,7 @@ private fun LoginScreen(
onSettingsClick: () -> Unit = {},
) {
ScaffoldWithTopBar(
+ snackbarHostState = snackbarHostState,
topBarColor = MaterialTheme.colorScheme.primary,
iconTintColor = MaterialTheme.colorScheme.onPrimary,
onSettingsClicked = onSettingsClick,
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/OutOfTimeScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/OutOfTimeScreen.kt
index eea7a20e47..7b5b4bff55 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/OutOfTimeScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/OutOfTimeScreen.kt
@@ -11,11 +11,14 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
+import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.painterResource
@@ -49,6 +52,7 @@ import net.mullvad.mullvadvpn.compose.state.OutOfTimeUiState
import net.mullvad.mullvadvpn.compose.test.OUT_OF_TIME_SCREEN_TITLE_TEST_TAG
import net.mullvad.mullvadvpn.compose.transitions.HomeTransition
import net.mullvad.mullvadvpn.compose.util.CollectSideEffectWithLifecycle
+import net.mullvad.mullvadvpn.compose.util.showSnackbarImmediately
import net.mullvad.mullvadvpn.lib.model.ErrorState
import net.mullvad.mullvadvpn.lib.model.ErrorStateCause
import net.mullvad.mullvadvpn.lib.model.TunnelState
@@ -135,6 +139,8 @@ fun OutOfTime(
}
}
+ val snackbarHostState = remember { SnackbarHostState() }
+ val context = LocalContext.current
val openAccountPage = LocalUriHandler.current.createOpenAccountPageHook()
CollectSideEffectWithLifecycle(vm.uiSideEffect, Lifecycle.State.RESUMED) { uiSideEffect ->
when (uiSideEffect) {
@@ -145,11 +151,16 @@ fun OutOfTime(
launchSingleTop = true
popUpTo(NavGraphs.root) { inclusive = true }
}
+ OutOfTimeViewModel.UiSideEffect.GenericError ->
+ snackbarHostState.showSnackbarImmediately(
+ message = context.getString(R.string.error_occurred)
+ )
}
}
OutOfTimeScreen(
state = state,
+ snackbarHostState = snackbarHostState,
onSitePaymentClick = vm::onSitePaymentClick,
onRedeemVoucherClick = dropUnlessResumed { navigator.navigate(RedeemVoucherDestination) },
onSettingsClick = dropUnlessResumed { navigator.navigate(SettingsDestination) },
@@ -165,6 +176,7 @@ fun OutOfTime(
@Composable
fun OutOfTimeScreen(
state: OutOfTimeUiState,
+ snackbarHostState: SnackbarHostState = SnackbarHostState(),
onDisconnectClick: () -> Unit = {},
onSitePaymentClick: () -> Unit = {},
onRedeemVoucherClick: () -> Unit = {},
@@ -176,6 +188,7 @@ fun OutOfTimeScreen(
val scrollState = rememberScrollState()
ScaffoldWithTopBarAndDeviceName(
+ snackbarHostState = snackbarHostState,
topBarColor =
if (state.tunnelState.isSecured()) {
MaterialTheme.colorScheme.tertiary
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/WelcomeScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/WelcomeScreen.kt
index bb376c09f9..e53ec044cc 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/WelcomeScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/WelcomeScreen.kt
@@ -21,6 +21,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
@@ -57,6 +58,7 @@ import net.mullvad.mullvadvpn.compose.state.WelcomeUiState
import net.mullvad.mullvadvpn.compose.transitions.HomeTransition
import net.mullvad.mullvadvpn.compose.util.CollectSideEffectWithLifecycle
import net.mullvad.mullvadvpn.compose.util.createCopyToClipboardHandle
+import net.mullvad.mullvadvpn.compose.util.showSnackbarImmediately
import net.mullvad.mullvadvpn.lib.common.util.groupWithSpaces
import net.mullvad.mullvadvpn.lib.model.AccountNumber
import net.mullvad.mullvadvpn.lib.payment.model.PaymentProduct
@@ -131,6 +133,8 @@ fun Welcome(
}
}
+ val snackbarHostState = remember { SnackbarHostState() }
+ val context = LocalContext.current
val openAccountPage = LocalUriHandler.current.createOpenAccountPageHook()
CollectSideEffectWithLifecycle(sideEffect = vm.uiSideEffect, Lifecycle.State.RESUMED) {
uiSideEffect ->
@@ -141,11 +145,16 @@ fun Welcome(
launchSingleTop = true
popUpTo(NavGraphs.root) { inclusive = true }
}
+ WelcomeViewModel.UiSideEffect.GenericError ->
+ snackbarHostState.showSnackbarImmediately(
+ message = context.getString(R.string.error_occurred)
+ )
}
}
WelcomeScreen(
state = state,
+ snackbarHostState = snackbarHostState,
onSitePaymentClick = dropUnlessResumed { vm.onSitePaymentClick() },
onRedeemVoucherClick = dropUnlessResumed { navigator.navigate(RedeemVoucherDestination) },
onSettingsClick = dropUnlessResumed { navigator.navigate(SettingsDestination) },
@@ -163,6 +172,7 @@ fun Welcome(
@Composable
fun WelcomeScreen(
state: WelcomeUiState,
+ snackbarHostState: SnackbarHostState = SnackbarHostState(),
onSitePaymentClick: () -> Unit,
onRedeemVoucherClick: () -> Unit,
onSettingsClick: () -> Unit,
@@ -173,7 +183,6 @@ fun WelcomeScreen(
navigateToVerificationPendingDialog: () -> Unit
) {
val scrollState = rememberScrollState()
- val snackbarHostState = remember { SnackbarHostState() }
ScaffoldWithTopBar(
topBarColor = MaterialTheme.colorScheme.primary,
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModel.kt
index b830d00c60..f8f66563e8 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModel.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModel.kt
@@ -75,8 +75,12 @@ class AccountViewModel(
fun onLogoutClick() {
viewModelScope.launch {
- accountRepository.logout()
- _uiSideEffect.send(UiSideEffect.NavigateToLogin)
+ accountRepository
+ .logout()
+ .fold(
+ { _uiSideEffect.send(UiSideEffect.GenericError) },
+ { _uiSideEffect.send(UiSideEffect.NavigateToLogin) }
+ )
}
}
@@ -127,6 +131,8 @@ class AccountViewModel(
UiSideEffect()
data class CopyAccountNumber(val accountNumber: String) : UiSideEffect()
+
+ data object GenericError : UiSideEffect()
}
}
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 d1f4b3713b..325ee42b43 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
@@ -123,11 +123,19 @@ class ConnectViewModel(
}
fun onDisconnectClick() {
- viewModelScope.launch { connectionProxy.disconnect() }
+ viewModelScope.launch {
+ connectionProxy.disconnect().onLeft {
+ _uiSideEffect.send(UiSideEffect.ConnectError.Generic)
+ }
+ }
}
fun onReconnectClick() {
- viewModelScope.launch { connectionProxy.reconnect() }
+ viewModelScope.launch {
+ connectionProxy.reconnect().onLeft {
+ _uiSideEffect.send(UiSideEffect.ConnectError.Generic)
+ }
+ }
}
fun onConnectClick() {
@@ -156,7 +164,11 @@ class ConnectViewModel(
}
fun onCancelClick() {
- viewModelScope.launch { connectionProxy.disconnect() }
+ viewModelScope.launch {
+ connectionProxy.disconnect().onLeft {
+ _uiSideEffect.send(UiSideEffect.ConnectError.Generic)
+ }
+ }
}
fun onManageAccountClick() {
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModel.kt
index 30bea42cfe..3c02c92917 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModel.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModel.kt
@@ -42,6 +42,8 @@ sealed interface LoginUiSideEffect {
data object NavigateToOutOfTime : LoginUiSideEffect
data class TooManyDevices(val accountNumber: AccountNumber) : LoginUiSideEffect
+
+ data object GenericError : LoginUiSideEffect
}
class LoginViewModel(
@@ -78,9 +80,15 @@ class LoginViewModel(
fun clearAccountHistory() =
viewModelScope.launch {
- accountRepository.clearAccountHistory()
- _mutableAccountHistory.update { null }
- _mutableAccountHistory.update { accountRepository.fetchAccountHistory() }
+ accountRepository
+ .clearAccountHistory()
+ .fold(
+ { _uiSideEffect.send(LoginUiSideEffect.GenericError) },
+ {
+ _mutableAccountHistory.update { null }
+ _mutableAccountHistory.update { accountRepository.fetchAccountHistory() }
+ }
+ )
}
fun createAccount() {
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/OutOfTimeViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/OutOfTimeViewModel.kt
index b2738a56ae..dfa4e6e3cc 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/OutOfTimeViewModel.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/OutOfTimeViewModel.kt
@@ -22,6 +22,7 @@ import net.mullvad.mullvadvpn.usecase.OutOfTimeUseCase
import net.mullvad.mullvadvpn.usecase.PaymentUseCase
import net.mullvad.mullvadvpn.util.isSuccess
import net.mullvad.mullvadvpn.util.toPaymentState
+import net.mullvad.mullvadvpn.viewmodel.WelcomeViewModel.UiSideEffect
class OutOfTimeViewModel(
private val accountRepository: AccountRepository,
@@ -71,7 +72,9 @@ class OutOfTimeViewModel(
}
fun onDisconnectClick() {
- viewModelScope.launch { connectionProxy.disconnect() }
+ viewModelScope.launch {
+ connectionProxy.disconnect().onLeft { _uiSideEffect.send(UiSideEffect.GenericError) }
+ }
}
private fun verifyPurchases() {
@@ -118,5 +121,7 @@ class OutOfTimeViewModel(
data class OpenAccountView(val token: WebsiteAuthToken?) : UiSideEffect
data object OpenConnectScreen : UiSideEffect
+
+ data object GenericError : UiSideEffect
}
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/WelcomeViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/WelcomeViewModel.kt
index 525c6ca54e..e532045ae2 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/WelcomeViewModel.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/WelcomeViewModel.kt
@@ -78,7 +78,9 @@ class WelcomeViewModel(
}
fun onDisconnectClick() {
- viewModelScope.launch { connectionProxy.disconnect() }
+ viewModelScope.launch {
+ connectionProxy.disconnect().onLeft { _uiSideEffect.send(UiSideEffect.GenericError) }
+ }
}
private fun verifyPurchases() {
@@ -118,6 +120,8 @@ class WelcomeViewModel(
data class OpenAccountView(val token: WebsiteAuthToken?) : UiSideEffect
data object OpenConnectScreen : UiSideEffect
+
+ data object GenericError : UiSideEffect
}
companion object {
diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModelTest.kt
index 706d8031e7..d239e01331 100644
--- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModelTest.kt
+++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/AccountViewModelTest.kt
@@ -2,6 +2,7 @@ package net.mullvad.mullvadvpn.viewmodel
import android.app.Activity
import app.cash.turbine.test
+import arrow.core.right
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.every
@@ -93,6 +94,9 @@ class AccountViewModelTest {
@Test
fun `onLogoutClick should invoke logout on AccountRepository`() {
+ // Arrange
+ coEvery { mockAccountRepository.logout() } returns Unit.right()
+
// Act
viewModel.onLogoutClick()
diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModelTest.kt
index e6803d4e08..50a16d1432 100644
--- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModelTest.kt
+++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModelTest.kt
@@ -234,7 +234,7 @@ class ConnectViewModelTest {
@Test
fun `onDisconnectClick should invoke disconnect on ConnectionProxy`() = runTest {
// Arrange
- coEvery { mockConnectionProxy.disconnect() } returns true
+ coEvery { mockConnectionProxy.disconnect() } returns true.right()
// Act
viewModel.onDisconnectClick()
@@ -246,7 +246,7 @@ class ConnectViewModelTest {
@Test
fun `onReconnectClick should invoke reconnect on ConnectionProxy`() = runTest {
// Arrange
- coEvery { mockConnectionProxy.reconnect() } returns true
+ coEvery { mockConnectionProxy.reconnect() } returns true.right()
// Act
viewModel.onReconnectClick()
@@ -270,7 +270,7 @@ class ConnectViewModelTest {
@Test
fun `onCancelClick should invoke disconnect on ConnectionProxy`() = runTest {
// Arrange
- coEvery { mockConnectionProxy.disconnect() } returns true
+ coEvery { mockConnectionProxy.disconnect() } returns true.right()
// Act
viewModel.onCancelClick()
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 b63f59b302..51ea31540c 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
@@ -1,14 +1,13 @@
package net.mullvad.mullvadvpn.viewmodel
import app.cash.turbine.test
+import arrow.core.right
import io.mockk.MockKAnnotations
-import io.mockk.Runs
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.coVerifyOrder
import io.mockk.every
import io.mockk.impl.annotations.MockK
-import io.mockk.just
import io.mockk.mockk
import io.mockk.unmockkAll
import kotlinx.coroutines.flow.MutableSharedFlow
@@ -70,8 +69,8 @@ class DeviceRevokedViewModelTest {
@Test
fun `onGoToLoginClicked should invoke logout on AccountRepository`() {
// Arrange
- coEvery { mockConnectionProxy.disconnect() } returns true
- coEvery { mockedAccountRepository.logout() } just Runs
+ coEvery { mockConnectionProxy.disconnect() } returns true.right()
+ coEvery { mockedAccountRepository.logout() } returns Unit.right()
// Act
viewModel.onGoToLoginClicked()
@@ -83,8 +82,8 @@ class DeviceRevokedViewModelTest {
@Test
fun `onGoToLoginClicked should invoke disconnect before logout when connected`() {
// Arrange
- coEvery { mockConnectionProxy.disconnect() } returns true
- coEvery { mockedAccountRepository.logout() } just Runs
+ coEvery { mockConnectionProxy.disconnect() } returns true.right()
+ coEvery { mockedAccountRepository.logout() } returns Unit.right()
// Act
viewModel.onGoToLoginClicked()
diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModelTest.kt
index 33eb3bdc3c..a9905e9506 100644
--- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModelTest.kt
+++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/LoginViewModelTest.kt
@@ -208,6 +208,9 @@ class LoginViewModelTest {
@Test
fun `clearAccountHistory should invoke clearAccountHistory on AccountRepository`() = runTest {
+ // Arrange
+ coEvery { mockedAccountRepository.clearAccountHistory() } returns Unit.right()
+
// Act, Assert
loginViewModel.clearAccountHistory()
coVerify { mockedAccountRepository.clearAccountHistory() }
diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/OutOfTimeViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/OutOfTimeViewModelTest.kt
index bd26effe82..886cb58fda 100644
--- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/OutOfTimeViewModelTest.kt
+++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/OutOfTimeViewModelTest.kt
@@ -2,6 +2,7 @@ package net.mullvad.mullvadvpn.viewmodel
import androidx.lifecycle.viewModelScope
import app.cash.turbine.test
+import arrow.core.right
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.every
@@ -146,7 +147,7 @@ class OutOfTimeViewModelTest {
@Test
fun `onDisconnectClick should invoke disconnect on ConnectionProxy`() = runTest {
// Arrange
- coEvery { mockConnectionProxy.disconnect() } returns true
+ coEvery { mockConnectionProxy.disconnect() } returns true.right()
// Act
viewModel.onDisconnectClick()
diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/WelcomeViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/WelcomeViewModelTest.kt
index 1c7a7d0e3b..9ef1455bb7 100644
--- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/WelcomeViewModelTest.kt
+++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/WelcomeViewModelTest.kt
@@ -2,6 +2,7 @@ package net.mullvad.mullvadvpn.viewmodel
import androidx.lifecycle.viewModelScope
import app.cash.turbine.test
+import arrow.core.right
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.every
@@ -217,7 +218,7 @@ class WelcomeViewModelTest {
@Test
fun `when on disconnect click is called should call connection proxy disconnect`() = runTest {
// Arrange
- coEvery { mockConnectionProxy.disconnect() } returns true
+ coEvery { mockConnectionProxy.disconnect() } returns true.right()
// Act
viewModel.onDisconnectClick()