Action to open online version of saved manga
This commit is contained in:
@@ -86,4 +86,6 @@ class DetailsInteractor @Inject constructor(
|
||||
subject
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun findLocal(seed: Manga) = localMangaRepository.getRemoteManga(seed)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -94,6 +94,8 @@ class DetailsViewModel @Inject constructor(
|
||||
val favouriteCategories = interactor.observeIsFavourite(mangaId)
|
||||
.stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, false)
|
||||
|
||||
val remoteManga = MutableStateFlow<Manga?>(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() {
|
||||
|
||||
@@ -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)
|
||||
},
|
||||
|
||||
@@ -67,10 +67,11 @@ sealed class LocalMangaInput(
|
||||
|
||||
@JvmStatic
|
||||
protected fun Manga.copy2(
|
||||
url: String = this.url,
|
||||
coverUrl: String = this.coverUrl,
|
||||
chapters: List<MangaChapter>? = this.chapters,
|
||||
source: MangaSource = this.source,
|
||||
url: String,
|
||||
coverUrl: String,
|
||||
largeCoverUrl: String,
|
||||
chapters: List<MangaChapter>?,
|
||||
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,
|
||||
|
||||
@@ -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)
|
||||
},
|
||||
|
||||
@@ -43,6 +43,12 @@
|
||||
android:title="@string/find_similar"
|
||||
app:showAsAction="never" />
|
||||
|
||||
<item
|
||||
android:id="@+id/action_online"
|
||||
android:orderInCategory="50"
|
||||
android:title="@string/online_variant"
|
||||
app:showAsAction="never" />
|
||||
|
||||
<item
|
||||
android:id="@+id/action_browser"
|
||||
android:orderInCategory="50"
|
||||
|
||||
@@ -499,4 +499,5 @@
|
||||
<string name="list_options">List options</string>
|
||||
<string name="by_relevance">Relevance</string>
|
||||
<string name="categories">Categories</string>
|
||||
<string name="online_variant">Online variant</string>
|
||||
</resources>
|
||||
|
||||
Reference in New Issue
Block a user