diff options
| author | David Göransson <david.goransson90@gmail.com> | 2024-03-06 10:35:36 +0100 |
|---|---|---|
| committer | David Göransson <david.goransson@mullvad.net> | 2024-03-11 15:56:57 +0100 |
| commit | 5560072b52fd1fc883ce3864328c5751ac778528 (patch) | |
| tree | 4a18d51238db8bd7157164071ec10fca5f08ac40 /android/app/src | |
| parent | 70d54089f8958cd2002fdc4b320c966ffdcdd5e6 (diff) | |
| download | mullvadvpn-5560072b52fd1fc883ce3864328c5751ac778528.tar.xz mullvadvpn-5560072b52fd1fc883ce3864328c5751ac778528.zip | |
Simplify side effect collection with LaunchedEffectCollect
Diffstat (limited to 'android/app/src')
13 files changed, 89 insertions, 121 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DnsDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DnsDialog.kt index b4b9d66efd..0791f756b3 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DnsDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DnsDialog.kt @@ -8,7 +8,6 @@ import androidx.compose.material3.AlertDialog import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -22,6 +21,7 @@ import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.compose.button.NegativeButton import net.mullvad.mullvadvpn.compose.button.PrimaryButton import net.mullvad.mullvadvpn.compose.textfield.DnsTextField +import net.mullvad.mullvadvpn.compose.util.LaunchedEffectCollect import net.mullvad.mullvadvpn.lib.theme.AppTheme import net.mullvad.mullvadvpn.lib.theme.Dimens import net.mullvad.mullvadvpn.viewmodel.DnsDialogSideEffect @@ -100,11 +100,9 @@ fun DnsDialog( val viewModel = koinViewModel<DnsDialogViewModel>(parameters = { parametersOf(initialValue, index) }) - LaunchedEffect(Unit) { - viewModel.uiSideEffect.collect { - when (it) { - DnsDialogSideEffect.Complete -> resultNavigator.navigateBack(result = true) - } + LaunchedEffectCollect(viewModel.uiSideEffect) { + when (it) { + DnsDialogSideEffect.Complete -> resultNavigator.navigateBack(result = true) } } val state by viewModel.uiState.collectAsStateWithLifecycle() diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/MtuDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/MtuDialog.kt index 91fb0287c9..e4a790fdb4 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/MtuDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/MtuDialog.kt @@ -8,7 +8,6 @@ import androidx.compose.material3.AlertDialog import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Modifier @@ -21,6 +20,7 @@ import com.ramcosta.composedestinations.spec.DestinationStyle import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.compose.button.PrimaryButton import net.mullvad.mullvadvpn.compose.textfield.MtuTextField +import net.mullvad.mullvadvpn.compose.util.LaunchedEffectCollect import net.mullvad.mullvadvpn.constant.MTU_MAX_VALUE import net.mullvad.mullvadvpn.constant.MTU_MIN_VALUE import net.mullvad.mullvadvpn.lib.theme.AppTheme @@ -42,11 +42,9 @@ private fun PreviewMtuDialog() { fun MtuDialog(mtuInitial: Int?, navigator: DestinationsNavigator) { val viewModel = koinViewModel<MtuDialogViewModel>() - LaunchedEffect(Unit) { - viewModel.uiSideEffect.collect { - when (it) { - MtuDialogSideEffect.Complete -> navigator.navigateUp() - } + LaunchedEffectCollect(viewModel.uiSideEffect) { + when (it) { + MtuDialogSideEffect.Complete -> navigator.navigateUp() } } MtuDialog( diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/payment/PaymentDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/payment/PaymentDialog.kt index 556e18c193..03e9434006 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/payment/PaymentDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/payment/PaymentDialog.kt @@ -20,6 +20,7 @@ import com.ramcosta.composedestinations.spec.DestinationStyle import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.compose.button.PrimaryButton import net.mullvad.mullvadvpn.compose.component.MullvadCircularProgressIndicatorMedium +import net.mullvad.mullvadvpn.compose.util.LaunchedEffectCollect import net.mullvad.mullvadvpn.lib.payment.model.ProductId import net.mullvad.mullvadvpn.lib.theme.AppTheme import net.mullvad.mullvadvpn.lib.theme.color.AlphaDescription @@ -125,12 +126,10 @@ fun Payment(productId: ProductId, resultBackNavigator: ResultBackNavigator<Boole val vm = koinViewModel<PaymentViewModel>() val state by vm.uiState.collectAsStateWithLifecycle() - LaunchedEffect(Unit) { - vm.uiSideEffect.collect { - when (it) { - is PaymentUiSideEffect.PaymentCancelled -> - resultBackNavigator.navigateBack(result = false) - } + LaunchedEffectCollect(vm.uiSideEffect) { + when (it) { + is PaymentUiSideEffect.PaymentCancelled -> + resultBackNavigator.navigateBack(result = false) } } 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 d55cf6d2ca..ce7ff1b589 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 @@ -16,7 +16,6 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment @@ -55,6 +54,7 @@ import net.mullvad.mullvadvpn.compose.destinations.RedeemVoucherDestination import net.mullvad.mullvadvpn.compose.destinations.VerificationPendingDialogDestination import net.mullvad.mullvadvpn.compose.state.PaymentState 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.lib.common.util.openAccountPageInBrowser import net.mullvad.mullvadvpn.lib.payment.model.PaymentProduct @@ -171,22 +171,20 @@ fun AccountScreen( val clipboardManager = LocalClipboardManager.current val snackbarHostState = remember { SnackbarHostState() } val copyTextString = stringResource(id = R.string.copied_mullvad_account_number) - LaunchedEffect(Unit) { - uiSideEffect.collect { uiSideEffect -> - when (uiSideEffect) { - AccountViewModel.UiSideEffect.NavigateToLogin -> navigateToLogin() - is AccountViewModel.UiSideEffect.OpenAccountManagementPageInBrowser -> - context.openAccountPageInBrowser(uiSideEffect.token) - is AccountViewModel.UiSideEffect.CopyAccountNumber -> - launch { - clipboardManager.setText(AnnotatedString(uiSideEffect.accountNumber)) + LaunchedEffectCollect(uiSideEffect) { sideEffect -> + when (sideEffect) { + AccountViewModel.UiSideEffect.NavigateToLogin -> navigateToLogin() + is AccountViewModel.UiSideEffect.OpenAccountManagementPageInBrowser -> + context.openAccountPageInBrowser(sideEffect.token) + is AccountViewModel.UiSideEffect.CopyAccountNumber -> + launch { + clipboardManager.setText(AnnotatedString(sideEffect.accountNumber)) - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { - snackbarHostState.currentSnackbarData?.dismiss() - snackbarHostState.showSnackbar(message = copyTextString) - } + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { + snackbarHostState.currentSnackbarData?.dismiss() + snackbarHostState.showSnackbar(message = copyTextString) } - } + } } } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ConnectScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ConnectScreen.kt index 89cdab4be5..fc13e053b8 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ConnectScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ConnectScreen.kt @@ -38,8 +38,8 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview -import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.Lifecycle +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.navigation.popUpTo 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 2d5baef6bd..f5167bad54 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 @@ -9,7 +9,6 @@ import androidx.compose.foundation.layout.size import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -32,6 +31,7 @@ import net.mullvad.mullvadvpn.compose.component.ScaffoldWithTopBar import net.mullvad.mullvadvpn.compose.destinations.LoginDestination import net.mullvad.mullvadvpn.compose.destinations.SettingsDestination import net.mullvad.mullvadvpn.compose.state.DeviceRevokedUiState +import net.mullvad.mullvadvpn.compose.util.LaunchedEffectCollect import net.mullvad.mullvadvpn.lib.theme.AppTheme import net.mullvad.mullvadvpn.lib.theme.Dimens import net.mullvad.mullvadvpn.viewmodel.DeviceRevokedSideEffect @@ -51,16 +51,13 @@ fun DeviceRevoked(navigator: DestinationsNavigator) { val state by viewModel.uiState.collectAsStateWithLifecycle() - LaunchedEffect(Unit) { - viewModel.uiSideEffect.collect { sideEffect -> - when (sideEffect) { - DeviceRevokedSideEffect.NavigateToLogin -> { - navigator.navigate(LoginDestination()) { - launchSingleTop = true - popUpTo(NavGraphs.root) { inclusive = true } - } + LaunchedEffectCollect(viewModel.uiSideEffect) { sideEffect -> + when (sideEffect) { + DeviceRevokedSideEffect.NavigateToLogin -> + navigator.navigate(LoginDestination()) { + launchSingleTop = true + popUpTo(NavGraphs.root) { inclusive = true } } - } } } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/FilterScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/FilterScreen.kt index 000ad9a1cd..bcd42d7c0c 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/FilterScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/FilterScreen.kt @@ -15,7 +15,6 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable @@ -39,6 +38,7 @@ import net.mullvad.mullvadvpn.compose.extensions.itemWithDivider import net.mullvad.mullvadvpn.compose.extensions.itemsWithDivider import net.mullvad.mullvadvpn.compose.state.RelayFilterState import net.mullvad.mullvadvpn.compose.transitions.SlideInFromRightTransition +import net.mullvad.mullvadvpn.compose.util.LaunchedEffectCollect import net.mullvad.mullvadvpn.lib.theme.AppTheme import net.mullvad.mullvadvpn.lib.theme.Dimens import net.mullvad.mullvadvpn.model.Ownership @@ -72,11 +72,9 @@ fun FilterScreen(navigator: DestinationsNavigator) { val viewModel = koinViewModel<FilterViewModel>() val state by viewModel.uiState.collectAsStateWithLifecycle() - LaunchedEffect(Unit) { - viewModel.uiSideEffect.collect { - when (it) { - FilterScreenSideEffect.CloseScreen -> navigator.navigateUp() - } + LaunchedEffectCollect(viewModel.uiSideEffect) { + when (it) { + FilterScreenSideEffect.CloseScreen -> navigator.navigateUp() } } FilterScreen( 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 18224a44bc..f4f617ec93 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 @@ -80,7 +80,6 @@ import net.mullvad.mullvadvpn.compose.util.accountTokenVisualTransformation import net.mullvad.mullvadvpn.lib.theme.AppTheme import net.mullvad.mullvadvpn.lib.theme.Dimens import net.mullvad.mullvadvpn.lib.theme.color.AlphaTopBar -import net.mullvad.mullvadvpn.util.CollectSideEffectWithLifecycle import net.mullvad.mullvadvpn.viewmodel.LoginUiSideEffect import net.mullvad.mullvadvpn.viewmodel.LoginViewModel import org.koin.androidx.compose.koinViewModel diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/MullvadApp.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/MullvadApp.kt index 8ef535a58b..508fcf67f3 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/MullvadApp.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/MullvadApp.kt @@ -3,7 +3,6 @@ package net.mullvad.mullvadvpn.compose.screen import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect -import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.semantics.semantics @@ -14,7 +13,6 @@ import com.ramcosta.composedestinations.navigation.navigate import com.ramcosta.composedestinations.navigation.popBackStack import com.ramcosta.composedestinations.rememberNavHostEngine import com.ramcosta.composedestinations.utils.destination -import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import net.mullvad.mullvadvpn.compose.NavGraphs @@ -22,6 +20,7 @@ import net.mullvad.mullvadvpn.compose.destinations.ChangelogDestination import net.mullvad.mullvadvpn.compose.destinations.ConnectDestination import net.mullvad.mullvadvpn.compose.destinations.NoDaemonScreenDestination import net.mullvad.mullvadvpn.compose.destinations.OutOfTimeDestination +import net.mullvad.mullvadvpn.compose.util.LaunchedEffectCollect import net.mullvad.mullvadvpn.viewmodel.ChangelogViewModel import net.mullvad.mullvadvpn.viewmodel.DaemonScreenEvent import net.mullvad.mullvadvpn.viewmodel.NoDaemonViewModel @@ -50,28 +49,23 @@ fun MullvadApp() { ) // Globally handle daemon dropped connection with NoDaemonScreen - LaunchedEffect(Unit) { - serviceVm.uiSideEffect.collect { - when (it) { - DaemonScreenEvent.Show -> - navController.navigate(NoDaemonScreenDestination) { launchSingleTop = true } - DaemonScreenEvent.Remove -> - navController.popBackStack(NoDaemonScreenDestination, true) - } + LaunchedEffectCollect(serviceVm.uiSideEffect) { + when (it) { + DaemonScreenEvent.Show -> + navController.navigate(NoDaemonScreenDestination) { launchSingleTop = true } + DaemonScreenEvent.Remove -> navController.popBackStack(NoDaemonScreenDestination, true) } } // Globally show the changelog val changeLogsViewModel = koinViewModel<ChangelogViewModel>() - LaunchedEffect(Unit) { - changeLogsViewModel.uiSideEffect.collect { + LaunchedEffectCollect(changeLogsViewModel.uiSideEffect) { - // Wait until we are in an acceptable destination - navController.currentBackStackEntryFlow - .map { it.destination() } - .first { it in changeLogDestinations } + // Wait until we are in an acceptable destination + navController.currentBackStackEntryFlow + .map { it.destination() } + .first { it in changeLogDestinations } - navController.navigate(ChangelogDestination(it).route) - } + navController.navigate(ChangelogDestination(it).route) } } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/PrivacyDisclaimerScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/PrivacyDisclaimerScreen.kt index a7a7f3bce6..8173359e45 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/PrivacyDisclaimerScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/PrivacyDisclaimerScreen.kt @@ -17,9 +17,7 @@ import androidx.compose.foundation.verticalScroll import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -48,6 +46,7 @@ import net.mullvad.mullvadvpn.compose.component.ScaffoldWithTopBar import net.mullvad.mullvadvpn.compose.component.drawVerticalScrollbar import net.mullvad.mullvadvpn.compose.destinations.LoginDestination import net.mullvad.mullvadvpn.compose.destinations.SplashDestination +import net.mullvad.mullvadvpn.compose.util.LaunchedEffectCollect import net.mullvad.mullvadvpn.compose.util.toDp import net.mullvad.mullvadvpn.constant.DAEMON_READY_TIMEOUT_MS import net.mullvad.mullvadvpn.lib.theme.AppTheme @@ -74,36 +73,30 @@ fun PrivacyDisclaimer( val state by viewModel.uiState.collectAsStateWithLifecycle() val context = LocalContext.current - val scope = rememberCoroutineScope() - LaunchedEffect(Unit) { - viewModel.uiSideEffect.collect { - when (it) { - PrivacyDisclaimerUiSideEffect.NavigateToLogin -> { - navigator.navigate(LoginDestination(null)) { - launchSingleTop = true - popUpTo(NavGraphs.root) { inclusive = true } - } + LaunchedEffectCollect(viewModel.uiSideEffect) { + when (it) { + PrivacyDisclaimerUiSideEffect.NavigateToLogin -> + navigator.navigate(LoginDestination(null)) { + launchSingleTop = true + popUpTo(NavGraphs.root) { inclusive = true } } - PrivacyDisclaimerUiSideEffect.StartService -> { - scope.launch { - try { - withTimeout(DAEMON_READY_TIMEOUT_MS) { - (context as MainActivity).startServiceSuspend() - } - viewModel.onServiceStartedSuccessful() - } catch (e: CancellationException) { - // Timeout - viewModel.onServiceStartedTimeout() + PrivacyDisclaimerUiSideEffect.StartService -> + launch { + try { + withTimeout(DAEMON_READY_TIMEOUT_MS) { + (context as MainActivity).startServiceSuspend() } + viewModel.onServiceStartedSuccessful() + } catch (e: CancellationException) { + // Timeout + viewModel.onServiceStartedTimeout() } } - PrivacyDisclaimerUiSideEffect.NavigateToSplash -> { - navigator.navigate(SplashDestination) { - launchSingleTop = true - popUpTo(NavGraphs.root) { inclusive = true } - } + PrivacyDisclaimerUiSideEffect.NavigateToSplash -> + navigator.navigate(SplashDestination) { + launchSingleTop = true + popUpTo(NavGraphs.root) { inclusive = true } } - } } } PrivacyDisclaimerScreen(state, {}, viewModel::setPrivacyDisclosureAccepted) diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ReportProblemScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ReportProblemScreen.kt index 6e72d26bcc..c46eb93894 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ReportProblemScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ReportProblemScreen.kt @@ -14,7 +14,6 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextField import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment @@ -42,6 +41,7 @@ import net.mullvad.mullvadvpn.compose.destinations.ReportProblemNoEmailDialogDes import net.mullvad.mullvadvpn.compose.destinations.ViewLogsDestination import net.mullvad.mullvadvpn.compose.textfield.mullvadWhiteTextFieldColors import net.mullvad.mullvadvpn.compose.transitions.SlideInFromRightTransition +import net.mullvad.mullvadvpn.compose.util.LaunchedEffectCollect import net.mullvad.mullvadvpn.compose.util.SecureScreenWhileInView import net.mullvad.mullvadvpn.dataproxy.SendProblemReportResult import net.mullvad.mullvadvpn.lib.theme.AppTheme @@ -102,13 +102,10 @@ fun ReportProblem( val vm = koinViewModel<ReportProblemViewModel>() val state by vm.uiState.collectAsStateWithLifecycle() - LaunchedEffect(Unit) { - vm.uiSideEffect.collect { - when (it) { - is ReportProblemSideEffect.ShowConfirmNoEmail -> { - navigator.navigate(ReportProblemNoEmailDialogDestination) - } - } + LaunchedEffectCollect(vm.uiSideEffect) { + when (it) { + is ReportProblemSideEffect.ShowConfirmNoEmail -> + navigator.navigate(ReportProblemNoEmailDialogDestination) } } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SelectLocationScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SelectLocationScreen.kt index 49a714b32d..1f17da8bc5 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SelectLocationScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SelectLocationScreen.kt @@ -51,6 +51,7 @@ import net.mullvad.mullvadvpn.compose.state.SelectLocationUiState import net.mullvad.mullvadvpn.compose.test.CIRCULAR_PROGRESS_INDICATOR import net.mullvad.mullvadvpn.compose.textfield.SearchTextField import net.mullvad.mullvadvpn.compose.transitions.SelectLocationTransition +import net.mullvad.mullvadvpn.compose.util.LaunchedEffectCollect import net.mullvad.mullvadvpn.lib.theme.AppTheme import net.mullvad.mullvadvpn.lib.theme.Dimens import net.mullvad.mullvadvpn.lib.theme.color.AlphaScrollbar @@ -86,11 +87,9 @@ private fun PreviewSelectLocationScreen() { fun SelectLocation(navigator: DestinationsNavigator) { val vm = koinViewModel<SelectLocationViewModel>() val state by vm.uiState.collectAsStateWithLifecycle() - LaunchedEffect(Unit) { - vm.uiSideEffect.collect { - when (it) { - SelectLocationSideEffect.CloseScreen -> navigator.navigateUp() - } + LaunchedEffectCollect(vm.uiSideEffect) { + when (it) { + SelectLocationSideEffect.CloseScreen -> navigator.navigateUp() } } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt index 6928e8fb43..0530cfb4ae 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt @@ -12,7 +12,6 @@ import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -75,6 +74,7 @@ import net.mullvad.mullvadvpn.compose.test.LAZY_LIST_WIREGUARD_CUSTOM_PORT_NUMBE import net.mullvad.mullvadvpn.compose.test.LAZY_LIST_WIREGUARD_CUSTOM_PORT_TEXT_TEST_TAG import net.mullvad.mullvadvpn.compose.test.LAZY_LIST_WIREGUARD_PORT_ITEM_X_TEST_TAG import net.mullvad.mullvadvpn.compose.transitions.SlideInFromRightTransition +import net.mullvad.mullvadvpn.compose.util.LaunchedEffectCollect import net.mullvad.mullvadvpn.constant.WIREGUARD_PRESET_PORTS import net.mullvad.mullvadvpn.lib.theme.AppTheme import net.mullvad.mullvadvpn.lib.theme.Dimens @@ -158,17 +158,15 @@ fun VpnSettings( } val snackbarHostState = remember { SnackbarHostState() } - LaunchedEffect(Unit) { - vm.uiSideEffect.collect { - when (it) { - is VpnSettingsSideEffect.ShowToast -> - launch { - snackbarHostState.currentSnackbarData?.dismiss() - snackbarHostState.showSnackbar(message = it.message) - } - VpnSettingsSideEffect.NavigateToDnsDialog -> - navigator.navigate(DnsDialogDestination(null, null)) { launchSingleTop = true } - } + LaunchedEffectCollect(vm.uiSideEffect) { + when (it) { + is VpnSettingsSideEffect.ShowToast -> + launch { + snackbarHostState.currentSnackbarData?.dismiss() + snackbarHostState.showSnackbar(message = it.message) + } + VpnSettingsSideEffect.NavigateToDnsDialog -> + navigator.navigate(DnsDialogDestination(null, null)) { launchSingleTop = true } } } |
