diff --git a/app/src/main/java/com/jik/movie/MainActivity.kt b/app/src/main/java/com/jik/movie/MainActivity.kt index 7e57c61..e4e3700 100644 --- a/app/src/main/java/com/jik/movie/MainActivity.kt +++ b/app/src/main/java/com/jik/movie/MainActivity.kt @@ -4,15 +4,14 @@ import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.core.view.WindowCompat -import com.jik.movie.splash.createSplashScreen +import com.jik.movie.splash.showSplashScreenWithDelay import com.jik.movie.ui.MovieApp import dagger.hilt.android.AndroidEntryPoint -import kotlin.time.Duration.Companion.seconds @AndroidEntryPoint class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { - createSplashScreen(delay = 1.2.seconds) + showSplashScreenWithDelay() super.onCreate(savedInstanceState) diff --git a/app/src/main/java/com/jik/movie/navigation/MovieNavHost.kt b/app/src/main/java/com/jik/movie/navigation/MovieNavHost.kt index fcf7b52..550e3d5 100644 --- a/app/src/main/java/com/jik/movie/navigation/MovieNavHost.kt +++ b/app/src/main/java/com/jik/movie/navigation/MovieNavHost.kt @@ -1,10 +1,13 @@ package com.jik.movie.navigation +import androidx.compose.animation.slideInVertically +import androidx.compose.animation.slideOutVertically import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import com.jik.feature.detail.navigation.DetailNavigation.installDetailScreen +import com.jik.feature.detail.navigation.DetailNavigation.navigateDetail import com.jik.feature.home.navigation.HomeNavigation import com.jik.feature.home.navigation.HomeNavigation.installHomeScreen import com.jik.feature.popular.navigation.PopularNavigation.installPopularScreen @@ -20,8 +23,15 @@ fun MovieNavHost( startDestination = startDestination, modifier = modifier ) { - installHomeScreen(navController) - installPopularScreen(navController) - installDetailScreen() + installHomeScreen( + onPosterClick = { movieId -> navController.navigateDetail(movieId) } + ) + installPopularScreen( + onPosterClick = { movieId -> navController.navigateDetail(movieId) } + ) + installDetailScreen( + enterTransition = slideInVertically { it }, + exitTransition = slideOutVertically { it } + ) } } \ No newline at end of file diff --git a/app/src/main/java/com/jik/movie/navigation/TopLevelDestination.kt b/app/src/main/java/com/jik/movie/navigation/TopLevelDestination.kt index 765e044..8fb069a 100644 --- a/app/src/main/java/com/jik/movie/navigation/TopLevelDestination.kt +++ b/app/src/main/java/com/jik/movie/navigation/TopLevelDestination.kt @@ -2,7 +2,6 @@ package com.jik.movie.navigation import androidx.compose.ui.graphics.vector.ImageVector import com.jik.core.designsystem.icon.MovieIcons -import com.jik.core.ui.R import com.jik.feature.home.navigation.HomeNavigation import com.jik.feature.popular.navigation.PopularNavigation import com.jik.feature.home.R as homeR @@ -11,23 +10,17 @@ import com.jik.feature.popular.R as popularR enum class TopLevelDestination( val route: String, - val selectedIcon: ImageVector, - val unselectedIcon: ImageVector, + val icon: ImageVector, val iconTextId: Int, - val titleTextId: Int, ) { HOME( route = HomeNavigation.route, - selectedIcon = MovieIcons.HomeRounded, - unselectedIcon = MovieIcons.HomeRounded, + icon = MovieIcons.HomeRounded, iconTextId = homeR.string.home, - titleTextId = R.string.app_name ), POPULAR( route = PopularNavigation.route, - selectedIcon = MovieIcons.LocalFireDepartmentRounded, - unselectedIcon = MovieIcons.LocalFireDepartmentRounded, + icon = MovieIcons.LocalFireDepartmentRounded, iconTextId = popularR.string.popular, - titleTextId = popularR.string.popular ) } \ No newline at end of file diff --git a/app/src/main/java/com/jik/movie/splash/SplashScreen.kt b/app/src/main/java/com/jik/movie/splash/SplashScreen.kt index 53258b2..5f0939f 100644 --- a/app/src/main/java/com/jik/movie/splash/SplashScreen.kt +++ b/app/src/main/java/com/jik/movie/splash/SplashScreen.kt @@ -2,15 +2,22 @@ package com.jik.movie.splash import android.app.Activity import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay -import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.launch import kotlin.time.Duration +import kotlin.time.Duration.Companion.seconds + +fun Activity.showSplashScreenWithDelay(delay: Duration = 1.2.seconds) { + var splashOut = true + + CoroutineScope(Dispatchers.Main).launch { + delay(delay) + splashOut = false + } -fun Activity.createSplashScreen(delay: Duration) { installSplashScreen().setKeepOnScreenCondition { - runBlocking { - delay(duration = delay) - } - false + splashOut } } \ No newline at end of file diff --git a/app/src/main/java/com/jik/movie/ui/MovieApp.kt b/app/src/main/java/com/jik/movie/ui/MovieApp.kt index 1ba4116..8c3d470 100644 --- a/app/src/main/java/com/jik/movie/ui/MovieApp.kt +++ b/app/src/main/java/com/jik/movie/ui/MovieApp.kt @@ -1,5 +1,8 @@ package com.jik.movie.ui +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.slideInVertically +import androidx.compose.animation.slideOutVertically import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.padding import androidx.compose.material3.Scaffold @@ -10,26 +13,24 @@ import com.jik.core.designsystem.component.MovieNavigationBar import com.jik.core.designsystem.component.MovieNavigationBarItem import com.jik.core.designsystem.component.NavigationBarCornerSize import com.jik.core.designsystem.theme.MovieTheme +import com.jik.core.ui.util.modifier.conditional import com.jik.movie.navigation.MovieNavHost import com.jik.movie.navigation.TopLevelDestination @Composable fun MovieApp() { - MovieTheme( - dynamicColor = false - ) { + MovieTheme { val appState = rememberMovieAppState() val destination = appState.currentTopLevelDestination Scaffold( bottomBar = { - if (destination != null) { - MovieBottomBar( - topLevelDestination = appState.topLevelDestinations, - currentDestination = destination, - onNavigateToDestination = appState::navigateToDestination, - ) - } + MovieBottomBar( + visible = destination != null, + topLevelDestination = appState.topLevelDestinations, + currentDestination = destination, + onNavigateToDestination = appState::navigateToDestination, + ) }, contentWindowInsets = WindowInsets(0.dp) ) { @@ -38,11 +39,13 @@ fun MovieApp() { MovieNavHost( navController = appState.navController, - modifier = Modifier.padding( - top = topPadding, - bottom = if (destination != null && bottomPadding > 0.dp) bottomPadding - NavigationBarCornerSize - else bottomPadding - ) + modifier = Modifier.conditional(destination != null) { + padding( + top = topPadding, + bottom = if (destination != null && bottomPadding > 0.dp) bottomPadding - NavigationBarCornerSize + else bottomPadding + ) + } ) } } @@ -50,24 +53,31 @@ fun MovieApp() { @Composable fun MovieBottomBar( + visible: Boolean, topLevelDestination: List, - currentDestination: TopLevelDestination, + currentDestination: TopLevelDestination?, modifier: Modifier = Modifier, onNavigateToDestination: (TopLevelDestination) -> Unit, ) { - MovieNavigationBar( - modifier = modifier, - content = { - topLevelDestination.forEach { destination -> - val selected = destination.route == currentDestination.route - MovieNavigationBarItem( - selected = selected, - onClick = { onNavigateToDestination(destination) }, - iconImageVector = destination.selectedIcon, - selectedIconImageVector = destination.selectedIcon, - labelTextId = destination.iconTextId, - ) + AnimatedVisibility( + visible = visible, + enter = slideInVertically { it }, + exit = slideOutVertically { it } + ) { + MovieNavigationBar( + modifier = modifier, + content = { + topLevelDestination.forEach { destination -> + val selected = destination.route == currentDestination?.route + MovieNavigationBarItem( + selected = selected, + onClick = { onNavigateToDestination(destination) }, + iconImageVector = destination.icon, + selectedIconImageVector = destination.icon, + labelTextId = destination.iconTextId, + ) + } } - } - ) + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/jik/movie/ui/MovieAppState.kt b/app/src/main/java/com/jik/movie/ui/MovieAppState.kt index a9a2302..30cf11e 100644 --- a/app/src/main/java/com/jik/movie/ui/MovieAppState.kt +++ b/app/src/main/java/com/jik/movie/ui/MovieAppState.kt @@ -1,7 +1,5 @@ package com.jik.movie.ui -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable import androidx.compose.runtime.remember @@ -33,10 +31,6 @@ class MovieAppState( val navController: NavHostController, ) { - @OptIn(ExperimentalMaterial3Api::class) - val topAppBarScrollBehavior - @Composable get() = TopAppBarDefaults.enterAlwaysScrollBehavior() - private val currentDestination: NavDestination? @Composable get() = navController.currentBackStackEntryAsState().value?.destination diff --git a/core-data/src/main/java/com/jik/core/data/repository/MovieRepositoryMock.kt b/core-data/src/main/java/com/jik/core/data/repository/MovieRepositoryMock.kt deleted file mode 100644 index c604030..0000000 --- a/core-data/src/main/java/com/jik/core/data/repository/MovieRepositoryMock.kt +++ /dev/null @@ -1,55 +0,0 @@ -//package com.jik.core.data.repository -// -//import com.jik.core.model.Movie -//import com.jik.core.model.MovieInfo -// -//class MovieRepositoryMock() : MovieRepository { -// -// override fun getPopularMovies(): List { -// return listOf( -// Movie( -// id = 502356, -// title = "The Super Mario Bros. Movie", -// posterPath = "/qNBAXBIQlnOThrVvA6mA2B5ggV6.jpg" -// ), -// Movie( -// id = 677179, -// title = "Creed III", -// posterPath = "/vJU3rXSP9hwUuLeq8IpfsJShLOk.jpg" -// ), -// Movie( -// id = 76600, -// title = "Avatar: The Way of Water", -// posterPath = "/t6HIqrRAclMCA60NsSmeqe9RmNV.jpg" -// ), -// Movie( -// id = 638974, -// title = "Murder Mystery 2", -// posterPath = "/wdffZv8gIiWy6xr4t7hWBWtUwpl.jpg" -// ), -// ) -// } -// -// override fun getMovieInfo(id: Int): MovieInfo = -// MovieInfo( -// id = 76600, -// title = "Avatar: The Way of Water", -// genres = listOf( -// MovieInfo.Genre( -// id = 878, -// name = "Science Fiction" -// ), -// MovieInfo.Genre( -// id = 12, -// name = "Adventure" -// ), -// MovieInfo.Genre( -// id = 28, -// name = "Action" -// ) -// ), -// overview = "", -// posterPath = "", -// rating = 0.0 -// ) -//} \ No newline at end of file diff --git a/core-designsystem/src/main/java/com/jik/core/designsystem/component/Card.kt b/core-designsystem/src/main/java/com/jik/core/designsystem/component/Card.kt index f09752a..d838bde 100644 --- a/core-designsystem/src/main/java/com/jik/core/designsystem/component/Card.kt +++ b/core-designsystem/src/main/java/com/jik/core/designsystem/component/Card.kt @@ -2,7 +2,6 @@ package com.jik.core.designsystem.component import android.widget.Toast import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.size @@ -24,6 +23,7 @@ import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import coil.compose.AsyncImage import com.jik.core.designsystem.theme.MovieTheme +import com.jik.core.ui.util.modifier.clickableSingle @Composable fun PosterCard( @@ -47,7 +47,7 @@ fun PosterCard( contentDescription = contentDescription, modifier = Modifier .fillMaxSize() - .clickable(enabled = clickable) { onClick() }, + .clickableSingle(enabled = clickable) { onClick() }, placeholder = placeholder, alignment = alignment, contentScale = contentScale @@ -79,7 +79,7 @@ fun GradientPosterCard( contentDescription = contentDescription, modifier = Modifier .fillMaxSize() - .clickable(enabled = clickable) { onClick() }, + .clickableSingle(enabled = clickable) { onClick() }, placeholder = placeholder, alignment = alignment, contentScale = contentScale @@ -128,9 +128,7 @@ enum class GradientArea { @Preview @Composable fun PosterCardPreview() { - MovieTheme( - dynamicColor = false - ) { + MovieTheme { val context = LocalContext.current PosterCard( posterPath = "https://image.tmdb.org/t/p/w500/qNBAXBIQlnOThrVvA6mA2B5ggV6.jpg", diff --git a/core-designsystem/src/main/java/com/jik/core/designsystem/component/Navigation.kt b/core-designsystem/src/main/java/com/jik/core/designsystem/component/Navigation.kt index f508a86..d9b9394 100644 --- a/core-designsystem/src/main/java/com/jik/core/designsystem/component/Navigation.kt +++ b/core-designsystem/src/main/java/com/jik/core/designsystem/component/Navigation.kt @@ -101,6 +101,18 @@ fun RowScope.MovieNavigationBarItem( } } +@Composable +private fun MovieNavigationBarItemIcon( + selected: Boolean, + iconImageVector: ImageVector, + selectedIconImageVector: ImageVector, +) { + Icon( + imageVector = if (selected) selectedIconImageVector else iconImageVector, + tint = if (selected) selectedIconColor() else unselectedIconColor(), + contentDescription = null + ) +} @Composable private fun MovieNavigationBarItemLabelAndIcon( @@ -128,19 +140,6 @@ private fun MovieNavigationBarItemLabelAndIcon( } } -@Composable -private fun MovieNavigationBarItemIcon( - selected: Boolean, - iconImageVector: ImageVector, - selectedIconImageVector: ImageVector, -) { - Icon( - imageVector = if (selected) selectedIconImageVector else iconImageVector, - tint = if (selected) selectedIconColor() else unselectedIconColor(), - contentDescription = null - ) -} - private object MovieNavigationBarItemDefaults { @Composable fun selectedIconColor() = MaterialTheme.colorScheme.onSurface diff --git a/core-designsystem/src/main/java/com/jik/core/designsystem/component/TopAppBar.kt b/core-designsystem/src/main/java/com/jik/core/designsystem/component/TopAppBar.kt index 4a9bf84..5ff4c75 100644 --- a/core-designsystem/src/main/java/com/jik/core/designsystem/component/TopAppBar.kt +++ b/core-designsystem/src/main/java/com/jik/core/designsystem/component/TopAppBar.kt @@ -5,8 +5,9 @@ import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontFamily -import androidx.compose.ui.unit.TextUnit +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import com.jik.core.designsystem.theme.MovieTheme import com.jik.core.ui.preview.ThemePreviews @@ -22,7 +23,8 @@ fun MovieTopAppBar( ), scrollBehavior: TopAppBarScrollBehavior? = null, titleFontFamily: FontFamily? = null, - titleFontSize: TextUnit = TextUnit.Unspecified, + titleStyle: TextStyle = MaterialTheme.typography.titleLarge, + titleWeight: FontWeight = FontWeight.Bold, ) { TopAppBar( title = { @@ -30,7 +32,8 @@ fun MovieTopAppBar( text = stringResource(id = titleRes), color = MaterialTheme.colorScheme.primary, fontFamily = titleFontFamily, - fontSize = titleFontSize + fontWeight = titleWeight, + style = titleStyle ) }, colors = colors, @@ -43,9 +46,7 @@ fun MovieTopAppBar( @ThemePreviews @Composable private fun TopAppBarPreview() { - MovieTheme( - dynamicColor = false - ) { + MovieTheme { MovieTopAppBar( titleRes = android.R.string.untitled, scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior() diff --git a/core-designsystem/src/main/java/com/jik/core/designsystem/icon/MovieIcons.kt b/core-designsystem/src/main/java/com/jik/core/designsystem/icon/MovieIcons.kt index 5a2f5cd..20c7ae7 100644 --- a/core-designsystem/src/main/java/com/jik/core/designsystem/icon/MovieIcons.kt +++ b/core-designsystem/src/main/java/com/jik/core/designsystem/icon/MovieIcons.kt @@ -1,23 +1,20 @@ package com.jik.core.designsystem.icon import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Home -import androidx.compose.material.icons.filled.LocalFireDepartment import androidx.compose.material.icons.filled.Refresh import androidx.compose.material.icons.filled.Star -import androidx.compose.material.icons.outlined.Home -import androidx.compose.material.icons.outlined.LocalFireDepartment import androidx.compose.material.icons.rounded.Home import androidx.compose.material.icons.rounded.LocalFireDepartment +import androidx.compose.ui.graphics.Color object MovieIcons { val Refresh = Icons.Filled.Refresh val Star = Icons.Filled.Star - val Home = Icons.Filled.Home val HomeRounded = Icons.Rounded.Home - val HomeOutlined = Icons.Outlined.Home - val LocalFireDepartment = Icons.Filled.LocalFireDepartment val LocalFireDepartmentRounded = Icons.Rounded.LocalFireDepartment - val LocalFireDepartmentOutlined = Icons.Outlined.LocalFireDepartment +} + +object IconColor { + val Star = Color(0xFFFFC72F) } \ No newline at end of file diff --git a/core-designsystem/src/main/java/com/jik/core/designsystem/theme/Color.kt b/core-designsystem/src/main/java/com/jik/core/designsystem/theme/Color.kt index d030fee..fcd6ba0 100644 --- a/core-designsystem/src/main/java/com/jik/core/designsystem/theme/Color.kt +++ b/core-designsystem/src/main/java/com/jik/core/designsystem/theme/Color.kt @@ -2,9 +2,6 @@ package com.jik.core.designsystem.theme import androidx.compose.ui.graphics.Color -object IconColor { - val Star = Color(0xFFFFC72F) -} internal val md_theme_light_primary = Color(0xFFE21111) internal val md_theme_light_onPrimary = Color(0xFFFFFFFF) diff --git a/core-designsystem/src/main/java/com/jik/core/designsystem/theme/Font.kt b/core-designsystem/src/main/java/com/jik/core/designsystem/theme/Font.kt new file mode 100644 index 0000000..b64a72c --- /dev/null +++ b/core-designsystem/src/main/java/com/jik/core/designsystem/theme/Font.kt @@ -0,0 +1,16 @@ +package com.jik.core.designsystem.theme + +import androidx.compose.ui.text.font.Font +import androidx.compose.ui.text.font.FontFamily +import com.jik.core.designsystem.R + +object MovieFontFamily { + + val Sansita = FontFamily( + Font(R.font.sansita_blackitalic), + ) + + val LilitaOne = FontFamily( + Font(R.font.lilita_one), + ) +} \ No newline at end of file diff --git a/core-designsystem/src/main/java/com/jik/core/designsystem/theme/Theme.kt b/core-designsystem/src/main/java/com/jik/core/designsystem/theme/Theme.kt index 6bec33c..279c599 100644 --- a/core-designsystem/src/main/java/com/jik/core/designsystem/theme/Theme.kt +++ b/core-designsystem/src/main/java/com/jik/core/designsystem/theme/Theme.kt @@ -73,7 +73,7 @@ private val isSdkHigher31 = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S fun MovieTheme( darkTheme: Boolean = isSystemInDarkTheme(), // Dynamic color is available on Android 12+ - dynamicColor: Boolean = isSdkHigher31, + dynamicColor: Boolean = false, content: @Composable () -> Unit ) { val colorScheme = when { @@ -99,7 +99,7 @@ fun MovieTheme( MaterialTheme( colorScheme = colorScheme, - typography = Typography, + typography = MovieTypography, content = content ) } \ No newline at end of file diff --git a/core-designsystem/src/main/java/com/jik/core/designsystem/theme/Type.kt b/core-designsystem/src/main/java/com/jik/core/designsystem/theme/Type.kt index 8354d11..a5feb05 100644 --- a/core-designsystem/src/main/java/com/jik/core/designsystem/theme/Type.kt +++ b/core-designsystem/src/main/java/com/jik/core/designsystem/theme/Type.kt @@ -2,46 +2,98 @@ package com.jik.core.designsystem.theme import androidx.compose.material3.Typography import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.font.Font -import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.sp -import com.jik.core.designsystem.R -// Set of Material typography styles to start with -val Typography = Typography( - titleLarge = TextStyle( - fontWeight = FontWeight.Bold, +internal val MovieTypography = Typography( + displayLarge = TextStyle( + fontWeight = FontWeight.Normal, + fontSize = 57.sp, + lineHeight = 64.sp, + letterSpacing = (-0.25).sp, + ), + displayMedium = TextStyle( + fontWeight = FontWeight.Normal, + fontSize = 45.sp, + lineHeight = 52.sp, + letterSpacing = 0.sp, + ), + displaySmall = TextStyle( + fontWeight = FontWeight.Normal, + fontSize = 36.sp, + lineHeight = 44.sp, + letterSpacing = 0.sp, + ), + headlineLarge = TextStyle( + fontWeight = FontWeight.Normal, + fontSize = 32.sp, + lineHeight = 40.sp, + letterSpacing = 0.sp, + ), + headlineMedium = TextStyle( + fontWeight = FontWeight.Normal, + fontSize = 28.sp, + lineHeight = 36.sp, + letterSpacing = 0.sp, + ), + headlineSmall = TextStyle( + fontWeight = FontWeight.Normal, fontSize = 24.sp, + lineHeight = 32.sp, + letterSpacing = 0.sp, + ), + titleLarge = TextStyle( + fontWeight = FontWeight.Normal, + fontSize = 22.sp, lineHeight = 28.sp, - letterSpacing = 0.sp + letterSpacing = 0.sp, ), titleMedium = TextStyle( fontWeight = FontWeight.Bold, fontSize = 18.sp, lineHeight = 24.sp, - letterSpacing = 0.1.sp + letterSpacing = 0.1.sp, ), - bodyMedium = TextStyle( + titleSmall = TextStyle( fontWeight = FontWeight.Medium, fontSize = 14.sp, - lineHeight = 18.sp, - letterSpacing = 0.1.sp + lineHeight = 20.sp, + letterSpacing = 0.1.sp, ), - labelMedium = TextStyle( + bodyLarge = TextStyle( + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp, + ), + bodyMedium = TextStyle( + fontWeight = FontWeight.Normal, + fontSize = 14.sp, + lineHeight = 20.sp, + letterSpacing = 0.25.sp, + ), + bodySmall = TextStyle( + fontWeight = FontWeight.Normal, + fontSize = 12.sp, + lineHeight = 16.sp, + letterSpacing = 0.4.sp, + ), + labelLarge = TextStyle( fontWeight = FontWeight.Medium, fontSize = 14.sp, lineHeight = 20.sp, - letterSpacing = 0.1.sp - ) -) - - -object MovieFontFamily { - val Sansita = FontFamily( - Font(R.font.sansita_blackitalic), - ) - val LilitaOne = FontFamily( - Font(R.font.lilita_one), - ) -} \ No newline at end of file + letterSpacing = 0.1.sp, + ), + labelMedium = TextStyle( + fontWeight = FontWeight.Medium, + fontSize = 12.sp, + lineHeight = 16.sp, + letterSpacing = 0.5.sp, + ), + labelSmall = TextStyle( + fontWeight = FontWeight.Medium, + fontSize = 10.sp, + lineHeight = 16.sp, + letterSpacing = 0.sp, + ), +) \ No newline at end of file diff --git a/core-network/src/main/java/com/jik/core/network/source/MovieRemoteDataSourceImpl.kt b/core-network/src/main/java/com/jik/core/network/source/MovieRemoteDataSourceImpl.kt index d84265a..8962531 100644 --- a/core-network/src/main/java/com/jik/core/network/source/MovieRemoteDataSourceImpl.kt +++ b/core-network/src/main/java/com/jik/core/network/source/MovieRemoteDataSourceImpl.kt @@ -8,6 +8,7 @@ import javax.inject.Inject class MovieRemoteDataSourceImpl @Inject constructor( private val movieService: MovieService ) : MovieRemoteDataSource { + override suspend fun getPopularMovies(page: Int): Result> { return movieService.getPopularMovieList(page).mapCatching { it.results diff --git a/core-ui/src/main/java/com/jik/core/ui/pagination/Base.kt b/core-ui/src/main/java/com/jik/core/ui/pagination/Base.kt index c855c80..da39249 100644 --- a/core-ui/src/main/java/com/jik/core/ui/pagination/Base.kt +++ b/core-ui/src/main/java/com/jik/core/ui/pagination/Base.kt @@ -1,14 +1,11 @@ package com.jik.core.ui.pagination -import androidx.compose.foundation.lazy.LazyListLayoutInfo -import androidx.compose.foundation.lazy.grid.LazyGridLayoutInfo import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.remember - -internal object Base { +internal object BasePageable { @Composable fun Operate(calculateShouldLoadMore: () -> Boolean, onLoadMore: suspend () -> Unit) { @@ -26,18 +23,7 @@ internal object Base { } // means that if the last visible item is 'threshold' or less from the end of the list, return true - fun calculateShouldLoadMore(layoutInfo: T, threshold: Int): Boolean { - val itemCount = when (layoutInfo) { - is LazyGridLayoutInfo -> layoutInfo.totalItemsCount - is LazyListLayoutInfo -> layoutInfo.totalItemsCount - else -> throw IllegalArgumentException("Unsupported layoutInfo type") - } - val lastVisibleItem = when (layoutInfo) { - is LazyGridLayoutInfo -> layoutInfo.visibleItemsInfo.lastOrNull()?.index ?: 0 - is LazyListLayoutInfo -> layoutInfo.visibleItemsInfo.lastOrNull()?.index ?: 0 - else -> throw IllegalArgumentException("Unsupported layoutInfo type") - } - + fun calculateShouldLoadMore(itemCount: Int, lastVisibleItem: Int, threshold: Int): Boolean { return lastVisibleItem >= itemCount - threshold } } \ No newline at end of file diff --git a/core-ui/src/main/java/com/jik/core/ui/pagination/Grid.kt b/core-ui/src/main/java/com/jik/core/ui/pagination/Grid.kt index 42bb018..f34f473 100644 --- a/core-ui/src/main/java/com/jik/core/ui/pagination/Grid.kt +++ b/core-ui/src/main/java/com/jik/core/ui/pagination/Grid.kt @@ -2,9 +2,6 @@ package com.jik.core.ui.pagination import androidx.compose.foundation.lazy.grid.LazyGridState import androidx.compose.runtime.Composable -import com.jik.core.ui.pagination.Base.Operate -import com.jik.core.ui.pagination.Base.calculateShouldLoadMore - @Composable fun LazyGridState.Pageable( @@ -12,13 +9,15 @@ fun LazyGridState.Pageable( threshold: Int = 4 ) { - Operate( - onLoadMore = onLoadMore, - calculateShouldLoadMore = { - calculateShouldLoadMore( - layoutInfo = this.layoutInfo, - threshold = threshold - ) - } + val calculateShouldLoadMore = + BasePageable.calculateShouldLoadMore( + itemCount = layoutInfo.totalItemsCount, + lastVisibleItem = layoutInfo.visibleItemsInfo.lastOrNull()?.index ?: 0, + threshold = threshold + ) + + BasePageable.Operate( + calculateShouldLoadMore = { calculateShouldLoadMore }, + onLoadMore = onLoadMore ) } \ No newline at end of file diff --git a/core-ui/src/main/java/com/jik/core/ui/pagination/List.kt b/core-ui/src/main/java/com/jik/core/ui/pagination/List.kt index cb95a5e..b3ca8c4 100644 --- a/core-ui/src/main/java/com/jik/core/ui/pagination/List.kt +++ b/core-ui/src/main/java/com/jik/core/ui/pagination/List.kt @@ -2,8 +2,6 @@ package com.jik.core.ui.pagination import androidx.compose.foundation.lazy.LazyListState import androidx.compose.runtime.Composable -import com.jik.core.ui.pagination.Base.Operate -import com.jik.core.ui.pagination.Base.calculateShouldLoadMore @Composable fun LazyListState.Pageable( @@ -11,13 +9,15 @@ fun LazyListState.Pageable( threshold: Int = 4 ) { - Operate( - onLoadMore = onLoadMore, - calculateShouldLoadMore = { - calculateShouldLoadMore( - layoutInfo = this.layoutInfo, - threshold = threshold - ) - } + val calculateShouldLoadMore = + BasePageable.calculateShouldLoadMore( + itemCount = layoutInfo.totalItemsCount, + lastVisibleItem = layoutInfo.visibleItemsInfo.lastOrNull()?.index ?: 0, + threshold = threshold + ) + + BasePageable.Operate( + calculateShouldLoadMore = { calculateShouldLoadMore }, + onLoadMore = onLoadMore ) } \ No newline at end of file diff --git a/core-ui/src/main/java/com/jik/core/ui/state/UiState.kt b/core-ui/src/main/java/com/jik/core/ui/state/UiState.kt index bb77627..ef5e16d 100644 --- a/core-ui/src/main/java/com/jik/core/ui/state/UiState.kt +++ b/core-ui/src/main/java/com/jik/core/ui/state/UiState.kt @@ -1,9 +1,6 @@ package com.jik.core.ui.state -import kotlinx.coroutines.CoroutineDispatcher -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.flow -import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.onStart sealed interface UiState { @@ -14,17 +11,18 @@ sealed interface UiState { fun Result.toUiState(): UiState { - onSuccess { - return UiState.Success(it) - }.onFailure { - return UiState.Error(it) - } - return UiState.Loading + return fold( + onSuccess = { + UiState.Success(it) + }, + onFailure = { + UiState.Error(it) + } + ) } fun getUiStateFlow( - dispatcher: CoroutineDispatcher = Dispatchers.IO, block: suspend () -> Result, ) = flow { emit(block().toUiState()) -}.onStart { emit(UiState.Loading) }.flowOn(dispatcher) \ No newline at end of file +}.onStart { emit(UiState.Loading) } \ No newline at end of file diff --git a/core-ui/src/main/java/com/jik/core/ui/util/DimensionUtils.kt b/core-ui/src/main/java/com/jik/core/ui/util/DimensionUtils.kt index 7a38e56..8293a37 100644 --- a/core-ui/src/main/java/com/jik/core/ui/util/DimensionUtils.kt +++ b/core-ui/src/main/java/com/jik/core/ui/util/DimensionUtils.kt @@ -2,10 +2,6 @@ package com.jik.core.ui.util import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalDensity -import androidx.compose.ui.unit.Dp - -@Composable -fun Dp.dpToPx() = with(LocalDensity.current) { this@dpToPx.toPx() } @Composable fun Int.pxToDp() = with(LocalDensity.current) { this@pxToDp.toDp() } \ No newline at end of file diff --git a/core-ui/src/main/java/com/jik/core/ui/util/Toast.kt b/core-ui/src/main/java/com/jik/core/ui/util/Toast.kt deleted file mode 100644 index d675db1..0000000 --- a/core-ui/src/main/java/com/jik/core/ui/util/Toast.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.jik.core.ui.util - -import android.content.Context -import android.widget.Toast - -fun toast(context: Context, message: String) { - Toast.makeText(context, message, Toast.LENGTH_SHORT).show() -} \ No newline at end of file diff --git a/core-ui/src/main/java/com/jik/core/ui/util/modifier/ClickableSingle.kt b/core-ui/src/main/java/com/jik/core/ui/util/modifier/ClickableSingle.kt new file mode 100644 index 0000000..1953cb3 --- /dev/null +++ b/core-ui/src/main/java/com/jik/core/ui/util/modifier/ClickableSingle.kt @@ -0,0 +1,26 @@ +package com.jik.core.ui.util.modifier + +import androidx.compose.foundation.clickable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.composed + +fun Modifier.clickableSingle( + enabled: Boolean = true, + onClick: () -> Unit +): Modifier = composed { + + var lastClickTime by remember { mutableStateOf(0L) } + + this.clickable(enabled = enabled) { + if (System.currentTimeMillis() - lastClickTime > LAST_CLICK_TERM) { + lastClickTime = System.currentTimeMillis() + onClick() + } + } +} + +private const val LAST_CLICK_TERM = 1000L \ No newline at end of file diff --git a/core-ui/src/main/java/com/jik/core/ui/util/modifier/Condition.kt b/core-ui/src/main/java/com/jik/core/ui/util/modifier/Condition.kt new file mode 100644 index 0000000..dc81e7b --- /dev/null +++ b/core-ui/src/main/java/com/jik/core/ui/util/modifier/Condition.kt @@ -0,0 +1,7 @@ +package com.jik.core.ui.util.modifier + +import androidx.compose.ui.Modifier + + +fun Modifier.conditional(condition: Boolean, modifier: Modifier.() -> Modifier): Modifier = + if (condition) this.modifier() else this \ No newline at end of file diff --git a/feature-detail/src/main/java/com/jik/feature/detail/DetailScreen.kt b/feature-detail/src/main/java/com/jik/feature/detail/DetailScreen.kt index 42f904a..df37ed0 100644 --- a/feature-detail/src/main/java/com/jik/feature/detail/DetailScreen.kt +++ b/feature-detail/src/main/java/com/jik/feature/detail/DetailScreen.kt @@ -21,8 +21,8 @@ import com.jik.core.designsystem.component.GradientArea import com.jik.core.designsystem.component.GradientPosterCard import com.jik.core.designsystem.component.LoadingWheel import com.jik.core.designsystem.component.Refresh +import com.jik.core.designsystem.icon.IconColor import com.jik.core.designsystem.icon.MovieIcons -import com.jik.core.designsystem.theme.IconColor import com.jik.core.model.MovieInfo import com.jik.core.ui.state.UiState import com.jik.core.ui.util.MovieGenreUtils @@ -47,7 +47,7 @@ fun DetailScreen( } } is UiState.Success -> { - DetailScreenContent( + Content( movieInfo = detailUiState.data, modifier = modifier ) @@ -66,7 +66,7 @@ fun DetailScreen( @OptIn(ExperimentalMaterial3Api::class) @Composable -fun DetailScreenContent( +private fun Content( movieInfo: MovieInfo, modifier: Modifier = Modifier ) { @@ -167,8 +167,7 @@ private fun Genres(movieInfo: MovieInfo) { ) { Text( text = genre.name, - modifier = Modifier - .align(Alignment.Center), + modifier = Modifier.align(Alignment.Center), color = Color.White, style = MaterialTheme.typography.labelMedium, ) diff --git a/feature-detail/src/main/java/com/jik/feature/detail/navigation/DetailNavigation.kt b/feature-detail/src/main/java/com/jik/feature/detail/navigation/DetailNavigation.kt index 33763f3..e6ef624 100644 --- a/feature-detail/src/main/java/com/jik/feature/detail/navigation/DetailNavigation.kt +++ b/feature-detail/src/main/java/com/jik/feature/detail/navigation/DetailNavigation.kt @@ -1,5 +1,6 @@ package com.jik.feature.detail.navigation +import androidx.compose.animation.* import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -28,10 +29,16 @@ object DetailNavigation { navigate("${route}/$movieId") } - fun NavGraphBuilder.installDetailScreen() { + @OptIn(ExperimentalAnimationApi::class) + fun NavGraphBuilder.installDetailScreen( + enterTransition: EnterTransition, + exitTransition: ExitTransition + ) { composable( route = routeWithArgs, - arguments = arguments + arguments = arguments, + enterTransition = { enterTransition }, + exitTransition = { exitTransition } ) { StatusBarColor(color = Color.Transparent) DetailScreen( diff --git a/feature-home/build.gradle.kts b/feature-home/build.gradle.kts index ee67b17..3d82807 100644 --- a/feature-home/build.gradle.kts +++ b/feature-home/build.gradle.kts @@ -50,7 +50,6 @@ dependencies { implementation(projects.coreUi) implementation(projects.coreModel) implementation(projects.coreData) - implementation(projects.featureDetail) implementation(libs.androidx.ktx) implementation(libs.androidx.runtime.ktx) diff --git a/feature-home/src/main/java/com/jik/feature/home/HomeScreen.kt b/feature-home/src/main/java/com/jik/feature/home/HomeScreen.kt index ef3cd76..dbbf333 100644 --- a/feature-home/src/main/java/com/jik/feature/home/HomeScreen.kt +++ b/feature-home/src/main/java/com/jik/feature/home/HomeScreen.kt @@ -13,7 +13,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.jik.core.designsystem.component.* @@ -33,7 +32,7 @@ fun HomeScreen( val mainMovie = homeViewModel.mainMovie.collectAsStateWithLifecycle().value Box(modifier = modifier) { - HomeScreenContent( + Content( modifier = Modifier .fillMaxSize() .verticalScroll(rememberScrollState()), @@ -44,12 +43,12 @@ fun HomeScreen( onRetry = homeViewModel::getPopularMovies, onPosterClick = onPosterClick ) - HomeScreenTopBar() + TopBar() } } @Composable -fun HomeScreenContent( +private fun Content( modifier: Modifier = Modifier, homeUiState: UiState, mainMovie: Movie, @@ -61,11 +60,11 @@ fun HomeScreenContent( val coroutineScope = rememberCoroutineScope() Column(modifier) { - HomeScreenTopContent( + TopContent( mainMovie = mainMovie, onPosterClick = onPosterClick, ) - HomeScreenPopularContent( + PopularContent( popularMovies = popularMovies, onLoadMore = onLoadMore, onPosterClick = onPosterClick @@ -95,7 +94,7 @@ fun HomeScreenContent( @Composable -fun HomeScreenTopContent( +private fun TopContent( mainMovie: Movie, modifier: Modifier = Modifier, onPosterClick: (Long) -> Unit, @@ -117,7 +116,7 @@ fun HomeScreenTopContent( @Composable -fun HomeScreenPopularContent( +fun PopularContent( modifier: Modifier = Modifier, popularMovies: List, onLoadMore: suspend () -> Unit, @@ -162,18 +161,18 @@ fun HomeScreenPopularContent( @OptIn(ExperimentalMaterial3Api::class) @Composable -fun HomeScreenTopBar( +private fun TopBar( modifier: Modifier = Modifier, ) { MovieTopAppBar( - modifier = modifier, titleRes = com.jik.core.ui.R.string.logo, + modifier = modifier, colors = TopAppBarDefaults.topAppBarColors( containerColor = MaterialTheme.colorScheme.background.copy( alpha = 0.0f ) ), + titleStyle = MaterialTheme.typography.displayMedium, titleFontFamily = MovieFontFamily.LilitaOne, - titleFontSize = 40.sp ) } \ No newline at end of file diff --git a/feature-home/src/main/java/com/jik/feature/home/navigation/HomeNavigation.kt b/feature-home/src/main/java/com/jik/feature/home/navigation/HomeNavigation.kt index f1aa963..285442f 100644 --- a/feature-home/src/main/java/com/jik/feature/home/navigation/HomeNavigation.kt +++ b/feature-home/src/main/java/com/jik/feature/home/navigation/HomeNavigation.kt @@ -1,12 +1,12 @@ package com.jik.feature.home.navigation +import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.ui.graphics.Color import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions import androidx.navigation.compose.composable import com.jik.core.ui.util.StatusBarColor -import com.jik.feature.detail.navigation.DetailNavigation.navigateDetail import com.jik.feature.home.HomeScreen object HomeNavigation { @@ -17,16 +17,15 @@ object HomeNavigation { navigate(route, navOptions) } + @OptIn(ExperimentalAnimationApi::class) fun NavGraphBuilder.installHomeScreen( - navController: NavController + onPosterClick: (Long) -> Unit ) { composable( route = HomeNavigation.route ) { StatusBarColor(color = Color.Transparent) - HomeScreen( - onPosterClick = { movieId -> navController.navigateDetail(movieId) } - ) + HomeScreen(onPosterClick = onPosterClick) } } } \ No newline at end of file diff --git a/feature-popular/build.gradle.kts b/feature-popular/build.gradle.kts index 55b0f1a..66051c0 100644 --- a/feature-popular/build.gradle.kts +++ b/feature-popular/build.gradle.kts @@ -48,7 +48,6 @@ dependencies { implementation(projects.coreUi) implementation(projects.coreModel) implementation(projects.coreData) - implementation(projects.featureDetail) implementation(libs.androidx.ktx) implementation(libs.androidx.runtime.ktx) diff --git a/feature-popular/src/main/java/com/jik/feature/popular/PopularScreen.kt b/feature-popular/src/main/java/com/jik/feature/popular/PopularScreen.kt index 7085722..cceb714 100644 --- a/feature-popular/src/main/java/com/jik/feature/popular/PopularScreen.kt +++ b/feature-popular/src/main/java/com/jik/feature/popular/PopularScreen.kt @@ -17,7 +17,9 @@ import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import com.jik.core.designsystem.component.* +import com.jik.core.model.Movie import com.jik.core.ui.pagination.Pageable +import com.jik.core.ui.state.UiState import kotlinx.coroutines.launch @@ -32,8 +34,9 @@ fun PopularScreen( val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior() Column(modifier = modifier.nestedScroll(scrollBehavior.nestedScrollConnection)) { - PopularScreenTopBar(scrollBehavior = scrollBehavior) - PopularScreenContent( + TopBar(scrollBehavior = scrollBehavior) + + Content( popularUiStates = popularViewModel.popularUiStates, onLoadMore = popularViewModel::getPopularMovies, onRetry = popularViewModel::getPopularMovies, @@ -48,7 +51,7 @@ fun PopularScreen( @OptIn(ExperimentalMaterial3Api::class) @Composable -fun PopularScreenTopBar(scrollBehavior: TopAppBarScrollBehavior) { +private fun TopBar(scrollBehavior: TopAppBarScrollBehavior) { MovieTopAppBar( titleRes = R.string.popular, scrollBehavior = scrollBehavior @@ -56,8 +59,8 @@ fun PopularScreenTopBar(scrollBehavior: TopAppBarScrollBehavior) { } @Composable -fun PopularScreenContent( - popularUiStates: List, +private fun Content( + popularUiStates: List>, onLoadMore: suspend () -> Unit, onRetry: suspend () -> Unit, onPosterClick: (Long) -> Unit, @@ -81,18 +84,18 @@ fun PopularScreenContent( ) { popularUiStates.forEachIndexed { index, uiState -> when (uiState) { - is PopularUiState.Data -> { + is UiState.Success -> { item { PosterCard( - posterPath = uiState.movie.getPosterUrl(), + posterPath = uiState.data.getPosterUrl(), modifier = Modifier .sizeIn(minWidth = 160.dp, minHeight = 240.dp) .aspectRatio(2f / 3f), - onClick = { onPosterClick(uiState.movie.id) } + onClick = { onPosterClick(uiState.data.id) } ) } } - is PopularUiState.Loading -> { + is UiState.Loading -> { if (index != popularUiStates.size - 1) return@forEachIndexed item(span = { GridItemSpan(maxLineSpan) }) { @@ -101,13 +104,11 @@ fun PopularScreenContent( } } } - is PopularUiState.Error -> { + is UiState.Error -> { if (index != popularUiStates.size - 1) return@forEachIndexed item(span = { GridItemSpan(maxLineSpan) }) { - Box( - modifier = Modifier.height(popularScreenHeight) - ) { + Box(modifier = Modifier.height(popularScreenHeight)) { Refresh( modifier = Modifier.align(Alignment.Center), onClick = { diff --git a/feature-popular/src/main/java/com/jik/feature/popular/PopularViewModel.kt b/feature-popular/src/main/java/com/jik/feature/popular/PopularViewModel.kt index f5ab9e8..c6ca3ec 100644 --- a/feature-popular/src/main/java/com/jik/feature/popular/PopularViewModel.kt +++ b/feature-popular/src/main/java/com/jik/feature/popular/PopularViewModel.kt @@ -7,7 +7,6 @@ import com.jik.core.model.Movie import com.jik.core.ui.state.UiState import com.jik.core.ui.state.getUiStateFlow import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.MutableStateFlow import javax.inject.Inject @HiltViewModel @@ -15,24 +14,23 @@ class PopularViewModel @Inject constructor( private val movieRepository: MovieRepository ) : ViewModel() { - private val page = MutableStateFlow(FIRST_PAGE) - - val popularUiStates = mutableStateListOf() + private var page = FIRST_PAGE + val popularUiStates = mutableStateListOf>() suspend fun getPopularMovies() { - getUiStateFlow { movieRepository.getPopularMovies(page.value) } + getUiStateFlow { movieRepository.getPopularMovies(page) } .collect { uiState -> when (uiState) { is UiState.Loading -> { - popularUiStates.add(PopularUiState.Loading) + popularUiStates.add(uiState) } is UiState.Error -> { - popularUiStates.add(PopularUiState.Error(uiState.throwable)) + popularUiStates.add(uiState) } is UiState.Success -> { - popularUiStates.addAll(uiState.data.map { PopularUiState.Data(it) }) - page.value++ + popularUiStates.addAll(uiState.data.map { UiState.Success(it) }) + page++ } } } @@ -41,14 +39,4 @@ class PopularViewModel @Inject constructor( companion object { private const val FIRST_PAGE = 1 } -} - - -sealed interface PopularUiState { - - object Loading : PopularUiState - - data class Data(val movie: Movie) : PopularUiState - - data class Error(val throwable: Throwable) : PopularUiState -} +} \ No newline at end of file diff --git a/feature-popular/src/main/java/com/jik/feature/popular/navigation/PopularNavigation.kt b/feature-popular/src/main/java/com/jik/feature/popular/navigation/PopularNavigation.kt index 3cb7c60..25dc855 100644 --- a/feature-popular/src/main/java/com/jik/feature/popular/navigation/PopularNavigation.kt +++ b/feature-popular/src/main/java/com/jik/feature/popular/navigation/PopularNavigation.kt @@ -1,10 +1,10 @@ package com.jik.feature.popular.navigation +import androidx.compose.animation.ExperimentalAnimationApi import androidx.navigation.NavController import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions import androidx.navigation.compose.composable -import com.jik.feature.detail.navigation.DetailNavigation.navigateDetail import com.jik.feature.popular.PopularScreen @@ -15,15 +15,14 @@ object PopularNavigation { navigate(route, navOptions) } + @OptIn(ExperimentalAnimationApi::class) fun NavGraphBuilder.installPopularScreen( - navController: NavController, + onPosterClick: (Long) -> Unit ) { composable( route = PopularNavigation.route ) { - PopularScreen( - onPosterClick = { movieId -> navController.navigateDetail(movieId) }, - ) + PopularScreen(onPosterClick = onPosterClick) } } } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 22864f4..9aa5eac 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ ktx = "1.9.0" runtime-ktx = "2.6.1" compose = "1.4.3" compose-activity = "1.7.0" -compose-navigation = "2.6.0" +compose-navigation = "2.7.0-alpha01" accompanist = "0.30.1" material3 = "1.1.0-beta01" junit = "4.13.2"