summaryrefslogtreecommitdiffhomepage
path: root/android/app/src
diff options
context:
space:
mode:
Diffstat (limited to 'android/app/src')
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ApiAccessMethodInfoDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ChangelogDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ContentBlockersInfoDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/CreateCustomListDialog.kt5
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/CustomDnsInfoDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeleteApiAccessMethodConfirmationDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeleteCustomListConfirmationDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DeviceNameInfoDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DiscardChangesDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/DnsDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/EditCustomListNameDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/LocalNetworkSharingInfoDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/MalwareInfoDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/MtuDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ObfuscationInfoDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/QuantumResistanceInfoDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RedeemVoucherDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RemoveDeviceConfirmationDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ReportProblemNoEmailDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ResetServerIpOverridesConfirmationDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/SaveApiAccessMethodDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/ServerIpOverridesInfoDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/UdpOverTcpPortInfoDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/WireguardCustomPortDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/WireguardPortInfoDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/payment/PaymentDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/payment/VerificationPendingDialog.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/extensions/LifecycleExtensions.kt54
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt22
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ApiAccessListScreen.kt9
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ApiAccessMethodDetailsScreen.kt7
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AutoConnectAndLockdownModeScreen.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ConnectScreen.kt16
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/CustomListLocationsScreen.kt5
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/CustomListsScreen.kt20
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/DeviceListScreen.kt18
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/DeviceRevokedScreen.kt10
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/EditApiAccessMethodScreen.kt7
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/EditCustomListScreen.kt47
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/FilterScreen.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ImportOverridesByTextScreen.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/LoginScreen.kt16
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/MullvadApp.kt12
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/NoDaemonScreen.kt5
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/OutOfTimeScreen.kt29
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/PrivacyDisclaimerScreen.kt10
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ReportProblemScreen.kt7
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SelectLocationScreen.kt75
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ServerIpOverridesScreen.kt9
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SettingsScreen.kt11
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SplashScreen.kt18
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SplitTunnelingScreen.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/ViewLogsScreen.kt3
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/VpnSettingsScreen.kt73
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/WelcomeScreen.kt26
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/DefaultTransition.kt28
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/HomeTransition.kt37
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/LoginTransition.kt47
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/SettingsTransition.kt43
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/SlideInFromBottomTransition.kt80
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/SlideInFromRightLeafTransition.kt38
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/transitions/SlideInFromRightTransition.kt42
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/util/Navigation.kt2
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/NoDaemonViewModel.kt8
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) {