From 661ad61bae43560cc76764a89d7b76b6a1f4ff84 Mon Sep 17 00:00:00 2001 From: tristancorbellari Date: Sun, 7 Jan 2024 23:55:52 +0200 Subject: [PATCH 1/4] Added ability for user to change chapter cache size --- .../presentation/more/settings/Preference.kt | 1 + .../presentation/more/settings/PreferenceItem.kt | 1 + .../more/settings/screen/SettingsDataScreen.kt | 15 +++++++++++++++ .../kanade/tachiyomi/data/cache/ChapterCache.kt | 16 ++++++++++++---- .../domain/library/service/LibraryPreferences.kt | 5 +++++ .../src/commonMain/resources/MR/base/strings.xml | 2 ++ .../core/components/SettingsItems.kt | 3 ++- 7 files changed, 38 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/Preference.kt b/app/src/main/java/eu/kanade/presentation/more/settings/Preference.kt index fd8d12067c..b67595aae5 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/Preference.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/Preference.kt @@ -51,6 +51,7 @@ sealed class Preference { val value: Int, val min: Int = 0, val max: Int, + val steps: Int = 0, override val title: String = "", override val subtitle: String? = null, override val icon: ImageVector? = null, diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceItem.kt b/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceItem.kt index b22e69323a..b6035f96ae 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceItem.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/PreferenceItem.kt @@ -83,6 +83,7 @@ internal fun PreferenceItem( label = item.title, min = item.min, max = item.max, + steps = item.steps, value = item.value, valueText = item.subtitle.takeUnless { it.isNullOrEmpty() } ?: item.value.toString(), onChange = { diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt index 43d24510c8..1076b13284 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt @@ -252,9 +252,12 @@ object SettingsDataScreen : SearchableSettings { val scope = rememberCoroutineScope() val libraryPreferences = remember { Injekt.get() } + val chapterCacheSizePref = libraryPreferences.chapterCacheSize() + val chapterCache = remember { Injekt.get() } var cacheReadableSizeSema by remember { mutableIntStateOf(0) } val cacheReadableSize = remember(cacheReadableSizeSema) { chapterCache.readableSize } + val chapterCacheSize by chapterCacheSizePref.collectAsState() return Preference.PreferenceGroup( title = stringResource(MR.strings.pref_storage_usage), @@ -289,6 +292,18 @@ object SettingsDataScreen : SearchableSettings { } }, ), + Preference.PreferenceItem.SliderPreference( + value = chapterCacheSize, + title = stringResource(MR.strings.pref_chapter_cache_size), + subtitle = stringResource(MR.strings.chapter_cache_size, chapterCacheSize), + min = LibraryPreferences.CHAPTER_CACHE_SIZE_MIN, + max = LibraryPreferences.CHAPTER_CACHE_SIZE_MAX, + steps = 7, + onValueChanged = { + chapterCacheSizePref.set(it) + true + }, + ), Preference.PreferenceItem.SwitchPreference( pref = libraryPreferences.autoClearChapterCache(), title = stringResource(MR.strings.pref_auto_clear_chapter_cache), 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 56d6262c94..e6cf89f442 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 @@ -14,6 +14,9 @@ import okio.buffer import okio.sink import tachiyomi.core.util.system.logcat import tachiyomi.domain.chapter.model.Chapter +import tachiyomi.domain.library.service.LibraryPreferences +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get import java.io.File import java.io.IOException @@ -30,12 +33,14 @@ class ChapterCache( private val json: Json, ) { + val libraryPreferences = Injekt.get() + /** Cache class used for cache management. */ private val diskCache = DiskLruCache.open( File(context.cacheDir, "chapter_disk_cache"), PARAMETER_APP_VERSION, PARAMETER_VALUE_COUNT, - PARAMETER_CACHE_SIZE, + libraryPreferences.chapterCacheSize().get().toLong() * 1024 * 1024, ) /** @@ -160,7 +165,13 @@ class ChapterCache( } } + /** + * Clear all files from cache. + * + * @return number of files deleted. + */ fun clear(): Int { + diskCache.maxSize = libraryPreferences.chapterCacheSize().get().toLong() * 1024 * 1024 var deletedFiles = 0 cacheDir.listFiles()?.forEach { if (removeFileFromCache(it.name)) { @@ -203,6 +214,3 @@ private const val PARAMETER_APP_VERSION = 1 /** The number of values per cache entry. Must be positive. */ private const val PARAMETER_VALUE_COUNT = 1 - -/** The maximum number of bytes this cache should use to store. */ -private const val PARAMETER_CACHE_SIZE = 100L * 1024 * 1024 diff --git a/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt b/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt index 1a51fa6593..0c1b4db21c 100644 --- a/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt +++ b/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt @@ -190,6 +190,8 @@ class LibraryPreferences( ) } + fun chapterCacheSize() = preferenceStore.getInt("chapter_cache_size", 100) + fun autoClearChapterCache() = preferenceStore.getBoolean("auto_clear_chapter_cache", false) // endregion @@ -224,5 +226,8 @@ class LibraryPreferences( const val MANGA_HAS_UNREAD = "manga_fully_read" const val MANGA_NON_READ = "manga_started" const val MANGA_OUTSIDE_RELEASE_PERIOD = "manga_outside_release_period" + + const val CHAPTER_CACHE_SIZE_MIN = 100 + const val CHAPTER_CACHE_SIZE_MAX = 500 } } diff --git a/i18n/src/commonMain/resources/MR/base/strings.xml b/i18n/src/commonMain/resources/MR/base/strings.xml index 24b29f3031..f70eac3ec0 100644 --- a/i18n/src/commonMain/resources/MR/base/strings.xml +++ b/i18n/src/commonMain/resources/MR/base/strings.xml @@ -539,6 +539,8 @@ Used: %1$s Cache cleared, %1$d files deleted Error occurred while clearing + Chapter cache size + %1$s MB Clear chapter cache on app launch diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt index d29d44b88d..bcc551d72c 100644 --- a/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt @@ -161,6 +161,7 @@ fun SliderItem( onChange: (Int) -> Unit, max: Int, min: Int = 0, + steps: Int = 0, ) { val haptic = LocalHapticFeedback.current @@ -193,7 +194,7 @@ fun SliderItem( }, modifier = Modifier.weight(1.5f), valueRange = min.toFloat()..max.toFloat(), - steps = max - min, + steps = if (steps > 0) steps else max - min, ) } } From 9b35f31afa77d7d85f127b99ace436f9b99d387a Mon Sep 17 00:00:00 2001 From: tristancorbellari Date: Tue, 9 Jan 2024 09:39:31 +0200 Subject: [PATCH 2/4] Added null safety to 'steps' in Slider object --- .../java/eu/kanade/presentation/more/settings/Preference.kt | 2 +- .../tachiyomi/presentation/core/components/SettingsItems.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/Preference.kt b/app/src/main/java/eu/kanade/presentation/more/settings/Preference.kt index b67595aae5..6680a16e07 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/Preference.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/Preference.kt @@ -51,7 +51,7 @@ sealed class Preference { val value: Int, val min: Int = 0, val max: Int, - val steps: Int = 0, + val steps: Int? = null, override val title: String = "", override val subtitle: String? = null, override val icon: ImageVector? = null, diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt index bcc551d72c..1f994f1fd5 100644 --- a/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt @@ -161,7 +161,7 @@ fun SliderItem( onChange: (Int) -> Unit, max: Int, min: Int = 0, - steps: Int = 0, + steps: Int? = null, ) { val haptic = LocalHapticFeedback.current @@ -194,7 +194,7 @@ fun SliderItem( }, modifier = Modifier.weight(1.5f), valueRange = min.toFloat()..max.toFloat(), - steps = if (steps > 0) steps else max - min, + steps = steps ?: (max - min), ) } } From 62b73339931a299d73dd3c1357490382bfef3bff Mon Sep 17 00:00:00 2001 From: tristancorbellari Date: Tue, 9 Jan 2024 10:01:42 +0200 Subject: [PATCH 3/4] Pass library preferences to chapter cache via DI --- .../main/java/eu/kanade/tachiyomi/data/cache/ChapterCache.kt | 3 +-- app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt | 2 +- 2 files changed, 2 insertions(+), 3 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 e6cf89f442..eb03ac59ee 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 @@ -31,10 +31,9 @@ import java.io.IOException class ChapterCache( private val context: Context, private val json: Json, + var libraryPreferences: LibraryPreferences, ) { - val libraryPreferences = Injekt.get() - /** Cache class used for cache management. */ private val diskCache = DiskLruCache.open( File(context.cacheDir, "chapter_disk_cache"), diff --git a/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt b/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt index ef0f65fff1..56893052c5 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt @@ -114,7 +114,7 @@ class AppModule(val app: Application) : InjektModule { addSingletonFactory { UniFileTempFileManager(app) } - addSingletonFactory { ChapterCache(app, get()) } + addSingletonFactory { ChapterCache(app, get(), get()) } addSingletonFactory { CoverCache(app) } addSingletonFactory { NetworkHelper(app, get()) } From bc83abb1a48e77790b2037cc6a68eb363d6467a4 Mon Sep 17 00:00:00 2001 From: tristancorbellari Date: Tue, 9 Jan 2024 15:22:57 +0200 Subject: [PATCH 4/4] Displays info about clearing cache in settings --- .../presentation/more/settings/screen/SettingsDataScreen.kt | 1 + i18n/src/commonMain/resources/MR/base/strings.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt index 1076b13284..ce366b5aab 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsDataScreen.kt @@ -304,6 +304,7 @@ object SettingsDataScreen : SearchableSettings { true }, ), + Preference.PreferenceItem.InfoPreference(stringResource(MR.strings.chapter_cache_size_info)), Preference.PreferenceItem.SwitchPreference( pref = libraryPreferences.autoClearChapterCache(), title = stringResource(MR.strings.pref_auto_clear_chapter_cache), diff --git a/i18n/src/commonMain/resources/MR/base/strings.xml b/i18n/src/commonMain/resources/MR/base/strings.xml index eabebcd287..a276da8dde 100644 --- a/i18n/src/commonMain/resources/MR/base/strings.xml +++ b/i18n/src/commonMain/resources/MR/base/strings.xml @@ -536,6 +536,7 @@ Error occurred while clearing Chapter cache size %1$s MB + Changes will take effect upon app restart or clearing chapter cache. Clear chapter cache on app launch