diff options
| author | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2024-07-31 14:29:20 +0200 |
|---|---|---|
| committer | Albin <albin@mullvad.net> | 2024-08-23 09:44:47 +0200 |
| commit | 9122298a6f0ff6f613eb8786717aeb148f3bf7bc (patch) | |
| tree | d72c61fe102aa2bfbeb4c420b32241aa9ad41c9c /android | |
| parent | 26ce6fc8d23cbae3866f2aaf197935e6515996a4 (diff) | |
| download | mullvadvpn-9122298a6f0ff6f613eb8786717aeb148f3bf7bc.tar.xz mullvadvpn-9122298a6f0ff6f613eb8786717aeb148f3bf7bc.zip | |
Propagate disconnect errors to the ui
Diffstat (limited to 'android')
5 files changed, 40 insertions, 5 deletions
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/ConnectViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModel.kt index 51c720261c..296437203e 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,7 +123,9 @@ class ConnectViewModel( } fun onDisconnectClick() { - viewModelScope.launch { connectionProxy.disconnect() } + viewModelScope.launch { connectionProxy.disconnect().onLeft { + _uiSideEffect.send(UiSideEffect.ConnectError.Generic) + } } } fun onReconnectClick() { @@ -158,7 +160,9 @@ 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/OutOfTimeViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/OutOfTimeViewModel.kt index b2738a56ae..887ee8084a 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..89593fb583 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 { |
