refactor poster and video grids

This commit is contained in:
Owen LeJeune
2022-02-22 23:50:53 -05:00
parent 4b5ca49982
commit a3e32383bd
3 changed files with 28 additions and 23 deletions

View File

@@ -61,7 +61,7 @@ fun StaticGrid(
is StaticGridCells.Dynamic -> { is StaticGridCells.Dynamic -> {
BoxWithConstraints(modifier = modifier) { BoxWithConstraints(modifier = modifier) {
val nColumns = maxOf((maxWidth / cells.minSize).toInt(), 1) val nColumns = maxOf((maxWidth / cells.minSize).toInt(), 1)
val spacing = maxWidth - (cells.minSize * nColumns) val spacing = (maxWidth - (cells.minSize * nColumns)) / 10
StaticGridInternal( StaticGridInternal(
columns = nColumns, columns = nColumns,
itemCount = itemCount, itemCount = itemCount,

View File

@@ -30,11 +30,14 @@ import com.google.accompanist.pager.ExperimentalPagerApi
import com.google.accompanist.pager.HorizontalPager import com.google.accompanist.pager.HorizontalPager
import com.google.accompanist.pager.rememberPagerState import com.google.accompanist.pager.rememberPagerState
import com.owenlejeune.tvtime.R import com.owenlejeune.tvtime.R
import com.owenlejeune.tvtime.utils.TmdbUtils
import com.owenlejeune.tvtime.api.tmdb.model.ImageCollection import com.owenlejeune.tvtime.api.tmdb.model.ImageCollection
import com.owenlejeune.tvtime.api.tmdb.model.TmdbItem import com.owenlejeune.tvtime.api.tmdb.model.TmdbItem
import com.owenlejeune.tvtime.extensions.dpToPx import com.owenlejeune.tvtime.extensions.dpToPx
import com.owenlejeune.tvtime.extensions.listItems import com.owenlejeune.tvtime.extensions.listItems
import com.owenlejeune.tvtime.utils.TmdbUtils
private val POSTER_WIDTH = 127.dp
private val POSTER_HEIGHT = 190.dp
@OptIn(ExperimentalFoundationApi::class) @OptIn(ExperimentalFoundationApi::class)
@Composable @Composable
@@ -46,7 +49,7 @@ fun PosterGrid(
fetchMedia(mediaList) fetchMedia(mediaList)
LazyVerticalGrid( LazyVerticalGrid(
cells = GridCells.Fixed(count = 3), cells = GridCells.Adaptive(minSize = POSTER_WIDTH),
contentPadding = PaddingValues(8.dp) contentPadding = PaddingValues(8.dp)
) { ) {
listItems(mediaList.value) { item -> listItems(mediaList.value) { item ->
@@ -61,8 +64,8 @@ fun PosterGrid(
@Composable @Composable
fun PosterItem( fun PosterItem(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
width: Dp = 127.dp, width: Dp = POSTER_WIDTH,
height: Dp = 190.dp, height: Dp = POSTER_HEIGHT,
onClick: (Int) -> Unit = {}, onClick: (Int) -> Unit = {},
mediaItem: TmdbItem? mediaItem: TmdbItem?
) { ) {

View File

@@ -29,6 +29,7 @@ import com.owenlejeune.tvtime.api.tmdb.DetailService
import com.owenlejeune.tvtime.api.tmdb.MoviesService import com.owenlejeune.tvtime.api.tmdb.MoviesService
import com.owenlejeune.tvtime.api.tmdb.TvService import com.owenlejeune.tvtime.api.tmdb.TvService
import com.owenlejeune.tvtime.api.tmdb.model.* import com.owenlejeune.tvtime.api.tmdb.model.*
import com.owenlejeune.tvtime.extensions.listItems
import com.owenlejeune.tvtime.ui.components.* import com.owenlejeune.tvtime.ui.components.*
import com.owenlejeune.tvtime.utils.TmdbUtils import com.owenlejeune.tvtime.utils.TmdbUtils
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
@@ -70,6 +71,7 @@ fun DetailView(
modifier = Modifier.constrainAs(backdropImage) { modifier = Modifier.constrainAs(backdropImage) {
top.linkTo(parent.top) top.linkTo(parent.top)
start.linkTo(parent.start) start.linkTo(parent.start)
end.linkTo(parent.end)
}, },
mediaItem = mediaItem mediaItem = mediaItem
) )
@@ -175,7 +177,8 @@ private fun ContentColumn(
modifier = modifier modifier = modifier
.fillMaxWidth() .fillMaxWidth()
.wrapContentHeight() .wrapContentHeight()
.padding(start = 16.dp, end = 16.dp, bottom = 16.dp) .padding(start = 16.dp, end = 16.dp, bottom = 16.dp),
verticalArrangement = Arrangement.spacedBy(16.dp)
) { ) {
if (mediaType == MediaViewType.MOVIE) { if (mediaType == MediaViewType.MOVIE) {
MiscMovieDetails(mediaItem = mediaItem, service as MoviesService) MiscMovieDetails(mediaItem = mediaItem, service as MoviesService)
@@ -184,12 +187,12 @@ private fun ContentColumn(
} }
if (mediaItem.value?.overview?.isNotEmpty() == true) { if (mediaItem.value?.overview?.isNotEmpty() == true) {
OverviewCard(mediaItem = mediaItem, modifier = Modifier.padding(bottom = 16.dp)) OverviewCard(mediaItem = mediaItem)
} }
CastCard(itemId = itemId, service = service, modifier = Modifier.padding(bottom = 16.dp)) CastCard(itemId = itemId, service = service)
SimilarContentCard(itemId = itemId, service = service, modifier = Modifier.padding(bottom = 16.dp)) SimilarContentCard(itemId = itemId, service = service)
VideosCard(itemId = itemId, service = service) VideosCard(itemId = itemId, service = service)
} }
@@ -381,7 +384,7 @@ fun VideosCard(itemId: Int?, service: DetailService, modifier: Modifier = Modifi
} }
} }
if (videoResponse.value != null) { if (videoResponse.value != null && videoResponse.value!!.results.any { it.isOfficial }) {
val results = videoResponse.value!!.results val results = videoResponse.value!!.results
ExpandableContentCard( ExpandableContentCard(
modifier = modifier, modifier = modifier,
@@ -406,7 +409,6 @@ fun VideosCard(itemId: Int?, service: DetailService, modifier: Modifier = Modifi
} }
} }
@OptIn(ExperimentalFoundationApi::class)
@Composable @Composable
private fun VideoGroup(results: List<Video>, type: Video.Type, title: String) { private fun VideoGroup(results: List<Video>, type: Video.Type, title: String) {
val videos = results.filter { it.isOfficial && it.type == type } val videos = results.filter { it.isOfficial && it.type == type }
@@ -417,18 +419,18 @@ private fun VideoGroup(results: List<Video>, type: Video.Type, title: String) {
modifier = Modifier.padding(start = 12.dp, top = 8.dp) modifier = Modifier.padding(start = 12.dp, top = 8.dp)
) )
StaticGrid( val posterWidth = 120.dp
modifier = Modifier LazyRow(modifier = Modifier
.fillMaxWidth() .padding(horizontal = 8.dp, vertical = 8.dp)
.padding(horizontal = 12.dp, vertical = 8.dp), ) {
cells = StaticGridCells.Dynamic(110.dp), listItems(videos) { video ->
itemCount = videos.size FullScreenThumbnailVideoPlayer(
) { i -> key = video.key,
val video = videos[i] modifier = Modifier
FullScreenThumbnailVideoPlayer( .width(posterWidth)
key = video.key, .height(80.dp)
modifier = Modifier.size(110.dp, 80.dp) )
) }
} }
} }
} }