mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +01:00 
			
		
		
		
	Convert edit cover function to suspend function (#7330)
This commit is contained in:
		@@ -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))
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -813,7 +813,7 @@ class MangaController :
 | 
			
		||||
            val dataUri = data?.data
 | 
			
		||||
            if (dataUri == null || resultCode != Activity.RESULT_OK) return
 | 
			
		||||
            val activity = activity ?: return
 | 
			
		||||
            presenter.editCover(manga!!, activity, dataUri)
 | 
			
		||||
            presenter.editCover(activity, dataUri)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@ import eu.kanade.tachiyomi.data.database.models.Chapter
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Manga
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.MangaCategory
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Track
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.toDomainManga
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.toMangaInfo
 | 
			
		||||
import eu.kanade.tachiyomi.data.download.DownloadManager
 | 
			
		||||
import eu.kanade.tachiyomi.data.download.model.Download
 | 
			
		||||
@@ -22,7 +23,6 @@ import eu.kanade.tachiyomi.data.saver.ImageSaver
 | 
			
		||||
import eu.kanade.tachiyomi.data.track.EnhancedTrackService
 | 
			
		||||
import eu.kanade.tachiyomi.data.track.TrackManager
 | 
			
		||||
import eu.kanade.tachiyomi.data.track.TrackService
 | 
			
		||||
import eu.kanade.tachiyomi.source.LocalSource
 | 
			
		||||
import eu.kanade.tachiyomi.source.Source
 | 
			
		||||
import eu.kanade.tachiyomi.source.model.toSChapter
 | 
			
		||||
import eu.kanade.tachiyomi.source.model.toSManga
 | 
			
		||||
@@ -33,8 +33,10 @@ 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
 | 
			
		||||
import eu.kanade.tachiyomi.util.lang.withUIContext
 | 
			
		||||
import eu.kanade.tachiyomi.util.prepUpdateCover
 | 
			
		||||
import eu.kanade.tachiyomi.util.removeCovers
 | 
			
		||||
@@ -299,31 +301,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) {
 | 
			
		||||
 
 | 
			
		||||
@@ -877,7 +877,7 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
 | 
			
		||||
     * cover to the presenter.
 | 
			
		||||
     */
 | 
			
		||||
    fun setAsCover(page: ReaderPage) {
 | 
			
		||||
        presenter.setAsCover(page)
 | 
			
		||||
        presenter.setAsCover(this, page)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.reader
 | 
			
		||||
 | 
			
		||||
import android.app.Application
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import android.net.Uri
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import com.jakewharton.rxrelay.BehaviorRelay
 | 
			
		||||
@@ -8,9 +9,11 @@ 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.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
 | 
			
		||||
@@ -19,7 +22,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.ui.base.presenter.BasePresenter
 | 
			
		||||
@@ -32,7 +34,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
 | 
			
		||||
@@ -41,7 +43,6 @@ import eu.kanade.tachiyomi.util.storage.DiskUtil
 | 
			
		||||
import eu.kanade.tachiyomi.util.storage.cacheImageDir
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.isOnline
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.logcat
 | 
			
		||||
import eu.kanade.tachiyomi.util.updateCoverLastModified
 | 
			
		||||
import kotlinx.coroutines.async
 | 
			
		||||
import kotlinx.coroutines.awaitAll
 | 
			
		||||
import logcat.LogPriority
 | 
			
		||||
@@ -692,36 +693,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<Application>()
 | 
			
		||||
                        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)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user