diff --git a/app/src/main/java/com/nuvio/tv/ui/screens/home/HomeViewModelPresentationPipeline.kt b/app/src/main/java/com/nuvio/tv/ui/screens/home/HomeViewModelPresentationPipeline.kt index cf5dc94f..93b27058 100644 --- a/app/src/main/java/com/nuvio/tv/ui/screens/home/HomeViewModelPresentationPipeline.kt +++ b/app/src/main/java/com/nuvio/tv/ui/screens/home/HomeViewModelPresentationPipeline.kt @@ -218,6 +218,28 @@ internal fun HomeViewModel.observeModernHomePresentationPipeline() { } .distinctUntilChanged() .collectLatest { input -> + val shouldWarmStart = uiState.value.modernHomePresentation.rows.isEmpty() + val visibleCatalogRowCount = input.catalogRows.count { it.items.isNotEmpty() } + val warmStartCatalogRowCount = if (input.continueWatchingItems.isNotEmpty()) 1 else 2 + + if (shouldWarmStart && visibleCatalogRowCount > warmStartCatalogRowCount) { + val warmStartPresentation = withContext(Dispatchers.Default) { + buildModernHomePresentation( + input = input, + cache = modernCarouselRowBuildCache, + context = appContext, + maxCatalogRows = warmStartCatalogRowCount + ) + } + _uiState.update { state -> + if (state.modernHomePresentation == warmStartPresentation) { + state + } else { + state.copy(modernHomePresentation = warmStartPresentation) + } + } + } + val presentation = withContext(Dispatchers.Default) { buildModernHomePresentation( input = input, diff --git a/app/src/main/java/com/nuvio/tv/ui/screens/home/ModernHomePresentation.kt b/app/src/main/java/com/nuvio/tv/ui/screens/home/ModernHomePresentation.kt index 786d0825..fdf5f02b 100644 --- a/app/src/main/java/com/nuvio/tv/ui/screens/home/ModernHomePresentation.kt +++ b/app/src/main/java/com/nuvio/tv/ui/screens/home/ModernHomePresentation.kt @@ -17,9 +17,14 @@ internal data class ModernHomePresentationInput( internal fun buildModernHomePresentation( input: ModernHomePresentationInput, cache: ModernCarouselRowBuildCache, - context: Context + context: Context, + maxCatalogRows: Int? = null ): ModernHomePresentationState { val visibleCatalogRows = input.catalogRows.filter { it.items.isNotEmpty() } + val catalogRowsToRender = maxCatalogRows + ?.coerceAtLeast(0) + ?.let(visibleCatalogRows::take) + ?: visibleCatalogRows val strContinueWatching = context.getString(R.string.continue_watching) val strAirsDate = context.getString(R.string.cw_airs_date) val strUpcoming = context.getString(R.string.cw_upcoming) @@ -27,7 +32,7 @@ internal fun buildModernHomePresentation( val strTypeSeries = context.getString(R.string.type_series) val rows = buildList { - val activeCatalogKeys = LinkedHashSet(visibleCatalogRows.size) + val activeCatalogKeys = LinkedHashSet(catalogRowsToRender.size) if (input.continueWatchingItems.isNotEmpty()) { val reuseContinueWatchingRow = @@ -67,7 +72,7 @@ internal fun buildModernHomePresentation( cache.continueWatchingRow = null } - visibleCatalogRows.forEachIndexed { index, row -> + catalogRowsToRender.forEachIndexed { index, row -> val rowKey = catalogRowKey(row) activeCatalogKeys += rowKey val cached = cache.catalogRows[rowKey]