From 3c0c4ce9c0b97948d683ee31d207b6fbb639ee60 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 26 Feb 2022 14:11:46 +0200 Subject: [PATCH] Fix local manga size --- .../org/koitharu/kotatsu/core/ui/uiModule.kt | 6 ++++- .../kotatsu/local/data/LocalStorageManager.kt | 7 ++++-- .../settings/HistorySettingsFragment.kt | 19 ++++++--------- .../org/koitharu/kotatsu/utils/ext/FileExt.kt | 24 ++++++++++++------- app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/pref_history.xml | 4 ++++ 6 files changed, 38 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/core/ui/uiModule.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/uiModule.kt index 148fa409d..060e748ac 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/ui/uiModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/ui/uiModule.kt @@ -2,6 +2,7 @@ package org.koitharu.kotatsu.core.ui import coil.ComponentRegistry import coil.ImageLoader +import coil.util.CoilUtils import okhttp3.OkHttpClient import org.koin.android.ext.koin.androidContext import org.koin.dsl.module @@ -11,8 +12,11 @@ import org.koitharu.kotatsu.local.data.CbzFetcher val uiModule get() = module { single { + val httpClient = get().newBuilder() + .cache(CoilUtils.createDefaultCache(androidContext())) + .build() ImageLoader.Builder(androidContext()) - .okHttpClient(get()) + .okHttpClient(httpClient) .componentRegistry( ComponentRegistry.Builder() .add(CbzFetcher()) diff --git a/app/src/main/java/org/koitharu/kotatsu/local/data/LocalStorageManager.kt b/app/src/main/java/org/koitharu/kotatsu/local/data/LocalStorageManager.kt index 813dfba4f..2cbddf856 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/data/LocalStorageManager.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/data/LocalStorageManager.kt @@ -6,6 +6,7 @@ import android.os.StatFs import androidx.annotation.WorkerThread import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runInterruptible +import kotlinx.coroutines.withContext import okhttp3.Cache import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.utils.ext.computeSize @@ -32,7 +33,7 @@ class LocalStorageManager( return Cache(directory, maxSize) } - suspend fun computeCacheSize(cache: CacheDir) = runInterruptible(Dispatchers.IO) { + suspend fun computeCacheSize(cache: CacheDir) = withContext(Dispatchers.IO) { getCacheDirs(cache.dir).sumOf { it.computeSize() } } @@ -86,7 +87,9 @@ class LocalStorageManager( private fun getCacheDirs(subDir: String): MutableSet { val result = LinkedHashSet() result += File(context.cacheDir, subDir) - result += context.getExternalFilesDirs(subDir) + context.externalCacheDirs.mapTo(result) { + File(it, subDir) + } return result } diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt index 1ad2af3fd..1ff363c35 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt @@ -32,18 +32,8 @@ class HistorySettingsFragment : BasePreferenceFragment(R.string.history_and_cach override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - findPreference(AppSettings.KEY_PAGES_CACHE_CLEAR)?.let { pref -> - viewLifecycleScope.launchWhenResumed { - val size = storageManager.computeCacheSize(CacheDir.PAGES) - pref.summary = FileSize.BYTES.format(pref.context, size) - } - } - findPreference(AppSettings.KEY_THUMBS_CACHE_CLEAR)?.let { pref -> - viewLifecycleScope.launchWhenResumed { - val size = storageManager.computeCacheSize(CacheDir.THUMBS) - pref.summary = FileSize.BYTES.format(pref.context, size) - } - } + findPreference(AppSettings.KEY_PAGES_CACHE_CLEAR)?.bindSummaryToCacheSize(CacheDir.PAGES) + findPreference(AppSettings.KEY_THUMBS_CACHE_CLEAR)?.bindSummaryToCacheSize(CacheDir.THUMBS) findPreference(AppSettings.KEY_SEARCH_HISTORY_CLEAR)?.let { pref -> viewLifecycleScope.launchWhenResumed { val items = searchRepository.getSearchHistoryCount() @@ -111,6 +101,11 @@ class HistorySettingsFragment : BasePreferenceFragment(R.string.history_and_cach } } + private fun Preference.bindSummaryToCacheSize(dir: CacheDir) = viewLifecycleScope.launch { + val size = storageManager.computeCacheSize(dir) + summary = FileSize.BYTES.format(context, size) + } + private fun clearSearchHistory(preference: Preference) { MaterialAlertDialogBuilder(context ?: return) .setTitle(R.string.clear_search_history) 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 db6fd0f4f..cab41519f 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 @@ -7,8 +7,10 @@ import android.os.Build import android.os.Environment import android.os.storage.StorageManager import android.provider.OpenableColumns +import androidx.annotation.WorkerThread import androidx.core.database.getStringOrNull import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.runInterruptible import kotlinx.coroutines.withContext import org.koitharu.kotatsu.R import java.io.File @@ -25,14 +27,6 @@ fun ZipFile.readText(entry: ZipEntry) = getInputStream(entry).bufferedReader().u it.readText() } -fun File.computeSize(): Long = listFiles()?.sumOf { x -> - if (x.isDirectory) { - x.computeSize() - } else { - x.length() - } -} ?: 0L - fun File.getStorageName(context: Context): String = runCatching { val manager = context.getSystemService(Context.STORAGE_SERVICE) as StorageManager if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { @@ -66,4 +60,18 @@ fun ContentResolver.resolveName(uri: Uri): String? { } } return fallback +} + +suspend fun File.computeSize(): Long = runInterruptible(Dispatchers.IO) { + computeSizeInternal(this) +} + +@WorkerThread +private fun computeSizeInternal(file: File): Long { + if (file.isDirectory) { + val files = file.listFiles() ?: return 0L + return files.sumOf { computeSizeInternal(it) } + } else { + return file.length() + } } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1131b5655..d053d90d6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -16,6 +16,7 @@ Settings Remote sources Loading… + Computing… Chapter %1$d of %2$d Close Try again diff --git a/app/src/main/res/xml/pref_history.xml b/app/src/main/res/xml/pref_history.xml index bde082b45..50061d04a 100644 --- a/app/src/main/res/xml/pref_history.xml +++ b/app/src/main/res/xml/pref_history.xml @@ -6,12 +6,14 @@ @@ -27,12 +29,14 @@