diff options
| author | David Göransson <david.goransson@mullvad.net> | 2024-06-27 07:37:47 +0200 |
|---|---|---|
| committer | David Göransson <david.goransson@mullvad.net> | 2024-06-27 09:33:59 +0200 |
| commit | e2b0c4518002a0940dde976161950508a5820e67 (patch) | |
| tree | 941b53c9759ad54dbbd95b779f6634e102731d73 /android/app | |
| parent | 9cd4e0f7b552e5790c38af4c6d949ca5a98698a1 (diff) | |
| download | mullvadvpn-e2b0c4518002a0940dde976161950508a5820e67.tar.xz mullvadvpn-e2b0c4518002a0940dde976161950508a5820e67.zip | |
Fix Destinations breaking API changes
Diffstat (limited to 'android/app')
64 files changed, 577 insertions, 352 deletions
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ApiAccessMethodInfoDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ApiAccessMethodInfoDialog.kt index 141b610d43..8b607fe676 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ApiAccessMethodInfoDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ApiAccessMethodInfoDialog.kt @@ -4,6 +4,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator import com.ramcosta.composedestinations.spec.DestinationStyle @@ -17,7 +18,7 @@ private fun PreviewApiAccessMethodInfoDialog() { AppTheme { ApiAccessMethodInfoDialog(EmptyDestinationsNavigator) } } -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) @Composable fun ApiAccessMethodInfoDialog(navigator: DestinationsNavigator) { InfoDialog( diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ChangelogDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ChangelogDialog.kt index 8e34ecdce4..609388906e 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ChangelogDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ChangelogDialog.kt @@ -18,6 +18,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.navigation.NavController import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph import com.ramcosta.composedestinations.spec.DestinationStyle import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.compose.button.PrimaryButton @@ -27,7 +28,7 @@ import net.mullvad.mullvadvpn.viewmodel.Changelog import net.mullvad.mullvadvpn.viewmodel.ChangelogViewModel import org.koin.androidx.compose.koinViewModel -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) @Composable fun Changelog(navController: NavController, changeLog: Changelog) { val viewModel = koinViewModel<ChangelogViewModel>() 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 09e3d0fa6b..9e1913b498 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 @@ -4,12 +4,13 @@ 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.annotation.RootGraph import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.spec.DestinationStyle import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.compose.component.textResource -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) @Composable fun ContentBlockersInfoDialog(navigator: DestinationsNavigator) { InfoDialog( 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 d6eb004322..9e9cb5b78d 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 @@ -16,6 +16,8 @@ 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.annotation.RootGraph +import com.ramcosta.composedestinations.generated.destinations.CustomListLocationsDestination import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.result.ResultBackNavigator import com.ramcosta.composedestinations.spec.DestinationStyle @@ -23,7 +25,6 @@ import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.compose.button.PrimaryButton import net.mullvad.mullvadvpn.compose.communication.Created import net.mullvad.mullvadvpn.compose.component.CustomListNameTextField -import net.mullvad.mullvadvpn.compose.destinations.CustomListLocationsDestination import net.mullvad.mullvadvpn.compose.state.CreateCustomListUiState import net.mullvad.mullvadvpn.compose.test.CREATE_CUSTOM_LIST_DIALOG_INPUT_TEST_TAG import net.mullvad.mullvadvpn.lib.model.CustomListAlreadyExists @@ -55,7 +56,7 @@ private fun PreviewCreateCustomListDialogError() { } @Composable -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) fun CreateCustomList( navigator: DestinationsNavigator, backNavigator: ResultBackNavigator<Created>, 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 c692b27305..d8e52d96cd 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 @@ -5,6 +5,7 @@ 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.annotation.RootGraph import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator import com.ramcosta.composedestinations.spec.DestinationStyle @@ -16,7 +17,7 @@ private fun PreviewCustomDnsInfoDialog() { CustomDnsInfoDialog(EmptyDestinationsNavigator) } -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) @Composable fun CustomDnsInfoDialog(navigator: DestinationsNavigator) { InfoDialog( diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeleteApiAccessMethodConfirmationDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeleteApiAccessMethodConfirmationDialog.kt index b4a98bd82c..021a78e5eb 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeleteApiAccessMethodConfirmationDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeleteApiAccessMethodConfirmationDialog.kt @@ -5,6 +5,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph import com.ramcosta.composedestinations.result.ResultBackNavigator import com.ramcosta.composedestinations.spec.DestinationStyle import net.mullvad.mullvadvpn.R @@ -24,7 +25,7 @@ private fun PreviewDeleteApiAccessMethodConfirmationDialog() { } @Composable -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) fun DeleteApiAccessMethodConfirmation( navigator: ResultBackNavigator<Boolean>, apiAccessMethodId: ApiAccessMethodId 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 4990296281..22598d3d2d 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 @@ -6,6 +6,7 @@ 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.annotation.RootGraph import com.ramcosta.composedestinations.result.ResultBackNavigator import com.ramcosta.composedestinations.spec.DestinationStyle import net.mullvad.mullvadvpn.R @@ -32,7 +33,7 @@ private fun PreviewRemoveDeviceConfirmationDialog() { } @Composable -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) fun DeleteCustomList( navigator: ResultBackNavigator<Deleted>, customListId: CustomListId, 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 258af7e44a..98d1c4a87c 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 @@ -4,11 +4,12 @@ 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.annotation.RootGraph import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.spec.DestinationStyle import net.mullvad.mullvadvpn.R -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) @Composable fun DeviceNameInfoDialog(navigator: DestinationsNavigator) { InfoDialog( 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 adac4935bb..b6cb66ad93 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 @@ -10,12 +10,13 @@ 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.annotation.RootGraph import com.ramcosta.composedestinations.result.ResultBackNavigator import com.ramcosta.composedestinations.spec.DestinationStyle import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.compose.button.PrimaryButton -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) @Composable fun DiscardChangesDialog(resultBackNavigator: ResultBackNavigator<Boolean>) { AlertDialog( 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 be0a6eb38d..8db8caffe5 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 @@ -16,6 +16,7 @@ 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.annotation.RootGraph import com.ramcosta.composedestinations.result.ResultBackNavigator import com.ramcosta.composedestinations.spec.DestinationStyle import net.mullvad.mullvadvpn.R @@ -51,7 +52,7 @@ private fun PreviewDnsDialogEditAllowLanDisabled() { AppTheme { DnsDialog(DnsDialogViewState("192.168.1.1", null, true, false, 0), {}, {}, {}, {}) } } -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) @Composable fun DnsDialog( resultNavigator: ResultBackNavigator<DnsDialogResult>, 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 3b333cd877..42fe1cbf82 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 @@ -15,6 +15,7 @@ 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.annotation.RootGraph import com.ramcosta.composedestinations.result.ResultBackNavigator import com.ramcosta.composedestinations.spec.DestinationStyle import net.mullvad.mullvadvpn.R @@ -43,7 +44,7 @@ private fun PreviewEditCustomListNameDialog() { } @Composable -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) fun EditCustomListName( backNavigator: ResultBackNavigator<Renamed>, customListId: CustomListId, 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 e67796d37e..9f210ead70 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 @@ -5,6 +5,7 @@ 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.annotation.RootGraph import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator import com.ramcosta.composedestinations.spec.DestinationStyle @@ -17,7 +18,7 @@ private fun PreviewLocalNetworkSharingInfoDialog() { LocalNetworkSharingInfoDialog(EmptyDestinationsNavigator) } -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) @Composable fun LocalNetworkSharingInfoDialog(navigator: DestinationsNavigator) { InfoDialog( 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 a00d75b53e..13e6c88632 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 @@ -5,6 +5,7 @@ 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.annotation.RootGraph import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator import com.ramcosta.composedestinations.spec.DestinationStyle @@ -16,7 +17,7 @@ private fun PreviewMalwareInfoDialog() { MalwareInfoDialog(EmptyDestinationsNavigator) } -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) @Composable fun MalwareInfoDialog(navigator: DestinationsNavigator) { InfoDialog( 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 24020db23d..e3d44c0fd5 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 @@ -15,6 +15,7 @@ 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.annotation.RootGraph import com.ramcosta.composedestinations.result.EmptyResultBackNavigator import com.ramcosta.composedestinations.result.ResultBackNavigator import com.ramcosta.composedestinations.spec.DestinationStyle @@ -41,7 +42,7 @@ private fun PreviewMtuDialog() { AppTheme { MtuDialog(mtuInitial = Mtu(1234), EmptyResultBackNavigator()) } } -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) @Composable fun MtuDialog(mtuInitial: Mtu?, navigator: ResultBackNavigator<Boolean>) { val viewModel = koinViewModel<MtuDialogViewModel>(parameters = { parametersOf(mtuInitial) }) 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 e6e3edd3ac..ba286e0302 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 @@ -5,6 +5,7 @@ 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.annotation.RootGraph import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator import com.ramcosta.composedestinations.spec.DestinationStyle @@ -16,7 +17,7 @@ private fun PreviewObfuscationInfoDialog() { ObfuscationInfoDialog(EmptyDestinationsNavigator) } -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) @Composable fun ObfuscationInfoDialog(navigator: DestinationsNavigator) { InfoDialog( 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 47ea8badfc..deaa8a1180 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 @@ -5,6 +5,7 @@ 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.annotation.RootGraph import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator import com.ramcosta.composedestinations.spec.DestinationStyle @@ -16,7 +17,7 @@ private fun PreviewQuantumResistanceInfoDialog() { QuantumResistanceInfoDialog(EmptyDestinationsNavigator) } -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) @Composable fun QuantumResistanceInfoDialog(navigator: DestinationsNavigator) { InfoDialog( diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RedeemVoucherDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RedeemVoucherDialog.kt index 7034e67a91..935cc431f6 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RedeemVoucherDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RedeemVoucherDialog.kt @@ -26,6 +26,7 @@ import androidx.compose.ui.window.DialogProperties import androidx.compose.ui.window.SecureFlagPolicy import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph import com.ramcosta.composedestinations.result.ResultBackNavigator import com.ramcosta.composedestinations.spec.DestinationStyle import net.mullvad.mullvadvpn.BuildConfig @@ -104,7 +105,7 @@ private fun PreviewRedeemVoucherDialogSuccess() { } } -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) @Composable fun RedeemVoucher(resultBackNavigator: ResultBackNavigator<Boolean>) { val vm = koinViewModel<VoucherDialogViewModel>() 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 863b90e82a..c37bd2dbb0 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 @@ -17,6 +17,7 @@ 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.annotation.RootGraph import com.ramcosta.composedestinations.result.EmptyResultBackNavigator import com.ramcosta.composedestinations.result.ResultBackNavigator import com.ramcosta.composedestinations.spec.DestinationStyle @@ -39,7 +40,7 @@ private fun PreviewRemoveDeviceConfirmationDialog( AppTheme { RemoveDeviceConfirmationDialog(EmptyResultBackNavigator(), device = device) } } -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) @Composable fun RemoveDeviceConfirmationDialog(navigator: ResultBackNavigator<DeviceId>, device: Device) { AlertDialog( 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 b015d7c5b7..344ea1ca9f 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 @@ -14,6 +14,7 @@ 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.annotation.RootGraph import com.ramcosta.composedestinations.result.EmptyResultBackNavigator import com.ramcosta.composedestinations.result.ResultBackNavigator import com.ramcosta.composedestinations.spec.DestinationStyle @@ -29,7 +30,7 @@ private fun PreviewReportProblemNoEmailDialog() { AppTheme { ReportProblemNoEmailDialog(EmptyResultBackNavigator()) } } -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) @Composable fun ReportProblemNoEmailDialog(resultBackNavigator: ResultBackNavigator<Boolean>) { AlertDialog( 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 727ffeaaa2..70489db54c 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 @@ -11,6 +11,7 @@ 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.annotation.RootGraph import com.ramcosta.composedestinations.result.ResultBackNavigator import com.ramcosta.composedestinations.spec.DestinationStyle import net.mullvad.mullvadvpn.R @@ -30,7 +31,7 @@ private fun PreviewResetServerIpOverridesConfirmationDialog() { AppTheme { ResetServerIpOverridesConfirmationDialog({}, {}) } } -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) @Composable fun ResetServerIpOverridesConfirmation(resultBackNavigator: ResultBackNavigator<Boolean>) { val vm: ResetServerIpOverridesConfirmationViewModel = koinViewModel() diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/SaveApiAccessMethodDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/SaveApiAccessMethodDialog.kt index 3ade701db4..19f02d4802 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/SaveApiAccessMethodDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/SaveApiAccessMethodDialog.kt @@ -15,6 +15,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph import com.ramcosta.composedestinations.result.ResultBackNavigator import com.ramcosta.composedestinations.spec.DestinationStyle import net.mullvad.mullvadvpn.R @@ -45,7 +46,7 @@ private fun PreviewSaveApiAccessMethodDialog( AppTheme { SaveApiAccessMethodDialog(state = state) } } -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) @Composable fun SaveApiAccessMethod( backNavigator: ResultBackNavigator<Boolean>, 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 a42e314991..777ac5d195 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 @@ -5,6 +5,7 @@ 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.annotation.RootGraph import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator import com.ramcosta.composedestinations.spec.DestinationStyle @@ -16,7 +17,7 @@ private fun PreviewServerIpOverridesInfoDialog() { ServerIpOverridesInfoDialog(EmptyDestinationsNavigator) } -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) @Composable fun ServerIpOverridesInfoDialog(navigator: DestinationsNavigator) { InfoDialog( 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 22a93bb4bf..a49380b8ee 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 @@ -5,6 +5,7 @@ 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.annotation.RootGraph import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator import com.ramcosta.composedestinations.spec.DestinationStyle @@ -17,7 +18,7 @@ private fun PreviewUdpOverTcpPortInfoDialog() { AppTheme { UdpOverTcpPortInfoDialog(EmptyDestinationsNavigator) } } -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) @Composable fun UdpOverTcpPortInfoDialog(navigator: DestinationsNavigator) { InfoDialog( diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/WireguardCustomPortDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/WireguardCustomPortDialog.kt index 6640984a0f..ace0be15c0 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/WireguardCustomPortDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/WireguardCustomPortDialog.kt @@ -17,6 +17,7 @@ import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph import com.ramcosta.composedestinations.result.EmptyResultBackNavigator import com.ramcosta.composedestinations.result.ResultBackNavigator import com.ramcosta.composedestinations.spec.DestinationStyle @@ -54,7 +55,7 @@ data class WireguardCustomPortNavArgs( val allowedPortRanges: List<PortRange>, ) : Parcelable -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) @Composable fun WireguardCustomPortDialog( navArg: WireguardCustomPortNavArgs, 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 6d497dd93e..0484c995fb 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 @@ -6,6 +6,7 @@ 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.annotation.RootGraph import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.navigation.EmptyDestinationsNavigator import com.ramcosta.composedestinations.spec.DestinationStyle @@ -28,7 +29,7 @@ private fun PreviewWireguardPortInfoDialog() { @Parcelize data class WireguardPortInfoDialogArgument(val portRanges: List<PortRange>) : Parcelable -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) @Composable fun WireguardPortInfoDialog( navigator: DestinationsNavigator, diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/payment/PaymentDialog.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/payment/PaymentDialog.kt index 5af5e4305d..6aa15bc17d 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/payment/PaymentDialog.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/payment/PaymentDialog.kt @@ -15,6 +15,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph import com.ramcosta.composedestinations.result.ResultBackNavigator import com.ramcosta.composedestinations.spec.DestinationStyle import net.mullvad.mullvadvpn.R @@ -120,7 +121,7 @@ private fun PreviewPaymentDialogPaymentAvailabilityError() { } } -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) @Composable fun Payment(productId: ProductId, resultBackNavigator: ResultBackNavigator<Boolean>) { val vm = koinViewModel<PaymentViewModel>() 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 81a0b25b87..6af4a328bf 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 @@ -9,6 +9,7 @@ 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.annotation.RootGraph import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.spec.DestinationStyle import net.mullvad.mullvadvpn.R @@ -22,7 +23,7 @@ private fun PreviewVerificationPendingDialog() { AppTheme { VerificationPendingDialog(onClose = {}) } } -@Destination(style = DestinationStyle.Dialog::class) +@Destination<RootGraph>(style = DestinationStyle.Dialog::class) @Composable fun VerificationPendingDialog(navigator: DestinationsNavigator) { VerificationPendingDialog(onClose = dropUnlessResumed { navigator.navigateUp() }) diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/extensions/LifecycleExtensions.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/extensions/LifecycleExtensions.kt new file mode 100644 index 0000000000..4e2a11f9c0 --- /dev/null +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/extensions/LifecycleExtensions.kt @@ -0,0 +1,54 @@ +package net.mullvad.mullvadvpn.compose.extensions + +import androidx.compose.runtime.Composable +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.compose.LocalLifecycleOwner + +fun Lifecycle.State.dropUnlessResumed(block: () -> Unit) = + runOnAtLeast(Lifecycle.State.RESUMED, block) + +fun Lifecycle.State.runOnAtLeast(expectedState: Lifecycle.State, block: () -> Unit) { + if (isAtLeast(expectedState)) { + block() + } +} + +@Composable +fun <T> dropUnlessResumed(block: (T) -> Unit): (T) -> Unit { + val lifecycle = LocalLifecycleOwner.current.lifecycle + return dropUnlessResumed(lifecycle.currentState, block) +} + +fun <T> dropUnlessResumed(state: Lifecycle.State, block: (T) -> Unit): (T) -> Unit = + state.runOnAtLeast(Lifecycle.State.RESUMED, block) + +fun <T> Lifecycle.State.runOnAtLeast( + expectedState: Lifecycle.State, + block: (T) -> Unit +): (T) -> Unit { + return { + if (isAtLeast(expectedState)) { + block(it) + } + } +} + +@Composable +fun <T, T2> dropUnlessResumed(block: (T, T2) -> Unit): (T, T2) -> Unit { + val lifecycle = LocalLifecycleOwner.current.lifecycle + return dropUnlessResumed(lifecycle.currentState, block) +} + +fun <T, T2> dropUnlessResumed(state: Lifecycle.State, block: (T, T2) -> Unit): (T, T2) -> Unit = + state.runOnAtLeast(Lifecycle.State.RESUMED, block) + +fun <T, T2> Lifecycle.State.runOnAtLeast( + expectedState: Lifecycle.State, + block: (T, T2) -> Unit +): (T, T2) -> Unit { + return { t, t1 -> + if (isAtLeast(expectedState)) { + block(t, t1) + } + } +} 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 d5c9212406..7e4ee70c64 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 @@ -26,8 +26,14 @@ 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.annotation.RootGraph +import com.ramcosta.composedestinations.generated.NavGraphs +import com.ramcosta.composedestinations.generated.destinations.DeviceNameInfoDialogDestination +import com.ramcosta.composedestinations.generated.destinations.LoginDestination +import com.ramcosta.composedestinations.generated.destinations.PaymentDestination +import com.ramcosta.composedestinations.generated.destinations.RedeemVoucherDestination +import com.ramcosta.composedestinations.generated.destinations.VerificationPendingDialogDestination import com.ramcosta.composedestinations.navigation.DestinationsNavigator -import com.ramcosta.composedestinations.navigation.popUpTo import com.ramcosta.composedestinations.result.NavResult import com.ramcosta.composedestinations.result.ResultRecipient import kotlinx.coroutines.flow.Flow @@ -35,7 +41,6 @@ import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.launch import net.mullvad.mullvadvpn.R -import net.mullvad.mullvadvpn.compose.NavGraphs import net.mullvad.mullvadvpn.compose.button.ExternalButton import net.mullvad.mullvadvpn.compose.button.NegativeButton import net.mullvad.mullvadvpn.compose.button.RedeemVoucherButton @@ -45,12 +50,8 @@ import net.mullvad.mullvadvpn.compose.component.MissingPolicy import net.mullvad.mullvadvpn.compose.component.NavigateBackDownIconButton import net.mullvad.mullvadvpn.compose.component.PlayPayment import net.mullvad.mullvadvpn.compose.component.ScaffoldWithMediumTopBar -import net.mullvad.mullvadvpn.compose.destinations.DeviceNameInfoDialogDestination -import net.mullvad.mullvadvpn.compose.destinations.LoginDestination -import net.mullvad.mullvadvpn.compose.destinations.PaymentDestination -import net.mullvad.mullvadvpn.compose.destinations.RedeemVoucherDestination -import net.mullvad.mullvadvpn.compose.destinations.VerificationPendingDialogDestination import net.mullvad.mullvadvpn.compose.extensions.createOpenAccountPageHook +import net.mullvad.mullvadvpn.compose.extensions.dropUnlessResumed import net.mullvad.mullvadvpn.compose.state.PaymentState import net.mullvad.mullvadvpn.compose.transitions.SlideInFromBottomTransition import net.mullvad.mullvadvpn.compose.util.LaunchedEffectCollect @@ -103,7 +104,7 @@ private fun PreviewAccountScreen() { } @OptIn(ExperimentalMaterial3Api::class) -@Destination(style = SlideInFromBottomTransition::class) +@Destination<RootGraph>(style = SlideInFromBottomTransition::class) @Composable fun Account( navigator: DestinationsNavigator, @@ -137,9 +138,8 @@ fun Account( onBackClick = dropUnlessResumed { navigator.navigateUp() }, navigateToDeviceInfo = dropUnlessResumed { navigator.navigate(DeviceNameInfoDialogDestination) }, - onPurchaseBillingProductClick = { productId -> - navigator.navigate(PaymentDestination(productId), onlyIfResumed = true) - }, + onPurchaseBillingProductClick = + dropUnlessResumed { productId -> navigator.navigate(PaymentDestination(productId)) }, navigateToVerificationPendingDialog = dropUnlessResumed { navigator.navigate(VerificationPendingDialogDestination) } ) diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ApiAccessListScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ApiAccessListScreen.kt index 1c26986fac..b1a7334a1d 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ApiAccessListScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ApiAccessListScreen.kt @@ -20,6 +20,10 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.generated.destinations.ApiAccessMethodDetailsDestination +import com.ramcosta.composedestinations.generated.destinations.ApiAccessMethodInfoDialogDestination +import com.ramcosta.composedestinations.generated.destinations.EditApiAccessMethodDestination import com.ramcosta.composedestinations.navigation.DestinationsNavigator import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.compose.button.PrimaryButton @@ -28,9 +32,6 @@ import net.mullvad.mullvadvpn.compose.cell.TwoRowCell import net.mullvad.mullvadvpn.compose.component.NavigateBackIconButton import net.mullvad.mullvadvpn.compose.component.ScaffoldWithMediumTopBar import net.mullvad.mullvadvpn.compose.constant.ContentType -import net.mullvad.mullvadvpn.compose.destinations.ApiAccessMethodDetailsDestination -import net.mullvad.mullvadvpn.compose.destinations.ApiAccessMethodInfoDialogDestination -import net.mullvad.mullvadvpn.compose.destinations.EditApiAccessMethodDestination import net.mullvad.mullvadvpn.compose.extensions.itemsWithDivider import net.mullvad.mullvadvpn.compose.preview.ApiAccessListUiStateParameterProvider import net.mullvad.mullvadvpn.compose.state.ApiAccessListUiState @@ -51,7 +52,7 @@ private fun PreviewApiAccessList( AppTheme { ApiAccessListScreen(state = state) } } -@Destination(style = SlideInFromRightTransition::class) +@Destination<RootGraph>(style = SlideInFromRightTransition::class) @Composable fun ApiAccessList(navigator: DestinationsNavigator) { val viewModel = koinViewModel<ApiAccessListViewModel>() diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ApiAccessMethodDetailsScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ApiAccessMethodDetailsScreen.kt index 0b3902aa7c..d5aa7dfa0e 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ApiAccessMethodDetailsScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ApiAccessMethodDetailsScreen.kt @@ -32,6 +32,9 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.generated.destinations.DeleteApiAccessMethodConfirmationDestination +import com.ramcosta.composedestinations.generated.destinations.EditApiAccessMethodDestination import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.result.ResultRecipient import kotlinx.coroutines.launch @@ -44,8 +47,6 @@ import net.mullvad.mullvadvpn.compose.cell.SwitchComposeSubtitleCell import net.mullvad.mullvadvpn.compose.component.MullvadCircularProgressIndicatorLarge import net.mullvad.mullvadvpn.compose.component.NavigateBackIconButton import net.mullvad.mullvadvpn.compose.component.ScaffoldWithMediumTopBar -import net.mullvad.mullvadvpn.compose.destinations.DeleteApiAccessMethodConfirmationDestination -import net.mullvad.mullvadvpn.compose.destinations.EditApiAccessMethodDestination import net.mullvad.mullvadvpn.compose.preview.ApiAccessMethodDetailsUiStatePreviewParameterProvider import net.mullvad.mullvadvpn.compose.state.ApiAccessMethodDetailsUiState import net.mullvad.mullvadvpn.compose.test.API_ACCESS_DETAILS_EDIT_BUTTON @@ -75,7 +76,7 @@ private fun PreviewApiAccessMethodDetailsScreen( AppTheme { ApiAccessMethodDetailsScreen(state = state) } } -@Destination(style = SlideInFromRightTransition::class) +@Destination<RootGraph>(style = SlideInFromRightTransition::class) @Composable fun ApiAccessMethodDetails( navigator: DestinationsNavigator, 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 72d984b859..aa0f60c479 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 @@ -49,6 +49,7 @@ 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.annotation.RootGraph import com.ramcosta.composedestinations.navigation.DestinationsNavigator import kotlinx.coroutines.launch import net.mullvad.mullvadvpn.R @@ -72,7 +73,7 @@ private fun PreviewAutoConnectAndLockdownModeScreen() { AppTheme { AutoConnectAndLockdownModeScreen() } } -@Destination(style = SlideInFromRightTransition::class) +@Destination<RootGraph>(style = SlideInFromRightTransition::class) @Composable fun AutoConnectAndLockdownMode(navigator: DestinationsNavigator) { AutoConnectAndLockdownModeScreen(onBackClick = dropUnlessResumed { navigator.navigateUp() }) 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 36b351ddee..c62ff0672c 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 @@ -47,12 +47,17 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.dropUnlessResumed import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.generated.NavGraphs +import com.ramcosta.composedestinations.generated.destinations.AccountDestination +import com.ramcosta.composedestinations.generated.destinations.DeviceRevokedDestination +import com.ramcosta.composedestinations.generated.destinations.OutOfTimeDestination +import com.ramcosta.composedestinations.generated.destinations.SelectLocationDestination +import com.ramcosta.composedestinations.generated.destinations.SettingsDestination import com.ramcosta.composedestinations.navigation.DestinationsNavigator -import com.ramcosta.composedestinations.navigation.popUpTo import com.ramcosta.composedestinations.result.ResultRecipient import kotlinx.coroutines.launch import net.mullvad.mullvadvpn.R -import net.mullvad.mullvadvpn.compose.NavGraphs import net.mullvad.mullvadvpn.compose.button.ConnectionButton import net.mullvad.mullvadvpn.compose.button.SwitchLocationButton import net.mullvad.mullvadvpn.compose.component.ConnectionStatusText @@ -61,11 +66,6 @@ import net.mullvad.mullvadvpn.compose.component.MullvadCircularProgressIndicator import net.mullvad.mullvadvpn.compose.component.ScaffoldWithTopBarAndDeviceName import net.mullvad.mullvadvpn.compose.component.drawVerticalScrollbar import net.mullvad.mullvadvpn.compose.component.notificationbanner.NotificationBanner -import net.mullvad.mullvadvpn.compose.destinations.AccountDestination -import net.mullvad.mullvadvpn.compose.destinations.DeviceRevokedDestination -import net.mullvad.mullvadvpn.compose.destinations.OutOfTimeDestination -import net.mullvad.mullvadvpn.compose.destinations.SelectLocationDestination -import net.mullvad.mullvadvpn.compose.destinations.SettingsDestination import net.mullvad.mullvadvpn.compose.extensions.createOpenAccountPageHook import net.mullvad.mullvadvpn.compose.state.ConnectUiState import net.mullvad.mullvadvpn.compose.test.CIRCULAR_PROGRESS_INDICATOR @@ -116,7 +116,7 @@ private fun PreviewConnectScreen() { } } -@Destination(style = HomeTransition::class) +@Destination<RootGraph>(style = HomeTransition::class) @Composable fun Connect( navigator: DestinationsNavigator, 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 bbde96b99f..4d60c06b0a 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 @@ -28,6 +28,8 @@ 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.annotation.RootGraph +import com.ramcosta.composedestinations.generated.destinations.DiscardChangesDialogDestination import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.result.NavResult import com.ramcosta.composedestinations.result.ResultBackNavigator @@ -43,7 +45,6 @@ import net.mullvad.mullvadvpn.compose.component.ScaffoldWithSmallTopBar import net.mullvad.mullvadvpn.compose.component.drawVerticalScrollbar import net.mullvad.mullvadvpn.compose.constant.CommonContentKey import net.mullvad.mullvadvpn.compose.constant.ContentType -import net.mullvad.mullvadvpn.compose.destinations.DiscardChangesDialogDestination import net.mullvad.mullvadvpn.compose.state.CustomListLocationsUiState import net.mullvad.mullvadvpn.compose.test.CIRCULAR_PROGRESS_INDICATOR import net.mullvad.mullvadvpn.compose.test.SAVE_BUTTON_TEST_TAG @@ -68,7 +69,7 @@ private fun PreviewCustomListLocationScreen() { } @Composable -@Destination(style = SlideInFromRightTransition::class) +@Destination<RootGraph>(style = SlideInFromRightTransition::class) fun CustomListLocations( navigator: DestinationsNavigator, backNavigator: ResultBackNavigator<LocationsChanged>, 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 7611cfcf6b..8cdef9bd76 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 @@ -25,6 +25,9 @@ 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.annotation.RootGraph +import com.ramcosta.composedestinations.generated.destinations.CreateCustomListDestination +import com.ramcosta.composedestinations.generated.destinations.EditCustomListDestination import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.result.NavResult import com.ramcosta.composedestinations.result.ResultRecipient @@ -36,8 +39,7 @@ import net.mullvad.mullvadvpn.compose.component.MullvadCircularProgressIndicator import net.mullvad.mullvadvpn.compose.component.NavigateBackIconButton import net.mullvad.mullvadvpn.compose.component.ScaffoldWithMediumTopBar import net.mullvad.mullvadvpn.compose.constant.ContentType -import net.mullvad.mullvadvpn.compose.destinations.CreateCustomListDestination -import net.mullvad.mullvadvpn.compose.destinations.EditCustomListDestination +import net.mullvad.mullvadvpn.compose.extensions.dropUnlessResumed import net.mullvad.mullvadvpn.compose.extensions.itemsWithDivider import net.mullvad.mullvadvpn.compose.state.CustomListsUiState import net.mullvad.mullvadvpn.compose.test.CIRCULAR_PROGRESS_INDICATOR @@ -58,7 +60,7 @@ private fun PreviewCustomListsScreen() { } @Composable -@Destination(style = SlideInFromRightTransition::class) +@Destination<RootGraph>(style = SlideInFromRightTransition::class) fun CustomLists( navigator: DestinationsNavigator, editCustomListResultRecipient: ResultRecipient<EditCustomListDestination, Deleted> @@ -99,12 +101,12 @@ fun CustomLists( CreateCustomListDestination(), ) }, - openCustomList = { customList -> - navigator.navigate( - EditCustomListDestination(customListId = customList.id), - onlyIfResumed = true - ) - }, + openCustomList = + dropUnlessResumed { customList -> + navigator.navigate( + EditCustomListDestination(customListId = customList.id), + ) + }, 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 c6d8a06d20..1ea7d9e80c 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 @@ -33,8 +33,11 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.dropUnlessResumed import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.generated.destinations.LoginDestination +import com.ramcosta.composedestinations.generated.destinations.RemoveDeviceConfirmationDialogDestination +import com.ramcosta.composedestinations.generated.destinations.SettingsDestination import com.ramcosta.composedestinations.navigation.DestinationsNavigator -import com.ramcosta.composedestinations.navigation.popUpTo import com.ramcosta.composedestinations.result.NavResult import com.ramcosta.composedestinations.result.ResultRecipient import kotlinx.coroutines.launch @@ -46,9 +49,7 @@ import net.mullvad.mullvadvpn.compose.component.MullvadCircularProgressIndicator import net.mullvad.mullvadvpn.compose.component.MullvadCircularProgressIndicatorMedium import net.mullvad.mullvadvpn.compose.component.ScaffoldWithTopBar import net.mullvad.mullvadvpn.compose.component.drawVerticalScrollbar -import net.mullvad.mullvadvpn.compose.destinations.LoginDestination -import net.mullvad.mullvadvpn.compose.destinations.RemoveDeviceConfirmationDialogDestination -import net.mullvad.mullvadvpn.compose.destinations.SettingsDestination +import net.mullvad.mullvadvpn.compose.extensions.dropUnlessResumed import net.mullvad.mullvadvpn.compose.preview.DeviceListPreviewParameterProvider import net.mullvad.mullvadvpn.compose.state.DeviceItemUiState import net.mullvad.mullvadvpn.compose.state.DeviceListUiState @@ -102,7 +103,7 @@ private fun PreviewDeviceListError() { } } -@Destination(style = DefaultTransition::class) +@Destination<RootGraph>(style = DefaultTransition::class) @Composable fun DeviceList( navigator: DestinationsNavigator, @@ -157,9 +158,10 @@ fun DeviceList( }, onSettingsClicked = dropUnlessResumed { navigator.navigate(SettingsDestination) }, onTryAgainClicked = viewModel::fetchDevices, - navigateToRemoveDeviceConfirmationDialog = { - navigator.navigate(RemoveDeviceConfirmationDialogDestination(it), onlyIfResumed = true) - } + navigateToRemoveDeviceConfirmationDialog = + dropUnlessResumed<Device> { + navigator.navigate(RemoveDeviceConfirmationDialogDestination(it)) + } ) } 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 ac43424383..c7d5ce2134 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 @@ -23,14 +23,14 @@ 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.annotation.RootGraph +import com.ramcosta.composedestinations.generated.NavGraphs +import com.ramcosta.composedestinations.generated.destinations.LoginDestination +import com.ramcosta.composedestinations.generated.destinations.SettingsDestination import com.ramcosta.composedestinations.navigation.DestinationsNavigator -import com.ramcosta.composedestinations.navigation.popUpTo import net.mullvad.mullvadvpn.R -import net.mullvad.mullvadvpn.compose.NavGraphs import net.mullvad.mullvadvpn.compose.button.DeviceRevokedLoginButton import net.mullvad.mullvadvpn.compose.component.ScaffoldWithTopBar -import net.mullvad.mullvadvpn.compose.destinations.LoginDestination -import net.mullvad.mullvadvpn.compose.destinations.SettingsDestination import net.mullvad.mullvadvpn.compose.state.DeviceRevokedUiState import net.mullvad.mullvadvpn.compose.util.LaunchedEffectCollect import net.mullvad.mullvadvpn.lib.theme.AppTheme @@ -45,7 +45,7 @@ private fun PreviewDeviceRevokedScreen() { AppTheme { DeviceRevokedScreen(state = DeviceRevokedUiState.SECURED) } } -@Destination +@Destination<RootGraph> @Composable fun DeviceRevoked(navigator: DestinationsNavigator) { val viewModel = koinViewModel<DeviceRevokedViewModel>() diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/EditApiAccessMethodScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/EditApiAccessMethodScreen.kt index c6576cf21d..3d2926b90c 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/EditApiAccessMethodScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/EditApiAccessMethodScreen.kt @@ -32,6 +32,9 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.generated.destinations.DiscardChangesDialogDestination +import com.ramcosta.composedestinations.generated.destinations.SaveApiAccessMethodDestination import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.result.ResultBackNavigator import com.ramcosta.composedestinations.result.ResultRecipient @@ -46,8 +49,6 @@ import net.mullvad.mullvadvpn.compose.component.NavigateCloseIconButton import net.mullvad.mullvadvpn.compose.component.ScaffoldWithSmallTopBar import net.mullvad.mullvadvpn.compose.component.drawVerticalScrollbar import net.mullvad.mullvadvpn.compose.component.textResource -import net.mullvad.mullvadvpn.compose.destinations.DiscardChangesDialogDestination -import net.mullvad.mullvadvpn.compose.destinations.SaveApiAccessMethodDestination import net.mullvad.mullvadvpn.compose.preview.EditApiAccessMethodUiStateParameterProvider import net.mullvad.mullvadvpn.compose.state.ApiAccessMethodTypes import net.mullvad.mullvadvpn.compose.state.EditApiAccessFormData @@ -82,7 +83,7 @@ private fun PreviewEditApiAccessMethodScreen( AppTheme { EditApiAccessMethodScreen(state = state) } } -@Destination(style = SlideInFromRightTransition::class) +@Destination<RootGraph>(style = SlideInFromRightTransition::class) @Composable fun EditApiAccessMethod( navigator: DestinationsNavigator, 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 779fd06b41..341c8e9f16 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 @@ -23,6 +23,10 @@ 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.annotation.RootGraph +import com.ramcosta.composedestinations.generated.destinations.CustomListLocationsDestination +import com.ramcosta.composedestinations.generated.destinations.DeleteCustomListDestination +import com.ramcosta.composedestinations.generated.destinations.EditCustomListNameDestination import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.result.NavResult import com.ramcosta.composedestinations.result.ResultBackNavigator @@ -34,9 +38,7 @@ import net.mullvad.mullvadvpn.compose.component.MullvadCircularProgressIndicator import net.mullvad.mullvadvpn.compose.component.NavigateBackIconButton import net.mullvad.mullvadvpn.compose.component.ScaffoldWithMediumTopBar import net.mullvad.mullvadvpn.compose.component.SpacedColumn -import net.mullvad.mullvadvpn.compose.destinations.CustomListLocationsDestination -import net.mullvad.mullvadvpn.compose.destinations.DeleteCustomListDestination -import net.mullvad.mullvadvpn.compose.destinations.EditCustomListNameDestination +import net.mullvad.mullvadvpn.compose.extensions.dropUnlessResumed import net.mullvad.mullvadvpn.compose.state.EditCustomListState import net.mullvad.mullvadvpn.compose.test.CIRCULAR_PROGRESS_INDICATOR import net.mullvad.mullvadvpn.compose.test.DELETE_DROPDOWN_MENU_ITEM_TEST_TAG @@ -77,7 +79,7 @@ private fun PreviewEditCustomListScreen() { } @Composable -@Destination(style = SlideInFromRightTransition::class) +@Destination<RootGraph>(style = SlideInFromRightTransition::class) fun EditCustomList( navigator: DestinationsNavigator, backNavigator: ResultBackNavigator<Deleted>, @@ -97,26 +99,27 @@ fun EditCustomList( } val state by viewModel.uiState.collectAsStateWithLifecycle() + EditCustomListScreen( state = state, - onDeleteList = { name -> - navigator.navigate( - DeleteCustomListDestination(customListId = customListId, name = name), - onlyIfResumed = true - ) - }, - onNameClicked = { id, name -> - navigator.navigate( - EditCustomListNameDestination(customListId = id, initialName = name), - onlyIfResumed = true - ) - }, - onLocationsClicked = { - navigator.navigate( - CustomListLocationsDestination(customListId = it, newList = false), - onlyIfResumed = true - ) - }, + onDeleteList = + dropUnlessResumed { name -> + navigator.navigate( + DeleteCustomListDestination(customListId = customListId, name = name), + ) + }, + onNameClicked = + dropUnlessResumed { id, name -> + navigator.navigate( + EditCustomListNameDestination(customListId = id, initialName = name), + ) + }, + onLocationsClicked = + dropUnlessResumed { id -> + navigator.navigate( + CustomListLocationsDestination(customListId = id, newList = false), + ) + }, 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 4458f8b588..b9a551731c 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 @@ -29,6 +29,7 @@ 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.annotation.RootGraph import com.ramcosta.composedestinations.navigation.DestinationsNavigator import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.compose.button.ApplyButton @@ -67,7 +68,7 @@ private fun PreviewFilterScreen() { } } -@Destination(style = SlideInFromRightTransition::class) +@Destination<RootGraph>(style = SlideInFromRightTransition::class) @Composable fun FilterScreen(navigator: DestinationsNavigator) { val viewModel = koinViewModel<FilterViewModel>() 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 9e2813f59d..6623886578 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 @@ -23,6 +23,7 @@ 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.annotation.RootGraph import com.ramcosta.composedestinations.result.ResultBackNavigator import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.compose.component.MullvadSmallTopBar @@ -35,7 +36,7 @@ private fun PreviewImportOverridesByText() { ImportOverridesByTextScreen({}, {}) } -@Destination(style = DefaultTransition::class) +@Destination<RootGraph>(style = DefaultTransition::class) @Composable fun ImportOverridesByText( resultNavigator: ResultBackNavigator<String>, 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 80c30f6400..3cb51614c2 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 @@ -49,19 +49,19 @@ 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.annotation.RootGraph +import com.ramcosta.composedestinations.generated.NavGraphs +import com.ramcosta.composedestinations.generated.destinations.ConnectDestination +import com.ramcosta.composedestinations.generated.destinations.DeviceListDestination +import com.ramcosta.composedestinations.generated.destinations.OutOfTimeDestination +import com.ramcosta.composedestinations.generated.destinations.SettingsDestination +import com.ramcosta.composedestinations.generated.destinations.WelcomeDestination import com.ramcosta.composedestinations.navigation.DestinationsNavigator -import com.ramcosta.composedestinations.navigation.popUpTo import net.mullvad.mullvadvpn.R -import net.mullvad.mullvadvpn.compose.NavGraphs import net.mullvad.mullvadvpn.compose.button.PrimaryButton import net.mullvad.mullvadvpn.compose.button.VariantButton import net.mullvad.mullvadvpn.compose.component.MullvadCircularProgressIndicatorLarge import net.mullvad.mullvadvpn.compose.component.ScaffoldWithTopBar -import net.mullvad.mullvadvpn.compose.destinations.ConnectDestination -import net.mullvad.mullvadvpn.compose.destinations.DeviceListDestination -import net.mullvad.mullvadvpn.compose.destinations.OutOfTimeDestination -import net.mullvad.mullvadvpn.compose.destinations.SettingsDestination -import net.mullvad.mullvadvpn.compose.destinations.WelcomeDestination import net.mullvad.mullvadvpn.compose.state.LoginError import net.mullvad.mullvadvpn.compose.state.LoginState import net.mullvad.mullvadvpn.compose.state.LoginState.Idle @@ -111,7 +111,7 @@ private fun PreviewLoginSuccess() { AppTheme { LoginScreen(state = LoginUiState(loginState = Success)) } } -@Destination(style = LoginTransition::class) +@Destination<RootGraph>(style = LoginTransition::class) @Composable fun Login( navigator: DestinationsNavigator, diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/MullvadApp.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/MullvadApp.kt index e2ee4cc240..89d96f0189 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/MullvadApp.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/MullvadApp.kt @@ -10,17 +10,15 @@ import androidx.compose.ui.semantics.semantics import androidx.compose.ui.semantics.testTagsAsResourceId import androidx.navigation.NavHostController import com.ramcosta.composedestinations.DestinationsNavHost -import com.ramcosta.composedestinations.navigation.navigate -import com.ramcosta.composedestinations.navigation.popBackStack +import com.ramcosta.composedestinations.generated.NavGraphs +import com.ramcosta.composedestinations.generated.destinations.ChangelogDestination +import com.ramcosta.composedestinations.generated.destinations.ConnectDestination +import com.ramcosta.composedestinations.generated.destinations.NoDaemonScreenDestination +import com.ramcosta.composedestinations.generated.destinations.OutOfTimeDestination import com.ramcosta.composedestinations.rememberNavHostEngine import com.ramcosta.composedestinations.utils.destination import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map -import net.mullvad.mullvadvpn.compose.NavGraphs -import net.mullvad.mullvadvpn.compose.destinations.ChangelogDestination -import net.mullvad.mullvadvpn.compose.destinations.ConnectDestination -import net.mullvad.mullvadvpn.compose.destinations.NoDaemonScreenDestination -import net.mullvad.mullvadvpn.compose.destinations.OutOfTimeDestination import net.mullvad.mullvadvpn.compose.util.LaunchedEffectCollect import net.mullvad.mullvadvpn.compose.util.RequestVpnPermission import net.mullvad.mullvadvpn.viewmodel.ChangelogViewModel 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 82ae16a208..863cb63258 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 @@ -24,10 +24,11 @@ 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.annotation.RootGraph +import com.ramcosta.composedestinations.generated.destinations.SettingsDestination import com.ramcosta.composedestinations.navigation.DestinationsNavigator import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.compose.component.ScaffoldWithTopBar -import net.mullvad.mullvadvpn.compose.destinations.SettingsDestination import net.mullvad.mullvadvpn.compose.transitions.DefaultTransition import net.mullvad.mullvadvpn.lib.theme.AppTheme import net.mullvad.mullvadvpn.lib.theme.Dimens @@ -41,7 +42,7 @@ private fun PreviewNoDaemonScreen() { } // Set this as the start destination of the default nav graph -@Destination(style = DefaultTransition::class) +@Destination<RootGraph>(style = DefaultTransition::class) @Composable fun NoDaemonScreen(navigator: DestinationsNavigator) { NoDaemonScreen(dropUnlessResumed { navigator.navigate(SettingsDestination) }) 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 58e5d4f8b3..b1a64ed6c2 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 @@ -25,25 +25,26 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.dropUnlessResumed import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.generated.NavGraphs +import com.ramcosta.composedestinations.generated.destinations.AccountDestination +import com.ramcosta.composedestinations.generated.destinations.ConnectDestination +import com.ramcosta.composedestinations.generated.destinations.PaymentDestination +import com.ramcosta.composedestinations.generated.destinations.RedeemVoucherDestination +import com.ramcosta.composedestinations.generated.destinations.SettingsDestination +import com.ramcosta.composedestinations.generated.destinations.VerificationPendingDialogDestination import com.ramcosta.composedestinations.navigation.DestinationsNavigator -import com.ramcosta.composedestinations.navigation.popUpTo import com.ramcosta.composedestinations.result.NavResult import com.ramcosta.composedestinations.result.ResultRecipient import net.mullvad.mullvadvpn.R -import net.mullvad.mullvadvpn.compose.NavGraphs import net.mullvad.mullvadvpn.compose.button.NegativeButton import net.mullvad.mullvadvpn.compose.button.RedeemVoucherButton import net.mullvad.mullvadvpn.compose.button.SitePaymentButton import net.mullvad.mullvadvpn.compose.component.PlayPayment import net.mullvad.mullvadvpn.compose.component.ScaffoldWithTopBarAndDeviceName import net.mullvad.mullvadvpn.compose.component.drawVerticalScrollbar -import net.mullvad.mullvadvpn.compose.destinations.AccountDestination -import net.mullvad.mullvadvpn.compose.destinations.ConnectDestination -import net.mullvad.mullvadvpn.compose.destinations.PaymentDestination -import net.mullvad.mullvadvpn.compose.destinations.RedeemVoucherDestination -import net.mullvad.mullvadvpn.compose.destinations.SettingsDestination -import net.mullvad.mullvadvpn.compose.destinations.VerificationPendingDialogDestination import net.mullvad.mullvadvpn.compose.extensions.createOpenAccountPageHook +import net.mullvad.mullvadvpn.compose.extensions.dropUnlessResumed import net.mullvad.mullvadvpn.compose.state.OutOfTimeUiState import net.mullvad.mullvadvpn.compose.test.OUT_OF_TIME_SCREEN_TITLE_TEST_TAG import net.mullvad.mullvadvpn.compose.transitions.HomeTransition @@ -107,7 +108,7 @@ private fun PreviewOutOfTimeScreenError() { } } -@Destination(style = HomeTransition::class) +@Destination<RootGraph>(style = HomeTransition::class) @Composable fun OutOfTime( navigator: DestinationsNavigator, @@ -155,12 +156,10 @@ fun OutOfTime( onSettingsClick = dropUnlessResumed { navigator.navigate(SettingsDestination) }, onAccountClick = dropUnlessResumed { navigator.navigate(AccountDestination) }, onDisconnectClick = vm::onDisconnectClick, - onPurchaseBillingProductClick = { productId -> - navigator.navigate(PaymentDestination(productId), onlyIfResumed = true) - }, - navigateToVerificationPendingDialog = { - navigator.navigate(VerificationPendingDialogDestination, onlyIfResumed = true) - } + onPurchaseBillingProductClick = + dropUnlessResumed { productId -> navigator.navigate(PaymentDestination(productId)) }, + navigateToVerificationPendingDialog = + dropUnlessResumed { navigator.navigate(VerificationPendingDialogDestination) } ) } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/PrivacyDisclaimerScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/PrivacyDisclaimerScreen.kt index 7ae7a464fc..b6ea4b1525 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/PrivacyDisclaimerScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/PrivacyDisclaimerScreen.kt @@ -35,19 +35,19 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.generated.NavGraphs +import com.ramcosta.composedestinations.generated.destinations.LoginDestination +import com.ramcosta.composedestinations.generated.destinations.SplashDestination import com.ramcosta.composedestinations.navigation.DestinationsNavigator -import com.ramcosta.composedestinations.navigation.popUpTo import kotlinx.coroutines.CancellationException import kotlinx.coroutines.launch import kotlinx.coroutines.withTimeout import net.mullvad.mullvadvpn.R -import net.mullvad.mullvadvpn.compose.NavGraphs import net.mullvad.mullvadvpn.compose.button.PrimaryButton import net.mullvad.mullvadvpn.compose.component.MullvadCircularProgressIndicatorMedium import net.mullvad.mullvadvpn.compose.component.ScaffoldWithTopBar import net.mullvad.mullvadvpn.compose.component.drawVerticalScrollbar -import net.mullvad.mullvadvpn.compose.destinations.LoginDestination -import net.mullvad.mullvadvpn.compose.destinations.SplashDestination import net.mullvad.mullvadvpn.compose.util.LaunchedEffectCollect import net.mullvad.mullvadvpn.compose.util.toDp import net.mullvad.mullvadvpn.constant.DAEMON_READY_TIMEOUT_MS @@ -74,7 +74,7 @@ private fun PreviewPrivacyDisclaimerScreen() { } } -@Destination +@Destination<RootGraph> @Composable fun PrivacyDisclaimer( navigator: DestinationsNavigator, 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 a464a573f7..bcb29a7f61 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 @@ -29,6 +29,9 @@ 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.annotation.RootGraph +import com.ramcosta.composedestinations.generated.destinations.ReportProblemNoEmailDialogDestination +import com.ramcosta.composedestinations.generated.destinations.ViewLogsDestination import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.result.NavResult import com.ramcosta.composedestinations.result.ResultRecipient @@ -38,8 +41,6 @@ import net.mullvad.mullvadvpn.compose.button.VariantButton import net.mullvad.mullvadvpn.compose.component.MullvadCircularProgressIndicatorLarge import net.mullvad.mullvadvpn.compose.component.NavigateBackIconButton import net.mullvad.mullvadvpn.compose.component.ScaffoldWithMediumTopBar -import net.mullvad.mullvadvpn.compose.destinations.ReportProblemNoEmailDialogDestination -import net.mullvad.mullvadvpn.compose.destinations.ViewLogsDestination import net.mullvad.mullvadvpn.compose.textfield.mullvadWhiteTextFieldColors import net.mullvad.mullvadvpn.compose.transitions.SlideInFromRightTransition import net.mullvad.mullvadvpn.compose.util.LaunchedEffectCollect @@ -94,7 +95,7 @@ private fun PreviewReportProblemErrorScreen() { } } -@Destination(style = SlideInFromRightTransition::class) +@Destination<RootGraph>(style = SlideInFromRightTransition::class) @Composable fun ReportProblem( navigator: DestinationsNavigator, 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 b10a41a070..3bf0266519 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 @@ -48,6 +48,13 @@ 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.annotation.RootGraph +import com.ramcosta.composedestinations.generated.destinations.CreateCustomListDestination +import com.ramcosta.composedestinations.generated.destinations.CustomListLocationsDestination +import com.ramcosta.composedestinations.generated.destinations.CustomListsDestination +import com.ramcosta.composedestinations.generated.destinations.DeleteCustomListDestination +import com.ramcosta.composedestinations.generated.destinations.EditCustomListNameDestination +import com.ramcosta.composedestinations.generated.destinations.FilterScreenDestination import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.result.NavResult import com.ramcosta.composedestinations.result.ResultBackNavigator @@ -73,12 +80,7 @@ import net.mullvad.mullvadvpn.compose.component.MullvadModalBottomSheet import net.mullvad.mullvadvpn.compose.component.MullvadSnackbar import net.mullvad.mullvadvpn.compose.component.drawVerticalScrollbar import net.mullvad.mullvadvpn.compose.constant.ContentType -import net.mullvad.mullvadvpn.compose.destinations.CreateCustomListDestination -import net.mullvad.mullvadvpn.compose.destinations.CustomListLocationsDestination -import net.mullvad.mullvadvpn.compose.destinations.CustomListsDestination -import net.mullvad.mullvadvpn.compose.destinations.DeleteCustomListDestination -import net.mullvad.mullvadvpn.compose.destinations.EditCustomListNameDestination -import net.mullvad.mullvadvpn.compose.destinations.FilterScreenDestination +import net.mullvad.mullvadvpn.compose.extensions.dropUnlessResumed import net.mullvad.mullvadvpn.compose.state.SelectLocationUiState import net.mullvad.mullvadvpn.compose.test.CIRCULAR_PROGRESS_INDICATOR import net.mullvad.mullvadvpn.compose.test.SELECT_LOCATION_CUSTOM_LIST_BOTTOM_SHEET_TEST_TAG @@ -131,7 +133,7 @@ private fun PreviewSelectLocationScreen() { } } -@Destination(style = SelectLocationTransition::class) +@Destination<RootGraph>(style = SelectLocationTransition::class) @Suppress("LongMethod") @Composable fun SelectLocation( @@ -203,38 +205,41 @@ fun SelectLocation( onSearchTermInput = vm::onSearchTermInput, onBackClick = dropUnlessResumed { backNavigator.navigateBack() }, onFilterClick = dropUnlessResumed { navigator.navigate(FilterScreenDestination) }, - onCreateCustomList = { relayItem -> - navigator.navigate( - CreateCustomListDestination(locationCode = relayItem?.id), - onlyIfResumed = true - ) - }, + onCreateCustomList = + dropUnlessResumed { relayItem -> + navigator.navigate( + CreateCustomListDestination(locationCode = relayItem?.id), + ) + }, 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 - ), - onlyIfResumed = true - ) - }, - onEditLocationsCustomList = { - navigator.navigate( - CustomListLocationsDestination(customListId = it.id, newList = false), - onlyIfResumed = true - ) - }, - onDeleteCustomList = { - navigator.navigate( - DeleteCustomListDestination(customListId = it.id, name = it.customListName), - onlyIfResumed = true - ) - } + onEditCustomListName = + dropUnlessResumed { customList: RelayItem.CustomList -> + navigator.navigate( + EditCustomListNameDestination( + customListId = customList.id, + initialName = customList.customListName + ), + ) + }, + onEditLocationsCustomList = + dropUnlessResumed { customList: RelayItem.CustomList -> + navigator.navigate( + CustomListLocationsDestination(customListId = customList.id, newList = false), + ) + }, + onDeleteCustomList = + dropUnlessResumed { customList: RelayItem.CustomList -> + navigator.navigate( + DeleteCustomListDestination( + customListId = customList.id, + name = customList.customListName + ), + ) + } ) } @@ -848,7 +853,7 @@ private fun CustomListSuccess.message(context: Context): String = } @Composable -private fun <D : DestinationSpec<*>, R : CustomListSuccess> ResultRecipient<D, R> +private fun <D : DestinationSpec, R : CustomListSuccess> ResultRecipient<D, R> .OnCustomListNavResult( snackbarHostState: SnackbarHostState, performAction: (action: CustomListAction) -> Unit 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 5a7c9be2a6..a067c1afb1 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 @@ -42,6 +42,10 @@ 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.annotation.RootGraph +import com.ramcosta.composedestinations.generated.destinations.ImportOverridesByTextDestination +import com.ramcosta.composedestinations.generated.destinations.ResetServerIpOverridesConfirmationDestination +import com.ramcosta.composedestinations.generated.destinations.ServerIpOverridesInfoDialogDestination import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.result.ResultRecipient import kotlinx.coroutines.launch @@ -55,9 +59,6 @@ import net.mullvad.mullvadvpn.compose.component.MullvadModalBottomSheet import net.mullvad.mullvadvpn.compose.component.MullvadSnackbar import net.mullvad.mullvadvpn.compose.component.NavigateBackIconButton import net.mullvad.mullvadvpn.compose.component.ScaffoldWithMediumTopBar -import net.mullvad.mullvadvpn.compose.destinations.ImportOverridesByTextDestination -import net.mullvad.mullvadvpn.compose.destinations.ResetServerIpOverridesConfirmationDestination -import net.mullvad.mullvadvpn.compose.destinations.ServerIpOverridesInfoDialogDestination import net.mullvad.mullvadvpn.compose.test.SERVER_IP_OVERRIDES_IMPORT_BY_FILE_TEST_TAG import net.mullvad.mullvadvpn.compose.test.SERVER_IP_OVERRIDES_IMPORT_BY_TEXT_TEST_TAG import net.mullvad.mullvadvpn.compose.test.SERVER_IP_OVERRIDE_IMPORT_TEST_TAG @@ -93,7 +94,7 @@ private fun PreviewServerIpOverridesScreen() { } } -@Destination(style = SlideInFromRightLeafTransition::class) +@Destination<RootGraph>(style = SlideInFromRightLeafTransition::class) @Composable fun ServerIpOverrides( navigator: DestinationsNavigator, 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 03d5ede06a..15852560c1 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 @@ -21,6 +21,11 @@ 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.annotation.RootGraph +import com.ramcosta.composedestinations.generated.destinations.ApiAccessListDestination +import com.ramcosta.composedestinations.generated.destinations.ReportProblemDestination +import com.ramcosta.composedestinations.generated.destinations.SplitTunnelingDestination +import com.ramcosta.composedestinations.generated.destinations.VpnSettingsDestination import com.ramcosta.composedestinations.navigation.DestinationsNavigator import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.compose.cell.DefaultExternalLinkView @@ -28,10 +33,6 @@ import net.mullvad.mullvadvpn.compose.cell.NavigationCellBody import net.mullvad.mullvadvpn.compose.cell.NavigationComposeCell import net.mullvad.mullvadvpn.compose.component.NavigateBackDownIconButton import net.mullvad.mullvadvpn.compose.component.ScaffoldWithMediumTopBar -import net.mullvad.mullvadvpn.compose.destinations.ApiAccessListDestination -import net.mullvad.mullvadvpn.compose.destinations.ReportProblemDestination -import net.mullvad.mullvadvpn.compose.destinations.SplitTunnelingDestination -import net.mullvad.mullvadvpn.compose.destinations.VpnSettingsDestination import net.mullvad.mullvadvpn.compose.extensions.itemWithDivider import net.mullvad.mullvadvpn.compose.state.SettingsUiState import net.mullvad.mullvadvpn.compose.test.LAZY_LIST_TEST_TAG @@ -61,7 +62,7 @@ private fun PreviewSettings() { } @OptIn(ExperimentalMaterial3Api::class) -@Destination(style = SettingsTransition::class) +@Destination<RootGraph>(style = SettingsTransition::class) @Composable fun Settings(navigator: DestinationsNavigator) { val vm = koinViewModel<SettingsViewModel>() diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SplashScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SplashScreen.kt index 2a024b7a0a..082763ce1b 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SplashScreen.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SplashScreen.kt @@ -19,17 +19,16 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import com.ramcosta.composedestinations.annotation.Destination -import com.ramcosta.composedestinations.annotation.RootNavGraph +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.generated.NavGraphs +import com.ramcosta.composedestinations.generated.destinations.ConnectDestination +import com.ramcosta.composedestinations.generated.destinations.DeviceRevokedDestination +import com.ramcosta.composedestinations.generated.destinations.LoginDestination +import com.ramcosta.composedestinations.generated.destinations.OutOfTimeDestination +import com.ramcosta.composedestinations.generated.destinations.PrivacyDisclaimerDestination import com.ramcosta.composedestinations.navigation.DestinationsNavigator -import com.ramcosta.composedestinations.navigation.popUpTo import net.mullvad.mullvadvpn.R -import net.mullvad.mullvadvpn.compose.NavGraphs import net.mullvad.mullvadvpn.compose.component.ScaffoldWithTopBar -import net.mullvad.mullvadvpn.compose.destinations.ConnectDestination -import net.mullvad.mullvadvpn.compose.destinations.DeviceRevokedDestination -import net.mullvad.mullvadvpn.compose.destinations.LoginDestination -import net.mullvad.mullvadvpn.compose.destinations.OutOfTimeDestination -import net.mullvad.mullvadvpn.compose.destinations.PrivacyDisclaimerDestination import net.mullvad.mullvadvpn.compose.transitions.DefaultTransition import net.mullvad.mullvadvpn.compose.util.CollectSideEffectWithLifecycle import net.mullvad.mullvadvpn.lib.theme.AppTheme @@ -46,8 +45,7 @@ private fun PreviewLoadingScreen() { } // Set this as the start destination of the default nav graph -@RootNavGraph(start = true) -@Destination(style = DefaultTransition::class) +@Destination<RootGraph>(start = true, style = DefaultTransition::class) @Composable fun Splash(navigator: DestinationsNavigator) { val viewModel: SplashViewModel = koinViewModel() 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 280cef1802..84a0e6fd9c 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 @@ -24,6 +24,7 @@ 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.annotation.RootGraph import com.ramcosta.composedestinations.navigation.DestinationsNavigator import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.applist.AppData @@ -85,7 +86,7 @@ private fun PreviewSplitTunnelingScreen() { } } -@Destination(style = SlideInFromRightTransition::class) +@Destination<RootGraph>(style = SlideInFromRightTransition::class) @Composable fun SplitTunneling(navigator: DestinationsNavigator) { val viewModel = koinViewModel<SplitTunnelingViewModel>() 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 fbb0ea82ce..c15c6826a3 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 @@ -30,6 +30,7 @@ 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.annotation.RootGraph import com.ramcosta.composedestinations.navigation.DestinationsNavigator import kotlinx.coroutines.launch import net.mullvad.mullvadvpn.R @@ -60,7 +61,7 @@ private fun PreviewViewLogsLoadingScreen() { AppTheme { ViewLogsScreen(state = ViewLogsUiState()) } } -@Destination(style = SlideInFromRightTransition::class) +@Destination<RootGraph>(style = SlideInFromRightTransition::class) @Composable fun ViewLogs(navigator: DestinationsNavigator) { val vm = koinViewModel<ViewLogsViewModel>() 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 5c3bf9bb77..bed832b554 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 @@ -33,6 +33,20 @@ import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.dropUnlessResumed import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.generated.destinations.AutoConnectAndLockdownModeDestination +import com.ramcosta.composedestinations.generated.destinations.ContentBlockersInfoDialogDestination +import com.ramcosta.composedestinations.generated.destinations.CustomDnsInfoDialogDestination +import com.ramcosta.composedestinations.generated.destinations.DnsDialogDestination +import com.ramcosta.composedestinations.generated.destinations.LocalNetworkSharingInfoDialogDestination +import com.ramcosta.composedestinations.generated.destinations.MalwareInfoDialogDestination +import com.ramcosta.composedestinations.generated.destinations.MtuDialogDestination +import com.ramcosta.composedestinations.generated.destinations.ObfuscationInfoDialogDestination +import com.ramcosta.composedestinations.generated.destinations.QuantumResistanceInfoDialogDestination +import com.ramcosta.composedestinations.generated.destinations.ServerIpOverridesDestination +import com.ramcosta.composedestinations.generated.destinations.UdpOverTcpPortInfoDialogDestination +import com.ramcosta.composedestinations.generated.destinations.WireguardCustomPortDialogDestination +import com.ramcosta.composedestinations.generated.destinations.WireguardPortInfoDialogDestination import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.result.ResultRecipient import kotlinx.coroutines.launch @@ -55,21 +69,9 @@ import net.mullvad.mullvadvpn.compose.communication.DnsDialogResult import net.mullvad.mullvadvpn.compose.component.NavigateBackIconButton import net.mullvad.mullvadvpn.compose.component.ScaffoldWithMediumTopBar import net.mullvad.mullvadvpn.compose.component.textResource -import net.mullvad.mullvadvpn.compose.destinations.AutoConnectAndLockdownModeDestination -import net.mullvad.mullvadvpn.compose.destinations.ContentBlockersInfoDialogDestination -import net.mullvad.mullvadvpn.compose.destinations.CustomDnsInfoDialogDestination -import net.mullvad.mullvadvpn.compose.destinations.DnsDialogDestination -import net.mullvad.mullvadvpn.compose.destinations.LocalNetworkSharingInfoDialogDestination -import net.mullvad.mullvadvpn.compose.destinations.MalwareInfoDialogDestination -import net.mullvad.mullvadvpn.compose.destinations.MtuDialogDestination -import net.mullvad.mullvadvpn.compose.destinations.ObfuscationInfoDialogDestination -import net.mullvad.mullvadvpn.compose.destinations.QuantumResistanceInfoDialogDestination -import net.mullvad.mullvadvpn.compose.destinations.ServerIpOverridesDestination -import net.mullvad.mullvadvpn.compose.destinations.UdpOverTcpPortInfoDialogDestination -import net.mullvad.mullvadvpn.compose.destinations.WireguardCustomPortDialogDestination -import net.mullvad.mullvadvpn.compose.destinations.WireguardPortInfoDialogDestination import net.mullvad.mullvadvpn.compose.dialog.WireguardCustomPortNavArgs import net.mullvad.mullvadvpn.compose.dialog.WireguardPortInfoDialogArgument +import net.mullvad.mullvadvpn.compose.extensions.dropUnlessResumed import net.mullvad.mullvadvpn.compose.extensions.itemWithDivider import net.mullvad.mullvadvpn.compose.extensions.itemsIndexedWithDivider import net.mullvad.mullvadvpn.compose.extensions.toAnnotatedString @@ -138,7 +140,7 @@ private fun PreviewVpnSettings() { } } -@Destination(style = SlideInFromRightTransition::class) +@Destination<RootGraph>(style = SlideInFromRightTransition::class) @Composable @Suppress("LongMethod") fun VpnSettings( @@ -214,12 +216,14 @@ fun VpnSettings( dropUnlessResumed { navigator.navigate(QuantumResistanceInfoDialogDestination) }, navigateUdp2TcpInfo = dropUnlessResumed { navigator.navigate(UdpOverTcpPortInfoDialogDestination) }, - navigateToWireguardPortInfo = { - navigator.navigate( - WireguardPortInfoDialogDestination(WireguardPortInfoDialogArgument(it)), - onlyIfResumed = true - ) - }, + navigateToWireguardPortInfo = + dropUnlessResumed { availablePortRanges: List<PortRange> -> + navigator.navigate( + WireguardPortInfoDialogDestination( + WireguardPortInfoDialogArgument(availablePortRanges) + ), + ) + }, navigateToLocalNetworkSharingInfo = dropUnlessResumed { navigator.navigate(LocalNetworkSharingInfoDialogDestination) }, navigateToServerIpOverrides = @@ -232,20 +236,21 @@ fun VpnSettings( onToggleBlockAdultContent = vm::onToggleBlockAdultContent, onToggleBlockGambling = vm::onToggleBlockGambling, onToggleBlockSocialMedia = vm::onToggleBlockSocialMedia, - navigateToMtuDialog = { - navigator.navigate(MtuDialogDestination(it), onlyIfResumed = true) - }, - navigateToDns = { index, address -> - navigator.navigate(DnsDialogDestination(index, address), onlyIfResumed = true) - }, - navigateToWireguardPortDialog = { - val args = - WireguardCustomPortNavArgs( - state.customWireguardPort?.toPortOrNull(), - state.availablePortRanges - ) - navigator.navigate(WireguardCustomPortDialogDestination(args), onlyIfResumed = true) - }, + navigateToMtuDialog = + dropUnlessResumed { mtu: Mtu? -> navigator.navigate(MtuDialogDestination(mtu)) }, + navigateToDns = + dropUnlessResumed { index: Int?, address: String? -> + navigator.navigate(DnsDialogDestination(index, address)) + }, + navigateToWireguardPortDialog = + dropUnlessResumed { + val args = + WireguardCustomPortNavArgs( + state.customWireguardPort?.toPortOrNull(), + state.availablePortRanges + ) + navigator.navigate(WireguardCustomPortDialogDestination(args)) + }, onToggleDnsClick = vm::onToggleCustomDns, onBackClick = dropUnlessResumed { navigator.navigateUp() }, onSelectObfuscationSetting = vm::onSelectObfuscationSetting, 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 f233358bfc..0c9e1244f3 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 @@ -29,12 +29,19 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.dropUnlessResumed import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootGraph +import com.ramcosta.composedestinations.generated.NavGraphs +import com.ramcosta.composedestinations.generated.destinations.AccountDestination +import com.ramcosta.composedestinations.generated.destinations.ConnectDestination +import com.ramcosta.composedestinations.generated.destinations.DeviceNameInfoDialogDestination +import com.ramcosta.composedestinations.generated.destinations.PaymentDestination +import com.ramcosta.composedestinations.generated.destinations.RedeemVoucherDestination +import com.ramcosta.composedestinations.generated.destinations.SettingsDestination +import com.ramcosta.composedestinations.generated.destinations.VerificationPendingDialogDestination import com.ramcosta.composedestinations.navigation.DestinationsNavigator -import com.ramcosta.composedestinations.navigation.popUpTo import com.ramcosta.composedestinations.result.NavResult import com.ramcosta.composedestinations.result.ResultRecipient import net.mullvad.mullvadvpn.R -import net.mullvad.mullvadvpn.compose.NavGraphs import net.mullvad.mullvadvpn.compose.button.NegativeButton import net.mullvad.mullvadvpn.compose.button.RedeemVoucherButton import net.mullvad.mullvadvpn.compose.button.SitePaymentButton @@ -42,14 +49,8 @@ import net.mullvad.mullvadvpn.compose.component.CopyAnimatedIconButton import net.mullvad.mullvadvpn.compose.component.PlayPayment import net.mullvad.mullvadvpn.compose.component.ScaffoldWithTopBar import net.mullvad.mullvadvpn.compose.component.drawVerticalScrollbar -import net.mullvad.mullvadvpn.compose.destinations.AccountDestination -import net.mullvad.mullvadvpn.compose.destinations.ConnectDestination -import net.mullvad.mullvadvpn.compose.destinations.DeviceNameInfoDialogDestination -import net.mullvad.mullvadvpn.compose.destinations.PaymentDestination -import net.mullvad.mullvadvpn.compose.destinations.RedeemVoucherDestination -import net.mullvad.mullvadvpn.compose.destinations.SettingsDestination -import net.mullvad.mullvadvpn.compose.destinations.VerificationPendingDialogDestination import net.mullvad.mullvadvpn.compose.extensions.createOpenAccountPageHook +import net.mullvad.mullvadvpn.compose.extensions.dropUnlessResumed import net.mullvad.mullvadvpn.compose.state.PaymentState import net.mullvad.mullvadvpn.compose.state.WelcomeUiState import net.mullvad.mullvadvpn.compose.transitions.HomeTransition @@ -96,7 +97,7 @@ private fun PreviewWelcomeScreen() { } } -@Destination(style = HomeTransition::class) +@Destination<RootGraph>(style = HomeTransition::class) @Composable fun Welcome( navigator: DestinationsNavigator, @@ -151,9 +152,8 @@ fun Welcome( onAccountClick = dropUnlessResumed { navigator.navigate(AccountDestination) }, navigateToDeviceInfoDialog = dropUnlessResumed { navigator.navigate(DeviceNameInfoDialogDestination) }, - onPurchaseBillingProductClick = { productId -> - navigator.navigate(PaymentDestination(productId), onlyIfResumed = true) - }, + onPurchaseBillingProductClick = + dropUnlessResumed { productId -> navigator.navigate(PaymentDestination(productId)) }, onDisconnectClick = vm::onDisconnectClick, navigateToVerificationPendingDialog = dropUnlessResumed { navigator.navigate(VerificationPendingDialogDestination) } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/DefaultTransition.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/DefaultTransition.kt index 4c02b278d0..fa2211ad32 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/DefaultTransition.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/DefaultTransition.kt @@ -1,17 +1,35 @@ package net.mullvad.mullvadvpn.compose.transitions import androidx.compose.animation.AnimatedContentTransitionScope +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.navigation.NavBackStackEntry import com.ramcosta.composedestinations.spec.DestinationStyle -object DefaultTransition : DestinationStyle.Animated { - override fun AnimatedContentTransitionScope<NavBackStackEntry>.enterTransition() = fadeIn() +object DefaultTransition : DestinationStyle.Animated() { + override val enterTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition = + { + fadeIn() + } - override fun AnimatedContentTransitionScope<NavBackStackEntry>.exitTransition() = fadeOut() + override val exitTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition = + { + fadeOut() + } - override fun AnimatedContentTransitionScope<NavBackStackEntry>.popEnterTransition() = fadeIn() + override val popEnterTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition = + { + fadeIn() + } - override fun AnimatedContentTransitionScope<NavBackStackEntry>.popExitTransition() = fadeOut() + override val popExitTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition = + { + fadeOut() + } } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/HomeTransition.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/HomeTransition.kt index 93c94ecd87..64fea22ae5 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/HomeTransition.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/HomeTransition.kt @@ -2,30 +2,45 @@ package net.mullvad.mullvadvpn.compose.transitions import androidx.compose.animation.AnimatedContentTransitionScope import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition import androidx.compose.animation.core.snap import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.navigation.NavBackStackEntry +import com.ramcosta.composedestinations.generated.destinations.LoginDestination import com.ramcosta.composedestinations.spec.DestinationStyle import com.ramcosta.composedestinations.utils.destination -import net.mullvad.mullvadvpn.compose.destinations.LoginDestination import net.mullvad.mullvadvpn.constant.SCREEN_ANIMATION_TIME_MILLIS // This is used for OutOfTime, Welcome, and Connect destinations. -object HomeTransition : DestinationStyle.Animated { - override fun AnimatedContentTransitionScope<NavBackStackEntry>.enterTransition() = - when (this.initialState.destination()) { - is LoginDestination -> fadeIn() - else -> EnterTransition.None +object HomeTransition : DestinationStyle.Animated() { + + override val enterTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition = + { + when (this.initialState.destination()) { + is LoginDestination -> fadeIn() + else -> EnterTransition.None + } } // TODO temporary hack until we have a proper solution. // https://issuetracker.google.com/issues/309506799 - override fun AnimatedContentTransitionScope<NavBackStackEntry>.exitTransition() = - fadeOut(snap(SCREEN_ANIMATION_TIME_MILLIS)) + override val exitTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition = + { + fadeOut(snap(SCREEN_ANIMATION_TIME_MILLIS)) + } - override fun AnimatedContentTransitionScope<NavBackStackEntry>.popEnterTransition() = - EnterTransition.None + override val popEnterTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition = + { + EnterTransition.None + } - override fun AnimatedContentTransitionScope<NavBackStackEntry>.popExitTransition() = fadeOut() + override val popExitTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition = + { + fadeOut() + } } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/LoginTransition.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/LoginTransition.kt index 737f369873..86c6f3f0dd 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/LoginTransition.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/LoginTransition.kt @@ -1,33 +1,50 @@ package net.mullvad.mullvadvpn.compose.transitions import androidx.compose.animation.AnimatedContentTransitionScope +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition import androidx.compose.animation.core.snap import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.navigation.NavBackStackEntry +import com.ramcosta.composedestinations.generated.destinations.ConnectDestination +import com.ramcosta.composedestinations.generated.destinations.DeviceListDestination +import com.ramcosta.composedestinations.generated.destinations.OutOfTimeDestination +import com.ramcosta.composedestinations.generated.destinations.WelcomeDestination import com.ramcosta.composedestinations.spec.DestinationStyle import com.ramcosta.composedestinations.utils.destination -import net.mullvad.mullvadvpn.compose.destinations.ConnectDestination -import net.mullvad.mullvadvpn.compose.destinations.DeviceListDestination -import net.mullvad.mullvadvpn.compose.destinations.OutOfTimeDestination -import net.mullvad.mullvadvpn.compose.destinations.WelcomeDestination import net.mullvad.mullvadvpn.constant.SCREEN_ANIMATION_TIME_MILLIS -object LoginTransition : DestinationStyle.Animated { - override fun AnimatedContentTransitionScope<NavBackStackEntry>.enterTransition() = fadeIn() +object LoginTransition : DestinationStyle.Animated() { + override val enterTransition: + (AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition) = + { + fadeIn() + } // TODO temporary hack until we have a proper solution. // https://issuetracker.google.com/issues/309506799 - override fun AnimatedContentTransitionScope<NavBackStackEntry>.exitTransition() = - when (this.targetState.destination()) { - is OutOfTimeDestination, - is WelcomeDestination, - is ConnectDestination, - is DeviceListDestination -> fadeOut() - else -> fadeOut(snap(SCREEN_ANIMATION_TIME_MILLIS)) + override val exitTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition = + { + when (this.targetState.destination()) { + is OutOfTimeDestination, + is WelcomeDestination, + is ConnectDestination, + is DeviceListDestination -> fadeOut() + else -> fadeOut(snap(SCREEN_ANIMATION_TIME_MILLIS)) + } } - override fun AnimatedContentTransitionScope<NavBackStackEntry>.popEnterTransition() = fadeIn() + override val popEnterTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition = + { + fadeIn() + } - override fun AnimatedContentTransitionScope<NavBackStackEntry>.popExitTransition() = fadeOut() + override val popExitTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition = + { + fadeOut() + } } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/SettingsTransition.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/SettingsTransition.kt index 75fb7286fc..1ec4034281 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/SettingsTransition.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/SettingsTransition.kt @@ -1,6 +1,8 @@ package net.mullvad.mullvadvpn.compose.transitions import androidx.compose.animation.AnimatedContentTransitionScope +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition import androidx.compose.animation.core.snap import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut @@ -9,28 +11,41 @@ import androidx.compose.animation.slideInVertically import androidx.compose.animation.slideOutHorizontally import androidx.compose.animation.slideOutVertically import androidx.navigation.NavBackStackEntry +import com.ramcosta.composedestinations.generated.destinations.NoDaemonScreenDestination import com.ramcosta.composedestinations.spec.DestinationStyle import com.ramcosta.composedestinations.utils.destination -import net.mullvad.mullvadvpn.compose.destinations.NoDaemonScreenDestination import net.mullvad.mullvadvpn.constant.SCREEN_ANIMATION_TIME_MILLIS import net.mullvad.mullvadvpn.constant.withHorizontalScalingFactor -object SettingsTransition : DestinationStyle.Animated { - override fun AnimatedContentTransitionScope<NavBackStackEntry>.enterTransition() = - slideInVertically(initialOffsetY = { it }) +object SettingsTransition : DestinationStyle.Animated() { - override fun AnimatedContentTransitionScope<NavBackStackEntry>.exitTransition() = - when (targetState.destination()) { - NoDaemonScreenDestination -> fadeOut(snap(SCREEN_ANIMATION_TIME_MILLIS)) - else -> slideOutHorizontally(targetOffsetX = { -it.withHorizontalScalingFactor() }) + override val enterTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition = + { + slideInVertically(initialOffsetY = { it }) } - override fun AnimatedContentTransitionScope<NavBackStackEntry>.popEnterTransition() = - when (initialState.destination()) { - NoDaemonScreenDestination -> fadeIn(snap(0)) - else -> slideInHorizontally(initialOffsetX = { -it.withHorizontalScalingFactor() }) + override val exitTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition = + { + when (targetState.destination()) { + NoDaemonScreenDestination -> fadeOut(snap(SCREEN_ANIMATION_TIME_MILLIS)) + else -> slideOutHorizontally(targetOffsetX = { -it.withHorizontalScalingFactor() }) + } } - override fun AnimatedContentTransitionScope<NavBackStackEntry>.popExitTransition() = - slideOutVertically(targetOffsetY = { it }) + override val popEnterTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition = + { + when (initialState.destination()) { + NoDaemonScreenDestination -> fadeIn(snap(0)) + else -> slideInHorizontally(initialOffsetX = { -it.withHorizontalScalingFactor() }) + } + } + + override val popExitTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition = + { + slideOutVertically(targetOffsetY = { it }) + } } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/SlideInFromBottomTransition.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/SlideInFromBottomTransition.kt index da802483b5..14dde875d7 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/SlideInFromBottomTransition.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/SlideInFromBottomTransition.kt @@ -1,6 +1,8 @@ package net.mullvad.mullvadvpn.compose.transitions import androidx.compose.animation.AnimatedContentTransitionScope +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition import androidx.compose.animation.core.snap import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut @@ -9,50 +11,74 @@ import androidx.compose.animation.slideInVertically import androidx.compose.animation.slideOutHorizontally import androidx.compose.animation.slideOutVertically import androidx.navigation.NavBackStackEntry +import com.ramcosta.composedestinations.generated.destinations.NoDaemonScreenDestination import com.ramcosta.composedestinations.spec.DestinationStyle import com.ramcosta.composedestinations.utils.destination -import net.mullvad.mullvadvpn.compose.destinations.NoDaemonScreenDestination import net.mullvad.mullvadvpn.constant.SCREEN_ANIMATION_TIME_MILLIS import net.mullvad.mullvadvpn.constant.withHorizontalScalingFactor -object SlideInFromBottomTransition : DestinationStyle.Animated { - override fun AnimatedContentTransitionScope<NavBackStackEntry>.enterTransition() = - slideInVertically(initialOffsetY = { it }) +object SlideInFromBottomTransition : DestinationStyle.Animated() { + override val enterTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition? = + { + slideInVertically(initialOffsetY = { it }) + } - override fun AnimatedContentTransitionScope<NavBackStackEntry>.exitTransition() = - when (targetState.destination()) { - NoDaemonScreenDestination -> fadeOut(snap(SCREEN_ANIMATION_TIME_MILLIS)) - else -> fadeOut() + override val exitTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition? = + { + when (targetState.destination()) { + NoDaemonScreenDestination -> fadeOut(snap(SCREEN_ANIMATION_TIME_MILLIS)) + else -> fadeOut() + } } - override fun AnimatedContentTransitionScope<NavBackStackEntry>.popEnterTransition() = - when (initialState.destination()) { - NoDaemonScreenDestination -> fadeIn(snap(0)) - else -> fadeIn() + override val popEnterTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition = + { + when (initialState.destination()) { + NoDaemonScreenDestination -> fadeIn(snap(0)) + else -> fadeIn() + } } - override fun AnimatedContentTransitionScope<NavBackStackEntry>.popExitTransition() = - slideOutVertically(targetOffsetY = { it }) + override val popExitTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition = + { + slideOutVertically(targetOffsetY = { it }) + } } -object SelectLocationTransition : DestinationStyle.Animated { - override fun AnimatedContentTransitionScope<NavBackStackEntry>.enterTransition() = - slideInVertically(initialOffsetY = { it }) +object SelectLocationTransition : DestinationStyle.Animated() { + override val enterTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition = + { + slideInVertically(initialOffsetY = { it }) + } // TODO temporary hack until we have a proper solution. // https://issuetracker.google.com/issues/309506799 - override fun AnimatedContentTransitionScope<NavBackStackEntry>.exitTransition() = - when (targetState.destination()) { - NoDaemonScreenDestination -> fadeOut(snap(SCREEN_ANIMATION_TIME_MILLIS)) - else -> slideOutHorizontally { -it.withHorizontalScalingFactor() } + override val exitTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition = + { + when (targetState.destination()) { + NoDaemonScreenDestination -> fadeOut(snap(SCREEN_ANIMATION_TIME_MILLIS)) + else -> slideOutHorizontally { -it.withHorizontalScalingFactor() } + } } - override fun AnimatedContentTransitionScope<NavBackStackEntry>.popEnterTransition() = - when (initialState.destination()) { - NoDaemonScreenDestination -> fadeIn(snap(0)) - else -> slideInHorizontally { -it.withHorizontalScalingFactor() } + override val popEnterTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition = + { + when (initialState.destination()) { + NoDaemonScreenDestination -> fadeIn(snap(0)) + else -> slideInHorizontally { -it.withHorizontalScalingFactor() } + } } - override fun AnimatedContentTransitionScope<NavBackStackEntry>.popExitTransition() = - slideOutVertically(targetOffsetY = { it }) + override val popExitTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition? = + { + slideOutVertically(targetOffsetY = { it }) + } } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/SlideInFromRightLeafTransition.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/SlideInFromRightLeafTransition.kt index 45ea74931a..670877dfaa 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/SlideInFromRightLeafTransition.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/SlideInFromRightLeafTransition.kt @@ -1,30 +1,44 @@ package net.mullvad.mullvadvpn.compose.transitions import androidx.compose.animation.AnimatedContentTransitionScope +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition import androidx.compose.animation.core.snap import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.slideInHorizontally import androidx.compose.animation.slideOutHorizontally import androidx.navigation.NavBackStackEntry +import com.ramcosta.composedestinations.generated.destinations.NoDaemonScreenDestination import com.ramcosta.composedestinations.spec.DestinationStyle import com.ramcosta.composedestinations.utils.destination -import net.mullvad.mullvadvpn.compose.destinations.NoDaemonScreenDestination import net.mullvad.mullvadvpn.constant.SCREEN_ANIMATION_TIME_MILLIS -object SlideInFromRightLeafTransition : DestinationStyle.Animated { - override fun AnimatedContentTransitionScope<NavBackStackEntry>.enterTransition() = - slideInHorizontally(initialOffsetX = { it }) +object SlideInFromRightLeafTransition : DestinationStyle.Animated() { + override val enterTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition = + { + slideInHorizontally(initialOffsetX = { it }) + } - override fun AnimatedContentTransitionScope<NavBackStackEntry>.exitTransition() = - when (targetState.destination()) { - NoDaemonScreenDestination -> fadeOut(snap(SCREEN_ANIMATION_TIME_MILLIS)) - else -> fadeOut() + override val exitTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition = + { + when (targetState.destination()) { + NoDaemonScreenDestination -> fadeOut(snap(SCREEN_ANIMATION_TIME_MILLIS)) + else -> fadeOut() + } } - override fun AnimatedContentTransitionScope<NavBackStackEntry>.popEnterTransition() = - fadeIn(snap(0)) + override val popEnterTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition = + { + fadeIn(snap(0)) + } - override fun AnimatedContentTransitionScope<NavBackStackEntry>.popExitTransition() = - slideOutHorizontally(targetOffsetX = { it }) + override val popExitTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition = + { + slideOutHorizontally(targetOffsetX = { it }) + } } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/SlideInFromRightTransition.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/SlideInFromRightTransition.kt index 69baa8eb47..6ff49210f6 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/SlideInFromRightTransition.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/SlideInFromRightTransition.kt @@ -1,34 +1,48 @@ package net.mullvad.mullvadvpn.compose.transitions import androidx.compose.animation.AnimatedContentTransitionScope +import androidx.compose.animation.EnterTransition +import androidx.compose.animation.ExitTransition import androidx.compose.animation.core.snap import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.slideInHorizontally import androidx.compose.animation.slideOutHorizontally import androidx.navigation.NavBackStackEntry +import com.ramcosta.composedestinations.generated.destinations.NoDaemonScreenDestination import com.ramcosta.composedestinations.spec.DestinationStyle import com.ramcosta.composedestinations.utils.destination -import net.mullvad.mullvadvpn.compose.destinations.NoDaemonScreenDestination import net.mullvad.mullvadvpn.constant.SCREEN_ANIMATION_TIME_MILLIS import net.mullvad.mullvadvpn.constant.withHorizontalScalingFactor -object SlideInFromRightTransition : DestinationStyle.Animated { - override fun AnimatedContentTransitionScope<NavBackStackEntry>.enterTransition() = - slideInHorizontally(initialOffsetX = { it }) +object SlideInFromRightTransition : DestinationStyle.Animated() { + override val enterTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition = + { + slideInHorizontally(initialOffsetX = { it }) + } - override fun AnimatedContentTransitionScope<NavBackStackEntry>.exitTransition() = - when (targetState.destination()) { - NoDaemonScreenDestination -> fadeOut(snap(SCREEN_ANIMATION_TIME_MILLIS)) - else -> slideOutHorizontally(targetOffsetX = { -it.withHorizontalScalingFactor() }) + override val exitTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition = + { + when (targetState.destination()) { + NoDaemonScreenDestination -> fadeOut(snap(SCREEN_ANIMATION_TIME_MILLIS)) + else -> slideOutHorizontally(targetOffsetX = { -it.withHorizontalScalingFactor() }) + } } - override fun AnimatedContentTransitionScope<NavBackStackEntry>.popEnterTransition() = - when (initialState.destination()) { - NoDaemonScreenDestination -> fadeIn(snap(0)) - else -> slideInHorizontally(initialOffsetX = { -it.withHorizontalScalingFactor() }) + override val popEnterTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition = + { + when (initialState.destination()) { + NoDaemonScreenDestination -> fadeIn(snap(0)) + else -> slideInHorizontally(initialOffsetX = { -it.withHorizontalScalingFactor() }) + } } - override fun AnimatedContentTransitionScope<NavBackStackEntry>.popExitTransition() = - slideOutHorizontally(targetOffsetX = { it }) + override val popExitTransition: + AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition = + { + slideOutHorizontally(targetOffsetX = { it }) + } } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/util/Navigation.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/util/Navigation.kt index 231c739500..0d08e331e9 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/util/Navigation.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/util/Navigation.kt @@ -7,7 +7,7 @@ import com.ramcosta.composedestinations.result.ResultRecipient import com.ramcosta.composedestinations.spec.DestinationSpec @Composable -fun <D : DestinationSpec<*>, V> ResultRecipient<D, V>.OnNavResultValue( +fun <D : DestinationSpec, V> ResultRecipient<D, V>.OnNavResultValue( onValue: @DisallowComposableCalls (value: V) -> Unit ) = onNavResult { when (it) { diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/NoDaemonViewModel.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/NoDaemonViewModel.kt index f8863f2433..d0c7e4113d 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/NoDaemonViewModel.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/NoDaemonViewModel.kt @@ -8,6 +8,8 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.navigation.NavController import androidx.navigation.NavDestination +import com.ramcosta.composedestinations.generated.destinations.PrivacyDisclaimerDestination +import com.ramcosta.composedestinations.generated.destinations.SplashDestination import com.ramcosta.composedestinations.spec.DestinationSpec import com.ramcosta.composedestinations.utils.destination import kotlin.time.Duration.Companion.seconds @@ -20,8 +22,6 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.launch -import net.mullvad.mullvadvpn.compose.destinations.PrivacyDisclaimerDestination -import net.mullvad.mullvadvpn.compose.destinations.SplashDestination import net.mullvad.mullvadvpn.lib.daemon.grpc.GrpcConnectivityState import net.mullvad.mullvadvpn.lib.daemon.grpc.ManagementService @@ -31,7 +31,7 @@ class NoDaemonViewModel(managementService: ManagementService) : ViewModel(), LifecycleEventObserver, NavController.OnDestinationChangedListener { private val lifecycleFlow: MutableSharedFlow<Lifecycle.Event> = MutableSharedFlow() - private val destinationFlow: MutableSharedFlow<DestinationSpec<*>> = MutableSharedFlow() + private val destinationFlow: MutableSharedFlow<DestinationSpec> = MutableSharedFlow() @OptIn(FlowPreview::class) val uiSideEffect = @@ -67,7 +67,7 @@ class NoDaemonViewModel(managementService: ManagementService) : private fun toDaemonState( lifecycleEvent: Lifecycle.Event, serviceState: GrpcConnectivityState, - currentDestination: DestinationSpec<*> + currentDestination: DestinationSpec ): DaemonState { // In these destinations we don't care about showing the NoDaemonScreen if (currentDestination in noServiceDestinations) { |
