From 356b7c346aba9dd0fafbb089c56de11ac50d1065 Mon Sep 17 00:00:00 2001 From: arkon Date: Sun, 18 Apr 2021 11:03:55 -0400 Subject: [PATCH] Clean up ChapterCache (remove Gson, Rx usage) --- .../tachiyomi/data/cache/ChapterCache.kt | 83 ++++++++++--------- .../ui/reader/loader/HttpPageLoader.kt | 3 +- .../ui/setting/SettingsAdvancedController.kt | 34 +++----- 3 files changed, 58 insertions(+), 62 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/cache/ChapterCache.kt b/app/src/main/java/eu/kanade/tachiyomi/data/cache/ChapterCache.kt index fab8a2b31f..a6227bf7d5 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/cache/ChapterCache.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/cache/ChapterCache.kt @@ -2,17 +2,17 @@ package eu.kanade.tachiyomi.data.cache import android.content.Context import android.text.format.Formatter -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.source.model.Page import eu.kanade.tachiyomi.util.storage.DiskUtil import eu.kanade.tachiyomi.util.storage.saveTo +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json import okhttp3.Response import okio.buffer import okio.sink -import rx.Observable import uy.kohesive.injekt.injectLazy import java.io.File import java.io.IOException @@ -42,8 +42,7 @@ class ChapterCache(private val context: Context) { const val PARAMETER_CACHE_SIZE = 100L * 1024 * 1024 } - /** Google Json class used for parsing JSON files. */ - private val gson: Gson by injectLazy() + private val json: Json by injectLazy() /** Cache class used for cache management. */ private val diskCache = DiskLruCache.open( @@ -56,7 +55,7 @@ class ChapterCache(private val context: Context) { /** * Returns directory of cache. */ - val cacheDir: File + private val cacheDir: File get() = diskCache.directory /** @@ -71,43 +70,19 @@ class ChapterCache(private val context: Context) { val readableSize: String get() = Formatter.formatFileSize(context, realSize) - /** - * Remove file from cache. - * - * @param file name of file "md5.0". - * @return status of deletion for the file. - */ - fun removeFileFromCache(file: String): Boolean { - // Make sure we don't delete the journal file (keeps track of cache). - if (file == "journal" || file.startsWith("journal.")) { - return false - } - - return try { - // Remove the extension from the file to get the key of the cache - val key = file.substringBeforeLast(".") - // Remove file from cache. - diskCache.remove(key) - } catch (e: Exception) { - false - } - } - /** * Get page list from cache. * * @param chapter the chapter. - * @return an observable of the list of pages. + * @return the list of pages. */ - fun getPageListFromCache(chapter: Chapter): Observable> { - return Observable.fromCallable { - // Get the key for the chapter. - val key = DiskUtil.hashKeyForDisk(getKey(chapter)) + fun getPageListFromCache(chapter: Chapter): List { + // Get the key for the chapter. + val key = DiskUtil.hashKeyForDisk(getKey(chapter)) - // Convert JSON string to list of objects. Throws an exception if snapshot is null - diskCache.get(key).use { - gson.fromJson>(it.getString(0)) - } + // Convert JSON string to list of objects. Throws an exception if snapshot is null + return diskCache.get(key).use { + json.decodeFromString(it.getString(0)) } } @@ -119,7 +94,7 @@ class ChapterCache(private val context: Context) { */ fun putPageListToCache(chapter: Chapter, pages: List) { // Convert list of pages to json string. - val cachedValue = gson.toJson(pages) + val cachedValue = json.encodeToString(pages) // Initialize the editor (edits the values for an entry). var editor: DiskLruCache.Editor? = null @@ -199,6 +174,38 @@ class ChapterCache(private val context: Context) { } } + fun clear(): Int { + var deletedFiles = 0 + cacheDir.listFiles()?.forEach { + if (removeFileFromCache(it.name)) { + deletedFiles++ + } + } + return deletedFiles + } + + /** + * Remove file from cache. + * + * @param file name of file "md5.0". + * @return status of deletion for the file. + */ + private fun removeFileFromCache(file: String): Boolean { + // Make sure we don't delete the journal file (keeps track of cache). + if (file == "journal" || file.startsWith("journal.")) { + return false + } + + return try { + // Remove the extension from the file to get the key of the cache + val key = file.substringBeforeLast(".") + // Remove file from cache. + diskCache.remove(key) + } catch (e: Exception) { + false + } + } + private fun getKey(chapter: Chapter): String { return "${chapter.manga_id}${chapter.url}" } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/HttpPageLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/HttpPageLoader.kt index 81481a2668..cdbe67d7a1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/HttpPageLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/HttpPageLoader.kt @@ -85,8 +85,7 @@ class HttpPageLoader( * the local cache, otherwise fallbacks to network. */ override fun getPages(): Observable> { - return chapterCache - .getPageListFromCache(chapter.chapter) + return Observable.fromCallable { chapterCache.getPageListFromCache(chapter.chapter) } .onErrorResumeNext { source.fetchPageList(chapter.chapter) } .map { pages -> pages.mapIndexed { index, page -> diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt index 3012b447bc..47bb095a1b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt @@ -21,6 +21,8 @@ import eu.kanade.tachiyomi.network.PREF_DOH_CLOUDFLARE import eu.kanade.tachiyomi.network.PREF_DOH_GOOGLE import eu.kanade.tachiyomi.ui.base.controller.DialogController import eu.kanade.tachiyomi.util.CrashLogUtil +import eu.kanade.tachiyomi.util.lang.launchIO +import eu.kanade.tachiyomi.util.lang.withUIContext import eu.kanade.tachiyomi.util.preference.defaultValue import eu.kanade.tachiyomi.util.preference.intListPreference import eu.kanade.tachiyomi.util.preference.onChange @@ -32,9 +34,6 @@ import eu.kanade.tachiyomi.util.preference.switchPreference import eu.kanade.tachiyomi.util.preference.titleRes import eu.kanade.tachiyomi.util.system.powerManager import eu.kanade.tachiyomi.util.system.toast -import rx.Observable -import rx.android.schedulers.AndroidSchedulers -import rx.schedulers.Schedulers import uy.kohesive.injekt.injectLazy import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys @@ -172,27 +171,18 @@ class SettingsAdvancedController : SettingsController() { private fun clearChapterCache() { if (activity == null) return - val files = chapterCache.cacheDir.listFiles() ?: return - - var deletedFiles = 0 - - Observable.defer { Observable.from(files) } - .doOnNext { file -> - if (chapterCache.removeFileFromCache(file.name)) { - deletedFiles++ + launchIO { + try { + val deletedFiles = chapterCache.clear() + withUIContext { + activity?.toast(resources?.getString(R.string.cache_deleted, deletedFiles)) + findPreference(CLEAR_CACHE_KEY)?.summary = + resources?.getString(R.string.used_cache, chapterCache.readableSize) } + } catch (e: Throwable) { + withUIContext { activity?.toast(R.string.cache_delete_error) } } - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .doOnError { - activity?.toast(R.string.cache_delete_error) - } - .doOnCompleted { - activity?.toast(resources?.getString(R.string.cache_deleted, deletedFiles)) - findPreference(CLEAR_CACHE_KEY)?.summary = - resources?.getString(R.string.used_cache, chapterCache.readableSize) - } - .subscribe() + } } class ClearDatabaseDialogController : DialogController() {