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
This commit is contained in:
Ivan Iskandar 2022-06-18 21:01:03 +07:00 committed by Jobobby04
parent 115fc2afdc
commit 4a23c3b105
6 changed files with 63 additions and 53 deletions

View File

@ -58,4 +58,8 @@ class UpdateManga(
suspend fun awaitUpdateLastUpdate(mangaId: Long): Boolean { suspend fun awaitUpdateLastUpdate(mangaId: Long): Boolean {
return mangaRepository.update(MangaUpdate(id = mangaId, lastUpdate = Date().time)) return mangaRepository.update(MangaUpdate(id = mangaId, lastUpdate = Date().time))
} }
suspend fun awaitUpdateCoverLastModified(mangaId: Long): Boolean {
return mangaRepository.update(MangaUpdate(id = mangaId, coverLastModified = Date().time))
}
} }

View File

@ -1026,7 +1026,7 @@ class MangaController :
// SY --> // SY -->
if (editMangaDialog != null) { if (editMangaDialog != null) {
editMangaDialog?.updateCover(dataUri) editMangaDialog?.updateCover(dataUri)
} else presenter.editCover(manga!!, activity, dataUri) } else presenter.editCover(activity, dataUri)
// SY <-- // SY <--
} }
} }

View File

@ -40,6 +40,7 @@ import eu.kanade.tachiyomi.util.chapter.ChapterSettingsHelper
import eu.kanade.tachiyomi.util.chapter.getChapterSort import eu.kanade.tachiyomi.util.chapter.getChapterSort
import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource
import eu.kanade.tachiyomi.util.chapter.syncChaptersWithTrackServiceTwoWay import eu.kanade.tachiyomi.util.chapter.syncChaptersWithTrackServiceTwoWay
import eu.kanade.tachiyomi.util.editCover
import eu.kanade.tachiyomi.util.isLocal import eu.kanade.tachiyomi.util.isLocal
import eu.kanade.tachiyomi.util.lang.launchIO import eu.kanade.tachiyomi.util.lang.launchIO
import eu.kanade.tachiyomi.util.lang.launchUI import eu.kanade.tachiyomi.util.lang.launchUI
@ -347,7 +348,7 @@ class MangaPresenter(
uri: Uri?, uri: Uri?,
resetCover: Boolean = false, resetCover: Boolean = false,
) { ) {
if (manga.source == LocalSource.ID) { if (manga.isLocal()) {
manga.title = if (title.isNullOrBlank()) manga.url else title.trim() manga.title = if (title.isNullOrBlank()) manga.url else title.trim()
manga.author = author?.trimOrNull() manga.author = author?.trimOrNull()
manga.artist = artist?.trimOrNull() manga.artist = artist?.trimOrNull()
@ -376,7 +377,7 @@ class MangaPresenter(
} }
if (uri != null) { if (uri != null) {
editCover(manga, context, uri) editCover(context, uri)
} else if (resetCover) { } else if (resetCover) {
coverCache.deleteCustomCover(manga.id) coverCache.deleteCustomCover(manga.id)
manga.updateCoverLastModified(db) manga.updateCoverLastModified(db)
@ -630,31 +631,20 @@ class MangaPresenter(
/** /**
* Update cover with local file. * Update cover with local file.
* *
* @param manga the manga edited.
* @param context Context. * @param context Context.
* @param data uri of the cover resource. * @param data uri of the cover resource.
*/ */
fun editCover(manga: Manga, context: Context, data: Uri) { fun editCover(context: Context, data: Uri) {
Observable presenterScope.launchIO {
.fromCallable { context.contentResolver.openInputStream(data)?.use {
context.contentResolver.openInputStream(data)?.use { try {
if (manga.isLocal()) { val result = manga.toDomainManga()!!.editCover(context, it)
LocalSource.updateCover(context, manga, it) launchUI { if (result) view?.onSetCoverSuccess() }
manga.updateCoverLastModified(db) } catch (e: Exception) {
db.insertManga(manga).executeAsBlocking() launchUI { view?.onSetCoverError(e) }
} else if (manga.favorite) {
coverCache.setCustomCoverToCache(manga, it)
manga.updateCoverLastModified(db)
}
true
} }
} }
.subscribeOn(Schedulers.io()) }
.observeOn(AndroidSchedulers.mainThread())
.subscribeFirst(
{ view, _ -> view.onSetCoverSuccess() },
{ view, e -> view.onSetCoverError(e) },
)
} }
fun deleteCustomCover(manga: Manga) { fun deleteCustomCover(manga: Manga) {

View File

@ -1464,7 +1464,7 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
* cover to the presenter. * cover to the presenter.
*/ */
fun setAsCover(page: ReaderPage) { fun setAsCover(page: ReaderPage) {
presenter.setAsCover(page) presenter.setAsCover(this, page)
} }
/** /**

View File

@ -11,10 +11,12 @@ import eu.kanade.domain.chapter.interactor.UpdateChapter
import eu.kanade.domain.chapter.model.ChapterUpdate import eu.kanade.domain.chapter.model.ChapterUpdate
import eu.kanade.domain.history.interactor.UpsertHistory import eu.kanade.domain.history.interactor.UpsertHistory
import eu.kanade.domain.history.model.HistoryUpdate 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.cache.CoverCache
import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.database.models.Chapter import eu.kanade.tachiyomi.data.database.models.Chapter
import eu.kanade.tachiyomi.data.database.models.Manga 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.download.DownloadManager
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.saver.Image 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.TrackManager
import eu.kanade.tachiyomi.data.track.job.DelayedTrackingStore import eu.kanade.tachiyomi.data.track.job.DelayedTrackingStore
import eu.kanade.tachiyomi.data.track.job.DelayedTrackingUpdateJob 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.SourceManager
import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.online.MetadataSource 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.OrientationType
import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType
import eu.kanade.tachiyomi.util.chapter.getChapterSort 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.byteSize
import eu.kanade.tachiyomi.util.lang.launchIO import eu.kanade.tachiyomi.util.lang.launchIO
import eu.kanade.tachiyomi.util.lang.launchUI 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.ImageUtil
import eu.kanade.tachiyomi.util.system.isOnline import eu.kanade.tachiyomi.util.system.isOnline
import eu.kanade.tachiyomi.util.system.logcat import eu.kanade.tachiyomi.util.system.logcat
import eu.kanade.tachiyomi.util.updateCoverLastModified
import exh.md.utils.FollowStatus import exh.md.utils.FollowStatus
import exh.md.utils.MdUtil import exh.md.utils.MdUtil
import exh.metadata.metadata.base.RaisedSearchMetadata 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. * 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 if (page.status != Page.READY) return
val manga = manga ?: return val manga = manga?.toDomainManga() ?: return
val stream = page.stream ?: return val stream = page.stream ?: return
Observable presenterScope.launchIO {
.fromCallable { val result = try {
stream().use { manga.editCover(context, stream())
if (manga.isLocal()) { } catch (e: Exception) {
val context = Injekt.get<Application>() false
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
}
}
}
} }
.subscribeOn(Schedulers.io()) launchUI {
.observeOn(AndroidSchedulers.mainThread()) val resultResult = if (!result) {
.subscribeFirst( SetAsCoverResult.Error
{ view, result -> view.onSetAsCoverResult(result) }, } else if (manga.isLocal() || manga.favorite) {
{ view, _ -> view.onSetAsCoverResult(SetAsCoverResult.Error) }, SetAsCoverResult.Success
) } else {
SetAsCoverResult.AddToLibraryFirst
}
view?.onSetAsCoverResult(resultResult)
}
}
} }
/** /**

View File

@ -1,5 +1,9 @@
package eu.kanade.tachiyomi.util 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.cache.CoverCache
import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.database.models.Manga 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 eu.kanade.tachiyomi.source.model.SManga
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import java.io.InputStream
import java.util.Date import java.util.Date
import eu.kanade.domain.manga.model.Manga as DomainManga
fun Manga.isLocal() = source == LocalSource.ID fun Manga.isLocal() = source == LocalSource.ID
@ -82,3 +88,21 @@ fun Manga.shouldDownloadNewChapters(db: DatabaseHelper, prefs: PreferencesHelper
// In included category // In included category
return categoriesForManga.any { it in includedCategories } 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
}
}