From 554cc262bf81cf1dda7e8464f137d099a90b726a Mon Sep 17 00:00:00 2001 From: Anil Kumar Beesetti <66936649+anilbeesetti@users.noreply.github.com> Date: Thu, 16 Nov 2023 11:11:32 +0530 Subject: [PATCH] Refactor: Add animatedComposable to replace composable to add animations (#741) * refactor: add animatedComposable * refactor: replace composable with animatedComposable * lint: run ktlintFormat --- .../ui/designsystem/AnimatedComposable.kt | 34 +++++++++++++++++++ .../ui/designsystem/NavigationAnimations.kt | 13 ------- .../navigation/AboutPreferencesNavigation.kt | 10 ++---- .../AppearancePreferencesNavigation.kt | 10 ++---- .../navigation/AudioPreferencesNavigation.kt | 10 ++---- .../DecoderPreferencesNavigation.kt | 10 ++---- .../MediaLibraryPreferencesNavigation.kt | 17 ++-------- .../navigation/PlayerPreferencesNavigation.kt | 10 ++---- .../settings/navigation/SettingsNavigation.kt | 11 ++---- .../SubtitlePreferencesNavigation.kt | 10 ++---- .../navigation/MediaPickerFolderNavigation.kt | 10 +++--- .../navigation/MediaPickerNavigation.kt | 4 +-- 12 files changed, 58 insertions(+), 91 deletions(-) create mode 100644 core/ui/src/main/java/dev/anilbeesetti/nextplayer/core/ui/designsystem/AnimatedComposable.kt delete mode 100644 core/ui/src/main/java/dev/anilbeesetti/nextplayer/core/ui/designsystem/NavigationAnimations.kt diff --git a/core/ui/src/main/java/dev/anilbeesetti/nextplayer/core/ui/designsystem/AnimatedComposable.kt b/core/ui/src/main/java/dev/anilbeesetti/nextplayer/core/ui/designsystem/AnimatedComposable.kt new file mode 100644 index 000000000..2f3b56a3d --- /dev/null +++ b/core/ui/src/main/java/dev/anilbeesetti/nextplayer/core/ui/designsystem/AnimatedComposable.kt @@ -0,0 +1,34 @@ +package dev.anilbeesetti.nextplayer.core.ui.designsystem + +import androidx.compose.animation.AnimatedVisibilityScope +import androidx.compose.animation.core.tween +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.slideInHorizontally +import androidx.compose.animation.slideOutHorizontally +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 + +fun NavGraphBuilder.animatedComposable( + route: String, + arguments: List = emptyList(), + deepLinks: List = emptyList(), + content: @Composable AnimatedVisibilityScope.(NavBackStackEntry) -> Unit +) = composable( + route = route, + arguments = arguments, + deepLinks = deepLinks, + enterTransition = { + slideInHorizontally(initialOffsetX = { it }, animationSpec = tween(220, delayMillis = 90)) + fadeIn(animationSpec = tween(220, delayMillis = 90)) + }, + exitTransition = null, + popEnterTransition = null, + popExitTransition = { + slideOutHorizontally(targetOffsetX = { it }, animationSpec = tween(220)) + fadeOut(animationSpec = tween(220)) + }, + content = content +) diff --git a/core/ui/src/main/java/dev/anilbeesetti/nextplayer/core/ui/designsystem/NavigationAnimations.kt b/core/ui/src/main/java/dev/anilbeesetti/nextplayer/core/ui/designsystem/NavigationAnimations.kt deleted file mode 100644 index 013685905..000000000 --- a/core/ui/src/main/java/dev/anilbeesetti/nextplayer/core/ui/designsystem/NavigationAnimations.kt +++ /dev/null @@ -1,13 +0,0 @@ -package dev.anilbeesetti.nextplayer.core.ui.designsystem - -import androidx.compose.animation.core.tween -import androidx.compose.animation.fadeIn -import androidx.compose.animation.fadeOut -import androidx.compose.animation.slideInHorizontally -import androidx.compose.animation.slideOutHorizontally - -object NavigationAnimations { - - val slideEnter = slideInHorizontally(initialOffsetX = { it }) + fadeIn(tween(300)) - val slideExit = slideOutHorizontally(targetOffsetX = { it }) + fadeOut(tween(300)) -} diff --git a/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/AboutPreferencesNavigation.kt b/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/AboutPreferencesNavigation.kt index e36689853..1fe9a04cd 100644 --- a/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/AboutPreferencesNavigation.kt +++ b/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/AboutPreferencesNavigation.kt @@ -3,8 +3,7 @@ package dev.anilbeesetti.nextplayer.settings.navigation import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions -import androidx.navigation.compose.composable -import dev.anilbeesetti.nextplayer.core.ui.designsystem.NavigationAnimations +import dev.anilbeesetti.nextplayer.core.ui.designsystem.animatedComposable import dev.anilbeesetti.nextplayer.settings.screens.about.AboutPreferencesScreen const val aboutPreferencesNavigationRoute = "about_preferences_route" @@ -14,12 +13,7 @@ fun NavController.navigateToAboutPreferences(navOptions: NavOptions? = null) { } fun NavGraphBuilder.aboutPreferencesScreen(onNavigateUp: () -> Unit) { - composable( - route = aboutPreferencesNavigationRoute, - enterTransition = { NavigationAnimations.slideEnter }, - popExitTransition = { NavigationAnimations.slideExit }, - popEnterTransition = null - ) { + animatedComposable(route = aboutPreferencesNavigationRoute) { AboutPreferencesScreen( onNavigateUp = onNavigateUp ) diff --git a/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/AppearancePreferencesNavigation.kt b/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/AppearancePreferencesNavigation.kt index 2f90e803a..36fdd530e 100644 --- a/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/AppearancePreferencesNavigation.kt +++ b/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/AppearancePreferencesNavigation.kt @@ -3,8 +3,7 @@ package dev.anilbeesetti.nextplayer.settings.navigation import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions -import androidx.navigation.compose.composable -import dev.anilbeesetti.nextplayer.core.ui.designsystem.NavigationAnimations +import dev.anilbeesetti.nextplayer.core.ui.designsystem.animatedComposable import dev.anilbeesetti.nextplayer.settings.screens.appearance.AppearancePreferencesScreen const val appearancePreferencesNavigationRoute = "appearance_preferences_route" @@ -14,12 +13,7 @@ fun NavController.navigateToAppearancePreferences(navOptions: NavOptions? = null } fun NavGraphBuilder.appearancePreferencesScreen(onNavigateUp: () -> Unit) { - composable( - route = appearancePreferencesNavigationRoute, - enterTransition = { NavigationAnimations.slideEnter }, - popExitTransition = { NavigationAnimations.slideExit }, - popEnterTransition = null - ) { + animatedComposable(route = appearancePreferencesNavigationRoute) { AppearancePreferencesScreen(onNavigateUp = onNavigateUp) } } diff --git a/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/AudioPreferencesNavigation.kt b/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/AudioPreferencesNavigation.kt index d6642c70a..13570c556 100644 --- a/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/AudioPreferencesNavigation.kt +++ b/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/AudioPreferencesNavigation.kt @@ -3,8 +3,7 @@ package dev.anilbeesetti.nextplayer.settings.navigation import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions -import androidx.navigation.compose.composable -import dev.anilbeesetti.nextplayer.core.ui.designsystem.NavigationAnimations +import dev.anilbeesetti.nextplayer.core.ui.designsystem.animatedComposable import dev.anilbeesetti.nextplayer.settings.screens.audio.AudioPreferencesScreen const val audioPreferencesNavigationRoute = "audio_preferences_route" @@ -14,12 +13,7 @@ fun NavController.navigateToAudioPreferences(navOptions: NavOptions? = null) { } fun NavGraphBuilder.audioPreferencesScreen(onNavigateUp: () -> Unit) { - composable( - route = audioPreferencesNavigationRoute, - enterTransition = { NavigationAnimations.slideEnter }, - popExitTransition = { NavigationAnimations.slideExit }, - popEnterTransition = null - ) { + animatedComposable(route = audioPreferencesNavigationRoute) { AudioPreferencesScreen(onNavigateUp = onNavigateUp) } } diff --git a/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/DecoderPreferencesNavigation.kt b/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/DecoderPreferencesNavigation.kt index 13fd7dfb9..c0a80ecf8 100644 --- a/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/DecoderPreferencesNavigation.kt +++ b/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/DecoderPreferencesNavigation.kt @@ -3,8 +3,7 @@ package dev.anilbeesetti.nextplayer.settings.navigation import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions -import androidx.navigation.compose.composable -import dev.anilbeesetti.nextplayer.core.ui.designsystem.NavigationAnimations +import dev.anilbeesetti.nextplayer.core.ui.designsystem.animatedComposable import dev.anilbeesetti.nextplayer.settings.screens.decoder.DecoderPreferencesScreen const val decoderPreferencesNavigationRoute = "decoder_preferences_route" @@ -14,12 +13,7 @@ fun NavController.navigateToDecoderPreferences(navOptions: NavOptions? = null) { } fun NavGraphBuilder.decoderPreferencesScreen(onNavigateUp: () -> Unit) { - composable( - route = decoderPreferencesNavigationRoute, - enterTransition = { NavigationAnimations.slideEnter }, - popExitTransition = { NavigationAnimations.slideExit }, - popEnterTransition = null - ) { + animatedComposable(route = decoderPreferencesNavigationRoute) { DecoderPreferencesScreen(onNavigateUp = onNavigateUp) } } diff --git a/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/MediaLibraryPreferencesNavigation.kt b/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/MediaLibraryPreferencesNavigation.kt index b88b9c2bb..1b9a67f23 100644 --- a/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/MediaLibraryPreferencesNavigation.kt +++ b/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/MediaLibraryPreferencesNavigation.kt @@ -3,8 +3,7 @@ package dev.anilbeesetti.nextplayer.settings.navigation import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions -import androidx.navigation.compose.composable -import dev.anilbeesetti.nextplayer.core.ui.designsystem.NavigationAnimations +import dev.anilbeesetti.nextplayer.core.ui.designsystem.animatedComposable import dev.anilbeesetti.nextplayer.settings.screens.medialibrary.FolderPreferencesScreen import dev.anilbeesetti.nextplayer.settings.screens.medialibrary.MediaLibraryPreferencesScreen @@ -23,12 +22,7 @@ fun NavGraphBuilder.mediaLibraryPreferencesScreen( onNavigateUp: () -> Unit, onFolderSettingClick: () -> Unit ) { - composable( - route = mediaLibraryPreferencesNavigationRoute, - enterTransition = { NavigationAnimations.slideEnter }, - popExitTransition = { NavigationAnimations.slideExit }, - popEnterTransition = null - ) { + animatedComposable(route = mediaLibraryPreferencesNavigationRoute) { MediaLibraryPreferencesScreen( onNavigateUp = onNavigateUp, onFolderSettingClick = onFolderSettingClick @@ -37,12 +31,7 @@ fun NavGraphBuilder.mediaLibraryPreferencesScreen( } fun NavGraphBuilder.folderPreferencesScreen(onNavigateUp: () -> Unit) { - composable( - route = folderPreferencesNavigationRoute, - enterTransition = { NavigationAnimations.slideEnter }, - popExitTransition = { NavigationAnimations.slideExit }, - popEnterTransition = null - ) { + animatedComposable(route = folderPreferencesNavigationRoute) { FolderPreferencesScreen(onNavigateUp = onNavigateUp) } } diff --git a/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/PlayerPreferencesNavigation.kt b/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/PlayerPreferencesNavigation.kt index 85d8f1523..b7da9ddd7 100644 --- a/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/PlayerPreferencesNavigation.kt +++ b/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/PlayerPreferencesNavigation.kt @@ -3,8 +3,7 @@ package dev.anilbeesetti.nextplayer.settings.navigation import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions -import androidx.navigation.compose.composable -import dev.anilbeesetti.nextplayer.core.ui.designsystem.NavigationAnimations +import dev.anilbeesetti.nextplayer.core.ui.designsystem.animatedComposable import dev.anilbeesetti.nextplayer.settings.screens.player.PlayerPreferencesScreen const val playerPreferencesNavigationRoute = "player_preferences_route" @@ -14,12 +13,7 @@ fun NavController.navigateToPlayerPreferences(navOptions: NavOptions? = null) { } fun NavGraphBuilder.playerPreferencesScreen(onNavigateUp: () -> Unit) { - composable( - route = playerPreferencesNavigationRoute, - enterTransition = { NavigationAnimations.slideEnter }, - popExitTransition = { NavigationAnimations.slideExit }, - popEnterTransition = null - ) { + animatedComposable(route = playerPreferencesNavigationRoute) { PlayerPreferencesScreen( onNavigateUp = onNavigateUp ) diff --git a/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/SettingsNavigation.kt b/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/SettingsNavigation.kt index f5df7f8fa..960db0de1 100644 --- a/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/SettingsNavigation.kt +++ b/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/SettingsNavigation.kt @@ -3,8 +3,8 @@ package dev.anilbeesetti.nextplayer.settings.navigation import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions -import androidx.navigation.compose.composable -import dev.anilbeesetti.nextplayer.core.ui.designsystem.NavigationAnimations +import androidx.navigation.navOptions +import dev.anilbeesetti.nextplayer.core.ui.designsystem.animatedComposable import dev.anilbeesetti.nextplayer.settings.Setting import dev.anilbeesetti.nextplayer.settings.SettingsScreen @@ -15,12 +15,7 @@ fun NavController.navigateToSettings(navOptions: NavOptions? = null) { } fun NavGraphBuilder.settingsScreen(onNavigateUp: () -> Unit, onItemClick: (Setting) -> Unit) { - composable( - route = settingsNavigationRoute, - enterTransition = { NavigationAnimations.slideEnter }, - popExitTransition = { NavigationAnimations.slideExit }, - popEnterTransition = null - ) { + animatedComposable(route = settingsNavigationRoute) { SettingsScreen(onNavigateUp = onNavigateUp, onItemClick = onItemClick) } } diff --git a/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/SubtitlePreferencesNavigation.kt b/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/SubtitlePreferencesNavigation.kt index 430c97692..08686af6c 100644 --- a/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/SubtitlePreferencesNavigation.kt +++ b/feature/settings/src/main/java/dev/anilbeesetti/nextplayer/settings/navigation/SubtitlePreferencesNavigation.kt @@ -3,8 +3,7 @@ package dev.anilbeesetti.nextplayer.settings.navigation import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions -import androidx.navigation.compose.composable -import dev.anilbeesetti.nextplayer.core.ui.designsystem.NavigationAnimations +import dev.anilbeesetti.nextplayer.core.ui.designsystem.animatedComposable import dev.anilbeesetti.nextplayer.settings.screens.subtitle.SubtitlePreferencesScreen const val subtitlePreferencesNavigationRoute = "subtitle_preferences_route" @@ -14,12 +13,7 @@ fun NavController.navigateToSubtitlePreferences(navOptions: NavOptions? = null) } fun NavGraphBuilder.subtitlePreferencesScreen(onNavigateUp: () -> Unit) { - composable( - route = subtitlePreferencesNavigationRoute, - enterTransition = { NavigationAnimations.slideEnter }, - popExitTransition = { NavigationAnimations.slideExit }, - popEnterTransition = null - ) { + animatedComposable(route = subtitlePreferencesNavigationRoute) { SubtitlePreferencesScreen(onNavigateUp = onNavigateUp) } } diff --git a/feature/videopicker/src/main/java/dev/anilbeesetti/nextplayer/feature/videopicker/navigation/MediaPickerFolderNavigation.kt b/feature/videopicker/src/main/java/dev/anilbeesetti/nextplayer/feature/videopicker/navigation/MediaPickerFolderNavigation.kt index 85a496696..9e9574b4e 100644 --- a/feature/videopicker/src/main/java/dev/anilbeesetti/nextplayer/feature/videopicker/navigation/MediaPickerFolderNavigation.kt +++ b/feature/videopicker/src/main/java/dev/anilbeesetti/nextplayer/feature/videopicker/navigation/MediaPickerFolderNavigation.kt @@ -6,9 +6,9 @@ import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions import androidx.navigation.NavType -import androidx.navigation.compose.composable import androidx.navigation.navArgument -import dev.anilbeesetti.nextplayer.core.ui.designsystem.NavigationAnimations +import androidx.navigation.navOptions +import dev.anilbeesetti.nextplayer.core.ui.designsystem.animatedComposable import dev.anilbeesetti.nextplayer.feature.videopicker.screens.mediaFolder.MediaPickerFolderRoute const val mediaPickerFolderNavigationRoute = "media_picker_folder_screen" @@ -31,13 +31,11 @@ fun NavGraphBuilder.mediaPickerFolderScreen( onNavigateUp: () -> Unit, onVideoClick: (uri: Uri) -> Unit ) { - composable( + animatedComposable( route = "$mediaPickerFolderNavigationRoute/{$folderIdArg}", arguments = listOf( navArgument(folderIdArg) { type = NavType.StringType } - ), - enterTransition = { NavigationAnimations.slideEnter }, - popExitTransition = { NavigationAnimations.slideExit } + ) ) { MediaPickerFolderRoute( onVideoClick = onVideoClick, diff --git a/feature/videopicker/src/main/java/dev/anilbeesetti/nextplayer/feature/videopicker/navigation/MediaPickerNavigation.kt b/feature/videopicker/src/main/java/dev/anilbeesetti/nextplayer/feature/videopicker/navigation/MediaPickerNavigation.kt index cc1b31e31..7a4af4948 100644 --- a/feature/videopicker/src/main/java/dev/anilbeesetti/nextplayer/feature/videopicker/navigation/MediaPickerNavigation.kt +++ b/feature/videopicker/src/main/java/dev/anilbeesetti/nextplayer/feature/videopicker/navigation/MediaPickerNavigation.kt @@ -4,7 +4,7 @@ import android.net.Uri import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions -import androidx.navigation.compose.composable +import dev.anilbeesetti.nextplayer.core.ui.designsystem.animatedComposable import dev.anilbeesetti.nextplayer.feature.videopicker.screens.media.MediaPickerRoute const val mediaPickerNavigationRoute = "media_picker_screen" @@ -18,7 +18,7 @@ fun NavGraphBuilder.mediaPickerScreen( onPlayVideo: (uri: Uri) -> Unit, onFolderClick: (path: String) -> Unit ) { - composable(route = mediaPickerNavigationRoute) { + animatedComposable(route = mediaPickerNavigationRoute) { MediaPickerRoute( onSettingsClick = onSettingsClick, onPlayVideo = onPlayVideo,