mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 16:18:55 +01:00 
			
		
		
		
	Several reader fixes
This commit is contained in:
		@@ -22,6 +22,7 @@ import eu.kanade.tachiyomi.ui.base.activity.BaseRxActivity
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.ReaderPresenter.SetAsCoverResult.AddToLibraryFirst
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.ReaderPresenter.SetAsCoverResult.Error
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.ReaderPresenter.SetAsCoverResult.Success
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.model.ReaderPage
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.model.ViewerChapters
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.viewer.BaseViewer
 | 
			
		||||
@@ -429,20 +430,11 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Called from the viewer when the next chapter should be preloaded. It should be called when
 | 
			
		||||
     * the viewer is reaching the end of the chapter or the transition page is active.
 | 
			
		||||
     * Called from the viewer when the given [chapter] should be preloaded. It should be called when
 | 
			
		||||
     * the viewer is reaching the beginning or end of a chapter or the transition page is active.
 | 
			
		||||
     */
 | 
			
		||||
    fun requestPreloadNextChapter() {
 | 
			
		||||
        presenter.preloadNextChapter()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Called from the viewer when the previous chapter should be preloaded. It should be called
 | 
			
		||||
     * when the viewer is going backwards and reaching the beginning of the chapter or the
 | 
			
		||||
     * transition page is active.
 | 
			
		||||
     */
 | 
			
		||||
    fun requestPreloadPreviousChapter() {
 | 
			
		||||
        presenter.preloadPreviousChapter()
 | 
			
		||||
    fun requestPreloadChapter(chapter: ReaderChapter) {
 | 
			
		||||
        presenter.preloadChapter(chapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,7 @@ class ReaderPresenter(
 | 
			
		||||
        private val sourceManager: SourceManager = Injekt.get(),
 | 
			
		||||
        private val downloadManager: DownloadManager = Injekt.get(),
 | 
			
		||||
        private val coverCache: CoverCache = Injekt.get(),
 | 
			
		||||
        val preferences: PreferencesHelper = Injekt.get()
 | 
			
		||||
        private val preferences: PreferencesHelper = Injekt.get()
 | 
			
		||||
) : BasePresenter<ReaderActivity>() {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -331,19 +331,10 @@ class ReaderPresenter(
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Called from the activity to preload the next chapter.
 | 
			
		||||
     * Called from the activity to preload the given [chapter].
 | 
			
		||||
     */
 | 
			
		||||
    fun preloadNextChapter() {
 | 
			
		||||
        val nextChapter = viewerChaptersRelay.value?.nextChapter ?: return
 | 
			
		||||
        preload(nextChapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Called from the activity to preload the previous chapter.
 | 
			
		||||
     */
 | 
			
		||||
    fun preloadPreviousChapter() {
 | 
			
		||||
        val prevChapter = viewerChaptersRelay.value?.prevChapter ?: return
 | 
			
		||||
        preload(prevChapter)
 | 
			
		||||
    fun preloadChapter(chapter: ReaderChapter) {
 | 
			
		||||
        preload(chapter)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -62,8 +62,12 @@ class HttpPageLoader(
 | 
			
		||||
        // Cache current page list progress for online chapters to allow a faster reopen
 | 
			
		||||
        val pages = chapter.pages
 | 
			
		||||
        if (pages != null) {
 | 
			
		||||
            // TODO check compatibility with ReaderPage
 | 
			
		||||
            Completable.fromAction { chapterCache.putPageListToCache(chapter.chapter, pages) }
 | 
			
		||||
            Completable
 | 
			
		||||
                .fromAction {
 | 
			
		||||
                    // Convert to pages without reader information
 | 
			
		||||
                    val pagesToSave = pages.map { Page(it.index, it.url, it.imageUrl) }
 | 
			
		||||
                    chapterCache.putPageListToCache(chapter.chapter, pagesToSave)
 | 
			
		||||
                }
 | 
			
		||||
                .onErrorComplete()
 | 
			
		||||
                .subscribeOn(Schedulers.io())
 | 
			
		||||
                .subscribe()
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,6 @@ package eu.kanade.tachiyomi.ui.reader.model
 | 
			
		||||
 | 
			
		||||
import com.jakewharton.rxrelay.BehaviorRelay
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Chapter
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.loader.DownloadPageLoader
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.loader.PageLoader
 | 
			
		||||
import timber.log.Timber
 | 
			
		||||
 | 
			
		||||
@@ -26,10 +25,6 @@ data class ReaderChapter(val chapter: Chapter) {
 | 
			
		||||
 | 
			
		||||
    var requestedPage: Int = 0
 | 
			
		||||
 | 
			
		||||
    val isDownloaded
 | 
			
		||||
        get() = pageLoader is DownloadPageLoader
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    var references = 0
 | 
			
		||||
        private set
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -168,10 +168,9 @@ class PagerTransitionHolder(
 | 
			
		||||
            wrapContent()
 | 
			
		||||
            setText(R.string.action_retry)
 | 
			
		||||
            setOnClickListener {
 | 
			
		||||
                if (transition is ChapterTransition.Next) {
 | 
			
		||||
                    viewer.activity.requestPreloadNextChapter()
 | 
			
		||||
                } else {
 | 
			
		||||
                    viewer.activity.requestPreloadPreviousChapter()
 | 
			
		||||
                val toChapter = transition.to
 | 
			
		||||
                if (toChapter != null) {
 | 
			
		||||
                    viewer.activity.requestPreloadChapter(toChapter)
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -74,7 +74,7 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer {
 | 
			
		||||
                if (page != null && currentPage != page) {
 | 
			
		||||
                    currentPage = page
 | 
			
		||||
                    when (page) {
 | 
			
		||||
                        is ReaderPage -> onPageSelected(page)
 | 
			
		||||
                        is ReaderPage -> onPageSelected(page, position)
 | 
			
		||||
                        is ChapterTransition -> onTransitionSelected(page)
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
@@ -128,14 +128,17 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer {
 | 
			
		||||
     * Called from the ViewPager listener when a [page] is marked as active. It notifies the
 | 
			
		||||
     * activity of the change and requests the preload of the next chapter if this is the last page.
 | 
			
		||||
     */
 | 
			
		||||
    private fun onPageSelected(page: ReaderPage) {
 | 
			
		||||
    private fun onPageSelected(page: ReaderPage, position: Int) {
 | 
			
		||||
        val pages = page.chapter.pages!! // Won't be null because it's the loaded chapter
 | 
			
		||||
        Timber.d("onPageSelected: ${page.number}/${pages.size}")
 | 
			
		||||
        activity.onPageSelected(page)
 | 
			
		||||
 | 
			
		||||
        if (page === pages.last()) {
 | 
			
		||||
            Timber.d("Request preload next chapter because we're at the last page")
 | 
			
		||||
            activity.requestPreloadNextChapter()
 | 
			
		||||
            val transition = adapter.items.getOrNull(position + 1) as? ChapterTransition.Next
 | 
			
		||||
            if (transition?.to != null) {
 | 
			
		||||
                activity.requestPreloadChapter(transition.to)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -145,15 +148,10 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer {
 | 
			
		||||
     */
 | 
			
		||||
    private fun onTransitionSelected(transition: ChapterTransition) {
 | 
			
		||||
        Timber.d("onTransitionSelected: $transition")
 | 
			
		||||
        when (transition) {
 | 
			
		||||
            is ChapterTransition.Prev -> {
 | 
			
		||||
                Timber.d("Request preload previous chapter because we're on the transition")
 | 
			
		||||
                activity.requestPreloadPreviousChapter()
 | 
			
		||||
            }
 | 
			
		||||
            is ChapterTransition.Next -> {
 | 
			
		||||
                Timber.d("Request preload next chapter because we're on the transition")
 | 
			
		||||
                activity.requestPreloadNextChapter()
 | 
			
		||||
            }
 | 
			
		||||
        val toChapter = transition.to
 | 
			
		||||
        if (toChapter != null) {
 | 
			
		||||
            Timber.d("Request preload destination chapter because we're on the transition")
 | 
			
		||||
            activity.requestPreloadChapter(toChapter)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -180,10 +180,9 @@ class WebtoonTransitionHolder(
 | 
			
		||||
            wrapContent()
 | 
			
		||||
            setText(R.string.action_retry)
 | 
			
		||||
            setOnClickListener {
 | 
			
		||||
                if (transition is ChapterTransition.Next) {
 | 
			
		||||
                    viewer.activity.requestPreloadNextChapter()
 | 
			
		||||
                } else {
 | 
			
		||||
                    viewer.activity.requestPreloadPreviousChapter()
 | 
			
		||||
                val toChapter = transition.to
 | 
			
		||||
                if (toChapter != null) {
 | 
			
		||||
                    viewer.activity.requestPreloadChapter(toChapter)
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -68,12 +68,12 @@ class WebtoonViewer(val activity: ReaderActivity) : BaseViewer {
 | 
			
		||||
        recycler.adapter = adapter
 | 
			
		||||
        recycler.addOnScrollListener(object : RecyclerView.OnScrollListener() {
 | 
			
		||||
            override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
 | 
			
		||||
                val index = layoutManager.findLastEndVisibleItemPosition()
 | 
			
		||||
                val item = adapter.items.getOrNull(index)
 | 
			
		||||
                val position = layoutManager.findLastEndVisibleItemPosition()
 | 
			
		||||
                val item = adapter.items.getOrNull(position)
 | 
			
		||||
                if (item != null && currentPage != item) {
 | 
			
		||||
                    currentPage = item
 | 
			
		||||
                    when (item) {
 | 
			
		||||
                        is ReaderPage -> onPageSelected(item)
 | 
			
		||||
                        is ReaderPage -> onPageSelected(item, position)
 | 
			
		||||
                        is ChapterTransition -> onTransitionSelected(item)
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
@@ -81,8 +81,8 @@ class WebtoonViewer(val activity: ReaderActivity) : BaseViewer {
 | 
			
		||||
                if (dy < 0) {
 | 
			
		||||
                    val firstIndex = layoutManager.findFirstVisibleItemPosition()
 | 
			
		||||
                    val firstItem = adapter.items.getOrNull(firstIndex)
 | 
			
		||||
                    if (firstItem is ChapterTransition.Prev) {
 | 
			
		||||
                        activity.requestPreloadPreviousChapter()
 | 
			
		||||
                    if (firstItem is ChapterTransition.Prev && firstItem.to != null) {
 | 
			
		||||
                        activity.requestPreloadChapter(firstItem.to)
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
@@ -125,29 +125,33 @@ class WebtoonViewer(val activity: ReaderActivity) : BaseViewer {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Called from the ViewPager listener when a [page] is marked as active. It notifies the
 | 
			
		||||
     * Called from the RecyclerView listener when a [page] is marked as active. It notifies the
 | 
			
		||||
     * activity of the change and requests the preload of the next chapter if this is the last page.
 | 
			
		||||
     */
 | 
			
		||||
    private fun onPageSelected(page: ReaderPage) {
 | 
			
		||||
    private fun onPageSelected(page: ReaderPage, position: Int) {
 | 
			
		||||
        val pages = page.chapter.pages!! // Won't be null because it's the loaded chapter
 | 
			
		||||
        Timber.d("onPageSelected: ${page.number}/${pages.size}")
 | 
			
		||||
        activity.onPageSelected(page)
 | 
			
		||||
 | 
			
		||||
        if (page === pages.last()) {
 | 
			
		||||
            Timber.d("Request preload next chapter because we're at the last page")
 | 
			
		||||
            activity.requestPreloadNextChapter()
 | 
			
		||||
            val transition = adapter.items.getOrNull(position + 1) as? ChapterTransition.Next
 | 
			
		||||
            if (transition?.to != null) {
 | 
			
		||||
                activity.requestPreloadChapter(transition.to)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Called from the ViewPager listener when a [transition] is marked as active. It request the
 | 
			
		||||
     * Called from the RecyclerView listener when a [transition] is marked as active. It request the
 | 
			
		||||
     * preload of the destination chapter of the transition.
 | 
			
		||||
     */
 | 
			
		||||
    private fun onTransitionSelected(transition: ChapterTransition) {
 | 
			
		||||
        Timber.d("onTransitionSelected: $transition")
 | 
			
		||||
        if (transition is ChapterTransition.Prev) {
 | 
			
		||||
            Timber.d("Request preload previous chapter because we're on the transition")
 | 
			
		||||
            activity.requestPreloadPreviousChapter()
 | 
			
		||||
        val toChapter = transition.to
 | 
			
		||||
        if (toChapter != null) {
 | 
			
		||||
            Timber.d("Request preload destination chapter because we're on the transition")
 | 
			
		||||
            activity.requestPreloadChapter(toChapter)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -6,16 +6,12 @@ import java.net.URLConnection
 | 
			
		||||
object ImageUtil {
 | 
			
		||||
 | 
			
		||||
    fun isImage(name: String, openStream: (() -> InputStream)? = null): Boolean {
 | 
			
		||||
        try {
 | 
			
		||||
            val guessedMime = URLConnection.guessContentTypeFromName(name)
 | 
			
		||||
            if (guessedMime.startsWith("image/")) {
 | 
			
		||||
                return true
 | 
			
		||||
            }
 | 
			
		||||
        val contentType = try {
 | 
			
		||||
            URLConnection.guessContentTypeFromName(name)
 | 
			
		||||
        } catch (e: Exception) {
 | 
			
		||||
            /* Ignore error */
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return openStream?.let { findImageType(it) } != null
 | 
			
		||||
            null
 | 
			
		||||
        } ?: openStream?.let { findImageType(it)?.mime }
 | 
			
		||||
        return contentType?.startsWith("image/") ?: false
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun findImageType(openStream: () -> InputStream): ImageType? {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user