diff options
| author | Albin <albin@mullvad.net> | 2024-06-17 11:23:16 +0200 |
|---|---|---|
| committer | Albin <albin@mullvad.net> | 2024-06-17 11:23:16 +0200 |
| commit | 8eeefcb3fd956816e29c98b937168799ea52f204 (patch) | |
| tree | 04d94b1f78d655fe0e131296014e7046a03e94c5 | |
| parent | 778e5297430a1bdbec94acd67dc98bcfa2703596 (diff) | |
| parent | 81761886c557b72098cde5906a4847f3fcd8171d (diff) | |
| download | mullvadvpn-8eeefcb3fd956816e29c98b937168799ea52f204.tar.xz mullvadvpn-8eeefcb3fd956816e29c98b937168799ea52f204.zip | |
Merge branch 'service-killed-if-user-navigates-up-twice-quickly-from-droid-963'
43 files changed, 441 insertions, 324 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) } ) } diff --git a/android/buildSrc/src/main/kotlin/Versions.kt b/android/buildSrc/src/main/kotlin/Versions.kt index 37f0f2c029..02a50ce5e4 100644 --- a/android/buildSrc/src/main/kotlin/Versions.kt +++ b/android/buildSrc/src/main/kotlin/Versions.kt @@ -25,7 +25,7 @@ object Versions { const val appcompat = "1.6.1" const val coreKtx = "1.12.0" const val espresso = "3.5.1" - const val lifecycle = "2.7.0" + const val lifecycle = "2.8.2" const val fragment = "1.6.2" const val test = "1.5.0" const val testMonitor = "1.6.1" diff --git a/android/gradle/verification-metadata.xml b/android/gradle/verification-metadata.xml index 11faf12b98..b3d62044fc 100644 --- a/android/gradle/verification-metadata.xml +++ b/android/gradle/verification-metadata.xml @@ -111,11 +111,6 @@ <sha256 value="c5769b13afe55023c1dc30c72ea86189ab70aa3ca770ecfb04c970f4d6e6be65" origin="Generated by Gradle"/> </artifact> </component> - <component group="androidx.annotation" name="annotation" version="1.1.0"> - <artifact name="annotation-1.1.0.jar"> - <sha256 value="d38d63edb30f1467818d50aaf05f8a692dea8b31392a049bfa991b159ad5b692" origin="Generated by Gradle"/> - </artifact> - </component> <component group="androidx.annotation" name="annotation" version="1.2.0"> <artifact name="annotation-1.2.0.jar"> <sha256 value="9029262bddce116e6d02be499e4afdba21f24c239087b76b3b57d7e98b490a36" origin="Generated by Gradle"/> @@ -144,9 +139,6 @@ <artifact name="annotation-1.6.0.module"> <sha256 value="6146b6138643b2ac0590df509dd51abaea769c79fd7602eb217168fe5af78cd2" origin="Generated by Gradle"/> </artifact> - <artifact name="annotation-metadata-1.6.0.jar"> - <sha256 value="fbc64f5c44a7added8b6eab517cf7d70555e25153bf5d44a6ed9b0e5312f7de9" origin="Generated by Gradle"/> - </artifact> </component> <component group="androidx.annotation" name="annotation" version="1.7.0"> <artifact name="annotation-1.7.0.module"> @@ -156,6 +148,14 @@ <sha256 value="b11676837cad011a5285d6074418649107ef25eba17131517e9557ef8c9984ed" origin="Generated by Gradle"/> </artifact> </component> + <component group="androidx.annotation" name="annotation" version="1.8.0"> + <artifact name="annotation-1.8.0.module"> + <sha256 value="d590a0d8e02f405de749e8dc80b741dc503c6e3e4c9c016d614d76b65f0b59ef" origin="Generated by Gradle"/> + </artifact> + <artifact name="annotation-metadata-1.8.0.jar"> + <sha256 value="fe70ace6f942a5fc29045bb2fe25b4e77bdc742dc69f76ed65b39c3ae185888e" origin="Generated by Gradle"/> + </artifact> + </component> <component group="androidx.annotation" name="annotation-experimental" version="1.1.0"> <artifact name="annotation-experimental-1.1.0.aar"> <sha256 value="0157de61a2064047896a058080f3fd67ba57ad9a94857b3f7a363660243e3f90" origin="Generated by Gradle"/> @@ -181,9 +181,6 @@ </artifact> </component> <component group="androidx.annotation" name="annotation-jvm" version="1.6.0"> - <artifact name="annotation-jvm-1.6.0.jar"> - <sha256 value="60b10b5ef5769b79570172e015b8159405c92f034ba88b9391a977589c9deb4e" origin="Generated by Gradle"/> - </artifact> <artifact name="annotation-jvm-1.6.0.module"> <sha256 value="3f5a8faa19de667e63dca9730ff8ef0e478e4bafb5feeb8258e5c086246dc90c" origin="Generated by Gradle"/> </artifact> @@ -196,6 +193,14 @@ <sha256 value="07ce60c377ab94e47c8c902589b9776030064fd1a7e4d5a01a38d700e35e5db4" origin="Generated by Gradle"/> </artifact> </component> + <component group="androidx.annotation" name="annotation-jvm" version="1.8.0"> + <artifact name="annotation-jvm-1.8.0.jar"> + <sha256 value="9aab326d9492800991854360ac248f493ce7f7c3183519309b78ace9e240f6f6" origin="Generated by Gradle"/> + </artifact> + <artifact name="annotation-jvm-1.8.0.module"> + <sha256 value="e3cb4525539d0ed74bb238ef92c69eef22a80e422c0d2acbc51e6187febb0a13" origin="Generated by Gradle"/> + </artifact> + </component> <component group="androidx.appcompat" name="appcompat" version="1.6.1"> <artifact name="appcompat-1.6.1.aar"> <sha256 value="7ea5573b93ababd3bd32312451c6ea48a662b03a140dda81aebe75776a20a422" origin="Generated by Gradle"/> @@ -583,11 +588,6 @@ <sha256 value="3ab3ee278fabc41d79d9da1e1eb5b6c9948ae3dba796c0d004b04ee5c9cfd722" origin="Generated by Gradle"/> </artifact> </component> - <component group="androidx.compose.runtime" name="runtime" version="1.0.1"> - <artifact name="runtime-1.0.1.module"> - <sha256 value="2543a8c7edc16bde91f140286b4fd3773d7204a283a4ec99f6e5e286aa92c0c3" origin="Generated by Gradle"/> - </artifact> - </component> <component group="androidx.compose.runtime" name="runtime" version="1.5.4"> <artifact name="runtime-1.5.4.module"> <sha256 value="3ddd8b5ef83800f6289b6f0c96c4fb7a640209b42c45e60e18bc8fd17bd3e32f" origin="Generated by Gradle"/> @@ -606,6 +606,14 @@ <sha256 value="9f40ab0b8cf4e7cb0f593493c2ed96e7155d0e91eb592407597ecd61e2d5a054" origin="Generated by Gradle"/> </artifact> </component> + <component group="androidx.compose.runtime" name="runtime" version="1.6.5"> + <artifact name="runtime-1.6.5.module"> + <sha256 value="26e931f510f93cb960ea4f703fb69e89dbefe010713f53c54b3e12825293f853" origin="Generated by Gradle"/> + </artifact> + <artifact name="runtime-metadata-1.6.5.jar"> + <sha256 value="9f40ab0b8cf4e7cb0f593493c2ed96e7155d0e91eb592407597ecd61e2d5a054" origin="Generated by Gradle"/> + </artifact> + </component> <component group="androidx.compose.runtime" name="runtime-android" version="1.6.3"> <artifact name="runtime-android-1.6.3.module"> <sha256 value="4d73c867fcab9692eb05837c9f09fb366083905b7fc7471fc9466e87c4afa1c0" origin="Generated by Gradle"/> @@ -614,12 +622,20 @@ <sha256 value="bca307a76fb39eedf336d6026b1616b6256ccde400990f04564a5d27d5f3cdf9" origin="Generated by Gradle"/> </artifact> </component> - <component group="androidx.compose.runtime" name="runtime-desktop" version="1.6.3"> - <artifact name="runtime-desktop-1.6.3.jar"> - <sha256 value="e995031aae22da020a681a464facab65df89d8bcbfc97e075f22a1ee3b3cbdb2" origin="Generated by Gradle"/> + <component group="androidx.compose.runtime" name="runtime-android" version="1.6.5"> + <artifact name="runtime-android-1.6.5.module"> + <sha256 value="c4999b604c093a3fa83327ee60b5bed1af3bd4056ee147a8b40f44b52622af1d" origin="Generated by Gradle"/> </artifact> - <artifact name="runtime-desktop-1.6.3.module"> - <sha256 value="7eb63c712e6304cfa3bb685309e513f056eaf6ed8aa6e650966ea09e423d65e4" origin="Generated by Gradle"/> + <artifact name="runtime-release.aar"> + <sha256 value="4cb0744808a3849f6217b952dd500529ee9426f52a76c71a9464cd766eb63169" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime-desktop" version="1.6.5"> + <artifact name="runtime-desktop-1.6.5.jar"> + <sha256 value="c7c4b88df1a7b100b1824443078093cc0e937404d6284407db0bfc26b5863143" origin="Generated by Gradle"/> + </artifact> + <artifact name="runtime-desktop-1.6.5.module"> + <sha256 value="55f99093db72759dfc0e4ded8bf5cadb256037930b13965b136ffb805c6e59a8" origin="Generated by Gradle"/> </artifact> </component> <component group="androidx.compose.runtime" name="runtime-saveable" version="1.6.3"> @@ -630,6 +646,14 @@ <sha256 value="13a43cc361aced06050b235ae2ba0231b73b72c5bf9d14f0c3bd27169e3e06e3" origin="Generated by Gradle"/> </artifact> </component> + <component group="androidx.compose.runtime" name="runtime-saveable" version="1.6.5"> + <artifact name="runtime-saveable-1.6.5.module"> + <sha256 value="9ef8e039096cbe5fa12a9b4f0bc6fddd82677135de4c3594224ee148e126f198" origin="Generated by Gradle"/> + </artifact> + <artifact name="runtime-saveable-metadata-1.6.5.jar"> + <sha256 value="13a43cc361aced06050b235ae2ba0231b73b72c5bf9d14f0c3bd27169e3e06e3" origin="Generated by Gradle"/> + </artifact> + </component> <component group="androidx.compose.runtime" name="runtime-saveable-android" version="1.6.3"> <artifact name="runtime-saveable-android-1.6.3.module"> <sha256 value="15312707c7f42d68c400abe35409d56a91158859bc959854f268109c7411eb05" origin="Generated by Gradle"/> @@ -638,14 +662,27 @@ <sha256 value="3ee8dd49504312c82dc886467797e0db1cdc160297139879707d66221f22649c" origin="Generated by Gradle"/> </artifact> </component> - <component group="androidx.compose.runtime" name="runtime-saveable-desktop" version="1.6.3"> - <artifact name="runtime-saveable-desktop-1.6.3.jar"> - <sha256 value="55064d4bd481d67a2840e52c594fc9cbbbf15c9a48f224199bbda005da705df4" origin="Generated by Gradle"/> + <component group="androidx.compose.runtime" name="runtime-saveable-android" version="1.6.5"> + <artifact name="runtime-saveable-android-1.6.5.module"> + <sha256 value="f74e223a4350be93e51d12b918b2cbc92f11a0994214bad75bf481f1d2a4204b" origin="Generated by Gradle"/> + </artifact> + <artifact name="runtime-saveable-release.aar"> + <sha256 value="37b9d44d19eff8f67daa52b33f7722fcc7121d2d1c090b637eac2847bf416850" origin="Generated by Gradle"/> </artifact> + </component> + <component group="androidx.compose.runtime" name="runtime-saveable-desktop" version="1.6.3"> <artifact name="runtime-saveable-desktop-1.6.3.module"> <sha256 value="688ed773211ccf2b458276bd8a69b2abda087da9bb568cd38a39fc61f7b1a07e" origin="Generated by Gradle"/> </artifact> </component> + <component group="androidx.compose.runtime" name="runtime-saveable-desktop" version="1.6.5"> + <artifact name="runtime-saveable-desktop-1.6.5.jar"> + <sha256 value="55064d4bd481d67a2840e52c594fc9cbbbf15c9a48f224199bbda005da705df4" origin="Generated by Gradle"/> + </artifact> + <artifact name="runtime-saveable-desktop-1.6.5.module"> + <sha256 value="1a4d2104c3be2ce0dc007a564af3f2ce5ab9d4e13c9bc2b36ab84365c4f2369f" origin="Generated by Gradle"/> + </artifact> + </component> <component group="androidx.compose.ui" name="ui" version="1.6.3"> <artifact name="ui-1.6.3.module"> <sha256 value="dc56282d37256426fa077faf3fa6116459f4d614868d76bb4f6dafda2e93b62b" origin="Generated by Gradle"/> @@ -1157,12 +1194,12 @@ <sha256 value="0fa7f28f5cff8a406a4f7870b243cb0d6d7a7c20faa7a2becaff5907ae12f9cc" origin="Generated by Gradle"/> </artifact> </component> - <component group="androidx.lifecycle" name="lifecycle-common" version="2.7.0"> - <artifact name="lifecycle-common-2.7.0.jar"> - <sha256 value="533ded8ee0645a18f6653da53fe1ec5a15430e7f36a737d45e410531f30f3318" origin="Generated by Gradle"/> + <component group="androidx.lifecycle" name="lifecycle-common" version="2.8.2"> + <artifact name="lifecycle-common-2.8.2.module"> + <sha256 value="bbf1250f00552c82871e283dc2af380b1bc2a1b52a207f012f5d8c849544b621" origin="Generated by Gradle"/> </artifact> - <artifact name="lifecycle-common-2.7.0.module"> - <sha256 value="421fdbd504097803f3a8df81c3e5d50a5be48965032b1389325f7e659d27fac8" origin="Generated by Gradle"/> + <artifact name="lifecycle-common-metadata-2.8.2.jar"> + <sha256 value="e26c6d7d04a490c6fdaa1415ac95797a7dcc7444be3f3ab3d9acad87dae4921c" origin="Generated by Gradle"/> </artifact> </component> <component group="androidx.lifecycle" name="lifecycle-common-java8" version="2.6.1"> @@ -1181,12 +1218,20 @@ <sha256 value="3d538207d68eb89aa0166edac09422b9374819506da39be62c01f0c0f6384f7e" origin="Generated by Gradle"/> </artifact> </component> - <component group="androidx.lifecycle" name="lifecycle-common-java8" version="2.7.0"> - <artifact name="lifecycle-common-java8-2.7.0.jar"> + <component group="androidx.lifecycle" name="lifecycle-common-java8" version="2.8.2"> + <artifact name="lifecycle-common-java8-2.8.2.jar"> <sha256 value="c6deada2fac53b8ea6523dbda77597b128006674616f140f04df23264c6d1aa3" origin="Generated by Gradle"/> </artifact> - <artifact name="lifecycle-common-java8-2.7.0.module"> - <sha256 value="ab1607cd887584d7ec2d88b3023a1934834874baf045da0974fa705aadc9ef14" origin="Generated by Gradle"/> + <artifact name="lifecycle-common-java8-2.8.2.module"> + <sha256 value="391ec077deaa358a4955d6e63c6171d4bd514c46705d9b1972b9bd33f1d2e4dc" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-common-jvm" version="2.8.2"> + <artifact name="lifecycle-common-jvm-2.8.2.jar"> + <sha256 value="61c873a7327c946ec033c310bb98f3f92eeabcede0e1a5200ab8a1896483c7bf" origin="Generated by Gradle"/> + </artifact> + <artifact name="lifecycle-common-jvm-2.8.2.module"> + <sha256 value="46b20ea622920f2c083a1f96efb983a4a16823676daed7478aa6fce5e88c3a52" origin="Generated by Gradle"/> </artifact> </component> <component group="androidx.lifecycle" name="lifecycle-livedata" version="2.0.0"> @@ -1210,12 +1255,12 @@ <sha256 value="19a287b46d1b1ffe297bee0df7dee5183aeba95600ec0de8742adeb5b67c8bab" origin="Generated by Gradle"/> </artifact> </component> - <component group="androidx.lifecycle" name="lifecycle-livedata" version="2.7.0"> - <artifact name="lifecycle-livedata-2.7.0.aar"> - <sha256 value="9affa24c6160dc8cadaac9422d4f714e5009537d0243afc4bc74b5b7cf0de4ad" origin="Generated by Gradle"/> + <component group="androidx.lifecycle" name="lifecycle-livedata" version="2.8.2"> + <artifact name="lifecycle-livedata-2.8.2.aar"> + <sha256 value="5b01d448a59caf922c5e9d9e9d1067f25a2b015fd5130e9baac9c86ed2464354" origin="Generated by Gradle"/> </artifact> - <artifact name="lifecycle-livedata-2.7.0.module"> - <sha256 value="a4ae3edfee3d53b41d235f9be30606f07f6ac01f0e2ab7a19170d7a359b61bc9" origin="Generated by Gradle"/> + <artifact name="lifecycle-livedata-2.8.2.module"> + <sha256 value="f36fd960cae98fce668cf98ea57a33af120cdee0cfb275e94fca74663a4918f6" origin="Generated by Gradle"/> </artifact> </component> <component group="androidx.lifecycle" name="lifecycle-livedata-core" version="2.3.0"> @@ -1255,12 +1300,12 @@ <sha256 value="527d0e1ac467d1f47cc20ed7c30db170217299fabb868154cf5d1765e4e4dad9" origin="Generated by Gradle"/> </artifact> </component> - <component group="androidx.lifecycle" name="lifecycle-livedata-core" version="2.7.0"> - <artifact name="lifecycle-livedata-core-2.7.0.aar"> - <sha256 value="af8e11b87e030d6e3107ed39adcf01fa10d6259eb15c43cba6e7b4e3ffaedf27" origin="Generated by Gradle"/> + <component group="androidx.lifecycle" name="lifecycle-livedata-core" version="2.8.2"> + <artifact name="lifecycle-livedata-core-2.8.2.aar"> + <sha256 value="906199de52b28505def4ad5e5a250286e239cd858ef8007843b80754754bf4e2" origin="Generated by Gradle"/> </artifact> - <artifact name="lifecycle-livedata-core-2.7.0.module"> - <sha256 value="8a08ed5f9717a3541231164336000a08c3911f8e186bc76cd526b2a822d6464d" origin="Generated by Gradle"/> + <artifact name="lifecycle-livedata-core-2.8.2.module"> + <sha256 value="f386a0f6bee8f0379c646989a45f93bf5cd1bfa4743690a6c62654a37f2f020a" origin="Generated by Gradle"/> </artifact> </component> <component group="androidx.lifecycle" name="lifecycle-livedata-core-ktx" version="2.6.1"> @@ -1279,12 +1324,12 @@ <sha256 value="1d6ef93736ae001c226bf2cb4b180bcb0718199a1d3868ee8846f4cc8318b779" origin="Generated by Gradle"/> </artifact> </component> - <component group="androidx.lifecycle" name="lifecycle-livedata-core-ktx" version="2.7.0"> - <artifact name="lifecycle-livedata-core-ktx-2.7.0.aar"> - <sha256 value="a97f4c2191ebdd32f99ac229597bd1a92446b01cd1a088d13494cc05cabf0def" origin="Generated by Gradle"/> + <component group="androidx.lifecycle" name="lifecycle-livedata-core-ktx" version="2.8.2"> + <artifact name="lifecycle-livedata-core-ktx-2.8.2.aar"> + <sha256 value="31617dc7d89886b3ac6e93e4a781fe3c1f9b0b29050d4fc87c89ffd5d6cc821e" origin="Generated by Gradle"/> </artifact> - <artifact name="lifecycle-livedata-core-ktx-2.7.0.module"> - <sha256 value="a61a7ab2f0b483e141a5925fc487c5eafb6588761d6e118ca607ce0618d72108" origin="Generated by Gradle"/> + <artifact name="lifecycle-livedata-core-ktx-2.8.2.module"> + <sha256 value="58a4bc3ca72ec82edb7f41e3dff70bfde2ac8fe6404a4af5849f848b724a4522" origin="Generated by Gradle"/> </artifact> </component> <component group="androidx.lifecycle" name="lifecycle-process" version="2.4.1"> @@ -1303,12 +1348,12 @@ <sha256 value="58c9e27371ccf7a22a233f44926d348c9d07e78c41a56588a4265ff6ae76645a" origin="Generated by Gradle"/> </artifact> </component> - <component group="androidx.lifecycle" name="lifecycle-process" version="2.7.0"> - <artifact name="lifecycle-process-2.7.0.aar"> - <sha256 value="6fb33d9473a4933da9d98a0b12b606127e80681bd9b90309ccd2c2230863b939" origin="Generated by Gradle"/> + <component group="androidx.lifecycle" name="lifecycle-process" version="2.8.2"> + <artifact name="lifecycle-process-2.8.2.aar"> + <sha256 value="613688bfb3eaac259cf429d804b674325bab5245b9562576e4511a765fec3b04" origin="Generated by Gradle"/> </artifact> - <artifact name="lifecycle-process-2.7.0.module"> - <sha256 value="e9370cae02e170f51f2affb34e41a062d3bee5e5270ec112ac8523b6ca6de96f" origin="Generated by Gradle"/> + <artifact name="lifecycle-process-2.8.2.module"> + <sha256 value="7e76faf10ecb3fe8213b4c242f8fa9b80da7942c070b4758b7a7a4217c9a9453" origin="Generated by Gradle"/> </artifact> </component> <component group="androidx.lifecycle" name="lifecycle-runtime" version="2.3.0"> @@ -1348,20 +1393,52 @@ <sha256 value="ea0131846abe1fe9dea59ac6dfe1f0fb9d8b6d600c9eff9a1fd4ad5ee5e7cbc7" origin="Generated by Gradle"/> </artifact> </component> - <component group="androidx.lifecycle" name="lifecycle-runtime" version="2.7.0"> - <artifact name="lifecycle-runtime-2.7.0.aar"> - <sha256 value="81c6fb1dbb6a3cd7dc827d7b08e1c8142ed3a400a3422441108480e22f8937c4" origin="Generated by Gradle"/> + <component group="androidx.lifecycle" name="lifecycle-runtime" version="2.8.2"> + <artifact name="lifecycle-runtime-2.8.2.module"> + <sha256 value="a4b8fc08f65e12449421766b83a15d41a4325f412348078d755c175e7102abc4" origin="Generated by Gradle"/> + </artifact> + <artifact name="lifecycle-runtime-metadata-2.8.2.jar"> + <sha256 value="4ee784530e550754230395d4f4f56817c9fcbc08db4d645e77441f3dd82c56b5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-runtime-android" version="2.8.2"> + <artifact name="lifecycle-runtime-android-2.8.2.module"> + <sha256 value="ca87b1aa11ada45b66f7d8c345a5df89fd0a678412db9a1720d02b2a5ea1c77e" origin="Generated by Gradle"/> + </artifact> + <artifact name="lifecycle-runtime-release.aar"> + <sha256 value="158f313c1a177a66b31c696997ea3c16ff1673a8ac95b844fa227ad742d204d5" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-runtime-compose" version="2.8.2"> + <artifact name="lifecycle-runtime-compose-2.8.2.module"> + <sha256 value="74096c3f4eb2002dc125c7fd440cc8db36cfcf345f7f23674bf3d85020bfd1f4" origin="Generated by Gradle"/> + </artifact> + <artifact name="lifecycle-runtime-compose-metadata-2.8.2.jar"> + <sha256 value="1ace38c9470c78e8971ebcdf8d0390be64010fc869a7fd3c6e5eaf10370ec1ba" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-runtime-compose-android" version="2.8.2"> + <artifact name="lifecycle-runtime-compose-android-2.8.2.module"> + <sha256 value="4bb504e7894e53fd00f18ee9e7515119d6e0c34c58343410e026b64ddd445a82" origin="Generated by Gradle"/> + </artifact> + <artifact name="lifecycle-runtime-compose-release.aar"> + <sha256 value="389023fbf1ae0f5a23e168063f92472ccfa753290d43469a3e4c2154cc47b542" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-runtime-compose-desktop" version="2.8.2"> + <artifact name="lifecycle-runtime-compose-desktop-2.8.2.jar"> + <sha256 value="f377a65d8248148bd494bfe988376eb0d5738870bd684fdea311c3ad75013076" origin="Generated by Gradle"/> </artifact> - <artifact name="lifecycle-runtime-2.7.0.module"> - <sha256 value="2efb0fbe1c2fe6e683f715655b8b3eaf9a54e679c37e92616ec1ada30337d613" origin="Generated by Gradle"/> + <artifact name="lifecycle-runtime-compose-desktop-2.8.2.module"> + <sha256 value="fd5b8ef0a0732cdb75157fdf0137adea372f8aa9ad2f00d7d1e839820e285632" origin="Generated by Gradle"/> </artifact> </component> - <component group="androidx.lifecycle" name="lifecycle-runtime-compose" version="2.7.0"> - <artifact name="lifecycle-runtime-compose-2.7.0.aar"> - <sha256 value="d4abcce8235683a0374dd4e9a78fd416eb65855658dda9d4fe4b34e5a27ff167" origin="Generated by Gradle"/> + <component group="androidx.lifecycle" name="lifecycle-runtime-desktop" version="2.8.2"> + <artifact name="lifecycle-runtime-desktop-2.8.2.jar"> + <sha256 value="10bfe53bb2752f967751a5102cdb785eeea54e1d4df6bde88fb0f50b0a49156c" origin="Generated by Gradle"/> </artifact> - <artifact name="lifecycle-runtime-compose-2.7.0.module"> - <sha256 value="4dee71af093813dae322595e95f7aa70aea5f54a7191f664767f4025317da213" origin="Generated by Gradle"/> + <artifact name="lifecycle-runtime-desktop-2.8.2.module"> + <sha256 value="cc1e0192679467ed695987646a4e645d5060803f2913a687de71c5bc1186971c" origin="Generated by Gradle"/> </artifact> </component> <component group="androidx.lifecycle" name="lifecycle-runtime-ktx" version="2.5.1"> @@ -1385,20 +1462,28 @@ <sha256 value="3c9af03a3a543394e67ab599b727ba331e6f330a55829f6d52f63a8772f4cbdc" origin="Generated by Gradle"/> </artifact> </component> - <component group="androidx.lifecycle" name="lifecycle-runtime-ktx" version="2.7.0"> - <artifact name="lifecycle-runtime-ktx-2.7.0.aar"> - <sha256 value="ef7033b15db27569771c3c0aeb6f92392b5654216195fe74136ea3e108912ad4" origin="Generated by Gradle"/> + <component group="androidx.lifecycle" name="lifecycle-runtime-ktx" version="2.8.2"> + <artifact name="lifecycle-runtime-ktx-2.8.2.module"> + <sha256 value="3c7f723b662d1433797c659f48ddcdb53f3b2073b9dc9fd748941b67038d8969" origin="Generated by Gradle"/> </artifact> - <artifact name="lifecycle-runtime-ktx-2.7.0.module"> - <sha256 value="ebc28fc834248353425a95b35a10e8a0edb112deacdc8cc03c3a37d8167f178d" origin="Generated by Gradle"/> + <artifact name="lifecycle-runtime-ktx-metadata-2.8.2.jar"> + <sha256 value="92e90c3bd6cc2f66a15e9597cc015cd3a2f8767a9bd29d7feadaea4d44b2fccf" origin="Generated by Gradle"/> </artifact> </component> - <component group="androidx.lifecycle" name="lifecycle-service" version="2.7.0"> - <artifact name="lifecycle-service-2.7.0.aar"> - <sha256 value="e31bd0e92bd0b31b360448ca5a5b80fc1f63507bb4ee8e9bd300437449d1789b" origin="Generated by Gradle"/> + <component group="androidx.lifecycle" name="lifecycle-runtime-ktx-android" version="2.8.2"> + <artifact name="lifecycle-runtime-ktx-android-2.8.2.module"> + <sha256 value="a8878864db938c7ffe778d9296e7a7b5066954c2321a93ce33de37974098e120" origin="Generated by Gradle"/> </artifact> - <artifact name="lifecycle-service-2.7.0.module"> - <sha256 value="4786f3f890aa8db65ace14f34370b557e6f82252477f006d285a280eae3990a8" origin="Generated by Gradle"/> + <artifact name="lifecycle-runtime-ktx-release.aar"> + <sha256 value="cfcfaeba10fce09a5d8a1451f8d894edc60ac00552ea956ad7f561d5848ba868" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-service" version="2.8.2"> + <artifact name="lifecycle-service-2.8.2.aar"> + <sha256 value="aa83b5973b845ee5350c0f4358ffb137be25b71fa9f5c2cc51198fb9eb0e5201" origin="Generated by Gradle"/> + </artifact> + <artifact name="lifecycle-service-2.8.2.module"> + <sha256 value="e7d7985bcef0c6738de2f2ba6968c06d8ebdfc06e0298fc1e2c5b3df3a0bd7c2" origin="Generated by Gradle"/> </artifact> </component> <component group="androidx.lifecycle" name="lifecycle-viewmodel" version="2.3.0"> @@ -1438,20 +1523,55 @@ <sha256 value="74e9a9ea46842a25642c91de2190ac24dcc1ea017395aae0eb250057d32699c6" origin="Generated by Gradle"/> </artifact> </component> - <component group="androidx.lifecycle" name="lifecycle-viewmodel" version="2.7.0"> - <artifact name="lifecycle-viewmodel-2.7.0.aar"> - <sha256 value="4e1d92e289920cd7b50e3671b9191bd413407349cda6f602b0285464f41c1c82" origin="Generated by Gradle"/> + <component group="androidx.lifecycle" name="lifecycle-viewmodel" version="2.8.2"> + <artifact name="lifecycle-viewmodel-2.8.2.aar"> + <sha256 value="43d28a6c6da9c1cb72bfb5cc1b511a7937b2db8b79d52f37d0b7f14c79b090dd" origin="Generated by Gradle"/> + </artifact> + <artifact name="lifecycle-viewmodel-2.8.2.module"> + <sha256 value="72985daed5ac9f371b7328787d853bac6a95792461c5fae6243fa61e3d3f5608" origin="Generated by Gradle"/> + </artifact> + <artifact name="lifecycle-viewmodel-metadata-2.8.2.jar"> + <sha256 value="539281344ce8a81d33570be300d86bb872c7b719a6dd2ce494eacba438fb53ce" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-viewmodel-android" version="2.8.2"> + <artifact name="lifecycle-viewmodel-android-2.8.2.module"> + <sha256 value="6ba5e376f07ef5328e884814c98a979bf3870b0aac4b39de7d981599abfdd0b9" origin="Generated by Gradle"/> + </artifact> + <artifact name="lifecycle-viewmodel-release.aar"> + <sha256 value="e2f55a6e22af3f44a65469ef459e855fec7a77a454a1334315a1935b18ecda64" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-viewmodel-compose" version="2.8.2"> + <artifact name="lifecycle-viewmodel-compose-2.8.2.module"> + <sha256 value="93d79b051e42af5b2cf1f86d14b9cc7b10fe27869b9cc3d52449d88e1918294b" origin="Generated by Gradle"/> </artifact> - <artifact name="lifecycle-viewmodel-2.7.0.module"> - <sha256 value="f49b02d47a1a1867f9a325ea5b884fdc7ee6b02d538d016b201d33e00d30c5e1" origin="Generated by Gradle"/> + <artifact name="lifecycle-viewmodel-compose-metadata-2.8.2.jar"> + <sha256 value="68457770ac6b3e12b5f688d54e8227253cbebf1b3c137fbd00833ed4c45bd4bd" origin="Generated by Gradle"/> </artifact> </component> - <component group="androidx.lifecycle" name="lifecycle-viewmodel-compose" version="2.7.0"> - <artifact name="lifecycle-viewmodel-compose-2.7.0.aar"> - <sha256 value="76403bb1599f6e2adc9b80372efb2674b8cbede2b0f1e6e85c4a94e10c7b94b0" origin="Generated by Gradle"/> + <component group="androidx.lifecycle" name="lifecycle-viewmodel-compose-android" version="2.8.2"> + <artifact name="lifecycle-viewmodel-compose-android-2.8.2.module"> + <sha256 value="c0d74c579b5792697968517356c566723726850de9cf1c37443bc97760946b62" origin="Generated by Gradle"/> </artifact> - <artifact name="lifecycle-viewmodel-compose-2.7.0.module"> - <sha256 value="76416d2af29301a4d571e72c679d8d5e89536962a0ab3ea2490b8b3bcab0d26f" origin="Generated by Gradle"/> + <artifact name="lifecycle-viewmodel-compose-release.aar"> + <sha256 value="14247d8fb157362a577f3ce992c5a1fed08a6c172f43d2a781083e598a4871f0" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-viewmodel-compose-desktop" version="2.8.2"> + <artifact name="lifecycle-viewmodel-compose-desktop-2.8.2.jar"> + <sha256 value="2e0d6ac771c572bc3d637188a07fc6366ee9143f8d2bc28d7aeec73938ee8717" origin="Generated by Gradle"/> + </artifact> + <artifact name="lifecycle-viewmodel-compose-desktop-2.8.2.module"> + <sha256 value="5130a9dd485967c3fa538048f4c812ea270221abc9e6c90f9a32ecf2bc0d3c9d" origin="Generated by Gradle"/> + </artifact> + </component> + <component group="androidx.lifecycle" name="lifecycle-viewmodel-desktop" version="2.8.2"> + <artifact name="lifecycle-viewmodel-desktop-2.8.2.jar"> + <sha256 value="1ae614e1535b0a975746b4152ef6900651434095870fe2e7d084ec62eb48edca" origin="Generated by Gradle"/> + </artifact> + <artifact name="lifecycle-viewmodel-desktop-2.8.2.module"> + <sha256 value="67c8b7e0d90e19aa11309667f38a1aec57fb87c8d0291b7d4772b4f01ff6e6e3" origin="Generated by Gradle"/> </artifact> </component> <component group="androidx.lifecycle" name="lifecycle-viewmodel-ktx" version="2.6.1"> @@ -1470,12 +1590,12 @@ <sha256 value="16d314c6ec774cf83216c46e6e7fa96c615e1d2611995d368389154b57741861" origin="Generated by Gradle"/> </artifact> </component> - <component group="androidx.lifecycle" name="lifecycle-viewmodel-ktx" version="2.7.0"> - <artifact name="lifecycle-viewmodel-ktx-2.7.0.aar"> - <sha256 value="b492dbfc85926471367112f6d0e5d2c9991e855c5421ab37399396cc0123e2af" origin="Generated by Gradle"/> + <component group="androidx.lifecycle" name="lifecycle-viewmodel-ktx" version="2.8.2"> + <artifact name="lifecycle-viewmodel-ktx-2.8.2.aar"> + <sha256 value="b29dbe88d03faef613125339e8767e4e851b60789ddfd2fd141190d0b815a324" origin="Generated by Gradle"/> </artifact> - <artifact name="lifecycle-viewmodel-ktx-2.7.0.module"> - <sha256 value="412cfafe3050b0161a645f45d1be5e623d28ffbedc71581232cab45a3f54400d" origin="Generated by Gradle"/> + <artifact name="lifecycle-viewmodel-ktx-2.8.2.module"> + <sha256 value="3831834bb6851170557081e4a26a01591d3035af52a9b948ab14763584a0cc7a" origin="Generated by Gradle"/> </artifact> </component> <component group="androidx.lifecycle" name="lifecycle-viewmodel-savedstate" version="2.3.0"> @@ -1515,12 +1635,12 @@ <sha256 value="79f9d92880c2fb7827ac6739eb747264245ae456f4c21f77cf39fdb6a50a76ae" origin="Generated by Gradle"/> </artifact> </component> - <component group="androidx.lifecycle" name="lifecycle-viewmodel-savedstate" version="2.7.0"> - <artifact name="lifecycle-viewmodel-savedstate-2.7.0.aar"> - <sha256 value="57c578862e219e360c6957ff0bca6f169707b1e5582d4fa593e284f7f63e33f6" origin="Generated by Gradle"/> + <component group="androidx.lifecycle" name="lifecycle-viewmodel-savedstate" version="2.8.2"> + <artifact name="lifecycle-viewmodel-savedstate-2.8.2.aar"> + <sha256 value="2dc62627f265fa750d440c0d8589443faf04f77dce8a7efce3b390c52b0fe8dc" origin="Generated by Gradle"/> </artifact> - <artifact name="lifecycle-viewmodel-savedstate-2.7.0.module"> - <sha256 value="cf6e60bc3beb4a46373e09d86ebd9ba290ac51b41cd1c20ed27d7aaaaacab188" origin="Generated by Gradle"/> + <artifact name="lifecycle-viewmodel-savedstate-2.8.2.module"> + <sha256 value="d8ea7b73e8c300339417d1fff1e9af396c819f8bd24ad189d455158e0ce78783" origin="Generated by Gradle"/> </artifact> </component> <component group="androidx.loader" name="loader" version="1.0.0"> @@ -1576,6 +1696,14 @@ <sha256 value="a16fe511e599c2042da122be09569aecd3f4f90cad37ef08bd0bbc39118c92c8" origin="Generated by Gradle"/> </artifact> </component> + <component group="androidx.profileinstaller" name="profileinstaller" version="1.3.1"> + <artifact name="profileinstaller-1.3.1.aar"> + <sha256 value="d0e402ec31f24028a1dc7eb6a0a3f9d9635c1459392cd734396343b73d673948" origin="Generated by Gradle"/> + </artifact> + <artifact name="profileinstaller-1.3.1.module"> + <sha256 value="cc7eed0ed4b669de84b852f78797a50018a4f30002e1e38aaa668af22ca5b460" origin="Generated by Gradle"/> + </artifact> + </component> <component group="androidx.resourceinspection" name="resourceinspection-annotation" version="1.0.1"> <artifact name="resourceinspection-annotation-1.0.1.jar"> <sha256 value="8cff870ec6fb31db48a52f4a792335b4bf8de07e03bd37823181526433ccd5cb" origin="Generated by Gradle"/> @@ -2598,9 +2726,6 @@ <artifact name="protoc-3.25.3-linux-x86_64.exe"> <sha256 value="e718992c5733ece01264f160c0890229770791e51c9612a2b34dc17f83ab3773" origin="Generated by Gradle"/> </artifact> - <artifact name="protoc-3.25.3-osx-aarch_64.exe"> - <sha256 value="af8c1bd4fb34ca9215e32a9911d2b5ccd275d120155c42e8d910dcfecc51362d" origin="Generated by Gradle"/> - </artifact> </component> <component group="com.google.testing.platform" name="android-device-provider-local" version="0.0.9-alpha02"> <artifact name="android-device-provider-local-0.0.9-alpha02.jar"> @@ -3061,22 +3186,6 @@ <sha256 value="860c30ddd4fc86b4dd169e4bfece64661501419309c6471c53ec6cb466a8be6f" origin="Generated by Gradle"/> </artifact> </component> - <component group="io.arrow-kt" name="arrow-autoclose" version="1.2.3"> - <artifact name="arrow-autoclose-1.2.3.module"> - <sha256 value="387840ab5ac3f84be2ae48154271f22a332bf11dc0edb60c322c4faba2638180" origin="Generated by Gradle"/> - </artifact> - <artifact name="arrow-autoclose-metadata-1.2.3.jar"> - <sha256 value="87799eb6b7cc44b18a2fba1af38fbb43a5e057d6b8a3de934181554dc00e1f43" origin="Generated by Gradle"/> - </artifact> - </component> - <component group="io.arrow-kt" name="arrow-autoclose-jvm" version="1.2.3"> - <artifact name="arrow-autoclose-jvm-1.2.3.jar"> - <sha256 value="125f9800e0bbfb9b8fa21c0a7a740fdde6f822fc4acc68b0480753cdb1cbd17f" origin="Generated by Gradle"/> - </artifact> - <artifact name="arrow-autoclose-jvm-1.2.3.module"> - <sha256 value="beace0a9954fbed210430d66b5467d42bfd36a368606c444712d4827354202f6" origin="Generated by Gradle"/> - </artifact> - </component> <component group="io.arrow-kt" name="arrow-continuations" version="1.2.3"> <artifact name="arrow-continuations-1.2.3.module"> <sha256 value="e1a2bfce36818c8e0b8f1f870ea64effccbf9b2c23966eab3ac9d1cfe84927fc" origin="Generated by Gradle"/> @@ -3109,22 +3218,6 @@ <sha256 value="1ff5a88b276200b1a9e7b7dbd6c1f183f86a2010c8e077f82056a2e72c0fffe7" origin="Generated by Gradle"/> </artifact> </component> - <component group="io.arrow-kt" name="arrow-fx-coroutines" version="1.2.3"> - <artifact name="arrow-fx-coroutines-1.2.3.module"> - <sha256 value="5987e27c5b5b6b9a6657e394f614d4f1f548b5896cf1c218ea8d50b53a37f2a5" origin="Generated by Gradle"/> - </artifact> - <artifact name="arrow-fx-coroutines-metadata-1.2.3.jar"> - <sha256 value="491b616943afe2e11ae237c892c2c525e32ad7ca94a2cb6812f27677a8aa705f" origin="Generated by Gradle"/> - </artifact> - </component> - <component group="io.arrow-kt" name="arrow-fx-coroutines-jvm" version="1.2.3"> - <artifact name="arrow-fx-coroutines-jvm-1.2.3.jar"> - <sha256 value="b13dce3b153338fbbd23bbe6fa8d218f4b0ab13e82c07bc7851379828dfe00fb" origin="Generated by Gradle"/> - </artifact> - <artifact name="arrow-fx-coroutines-jvm-1.2.3.module"> - <sha256 value="07fe2a0a10ebb377e2ecf83f8bfcd5d7d14edccfa5f9c036c79c1ef5d0e97d12" origin="Generated by Gradle"/> - </artifact> - </component> <component group="io.arrow-kt" name="arrow-optics" version="1.2.3"> <artifact name="arrow-optics-1.2.3.module"> <sha256 value="eeb3691404db8a52866f3db713ddbd919fdfaa9a6302437d3b7f3b8c5aed213b" origin="Generated by Gradle"/> @@ -3494,9 +3587,6 @@ <artifact name="protoc-gen-grpc-java-1.63.0-linux-x86_64.exe"> <sha256 value="0e3e8db80ba1fbddeed97ea3220b52cfaa95764ff8bf00716df7322883ce47e8" origin="Generated by Gradle"/> </artifact> - <artifact name="protoc-gen-grpc-java-1.63.0-osx-aarch_64.exe"> - <sha256 value="28290117a2ee9ea60f50f94273ab139dc2b3be4b8f2a557bef7e6efefee5b363" origin="Generated by Gradle"/> - </artifact> </component> <component group="io.grpc" name="protoc-gen-grpc-kotlin" version="1.4.1"> <artifact name="protoc-gen-grpc-kotlin-1.4.1-jdk8.jar"> @@ -4730,6 +4820,14 @@ <sha256 value="2a91f10b826d3febc47c2b664e268615757c311114239787f5dc37481fdec441" origin="Generated by Gradle"/> </artifact> </component> + <component group="org.jetbrains.kotlinx" name="atomicfu" version="0.21.0"> + <artifact name="atomicfu-0.21.0.module"> + <sha256 value="c4aba64788420b0b54c877900f27ba385c3d170e878ca2faf378ec315cfcb076" origin="Generated by Gradle"/> + </artifact> + <artifact name="atomicfu-metadata-0.21.0-all.jar"> + <sha256 value="f31e5b2fd52eb73a0303cffe5c63c8390ca7cf459a02dcf06faa383dd4bb88d3" origin="Generated by Gradle"/> + </artifact> + </component> <component group="org.jetbrains.kotlinx" name="atomicfu" version="0.23.1"> <artifact name="atomicfu-0.23.1.module"> <sha256 value="3e891fe636b55108192100fcf38b1a39bcd1c2533e23c462fc07644eeafcb20f" origin="Generated by Gradle"/> @@ -4804,6 +4902,14 @@ <sha256 value="b7d5370ed0e54952003b13595a67b97ced3f873d919f5ddfbe50fcd499cbf0a7" origin="Generated by Gradle"/> </artifact> </component> + <component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-core" version="1.7.3"> + <artifact name="kotlinx-coroutines-core-1.7.3.module"> + <sha256 value="7fb162396594ec28e1b6a4411b457949a7670f5e12019176774e1fd6b9471bbf" origin="Generated by Gradle"/> + </artifact> + <artifact name="kotlinx-coroutines-core-metadata-1.7.3.jar"> + <sha256 value="f9522095aedcc2a6ab32c7484061ea698352c71be1390adb403b59aa48a38fdc" origin="Generated by Gradle"/> + </artifact> + </component> <component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-core" version="1.8.0"> <artifact name="kotlinx-coroutines-core-1.8.0.module"> <sha256 value="144eecd5365de3e30d7b46226c058051e39955b5c189e31fa4c7cffb99d620ba" origin="Generated by Gradle"/> |
