From 21bdefb4ce19defe8fb6e469d2b1f8fba490bdea Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Wed, 20 Nov 2024 17:44:52 +0600 Subject: [PATCH] Fix loading screen not appearing when changing query in browser screen Fixes #mihonapp/mihon1438 Closes #mihonapp/mihon1441 (cherry picked from commit 9aef08c333397caa4b897514cf76966592d3849c) --- .../migration/search/SourceSearchScreen.kt | 4 ++-- .../browse/source/browse/BrowseSourceScreen.kt | 4 ++-- .../source/browse/BrowseSourceScreenModel.kt | 9 ++++++--- .../java/exh/md/follows/MangaDexFollowsScreen.kt | 4 ++-- .../java/exh/md/similar/MangaDexSimilarScreen.kt | 4 ++-- app/src/main/java/exh/recs/RecommendsScreen.kt | 4 ++-- presentation-core/build.gradle.kts | 2 ++ .../presentation/core/util/PagingDataUtil.kt | 16 ++++++++++++++++ 8 files changed, 34 insertions(+), 13 deletions(-) create mode 100644 presentation-core/src/main/java/mihon/presentation/core/util/PagingDataUtil.kt 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 809d6d0cf..658f47592 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 @@ -10,7 +10,6 @@ import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler -import androidx.paging.compose.collectAsLazyPagingItems import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow @@ -33,6 +32,7 @@ import eu.kanade.tachiyomi.ui.webview.WebViewScreen import eu.kanade.tachiyomi.util.system.toast import exh.ui.ifSourcesLoaded import kotlinx.collections.immutable.persistentListOf +import mihon.presentation.core.util.collectAsLazyPagingItems import tachiyomi.core.common.Constants import tachiyomi.domain.manga.model.Manga import tachiyomi.i18n.sy.SYMR @@ -138,7 +138,7 @@ data class SourceSearchScreen( } BrowseSourceContent( source = screenModel.source, - mangaList = screenModel.mangaPagerFlow.collectAsLazyPagingItems(), + mangaList = screenModel.mangaPagerFlowFlow.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 5b71d8484..8d4a15b9b 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 @@ -33,7 +33,6 @@ import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.platform.LocalUriHandler -import androidx.paging.compose.collectAsLazyPagingItems import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow @@ -68,6 +67,7 @@ import exh.ui.smartsearch.SmartSearchScreen import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.receiveAsFlow +import mihon.presentation.core.util.collectAsLazyPagingItems import tachiyomi.core.common.Constants import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.UnsortedPreferences @@ -314,7 +314,7 @@ data class BrowseSourceScreen( ) { paddingValues -> BrowseSourceContent( source = screenModel.source, - mangaList = screenModel.mangaPagerFlow.collectAsLazyPagingItems(), + mangaList = screenModel.mangaPagerFlowFlow.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 8d49d111c..678b7e7be 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 @@ -37,7 +37,9 @@ import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.flatMapLatest @@ -201,9 +203,9 @@ open class BrowseSourceScreenModel( * Flow of Pager flow tied to [State.listing] */ private val hideInLibraryItems = sourcePreferences.hideInLibraryItems().get() - val mangaPagerFlow = state.map { it.listing } + val mangaPagerFlowFlow = state.map { it.listing } .distinctUntilChanged() - .flatMapLatest { listing -> + .map { listing -> Pager(PagingConfig(pageSize = 25)) { // SY --> createSourcePagingSource(listing.query ?: "", listing.filters) @@ -220,8 +222,9 @@ open class BrowseSourceScreenModel( } .filter { !hideInLibraryItems || !it.value.first.favorite } } + .cachedIn(ioCoroutineScope) } - .cachedIn(ioCoroutineScope) + .stateIn(ioCoroutineScope, SharingStarted.Lazily, emptyFlow()) fun getColumnsPreference(orientation: Int): GridCells { val isLandscape = orientation == Configuration.ORIENTATION_LANDSCAPE diff --git a/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt b/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt index 20f0aef5f..8433ff864 100644 --- a/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt +++ b/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt @@ -11,7 +11,6 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalHapticFeedback -import androidx.paging.compose.collectAsLazyPagingItems import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow @@ -30,6 +29,7 @@ import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceScreenModel import eu.kanade.tachiyomi.ui.category.CategoryScreen import eu.kanade.tachiyomi.ui.manga.MangaScreen import exh.ui.ifSourcesLoaded +import mihon.presentation.core.util.collectAsLazyPagingItems import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.UnsortedPreferences import tachiyomi.i18n.sy.SYMR @@ -104,7 +104,7 @@ class MangaDexFollowsScreen(private val sourceId: Long) : Screen() { ) { paddingValues -> BrowseSourceContent( source = screenModel.source, - mangaList = screenModel.mangaPagerFlow.collectAsLazyPagingItems(), + mangaList = screenModel.mangaPagerFlowFlow.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 dd5bcebd0..d5017fc14 100644 --- a/app/src/main/java/exh/md/similar/MangaDexSimilarScreen.kt +++ b/app/src/main/java/exh/md/similar/MangaDexSimilarScreen.kt @@ -9,7 +9,6 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalHapticFeedback -import androidx.paging.compose.collectAsLazyPagingItems import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow @@ -25,6 +24,7 @@ import eu.kanade.tachiyomi.ui.browse.ChangeMangasCategoryDialog import eu.kanade.tachiyomi.ui.browse.RemoveMangaDialog import eu.kanade.tachiyomi.ui.manga.MangaScreen import exh.ui.ifSourcesLoaded +import mihon.presentation.core.util.collectAsLazyPagingItems import tachiyomi.domain.manga.model.Manga import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.components.material.Scaffold @@ -98,7 +98,7 @@ class MangaDexSimilarScreen(val mangaId: Long, val sourceId: Long) : Screen() { ) { paddingValues -> BrowseSourceContent( source = screenModel.source, - mangaList = screenModel.mangaPagerFlow.collectAsLazyPagingItems(), + mangaList = screenModel.mangaPagerFlowFlow.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 b656a4b9e..bfde6bc9d 100644 --- a/app/src/main/java/exh/recs/RecommendsScreen.kt +++ b/app/src/main/java/exh/recs/RecommendsScreen.kt @@ -9,7 +9,6 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalHapticFeedback -import androidx.paging.compose.collectAsLazyPagingItems import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.Navigator @@ -26,6 +25,7 @@ import eu.kanade.tachiyomi.ui.browse.ChangeMangasCategoryDialog import eu.kanade.tachiyomi.ui.browse.RemoveMangaDialog import eu.kanade.tachiyomi.ui.browse.source.SourcesScreen import exh.ui.ifSourcesLoaded +import mihon.presentation.core.util.collectAsLazyPagingItems import tachiyomi.domain.manga.model.Manga import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.screens.LoadingScreen @@ -97,7 +97,7 @@ class RecommendsScreen(val mangaId: Long, val sourceId: Long) : Screen() { ) { paddingValues -> BrowseSourceContent( source = screenModel.source, - mangaList = screenModel.mangaPagerFlow.collectAsLazyPagingItems(), + mangaList = screenModel.mangaPagerFlowFlow.collectAsLazyPagingItems(), columns = screenModel.getColumnsPreference(LocalConfiguration.current.orientation), // SY --> ehentaiBrowseDisplayMode = false, diff --git a/presentation-core/build.gradle.kts b/presentation-core/build.gradle.kts index 4d624f4d3..64b3e6649 100644 --- a/presentation-core/build.gradle.kts +++ b/presentation-core/build.gradle.kts @@ -45,5 +45,7 @@ dependencies { implementation(compose.ui.tooling.preview) implementation(compose.ui.util) + implementation(androidx.paging.runtime) + implementation(androidx.paging.compose) implementation(kotlinx.immutables) } diff --git a/presentation-core/src/main/java/mihon/presentation/core/util/PagingDataUtil.kt b/presentation-core/src/main/java/mihon/presentation/core/util/PagingDataUtil.kt new file mode 100644 index 000000000..a48acae50 --- /dev/null +++ b/presentation-core/src/main/java/mihon/presentation/core/util/PagingDataUtil.kt @@ -0,0 +1,16 @@ +package mihon.presentation.core.util + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.paging.PagingData +import androidx.paging.compose.LazyPagingItems +import androidx.paging.compose.collectAsLazyPagingItems +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.StateFlow + +@Composable +fun StateFlow>>.collectAsLazyPagingItems(): LazyPagingItems { + val flow by collectAsState() + return flow.collectAsLazyPagingItems() +}