From 0c9bd405900c3a48f5fa724c089c4f165ba4f9a5 Mon Sep 17 00:00:00 2001 From: Brian Yencho Date: Tue, 31 Oct 2023 11:43:20 -0500 Subject: [PATCH] Treat transition types using separate durations (#189) --- .../VaultUnlockedNavBarNavigation.kt | 9 ++- .../bitwarden/ui/platform/theme/Transition.kt | 59 ++++++++++++++----- 2 files changed, 51 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarNavigation.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarNavigation.kt index 8e34dad34e..bb0d564c96 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarNavigation.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarNavigation.kt @@ -4,6 +4,7 @@ import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions import androidx.navigation.compose.composable +import com.x8bit.bitwarden.ui.platform.theme.TransitionProviders /** * The functions below pertain to entry into the [VaultUnlockedNavBarScreen]. @@ -23,7 +24,13 @@ fun NavController.navigateToVaultUnlockedNavBar(navOptions: NavOptions? = null) fun NavGraphBuilder.vaultUnlockedNavBarDestination( onNavigateToVaultAddItem: () -> Unit, ) { - composable(VAULT_UNLOCKED_NAV_BAR_ROUTE) { + composable( + route = VAULT_UNLOCKED_NAV_BAR_ROUTE, + enterTransition = TransitionProviders.Enter.stay, + exitTransition = TransitionProviders.Exit.stay, + popEnterTransition = TransitionProviders.Enter.stay, + popExitTransition = TransitionProviders.Exit.stay, + ) { VaultUnlockedNavBarScreen(onNavigateToVaultAddItem = onNavigateToVaultAddItem) } } diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/theme/Transition.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/theme/Transition.kt index e01b9bc298..9e2a5e24b4 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/theme/Transition.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/theme/Transition.kt @@ -22,9 +22,36 @@ typealias NonNullExitTransitionProvider = (@JvmSuppressWildcards AnimatedContentTransitionScope.() -> ExitTransition) /** - * The default transition time (in milliseconds) for all transitions in the [TransitionProviders]. + * The default transition time (in milliseconds) for all fade transitions in the + * [TransitionProviders]. */ -const val DEFAULT_TRANSITION_TIME_MS: Int = 350 +const val DEFAULT_FADE_TRANSITION_TIME_MS: Int = 300 + +/** + * The default transition time (in milliseconds) for all slide transitions in the + * [TransitionProviders]. + */ +const val DEFAULT_SLIDE_TRANSITION_TIME_MS: Int = 450 + +/** + * The default transition time (in milliseconds) for all slide transitions in the + * [TransitionProviders]. + */ +const val DEFAULT_PUSH_TRANSITION_TIME_MS: Int = 300 + +/** + * The default transition time (in milliseconds) for all "stay"/no-op transitions in the + * [TransitionProviders]. + * + * This should be at least as large as any other transition that might also be happening during a + * navigation. + */ +val DEFAULT_STAY_TRANSITION_TIME_MS: Int = + maxOf( + DEFAULT_FADE_TRANSITION_TIME_MS, + DEFAULT_SLIDE_TRANSITION_TIME_MS, + DEFAULT_PUSH_TRANSITION_TIME_MS, + ) /** * Checks if the parent of the destination before and after the navigation is the same. This is @@ -186,7 +213,7 @@ object RootTransitionProviders { * Fades the new screen in. */ val fadeIn: NonNullEnterTransitionProvider = { - fadeIn(tween(DEFAULT_TRANSITION_TIME_MS)) + fadeIn(tween(DEFAULT_FADE_TRANSITION_TIME_MS)) } /** @@ -195,8 +222,8 @@ object RootTransitionProviders { val pushLeft: NonNullEnterTransitionProvider = { slideIntoContainer( towards = AnimatedContentTransitionScope.SlideDirection.Left, - animationSpec = tween(DEFAULT_TRANSITION_TIME_MS), - ) + fadeIn(tween(DEFAULT_TRANSITION_TIME_MS)) + animationSpec = tween(DEFAULT_PUSH_TRANSITION_TIME_MS), + ) + fadeIn(tween(DEFAULT_PUSH_TRANSITION_TIME_MS)) } /** @@ -205,8 +232,8 @@ object RootTransitionProviders { val pushRight: NonNullEnterTransitionProvider = { slideIntoContainer( towards = AnimatedContentTransitionScope.SlideDirection.Right, - animationSpec = tween(DEFAULT_TRANSITION_TIME_MS), - ) + fadeIn(tween(DEFAULT_TRANSITION_TIME_MS)) + animationSpec = tween(DEFAULT_PUSH_TRANSITION_TIME_MS), + ) + fadeIn(tween(DEFAULT_PUSH_TRANSITION_TIME_MS)) } /** @@ -215,7 +242,7 @@ object RootTransitionProviders { val slideUp: NonNullEnterTransitionProvider = { slideIntoContainer( towards = AnimatedContentTransitionScope.SlideDirection.Up, - animationSpec = tween(DEFAULT_TRANSITION_TIME_MS), + animationSpec = tween(DEFAULT_SLIDE_TRANSITION_TIME_MS), ) } @@ -226,7 +253,7 @@ object RootTransitionProviders { */ val stay: NonNullEnterTransitionProvider = { fadeIn( - animationSpec = tween(DEFAULT_TRANSITION_TIME_MS), + animationSpec = tween(DEFAULT_STAY_TRANSITION_TIME_MS), initialAlpha = 1f, ) } @@ -240,7 +267,7 @@ object RootTransitionProviders { * Fades the current screen out. */ val fadeOut: NonNullExitTransitionProvider = { - fadeOut(tween(DEFAULT_TRANSITION_TIME_MS)) + fadeOut(tween(DEFAULT_FADE_TRANSITION_TIME_MS)) } /** @@ -249,8 +276,8 @@ object RootTransitionProviders { val pushLeft: NonNullExitTransitionProvider = { slideOutOfContainer( towards = AnimatedContentTransitionScope.SlideDirection.Left, - animationSpec = tween(DEFAULT_TRANSITION_TIME_MS), - ) + fadeOut(tween(DEFAULT_TRANSITION_TIME_MS)) + animationSpec = tween(DEFAULT_PUSH_TRANSITION_TIME_MS), + ) + fadeOut(tween(DEFAULT_PUSH_TRANSITION_TIME_MS)) } /** @@ -259,8 +286,8 @@ object RootTransitionProviders { val pushRight: NonNullExitTransitionProvider = { slideOutOfContainer( towards = AnimatedContentTransitionScope.SlideDirection.Right, - animationSpec = tween(DEFAULT_TRANSITION_TIME_MS), - ) + fadeOut(tween(DEFAULT_TRANSITION_TIME_MS)) + animationSpec = tween(DEFAULT_PUSH_TRANSITION_TIME_MS), + ) + fadeOut(tween(DEFAULT_PUSH_TRANSITION_TIME_MS)) } /** @@ -269,7 +296,7 @@ object RootTransitionProviders { val slideDown: NonNullExitTransitionProvider = { slideOutOfContainer( towards = AnimatedContentTransitionScope.SlideDirection.Down, - animationSpec = tween(DEFAULT_TRANSITION_TIME_MS), + animationSpec = tween(DEFAULT_SLIDE_TRANSITION_TIME_MS), ) } @@ -280,7 +307,7 @@ object RootTransitionProviders { */ val stay: NonNullExitTransitionProvider = { fadeOut( - animationSpec = tween(DEFAULT_TRANSITION_TIME_MS), + animationSpec = tween(DEFAULT_STAY_TRANSITION_TIME_MS), targetAlpha = 0.99f, ) }