From 2ca853a3021008804d7992fa7f00db847d4c5cd1 Mon Sep 17 00:00:00 2001 From: Ivan Iskandar <12537387+ivaniskandar@users.noreply.github.com> Date: Tue, 9 Aug 2022 20:10:48 +0700 Subject: [PATCH] Fix issues related to Manga screen slow load (#7708) * Fix back handling when manga is still loading * MangaPresenter: Show what we have earlier to reduce percepted slowness (cherry picked from commit b4e15263db3d00326abe5886fffb3608c9a85c47) # Conflicts: # app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt --- .../tachiyomi/ui/manga/MangaController.kt | 9 +- .../tachiyomi/ui/manga/MangaPresenter.kt | 82 ++++++++++--------- 2 files changed, 50 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt index 5d43fe23b..bf9d00084 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt @@ -206,8 +206,13 @@ class MangaController : // Let compose view handle this override fun handleBack(): Boolean { - (activity as? OnBackPressedDispatcherOwner)?.onBackPressedDispatcher?.onBackPressed() - return true + val dispatcher = (activity as? OnBackPressedDispatcherOwner)?.onBackPressedDispatcher ?: return false + return if (dispatcher.hasEnabledCallbacks()) { + dispatcher.onBackPressed() + true + } else { + false + } } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup, savedViewState: Bundle?): View { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt index 1c36b6a88..86af345bf 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt @@ -252,10 +252,41 @@ class MangaPresenter( // Manga info - start presenterScope.launchIO { - if (!getMangaAndChapters.awaitManga(mangaId).favorite) { + val manga = getMangaAndChapters.awaitManga(mangaId) + + if (!manga.favorite) { ChapterSettingsHelper.applySettingDefaults(mangaId) } + // Show what we have earlier. + // Defaults set by the block above won't apply until next update but it doesn't matter + // since we don't have any chapter yet. + _state.update { + val source = Injekt.get().getOrStub(manga.source) + MangaScreenState.Success( + manga = manga, + source = source, + isFromSource = isFromSource, + trackingAvailable = trackManager.hasLoggedServices(), + chapters = emptyList(), + isRefreshingChapter = true, + isIncognitoMode = incognitoMode, + isDownloadedOnlyMode = downloadedOnlyMode, + // SY --> + showRecommendationsInOverflow = preferences.recommendsInOverflow().get(), + showMergeWithAnother = smartSearched, + mergedData = null, + meta = null, + pagePreviewsState = if (source.getMainSource() is PagePreviewSource) { + getPagePreviews(manga, source) + PagePreviewState.Loading + } else { + PagePreviewState.Unused + }, + // SY <-- + ) + } + getMangaAndChapters.subscribe(mangaId) .distinctUntilChanged() // SY --> @@ -333,44 +364,17 @@ class MangaPresenter( alwaysShowReadingProgress = preferences.preserveReadingPosition().get() && manga.isEhBasedManga(), // SY <-- ) - _state.update { currentState -> - when (currentState) { - // Initialize success state - MangaScreenState.Loading -> { - val source = Injekt.get().getOrStub(manga.source) - MangaScreenState.Success( - manga = manga, - source = source, - isFromSource = isFromSource, - trackingAvailable = trackManager.hasLoggedServices(), - chapters = chapterItems, - isIncognitoMode = incognitoMode, - isDownloadedOnlyMode = downloadedOnlyMode, - // SY --> - meta = raiseMetadata(flatMetadata, source), - mergedData = mergedData, - showRecommendationsInOverflow = preferences.recommendsInOverflow().get(), - showMergeWithAnother = smartSearched, - pagePreviewsState = if (source.getMainSource() is PagePreviewSource) { - getPagePreviews(manga, source) - PagePreviewState.Loading - } else { - PagePreviewState.Unused - }, - // SY <-- - ) - } - - // Update state - is MangaScreenState.Success -> currentState.copy( - manga = manga, - chapters = chapterItems, - // SY --> - meta = raiseMetadata(flatMetadata, currentState.source), - mergedData = mergedData, - // SY <-- - ) - } + updateSuccessState { + it.copy( + manga = manga, + chapters = chapterItems, + isRefreshingChapter = false, + isRefreshingInfo = false, + // SY --> + meta = raiseMetadata(flatMetadata, it.source), + mergedData = mergedData, + // SY <-- + ) } observeTrackers()