diff --git a/app/src/main/java/exh/recs/BrowseRecommendsScreen.kt b/app/src/main/java/exh/recs/BrowseRecommendsScreen.kt index eb185fd9b..c5176b34d 100644 --- a/app/src/main/java/exh/recs/BrowseRecommendsScreen.kt +++ b/app/src/main/java/exh/recs/BrowseRecommendsScreen.kt @@ -32,7 +32,6 @@ import mihon.presentation.core.util.collectAsLazyPagingItems import tachiyomi.core.common.util.lang.launchIO import tachiyomi.domain.manga.model.Manga import tachiyomi.presentation.core.components.material.Scaffold -import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.screens.LoadingScreen class BrowseRecommendsScreen( @@ -115,11 +114,14 @@ class BrowseRecommendsScreen( ) } else { // KMK <-- - val recSource = remember { screenModel.recommendationSource } + val title = remember { + val recSource = screenModel.recommendationSource + "${recSource.name} (${recSource.category.getString(context)})" + } BrowseSourceSimpleToolbar( navigateUp = navigator::pop, - title = "${recSource.name} (${stringResource(recSource.category)})", + title = title, displayMode = screenModel.displayMode, onDisplayModeChange = { screenModel.displayMode = it }, scrollBehavior = scrollBehavior, diff --git a/app/src/main/java/exh/recs/RecommendsScreen.kt b/app/src/main/java/exh/recs/RecommendsScreen.kt index 0d7aecee4..9bed4784f 100644 --- a/app/src/main/java/exh/recs/RecommendsScreen.kt +++ b/app/src/main/java/exh/recs/RecommendsScreen.kt @@ -72,7 +72,7 @@ class RecommendsScreen(val mangaId: Long, val sourceId: Long) : Screen() { } RecommendsScreen( - manga = screenModel.manga, + manga = state.manga, state = state, navigateUp = navigator::pop, getManga = @Composable { manga: Manga -> screenModel.getManga(manga) }, diff --git a/app/src/main/java/exh/recs/RecommendsScreenModel.kt b/app/src/main/java/exh/recs/RecommendsScreenModel.kt index 9a1a0e16b..959e810a6 100644 --- a/app/src/main/java/exh/recs/RecommendsScreenModel.kt +++ b/app/src/main/java/exh/recs/RecommendsScreenModel.kt @@ -13,8 +13,7 @@ import kotlinx.collections.immutable.mutate import kotlinx.collections.immutable.persistentMapOf import kotlinx.collections.immutable.toImmutableMap import kotlinx.collections.immutable.toPersistentMap -import kotlinx.coroutines.Job -import kotlinx.coroutines.asCoroutineDispatcher +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.flow.collectLatest @@ -22,7 +21,6 @@ import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.update import kotlinx.coroutines.isActive import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext import tachiyomi.domain.manga.interactor.GetManga import tachiyomi.domain.manga.interactor.NetworkToLocalManga @@ -30,22 +28,18 @@ import tachiyomi.domain.manga.model.Manga import tachiyomi.domain.source.service.SourceManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get -import java.util.concurrent.Executors open class RecommendsScreenModel( val mangaId: Long, val sourceId: Long, - initialState: State = State(), sourceManager: SourceManager = Injekt.get(), private val getManga: GetManga = Injekt.get(), internal val networkToLocalManga: NetworkToLocalManga = Injekt.get(), -) : StateScreenModel(initialState) { +) : StateScreenModel(State()) { - val manga = runBlocking { getManga.await(mangaId) }!! val source = sourceManager.getOrStub(sourceId) as CatalogueSource - private val coroutineDispatcher = Executors.newFixedThreadPool(5).asCoroutineDispatcher() - private var findRecsJob: Job? = null + private val coroutineDispatcher = Dispatchers.IO.limitedParallelism(5) private val sortComparator = { map: Map -> compareBy( @@ -56,17 +50,17 @@ open class RecommendsScreenModel( } init { - findRecsJob?.cancel() + ioCoroutineScope.launch { + val manga = getManga.await(mangaId)!! + mutableState.update { it.copy(manga = manga) } + val recommendationSources = RecommendationPagingSource.createSources(manga, source) - val recommendationSources = RecommendationPagingSource.createSources(manga, source) + updateItems( + recommendationSources + .associateWith { RecommendationItemResult.Loading } + .toPersistentMap(), + ) - updateItems( - recommendationSources - .associateWith { RecommendationItemResult.Loading } - .toPersistentMap(), - ) - - findRecsJob = ioCoroutineScope.launch { recommendationSources.map { recSource -> async { if (state.value.items[recSource] !is RecommendationItemResult.Loading) { @@ -132,6 +126,7 @@ open class RecommendsScreenModel( @Immutable data class State( + val manga: Manga? = null, val items: PersistentMap = persistentMapOf(), ) { val progress: Int = items.count { it.value !is RecommendationItemResult.Loading } diff --git a/app/src/main/java/exh/recs/components/RecommendsScreen.kt b/app/src/main/java/exh/recs/components/RecommendsScreen.kt index 7f5bad1e9..5aa191884 100644 --- a/app/src/main/java/exh/recs/components/RecommendsScreen.kt +++ b/app/src/main/java/exh/recs/components/RecommendsScreen.kt @@ -28,7 +28,7 @@ import tachiyomi.presentation.core.i18n.stringResource @Composable fun RecommendsScreen( - manga: Manga, + manga: Manga?, state: RecommendsScreenModel.State, navigateUp: () -> Unit, getManga: @Composable (Manga) -> State, @@ -76,7 +76,7 @@ fun RecommendsScreen( toggleSelectionMode = bulkFavoriteScreenModel::toggleSelectionMode, isRunning = bulkFavoriteState.isRunning, // KMK <-- - title = stringResource(SYMR.strings.similar, manga.title), + title = stringResource(SYMR.strings.similar, manga?.title.orEmpty()), scrollBehavior = scrollBehavior, navigateUp = navigateUp, )