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
This commit is contained in:
Ivan Iskandar 2022-08-09 20:10:48 +07:00 committed by GitHub
parent 96c3116af6
commit b4e15263db
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 33 additions and 19 deletions

View file

@ -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 {

View file

@ -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()