diff options
| author | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2024-06-18 17:53:14 +0200 |
|---|---|---|
| committer | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2024-06-19 17:54:02 +0200 |
| commit | bd29196ef69edde905d886962ffc44917a03b5a0 (patch) | |
| tree | f901c2d5e58746436cd494706ec1961f4b7375bb /android/app | |
| parent | b0335d5157e58a91f7d434aed3761e9dc81aba55 (diff) | |
| download | mullvadvpn-bd29196ef69edde905d886962ffc44917a03b5a0.tar.xz mullvadvpn-bd29196ef69edde905d886962ffc44917a03b5a0.zip | |
Show disconnect button when connected in welcome screen
Diffstat (limited to 'android/app')
3 files changed, 32 insertions, 20 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 22ab725e7f..58e5d4f8b3 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 @@ -48,7 +48,6 @@ 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.lib.model.ActionAfterDisconnect import net.mullvad.mullvadvpn.lib.model.ErrorState import net.mullvad.mullvadvpn.lib.model.ErrorStateCause import net.mullvad.mullvadvpn.lib.model.TunnelState @@ -268,7 +267,7 @@ private fun ButtonPanel( ) { Column { - if (state.tunnelState.showDisconnectButton()) { + if (state.tunnelState.isSecured()) { NegativeButton( onClick = onDisconnectClick, text = stringResource(id = R.string.disconnect), @@ -321,17 +320,6 @@ private fun ButtonPanel( } } -private fun TunnelState.showDisconnectButton(): Boolean = - when (this) { - is TunnelState.Disconnected -> false - is TunnelState.Connecting, - is TunnelState.Connected -> true - is TunnelState.Disconnecting -> { - this.actionAfterDisconnect != ActionAfterDisconnect.Nothing - } - is TunnelState.Error -> this.errorState.isBlocking - } - private fun TunnelState.enableSitePaymentButton(): Boolean = this is TunnelState.Disconnected private fun TunnelState.enableRedeemButton(): Boolean = 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 71594527fd..f233358bfc 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 @@ -35,6 +35,7 @@ import com.ramcosta.composedestinations.result.NavResult import com.ramcosta.composedestinations.result.ResultRecipient import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.compose.NavGraphs +import net.mullvad.mullvadvpn.compose.button.NegativeButton import net.mullvad.mullvadvpn.compose.button.RedeemVoucherButton import net.mullvad.mullvadvpn.compose.button.SitePaymentButton import net.mullvad.mullvadvpn.compose.component.CopyAnimatedIconButton @@ -89,7 +90,8 @@ private fun PreviewWelcomeScreen() { onAccountClick = {}, onPurchaseBillingProductClick = { _ -> }, navigateToDeviceInfoDialog = {}, - navigateToVerificationPendingDialog = {} + navigateToVerificationPendingDialog = {}, + onDisconnectClick = {} ) } } @@ -152,6 +154,7 @@ fun Welcome( onPurchaseBillingProductClick = { productId -> navigator.navigate(PaymentDestination(productId), onlyIfResumed = true) }, + onDisconnectClick = vm::onDisconnectClick, navigateToVerificationPendingDialog = dropUnlessResumed { navigator.navigate(VerificationPendingDialogDestination) } ) @@ -165,6 +168,7 @@ fun WelcomeScreen( onSettingsClick: () -> Unit, onAccountClick: () -> Unit, onPurchaseBillingProductClick: (productId: ProductId) -> Unit, + onDisconnectClick: () -> Unit, navigateToDeviceInfoDialog: () -> Unit, navigateToVerificationPendingDialog: () -> Unit ) { @@ -193,14 +197,16 @@ fun WelcomeScreen( Spacer(modifier = Modifier.weight(1f)) - // Payment button area - PaymentPanel( + // Button area + ButtonPanel( + showDisconnectButton = state.tunnelState.isSecured(), showSitePayment = state.showSitePayment, billingPaymentState = state.billingPaymentState, onSitePaymentClick = onSitePaymentClick, onRedeemVoucherClick = onRedeemVoucherClick, onPurchaseBillingProductClick = onPurchaseBillingProductClick, - onPaymentInfoClick = navigateToVerificationPendingDialog + onPaymentInfoClick = navigateToVerificationPendingDialog, + onDisconnectClick = onDisconnectClick ) } } @@ -326,16 +332,30 @@ fun DeviceNameRow(deviceName: String?, navigateToDeviceInfoDialog: () -> Unit) { } @Composable -private fun PaymentPanel( +private fun ButtonPanel( + showDisconnectButton: Boolean, showSitePayment: Boolean, billingPaymentState: PaymentState?, onSitePaymentClick: () -> Unit, onRedeemVoucherClick: () -> Unit, onPurchaseBillingProductClick: (productId: ProductId) -> Unit, - onPaymentInfoClick: () -> Unit + onPaymentInfoClick: () -> Unit, + onDisconnectClick: () -> Unit ) { Column(modifier = Modifier.fillMaxWidth().padding(top = Dimens.mediumPadding)) { Spacer(modifier = Modifier.padding(top = Dimens.screenVerticalMargin)) + if (showDisconnectButton) { + NegativeButton( + onClick = onDisconnectClick, + text = stringResource(id = R.string.disconnect), + modifier = + Modifier.padding( + start = Dimens.sideMargin, + end = Dimens.sideMargin, + bottom = Dimens.buttonSpacing + ) + ) + } billingPaymentState?.let { PlayPayment( billingPaymentState = billingPaymentState, 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 9322ef9ce4..f987f16dc9 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 @@ -28,7 +28,7 @@ class WelcomeViewModel( private val accountRepository: AccountRepository, deviceRepository: DeviceRepository, private val paymentUseCase: PaymentUseCase, - connectionProxy: ConnectionProxy, + private val connectionProxy: ConnectionProxy, private val pollAccountExpiry: Boolean = true, private val isPlayBuild: Boolean ) : ViewModel() { @@ -78,6 +78,10 @@ class WelcomeViewModel( } } + fun onDisconnectClick() { + viewModelScope.launch { connectionProxy.disconnect() } + } + private fun verifyPurchases() { viewModelScope.launch { if (paymentUseCase.verifyPurchases().isSuccess()) { |
