diff --git a/app/src/main/java/com/sadellie/unitto/UnittoNavigation.kt b/app/src/main/java/com/sadellie/unitto/UnittoNavigation.kt
index 997eb391..1b205fa3 100644
--- a/app/src/main/java/com/sadellie/unitto/UnittoNavigation.kt
+++ b/app/src/main/java/com/sadellie/unitto/UnittoNavigation.kt
@@ -18,6 +18,8 @@
package com.sadellie.unitto
+import androidx.compose.animation.fadeIn
+import androidx.compose.animation.fadeOut
import androidx.compose.foundation.background
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
@@ -43,7 +45,9 @@ internal fun UnittoNavigation(
NavHost(
navController = navController,
startDestination = startDestination,
- modifier = Modifier.background(MaterialTheme.colorScheme.background)
+ modifier = Modifier.background(MaterialTheme.colorScheme.background),
+ enterTransition = { fadeIn() },
+ exitTransition = { fadeOut() }
) {
converterGraph(
openDrawer = openDrawer,
diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts
index 681bdca9..cd7d4a87 100644
--- a/core/ui/build.gradle.kts
+++ b/core/ui/build.gradle.kts
@@ -41,5 +41,7 @@ dependencies {
testImplementation(libs.androidx.compose.ui.test.junit4)
debugImplementation(libs.androidx.compose.ui.test.manifest)
+ implementation(libs.androidx.navigation)
+
implementation(project(mapOf("path" to ":core:base")))
}
diff --git a/core/ui/src/main/java/com/sadellie/unitto/core/ui/NavGraphBuilderExtensions.kt b/core/ui/src/main/java/com/sadellie/unitto/core/ui/NavGraphBuilderExtensions.kt
new file mode 100644
index 00000000..de4953d0
--- /dev/null
+++ b/core/ui/src/main/java/com/sadellie/unitto/core/ui/NavGraphBuilderExtensions.kt
@@ -0,0 +1,93 @@
+/*
+ * Unitto is a unit converter for Android
+ * Copyright (c) 2023 Elshan Agaev
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.sadellie.unitto.core.ui
+
+import androidx.compose.animation.AnimatedContentScope
+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.compose.runtime.Composable
+import androidx.navigation.NamedNavArgument
+import androidx.navigation.NavBackStackEntry
+import androidx.navigation.NavDeepLink
+import androidx.navigation.NavGraphBuilder
+import androidx.navigation.compose.composable
+import androidx.navigation.compose.navigation
+
+/**
+ * @see NavGraphBuilder.composable
+ */
+fun NavGraphBuilder.unittoComposable(
+ route: String,
+ arguments: List = emptyList(),
+ deepLinks: List = emptyList(),
+ enterTransition: (@JvmSuppressWildcards
+ AnimatedContentTransitionScope.() -> EnterTransition?)? = { fadeIn() },
+ exitTransition: (@JvmSuppressWildcards
+ AnimatedContentTransitionScope.() -> ExitTransition?)? = { fadeOut() },
+ popEnterTransition: (@JvmSuppressWildcards
+ AnimatedContentTransitionScope.() -> EnterTransition?)? =
+ enterTransition,
+ popExitTransition: (@JvmSuppressWildcards
+ AnimatedContentTransitionScope.() -> ExitTransition?)? =
+ exitTransition,
+ content: @Composable AnimatedContentScope.(NavBackStackEntry) -> Unit
+): Unit = composable(
+ route = route,
+ arguments = arguments,
+ deepLinks = deepLinks,
+ enterTransition = enterTransition,
+ exitTransition = exitTransition,
+ popEnterTransition = popEnterTransition,
+ popExitTransition = popExitTransition,
+ content = content,
+)
+
+/**
+ * @see NavGraphBuilder.navigation
+ */
+fun NavGraphBuilder.unittoNavigation(
+ startDestination: String,
+ route: String,
+ arguments: List = emptyList(),
+ deepLinks: List = emptyList(),
+ enterTransition: (AnimatedContentTransitionScope.() -> EnterTransition?)? =
+ null,
+ exitTransition: (AnimatedContentTransitionScope.() -> ExitTransition?)? =
+ null,
+ popEnterTransition: (
+ AnimatedContentTransitionScope.() -> EnterTransition?
+ )? = enterTransition,
+ popExitTransition: (
+ AnimatedContentTransitionScope.() -> ExitTransition?
+ )? = exitTransition,
+ builder: NavGraphBuilder.() -> Unit
+): Unit = navigation(
+ startDestination = startDestination,
+ route = route,
+ arguments = arguments,
+ deepLinks = deepLinks,
+ enterTransition = enterTransition,
+ exitTransition = exitTransition,
+ popEnterTransition = popEnterTransition,
+ popExitTransition = popExitTransition,
+ builder = builder
+)
diff --git a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/navigation/CalculatorNavigation.kt b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/navigation/CalculatorNavigation.kt
index 716d6aac..fbae4ef0 100644
--- a/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/navigation/CalculatorNavigation.kt
+++ b/feature/calculator/src/main/java/com/sadellie/unitto/feature/calculator/navigation/CalculatorNavigation.kt
@@ -19,10 +19,10 @@
package com.sadellie.unitto.feature.calculator.navigation
import androidx.navigation.NavGraphBuilder
-import androidx.navigation.compose.composable
-import androidx.navigation.compose.navigation
import androidx.navigation.navDeepLink
import com.sadellie.unitto.core.base.TopLevelDestinations
+import com.sadellie.unitto.core.ui.unittoComposable
+import com.sadellie.unitto.core.ui.unittoNavigation
import com.sadellie.unitto.feature.calculator.CalculatorRoute
private val graph = TopLevelDestinations.Calculator.graph
@@ -32,14 +32,14 @@ fun NavGraphBuilder.calculatorGraph(
navigateToMenu: () -> Unit,
navigateToSettings: () -> Unit
) {
- navigation(
+ unittoNavigation(
startDestination = start,
route = graph,
deepLinks = listOf(
navDeepLink { uriPattern = "app://com.sadellie.unitto/$graph" }
)
) {
- composable(start) {
+ unittoComposable(start) {
CalculatorRoute(
navigateToMenu = navigateToMenu,
navigateToSettings = navigateToSettings
diff --git a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/navigation/ConverterNavigation.kt b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/navigation/ConverterNavigation.kt
index db7a6161..9a6904b1 100644
--- a/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/navigation/ConverterNavigation.kt
+++ b/feature/converter/src/main/java/com/sadellie/unitto/feature/converter/navigation/ConverterNavigation.kt
@@ -22,10 +22,10 @@ import androidx.compose.runtime.remember
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
-import androidx.navigation.compose.composable
-import androidx.navigation.compose.navigation
import androidx.navigation.navDeepLink
import com.sadellie.unitto.core.base.TopLevelDestinations
+import com.sadellie.unitto.core.ui.unittoComposable
+import com.sadellie.unitto.core.ui.unittoNavigation
import com.sadellie.unitto.feature.converter.ConverterRoute
import com.sadellie.unitto.feature.converter.ConverterViewModel
import com.sadellie.unitto.feature.converter.LeftSideRoute
@@ -42,19 +42,19 @@ fun NavGraphBuilder.converterGraph(
navigateToSettings: () -> Unit,
navigateToUnitGroups: () -> Unit,
) {
- navigation(
+ unittoNavigation(
startDestination = start,
route = graph,
deepLinks = listOf(
navDeepLink { uriPattern = "app://com.sadellie.unitto/$graph" }
)
) {
- composable(start) { backStackEntry ->
+ unittoComposable(start) { backStackEntry ->
val parentEntry = remember(backStackEntry) {
navController.getBackStackEntry(graph)
}
- val parentViewModel = hiltViewModel(parentEntry)
+ val parentViewModel = hiltViewModel(parentEntry)
ConverterRoute(
viewModel = parentViewModel,
@@ -65,7 +65,7 @@ fun NavGraphBuilder.converterGraph(
)
}
- composable(LEFT) { backStackEntry ->
+ unittoComposable(LEFT) { backStackEntry ->
val parentEntry = remember(backStackEntry) {
navController.getBackStackEntry(graph)
}
@@ -79,7 +79,7 @@ fun NavGraphBuilder.converterGraph(
)
}
- composable(RIGHT) { backStackEntry ->
+ unittoComposable(RIGHT) { backStackEntry ->
val parentEntry = remember(backStackEntry) {
navController.getBackStackEntry(graph)
}
diff --git a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/navigation/DateCalculatorNavigation.kt b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/navigation/DateCalculatorNavigation.kt
index 735bda80..3db5e215 100644
--- a/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/navigation/DateCalculatorNavigation.kt
+++ b/feature/datecalculator/src/main/java/com/sadellie/unitto/feature/datecalculator/navigation/DateCalculatorNavigation.kt
@@ -19,10 +19,10 @@
package com.sadellie.unitto.feature.datecalculator.navigation
import androidx.navigation.NavGraphBuilder
-import androidx.navigation.compose.composable
-import androidx.navigation.compose.navigation
import androidx.navigation.navDeepLink
import com.sadellie.unitto.core.base.TopLevelDestinations
+import com.sadellie.unitto.core.ui.unittoComposable
+import com.sadellie.unitto.core.ui.unittoNavigation
import com.sadellie.unitto.feature.datecalculator.DateCalculatorRoute
private val graph = TopLevelDestinations.DateCalculator.graph
@@ -32,14 +32,14 @@ fun NavGraphBuilder.dateCalculatorGraph(
navigateToMenu: () -> Unit,
navigateToSettings: () -> Unit
) {
- navigation(
+ unittoNavigation(
startDestination = start,
route = graph,
deepLinks = listOf(
navDeepLink { uriPattern = "app://com.sadellie.unitto/$graph" }
)
) {
- composable(start) {
+ unittoComposable(start) {
DateCalculatorRoute(
navigateToMenu = navigateToMenu,
navigateToSettings = navigateToSettings
diff --git a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/navigation/SettingsNavigation.kt b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/navigation/SettingsNavigation.kt
index 09ca5f34..2b75343b 100644
--- a/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/navigation/SettingsNavigation.kt
+++ b/feature/settings/src/main/java/com/sadellie/unitto/feature/settings/navigation/SettingsNavigation.kt
@@ -21,10 +21,10 @@ package com.sadellie.unitto.feature.settings.navigation
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
-import androidx.navigation.compose.composable
-import androidx.navigation.compose.navigation
import androidx.navigation.navDeepLink
import com.sadellie.unitto.core.base.TopLevelDestinations
+import com.sadellie.unitto.core.ui.unittoComposable
+import com.sadellie.unitto.core.ui.unittoNavigation
import com.sadellie.unitto.feature.settings.SettingsRoute
import com.sadellie.unitto.feature.settings.about.AboutScreen
import com.sadellie.unitto.feature.settings.calculator.CalculatorSettingsScreen
@@ -57,60 +57,60 @@ fun NavGraphBuilder.settingGraph(
themmoController: ThemmoController,
navController: NavHostController,
) {
- navigation(
+ unittoNavigation(
startDestination = start,
route = graph,
deepLinks = listOf(
navDeepLink { uriPattern = "app://com.sadellie.unitto/$graph" }
)
) {
- composable(start) {
+ unittoComposable(start) {
SettingsRoute(
menuButtonClick = navController::navigateUp,
navControllerAction = navController::navigate
)
}
- composable(themesRoute) {
+ unittoComposable(themesRoute) {
ThemesRoute(
navigateUpAction = navController::navigateUp,
themmoController = themmoController,
)
}
- composable(formattingRoute) {
+ unittoComposable(formattingRoute) {
FormattingRoute(
navigateUpAction = navController::navigateUp
)
}
- composable(calculatorSettingsRoute) {
+ unittoComposable(calculatorSettingsRoute) {
CalculatorSettingsScreen(
navigateUpAction = navController::navigateUp,
)
}
- composable(converterSettingsRoute) {
+ unittoComposable(converterSettingsRoute) {
ConverterSettingsScreen(
navigateUpAction = navController::navigateUp,
navigateToUnitsGroup = { navController.navigate(unitsGroupRoute) }
)
}
- composable(unitsGroupRoute) {
+ unittoComposable(unitsGroupRoute) {
UnitGroupsScreen(
navigateUpAction = navController::navigateUp,
)
}
- composable(aboutRoute) {
+ unittoComposable(aboutRoute) {
AboutScreen(
navigateUpAction = navController::navigateUp,
navigateToThirdParty = { navController.navigate(thirdPartyRoute) }
)
}
- composable(thirdPartyRoute) {
+ unittoComposable(thirdPartyRoute) {
ThirdPartyLicensesScreen(
navigateUpAction = navController::navigateUp,
)
diff --git a/feature/timezone/src/main/java/com/sadellie/unitto/timezone/navigation/TimeZoneNavigation.kt b/feature/timezone/src/main/java/com/sadellie/unitto/timezone/navigation/TimeZoneNavigation.kt
index e4811c2d..ff992ec5 100644
--- a/feature/timezone/src/main/java/com/sadellie/unitto/timezone/navigation/TimeZoneNavigation.kt
+++ b/feature/timezone/src/main/java/com/sadellie/unitto/timezone/navigation/TimeZoneNavigation.kt
@@ -22,11 +22,11 @@ import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavHostController
import androidx.navigation.NavType
-import androidx.navigation.compose.composable
-import androidx.navigation.compose.navigation
import androidx.navigation.navArgument
import androidx.navigation.navDeepLink
import com.sadellie.unitto.core.base.TopLevelDestinations
+import com.sadellie.unitto.core.ui.unittoComposable
+import com.sadellie.unitto.core.ui.unittoNavigation
import com.sadellie.unitto.timezone.AddTimeZoneRoute
import com.sadellie.unitto.timezone.TimeZoneRoute
import java.time.ZonedDateTime
@@ -52,14 +52,14 @@ fun NavGraphBuilder.timeZoneGraph(
navigateToSettings: () -> Unit,
navController: NavHostController,
) {
- navigation(
+ unittoNavigation(
startDestination = start,
route = graph,
deepLinks = listOf(
navDeepLink { uriPattern = "app://com.sadellie.unitto/$graph" }
)
) {
- composable(start) {
+ unittoComposable(start) {
TimeZoneRoute(
navigateToMenu = navigateToMenu,
navigateToSettings = navigateToSettings,
@@ -67,7 +67,7 @@ fun NavGraphBuilder.timeZoneGraph(
)
}
- composable(
+ unittoComposable(
route = "$ADD_TIME_ZONE_ROUTE/{$USER_TIME_ARG}",
arguments = listOf(
navArgument(USER_TIME_ARG) {