mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-03 23:58:55 +01:00 
			
		
		
		
	Reader cache + retry improvements
This commit is contained in:
		@@ -6,12 +6,16 @@ import com.github.salomonbrys.kotson.fromJson
 | 
			
		||||
import com.google.gson.Gson
 | 
			
		||||
import com.jakewharton.disklrucache.DiskLruCache
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Chapter
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.getOrDefault
 | 
			
		||||
import eu.kanade.tachiyomi.source.model.Page
 | 
			
		||||
import eu.kanade.tachiyomi.util.DiskUtil
 | 
			
		||||
import eu.kanade.tachiyomi.util.saveTo
 | 
			
		||||
import okhttp3.Response
 | 
			
		||||
import okio.Okio
 | 
			
		||||
import rx.Observable
 | 
			
		||||
import uy.kohesive.injekt.Injekt
 | 
			
		||||
import uy.kohesive.injekt.api.get
 | 
			
		||||
import uy.kohesive.injekt.injectLazy
 | 
			
		||||
import java.io.File
 | 
			
		||||
import java.io.IOException
 | 
			
		||||
@@ -26,7 +30,6 @@ import java.io.IOException
 | 
			
		||||
 * @constructor creates an instance of the chapter cache.
 | 
			
		||||
 */
 | 
			
		||||
class ChapterCache(private val context: Context) {
 | 
			
		||||
 | 
			
