From 5ec780eddb4c1a32ecf87938f40791313f873515 Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Wed, 9 Jul 2025 14:13:57 +0700 Subject: [PATCH] fix(merged-entry): Fix actions like URL copy or sharing for merged entries (komikku-app/anikku#55) * fix(merged-entry): Fix actions like URL copy or sharing for merged entries * Unify callback parameters * Add titles for actions in merged manga dialog * Iterates through the list once (cherry picked from commit ed7bb96f409701c93bbca056728679af91f3453f) --- .../kanade/tachiyomi/ui/manga/MangaScreen.kt | 80 ++++++++++++++++--- 1 file changed, 67 insertions(+), 13 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 757e307c5..ac24ce95e 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 @@ -41,6 +41,7 @@ import dev.chrisbanes.haze.HazeDefaults import dev.chrisbanes.haze.HazeState import dev.chrisbanes.haze.HazeStyle import dev.chrisbanes.haze.hazeEffect +import dev.icerock.moko.resources.StringResource import eu.kanade.core.util.ifSourcesLoaded import eu.kanade.domain.manga.model.hasCustomCover import eu.kanade.domain.manga.model.toSManga @@ -290,20 +291,38 @@ class MangaScreen( screenModel.source, ) } else { - openMergedMangaWebview( + mergedMangaAction( context, navigator, successState.mergedData, + // KMK --> + action = { _, nav, manga, source -> openMangaInWebView(nav, manga, source) }, + titleRes = MR.strings.action_open_in_web_view, + // KMK <-- ) } }.takeIf { isHttpSource }, // SY <-- onWebViewLongClicked = { - copyMangaUrl( - context, - screenModel.manga, - screenModel.source, - ) + // KMK --> + if (successState.mergedData == null) { + // KMK <-- + copyMangaUrl( + context, + screenModel.manga, + screenModel.source, + ) + // KMK --> + } else { + mergedMangaAction( + context, + navigator, + successState.mergedData, + action = { ctx, _, manga, source -> copyMangaUrl(ctx, manga, source) }, + titleRes = MR.strings.action_copy_link, + ) + // KMK <-- + } }.takeIf { isHttpSource }, onTrackingClicked = { if (!successState.hasLoggedInTrackers) { @@ -323,7 +342,23 @@ class MangaScreen( }, // KMK <-- onCoverClicked = screenModel::showCoverDialog, - onShareClicked = { shareManga(context, screenModel.manga, screenModel.source) }.takeIf { isHttpSource }, + onShareClicked = { + // KMK --> + if (successState.mergedData == null) { + // KMK <-- + shareManga(context, screenModel.manga, screenModel.source) + // KMK --> + } else { + mergedMangaAction( + context, + navigator, + successState.mergedData, + action = { ctx, _, manga, source -> shareManga(ctx, manga, source) }, + titleRes = MR.strings.action_share, + ) + // KMK <-- + } + }.takeIf { isHttpSource }, onDownloadActionClicked = screenModel::runDownloadAction.takeIf { !successState.source.isLocalOrStub() }, onEditCategoryClicked = screenModel::showChangeCategoryDialog.takeIf { successState.manga.favorite }, onEditFetchIntervalClicked = screenModel::showSetFetchIntervalDialog.takeIf { @@ -756,6 +791,7 @@ class MangaScreen( context.copyToClipboard(url, url) } + // SY --> private fun openMetadataViewer( navigator: Navigator, manga: Manga, @@ -766,18 +802,36 @@ class MangaScreen( navigator.push(MetadataViewScreen(manga.id, manga.source, seedColor?.toArgb())) } - private fun openMergedMangaWebview(context: Context, navigator: Navigator, mergedMangaData: MergedMangaData) { + private fun mergedMangaAction( + context: Context, + navigator: Navigator, + mergedMangaData: MergedMangaData, + // KMK --> + action: (Context, Navigator, Manga, HttpSource?) -> Unit, + titleRes: StringResource, + // KMK <-- + ) { val sourceManager: SourceManager = Injekt.get() - val mergedManga = mergedMangaData.manga.values.filterNot { it.source == MERGED_SOURCE_ID } - val sources = mergedManga.map { sourceManager.getOrStub(it.source) } + // KMK --> + val mergedMangaAndSources = mergedMangaData.manga.values + .filterNot { it.source == MERGED_SOURCE_ID } + .map { manga -> manga to sourceManager.getOrStub(manga.source) } + // KMK <-- MaterialAlertDialogBuilder(context) - .setTitle(MR.strings.action_open_in_web_view.getString(context)) + .setTitle(titleRes.getString(context)) .setSingleChoiceItems( - Array(mergedManga.size) { index -> sources[index].toString() }, + Array(mergedMangaAndSources.size) { index -> + // KMK --> + mergedMangaAndSources[index].second.toString() + // KMK <-- + }, -1, ) { dialog, index -> dialog.dismiss() - openMangaInWebView(navigator, mergedManga[index], sources[index] as? HttpSource) + // KMK --> + val (manga, source) = mergedMangaAndSources[index] + action(context, navigator, manga, source as? HttpSource) + // KMK <-- } .setNegativeButton(MR.strings.action_cancel.getString(context), null) .show()