From 8cfab7922773ace459c029cdc62a040ca7cee388 Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Fri, 29 Aug 2025 17:46:36 +0700 Subject: [PATCH] fix(merged-entries): Fix manga folder opening and source click (#1115) * Fix open manga folder * Fix source click * fix null * warning --- .../kanade/tachiyomi/ui/manga/MangaScreen.kt | 83 +++++++++++++------ .../tachiyomi/ui/manga/MangaScreenModel.kt | 4 +- 2 files changed, 60 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt index 44425c2b8..c4d634add 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt @@ -117,6 +117,7 @@ import tachiyomi.domain.source.interactor.GetRemoteManga import tachiyomi.domain.source.model.StubSource import tachiyomi.domain.source.service.SourceManager import tachiyomi.i18n.MR +import tachiyomi.i18n.kmk.KMR import tachiyomi.i18n.sy.SYMR import tachiyomi.presentation.core.screens.LoadingScreen import uy.kohesive.injekt.Injekt @@ -421,8 +422,20 @@ class MangaScreen( } }.takeIf { isConfigurableSource }, onClearManga = { screenModel.showClearMangaDialog(successState.source is MergedSource) }, - onOpenMangaFolder = { screenModel.openMangaFolder() } - .takeIf { successState.source !is StubSource && successState.source !is MergedSource }, + onOpenMangaFolder = { + if (successState.mergedData == null) { + screenModel.openMangaFolder(screenModel.source, screenModel.manga) + } else { + mergedMangaAction( + context, + navigator, + successState.mergedData, + action = { _, nav, manga, source -> screenModel.openMangaFolder(source, manga) }, + titleRes = KMR.strings.action_open_folder, + ) + } + } + .takeIf { successState.source !is StubSource }, onRelatedMangasScreenClick = { if (successState.isRelatedMangasFetched == null) { scope.launchIO { screenModel.fetchRelatedMangasFromSource(onDemand = true) } @@ -433,28 +446,21 @@ class MangaScreen( onRelatedMangaLongClick = { bulkFavoriteScreenModel.addRemoveManga(it, haptic) }, onSourceClick = { if (successState.source !is StubSource) { - val screen = when { - // Clicked on source of an entry being merged with previous entry or - // source of an recommending entry (to search again) - smartSearchConfig != null -> SmartSearchScreen(successState.source.id, smartSearchConfig) - screenModel.useNewSourceNavigation -> SourceFeedScreen(successState.source.id) - else -> BrowseSourceScreen(successState.source.id, GetRemoteManga.QUERY_POPULAR) - } - when (screen) { - // When doing a migrate/recommend => replace previous screen to perform search again. - is SmartSearchScreen -> { - navigator.popUntil { it is SmartSearchScreen } - if (navigator.size > 1) navigator.replace(screen) else navigator.push(screen) - } - is SourceFeedScreen -> { - navigator.popUntil { it is SourceFeedScreen } - if (navigator.size > 1) navigator.replace(screen) else navigator.push(screen) - } - else -> { - navigator.popUntil { it is BrowseSourceScreen } - if (navigator.size > 1) navigator.replace(screen) else navigator.push(screen) - } + // KMK --> + if (successState.mergedData == null) { + screenModel.source?.let { browseSource(navigator, it, screenModel.useNewSourceNavigation) } + } else { + mergedMangaAction( + context, + navigator, + successState.mergedData, + action = { _, nav, _, source -> + source?.let { browseSource(nav, it, screenModel.useNewSourceNavigation) } + }, + titleRes = MR.strings.browse, + ) } + // KMK <-- } else { navigator.push(ExtensionsScreen(searchSource = successState.source.name)) } @@ -673,7 +679,7 @@ class MangaScreen( return try { source.getMangaUrl(manga.toSManga()) - } catch (e: Exception) { + } catch (_: Exception) { null } } @@ -855,6 +861,35 @@ class MangaScreen( .show() } + // KMK --> + private fun browseSource(navigator: Navigator, source: Source, useNewSourceNavigation: Boolean) { + val screen = when { + // Clicked on source of an entry being merged with previous entry or + // source of an recommending entry (to search again) + smartSearchConfig != null -> SmartSearchScreen(source.id, smartSearchConfig) + useNewSourceNavigation -> SourceFeedScreen(source.id) + else -> BrowseSourceScreen(source.id, GetRemoteManga.QUERY_POPULAR) + } + when (screen) { + // When doing a migrate/recommend => replace previous screen to perform search again. + is SmartSearchScreen -> { + navigator.popUntil { it is SmartSearchScreen } + if (navigator.size > 1) navigator.replace(screen) else navigator.push(screen) + } + + is SourceFeedScreen -> { + navigator.popUntil { it is SourceFeedScreen } + if (navigator.size > 1) navigator.replace(screen) else navigator.push(screen) + } + + else -> { + navigator.popUntil { it is BrowseSourceScreen } + if (navigator.size > 1) navigator.replace(screen) else navigator.push(screen) + } + } + } + // KMK <-- + private fun openMorePagePreviews(navigator: Navigator, manga: Manga) { navigator.push(PagePreviewScreen(manga.id)) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt index 9ad21ac4d..dd5e6dafa 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreenModel.kt @@ -933,10 +933,8 @@ class MangaScreenModel( /** * Opens manga folder with the system's file manager. */ - fun openMangaFolder() { + fun openMangaFolder(currentSource: Source?, currentManga: Manga?) { try { - val currentManga = manga - val currentSource = source if (currentManga == null || currentSource == null || currentSource is StubSource) return val mangaDir = downloadProvider.findMangaDir(/* SY --> */ currentManga.ogTitle /* SY <-- */, currentSource) ?: return