From 1261a6790d7a9a529dd006d8bff5ad77babc3f81 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Fri, 9 Dec 2022 18:24:55 +0200 Subject: [PATCH] Improve pages cache creation --- .../koitharu/kotatsu/local/data/PagesCache.kt | 19 ++++++++++++++++--- .../org/koitharu/kotatsu/utils/ext/FileExt.kt | 4 +++- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/PagesCache.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/PagesCache.kt index f8321b597..e78628f9d 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/PagesCache.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/PagesCache.kt @@ -10,6 +10,7 @@ import org.koitharu.kotatsu.utils.ext.copyToSuspending import org.koitharu.kotatsu.utils.ext.longHashCode import org.koitharu.kotatsu.utils.ext.subdir import org.koitharu.kotatsu.utils.ext.takeIfReadable +import org.koitharu.kotatsu.utils.ext.takeIfWriteable import java.io.File import java.io.InputStream import javax.inject.Inject @@ -18,9 +19,14 @@ import javax.inject.Singleton @Singleton class PagesCache @Inject constructor(@ApplicationContext context: Context) { - private val cacheDir = context.externalCacheDir ?: context.cacheDir + private val cacheDir = checkNotNull(findSuitableDir(context)) { + val dirs = (context.externalCacheDirs + context.cacheDir).joinToString(";") { + it.absolutePath + } + "Cannot find any suitable directory for PagesCache: [$dirs]" + } private val lruCache = createDiskLruCacheSafe( - dir = cacheDir.subdir(CacheDir.PAGES.dir), + dir = cacheDir, size = FileSize.MEGABYTES.convert(200, FileSize.BYTES), ) @@ -29,7 +35,7 @@ class PagesCache @Inject constructor(@ApplicationContext context: Context) { } suspend fun put(url: String, inputStream: InputStream): File = withContext(Dispatchers.IO) { - val file = File(cacheDir, url.longHashCode().toString()) + val file = File(cacheDir.parentFile, url.longHashCode().toString()) try { file.outputStream().use { out -> inputStream.copyToSuspending(out) @@ -50,3 +56,10 @@ private fun createDiskLruCacheSafe(dir: File, size: Long): DiskLruCache { DiskLruCache.create(dir, size) } } + +private fun findSuitableDir(context: Context): File? { + val dirs = context.externalCacheDirs + context.cacheDir + return dirs.firstNotNullOfOrNull { + it.subdir(CacheDir.PAGES.dir).takeIfWriteable() + } +} diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/FileExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/FileExt.kt index cab41519f..c40f4e01c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/FileExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/FileExt.kt @@ -23,6 +23,8 @@ fun File.subdir(name: String) = File(this, name).also { fun File.takeIfReadable() = takeIf { it.exists() && it.canRead() } +fun File.takeIfWriteable() = takeIf { it.exists() && it.canWrite() } + fun ZipFile.readText(entry: ZipEntry) = getInputStream(entry).bufferedReader().use { it.readText() } @@ -74,4 +76,4 @@ private fun computeSizeInternal(file: File): Long { } else { return file.length() } -} \ No newline at end of file +}