summaryrefslogtreecommitdiffhomepage
path: root/android/app
diff options
context:
space:
mode:
authorDavid Göransson <david.goransson90@gmail.com>2024-03-06 10:35:36 +0100
committerDavid Göransson <david.goransson@mullvad.net>2024-03-11 15:56:57 +0100
commit5560072b52fd1fc883ce3864328c5751ac778528 (patch)
tree4a18d51238db8bd7157164071ec10fca5f08ac40 /android/app
parent70d54089f8958cd2002fdc4b320c966ffdcdd5e6 (diff)
downloadmullvadvpn-5560072b52fd1fc883ce3864328c5751ac778528.tar.xz
mullvadvpn-5560072b52fd1fc883ce3864328c5751ac778528.zip
Simplify side effect collection with LaunchedEffectCollect
Diffstat (limited to 'android/app')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DnsDialog.kt10
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/MtuDialog.kt10
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/payment/PaymentDialog.kt11
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt28
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ConnectScreen.kt2
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/DeviceRevokedScreen.kt17
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/FilterScreen.kt10
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/LoginScreen.kt1
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/MullvadApp.kt30
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/PrivacyDisclaimerScreen.kt47
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ReportProblemScreen.kt13
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SelectLocationScreen.kt9
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt22
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 }
}
}