		||||
    companion object {
 | 
			
		||||
        /** Name of cache directory.  */
 | 
			
		||||
        const val PARAMETER_CACHE_DIRECTORY = "chapter_disk_cache"
 | 
			
		||||
@@ -36,19 +39,27 @@ class ChapterCache(private val context: Context) {
 | 
			
		||||
 | 
			
		||||
        /** The number of values per cache entry. Must be positive.  */
 | 
			
		||||
        const val PARAMETER_VALUE_COUNT = 1
 | 
			
		||||
 | 
			
		||||
        /** The maximum number of bytes this cache should use to store.  */
 | 
			
		||||
        const val PARAMETER_CACHE_SIZE = 75L * 1024 * 1024
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Google Json class used for parsing JSON files.  */
 | 
			
		||||
    private val gson: Gson by injectLazy()
 | 
			
		||||
 | 
			
		||||
    // --> EH
 | 
			
		||||
    private val prefs: PreferencesHelper by injectLazy()
 | 
			
		||||
    // <-- EH
 | 
			
		||||
 | 
			
		||||
    /** Cache class used for cache management.  */
 | 
			
		||||
    private val diskCache = DiskLruCache.open(File(context.cacheDir, PARAMETER_CACHE_DIRECTORY),
 | 
			
		||||
            PARAMETER_APP_VERSION,
 | 
			
		||||
            PARAMETER_VALUE_COUNT,
 | 
			
		||||
            PARAMETER_CACHE_SIZE)
 | 
			
		||||
    // --> EH
 | 
			
		||||
    private var diskCache = setupDiskCache(prefs.eh_cacheSize().getOrDefault().toLong())
 | 
			
		||||
    init {
 | 
			
		||||
        prefs.eh_cacheSize().asObservable().subscribe {
 | 
			
		||||
            // Save old cache for destruction later
 | 
			
		||||
            val oldCache = diskCache
 | 
			
		||||
            diskCache = setupDiskCache(it.toLong())
 | 
			
		||||
            oldCache.close()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    // <-- EH
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns directory of cache.
 | 
			
		||||
@@ -68,6 +79,16 @@ class ChapterCache(private val context: Context) {
 | 
			
		||||
    val readableSize: String
 | 
			
		||||
        get() = Formatter.formatFileSize(context, realSize)
 | 
			
		||||
 | 
			
		||||
    // --> EH
 | 
			
		||||
    // Cache size is in MB
 | 
			
		||||
    private fun setupDiskCache(cacheSize: Long): DiskLruCache {
 | 
			
		||||
        return DiskLruCache.open(File(context.cacheDir, PARAMETER_CACHE_DIRECTORY),
 | 
			
		||||
            PARAMETER_APP_VERSION,
 | 
			
		||||
            PARAMETER_VALUE_COUNT,
 | 
			
		||||
            cacheSize * 1024 * 1024)
 | 
			
		||||
    }
 | 
			
		||||
    // <-- EH
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Remove file from cache.
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
@@ -174,4 +174,6 @@ object PreferenceKeys {
 | 
			
		||||
    const val eh_readerInstantRetry = "eh_reader_instant_retry"
 | 
			
		||||
 | 
			
		||||
    const val eh_utilAutoscrollInterval = "eh_util_autoscroll_interval"
 | 
			
		||||
 | 
			
		||||
    const val eh_cacheSize = "eh_cache_size"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -245,4 +245,6 @@ class PreferencesHelper(val context: Context) {
 | 
			
		||||
    fun eh_readerInstantRetry() = rxPrefs.getBoolean(Keys.eh_readerInstantRetry, true)
 | 
			
		||||
 | 
			
		||||
    fun eh_utilAutoscrollInterval() = rxPrefs.getFloat(Keys.eh_utilAutoscrollInterval, 3f)
 | 
			
		||||
 | 
			
		||||
    fun eh_cacheSize() = rxPrefs.getString(Keys.eh_utilAutoscrollInterval, "75")
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,7 @@ import android.view.animation.Animation
 | 
			
		||||
import android.view.animation.AnimationUtils
 | 
			
		||||
import android.widget.SeekBar
 | 
			
		||||
import com.afollestad.materialdialogs.MaterialDialog
 | 
			
		||||
import com.hippo.unifile.UniFile
 | 
			
		||||
import com.jakewharton.rxbinding.view.clicks
 | 
			
		||||
import com.jakewharton.rxbinding.widget.checkedChanges
 | 
			
		||||
import com.jakewharton.rxbinding.widget.textChanges
 | 
			
		||||
@@ -206,23 +207,35 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
 | 
			
		||||
        subscriptions += eh_retry_all.clicks().subscribe {
 | 
			
		||||
            var retried = 0
 | 
			
		||||
 | 
			
		||||
            viewer?.pages?.forEachIndexed { index, page ->
 | 
			
		||||
                if(page.status == Page.ERROR)
 | 
			
		||||
                    page.status = Page.QUEUE
 | 
			
		||||
                else
 | 
			
		||||
                    return@forEachIndexed
 | 
			
		||||
            viewer?.chapters
 | 
			
		||||
                    ?.flatMap { it.pages ?: emptyList() }
 | 
			
		||||
                    ?.forEachIndexed { index, page ->
 | 
			
		||||
                        var shouldQueuePage = false
 | 
			
		||||
                        if(page.status == Page.ERROR) {
 | 
			
		||||
                            shouldQueuePage = true
 | 
			
		||||
                        } else if (page.uri == null) {
 | 
			
		||||
                            shouldQueuePage = true
 | 
			
		||||
                        } else if (!UniFile.fromUri(this, page.uri).exists()) {
 | 
			
		||||
                            shouldQueuePage = true
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                //If we are using EHentai/ExHentai, get a new image URL
 | 
			
		||||
                if(presenter.source is EHentai)
 | 
			
		||||
                    page.imageUrl = null
 | 
			
		||||
                        if(shouldQueuePage) {
 | 
			
		||||
                            page.status = Page.QUEUE
 | 
			
		||||
                        } else {
 | 
			
		||||
                            return@forEachIndexed
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                if(viewer?.currentPage == index)
 | 
			
		||||
                    presenter.loader.loadPriorizedPage(page)
 | 
			
		||||
                else
 | 
			
		||||
                    presenter.loader.loadPage(page)
 | 
			
		||||
                        //If we are using EHentai/ExHentai, get a new image URL
 | 
			
		||||
                        if(presenter.source is EHentai)
 | 
			
		||||
                            page.imageUrl = null
 | 
			
		||||
 | 
			
		||||
                retried++
 | 
			
		||||
            }
 | 
			
		||||
                        if(viewer?.currentPage == index)
 | 
			
		||||
                            presenter.loader.loadPriorizedPage(page)
 | 
			
		||||
                        else
 | 
			
		||||
                            presenter.loader.loadPage(page)
 | 
			
		||||
 | 
			
		||||
                        retried++
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
            toast("Retrying $retried failed pages...")
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -34,7 +34,7 @@ abstract class BaseReader : Fragment() {
 | 
			
		||||
    /**
 | 
			
		||||
     * List of chapters added in the reader.
 | 
			
		||||
     */
 | 
			
		||||
    private val chapters = ArrayList<ReaderChapter>()
 | 
			
		||||
    val chapters = ArrayList<ReaderChapter>()
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * List of pages added in the reader. It can contain pages from more than one chapter.
 | 
			
		||||
 
 | 
			
		||||
@@ -99,6 +99,48 @@ class SettingsReaderController : SettingsController() {
 | 
			
		||||
            summary = "Normally, pressing the retry button on a failed download will wait until the downloader has finished downloading the last page before beginning to re-download the failed page. Enabling this will force the downloader to begin re-downloading the failed page as soon as you press the retry button."
 | 
			
		||||
            defaultValue = true
 | 
			
		||||
        }
 | 
			
		||||
        listPreference {
 | 
			
		||||
            key = Keys.eh_cacheSize
 | 
			
		||||
            title = "Reader cache size"
 | 
			
		||||
            entryValues = arrayOf(
 | 
			
		||||
                    "50",
 | 
			
		||||
                    "75",
 | 
			
		||||
                    "100",
 | 
			
		||||
                    "150",
 | 
			
		||||
                    "250",
 | 
			
		||||
                    "500",
 | 
			
		||||
                    "750",
 | 
			
		||||
                    "1000",
 | 
			
		||||
                    "1500",
 | 
			
		||||
                    "2000",
 | 
			
		||||
                    "2500",
 | 
			
		||||
                    "3000",
 | 
			
		||||
                    "3500",
 | 
			
		||||
                    "4000",
 | 
			
		||||
                    "4500",
 | 
			
		||||
                    "5000"
 | 
			
		||||
            )
 | 
			
		||||
            entries = arrayOf(
 | 
			
		||||
                    "50 MB",
 | 
			
		||||
                    "75 MB",
 | 
			
		||||
                    "100 MB",
 | 
			
		||||
                    "150 MB",
 | 
			
		||||
                    "250 MB",
 | 
			
		||||
                    "500 MB",
 | 
			
		||||
                    "750 MB",
 | 
			
		||||
                    "1 GB",
 | 
			
		||||
                    "1.5 GB",
 | 
			
		||||
                    "2 GB",
 | 
			
		||||
                    "2.5 GB",
 | 
			
		||||
                    "3 GB",
 | 
			
		||||
                    "3.5 GB",
 | 
			
		||||
                    "4 GB",
 | 
			
		||||
                    "4.5 GB",
 | 
			
		||||
                    "5 GB"
 | 
			
		||||
            )
 | 
			
		||||
            defaultValue = "75"
 | 
			
		||||
            summary = "The amount of images to save on device while reading. Higher values will result in a smoother reading experience, at the cost of higher disk space usage"
 | 
			
		||||
        }
 | 
			
		||||
        preferenceCategory {
 | 
			
		||||
            titleRes = R.string.pager_viewer
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user