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) {