From b89c2f76a1135fdd8e3d10c999a0e3cab0e88e22 Mon Sep 17 00:00:00 2001 From: Ivan Iskandar <12537387+ivaniskandar@users.noreply.github.com> Date: Sun, 4 Dec 2022 02:43:52 +0700 Subject: [PATCH] Fix BrowseSourceScreen list/grid unnecessary reloads (#8661) (cherry picked from commit 7be9b49143d4634478e42e245f927226ea762237) # Conflicts: # app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt --- .../migration/search/SourceSearchScreen.kt | 6 +- .../source/browse/BrowseSourceScreen.kt | 6 +- .../source/browse/BrowseSourceScreenModel.kt | 57 +++++++++++-------- .../exh/md/follows/MangaDexFollowsScreen.kt | 6 +- .../exh/md/similar/MangaDexSimilarScreen.kt | 6 +- .../main/java/exh/recs/RecommendsScreen.kt | 6 +- 6 files changed, 42 insertions(+), 45 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SourceSearchScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SourceSearchScreen.kt index c62cefbb0..4785bbfc0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SourceSearchScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SourceSearchScreen.kt @@ -64,9 +64,7 @@ data class SourceSearchScreen( }, snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, ) { paddingValues -> - val mangaList = remember(state.currentFilter) { - screenModel.getMangaListFlow(state.currentFilter) - }.collectAsLazyPagingItems() + val pagingFlow by screenModel.mangaPagerFlowFlow.collectAsState() val openMigrateDialog: (Manga) -> Unit = { // SY --> navigator.items @@ -78,7 +76,7 @@ data class SourceSearchScreen( } BrowseSourceContent( source = screenModel.source, - mangaList = mangaList, + mangaList = pagingFlow.collectAsLazyPagingItems(), columns = screenModel.getColumnsPreference(LocalConfiguration.current.orientation), // SY --> ehentaiBrowseDisplayMode = screenModel.ehentaiBrowseDisplayMode, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreen.kt index d23454967..69f1322e0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreen.kt @@ -203,13 +203,11 @@ data class BrowseSourceScreen( }, snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, ) { paddingValues -> - val mangaList = remember(state.currentFilter) { - screenModel.getMangaListFlow(state.currentFilter) - }.collectAsLazyPagingItems() + val pagingFlow by screenModel.mangaPagerFlowFlow.collectAsState() BrowseSourceContent( source = screenModel.source, - mangaList = mangaList, + mangaList = pagingFlow.collectAsLazyPagingItems(), columns = screenModel.getColumnsPreference(LocalConfiguration.current.orientation), // SY --> ehentaiBrowseDisplayMode = screenModel.ehentaiBrowseDisplayMode, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt index f312c1680..3800998b8 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt @@ -9,7 +9,6 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.unit.dp import androidx.paging.Pager import androidx.paging.PagingConfig -import androidx.paging.PagingData import androidx.paging.cachedIn import androidx.paging.map import cafe.adriel.voyager.core.model.StateScreenModel @@ -83,8 +82,10 @@ import exh.savedsearches.models.SavedSearch import exh.source.getMainSource import exh.util.nullIfBlank import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.launchIn @@ -152,6 +153,35 @@ open class BrowseSourceScreenModel( */ private var filterSheet: SourceFilterSheet? = null + /** + * Flow of Pager flow tied to [State.currentFilter] + */ + val mangaPagerFlowFlow = state.map { it.currentFilter } + .distinctUntilChanged() + .map { currentFilter -> + Pager( + PagingConfig(pageSize = 25), + ) { + // SY --> + createSourcePagingSource(currentFilter.query ?: "", currentFilter.filters) + // SY <-- + }.flow + .map { pagingData -> + pagingData.map { (sManga, metadata) -> + val dbManga = withIOContext { networkToLocalManga.await(sManga.toDomainManga(sourceId)) } + getManga.subscribe(dbManga.url, dbManga.source) + .filterNotNull() + .onEach { initializeManga(it) } + // SY --> + .combineMetadata(dbManga, metadata) + // SY <-- + .stateIn(coroutineScope) + } + } + .cachedIn(coroutineScope) + } + .stateIn(coroutineScope, SharingStarted.Lazily, emptyFlow()) + // SY --> val ehentaiBrowseDisplayMode by unsortedPreferences.enhancedEHentaiView().asState(coroutineScope) @@ -198,29 +228,6 @@ open class BrowseSourceScreenModel( return if (columns == 0) GridCells.Adaptive(128.dp) else GridCells.Fixed(columns) } - fun getMangaListFlow(currentFilter: Filter): Flow */Pair/* SY <-- */>>> { - return Pager( - PagingConfig(pageSize = 25), - ) { - // SY --> - createSourcePagingSource(currentFilter.query ?: "", currentFilter.filters) - // SY <-- - }.flow - .map { pagingData -> - pagingData.map { (sManga, metadata) -> - val dbManga = withIOContext { networkToLocalManga.await(sManga.toDomainManga(sourceId)) } - getManga.subscribe(dbManga.url, dbManga.source) - .filterNotNull() - .onEach { initializeManga(it) } - // SY --> - .combineMetadata(dbManga, metadata) - // SY <-- - .stateIn(coroutineScope) - } - } - .cachedIn(coroutineScope) - } - // SY --> open fun Flow.combineMetadata(dbManga: Manga, metadata: RaisedSearchMetadata?): Flow> { val metadataSource = source.getMainSource>() diff --git a/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt b/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt index 8fdf1c688..efe177ef9 100644 --- a/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt +++ b/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt @@ -54,13 +54,11 @@ class MangaDexFollowsScreen(private val sourceId: Long) : Screen { SnackbarHost(hostState = snackbarHostState) }, ) { paddingValues -> - val mangaList = remember(state.currentFilter) { - screenModel.getMangaListFlow(state.currentFilter) - }.collectAsLazyPagingItems() + val pagingFlow by screenModel.mangaPagerFlowFlow.collectAsState() BrowseSourceContent( source = screenModel.source, - mangaList = mangaList, + mangaList = pagingFlow.collectAsLazyPagingItems(), columns = screenModel.getColumnsPreference(LocalConfiguration.current.orientation), // SY --> ehentaiBrowseDisplayMode = screenModel.ehentaiBrowseDisplayMode, diff --git a/app/src/main/java/exh/md/similar/MangaDexSimilarScreen.kt b/app/src/main/java/exh/md/similar/MangaDexSimilarScreen.kt index 339b00496..63692d72c 100644 --- a/app/src/main/java/exh/md/similar/MangaDexSimilarScreen.kt +++ b/app/src/main/java/exh/md/similar/MangaDexSimilarScreen.kt @@ -46,13 +46,11 @@ class MangaDexSimilarScreen(val mangaId: Long, val sourceId: Long) : Screen { }, snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, ) { paddingValues -> - val mangaList = remember(state.currentFilter) { - screenModel.getMangaListFlow(state.currentFilter) - }.collectAsLazyPagingItems() + val pagingFlow by screenModel.mangaPagerFlowFlow.collectAsState() BrowseSourceContent( source = screenModel.source, - mangaList = mangaList, + mangaList = pagingFlow.collectAsLazyPagingItems(), columns = screenModel.getColumnsPreference(LocalConfiguration.current.orientation), // SY --> ehentaiBrowseDisplayMode = false, diff --git a/app/src/main/java/exh/recs/RecommendsScreen.kt b/app/src/main/java/exh/recs/RecommendsScreen.kt index a88d705f3..d7d3c9832 100644 --- a/app/src/main/java/exh/recs/RecommendsScreen.kt +++ b/app/src/main/java/exh/recs/RecommendsScreen.kt @@ -45,13 +45,11 @@ class RecommendsScreen(val mangaId: Long, val sourceId: Long) : Screen { }, snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, ) { paddingValues -> - val mangaList = remember(state.currentFilter) { - screenModel.getMangaListFlow(state.currentFilter) - }.collectAsLazyPagingItems() + val pagingFlow by screenModel.mangaPagerFlowFlow.collectAsState() BrowseSourceContent( source = screenModel.source, - mangaList = mangaList, + mangaList = pagingFlow.collectAsLazyPagingItems(), columns = screenModel.getColumnsPreference(LocalConfiguration.current.orientation), // SY --> ehentaiBrowseDisplayMode = false,