summaryrefslogtreecommitdiffhomepage
path: root/android/app
diff options
context:
space:
mode:
authorDavid Göransson <david.goransson@mullvad.net>2024-06-14 16:18:44 +0200
committerAlbin <albin@mullvad.net>2024-06-17 11:01:31 +0200
commit81761886c557b72098cde5906a4847f3fcd8171d (patch)
tree04d94b1f78d655fe0e131296014e7046a03e94c5 /android/app
parent71e0d1051d24ac45fbd6d47e3316d090a0f2d6f6 (diff)
downloadmullvadvpn-81761886c557b72098cde5906a4847f3fcd8171d.tar.xz
mullvadvpn-81761886c557b72098cde5906a4847f3fcd8171d.zip
Use dropUnlessResumed to prevent duplicate navigation
Diffstat (limited to 'android/app')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ContentBlockersInfoDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/CreateCustomListDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/CustomDnsInfoDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeleteCustomListConfirmationDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeviceNameInfoDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DiscardChangesDialog.kt7
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DnsDialog.kt4
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/EditCustomListNameDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/LocalNetworkSharingInfoDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/MalwareInfoDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/MtuDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ObfuscationInfoDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/QuantumResistanceInfoDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RemoveDeviceConfirmationDialog.kt7
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ReportProblemNoEmailDialog.kt7
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ResetServerIpOverridesConfirmationDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ServerIpOverridesInfoDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/UdpOverTcpPortInfoDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/WireguardPortInfoDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/payment/VerificationPendingDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt19
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AutoConnectAndLockdownModeScreen.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ConnectScreen.kt17
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/CustomListLocationsScreen.kt14
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/CustomListsScreen.kt23
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/DeviceListScreen.kt22
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/DeviceRevokedScreen.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/EditCustomListScreen.kt24
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/FilterScreen.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ImportOverridesByTextScreen.kt5
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/LoginScreen.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/NoDaemonScreen.kt3
-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/ReportProblemScreen.kt10
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SelectLocationScreen.kt28
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ServerIpOverridesScreen.kt19
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SettingsScreen.kt21
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreen.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ViewLogsScreen.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt63
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/WelcomeScreen.kt23
41 files changed, 203 insertions, 192 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ContentBlockersInfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ContentBlockersInfoDialog.kt
index 145208ce16..09e3d0fa6b 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ContentBlockersInfoDialog.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ContentBlockersInfoDialog.kt
@@ -2,6 +2,7 @@ package net.mullvad.mullvadvpn.compose.dialog
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.spec.DestinationStyle
@@ -24,6 +25,6 @@ fun ContentBlockersInfoDialog(navigator: DestinationsNavigator) {
stringResource(id = R.string.settings_changes_effect_warning_content_blocker)
)
},
- onDismiss = navigator::navigateUp
+ onDismiss = dropUnlessResumed { navigator.navigateUp() }
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/CreateCustomListDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/CreateCustomListDialog.kt
index 90e82e1fbf..d6eb004322 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/CreateCustomListDialog.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/CreateCustomListDialog.kt
@@ -14,6 +14,7 @@ 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.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.result.ResultBackNavigator
@@ -86,7 +87,7 @@ fun CreateCustomList(
state = state,
createCustomList = vm::createCustomList,
onInputChanged = vm::clearError,
- onDismiss = backNavigator::navigateBack
+ onDismiss = dropUnlessResumed { backNavigator.navigateBack() }
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/CustomDnsInfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/CustomDnsInfoDialog.kt
index f58768d0c6..c692b27305 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/CustomDnsInfoDialog.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/CustomDnsInfoDialog.kt
@@ -3,6 +3,7 @@ package net.mullvad.mullvadvpn.compose.dialog
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator
@@ -20,6 +21,6 @@ private fun PreviewCustomDnsInfoDialog() {
fun CustomDnsInfoDialog(navigator: DestinationsNavigator) {
InfoDialog(
message = stringResource(id = R.string.settings_changes_effect_warning_content_blocker),
- onDismiss = navigator::navigateUp
+ onDismiss = dropUnlessResumed { navigator.navigateUp() }
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeleteCustomListConfirmationDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeleteCustomListConfirmationDialog.kt
index b6e56ec637..4990296281 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeleteCustomListConfirmationDialog.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeleteCustomListConfirmationDialog.kt
@@ -4,6 +4,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.result.ResultBackNavigator
import com.ramcosta.composedestinations.spec.DestinationStyle
@@ -52,7 +53,7 @@ fun DeleteCustomList(
state = state.value,
name = name,
onDelete = viewModel::deleteCustomList,
- onBack = navigator::navigateBack
+ onBack = dropUnlessResumed { navigator.navigateBack() }
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeviceNameInfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeviceNameInfoDialog.kt
index 0e1c315959..258af7e44a 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeviceNameInfoDialog.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeviceNameInfoDialog.kt
@@ -2,6 +2,7 @@ package net.mullvad.mullvadvpn.compose.dialog
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.spec.DestinationStyle
@@ -19,6 +20,6 @@ fun DeviceNameInfoDialog(navigator: DestinationsNavigator) {
appendLine()
append(stringResource(id = R.string.device_name_info_third_paragraph))
},
- onDismiss = navigator::navigateUp
+ onDismiss = dropUnlessResumed { navigator.navigateUp() }
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DiscardChangesDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DiscardChangesDialog.kt
index 06f2df0003..adac4935bb 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DiscardChangesDialog.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DiscardChangesDialog.kt
@@ -8,6 +8,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.res.stringResource
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.result.ResultBackNavigator
import com.ramcosta.composedestinations.spec.DestinationStyle
@@ -18,18 +19,18 @@ import net.mullvad.mullvadvpn.compose.button.PrimaryButton
@Composable
fun DiscardChangesDialog(resultBackNavigator: ResultBackNavigator<Boolean>) {
AlertDialog(
- onDismissRequest = resultBackNavigator::navigateBack,
+ onDismissRequest = dropUnlessResumed { resultBackNavigator.navigateBack() },
title = { Text(text = stringResource(id = R.string.discard_changes)) },
dismissButton = {
PrimaryButton(
modifier = Modifier.focusRequester(FocusRequester()),
- onClick = resultBackNavigator::navigateBack,
+ onClick = dropUnlessResumed { resultBackNavigator.navigateBack() },
text = stringResource(id = R.string.cancel)
)
},
confirmButton = {
PrimaryButton(
- onClick = { resultBackNavigator.navigateBack(result = true) },
+ onClick = dropUnlessResumed { resultBackNavigator.navigateBack(result = true) },
text = stringResource(id = R.string.discard)
)
},
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 30f1c71486..be0a6eb38d 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
@@ -14,6 +14,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.result.ResultBackNavigator
import com.ramcosta.composedestinations.spec.DestinationStyle
@@ -75,7 +76,8 @@ fun DnsDialog(
viewModel::onDnsInputChange,
onSaveDnsClick = viewModel::onSaveDnsClick,
onRemoveDnsClick = viewModel::onRemoveDnsClick,
- onDismiss = { resultNavigator.navigateBack(result = DnsDialogResult.Cancel) }
+ onDismiss =
+ dropUnlessResumed { resultNavigator.navigateBack(result = DnsDialogResult.Cancel) }
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/EditCustomListNameDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/EditCustomListNameDialog.kt
index c01ceab7f8..3b333cd877 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/EditCustomListNameDialog.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/EditCustomListNameDialog.kt
@@ -13,6 +13,7 @@ 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.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.result.ResultBackNavigator
import com.ramcosta.composedestinations.spec.DestinationStyle
@@ -63,7 +64,7 @@ fun EditCustomListName(
state = state,
updateName = vm::updateCustomListName,
onInputChanged = vm::clearError,
- onDismiss = backNavigator::navigateBack
+ onDismiss = dropUnlessResumed { backNavigator.navigateBack() }
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/LocalNetworkSharingInfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/LocalNetworkSharingInfoDialog.kt
index ebe46b6050..e67796d37e 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/LocalNetworkSharingInfoDialog.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/LocalNetworkSharingInfoDialog.kt
@@ -3,6 +3,7 @@ package net.mullvad.mullvadvpn.compose.dialog
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator
@@ -26,6 +27,6 @@ fun LocalNetworkSharingInfoDialog(navigator: DestinationsNavigator) {
appendLine(stringResource(id = R.string.local_network_sharing_additional_info))
appendLine(textResource(id = R.string.local_network_sharing_ip_ranges))
},
- onDismiss = navigator::navigateUp
+ onDismiss = dropUnlessResumed { navigator.navigateUp() }
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/MalwareInfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/MalwareInfoDialog.kt
index 1f627be040..a00d75b53e 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/MalwareInfoDialog.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/MalwareInfoDialog.kt
@@ -3,6 +3,7 @@ package net.mullvad.mullvadvpn.compose.dialog
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator
@@ -20,6 +21,6 @@ private fun PreviewMalwareInfoDialog() {
fun MalwareInfoDialog(navigator: DestinationsNavigator) {
InfoDialog(
message = stringResource(id = R.string.malware_info),
- onDismiss = navigator::navigateUp
+ onDismiss = dropUnlessResumed { navigator.navigateUp() }
)
}
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 c9276c5c09..24020db23d 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
@@ -13,6 +13,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.result.EmptyResultBackNavigator
import com.ramcosta.composedestinations.result.ResultBackNavigator
@@ -57,7 +58,7 @@ fun MtuDialog(mtuInitial: Mtu?, navigator: ResultBackNavigator<Boolean>) {
onInputChanged = viewModel::onInputChanged,
onSaveMtu = viewModel::onSaveClick,
onResetMtu = viewModel::onRestoreClick,
- onDismiss = { navigator.navigateBack(true) }
+ onDismiss = dropUnlessResumed { navigator.navigateBack() }
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ObfuscationInfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ObfuscationInfoDialog.kt
index cf4db26e2e..e6e3edd3ac 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ObfuscationInfoDialog.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ObfuscationInfoDialog.kt
@@ -3,6 +3,7 @@ package net.mullvad.mullvadvpn.compose.dialog
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator
@@ -20,6 +21,6 @@ private fun PreviewObfuscationInfoDialog() {
fun ObfuscationInfoDialog(navigator: DestinationsNavigator) {
InfoDialog(
message = stringResource(id = R.string.obfuscation_info),
- onDismiss = navigator::navigateUp
+ onDismiss = dropUnlessResumed { navigator.navigateUp() }
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/QuantumResistanceInfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/QuantumResistanceInfoDialog.kt
index e7773ed0a3..47ea8badfc 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/QuantumResistanceInfoDialog.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/QuantumResistanceInfoDialog.kt
@@ -3,6 +3,7 @@ package net.mullvad.mullvadvpn.compose.dialog
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator
@@ -21,6 +22,6 @@ fun QuantumResistanceInfoDialog(navigator: DestinationsNavigator) {
InfoDialog(
message = stringResource(id = R.string.quantum_resistant_info_first_paragaph),
additionalInfo = stringResource(id = R.string.quantum_resistant_info_second_paragaph),
- onDismiss = navigator::navigateUp
+ onDismiss = dropUnlessResumed { navigator.navigateUp() }
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RemoveDeviceConfirmationDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RemoveDeviceConfirmationDialog.kt
index b8592c1acb..863b90e82a 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RemoveDeviceConfirmationDialog.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RemoveDeviceConfirmationDialog.kt
@@ -15,6 +15,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.sp
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.result.EmptyResultBackNavigator
import com.ramcosta.composedestinations.result.ResultBackNavigator
@@ -42,7 +43,7 @@ private fun PreviewRemoveDeviceConfirmationDialog(
@Composable
fun RemoveDeviceConfirmationDialog(navigator: ResultBackNavigator<DeviceId>, device: Device) {
AlertDialog(
- onDismissRequest = navigator::navigateBack,
+ onDismissRequest = dropUnlessResumed { navigator.navigateBack() },
icon = {
Icon(
modifier = Modifier.fillMaxWidth().height(Dimens.dialogIconHeight),
@@ -62,14 +63,14 @@ fun RemoveDeviceConfirmationDialog(navigator: ResultBackNavigator<DeviceId>, dev
},
dismissButton = {
NegativeButton(
- onClick = { navigator.navigateBack(result = device.id) },
+ onClick = dropUnlessResumed { navigator.navigateBack(result = device.id) },
text = stringResource(id = R.string.confirm_removal)
)
},
confirmButton = {
PrimaryButton(
modifier = Modifier.focusRequester(FocusRequester()),
- onClick = { navigator.navigateBack() },
+ onClick = dropUnlessResumed { navigator.navigateBack() },
text = stringResource(id = R.string.back)
)
},
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ReportProblemNoEmailDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ReportProblemNoEmailDialog.kt
index f053cd74f6..b015d7c5b7 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ReportProblemNoEmailDialog.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ReportProblemNoEmailDialog.kt
@@ -12,6 +12,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.result.EmptyResultBackNavigator
import com.ramcosta.composedestinations.result.ResultBackNavigator
@@ -32,7 +33,7 @@ private fun PreviewReportProblemNoEmailDialog() {
@Composable
fun ReportProblemNoEmailDialog(resultBackNavigator: ResultBackNavigator<Boolean>) {
AlertDialog(
- onDismissRequest = resultBackNavigator::navigateBack,
+ onDismissRequest = dropUnlessResumed { resultBackNavigator.navigateBack() },
icon = {
Icon(
painter = painterResource(id = R.drawable.icon_alert),
@@ -52,14 +53,14 @@ fun ReportProblemNoEmailDialog(resultBackNavigator: ResultBackNavigator<Boolean>
dismissButton = {
NegativeButton(
modifier = Modifier.fillMaxWidth(),
- onClick = { resultBackNavigator.navigateBack(result = true) },
+ onClick = dropUnlessResumed { resultBackNavigator.navigateBack(result = true) },
text = stringResource(id = R.string.send_anyway)
)
},
confirmButton = {
PrimaryButton(
modifier = Modifier.fillMaxWidth(),
- onClick = resultBackNavigator::navigateBack,
+ onClick = dropUnlessResumed { resultBackNavigator.navigateBack() },
text = stringResource(id = R.string.back)
)
},
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ResetServerIpOverridesConfirmationDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ResetServerIpOverridesConfirmationDialog.kt
index 46111ebf8c..727ffeaaa2 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ResetServerIpOverridesConfirmationDialog.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ResetServerIpOverridesConfirmationDialog.kt
@@ -9,6 +9,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.result.ResultBackNavigator
import com.ramcosta.composedestinations.spec.DestinationStyle
@@ -43,7 +44,7 @@ fun ResetServerIpOverridesConfirmation(resultBackNavigator: ResultBackNavigator<
}
ResetServerIpOverridesConfirmationDialog(
onClearAllOverrides = vm::clearAllOverrides,
- resultBackNavigator::navigateBack
+ dropUnlessResumed { resultBackNavigator.navigateBack() }
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ServerIpOverridesInfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ServerIpOverridesInfoDialog.kt
index 9b6054f1f0..a42e314991 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ServerIpOverridesInfoDialog.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ServerIpOverridesInfoDialog.kt
@@ -3,6 +3,7 @@ package net.mullvad.mullvadvpn.compose.dialog
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator
@@ -27,6 +28,6 @@ fun ServerIpOverridesInfoDialog(navigator: DestinationsNavigator) {
appendLine()
append(stringResource(id = R.string.server_ip_overrides_info_third_paragraph))
},
- onDismiss = navigator::navigateUp
+ onDismiss = dropUnlessResumed { navigator.navigateUp() }
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/UdpOverTcpPortInfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/UdpOverTcpPortInfoDialog.kt
index 1c5c4ccef6..22a93bb4bf 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/UdpOverTcpPortInfoDialog.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/UdpOverTcpPortInfoDialog.kt
@@ -3,6 +3,7 @@ package net.mullvad.mullvadvpn.compose.dialog
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator
@@ -21,6 +22,6 @@ private fun PreviewUdpOverTcpPortInfoDialog() {
fun UdpOverTcpPortInfoDialog(navigator: DestinationsNavigator) {
InfoDialog(
message = stringResource(id = R.string.udp_over_tcp_port_info),
- onDismiss = navigator::navigateUp
+ onDismiss = dropUnlessResumed { navigator.navigateUp() }
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/WireguardPortInfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/WireguardPortInfoDialog.kt
index 7de2e97fbb..6d497dd93e 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/WireguardPortInfoDialog.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/WireguardPortInfoDialog.kt
@@ -4,6 +4,7 @@ import android.os.Parcelable
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator
@@ -40,6 +41,6 @@ fun WireguardPortInfoDialog(
id = R.string.wireguard_port_info_port_range,
argument.portRanges.asString()
),
- onDismiss = navigator::navigateUp
+ onDismiss = dropUnlessResumed { navigator.navigateUp() }
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/payment/VerificationPendingDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/payment/VerificationPendingDialog.kt
index 7d49a133f3..81a0b25b87 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/payment/VerificationPendingDialog.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/payment/VerificationPendingDialog.kt
@@ -7,6 +7,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.compositeOver
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.spec.DestinationStyle
@@ -24,7 +25,7 @@ private fun PreviewVerificationPendingDialog() {
@Destination(style = DestinationStyle.Dialog::class)
@Composable
fun VerificationPendingDialog(navigator: DestinationsNavigator) {
- VerificationPendingDialog(onClose = navigator::navigateUp)
+ VerificationPendingDialog(onClose = dropUnlessResumed { navigator.navigateUp() })
}
@Composable
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 d78592775b..d5c9212406 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
@@ -24,6 +24,7 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.navigation.popUpTo
@@ -123,9 +124,7 @@ fun Account(
AccountScreen(
state = state,
uiSideEffect = vm.uiSideEffect,
- onRedeemVoucherClick = {
- navigator.navigate(RedeemVoucherDestination) { launchSingleTop = true }
- },
+ onRedeemVoucherClick = dropUnlessResumed { navigator.navigate(RedeemVoucherDestination) },
onManageAccountClick = vm::onManageAccountClick,
onLogoutClick = vm::onLogoutClick,
navigateToLogin = {
@@ -135,16 +134,14 @@ fun Account(
}
},
onCopyAccountNumber = vm::onCopyAccountNumber,
- onBackClick = navigator::navigateUp,
- navigateToDeviceInfo = {
- navigator.navigate(DeviceNameInfoDialogDestination) { launchSingleTop = true }
- },
+ onBackClick = dropUnlessResumed { navigator.navigateUp() },
+ navigateToDeviceInfo =
+ dropUnlessResumed { navigator.navigate(DeviceNameInfoDialogDestination) },
onPurchaseBillingProductClick = { productId ->
- navigator.navigate(PaymentDestination(productId)) { launchSingleTop = true }
+ navigator.navigate(PaymentDestination(productId), onlyIfResumed = true)
},
- navigateToVerificationPendingDialog = {
- navigator.navigate(VerificationPendingDialogDestination) { launchSingleTop = true }
- }
+ navigateToVerificationPendingDialog =
+ dropUnlessResumed { navigator.navigate(VerificationPendingDialogDestination) }
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AutoConnectAndLockdownModeScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AutoConnectAndLockdownModeScreen.kt
index 5a01e4c941..95d5ca6dcf 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AutoConnectAndLockdownModeScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AutoConnectAndLockdownModeScreen.kt
@@ -47,6 +47,7 @@ import androidx.constraintlayout.compose.ConstrainedLayoutReference
import androidx.constraintlayout.compose.ConstraintLayout
import androidx.constraintlayout.compose.ConstraintLayoutScope
import androidx.core.text.HtmlCompat
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import kotlinx.coroutines.launch
@@ -74,7 +75,7 @@ private fun PreviewAutoConnectAndLockdownModeScreen() {
@Destination(style = SlideInFromRightTransition::class)
@Composable
fun AutoConnectAndLockdownMode(navigator: DestinationsNavigator) {
- AutoConnectAndLockdownModeScreen(onBackClick = navigator::navigateUp)
+ AutoConnectAndLockdownModeScreen(onBackClick = dropUnlessResumed { navigator.navigateUp() })
}
@OptIn(ExperimentalFoundationApi::class)
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 03d6a0b01b..36b351ddee 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
@@ -45,6 +45,7 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.navigation.popUpTo
@@ -144,12 +145,12 @@ fun Connect(
openAccountPage(sideEffect.token)
}
is ConnectViewModel.UiSideEffect.OutOfTime ->
- navigator.navigate(OutOfTimeDestination, true) {
+ navigator.navigate(OutOfTimeDestination) {
launchSingleTop = true
popUpTo(NavGraphs.root) { inclusive = true }
}
ConnectViewModel.UiSideEffect.RevokedDevice ->
- navigator.navigate(DeviceRevokedDestination, true) {
+ navigator.navigate(DeviceRevokedDestination) {
launchSingleTop = true
popUpTo(NavGraphs.root) { inclusive = true }
}
@@ -176,9 +177,7 @@ fun Connect(
onReconnectClick = connectViewModel::onReconnectClick,
onConnectClick = connectViewModel::onConnectClick,
onCancelClick = connectViewModel::onCancelClick,
- onSwitchLocationClick = {
- navigator.navigate(SelectLocationDestination, true) { launchSingleTop = true }
- },
+ onSwitchLocationClick = dropUnlessResumed { navigator.navigate(SelectLocationDestination) },
onUpdateVersionClick = {
val intent =
Intent(
@@ -193,12 +192,8 @@ fun Connect(
context.startActivity(intent)
},
onManageAccountClick = connectViewModel::onManageAccountClick,
- onSettingsClick = {
- navigator.navigate(SettingsDestination, true) { launchSingleTop = true }
- },
- onAccountClick = {
- navigator.navigate(AccountDestination, true) { launchSingleTop = true }
- },
+ onSettingsClick = dropUnlessResumed { navigator.navigate(SettingsDestination) },
+ onAccountClick = dropUnlessResumed { navigator.navigate(AccountDestination) },
onDismissNewDeviceClick = connectViewModel::dismissNewDeviceNotification,
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/CustomListLocationsScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/CustomListLocationsScreen.kt
index fc5fc62c3d..bbde96b99f 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/CustomListLocationsScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/CustomListLocationsScreen.kt
@@ -26,6 +26,7 @@ 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.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.result.NavResult
@@ -115,13 +116,14 @@ fun CustomListLocations(
onSearchTermInput = customListsViewModel::onSearchTermInput,
onSaveClick = customListsViewModel::save,
onRelaySelectionClick = customListsViewModel::onRelaySelectionClick,
- onBackClick = {
- if (state.hasUnsavedChanges) {
- navigator.navigate(DiscardChangesDialogDestination) { launchSingleTop = true }
- } else {
- backNavigator.navigateBack()
+ onBackClick =
+ dropUnlessResumed {
+ if (state.hasUnsavedChanges) {
+ navigator.navigate(DiscardChangesDialogDestination)
+ } else {
+ backNavigator.navigateBack()
+ }
}
- }
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/CustomListsScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/CustomListsScreen.kt
index b039f838a2..7611cfcf6b 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/CustomListsScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/CustomListsScreen.kt
@@ -23,6 +23,7 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.result.NavResult
@@ -92,19 +93,19 @@ fun CustomLists(
CustomListsScreen(
state = state,
snackbarHostState = snackbarHostState,
- addCustomList = {
- navigator.navigate(
- CreateCustomListDestination(),
- ) {
- launchSingleTop = true
- }
- },
+ addCustomList =
+ dropUnlessResumed {
+ navigator.navigate(
+ CreateCustomListDestination(),
+ )
+ },
openCustomList = { customList ->
- navigator.navigate(EditCustomListDestination(customListId = customList.id)) {
- launchSingleTop = true
- }
+ navigator.navigate(
+ EditCustomListDestination(customListId = customList.id),
+ onlyIfResumed = true
+ )
},
- onBackClick = navigator::navigateUp
+ onBackClick = dropUnlessResumed { navigator.navigateUp() }
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/DeviceListScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/DeviceListScreen.kt
index 64414b38c0..c6d8a06d20 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/DeviceListScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/DeviceListScreen.kt
@@ -31,6 +31,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.navigation.popUpTo
@@ -146,19 +147,18 @@ fun DeviceList(
DeviceListScreen(
state = state,
snackbarHostState = snackbarHostState,
- onBackClick = navigator::navigateUp,
- onContinueWithLogin = {
- navigator.navigate(LoginDestination(accountNumber)) {
- launchSingleTop = true
- popUpTo(LoginDestination) { inclusive = true }
- }
- },
- onSettingsClicked = { navigator.navigate(SettingsDestination) { launchSingleTop = true } },
+ onBackClick = dropUnlessResumed { navigator.navigateUp() },
+ onContinueWithLogin =
+ dropUnlessResumed {
+ navigator.navigate(LoginDestination(accountNumber)) {
+ launchSingleTop = true
+ popUpTo(LoginDestination) { inclusive = true }
+ }
+ },
+ onSettingsClicked = dropUnlessResumed { navigator.navigate(SettingsDestination) },
onTryAgainClicked = viewModel::fetchDevices,
navigateToRemoveDeviceConfirmationDialog = {
- navigator.navigate(RemoveDeviceConfirmationDialogDestination(it)) {
- launchSingleTop = true
- }
+ navigator.navigate(RemoveDeviceConfirmationDialogDestination(it), onlyIfResumed = true)
}
)
}
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 f5167bad54..ac43424383 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
@@ -21,6 +21,7 @@ import androidx.compose.ui.unit.sp
import androidx.constraintlayout.compose.ConstraintLayout
import androidx.constraintlayout.compose.Dimension
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.navigation.popUpTo
@@ -63,7 +64,7 @@ fun DeviceRevoked(navigator: DestinationsNavigator) {
DeviceRevokedScreen(
state = state,
- onSettingsClicked = { navigator.navigate(SettingsDestination) { launchSingleTop = true } },
+ onSettingsClicked = dropUnlessResumed { navigator.navigate(SettingsDestination) },
onGoToLoginClicked = viewModel::onGoToLoginClicked
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/EditCustomListScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/EditCustomListScreen.kt
index ed0285eaf1..779fd06b41 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/EditCustomListScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/EditCustomListScreen.kt
@@ -21,6 +21,7 @@ import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.result.NavResult
@@ -100,24 +101,23 @@ fun EditCustomList(
state = state,
onDeleteList = { name ->
navigator.navigate(
- DeleteCustomListDestination(customListId = customListId, name = name)
- ) {
- launchSingleTop = true
- }
+ DeleteCustomListDestination(customListId = customListId, name = name),
+ onlyIfResumed = true
+ )
},
onNameClicked = { id, name ->
navigator.navigate(
- EditCustomListNameDestination(customListId = id, initialName = name)
- ) {
- launchSingleTop = true
- }
+ EditCustomListNameDestination(customListId = id, initialName = name),
+ onlyIfResumed = true
+ )
},
onLocationsClicked = {
- navigator.navigate(CustomListLocationsDestination(customListId = it, newList = false)) {
- launchSingleTop = true
- }
+ navigator.navigate(
+ CustomListLocationsDestination(customListId = it, newList = false),
+ onlyIfResumed = true
+ )
},
- onBackClick = backNavigator::navigateBack
+ onBackClick = dropUnlessResumed { backNavigator.navigateBack() }
)
}
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 f58b28eaca..4458f8b588 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
@@ -27,6 +27,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import net.mullvad.mullvadvpn.R
@@ -79,7 +80,7 @@ fun FilterScreen(navigator: DestinationsNavigator) {
}
FilterScreen(
state = state,
- onBackClick = navigator::navigateUp,
+ onBackClick = dropUnlessResumed { navigator.navigateUp() },
onApplyClick = viewModel::onApplyButtonClicked,
onSelectedOwnership = viewModel::setSelectedOwnership,
onAllProviderCheckChange = viewModel::setAllProviders,
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ImportOverridesByTextScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ImportOverridesByTextScreen.kt
index 7ab063703c..9e2813f59d 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ImportOverridesByTextScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ImportOverridesByTextScreen.kt
@@ -21,6 +21,7 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.result.ResultBackNavigator
import net.mullvad.mullvadvpn.R
@@ -40,7 +41,7 @@ fun ImportOverridesByText(
resultNavigator: ResultBackNavigator<String>,
) {
ImportOverridesByTextScreen(
- onNavigateBack = resultNavigator::navigateBack,
+ onNavigateBack = dropUnlessResumed { resultNavigator.navigateBack() },
onImportClicked = { resultNavigator.navigateBack(result = it) }
)
}
@@ -67,7 +68,7 @@ fun ImportOverridesByTextScreen(
colors =
ButtonDefaults.textButtonColors()
.copy(contentColor = MaterialTheme.colorScheme.onPrimary),
- onClick = { onImportClicked(text) }
+ onClick = dropUnlessResumed { onImportClicked(text) }
) {
Text(
text = stringResource(R.string.import_overrides_import),
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 b004314f4f..80c30f6400 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
@@ -47,6 +47,7 @@ import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.navigation.popUpTo
@@ -156,7 +157,7 @@ fun Login(
vm::createAccount,
vm::clearAccountHistory,
vm::onAccountNumberChange,
- { navigator.navigate(SettingsDestination) }
+ dropUnlessResumed { navigator.navigate(SettingsDestination) }
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/NoDaemonScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/NoDaemonScreen.kt
index af47b37fc2..82ae16a208 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/NoDaemonScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/NoDaemonScreen.kt
@@ -22,6 +22,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.core.app.ActivityCompat.finishAffinity
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import net.mullvad.mullvadvpn.R
@@ -43,7 +44,7 @@ private fun PreviewNoDaemonScreen() {
@Destination(style = DefaultTransition::class)
@Composable
fun NoDaemonScreen(navigator: DestinationsNavigator) {
- NoDaemonScreen { navigator.navigate(SettingsDestination) }
+ NoDaemonScreen(dropUnlessResumed { navigator.navigate(SettingsDestination) })
}
@Composable
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 d557558a60..22ab725e7f 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
@@ -23,6 +23,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.navigation.popUpTo
@@ -151,17 +152,15 @@ fun OutOfTime(
OutOfTimeScreen(
state = state,
onSitePaymentClick = vm::onSitePaymentClick,
- onRedeemVoucherClick = {
- navigator.navigate(RedeemVoucherDestination) { launchSingleTop = true }
- },
- onSettingsClick = { navigator.navigate(SettingsDestination) { launchSingleTop = true } },
- onAccountClick = { navigator.navigate(AccountDestination) { launchSingleTop = true } },
+ onRedeemVoucherClick = dropUnlessResumed { navigator.navigate(RedeemVoucherDestination) },
+ onSettingsClick = dropUnlessResumed { navigator.navigate(SettingsDestination) },
+ onAccountClick = dropUnlessResumed { navigator.navigate(AccountDestination) },
onDisconnectClick = vm::onDisconnectClick,
onPurchaseBillingProductClick = { productId ->
- navigator.navigate(PaymentDestination(productId)) { launchSingleTop = true }
+ navigator.navigate(PaymentDestination(productId), onlyIfResumed = true)
},
navigateToVerificationPendingDialog = {
- navigator.navigate(VerificationPendingDialogDestination) { launchSingleTop = true }
+ navigator.navigate(VerificationPendingDialogDestination, onlyIfResumed = true)
}
)
}
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 c46eb93894..a464a573f7 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
@@ -27,6 +27,7 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.withStyle
import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.result.NavResult
@@ -120,12 +121,13 @@ fun ReportProblem(
state,
onSendReport = { vm.sendReport(state.email, state.description) },
onClearSendResult = vm::clearSendResult,
- onNavigateToViewLogs = {
- navigator.navigate(ViewLogsDestination()) { launchSingleTop = true }
- },
+ onNavigateToViewLogs =
+ dropUnlessResumed {
+ navigator.navigate(ViewLogsDestination()) { launchSingleTop = true }
+ },
onEmailChanged = vm::updateEmail,
onDescriptionChanged = vm::updateDescription,
- onBackClick = navigator::navigateUp,
+ onBackClick = dropUnlessResumed { navigator.navigateUp() },
)
}
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 7d861ea717..b10a41a070 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
@@ -46,6 +46,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.result.NavResult
@@ -151,7 +152,7 @@ fun SelectLocation(
LaunchedEffectCollect(vm.uiSideEffect) {
when (it) {
- SelectLocationSideEffect.CloseScreen -> backNavigator.navigateBack(result = true, true)
+ SelectLocationSideEffect.CloseScreen -> backNavigator.navigateBack(result = true)
is SelectLocationSideEffect.LocationAddedToCustomList ->
launch {
snackbarHostState.showResultSnackbar(
@@ -200,31 +201,38 @@ fun SelectLocation(
snackbarHostState = snackbarHostState,
onSelectRelay = vm::selectRelay,
onSearchTermInput = vm::onSearchTermInput,
- onBackClick = { backNavigator.navigateBack(true) },
- onFilterClick = { navigator.navigate(FilterScreenDestination, true) },
+ onBackClick = dropUnlessResumed { backNavigator.navigateBack() },
+ onFilterClick = dropUnlessResumed { navigator.navigate(FilterScreenDestination) },
onCreateCustomList = { relayItem ->
- navigator.navigate(CreateCustomListDestination(locationCode = relayItem?.id)) {
- launchSingleTop = true
- }
+ navigator.navigate(
+ CreateCustomListDestination(locationCode = relayItem?.id),
+ onlyIfResumed = true
+ )
},
- onEditCustomLists = { navigator.navigate(CustomListsDestination()) },
+ onEditCustomLists = dropUnlessResumed { navigator.navigate(CustomListsDestination()) },
removeOwnershipFilter = vm::removeOwnerFilter,
removeProviderFilter = vm::removeProviderFilter,
onAddLocationToList = vm::addLocationToList,
onRemoveLocationFromList = vm::removeLocationFromList,
onEditCustomListName = {
navigator.navigate(
- EditCustomListNameDestination(customListId = it.id, initialName = it.customListName)
+ EditCustomListNameDestination(
+ customListId = it.id,
+ initialName = it.customListName
+ ),
+ onlyIfResumed = true
)
},
onEditLocationsCustomList = {
navigator.navigate(
- CustomListLocationsDestination(customListId = it.id, newList = false)
+ CustomListLocationsDestination(customListId = it.id, newList = false),
+ onlyIfResumed = true
)
},
onDeleteCustomList = {
navigator.navigate(
- DeleteCustomListDestination(customListId = it.id, name = it.customListName)
+ DeleteCustomListDestination(customListId = it.id, name = it.customListName),
+ onlyIfResumed = true
)
}
)
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ServerIpOverridesScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ServerIpOverridesScreen.kt
index 7f9542f22a..5a7c9be2a6 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ServerIpOverridesScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ServerIpOverridesScreen.kt
@@ -40,6 +40,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.result.ResultRecipient
@@ -143,17 +144,13 @@ fun ServerIpOverrides(
ServerIpOverridesScreen(
state,
- onBackClick = navigator::navigateUp,
- onInfoClick = {
- navigator.navigate(ServerIpOverridesInfoDialogDestination, onlyIfResumed = true)
- },
- onResetOverridesClick = {
- navigator.navigate(ResetServerIpOverridesConfirmationDestination, onlyIfResumed = true)
- },
- onImportByFile = { openFileLauncher.launch("application/json") },
- onImportByText = {
- navigator.navigate(ImportOverridesByTextDestination, onlyIfResumed = true)
- },
+ onBackClick = dropUnlessResumed { navigator.navigateUp() },
+ onInfoClick =
+ dropUnlessResumed { navigator.navigate(ServerIpOverridesInfoDialogDestination) },
+ onResetOverridesClick =
+ dropUnlessResumed { navigator.navigate(ResetServerIpOverridesConfirmationDestination) },
+ onImportByFile = dropUnlessResumed { openFileLauncher.launch("application/json") },
+ onImportByText = dropUnlessResumed { navigator.navigate(ImportOverridesByTextDestination) },
snackbarHostState
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SettingsScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SettingsScreen.kt
index cb84246e34..702c1ca030 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SettingsScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SettingsScreen.kt
@@ -19,6 +19,7 @@ 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.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import net.mullvad.mullvadvpn.R
@@ -67,19 +68,13 @@ fun Settings(navigator: DestinationsNavigator) {
val state by vm.uiState.collectAsStateWithLifecycle()
SettingsScreen(
state = state,
- onVpnSettingCellClick = {
- navigator.navigate(VpnSettingsDestination) { launchSingleTop = true }
- },
- onSplitTunnelingCellClick = {
- navigator.navigate(SplitTunnelingDestination) { launchSingleTop = true }
- },
- onReportProblemCellClick = {
- navigator.navigate(ReportProblemDestination) { launchSingleTop = true }
- },
- onApiAccessClick = {
- navigator.navigate(ApiAccessListDestination) { launchSingleTop = true }
- },
- onBackClick = navigator::navigateUp
+ onVpnSettingCellClick = dropUnlessResumed { navigator.navigate(VpnSettingsDestination) },
+ onSplitTunnelingCellClick =
+ dropUnlessResumed { navigator.navigate(SplitTunnelingDestination) },
+ onReportProblemCellClick =
+ dropUnlessResumed { navigator.navigate(ApiAccessListDestination) },
+ onApiAccessClick = dropUnlessResumed { navigator.navigate(ReportProblemDestination) },
+ onBackClick = dropUnlessResumed { navigator.navigateUp() }
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreen.kt
index a9b7873a2f..280cef1802 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreen.kt
@@ -22,6 +22,7 @@ import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import net.mullvad.mullvadvpn.R
@@ -98,7 +99,7 @@ fun SplitTunneling(navigator: DestinationsNavigator) {
onShowSystemAppsClick = viewModel::onShowSystemAppsClick,
onExcludeAppClick = viewModel::onExcludeAppClick,
onIncludeAppClick = viewModel::onIncludeAppClick,
- onBackClick = navigator::navigateUp,
+ onBackClick = dropUnlessResumed { navigator.navigateUp() },
onResolveIcon = { packageName ->
packageManager.getApplicationIconBitmapOrNull(packageName)
},
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ViewLogsScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ViewLogsScreen.kt
index 05eb72c142..fbb0ea82ce 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ViewLogsScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ViewLogsScreen.kt
@@ -28,6 +28,7 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import kotlinx.coroutines.launch
@@ -64,7 +65,7 @@ private fun PreviewViewLogsLoadingScreen() {
fun ViewLogs(navigator: DestinationsNavigator) {
val vm = koinViewModel<ViewLogsViewModel>()
val state by vm.uiState.collectAsStateWithLifecycle()
- ViewLogsScreen(state = state, onBackClick = navigator::navigateUp)
+ ViewLogsScreen(state = state, onBackClick = dropUnlessResumed { navigator.navigateUp() })
}
@OptIn(ExperimentalMaterial3Api::class)
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 bc0c0443dd..5c3bf9bb77 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
@@ -31,6 +31,7 @@ import androidx.core.text.HtmlCompat
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.result.ResultRecipient
@@ -199,40 +200,30 @@ fun VpnSettings(
VpnSettingsScreen(
state = state,
snackbarHostState = snackbarHostState,
- navigateToContentBlockersInfo = {
- navigator.navigate(ContentBlockersInfoDialogDestination) { launchSingleTop = true }
- },
- navigateToAutoConnectScreen = {
- navigator.navigate(AutoConnectAndLockdownModeDestination) { launchSingleTop = true }
- },
- navigateToCustomDnsInfo = {
- navigator.navigate(CustomDnsInfoDialogDestination) { launchSingleTop = true }
- },
- navigateToMalwareInfo = {
- navigator.navigate(MalwareInfoDialogDestination) { launchSingleTop = true }
- },
- navigateToObfuscationInfo = {
- navigator.navigate(ObfuscationInfoDialogDestination) { launchSingleTop = true }
- },
- navigateToQuantumResistanceInfo = {
- navigator.navigate(QuantumResistanceInfoDialogDestination) { launchSingleTop = true }
- },
- navigateUdp2TcpInfo = {
- navigator.navigate(UdpOverTcpPortInfoDialogDestination) { launchSingleTop = true }
- },
+ navigateToContentBlockersInfo =
+ dropUnlessResumed { navigator.navigate(ContentBlockersInfoDialogDestination) },
+ navigateToAutoConnectScreen =
+ dropUnlessResumed { navigator.navigate(AutoConnectAndLockdownModeDestination) },
+ navigateToCustomDnsInfo =
+ dropUnlessResumed { navigator.navigate(CustomDnsInfoDialogDestination) },
+ navigateToMalwareInfo =
+ dropUnlessResumed { navigator.navigate(MalwareInfoDialogDestination) },
+ navigateToObfuscationInfo =
+ dropUnlessResumed { navigator.navigate(ObfuscationInfoDialogDestination) },
+ navigateToQuantumResistanceInfo =
+ dropUnlessResumed { navigator.navigate(QuantumResistanceInfoDialogDestination) },
+ navigateUdp2TcpInfo =
+ dropUnlessResumed { navigator.navigate(UdpOverTcpPortInfoDialogDestination) },
navigateToWireguardPortInfo = {
navigator.navigate(
- WireguardPortInfoDialogDestination(WireguardPortInfoDialogArgument(it))
- ) {
- launchSingleTop = true
- }
- },
- navigateToLocalNetworkSharingInfo = {
- navigator.navigate(LocalNetworkSharingInfoDialogDestination) { launchSingleTop = true }
- },
- navigateToServerIpOverrides = {
- navigator.navigate(ServerIpOverridesDestination) { launchSingleTop = true }
+ WireguardPortInfoDialogDestination(WireguardPortInfoDialogArgument(it)),
+ onlyIfResumed = true
+ )
},
+ navigateToLocalNetworkSharingInfo =
+ dropUnlessResumed { navigator.navigate(LocalNetworkSharingInfoDialogDestination) },
+ navigateToServerIpOverrides =
+ dropUnlessResumed { navigator.navigate(ServerIpOverridesDestination) },
onToggleBlockTrackers = vm::onToggleBlockTrackers,
onToggleBlockAds = vm::onToggleBlockAds,
onToggleBlockMalware = vm::onToggleBlockMalware,
@@ -242,10 +233,10 @@ fun VpnSettings(
onToggleBlockGambling = vm::onToggleBlockGambling,
onToggleBlockSocialMedia = vm::onToggleBlockSocialMedia,
navigateToMtuDialog = {
- navigator.navigate(MtuDialogDestination(it)) { launchSingleTop = true }
+ navigator.navigate(MtuDialogDestination(it), onlyIfResumed = true)
},
navigateToDns = { index, address ->
- navigator.navigate(DnsDialogDestination(index, address)) { launchSingleTop = true }
+ navigator.navigate(DnsDialogDestination(index, address), onlyIfResumed = true)
},
navigateToWireguardPortDialog = {
val args =
@@ -253,12 +244,10 @@ fun VpnSettings(
state.customWireguardPort?.toPortOrNull(),
state.availablePortRanges
)
- navigator.navigate(WireguardCustomPortDialogDestination(args)) {
- launchSingleTop = true
- }
+ navigator.navigate(WireguardCustomPortDialogDestination(args), onlyIfResumed = true)
},
onToggleDnsClick = vm::onToggleCustomDns,
- onBackClick = navigator::navigateUp,
+ onBackClick = dropUnlessResumed { navigator.navigateUp() },
onSelectObfuscationSetting = vm::onSelectObfuscationSetting,
onSelectQuantumResistanceSetting = vm::onSelectQuantumResistanceSetting,
onWireguardPortSelected = vm::onWireguardPortSelected,
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 342f115943..71594527fd 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
@@ -27,6 +27,7 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import androidx.lifecycle.compose.dropUnlessResumed
import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.ramcosta.composedestinations.navigation.popUpTo
@@ -142,21 +143,17 @@ fun Welcome(
WelcomeScreen(
state = state,
- onSitePaymentClick = vm::onSitePaymentClick,
- onRedeemVoucherClick = {
- navigator.navigate(RedeemVoucherDestination) { launchSingleTop = true }
- },
- onSettingsClick = { navigator.navigate(SettingsDestination) { launchSingleTop = true } },
- onAccountClick = { navigator.navigate(AccountDestination) { launchSingleTop = true } },
- navigateToDeviceInfoDialog = {
- navigator.navigate(DeviceNameInfoDialogDestination) { launchSingleTop = true }
- },
+ onSitePaymentClick = dropUnlessResumed { vm.onSitePaymentClick() },
+ onRedeemVoucherClick = dropUnlessResumed { navigator.navigate(RedeemVoucherDestination) },
+ onSettingsClick = dropUnlessResumed { navigator.navigate(SettingsDestination) },
+ onAccountClick = dropUnlessResumed { navigator.navigate(AccountDestination) },
+ navigateToDeviceInfoDialog =
+ dropUnlessResumed { navigator.navigate(DeviceNameInfoDialogDestination) },
onPurchaseBillingProductClick = { productId ->
- navigator.navigate(PaymentDestination(productId)) { launchSingleTop = true }
+ navigator.navigate(PaymentDestination(productId), onlyIfResumed = true)
},
- navigateToVerificationPendingDialog = {
- navigator.navigate(VerificationPendingDialogDestination) { launchSingleTop = true }
- }
+ navigateToVerificationPendingDialog =
+ dropUnlessResumed { navigator.navigate(VerificationPendingDialogDestination) }
)
}