Эх сурвалжийг харах

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
Ivan Iskandar 2 жил өмнө
parent
commit
b4e15263db

+ 7 - 2
app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt

@@ -150,8 +150,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 {

+ 26 - 17
app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt

@@ -166,10 +166,28 @@ 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 {
+                MangaScreenState.Success(
+                    manga = manga,
+                    source = Injekt.get<SourceManager>().getOrStub(manga.source),
+                    isFromSource = isFromSource,
+                    trackingAvailable = trackManager.hasLoggedServices(),
+                    chapters = emptyList(),
+                    isRefreshingChapter = true,
+                    isIncognitoMode = incognitoMode,
+                    isDownloadedOnlyMode = downloadedOnlyMode,
+                )
+            }
+
             getMangaAndChapters.subscribe(mangaId)
                 .distinctUntilChanged()
                 .collectLatest { (manga, chapters) ->
@@ -179,22 +197,13 @@ class MangaPresenter(
                         dateRelativeTime = preferences.relativeTime().get(),
                         dateFormat = preferences.dateFormat(),
                     )
-                    _state.update { currentState ->
-                        when (currentState) {
-                            // Initialize success state
-                            MangaScreenState.Loading -> MangaScreenState.Success(
-                                manga = manga,
-                                source = Injekt.get<SourceManager>().getOrStub(manga.source),
-                                isFromSource = isFromSource,
-                                trackingAvailable = trackManager.hasLoggedServices(),
-                                chapters = chapterItems,
-                                isIncognitoMode = incognitoMode,
-                                isDownloadedOnlyMode = downloadedOnlyMode,
-                            )
-
-                            // Update state
-                            is MangaScreenState.Success -> currentState.copy(manga = manga, chapters = chapterItems)
-                        }
+                    updateSuccessState {
+                        it.copy(
+                            manga = manga,
+                            chapters = chapterItems,
+                            isRefreshingChapter = false,
+                            isRefreshingInfo = false,
+                        )
                     }
 
                     observeTrackers()