From d6c64fc6389fab35e962d0ac41c8403963eda346 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Tue, 17 Oct 2023 11:06:16 +0300 Subject: [PATCH] Action to open online version of saved manga --- .../kotatsu/details/domain/DetailsInteractor.kt | 2 ++ .../koitharu/kotatsu/details/ui/DetailsActivity.kt | 4 +++- .../kotatsu/details/ui/DetailsMenuProvider.kt | 7 +++++++ .../koitharu/kotatsu/details/ui/DetailsViewModel.kt | 6 ++++++ .../kotatsu/local/data/input/LocalMangaDirInput.kt | 10 ++++++---- .../kotatsu/local/data/input/LocalMangaInput.kt | 13 +++++++------ .../kotatsu/local/data/input/LocalMangaZipInput.kt | 11 ++++++----- app/src/main/res/menu/opt_details.xml | 6 ++++++ app/src/main/res/values/strings.xml | 1 + 9 files changed, 44 insertions(+), 16 deletions(-) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/domain/DetailsInteractor.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/domain/DetailsInteractor.kt index 947198803..339346834 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/domain/DetailsInteractor.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/domain/DetailsInteractor.kt @@ -86,4 +86,6 @@ class DetailsInteractor @Inject constructor( subject } } + + suspend fun findLocal(seed: Manga) = localMangaRepository.getRemoteManga(seed) } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsActivity.kt index 341dec69f..c4cc3ebd7 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsActivity.kt @@ -137,7 +137,9 @@ class DetailsActivity : this, MenuInvalidator(viewBinding.toolbarChapters ?: this), ) - viewModel.favouriteCategories.observe(this, MenuInvalidator(this)) + val menuInvalidator = MenuInvalidator(this) + viewModel.favouriteCategories.observe(this, menuInvalidator) + viewModel.remoteManga.observe(this, menuInvalidator) viewModel.branches.observe(this) { viewBinding.buttonDropdown.isVisible = it.size > 1 } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsMenuProvider.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsMenuProvider.kt index b18df6945..4614921d8 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsMenuProvider.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsMenuProvider.kt @@ -42,6 +42,7 @@ class DetailsMenuProvider( menu.findItem(R.id.action_browser).isVisible = manga?.source != MangaSource.LOCAL menu.findItem(R.id.action_shortcut).isVisible = ShortcutManagerCompat.isRequestPinShortcutSupported(activity) menu.findItem(R.id.action_scrobbling).isVisible = viewModel.isScrobblingAvailable + menu.findItem(R.id.action_online).isVisible = viewModel.remoteManga.value != null menu.findItem(R.id.action_favourite).setIcon( if (viewModel.favouriteCategories.value) R.drawable.ic_heart else R.drawable.ic_heart_outline, ) @@ -88,6 +89,12 @@ class DetailsMenuProvider( } } + R.id.action_online -> { + viewModel.remoteManga.value?.let { + activity.startActivity(DetailsActivity.newIntent(activity, it)) + } + } + R.id.action_related -> { viewModel.manga.value?.let { activity.startActivity(MultiSearchActivity.newIntent(activity, it.title)) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt index 74449e15c..7a1b8d3db 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsViewModel.kt @@ -94,6 +94,8 @@ class DetailsViewModel @Inject constructor( val favouriteCategories = interactor.observeIsFavourite(mangaId) .stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, false) + val remoteManga = MutableStateFlow(null) + val newChaptersCount = details.flatMapLatest { d -> if (d?.isLocal == false) { interactor.observeNewChapters(mangaId) @@ -213,6 +215,10 @@ class DetailsViewModel @Inject constructor( progressUpdateUseCase(manga.toManga()) } } + launchJob(Dispatchers.Default) { + val manga = details.firstOrNull { it != null && it.isLocal } ?: return@launchJob + remoteManga.value = interactor.findLocal(manga.toManga()) + } } fun reload() { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/local/data/input/LocalMangaDirInput.kt b/app/src/main/kotlin/org/koitharu/kotatsu/local/data/input/LocalMangaDirInput.kt index 554dc9ecc..d626a66d6 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/local/data/input/LocalMangaDirInput.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/local/data/input/LocalMangaDirInput.kt @@ -40,13 +40,15 @@ class LocalMangaDirInput(root: File) : LocalMangaInput(root) { val mangaUri = root.toUri().toString() val chapterFiles = getChaptersFiles() val info = index?.getMangaInfo() + val cover = fileUri( + root, + index?.getCoverEntry() ?: findFirstImageEntry().orEmpty(), + ) val manga = info?.copy2( source = MangaSource.LOCAL, url = mangaUri, - coverUrl = fileUri( - root, - index.getCoverEntry() ?: findFirstImageEntry().orEmpty(), - ), + coverUrl = cover, + largeCoverUrl = cover, chapters = info.chapters?.mapIndexed { i, c -> c.copy(url = chapterFiles[i].toUri().toString(), source = MangaSource.LOCAL) }, diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/local/data/input/LocalMangaInput.kt b/app/src/main/kotlin/org/koitharu/kotatsu/local/data/input/LocalMangaInput.kt index 262bee5ee..96b1e0691 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/local/data/input/LocalMangaInput.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/local/data/input/LocalMangaInput.kt @@ -67,10 +67,11 @@ sealed class LocalMangaInput( @JvmStatic protected fun Manga.copy2( - url: String = this.url, - coverUrl: String = this.coverUrl, - chapters: List? = this.chapters, - source: MangaSource = this.source, + url: String, + coverUrl: String, + largeCoverUrl: String, + chapters: List?, + source: MangaSource, ) = Manga( id = id, title = title, @@ -91,8 +92,8 @@ sealed class LocalMangaInput( @JvmStatic protected fun MangaChapter.copy( - url: String = this.url, - source: MangaSource = this.source, + url: String, + source: MangaSource, ) = MangaChapter( id = id, name = name, diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/local/data/input/LocalMangaZipInput.kt b/app/src/main/kotlin/org/koitharu/kotatsu/local/data/input/LocalMangaZipInput.kt index 6526c5bb5..cc679b7b6 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/local/data/input/LocalMangaZipInput.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/local/data/input/LocalMangaZipInput.kt @@ -41,14 +41,15 @@ class LocalMangaZipInput(root: File) : LocalMangaInput(root) { val index = entry?.let(zip::readText)?.let(::MangaIndex) val info = index?.getMangaInfo() if (info != null) { + val cover = zipUri( + root, + entryName = index.getCoverEntry() ?: findFirstImageEntry(zip.entries())?.name.orEmpty(), + ) return@use info.copy2( source = MangaSource.LOCAL, url = fileUri, - coverUrl = zipUri( - root, - entryName = index.getCoverEntry() - ?: findFirstImageEntry(zip.entries())?.name.orEmpty(), - ), + coverUrl = cover, + largeCoverUrl = cover, chapters = info.chapters?.map { c -> c.copy(url = fileUri, source = MangaSource.LOCAL) }, diff --git a/app/src/main/res/menu/opt_details.xml b/app/src/main/res/menu/opt_details.xml index fb64e11bc..2d9562a45 100644 --- a/app/src/main/res/menu/opt_details.xml +++ b/app/src/main/res/menu/opt_details.xml @@ -43,6 +43,12 @@ android:title="@string/find_similar" app:showAsAction="never" /> + + List options Relevance Categories + Online variant