From 4a23c3b1053448f4e2e548e4986cc5a4520c3b00 Mon Sep 17 00:00:00 2001 From: Ivan Iskandar <12537387+ivaniskandar@users.noreply.github.com> Date: Sat, 18 Jun 2022 21:01:03 +0700 Subject: [PATCH] Convert edit cover function to suspend function (#7330) (cherry picked from commit 28e7009b4982fb846296a9e0973f4e84f6f46b25) # Conflicts: # app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt # app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt --- .../domain/manga/interactor/UpdateManga.kt | 4 ++ .../tachiyomi/ui/manga/MangaController.kt | 2 +- .../tachiyomi/ui/manga/MangaPresenter.kt | 34 +++++-------- .../tachiyomi/ui/reader/ReaderActivity.kt | 2 +- .../tachiyomi/ui/reader/ReaderPresenter.kt | 50 ++++++++----------- .../kanade/tachiyomi/util/MangaExtensions.kt | 24 +++++++++ 6 files changed, 63 insertions(+), 53 deletions(-) diff --git a/app/src/main/java/eu/kanade/domain/manga/interactor/UpdateManga.kt b/app/src/main/java/eu/kanade/domain/manga/interactor/UpdateManga.kt index babb7ac41..f52c4bfeb 100644 --- a/app/src/main/java/eu/kanade/domain/manga/interactor/UpdateManga.kt +++ b/app/src/main/java/eu/kanade/domain/manga/interactor/UpdateManga.kt @@ -58,4 +58,8 @@ class UpdateManga( suspend fun awaitUpdateLastUpdate(mangaId: Long): Boolean { return mangaRepository.update(MangaUpdate(id = mangaId, lastUpdate = Date().time)) } + + suspend fun awaitUpdateCoverLastModified(mangaId: Long): Boolean { + return mangaRepository.update(MangaUpdate(id = mangaId, coverLastModified = Date().time)) + } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt index 81c492187..a67f75836 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt @@ -1026,7 +1026,7 @@ class MangaController : // SY --> if (editMangaDialog != null) { editMangaDialog?.updateCover(dataUri) - } else presenter.editCover(manga!!, activity, dataUri) + } else presenter.editCover(activity, dataUri) // SY <-- } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt index 593f4ea06..4e244fbc1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt @@ -40,6 +40,7 @@ import eu.kanade.tachiyomi.util.chapter.ChapterSettingsHelper import eu.kanade.tachiyomi.util.chapter.getChapterSort import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource import eu.kanade.tachiyomi.util.chapter.syncChaptersWithTrackServiceTwoWay +import eu.kanade.tachiyomi.util.editCover import eu.kanade.tachiyomi.util.isLocal import eu.kanade.tachiyomi.util.lang.launchIO import eu.kanade.tachiyomi.util.lang.launchUI @@ -347,7 +348,7 @@ class MangaPresenter( uri: Uri?, resetCover: Boolean = false, ) { - if (manga.source == LocalSource.ID) { + if (manga.isLocal()) { manga.title = if (title.isNullOrBlank()) manga.url else title.trim() manga.author = author?.trimOrNull() manga.artist = artist?.trimOrNull() @@ -376,7 +377,7 @@ class MangaPresenter( } if (uri != null) { - editCover(manga, context, uri) + editCover(context, uri) } else if (resetCover) { coverCache.deleteCustomCover(manga.id) manga.updateCoverLastModified(db) @@ -630,31 +631,20 @@ class MangaPresenter( /** * Update cover with local file. * - * @param manga the manga edited. * @param context Context. * @param data uri of the cover resource. */ - fun editCover(manga: Manga, context: Context, data: Uri) { - Observable - .fromCallable { - context.contentResolver.openInputStream(data)?.use { - if (manga.isLocal()) { - LocalSource.updateCover(context, manga, it) - manga.updateCoverLastModified(db) - db.insertManga(manga).executeAsBlocking() - } else if (manga.favorite) { - coverCache.setCustomCoverToCache(manga, it) - manga.updateCoverLastModified(db) - } - true + fun editCover(context: Context, data: Uri) { + presenterScope.launchIO { + context.contentResolver.openInputStream(data)?.use { + try { + val result = manga.toDomainManga()!!.editCover(context, it) + launchUI { if (result) view?.onSetCoverSuccess() } + } catch (e: Exception) { + launchUI { view?.onSetCoverError(e) } } } - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeFirst( - { view, _ -> view.onSetCoverSuccess() }, - { view, e -> view.onSetCoverError(e) }, - ) + } } fun deleteCustomCover(manga: Manga) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt index f0469a796..ff93311bf 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt @@ -1464,7 +1464,7 @@ class ReaderActivity : BaseRxActivity() { * cover to the presenter. */ fun setAsCover(page: ReaderPage) { - presenter.setAsCover(page) + presenter.setAsCover(this, page) } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt index 4393a79b1..08f745d60 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt @@ -11,10 +11,12 @@ import eu.kanade.domain.chapter.interactor.UpdateChapter import eu.kanade.domain.chapter.model.ChapterUpdate import eu.kanade.domain.history.interactor.UpsertHistory import eu.kanade.domain.history.model.HistoryUpdate +import eu.kanade.domain.manga.model.isLocal import eu.kanade.tachiyomi.data.cache.CoverCache import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.models.Chapter import eu.kanade.tachiyomi.data.database.models.Manga +import eu.kanade.tachiyomi.data.database.models.toDomainManga import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.saver.Image @@ -23,7 +25,6 @@ import eu.kanade.tachiyomi.data.saver.Location import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.track.job.DelayedTrackingStore import eu.kanade.tachiyomi.data.track.job.DelayedTrackingUpdateJob -import eu.kanade.tachiyomi.source.LocalSource import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.online.MetadataSource @@ -39,7 +40,7 @@ import eu.kanade.tachiyomi.ui.reader.model.ViewerChapters import eu.kanade.tachiyomi.ui.reader.setting.OrientationType import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType import eu.kanade.tachiyomi.util.chapter.getChapterSort -import eu.kanade.tachiyomi.util.isLocal +import eu.kanade.tachiyomi.util.editCover import eu.kanade.tachiyomi.util.lang.byteSize import eu.kanade.tachiyomi.util.lang.launchIO import eu.kanade.tachiyomi.util.lang.launchUI @@ -49,7 +50,6 @@ import eu.kanade.tachiyomi.util.storage.cacheImageDir import eu.kanade.tachiyomi.util.system.ImageUtil import eu.kanade.tachiyomi.util.system.isOnline import eu.kanade.tachiyomi.util.system.logcat -import eu.kanade.tachiyomi.util.updateCoverLastModified import exh.md.utils.FollowStatus import exh.md.utils.MdUtil import exh.metadata.metadata.base.RaisedSearchMetadata @@ -903,36 +903,28 @@ class ReaderPresenter( /** * Sets the image of this [page] as cover and notifies the UI of the result. */ - fun setAsCover(page: ReaderPage) { + fun setAsCover(context: Context, page: ReaderPage) { if (page.status != Page.READY) return - val manga = manga ?: return + val manga = manga?.toDomainManga() ?: return val stream = page.stream ?: return - Observable - .fromCallable { - stream().use { - if (manga.isLocal()) { - val context = Injekt.get() - LocalSource.updateCover(context, manga, it) - manga.updateCoverLastModified(db) - SetAsCoverResult.Success - } else { - if (manga.favorite) { - coverCache.setCustomCoverToCache(manga, it) - manga.updateCoverLastModified(db) - SetAsCoverResult.Success - } else { - SetAsCoverResult.AddToLibraryFirst - } - } - } + presenterScope.launchIO { + val result = try { + manga.editCover(context, stream()) + } catch (e: Exception) { + false } - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeFirst( - { view, result -> view.onSetAsCoverResult(result) }, - { view, _ -> view.onSetAsCoverResult(SetAsCoverResult.Error) }, - ) + launchUI { + val resultResult = if (!result) { + SetAsCoverResult.Error + } else if (manga.isLocal() || manga.favorite) { + SetAsCoverResult.Success + } else { + SetAsCoverResult.AddToLibraryFirst + } + view?.onSetAsCoverResult(resultResult) + } + } } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/MangaExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/MangaExtensions.kt index d2c7ce142..f22199a22 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/MangaExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/MangaExtensions.kt @@ -1,5 +1,9 @@ package eu.kanade.tachiyomi.util +import android.content.Context +import eu.kanade.domain.manga.interactor.UpdateManga +import eu.kanade.domain.manga.model.isLocal +import eu.kanade.domain.manga.model.toDbManga import eu.kanade.tachiyomi.data.cache.CoverCache import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.models.Manga @@ -8,7 +12,9 @@ import eu.kanade.tachiyomi.source.LocalSource import eu.kanade.tachiyomi.source.model.SManga import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get +import java.io.InputStream import java.util.Date +import eu.kanade.domain.manga.model.Manga as DomainManga fun Manga.isLocal() = source == LocalSource.ID @@ -82,3 +88,21 @@ fun Manga.shouldDownloadNewChapters(db: DatabaseHelper, prefs: PreferencesHelper // In included category return categoriesForManga.any { it in includedCategories } } + +suspend fun DomainManga.editCover( + context: Context, + stream: InputStream, + updateManga: UpdateManga = Injekt.get(), + coverCache: CoverCache = Injekt.get(), +): Boolean { + return if (isLocal()) { + LocalSource.updateCover(context, toDbManga(), stream) + updateManga.awaitUpdateCoverLastModified(id) + } else if (favorite) { + coverCache.setCustomCoverToCache(toDbManga(), stream) + updateManga.awaitUpdateCoverLastModified(id) + } else { + // We should never reach this block + false + } +}