feat: horizontal episode cards to autoscroll to recent activity card

This commit is contained in:
tapframe 2026-04-23 01:33:43 +05:30
parent bb51a1c1be
commit 19edc6de61
2 changed files with 25 additions and 0 deletions

View file

@ -636,6 +636,7 @@ fun MetaDetailsScreen(
onSaveClick = toggleSaved, onSaveClick = toggleSaved,
showManualPlayOption = showManualPlayOption, showManualPlayOption = showManualPlayOption,
preferredEpisodeSeasonNumber = seriesAction?.seasonNumber, preferredEpisodeSeasonNumber = seriesAction?.seasonNumber,
preferredEpisodeNumber = seriesAction?.episodeNumber,
hasProductionSection = hasProductionSection, hasProductionSection = hasProductionSection,
hasTrailersSection = hasTrailersSection, hasTrailersSection = hasTrailersSection,
hasEpisodes = hasEpisodes, hasEpisodes = hasEpisodes,
@ -940,6 +941,7 @@ private fun ConfiguredMetaSections(
onSaveClick: () -> Unit, onSaveClick: () -> Unit,
showManualPlayOption: Boolean, showManualPlayOption: Boolean,
preferredEpisodeSeasonNumber: Int?, preferredEpisodeSeasonNumber: Int?,
preferredEpisodeNumber: Int?,
hasProductionSection: Boolean, hasProductionSection: Boolean,
hasTrailersSection: Boolean, hasTrailersSection: Boolean,
hasEpisodes: Boolean, hasEpisodes: Boolean,
@ -1042,6 +1044,7 @@ private fun ConfiguredMetaSections(
meta = meta, meta = meta,
showHeader = showHeader, showHeader = showHeader,
preferredSeasonNumber = preferredEpisodeSeasonNumber, preferredSeasonNumber = preferredEpisodeSeasonNumber,
preferredEpisodeNumber = preferredEpisodeNumber,
episodeCardStyle = settings.episodeCardStyle, episodeCardStyle = settings.episodeCardStyle,
progressByVideoId = progressByVideoId, progressByVideoId = progressByVideoId,
watchedKeys = watchedKeys, watchedKeys = watchedKeys,

View file

@ -80,6 +80,7 @@ fun DetailSeriesContent(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
showHeader: Boolean = true, showHeader: Boolean = true,
preferredSeasonNumber: Int? = null, preferredSeasonNumber: Int? = null,
preferredEpisodeNumber: Int? = null,
episodeCardStyle: MetaEpisodeCardStyle = MetaEpisodeCardStyle.Horizontal, episodeCardStyle: MetaEpisodeCardStyle = MetaEpisodeCardStyle.Horizontal,
progressByVideoId: Map<String, WatchProgressEntry> = emptyMap(), progressByVideoId: Map<String, WatchProgressEntry> = emptyMap(),
watchedKeys: Set<String> = emptySet(), watchedKeys: Set<String> = emptySet(),
@ -269,6 +270,7 @@ fun DetailSeriesContent(
watchedKeys = watchedKeys, watchedKeys = watchedKeys,
fallbackImage = meta.background ?: meta.poster, fallbackImage = meta.background ?: meta.poster,
progressByVideoId = progressByVideoId, progressByVideoId = progressByVideoId,
preferredEpisodeNumber = preferredEpisodeNumber,
onEpisodeClick = onEpisodeClick, onEpisodeClick = onEpisodeClick,
onEpisodeLongPress = onEpisodeLongPress, onEpisodeLongPress = onEpisodeLongPress,
) )
@ -541,12 +543,32 @@ private fun EpisodeHorizontalRow(
watchedKeys: Set<String>, watchedKeys: Set<String>,
fallbackImage: String?, fallbackImage: String?,
progressByVideoId: Map<String, WatchProgressEntry>, progressByVideoId: Map<String, WatchProgressEntry>,
preferredEpisodeNumber: Int? = null,
onEpisodeClick: ((MetaVideo) -> Unit)?, onEpisodeClick: ((MetaVideo) -> Unit)?,
onEpisodeLongPress: ((MetaVideo) -> Unit)?, onEpisodeLongPress: ((MetaVideo) -> Unit)?,
) { ) {
val rowMetrics = rememberEpisodeHorizontalCardMetrics(maxWidthDp) val rowMetrics = rememberEpisodeHorizontalCardMetrics(maxWidthDp)
val listState = rememberLazyListState()
var hasPositioned by remember(episodes) { mutableStateOf(false) }
LaunchedEffect(episodes, preferredEpisodeNumber) {
val targetIndex = if (preferredEpisodeNumber != null) {
episodes.indexOfFirst { it.episode == preferredEpisodeNumber }
} else {
-1
}
if (targetIndex >= 0) {
if (hasPositioned) {
listState.animateScrollToItem(targetIndex)
} else {
listState.scrollToItem(targetIndex)
hasPositioned = true
}
}
}
LazyRow( LazyRow(
state = listState,
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
contentPadding = PaddingValues(horizontal = rowMetrics.rowHorizontalPadding, vertical = rowMetrics.rowVerticalPadding), contentPadding = PaddingValues(horizontal = rowMetrics.rowHorizontalPadding, vertical = rowMetrics.rowVerticalPadding),
horizontalArrangement = Arrangement.spacedBy(rowMetrics.itemSpacing), horizontalArrangement = Arrangement.spacedBy(rowMetrics.itemSpacing),