diff --git a/core/ui/compose/common/src/main/kotlin/app/k9mail/core/ui/compose/common/navigation/NavigationExtensions.kt b/core/ui/compose/common/src/main/kotlin/app/k9mail/core/ui/compose/common/navigation/NavigationExtensions.kt new file mode 100644 index 000000000..bce88f068 --- /dev/null +++ b/core/ui/compose/common/src/main/kotlin/app/k9mail/core/ui/compose/common/navigation/NavigationExtensions.kt @@ -0,0 +1,30 @@ +package app.k9mail.core.ui.compose.common.navigation + +import android.net.Uri +import androidx.compose.animation.AnimatedContentScope +import androidx.compose.runtime.Composable +import androidx.core.net.toUri +import androidx.navigation.NamedNavArgument +import androidx.navigation.NavBackStackEntry +import androidx.navigation.NavGraphBuilder +import androidx.navigation.compose.composable +import androidx.navigation.navDeepLink + +fun NavGraphBuilder.deepLinkComposable( + route: String, + arguments: List = emptyList(), + content: @Composable AnimatedContentScope.(NavBackStackEntry) -> Unit, +) { + composable( + route = route, + arguments = arguments, + deepLinks = listOf( + navDeepLink { uriPattern = route.toDeepLink() }, + ), + content = content, + ) +} + +fun String.toDeepLink(): String = "app://$this" + +fun String.toDeepLinkUri(): Uri = toDeepLink().toUri() diff --git a/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/navigation/AccountSetupNavigation.kt b/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/navigation/AccountSetupNavigation.kt index a4e95c1fd..f2565b783 100644 --- a/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/navigation/AccountSetupNavigation.kt +++ b/feature/account/setup/src/main/kotlin/app/k9mail/feature/account/setup/navigation/AccountSetupNavigation.kt @@ -3,7 +3,7 @@ package app.k9mail.feature.account.setup.navigation import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions -import androidx.navigation.compose.composable +import app.k9mail.core.ui.compose.common.navigation.deepLinkComposable import app.k9mail.feature.account.setup.ui.AccountSetupScreen const val NAVIGATION_ROUTE_ACCOUNT_SETUP = "/account/setup" @@ -16,7 +16,7 @@ fun NavGraphBuilder.accountSetupRoute( onBack: () -> Unit, onFinish: (String) -> Unit, ) { - composable(route = NAVIGATION_ROUTE_ACCOUNT_SETUP) { + deepLinkComposable(route = NAVIGATION_ROUTE_ACCOUNT_SETUP) { AccountSetupScreen( onBack = onBack, onFinish = onFinish, diff --git a/feature/launcher/src/main/kotlin/app/k9mail/feature/launcher/FeatureLauncherActivity.kt b/feature/launcher/src/main/kotlin/app/k9mail/feature/launcher/FeatureLauncherActivity.kt index fe1be03d4..df0df6ca3 100644 --- a/feature/launcher/src/main/kotlin/app/k9mail/feature/launcher/FeatureLauncherActivity.kt +++ b/feature/launcher/src/main/kotlin/app/k9mail/feature/launcher/FeatureLauncherActivity.kt @@ -6,6 +6,7 @@ import android.os.Bundle import androidx.activity.ComponentActivity import androidx.core.view.WindowCompat import app.k9mail.core.ui.compose.common.activity.setActivityContent +import app.k9mail.core.ui.compose.common.navigation.toDeepLinkUri import app.k9mail.feature.account.setup.navigation.NAVIGATION_ROUTE_ACCOUNT_SETUP import app.k9mail.feature.launcher.ui.FeatureLauncherApp import app.k9mail.feature.onboarding.navigation.NAVIGATION_ROUTE_ONBOARDING @@ -17,22 +18,16 @@ class FeatureLauncherActivity : ComponentActivity() { WindowCompat.setDecorFitsSystemWindows(window, false) - val destination = intent.getStringExtra(EXTRA_DESTINATION) - setActivityContent { - FeatureLauncherApp(startDestination = destination) + FeatureLauncherApp() } } companion object { - private const val EXTRA_DESTINATION = "destination" - private const val DESTINATION_ONBOARDING = NAVIGATION_ROUTE_ONBOARDING - private const val DESTINATION_SETUP_ACCOUNT = NAVIGATION_ROUTE_ACCOUNT_SETUP - @JvmStatic fun launchOnboarding(context: Activity) { val intent = Intent(context, FeatureLauncherActivity::class.java).apply { - putExtra(EXTRA_DESTINATION, DESTINATION_ONBOARDING) + data = NAVIGATION_ROUTE_ONBOARDING.toDeepLinkUri() flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK } context.startActivity(intent) @@ -41,7 +36,7 @@ class FeatureLauncherActivity : ComponentActivity() { @JvmStatic fun launchSetupAccount(context: Activity) { val intent = Intent(context, FeatureLauncherActivity::class.java).apply { - putExtra(EXTRA_DESTINATION, DESTINATION_SETUP_ACCOUNT) + data = NAVIGATION_ROUTE_ACCOUNT_SETUP.toDeepLinkUri() } context.startActivity(intent) } diff --git a/feature/launcher/src/main/kotlin/app/k9mail/feature/launcher/navigation/FeatureLauncherNavHost.kt b/feature/launcher/src/main/kotlin/app/k9mail/feature/launcher/navigation/FeatureLauncherNavHost.kt index a5b78510f..2faec3562 100644 --- a/feature/launcher/src/main/kotlin/app/k9mail/feature/launcher/navigation/FeatureLauncherNavHost.kt +++ b/feature/launcher/src/main/kotlin/app/k9mail/feature/launcher/navigation/FeatureLauncherNavHost.kt @@ -15,7 +15,6 @@ import org.koin.compose.koinInject @Composable fun FeatureLauncherNavHost( navController: NavHostController, - startDestination: String?, onBack: () -> Unit, modifier: Modifier = Modifier, importSettingsLauncher: ImportSettingsLauncher = koinInject(), @@ -23,7 +22,7 @@ fun FeatureLauncherNavHost( ) { NavHost( navController = navController, - startDestination = startDestination ?: NAVIGATION_ROUTE_ONBOARDING, + startDestination = NAVIGATION_ROUTE_ONBOARDING, modifier = modifier, ) { onboardingRoute( diff --git a/feature/launcher/src/main/kotlin/app/k9mail/feature/launcher/ui/FeatureLauncherApp.kt b/feature/launcher/src/main/kotlin/app/k9mail/feature/launcher/ui/FeatureLauncherApp.kt index 0bafc94ec..27aef780a 100644 --- a/feature/launcher/src/main/kotlin/app/k9mail/feature/launcher/ui/FeatureLauncherApp.kt +++ b/feature/launcher/src/main/kotlin/app/k9mail/feature/launcher/ui/FeatureLauncherApp.kt @@ -12,7 +12,6 @@ import app.k9mail.feature.launcher.navigation.FeatureLauncherNavHost @Composable fun FeatureLauncherApp( - startDestination: String?, modifier: Modifier = Modifier, ) { val navController = rememberNavController() @@ -28,7 +27,6 @@ fun FeatureLauncherApp( FeatureLauncherNavHost( navController = navController, - startDestination = startDestination, onBack = { activity.finish() }, ) } diff --git a/feature/onboarding/src/main/kotlin/app/k9mail/feature/onboarding/navigation/OnboardingNavigation.kt b/feature/onboarding/src/main/kotlin/app/k9mail/feature/onboarding/navigation/OnboardingNavigation.kt index 86a700e1b..f14636495 100644 --- a/feature/onboarding/src/main/kotlin/app/k9mail/feature/onboarding/navigation/OnboardingNavigation.kt +++ b/feature/onboarding/src/main/kotlin/app/k9mail/feature/onboarding/navigation/OnboardingNavigation.kt @@ -3,7 +3,7 @@ package app.k9mail.feature.onboarding.navigation import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions -import androidx.navigation.compose.composable +import app.k9mail.core.ui.compose.common.navigation.deepLinkComposable import app.k9mail.feature.onboarding.ui.OnboardingScreen const val NAVIGATION_ROUTE_ONBOARDING = "/onboarding" @@ -18,7 +18,7 @@ fun NavGraphBuilder.onboardingRoute( onStart: () -> Unit, onImport: () -> Unit, ) { - composable(route = NAVIGATION_ROUTE_ONBOARDING) { + deepLinkComposable(route = NAVIGATION_ROUTE_ONBOARDING) { OnboardingScreen( onStartClick = onStart, onImportClick = onImport,