diff --git a/app/src/main/java/eu/kanade/core/util/CollectionUtils.kt b/app/src/main/java/eu/kanade/core/util/CollectionUtils.kt index baf369e39..e8eed9d3d 100644 --- a/app/src/main/java/eu/kanade/core/util/CollectionUtils.kt +++ b/app/src/main/java/eu/kanade/core/util/CollectionUtils.kt @@ -1,5 +1,6 @@ package eu.kanade.core.util +import androidx.compose.ui.util.fastFilter import androidx.compose.ui.util.fastForEach import kotlin.contracts.ExperimentalContracts import kotlin.contracts.contract @@ -45,21 +46,6 @@ fun HashSet.addOrRemove(value: E, shouldAdd: Boolean) { } } -/** - * Returns a list containing only elements matching the given [predicate]. - * - * **Do not use for collections that come from public APIs**, since they may not support random - * access in an efficient way, and this method may actually be a lot slower. Only use for - * collections that are created by code we control and are known to support random access. - */ -@OptIn(ExperimentalContracts::class) -inline fun List.fastFilter(predicate: (T) -> Boolean): List { - contract { callsInPlace(predicate) } - val destination = ArrayList() - fastForEach { if (predicate(it)) destination.add(it) } - return destination -} - /** * Returns a list containing all elements not matching the given [predicate]. * @@ -70,27 +56,7 @@ inline fun List.fastFilter(predicate: (T) -> Boolean): List { @OptIn(ExperimentalContracts::class) inline fun List.fastFilterNot(predicate: (T) -> Boolean): List { contract { callsInPlace(predicate) } - val destination = ArrayList() - fastForEach { if (!predicate(it)) destination.add(it) } - return destination -} - -/** - * Returns a list containing only the non-null results of applying the - * given [transform] function to each element in the original collection. - * - * **Do not use for collections that come from public APIs**, since they may not support random - * access in an efficient way, and this method may actually be a lot slower. Only use for - * collections that are created by code we control and are known to support random access. - */ -@OptIn(ExperimentalContracts::class) -inline fun List.fastMapNotNull(transform: (T) -> R?): List { - contract { callsInPlace(transform) } - val destination = ArrayList() - fastForEach { element -> - transform(element)?.let(destination::add) - } - return destination + return fastFilter { !predicate(it) } } /** @@ -131,26 +97,3 @@ inline fun List.fastCountNot(predicate: (T) -> Boolean): Int { fastForEach { if (predicate(it)) --count } return count } - -/** - * Returns a list containing only elements from the given collection - * having distinct keys returned by the given [selector] function. - * - * Among elements of the given collection with equal keys, only the first one will be present in the resulting list. - * The elements in the resulting list are in the same order as they were in the source collection. - * - * **Do not use for collections that come from public APIs**, since they may not support random - * access in an efficient way, and this method may actually be a lot slower. Only use for - * collections that are created by code we control and are known to support random access. - */ -@OptIn(ExperimentalContracts::class) -inline fun List.fastDistinctBy(selector: (T) -> K): List { - contract { callsInPlace(selector) } - val set = HashSet() - val list = ArrayList() - fastForEach { - val key = selector(it) - if (set.add(key)) list.add(it) - } - return list -} 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 a57ba5d8e..af184b53d 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 @@ -71,7 +71,6 @@ data class SourceSearchScreen( }, snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, ) { paddingValues -> - val pagingFlow by screenModel.mangaPagerFlowFlow.collectAsState() val openMigrateDialog: (Manga) -> Unit = { // SY --> navigator.items @@ -83,7 +82,7 @@ data class SourceSearchScreen( } BrowseSourceContent( source = screenModel.source, - mangaList = pagingFlow.collectAsLazyPagingItems(), + mangaList = screenModel.mangaPagerFlow.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 6e5bbbfb6..91d1dc8a3 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 @@ -240,11 +240,9 @@ data class BrowseSourceScreen( }, snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, ) { paddingValues -> - val pagingFlow by screenModel.mangaPagerFlowFlow.collectAsState() - BrowseSourceContent( source = screenModel.source, - mangaList = pagingFlow.collectAsLazyPagingItems(), + mangaList = screenModel.mangaPagerFlow.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 9a0a85c04..8ca46bd13 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 @@ -185,9 +185,9 @@ open class BrowseSourceScreenModel( * Flow of Pager flow tied to [State.listing] */ private val hideInLibraryItems = sourcePreferences.hideInLibraryItems().get() - val mangaPagerFlowFlow = state.map { it.listing } + val mangaPagerFlow = state.map { it.listing } .distinctUntilChanged() - .map { listing -> + .flatMapLatest { listing -> Pager(PagingConfig(pageSize = 25)) { // SY --> createSourcePagingSource(listing.query ?: "", listing.filters) @@ -204,9 +204,8 @@ open class BrowseSourceScreenModel( } .filter { !hideInLibraryItems || !it.value.first.favorite } } - .cachedIn(ioCoroutineScope) } - .stateIn(ioCoroutineScope, SharingStarted.Lazily, emptyFlow()) + .cachedIn(ioCoroutineScope) fun getColumnsPreference(orientation: Int): GridCells { val isLandscape = orientation == Configuration.ORIENTATION_LANDSCAPE diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/home/HomeScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/home/HomeScreen.kt index a74a50287..44fb6fc95 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/home/HomeScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/home/HomeScreen.kt @@ -30,13 +30,13 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.util.fastFilter import androidx.compose.ui.util.fastForEach import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow import cafe.adriel.voyager.navigator.tab.LocalTabNavigator import cafe.adriel.voyager.navigator.tab.TabNavigator import eu.kanade.core.preference.asState -import eu.kanade.core.util.fastFilter import eu.kanade.domain.source.service.SourcePreferences import eu.kanade.domain.ui.UiPreferences import eu.kanade.presentation.util.Screen diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt index 62505a7fa..ecf813882 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt @@ -7,16 +7,16 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.setValue import androidx.compose.ui.util.fastAll import androidx.compose.ui.util.fastAny +import androidx.compose.ui.util.fastDistinctBy +import androidx.compose.ui.util.fastFilter import androidx.compose.ui.util.fastForEach import androidx.compose.ui.util.fastMap +import androidx.compose.ui.util.fastMapNotNull import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.core.preference.PreferenceMutableState import eu.kanade.core.preference.asState -import eu.kanade.core.util.fastDistinctBy -import eu.kanade.core.util.fastFilter import eu.kanade.core.util.fastFilterNot -import eu.kanade.core.util.fastMapNotNull import eu.kanade.core.util.fastPartition import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.chapter.interactor.SetReadStatus diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/stats/StatsScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/stats/StatsScreenModel.kt index 5889ea0ab..f5726e82f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/stats/StatsScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/stats/StatsScreenModel.kt @@ -1,12 +1,12 @@ package eu.kanade.tachiyomi.ui.stats +import androidx.compose.ui.util.fastDistinctBy +import androidx.compose.ui.util.fastFilter +import androidx.compose.ui.util.fastMapNotNull import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.screenModelScope import eu.kanade.core.util.fastCountNot -import eu.kanade.core.util.fastDistinctBy -import eu.kanade.core.util.fastFilter import eu.kanade.core.util.fastFilterNot -import eu.kanade.core.util.fastMapNotNull import eu.kanade.presentation.more.stats.StatsScreenState import eu.kanade.presentation.more.stats.data.StatsData import eu.kanade.tachiyomi.data.download.DownloadManager diff --git a/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt b/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt index a3adc97b7..6a4195aa0 100644 --- a/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt +++ b/app/src/main/java/exh/md/follows/MangaDexFollowsScreen.kt @@ -65,11 +65,9 @@ class MangaDexFollowsScreen(private val sourceId: Long) : Screen() { SnackbarHost(hostState = snackbarHostState) }, ) { paddingValues -> - val pagingFlow by screenModel.mangaPagerFlowFlow.collectAsState() - BrowseSourceContent( source = screenModel.source, - mangaList = pagingFlow.collectAsLazyPagingItems(), + mangaList = screenModel.mangaPagerFlow.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 d41770f1f..596e5c2f1 100644 --- a/app/src/main/java/exh/md/similar/MangaDexSimilarScreen.kt +++ b/app/src/main/java/exh/md/similar/MangaDexSimilarScreen.kt @@ -3,8 +3,6 @@ package exh.md.similar import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalConfiguration import androidx.paging.compose.collectAsLazyPagingItems @@ -52,11 +50,9 @@ class MangaDexSimilarScreen(val mangaId: Long, val sourceId: Long) : Screen() { }, snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, ) { paddingValues -> - val pagingFlow by screenModel.mangaPagerFlowFlow.collectAsState() - BrowseSourceContent( source = screenModel.source, - mangaList = pagingFlow.collectAsLazyPagingItems(), + mangaList = screenModel.mangaPagerFlow.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 3958332aa..f3d006f93 100644 --- a/app/src/main/java/exh/recs/RecommendsScreen.kt +++ b/app/src/main/java/exh/recs/RecommendsScreen.kt @@ -3,8 +3,6 @@ package exh.recs import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalConfiguration import androidx.paging.compose.collectAsLazyPagingItems @@ -51,11 +49,9 @@ class RecommendsScreen(val mangaId: Long, val sourceId: Long) : Screen() { }, snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, ) { paddingValues -> - val pagingFlow by screenModel.mangaPagerFlowFlow.collectAsState() - BrowseSourceContent( source = screenModel.source, - mangaList = pagingFlow.collectAsLazyPagingItems(), + mangaList = screenModel.mangaPagerFlow.collectAsLazyPagingItems(), columns = screenModel.getColumnsPreference(LocalConfiguration.current.orientation), // SY --> ehentaiBrowseDisplayMode = false,