Fix local manga size

This commit is contained in:
Koitharu
2022-02-26 14:11:46 +02:00
parent ed4c470bdc
commit 3c0c4ce9c0
6 changed files with 38 additions and 23 deletions

View File

@@ -2,6 +2,7 @@ package org.koitharu.kotatsu.core.ui
import coil.ComponentRegistry import coil.ComponentRegistry
import coil.ImageLoader import coil.ImageLoader
import coil.util.CoilUtils
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import org.koin.android.ext.koin.androidContext import org.koin.android.ext.koin.androidContext
import org.koin.dsl.module import org.koin.dsl.module
@@ -11,8 +12,11 @@ import org.koitharu.kotatsu.local.data.CbzFetcher
val uiModule val uiModule
get() = module { get() = module {
single { single {
val httpClient = get<OkHttpClient>().newBuilder()
.cache(CoilUtils.createDefaultCache(androidContext()))
.build()
ImageLoader.Builder(androidContext()) ImageLoader.Builder(androidContext())
.okHttpClient(get<OkHttpClient>()) .okHttpClient(httpClient)
.componentRegistry( .componentRegistry(
ComponentRegistry.Builder() ComponentRegistry.Builder()
.add(CbzFetcher()) .add(CbzFetcher())

View File

@@ -6,6 +6,7 @@ import android.os.StatFs
import androidx.annotation.WorkerThread import androidx.annotation.WorkerThread
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runInterruptible import kotlinx.coroutines.runInterruptible
import kotlinx.coroutines.withContext
import okhttp3.Cache import okhttp3.Cache
import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.AppSettings
import org.koitharu.kotatsu.utils.ext.computeSize import org.koitharu.kotatsu.utils.ext.computeSize
@@ -32,7 +33,7 @@ class LocalStorageManager(
return Cache(directory, maxSize) 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() } getCacheDirs(cache.dir).sumOf { it.computeSize() }
} }
@@ -86,7 +87,9 @@ class LocalStorageManager(
private fun getCacheDirs(subDir: String): MutableSet<File> { private fun getCacheDirs(subDir: String): MutableSet<File> {
val result = LinkedHashSet<File>() val result = LinkedHashSet<File>()
result += File(context.cacheDir, subDir) result += File(context.cacheDir, subDir)
result += context.getExternalFilesDirs(subDir) context.externalCacheDirs.mapTo(result) {
File(it, subDir)
}
return result return result
} }

View File

@@ -32,18 +32,8 @@ class HistorySettingsFragment : BasePreferenceFragment(R.string.history_and_cach
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
findPreference<Preference>(AppSettings.KEY_PAGES_CACHE_CLEAR)?.let { pref -> findPreference<Preference>(AppSettings.KEY_PAGES_CACHE_CLEAR)?.bindSummaryToCacheSize(CacheDir.PAGES)
viewLifecycleScope.launchWhenResumed { findPreference<Preference>(AppSettings.KEY_THUMBS_CACHE_CLEAR)?.bindSummaryToCacheSize(CacheDir.THUMBS)
val size = storageManager.computeCacheSize(CacheDir.PAGES)
pref.summary = FileSize.BYTES.format(pref.context, size)
}
}
findPreference<Preference>(AppSettings.KEY_THUMBS_CACHE_CLEAR)?.let { pref ->
viewLifecycleScope.launchWhenResumed {
val size = storageManager.computeCacheSize(CacheDir.THUMBS)
pref.summary = FileSize.BYTES.format(pref.context, size)
}
}
findPreference<Preference>(AppSettings.KEY_SEARCH_HISTORY_CLEAR)?.let { pref -> findPreference<Preference>(AppSettings.KEY_SEARCH_HISTORY_CLEAR)?.let { pref ->
viewLifecycleScope.launchWhenResumed { viewLifecycleScope.launchWhenResumed {
val items = searchRepository.getSearchHistoryCount() 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) { private fun clearSearchHistory(preference: Preference) {
MaterialAlertDialogBuilder(context ?: return) MaterialAlertDialogBuilder(context ?: return)
.setTitle(R.string.clear_search_history) .setTitle(R.string.clear_search_history)

View File

@@ -7,8 +7,10 @@ import android.os.Build
import android.os.Environment import android.os.Environment
import android.os.storage.StorageManager import android.os.storage.StorageManager
import android.provider.OpenableColumns import android.provider.OpenableColumns
import androidx.annotation.WorkerThread
import androidx.core.database.getStringOrNull import androidx.core.database.getStringOrNull
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runInterruptible
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
import java.io.File import java.io.File
@@ -25,14 +27,6 @@ fun ZipFile.readText(entry: ZipEntry) = getInputStream(entry).bufferedReader().u
it.readText() 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 { fun File.getStorageName(context: Context): String = runCatching {
val manager = context.getSystemService(Context.STORAGE_SERVICE) as StorageManager val manager = context.getSystemService(Context.STORAGE_SERVICE) as StorageManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
@@ -66,4 +60,18 @@ fun ContentResolver.resolveName(uri: Uri): String? {
} }
} }
return fallback 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()
}
} }

View File

@@ -16,6 +16,7 @@
<string name="settings">Settings</string> <string name="settings">Settings</string>
<string name="remote_sources">Remote sources</string> <string name="remote_sources">Remote sources</string>
<string name="loading_">Loading…</string> <string name="loading_">Loading…</string>
<string name="computing_">Computing…</string>
<string name="chapter_d_of_d">Chapter %1$d of %2$d</string> <string name="chapter_d_of_d">Chapter %1$d of %2$d</string>
<string name="close">Close</string> <string name="close">Close</string>
<string name="try_again">Try again</string> <string name="try_again">Try again</string>

View File

@@ -6,12 +6,14 @@
<Preference <Preference
android:key="search_history_clear" android:key="search_history_clear"
android:persistent="false" android:persistent="false"
android:summary="@string/loading_"
android:title="@string/clear_search_history" android:title="@string/clear_search_history"
app:iconSpaceReserved="false" /> app:iconSpaceReserved="false" />
<Preference <Preference
android:key="updates_feed_clear" android:key="updates_feed_clear"
android:persistent="false" android:persistent="false"
android:summary="@string/loading_"
android:title="@string/clear_updates_feed" android:title="@string/clear_updates_feed"
app:iconSpaceReserved="false" /> app:iconSpaceReserved="false" />
@@ -27,12 +29,14 @@
<Preference <Preference
android:key="thumbs_cache_clear" android:key="thumbs_cache_clear"
android:persistent="false" android:persistent="false"
android:summary="@string/computing_"
android:title="@string/clear_thumbs_cache" android:title="@string/clear_thumbs_cache"
app:iconSpaceReserved="false" /> app:iconSpaceReserved="false" />
<Preference <Preference
android:key="pages_cache_clear" android:key="pages_cache_clear"
android:persistent="false" android:persistent="false"
android:summary="@string/computing_"
android:title="@string/clear_pages_cache" android:title="@string/clear_pages_cache"
app:iconSpaceReserved="false" /> app:iconSpaceReserved="false" />