launch new view when tapping movie poster

This commit is contained in:
Owen LeJeune
2022-02-10 21:33:07 -05:00
parent ce8efd7eea
commit d0a08307d8
11 changed files with 85 additions and 34 deletions

View File

@@ -2,5 +2,6 @@ package com.owenlejeune.tvtime.api.tmdb.model
abstract class MediaItem(
open val posterPath: String?,
@Transient open val title: String
@Transient open val title: String,
@Transient open val id: Int
)

View File

@@ -4,5 +4,6 @@ import com.google.gson.annotations.SerializedName
data class PopularMovie(
@SerializedName("poster_path") override val posterPath: String?,
@SerializedName("title") override val title: String
): MediaItem(posterPath, title)
@SerializedName("title") override val title: String,
@SerializedName("id") override val id: Int
): MediaItem(posterPath, title, id)

View File

@@ -4,5 +4,6 @@ import com.google.gson.annotations.SerializedName
data class PopularTv(
@SerializedName("poster_path") override val posterPath: String?,
@SerializedName("name") val name: String
): MediaItem(posterPath, name)
@SerializedName("name") val name: String,
@SerializedName("id") override val id: Int
): MediaItem(posterPath, name, id)

View File

@@ -17,6 +17,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import coil.compose.rememberImagePainter
import coil.transform.RoundedCornersTransformation
import com.owenlejeune.tvtime.R
@@ -24,10 +25,14 @@ import com.owenlejeune.tvtime.api.tmdb.TmdbUtils
import com.owenlejeune.tvtime.api.tmdb.model.MediaItem
import com.owenlejeune.tvtime.extensions.dpToPx
import com.owenlejeune.tvtime.extensions.listItems
import com.owenlejeune.tvtime.ui.navigation.MainNavItem
@OptIn(ExperimentalFoundationApi::class)
@Composable
fun PosterGrid(fetchMedia: (MutableState<List<MediaItem>>) -> Unit) {
fun PosterGrid(
appNavController: NavController,
fetchMedia: (MutableState<List<MediaItem>>) -> Unit
) {
val mediaList = remember { mutableStateOf(emptyList<MediaItem>()) }
fetchMedia(mediaList)
@@ -36,13 +41,16 @@ fun PosterGrid(fetchMedia: (MutableState<List<MediaItem>>) -> Unit) {
contentPadding = PaddingValues(8.dp)
) {
listItems(mediaList.value) { item ->
PosterItem(mediaItem = item)
PosterItem(appNavController = appNavController, mediaItem = item)
}
}
}
@Composable
fun PosterItem(mediaItem: MediaItem) {
fun PosterItem(
appNavController: NavController,
mediaItem: MediaItem
) {
val context = LocalContext.current
val poster = TmdbUtils.getFullPosterPath(mediaItem)
Image(
@@ -58,18 +66,11 @@ fun PosterItem(mediaItem: MediaItem) {
.size(190.dp)
.padding(5.dp)
.clickable {
Toast
.makeText(context, "${mediaItem.title} clicked", Toast.LENGTH_SHORT)
.show()
appNavController.navigate("${MainNavItem.DetailView.route}/${mediaItem.id}")
// appNavController.n
// Toast
// .makeText(context, "${mediaItem.title} clicked", Toast.LENGTH_SHORT)
// .show()
}
)
}
@Preview
@Composable
fun PosterItemPreview() {
PosterItem(mediaItem = object : MediaItem(
title = "Deadpool",
posterPath = "/fSRb7vyIP8rQpL0I47P3qUsEKX3.jpg"
){})
}

View File

@@ -1,10 +1,17 @@
package com.owenlejeune.tvtime.ui.navigation
import androidx.compose.runtime.Composable
import androidx.navigation.NavController
import androidx.navigation.NavHostController
import androidx.navigation.NavType
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.navArgument
import com.owenlejeune.tvtime.ui.screens.*
import com.owenlejeune.tvtime.ui.screens.tabs.FavouritesTab
import com.owenlejeune.tvtime.ui.screens.tabs.MoviesTab
import com.owenlejeune.tvtime.ui.screens.tabs.SettingsTab
import com.owenlejeune.tvtime.ui.screens.tabs.TvTab
@Composable
fun MainNavigationRoutes(navController: NavHostController) {
@@ -12,20 +19,30 @@ fun MainNavigationRoutes(navController: NavHostController) {
composable(MainNavItem.MainView.route) {
MainAppView(appNavController = navController)
}
composable(MainNavItem.DetailView.route) {
composable(
MainNavItem.DetailView.route.plus("/{ID_KEY}"),
arguments = listOf(navArgument("ID_KEY") { type = NavType.IntType })
) { navBackStackEntry ->
val args = navBackStackEntry.arguments
DetailView(
appNavController = navController,
itemId = navBackStackEntry.arguments?.getInt("ID_KEY")
)
}
}
}
@Composable
fun BottomNavigationRoutes(navController: NavHostController) {
fun BottomNavigationRoutes(
appNavController: NavController,
navController: NavHostController
) {
NavHost(navController = navController, startDestination = BottomNavItem.Movies.route) {
composable(BottomNavItem.Movies.route) {
MoviesTab()
MoviesTab(appNavController = appNavController)
}
composable(BottomNavItem.TV.route) {
TvTab()
TvTab(appNavController = appNavController)
}
composable(BottomNavItem.Favourites.route) {
FavouritesTab()

View File

@@ -0,0 +1,28 @@
package com.owenlejeune.tvtime.ui.screens
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.navigation.NavController
@Composable
fun DetailView(
appNavController: NavController,
itemId: Int?
) {
Column(
modifier = Modifier
.fillMaxSize()
.wrapContentSize(Alignment.Center)
) {
Text(
text = itemId.toString(),
color = MaterialTheme.colorScheme.onBackground
)
}
}

View File

@@ -51,7 +51,7 @@ fun MainAppView(appNavController: NavController) {
}
) { innerPadding ->
Box(modifier = Modifier.padding(innerPadding)) {
BottomNavigationRoutes(navController = navController)
BottomNavigationRoutes(appNavController = appNavController, navController = navController)
}
}
}

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.ui.screens
package com.owenlejeune.tvtime.ui.screens.tabs
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize

View File

@@ -1,17 +1,18 @@
package com.owenlejeune.tvtime.ui.screens
package com.owenlejeune.tvtime.ui.screens.tabs
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.runtime.Composable
import androidx.navigation.NavController
import com.owenlejeune.tvtime.api.tmdb.MoviesService
import com.owenlejeune.tvtime.ui.components.PosterGrid
@OptIn(ExperimentalFoundationApi::class)
@Composable
fun MoviesTab() {
fun MoviesTab(appNavController: NavController) {
// val moviesViewModel = viewModel(PopularMovieViewModel::class.java)
// val moviesList = moviesViewModel.moviePage
// val movieListItems: LazyPagingItems<PopularMovie> = moviesList.collectAsLazyPagingItems()
PosterGrid { moviesList ->
PosterGrid(appNavController = appNavController) { moviesList ->
val service = MoviesService()
service.getPopularMovies { isSuccessful, response ->
if (isSuccessful) {

View File

@@ -1,4 +1,4 @@
package com.owenlejeune.tvtime.ui.screens
package com.owenlejeune.tvtime.ui.screens.tabs
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize

View File

@@ -1,14 +1,15 @@
package com.owenlejeune.tvtime.ui.screens
package com.owenlejeune.tvtime.ui.screens.tabs
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.runtime.Composable
import androidx.navigation.NavController
import com.owenlejeune.tvtime.api.tmdb.TvService
import com.owenlejeune.tvtime.ui.components.PosterGrid
@OptIn(ExperimentalFoundationApi::class)
@Composable
fun TvTab() {
PosterGrid { tvList ->
fun TvTab(appNavController: NavController) {
PosterGrid(appNavController = appNavController) { tvList ->
val service = TvService()
service.getPopularTv { isSuccessful, response ->
if (isSuccessful) {