mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +01:00 
			
		
		
		
	Cleanup Page status (#8696)
* Cleanup Page statusSubject and statusCallback * Convert Page status from Int to enum
This commit is contained in:
		@@ -179,7 +179,7 @@ class DownloadManager(
 | 
			
		||||
 | 
			
		||||
            files.sortedBy { it.name }
 | 
			
		||||
                .mapIndexed { i, file ->
 | 
			
		||||
                    Page(i, uri = file.uri).apply { status = Page.READY }
 | 
			
		||||
                    Page(i, uri = file.uri).apply { status = Page.State.READY }
 | 
			
		||||
                }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -402,13 +402,13 @@ class Downloader(
 | 
			
		||||
                page.uri = file.uri
 | 
			
		||||
                page.progress = 100
 | 
			
		||||
                download.downloadedImages++
 | 
			
		||||
                page.status = Page.READY
 | 
			
		||||
                page.status = Page.State.READY
 | 
			
		||||
            }
 | 
			
		||||
            .map { page }
 | 
			
		||||
            // Mark this page as error and allow to download the remaining
 | 
			
		||||
            .onErrorReturn {
 | 
			
		||||
                page.progress = 0
 | 
			
		||||
                page.status = Page.ERROR
 | 
			
		||||
                page.status = Page.State.ERROR
 | 
			
		||||
                notifier.onError(it.message, download.chapter.name, download.manga.title)
 | 
			
		||||
                page
 | 
			
		||||
            }
 | 
			
		||||
@@ -423,7 +423,7 @@ class Downloader(
 | 
			
		||||
     * @param filename the filename of the image.
 | 
			
		||||
     */
 | 
			
		||||
    private fun downloadImage(page: Page, source: HttpSource, tmpDir: UniFile, filename: String): Observable<UniFile> {
 | 
			
		||||
        page.status = Page.DOWNLOAD_IMAGE
 | 
			
		||||
        page.status = Page.State.DOWNLOAD_IMAGE
 | 
			
		||||
        page.progress = 0
 | 
			
		||||
        return source.fetchImage(page)
 | 
			
		||||
            .map { response ->
 | 
			
		||||
 
 | 
			
		||||
@@ -100,11 +100,11 @@ class DownloadQueue(
 | 
			
		||||
            .startWith(getActiveDownloads())
 | 
			
		||||
            .flatMap { download ->
 | 
			
		||||
                if (download.status == Download.State.DOWNLOADING) {
 | 
			
		||||
                    val pageStatusSubject = PublishSubject.create<Int>()
 | 
			
		||||
                    val pageStatusSubject = PublishSubject.create<Page.State>()
 | 
			
		||||
                    setPagesSubject(download.pages, pageStatusSubject)
 | 
			
		||||
                    return@flatMap pageStatusSubject
 | 
			
		||||
                        .onBackpressureBuffer()
 | 
			
		||||
                        .filter { it == Page.READY }
 | 
			
		||||
                        .filter { it == Page.State.READY }
 | 
			
		||||
                        .map { download }
 | 
			
		||||
                } else if (download.status == Download.State.DOWNLOADED || download.status == Download.State.ERROR) {
 | 
			
		||||
                    setPagesSubject(download.pages, null)
 | 
			
		||||
@@ -120,7 +120,7 @@ class DownloadQueue(
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun setPagesSubject(pages: List<Page>?, subject: PublishSubject<Int>?) {
 | 
			
		||||
        pages?.forEach { it.setStatusSubject(subject) }
 | 
			
		||||
    private fun setPagesSubject(pages: List<Page>?, subject: PublishSubject<Page.State>?) {
 | 
			
		||||
        pages?.forEach { it.statusSubject = subject }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -33,7 +33,7 @@ class ReaderPageSheet(
 | 
			
		||||
     * Sets the image of this page as the cover of the manga.
 | 
			
		||||
     */
 | 
			
		||||
    private fun setAsCover() {
 | 
			
		||||
        if (page.status != Page.READY) return
 | 
			
		||||
        if (page.status != Page.State.READY) return
 | 
			
		||||
 | 
			
		||||
        MaterialAlertDialogBuilder(activity)
 | 
			
		||||
            .setMessage(R.string.confirm_set_image_as_cover)
 | 
			
		||||
 
 | 
			
		||||
@@ -720,7 +720,7 @@ class ReaderPresenter(
 | 
			
		||||
     * There's also a notification to allow sharing the image somewhere else or deleting it.
 | 
			
		||||
     */
 | 
			
		||||
    fun saveImage(page: ReaderPage) {
 | 
			
		||||
        if (page.status != Page.READY) return
 | 
			
		||||
        if (page.status != Page.State.READY) return
 | 
			
		||||
        val manga = manga ?: return
 | 
			
		||||
 | 
			
		||||
        val context = Injekt.get<Application>()
 | 
			
		||||
@@ -761,7 +761,7 @@ class ReaderPresenter(
 | 
			
		||||
     * image will be kept so it won't be taking lots of internal disk space.
 | 
			
		||||
     */
 | 
			
		||||
    fun shareImage(page: ReaderPage) {
 | 
			
		||||
        if (page.status != Page.READY) return
 | 
			
		||||
        if (page.status != Page.State.READY) return
 | 
			
		||||
        val manga = manga ?: return
 | 
			
		||||
 | 
			
		||||
        val context = Injekt.get<Application>()
 | 
			
		||||
@@ -792,7 +792,7 @@ class ReaderPresenter(
 | 
			
		||||
     * Sets the image of this [page] as cover and notifies the UI of the result.
 | 
			
		||||
     */
 | 
			
		||||
    fun setAsCover(context: Context, page: ReaderPage) {
 | 
			
		||||
        if (page.status != Page.READY) return
 | 
			
		||||
        if (page.status != Page.State.READY) return
 | 
			
		||||
        val manga = manga?.toDomainManga() ?: return
 | 
			
		||||
        val stream = page.stream ?: return
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ class DirectoryPageLoader(val file: File) : PageLoader() {
 | 
			
		||||
                val streamFn = { FileInputStream(file) }
 | 
			
		||||
                ReaderPage(i).apply {
 | 
			
		||||
                    stream = streamFn
 | 
			
		||||
                    status = Page.READY
 | 
			
		||||
                    status = Page.State.READY
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            .let { Observable.just(it) }
 | 
			
		||||
@@ -34,7 +34,7 @@ class DirectoryPageLoader(val file: File) : PageLoader() {
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns an observable that emits a ready state.
 | 
			
		||||
     */
 | 
			
		||||
    override fun getPage(page: ReaderPage): Observable<Int> {
 | 
			
		||||
        return Observable.just(Page.READY)
 | 
			
		||||
    override fun getPage(page: ReaderPage): Observable<Page.State> {
 | 
			
		||||
        return Observable.just(Page.State.READY)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -54,13 +54,13 @@ class DownloadPageLoader(
 | 
			
		||||
                    ReaderPage(page.index, page.url, page.imageUrl) {
 | 
			
		||||
                        context.contentResolver.openInputStream(page.uri ?: Uri.EMPTY)!!
 | 
			
		||||
                    }.apply {
 | 
			
		||||
                        status = Page.READY
 | 
			
		||||
                        status = Page.State.READY
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun getPage(page: ReaderPage): Observable<Int> {
 | 
			
		||||
        return Observable.just(Page.READY)
 | 
			
		||||
    override fun getPage(page: ReaderPage): Observable<Page.State> {
 | 
			
		||||
        return Observable.just(Page.State.READY)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -34,7 +34,7 @@ class EpubPageLoader(file: File) : PageLoader() {
 | 
			
		||||
                val streamFn = { epub.getInputStream(epub.getEntry(path)!!) }
 | 
			
		||||
                ReaderPage(i).apply {
 | 
			
		||||
                    stream = streamFn
 | 
			
		||||
                    status = Page.READY
 | 
			
		||||
                    status = Page.State.READY
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            .let { Observable.just(it) }
 | 
			
		||||
@@ -43,12 +43,12 @@ class EpubPageLoader(file: File) : PageLoader() {
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns an observable that emits a ready state unless the loader was recycled.
 | 
			
		||||
     */
 | 
			
		||||
    override fun getPage(page: ReaderPage): Observable<Int> {
 | 
			
		||||
    override fun getPage(page: ReaderPage): Observable<Page.State> {
 | 
			
		||||
        return Observable.just(
 | 
			
		||||
            if (isRecycled) {
 | 
			
		||||
                Page.ERROR
 | 
			
		||||
                Page.State.ERROR
 | 
			
		||||
            } else {
 | 
			
		||||
                Page.READY
 | 
			
		||||
                Page.State.READY
 | 
			
		||||
            },
 | 
			
		||||
        )
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,7 @@ class HttpPageLoader(
 | 
			
		||||
 | 
			
		||||
    init {
 | 
			
		||||
        subscriptions += Observable.defer { Observable.just(queue.take().page) }
 | 
			
		||||
            .filter { it.status == Page.QUEUE }
 | 
			
		||||
            .filter { it.status == Page.State.QUEUE }
 | 
			
		||||
            .concatMap { source.fetchImageFromCacheThenNet(it) }
 | 
			
		||||
            .repeat()
 | 
			
		||||
            .subscribeOn(Schedulers.io())
 | 
			
		||||
@@ -101,25 +101,25 @@ class HttpPageLoader(
 | 
			
		||||
     * Returns an observable that loads a page through the queue and listens to its result to
 | 
			
		||||
     * emit new states. It handles re-enqueueing pages if they were evicted from the cache.
 | 
			
		||||
     */
 | 
			
		||||
    override fun getPage(page: ReaderPage): Observable<Int> {
 | 
			
		||||
    override fun getPage(page: ReaderPage): Observable<Page.State> {
 | 
			
		||||
        return Observable.defer {
 | 
			
		||||
            val imageUrl = page.imageUrl
 | 
			
		||||
 | 
			
		||||
            // Check if the image has been deleted
 | 
			
		||||
            if (page.status == Page.READY && imageUrl != null && !chapterCache.isImageInCache(imageUrl)) {
 | 
			
		||||
                page.status = Page.QUEUE
 | 
			
		||||
            if (page.status == Page.State.READY && imageUrl != null && !chapterCache.isImageInCache(imageUrl)) {
 | 
			
		||||
                page.status = Page.State.QUEUE
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Automatically retry failed pages when subscribed to this page
 | 
			
		||||
            if (page.status == Page.ERROR) {
 | 
			
		||||
                page.status = Page.QUEUE
 | 
			
		||||
            if (page.status == Page.State.ERROR) {
 | 
			
		||||
                page.status = Page.State.QUEUE
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            val statusSubject = SerializedSubject(PublishSubject.create<Int>())
 | 
			
		||||
            page.setStatusSubject(statusSubject)
 | 
			
		||||
            val statusSubject = SerializedSubject(PublishSubject.create<Page.State>())
 | 
			
		||||
            page.statusSubject = statusSubject
 | 
			
		||||
 | 
			
		||||
            val queuedPages = mutableListOf<PriorityPage>()
 | 
			
		||||
            if (page.status == Page.QUEUE) {
 | 
			
		||||
            if (page.status == Page.State.QUEUE) {
 | 
			
		||||
                queuedPages += PriorityPage(page, 1).also { queue.offer(it) }
 | 
			
		||||
            }
 | 
			
		||||
            queuedPages += preloadNextPages(page, preloadSize)
 | 
			
		||||
@@ -127,7 +127,7 @@ class HttpPageLoader(
 | 
			
		||||
            statusSubject.startWith(page.status)
 | 
			
		||||
                .doOnUnsubscribe {
 | 
			
		||||
                    queuedPages.forEach {
 | 
			
		||||
                        if (it.page.status == Page.QUEUE) {
 | 
			
		||||
                        if (it.page.status == Page.State.QUEUE) {
 | 
			
		||||
                            queue.remove(it)
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
@@ -149,7 +149,7 @@ class HttpPageLoader(
 | 
			
		||||
        return pages
 | 
			
		||||
            .subList(pageIndex + 1, min(pageIndex + 1 + amount, pages.size))
 | 
			
		||||
            .mapNotNull {
 | 
			
		||||
                if (it.status == Page.QUEUE) {
 | 
			
		||||
                if (it.status == Page.State.QUEUE) {
 | 
			
		||||
                    PriorityPage(it, 0).apply { queue.offer(this) }
 | 
			
		||||
                } else {
 | 
			
		||||
                    null
 | 
			
		||||
@@ -161,8 +161,8 @@ class HttpPageLoader(
 | 
			
		||||
     * Retries a page. This method is only called from user interaction on the viewer.
 | 
			
		||||
     */
 | 
			
		||||
    override fun retryPage(page: ReaderPage) {
 | 
			
		||||
        if (page.status == Page.ERROR) {
 | 
			
		||||
            page.status = Page.QUEUE
 | 
			
		||||
        if (page.status == Page.State.ERROR) {
 | 
			
		||||
            page.status = Page.State.QUEUE
 | 
			
		||||
        }
 | 
			
		||||
        queue.offer(PriorityPage(page, 2))
 | 
			
		||||
    }
 | 
			
		||||
@@ -200,9 +200,9 @@ class HttpPageLoader(
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun HttpSource.getImageUrl(page: ReaderPage): Observable<ReaderPage> {
 | 
			
		||||
        page.status = Page.LOAD_PAGE
 | 
			
		||||
        page.status = Page.State.LOAD_PAGE
 | 
			
		||||
        return fetchImageUrl(page)
 | 
			
		||||
            .doOnError { page.status = Page.ERROR }
 | 
			
		||||
            .doOnError { page.status = Page.State.ERROR }
 | 
			
		||||
            .onErrorReturn { null }
 | 
			
		||||
            .doOnNext { page.imageUrl = it }
 | 
			
		||||
            .map { page }
 | 
			
		||||
@@ -227,9 +227,9 @@ class HttpPageLoader(
 | 
			
		||||
            }
 | 
			
		||||
            .doOnNext {
 | 
			
		||||
                page.stream = { chapterCache.getImageFile(imageUrl).inputStream() }
 | 
			
		||||
                page.status = Page.READY
 | 
			
		||||
                page.status = Page.State.READY
 | 
			
		||||
            }
 | 
			
		||||
            .doOnError { page.status = Page.ERROR }
 | 
			
		||||
            .doOnError { page.status = Page.State.ERROR }
 | 
			
		||||
            .onErrorReturn { page }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -239,7 +239,7 @@ class HttpPageLoader(
 | 
			
		||||
     * @param page the page.
 | 
			
		||||
     */
 | 
			
		||||
    private fun HttpSource.cacheImage(page: ReaderPage): Observable<ReaderPage> {
 | 
			
		||||
        page.status = Page.DOWNLOAD_IMAGE
 | 
			
		||||
        page.status = Page.State.DOWNLOAD_IMAGE
 | 
			
		||||
        return fetchImage(page)
 | 
			
		||||
            .doOnNext { chapterCache.putImageToCache(page.imageUrl!!, it) }
 | 
			
		||||
            .map { page }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.reader.loader
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.CallSuper
 | 
			
		||||
import eu.kanade.tachiyomi.source.model.Page
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.model.ReaderPage
 | 
			
		||||
import rx.Observable
 | 
			
		||||
 | 
			
		||||
@@ -32,10 +33,9 @@ abstract class PageLoader {
 | 
			
		||||
    abstract fun getPages(): Observable<List<ReaderPage>>
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns an observable that should inform of the progress of the page (see the Page class
 | 
			
		||||
     * for the available states)
 | 
			
		||||
     * Returns an observable that should inform of the progress of the page
 | 
			
		||||
     */
 | 
			
		||||
    abstract fun getPage(page: ReaderPage): Observable<Int>
 | 
			
		||||
    abstract fun getPage(page: ReaderPage): Observable<Page.State>
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Retries the given [page] in case it failed to load. This method only makes sense when an
 | 
			
		||||
 
 | 
			
		||||
@@ -48,7 +48,7 @@ class RarPageLoader(file: File) : PageLoader() {
 | 
			
		||||
            .mapIndexed { i, header ->
 | 
			
		||||
                ReaderPage(i).apply {
 | 
			
		||||
                    stream = { getStream(header) }
 | 
			
		||||
                    status = Page.READY
 | 
			
		||||
                    status = Page.State.READY
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            .let { Observable.just(it.toList()) }
 | 
			
		||||
@@ -57,12 +57,12 @@ class RarPageLoader(file: File) : PageLoader() {
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns an observable that emits a ready state unless the loader was recycled.
 | 
			
		||||
     */
 | 
			
		||||
    override fun getPage(page: ReaderPage): Observable<Int> {
 | 
			
		||||
    override fun getPage(page: ReaderPage): Observable<Page.State> {
 | 
			
		||||
        return Observable.just(
 | 
			
		||||
            if (isRecycled) {
 | 
			
		||||
                Page.ERROR
 | 
			
		||||
                Page.State.ERROR
 | 
			
		||||
            } else {
 | 
			
		||||
                Page.READY
 | 
			
		||||
                Page.State.READY
 | 
			
		||||
            },
 | 
			
		||||
        )
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,7 @@ class ZipPageLoader(file: File) : PageLoader() {
 | 
			
		||||
            .mapIndexed { i, entry ->
 | 
			
		||||
                ReaderPage(i).apply {
 | 
			
		||||
                    stream = { zip.getInputStream(entry) }
 | 
			
		||||
                    status = Page.READY
 | 
			
		||||
                    status = Page.State.READY
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            .let { Observable.just(it.toList()) }
 | 
			
		||||
@@ -52,12 +52,12 @@ class ZipPageLoader(file: File) : PageLoader() {
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns an observable that emits a ready state unless the loader was recycled.
 | 
			
		||||
     */
 | 
			
		||||
    override fun getPage(page: ReaderPage): Observable<Int> {
 | 
			
		||||
    override fun getPage(page: ReaderPage): Observable<Page.State> {
 | 
			
		||||
        return Observable.just(
 | 
			
		||||
            if (isRecycled) {
 | 
			
		||||
                Page.ERROR
 | 
			
		||||
                Page.State.ERROR
 | 
			
		||||
            } else {
 | 
			
		||||
                Page.READY
 | 
			
		||||
                Page.State.READY
 | 
			
		||||
            },
 | 
			
		||||
        )
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@ class StencilPage(
 | 
			
		||||
    override var chapter: ReaderChapter = parent.chapter
 | 
			
		||||
 | 
			
		||||
    init {
 | 
			
		||||
        status = READY
 | 
			
		||||
        status = State.READY
 | 
			
		||||
        stream = stencilStream
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -119,19 +119,19 @@ class PagerPageHolder(
 | 
			
		||||
     *
 | 
			
		||||
     * @param status the new status of the page.
 | 
			
		||||
     */
 | 
			
		||||
    private fun processStatus(status: Int) {
 | 
			
		||||
    private fun processStatus(status: Page.State) {
 | 
			
		||||
        when (status) {
 | 
			
		||||
            Page.QUEUE -> setQueued()
 | 
			
		||||
            Page.LOAD_PAGE -> setLoading()
 | 
			
		||||
            Page.DOWNLOAD_IMAGE -> {
 | 
			
		||||
            Page.State.QUEUE -> setQueued()
 | 
			
		||||
            Page.State.LOAD_PAGE -> setLoading()
 | 
			
		||||
            Page.State.DOWNLOAD_IMAGE -> {
 | 
			
		||||
                observeProgress()
 | 
			
		||||
                setDownloading()
 | 
			
		||||
            }
 | 
			
		||||
            Page.READY -> {
 | 
			
		||||
            Page.State.READY -> {
 | 
			
		||||
                setImage()
 | 
			
		||||
                unsubscribeProgress()
 | 
			
		||||
            }
 | 
			
		||||
            Page.ERROR -> {
 | 
			
		||||
            Page.State.ERROR -> {
 | 
			
		||||
                setError()
 | 
			
		||||
                unsubscribeProgress()
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -165,19 +165,19 @@ class WebtoonPageHolder(
 | 
			
		||||
     *
 | 
			
		||||
     * @param status the new status of the page.
 | 
			
		||||
     */
 | 
			
		||||
    private fun processStatus(status: Int) {
 | 
			
		||||
    private fun processStatus(status: Page.State) {
 | 
			
		||||
        when (status) {
 | 
			
		||||
            Page.QUEUE -> setQueued()
 | 
			
		||||
            Page.LOAD_PAGE -> setLoading()
 | 
			
		||||
            Page.DOWNLOAD_IMAGE -> {
 | 
			
		||||
            Page.State.QUEUE -> setQueued()
 | 
			
		||||
            Page.State.LOAD_PAGE -> setLoading()
 | 
			
		||||
            Page.State.DOWNLOAD_IMAGE -> {
 | 
			
		||||
                observeProgress()
 | 
			
		||||
                setDownloading()
 | 
			
		||||
            }
 | 
			
		||||
            Page.READY -> {
 | 
			
		||||
            Page.State.READY -> {
 | 
			
		||||
                setImage()
 | 
			
		||||
                unsubscribeProgress()
 | 
			
		||||
            }
 | 
			
		||||
            Page.ERROR -> {
 | 
			
		||||
            Page.State.ERROR -> {
 | 
			
		||||
                setError()
 | 
			
		||||
                unsubscribeProgress()
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user