diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 60a2ae8c0..1c0083fe7 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -209,7 +209,6 @@ dependencies { // Preferences implementation(libs.preferencektx) - implementation(libs.flowpreferences) // Model View Presenter implementation(libs.bundles.nucleus) diff --git a/app/src/main/java/eu/kanade/core/prefs/PreferenceMutableState.kt b/app/src/main/java/eu/kanade/core/prefs/PreferenceMutableState.kt index ba73475d6..4efd95539 100644 --- a/app/src/main/java/eu/kanade/core/prefs/PreferenceMutableState.kt +++ b/app/src/main/java/eu/kanade/core/prefs/PreferenceMutableState.kt @@ -2,9 +2,8 @@ package eu.kanade.core.prefs import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf -import com.fredporciuncula.flow.preferences.Preference +import eu.kanade.tachiyomi.core.preference.Preference import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -16,8 +15,7 @@ class PreferenceMutableState( private val state = mutableStateOf(preference.get()) init { - preference.asFlow() - .distinctUntilChanged() + preference.changes() .onEach { state.value = it } .launchIn(scope) } diff --git a/app/src/main/java/eu/kanade/domain/chapter/interactor/SetReadStatus.kt b/app/src/main/java/eu/kanade/domain/chapter/interactor/SetReadStatus.kt index 9cbe5b49c..6a8a2f440 100644 --- a/app/src/main/java/eu/kanade/domain/chapter/interactor/SetReadStatus.kt +++ b/app/src/main/java/eu/kanade/domain/chapter/interactor/SetReadStatus.kt @@ -56,7 +56,7 @@ class SetReadStatus( return@withContext Result.InternalError(e) } - if (read && preferences.removeAfterMarkedAsRead()) { + if (read && preferences.removeAfterMarkedAsRead().get()) { manga.forEach { deleteDownload.awaitAll( manga = it, diff --git a/app/src/main/java/eu/kanade/domain/extension/interactor/GetExtensionLanguages.kt b/app/src/main/java/eu/kanade/domain/extension/interactor/GetExtensionLanguages.kt index f906d4e3e..ff277f832 100644 --- a/app/src/main/java/eu/kanade/domain/extension/interactor/GetExtensionLanguages.kt +++ b/app/src/main/java/eu/kanade/domain/extension/interactor/GetExtensionLanguages.kt @@ -12,7 +12,7 @@ class GetExtensionLanguages( ) { fun subscribe(): Flow> { return combine( - preferences.enabledLanguages().asFlow(), + preferences.enabledLanguages().changes(), extensionManager.getAvailableExtensionsFlow(), ) { enabledLanguage, availableExtensions -> availableExtensions diff --git a/app/src/main/java/eu/kanade/domain/extension/interactor/GetExtensionSources.kt b/app/src/main/java/eu/kanade/domain/extension/interactor/GetExtensionSources.kt index a2acb4bed..b28de4a13 100644 --- a/app/src/main/java/eu/kanade/domain/extension/interactor/GetExtensionSources.kt +++ b/app/src/main/java/eu/kanade/domain/extension/interactor/GetExtensionSources.kt @@ -16,7 +16,7 @@ class GetExtensionSources( val isMultiLangSingleSource = isMultiSource && extension.sources.map { it.name }.distinct().size == 1 - return preferences.disabledSources().asFlow().map { disabledSources -> + return preferences.disabledSources().changes().map { disabledSources -> fun Source.isEnabled() = id.toString() !in disabledSources extension.sources diff --git a/app/src/main/java/eu/kanade/domain/extension/interactor/GetExtensionsByType.kt b/app/src/main/java/eu/kanade/domain/extension/interactor/GetExtensionsByType.kt index 2a9511008..8da1440c6 100644 --- a/app/src/main/java/eu/kanade/domain/extension/interactor/GetExtensionsByType.kt +++ b/app/src/main/java/eu/kanade/domain/extension/interactor/GetExtensionsByType.kt @@ -16,7 +16,7 @@ class GetExtensionsByType( val showNsfwSources = preferences.showNsfwSource().get() return combine( - preferences.enabledLanguages().asFlow(), + preferences.enabledLanguages().changes(), extensionManager.getInstalledExtensionsFlow(), extensionManager.getUntrustedExtensionsFlow(), extensionManager.getAvailableExtensionsFlow(), diff --git a/app/src/main/java/eu/kanade/domain/manga/interactor/GetSortTag.kt b/app/src/main/java/eu/kanade/domain/manga/interactor/GetSortTag.kt index 5d8caa491..b32363b6e 100644 --- a/app/src/main/java/eu/kanade/domain/manga/interactor/GetSortTag.kt +++ b/app/src/main/java/eu/kanade/domain/manga/interactor/GetSortTag.kt @@ -7,7 +7,7 @@ import kotlinx.coroutines.flow.map class GetSortTag(private val preferences: PreferencesHelper) { fun subscribe(): Flow> { - return preferences.sortTagsForLibrary().asFlow() + return preferences.sortTagsForLibrary().changes() .map(::mapSortTags) } diff --git a/app/src/main/java/eu/kanade/domain/source/interactor/GetEnabledSources.kt b/app/src/main/java/eu/kanade/domain/source/interactor/GetEnabledSources.kt index a38316d21..557279fc8 100644 --- a/app/src/main/java/eu/kanade/domain/source/interactor/GetEnabledSources.kt +++ b/app/src/main/java/eu/kanade/domain/source/interactor/GetEnabledSources.kt @@ -18,17 +18,17 @@ class GetEnabledSources( fun subscribe(): Flow> { return combine( - preferences.pinnedSources().asFlow(), + preferences.pinnedSources().changes(), combine( - preferences.enabledLanguages().asFlow(), - preferences.disabledSources().asFlow(), - preferences.lastUsedSource().asFlow(), + preferences.enabledLanguages().changes(), + preferences.disabledSources().changes(), + preferences.lastUsedSource().changes(), ) { a, b, c -> Triple(a, b, c) }, // SY --> combine( - preferences.dataSaverExcludedSources().asFlow(), - preferences.sourcesTabSourcesInCategories().asFlow(), - preferences.sourcesTabCategoriesFilter().asFlow(), + preferences.dataSaverExcludedSources().changes(), + preferences.sourcesTabSourcesInCategories().changes(), + preferences.sourcesTabCategoriesFilter().changes(), ) { a, b, c -> Triple(a, b, c) }, // SY <-- repository.getSources(), diff --git a/app/src/main/java/eu/kanade/domain/source/interactor/GetLanguagesWithSources.kt b/app/src/main/java/eu/kanade/domain/source/interactor/GetLanguagesWithSources.kt index fd4d6383a..6327de921 100644 --- a/app/src/main/java/eu/kanade/domain/source/interactor/GetLanguagesWithSources.kt +++ b/app/src/main/java/eu/kanade/domain/source/interactor/GetLanguagesWithSources.kt @@ -15,8 +15,8 @@ class GetLanguagesWithSources( fun subscribe(): Flow>> { return combine( - preferences.enabledLanguages().asFlow(), - preferences.disabledSources().asFlow(), + preferences.enabledLanguages().changes(), + preferences.disabledSources().changes(), repository.getOnlineSources(), ) { enabledLanguage, disabledSource, onlineSources -> val sortedSources = onlineSources.filterNot { it.id in BlacklistedSources.HIDDEN_SOURCES }.sortedWith( diff --git a/app/src/main/java/eu/kanade/domain/source/interactor/GetShowLatest.kt b/app/src/main/java/eu/kanade/domain/source/interactor/GetShowLatest.kt index c0d2178c6..5a2610ab3 100644 --- a/app/src/main/java/eu/kanade/domain/source/interactor/GetShowLatest.kt +++ b/app/src/main/java/eu/kanade/domain/source/interactor/GetShowLatest.kt @@ -10,7 +10,7 @@ class GetShowLatest( ) { fun subscribe(mode: SourcesController.Mode): Flow { - return preferences.useNewSourceNavigation().asFlow() + return preferences.useNewSourceNavigation().changes() .map { mode == SourcesController.Mode.CATALOGUE && !it } diff --git a/app/src/main/java/eu/kanade/domain/source/interactor/GetSourceCategories.kt b/app/src/main/java/eu/kanade/domain/source/interactor/GetSourceCategories.kt index 46d81a6c5..04796bec1 100644 --- a/app/src/main/java/eu/kanade/domain/source/interactor/GetSourceCategories.kt +++ b/app/src/main/java/eu/kanade/domain/source/interactor/GetSourceCategories.kt @@ -9,6 +9,6 @@ class GetSourceCategories( ) { fun subscribe(): Flow> { - return preferences.sourcesTabCategories().asFlow().map { it.sortedWith(String.CASE_INSENSITIVE_ORDER) } + return preferences.sourcesTabCategories().changes().map { it.sortedWith(String.CASE_INSENSITIVE_ORDER) } } } diff --git a/app/src/main/java/eu/kanade/domain/source/interactor/GetSourceRepos.kt b/app/src/main/java/eu/kanade/domain/source/interactor/GetSourceRepos.kt index e72fe85d4..cec16218b 100644 --- a/app/src/main/java/eu/kanade/domain/source/interactor/GetSourceRepos.kt +++ b/app/src/main/java/eu/kanade/domain/source/interactor/GetSourceRepos.kt @@ -7,6 +7,6 @@ import kotlinx.coroutines.flow.map class GetSourceRepos(private val preferences: PreferencesHelper) { fun subscribe(): Flow> { - return preferences.extensionRepos().asFlow().map { it.sortedWith(String.CASE_INSENSITIVE_ORDER) } + return preferences.extensionRepos().changes().map { it.sortedWith(String.CASE_INSENSITIVE_ORDER) } } } diff --git a/app/src/main/java/eu/kanade/domain/source/interactor/GetSourcesWithFavoriteCount.kt b/app/src/main/java/eu/kanade/domain/source/interactor/GetSourcesWithFavoriteCount.kt index 6af6bd4a8..c60bac7bd 100644 --- a/app/src/main/java/eu/kanade/domain/source/interactor/GetSourcesWithFavoriteCount.kt +++ b/app/src/main/java/eu/kanade/domain/source/interactor/GetSourcesWithFavoriteCount.kt @@ -16,8 +16,8 @@ class GetSourcesWithFavoriteCount( fun subscribe(): Flow>> { return combine( - preferences.migrationSortingDirection().asFlow(), - preferences.migrationSortingMode().asFlow(), + preferences.migrationSortingDirection().changes(), + preferences.migrationSortingMode().changes(), repository.getSourcesWithFavoriteCount(), ) { direction, mode, list -> list.sortedWith(sortFn(direction, mode)) diff --git a/app/src/main/java/eu/kanade/domain/source/interactor/ToggleLanguage.kt b/app/src/main/java/eu/kanade/domain/source/interactor/ToggleLanguage.kt index 508bc7335..846690c2a 100644 --- a/app/src/main/java/eu/kanade/domain/source/interactor/ToggleLanguage.kt +++ b/app/src/main/java/eu/kanade/domain/source/interactor/ToggleLanguage.kt @@ -1,5 +1,6 @@ package eu.kanade.domain.source.interactor +import eu.kanade.tachiyomi.core.preference.getAndSet import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.util.preference.minusAssign import eu.kanade.tachiyomi.util.preference.plusAssign @@ -9,11 +10,9 @@ class ToggleLanguage( ) { fun await(language: String) { - val enabled = language in preferences.enabledLanguages().get() - if (enabled) { - preferences.enabledLanguages() -= language - } else { - preferences.enabledLanguages() += language + val isEnabled = language in preferences.enabledLanguages().get() + preferences.enabledLanguages().getAndSet { enabled -> + if (isEnabled) enabled.minus(language) else enabled.plus(language) } } } diff --git a/app/src/main/java/eu/kanade/domain/source/interactor/ToggleSource.kt b/app/src/main/java/eu/kanade/domain/source/interactor/ToggleSource.kt index 585d20b99..841620667 100644 --- a/app/src/main/java/eu/kanade/domain/source/interactor/ToggleSource.kt +++ b/app/src/main/java/eu/kanade/domain/source/interactor/ToggleSource.kt @@ -1,6 +1,7 @@ package eu.kanade.domain.source.interactor import eu.kanade.domain.source.model.Source +import eu.kanade.tachiyomi.core.preference.getAndSet import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.util.preference.minusAssign import eu.kanade.tachiyomi.util.preference.plusAssign @@ -14,10 +15,8 @@ class ToggleSource( } fun await(sourceId: Long, enable: Boolean = sourceId.toString() in preferences.disabledSources().get()) { - if (enable) { - preferences.disabledSources() -= sourceId.toString() - } else { - preferences.disabledSources() += sourceId.toString() + preferences.disabledSources().getAndSet { disabled -> + if (enable) disabled.minus("$sourceId") else disabled.plus("$sourceId") } } } diff --git a/app/src/main/java/eu/kanade/domain/source/interactor/ToggleSourcePin.kt b/app/src/main/java/eu/kanade/domain/source/interactor/ToggleSourcePin.kt index d7229ab46..c5d360848 100644 --- a/app/src/main/java/eu/kanade/domain/source/interactor/ToggleSourcePin.kt +++ b/app/src/main/java/eu/kanade/domain/source/interactor/ToggleSourcePin.kt @@ -1,6 +1,7 @@ package eu.kanade.domain.source.interactor import eu.kanade.domain.source.model.Source +import eu.kanade.tachiyomi.core.preference.getAndSet import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.util.preference.minusAssign import eu.kanade.tachiyomi.util.preference.plusAssign @@ -11,10 +12,8 @@ class ToggleSourcePin( fun await(source: Source) { val isPinned = source.id.toString() in preferences.pinnedSources().get() - if (isPinned) { - preferences.pinnedSources() -= source.id.toString() - } else { - preferences.pinnedSources() += source.id.toString() + preferences.pinnedSources().getAndSet { pinned -> + if (isPinned) pinned.minus("${source.id}") else pinned.plus("${source.id}") } } } diff --git a/app/src/main/java/eu/kanade/domain/source/interactor/ToggleSources.kt b/app/src/main/java/eu/kanade/domain/source/interactor/ToggleSources.kt index 36535c782..e1efc0f8a 100644 --- a/app/src/main/java/eu/kanade/domain/source/interactor/ToggleSources.kt +++ b/app/src/main/java/eu/kanade/domain/source/interactor/ToggleSources.kt @@ -1,20 +1,20 @@ package eu.kanade.domain.source.interactor import eu.kanade.domain.source.model.Source +import eu.kanade.tachiyomi.core.preference.getAndSet import eu.kanade.tachiyomi.data.preference.PreferencesHelper -import eu.kanade.tachiyomi.util.preference.minusAssign -import eu.kanade.tachiyomi.util.preference.plusAssign class ToggleSources( private val preferences: PreferencesHelper, ) { fun await(isEnable: Boolean, sources: List) { - val newDisabledSources = if (isEnable) { - preferences.disabledSources().get() - sources.map { it.id.toString() } - } else { - preferences.disabledSources().get() + sources.map { it.id.toString() } + preferences.disabledSources().getAndSet { disabledSources -> + if (isEnable) { + disabledSources - sources.map { it.id.toString() }.toSet() + } else { + disabledSources + sources.map { it.id.toString() } + } } - preferences.disabledSources().set(newDisabledSources) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/App.kt b/app/src/main/java/eu/kanade/tachiyomi/App.kt index 4e6544e0f..2d6d4974c 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/App.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/App.kt @@ -54,6 +54,7 @@ import eu.kanade.tachiyomi.data.preference.PreferenceValues import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.glance.UpdatesGridGlanceWidget import eu.kanade.tachiyomi.network.NetworkHelper +import eu.kanade.tachiyomi.network.NetworkPreferences import eu.kanade.tachiyomi.ui.base.delegate.SecureActivityDelegate import eu.kanade.tachiyomi.util.preference.asHotFlow import eu.kanade.tachiyomi.util.system.WebViewUtil @@ -88,6 +89,7 @@ import kotlin.time.Duration.Companion.days class App : Application(), DefaultLifecycleObserver, ImageLoaderFactory { private val preferences: PreferencesHelper by injectLazy() + private val networkPreferences: NetworkPreferences by injectLazy() private val disableIncognitoReceiver = DisableIncognitoReceiver() @@ -111,8 +113,10 @@ class App : Application(), DefaultLifecycleObserver, ImageLoaderFactory { } Injekt.importModule(AppModule(this)) + Injekt.importModule(PreferenceModule(this)) Injekt.importModule(DomainModule()) // SY --> + Injekt.importModule(SYPreferenceModule(this)) Injekt.importModule(SYDomainModule()) // SY <-- @@ -124,7 +128,7 @@ class App : Application(), DefaultLifecycleObserver, ImageLoaderFactory { ProcessLifecycleOwner.get().lifecycle.addObserver(this) // Show notification to disable Incognito Mode when it's enabled - preferences.incognitoMode().asFlow() + preferences.incognitoMode().changes() .onEach { enabled -> val notificationManager = NotificationManagerCompat.from(this) if (enabled) { @@ -175,7 +179,7 @@ class App : Application(), DefaultLifecycleObserver, ImageLoaderFactory { } .launchIn(ProcessLifecycleOwner.get().lifecycleScope) - /*if (!LogcatLogger.isInstalled && preferences.verboseLogging()) { + /*if (!LogcatLogger.isInstalled && networkPreferences.verboseLogging().get()) { LogcatLogger.install(AndroidLogcatLogger(LogPriority.VERBOSE)) }*/ } @@ -206,7 +210,7 @@ class App : Application(), DefaultLifecycleObserver, ImageLoaderFactory { diskCache(diskCacheInit) crossfade((300 * this@App.animatorDurationScale).toInt()) allowRgb565(getSystemService()!!.isLowRamDevice) - if (preferences.verboseLogging()) logger(DebugLogger()) + if (networkPreferences.verboseLogging().get()) logger(DebugLogger()) }.build() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/AppModule.kt b/app/src/main/java/eu/kanade/tachiyomi/AppModule.kt index fad36f1a1..31c39654b 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/AppModule.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/AppModule.kt @@ -16,6 +16,8 @@ import eu.kanade.data.dateAdapter import eu.kanade.data.listOfLongsAdapter import eu.kanade.data.listOfStringsAdapter import eu.kanade.data.listOfStringsAndAdapter +import eu.kanade.tachiyomi.core.preference.AndroidPreferenceStore +import eu.kanade.tachiyomi.core.preference.PreferenceStore import eu.kanade.tachiyomi.data.cache.ChapterCache import eu.kanade.tachiyomi.data.cache.CoverCache import eu.kanade.tachiyomi.data.cache.PagePreviewCache @@ -27,8 +29,11 @@ import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.track.job.DelayedTrackingStore import eu.kanade.tachiyomi.extension.ExtensionManager import eu.kanade.tachiyomi.network.NetworkHelper +import eu.kanade.tachiyomi.network.NetworkPreferences import eu.kanade.tachiyomi.source.SourceManager +import eu.kanade.tachiyomi.util.system.isDevFlavor import exh.eh.EHentaiUpdateHelper +import exh.pref.SourcePreferences import io.requery.android.database.sqlite.RequerySQLiteOpenHelperFactory import kotlinx.serialization.json.Json import uy.kohesive.injekt.api.InjektModule @@ -98,8 +103,6 @@ class AppModule(val app: Application) : InjektModule { } } - addSingletonFactory { PreferencesHelper(app) } - addSingletonFactory { ChapterCache(app) } addSingletonFactory { CoverCache(app) } @@ -128,8 +131,6 @@ class AppModule(val app: Application) : InjektModule { // Asynchronously init expensive components for a faster cold start ContextCompat.getMainExecutor(app).execute { - get() - get() get() @@ -144,3 +145,36 @@ class AppModule(val app: Application) : InjektModule { } } } + +class PreferenceModule(val application: Application) : InjektModule { + override fun InjektRegistrar.registerInjectables() { + addSingletonFactory { + AndroidPreferenceStore(application) + } + addSingletonFactory { + NetworkPreferences( + preferenceStore = get(), + verboseLogging = isDevFlavor, + ) + } + addSingletonFactory { + PreferencesHelper( + context = application, + preferenceStore = get(), + ) + } + } +} + +// SY --> +class SYPreferenceModule(val application: Application) : InjektModule { + + override fun InjektRegistrar.registerInjectables() { + addSingletonFactory { + SourcePreferences( + preferenceStore = get(), + ) + } + } +} +// SY <-- diff --git a/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt b/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt index 044c08972..1a9276c62 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt @@ -1,5 +1,6 @@ package eu.kanade.tachiyomi +import android.content.Context import android.os.Build import androidx.core.content.edit import androidx.preference.PreferenceManager @@ -12,6 +13,7 @@ import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.updater.AppUpdateJob import eu.kanade.tachiyomi.extension.ExtensionUpdateJob +import eu.kanade.tachiyomi.network.NetworkPreferences import eu.kanade.tachiyomi.network.PREF_DOH_CLOUDFLARE import eu.kanade.tachiyomi.ui.reader.setting.OrientationType import eu.kanade.tachiyomi.util.preference.minusAssign @@ -33,9 +35,11 @@ object Migrations { * @param preferences Preferences of the application. * @return true if a migration is performed, false otherwise. */ - fun upgrade(preferences: PreferencesHelper): Boolean { - val context = preferences.context - + fun upgrade( + context: Context, + preferences: PreferencesHelper, + networkPreferences: NetworkPreferences, + ): Boolean { val oldVersion = preferences.lastVersionCode().get() if (oldVersion < BuildConfig.VERSION_CODE) { preferences.lastVersionCode().set(BuildConfig.VERSION_CODE) @@ -145,7 +149,7 @@ object Migrations { val wasDohEnabled = prefs.getBoolean("enable_doh", false) if (wasDohEnabled) { prefs.edit { - putInt(PreferenceKeys.dohProvider, PREF_DOH_CLOUDFLARE) + putInt(networkPreferences.dohProvider().key(), PREF_DOH_CLOUDFLARE) remove("enable_doh") } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupNotifier.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupNotifier.kt index 3ab6366df..b730cba50 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupNotifier.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupNotifier.kt @@ -84,7 +84,7 @@ class BackupNotifier(private val context: Context) { val builder = with(progressNotificationBuilder) { setContentTitle(context.getString(R.string.restoring_backup)) - if (!preferences.hideNotificationContent()) { + if (!preferences.hideNotificationContent().get()) { setContentText(content) } 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 d8c501976..863e18f71 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/cache/ChapterCache.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/cache/ChapterCache.kt @@ -57,7 +57,7 @@ class ChapterCache(private val context: Context) { private var diskCache = setupDiskCache(prefs.cacheSize().get().toLong()) init { - prefs.cacheSize().asFlow() + prefs.cacheSize().changes() .onEach { // Save old cache for destruction later val oldCache = diskCache diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt index e08f6757c..ffd6a59b6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadCache.kt @@ -47,7 +47,7 @@ class DownloadCache( private var rootDir = RootDirectory(getDirectoryFromPreference()) init { - preferences.downloadsDirectory().asFlow() + preferences.downloadsDirectory().changes() .onEach { lastRenew = 0L // invalidate cache rootDir = RootDirectory(getDirectoryFromPreference()) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt index 4f029d83a..20bfefef6 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt @@ -468,7 +468,7 @@ class DownloadManager( return if (categoriesForManga.intersect(categoriesToExclude).isNotEmpty()) { chapters.filterNot { it.read } - } else if (!preferences.removeBookmarkedChapters()) { + } else if (!preferences.removeBookmarkedChapters().get()) { chapters.filterNot { it.bookmark } } else { chapters diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadNotifier.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadNotifier.kt index 9c5f37699..230acaca9 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadNotifier.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadNotifier.kt @@ -104,7 +104,7 @@ internal class DownloadNotifier(private val context: Context) { download.pages!!.size, ) - if (preferences.hideNotificationContent()) { + if (preferences.hideNotificationContent().get()) { setContentTitle(downloadingProgressText) setContentText(null) } else { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt index bb5c7240e..c1abe2313 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt @@ -39,7 +39,7 @@ class DownloadProvider(private val context: Context) { } init { - preferences.downloadsDirectory().asFlow() + preferences.downloadsDirectory().changes() .onEach { downloadsDir = UniFile.fromUri(context, it.toUri()) } .launchIn(scope) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadService.kt index 7c2a12630..4da026373 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadService.kt @@ -164,7 +164,7 @@ class DownloadService : Service() { */ private fun onNetworkStateChanged() { if (isOnline()) { - if (preferences.downloadOnlyOverWifi() && !isConnectedToWifi()) { + if (preferences.downloadOnlyOverWifi().get() && !isConnectedToWifi()) { stopDownloads(R.string.download_notifier_text_only_wifi) } else { val started = downloadManager.startDownloads() diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateNotifier.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateNotifier.kt index 2256eda11..77e1d60ae 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateNotifier.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateNotifier.kt @@ -72,7 +72,7 @@ class LibraryUpdateNotifier(private val context: Context) { * @param total the total progress. */ fun showProgressNotification(manga: List */SManga/* SY <-- */>, current: Int, total: Int) { - if (preferences.hideNotificationContent()) { + if (preferences.hideNotificationContent().get()) { progressNotificationBuilder .setContentTitle(context.getString(R.string.notification_check_updates)) .setContentText("($current/$total)") @@ -168,12 +168,12 @@ class LibraryUpdateNotifier(private val context: Context) { Notifications.ID_NEW_CHAPTERS, context.notification(Notifications.CHANNEL_NEW_CHAPTERS) { setContentTitle(context.getString(R.string.notification_new_chapters)) - if (updates.size == 1 && !preferences.hideNotificationContent()) { + if (updates.size == 1 && !preferences.hideNotificationContent().get()) { setContentText(updates.first().first.title.chop(NOTIF_TITLE_MAX_LEN)) } else { setContentText(context.resources.getQuantityString(R.plurals.notification_new_chapters_summary, updates.size, updates.size)) - if (!preferences.hideNotificationContent()) { + if (!preferences.hideNotificationContent().get()) { setStyle( NotificationCompat.BigTextStyle().bigText( updates.joinToString("\n") { @@ -198,7 +198,7 @@ class LibraryUpdateNotifier(private val context: Context) { ) // Per-manga notification - if (!preferences.hideNotificationContent()) { + if (!preferences.hideNotificationContent().get()) { launchUI { updates.forEach { (manga, chapters) -> notify(manga.id.hashCode(), createNewChaptersNotification(manga, chapters)) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt index 0b3dba1e2..926ae89e1 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt @@ -467,7 +467,7 @@ class LibraryUpdateService( failedUpdates.add(mangaWithNotif to errorMessage) } - if (preferences.autoUpdateTrackers()) { + if (preferences.autoUpdateTrackers().get()) { updateTrackings(mangaWithNotif, loggedServices) } } @@ -533,7 +533,7 @@ class LibraryUpdateService( val source = sourceManager.getOrStub(manga.source) // Update manga metadata if needed - if (preferences.autoUpdateMetadata()) { + if (preferences.autoUpdateMetadata().get()) { val networkManga = source.getMangaDetails(manga.toSManga()) updateManga.awaitUpdateFromSource(manga, networkManga, manualFetch = false, coverCache) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt b/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt index db5bd65da..f8d232397 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt @@ -248,7 +248,7 @@ class NotificationReceiver : BroadcastReceiver() { val toUpdate = chapterUrls.mapNotNull { getChapter.await(it, mangaId) } .map { val chapter = it.copy(read = true) - if (preferences.removeAfterMarkedAsRead()) { + if (preferences.removeAfterMarkedAsRead().get()) { val manga = getManga.await(mangaId) if (manga != null) { val source = sourceManager.get(manga.source) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt index 1338ec2d1..9a31bd34e 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt @@ -58,10 +58,6 @@ object PreferenceKeys { const val searchPinnedSourcesOnly = "search_pinned_sources_only" - const val dohProvider = "doh_provider" - - const val defaultUserAgent = "default_user_agent" - const val defaultChapterFilterByRead = "default_chapter_filter_by_read" const val defaultChapterFilterByDownloaded = "default_chapter_filter_by_downloaded" @@ -74,8 +70,6 @@ object PreferenceKeys { const val defaultChapterDisplayByNameOrNumber = "default_chapter_display_by_name_or_number" - const val verboseLogging = "verbose_logging" - const val autoClearChapterCache = "auto_clear_chapter_cache" fun trackUsername(syncId: Long) = "pref_mangasync_username_$syncId" diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt index 1dc1c8d96..cbb4f8534 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt @@ -3,12 +3,11 @@ package eu.kanade.tachiyomi.data.preference import android.content.Context import android.os.Build import android.os.Environment -import androidx.core.content.edit import androidx.core.net.toUri -import androidx.preference.PreferenceManager -import com.fredporciuncula.flow.preferences.FlowSharedPreferences import eu.kanade.domain.source.interactor.SetMigrateSorting import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.core.preference.PreferenceStore +import eu.kanade.tachiyomi.core.preference.getEnum import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.tachiyomi.data.track.anilist.Anilist @@ -21,7 +20,6 @@ import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType import eu.kanade.tachiyomi.ui.reader.viewer.pager.PagerConfig import eu.kanade.tachiyomi.util.system.DeviceUtil import eu.kanade.tachiyomi.util.system.LocaleHelper -import eu.kanade.tachiyomi.util.system.isDevFlavor import eu.kanade.tachiyomi.util.system.isDynamicColorAvailable import eu.kanade.tachiyomi.widget.ExtendedNavigationView import java.io.File @@ -32,10 +30,10 @@ import eu.kanade.domain.manga.model.Manga as DomainManga import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys import eu.kanade.tachiyomi.data.preference.PreferenceValues as Values -class PreferencesHelper(val context: Context) { - - private val prefs = PreferenceManager.getDefaultSharedPreferences(context) - val flowPrefs = FlowSharedPreferences(prefs) +class PreferencesHelper( + val context: Context, + private val preferenceStore: PreferenceStore, +) { private val defaultDownloadsDir = File( Environment.getExternalStorageDirectory().absolutePath + File.separator + @@ -49,484 +47,474 @@ class PreferencesHelper(val context: Context) { "backup", ).toUri() - fun confirmExit() = prefs.getBoolean(Keys.confirmExit, false) + fun confirmExit() = this.preferenceStore.getBoolean(Keys.confirmExit, false) - fun sideNavIconAlignment() = flowPrefs.getInt("pref_side_nav_icon_alignment", 0) + fun sideNavIconAlignment() = this.preferenceStore.getInt("pref_side_nav_icon_alignment", 0) - fun useAuthenticator() = flowPrefs.getBoolean("use_biometric_lock", false) + fun useAuthenticator() = this.preferenceStore.getBoolean("use_biometric_lock", false) - fun lockAppAfter() = flowPrefs.getInt("lock_app_after", 0) + fun lockAppAfter() = this.preferenceStore.getInt("lock_app_after", 0) /** * For app lock. Will be set when there is a pending timed lock. * Otherwise this pref should be deleted. */ - fun lastAppClosed() = flowPrefs.getLong("last_app_closed", 0) + fun lastAppClosed() = this.preferenceStore.getLong("last_app_closed", 0) - fun secureScreen() = flowPrefs.getEnum("secure_screen_v2", Values.SecureScreenMode.INCOGNITO) + fun secureScreen() = this.preferenceStore.getEnum("secure_screen_v2", Values.SecureScreenMode.INCOGNITO) - fun hideNotificationContent() = prefs.getBoolean(Keys.hideNotificationContent, false) + fun hideNotificationContent() = this.preferenceStore.getBoolean(Keys.hideNotificationContent, false) - fun autoUpdateMetadata() = prefs.getBoolean(Keys.autoUpdateMetadata, false) + fun autoUpdateMetadata() = this.preferenceStore.getBoolean(Keys.autoUpdateMetadata, false) - fun autoUpdateTrackers() = prefs.getBoolean(Keys.autoUpdateTrackers, false) + fun autoUpdateTrackers() = this.preferenceStore.getBoolean(Keys.autoUpdateTrackers, false) - fun themeMode() = flowPrefs.getEnum( + fun themeMode() = this.preferenceStore.getEnum( "pref_theme_mode_key", if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { Values.ThemeMode.system } else { Values.ThemeMode.light }, ) - fun appTheme() = flowPrefs.getEnum( + fun appTheme() = this.preferenceStore.getEnum( "pref_app_theme", if (DeviceUtil.isDynamicColorAvailable) { Values.AppTheme.MONET } else { Values.AppTheme.DEFAULT }, ) - fun themeDarkAmoled() = flowPrefs.getBoolean("pref_theme_dark_amoled_key", false) + fun themeDarkAmoled() = this.preferenceStore.getBoolean("pref_theme_dark_amoled_key", false) // SY --> - fun pageTransitionsPager() = flowPrefs.getBoolean("pref_enable_transitions_pager_key", true) + fun pageTransitionsPager() = this.preferenceStore.getBoolean("pref_enable_transitions_pager_key", true) - fun pageTransitionsWebtoon() = flowPrefs.getBoolean("pref_enable_transitions_webtoon_key", true) + fun pageTransitionsWebtoon() = this.preferenceStore.getBoolean("pref_enable_transitions_webtoon_key", true) // SY <-- - fun doubleTapAnimSpeed() = flowPrefs.getInt("pref_double_tap_anim_speed", 500) + fun doubleTapAnimSpeed() = this.preferenceStore.getInt("pref_double_tap_anim_speed", 500) - fun showPageNumber() = flowPrefs.getBoolean("pref_show_page_number_key", true) + fun showPageNumber() = this.preferenceStore.getBoolean("pref_show_page_number_key", true) - fun dualPageSplitPaged() = flowPrefs.getBoolean("pref_dual_page_split", false) + fun dualPageSplitPaged() = this.preferenceStore.getBoolean("pref_dual_page_split", false) - fun dualPageInvertPaged() = flowPrefs.getBoolean("pref_dual_page_invert", false) + fun dualPageInvertPaged() = this.preferenceStore.getBoolean("pref_dual_page_invert", false) - fun dualPageSplitWebtoon() = flowPrefs.getBoolean("pref_dual_page_split_webtoon", false) + fun dualPageSplitWebtoon() = this.preferenceStore.getBoolean("pref_dual_page_split_webtoon", false) - fun dualPageInvertWebtoon() = flowPrefs.getBoolean("pref_dual_page_invert_webtoon", false) + fun dualPageInvertWebtoon() = this.preferenceStore.getBoolean("pref_dual_page_invert_webtoon", false) - fun longStripSplitWebtoon() = flowPrefs.getBoolean("pref_long_strip_split_webtoon", true) + fun longStripSplitWebtoon() = this.preferenceStore.getBoolean("pref_long_strip_split_webtoon", true) - fun showReadingMode() = prefs.getBoolean(Keys.showReadingMode, true) + fun showReadingMode() = this.preferenceStore.getBoolean(Keys.showReadingMode, true) - fun trueColor() = flowPrefs.getBoolean("pref_true_color_key", false) + fun trueColor() = this.preferenceStore.getBoolean("pref_true_color_key", false) - fun fullscreen() = flowPrefs.getBoolean("fullscreen", true) + fun fullscreen() = this.preferenceStore.getBoolean("fullscreen", true) - fun cutoutShort() = flowPrefs.getBoolean("cutout_short", true) + fun cutoutShort() = this.preferenceStore.getBoolean("cutout_short", true) - fun keepScreenOn() = flowPrefs.getBoolean("pref_keep_screen_on_key", true) + fun keepScreenOn() = this.preferenceStore.getBoolean("pref_keep_screen_on_key", true) - fun customBrightness() = flowPrefs.getBoolean("pref_custom_brightness_key", false) + fun customBrightness() = this.preferenceStore.getBoolean("pref_custom_brightness_key", false) - fun customBrightnessValue() = flowPrefs.getInt("custom_brightness_value", 0) + fun customBrightnessValue() = this.preferenceStore.getInt("custom_brightness_value", 0) - fun colorFilter() = flowPrefs.getBoolean("pref_color_filter_key", false) + fun colorFilter() = this.preferenceStore.getBoolean("pref_color_filter_key", false) - fun colorFilterValue() = flowPrefs.getInt("color_filter_value", 0) + fun colorFilterValue() = this.preferenceStore.getInt("color_filter_value", 0) - fun colorFilterMode() = flowPrefs.getInt("color_filter_mode", 0) + fun colorFilterMode() = this.preferenceStore.getInt("color_filter_mode", 0) - fun grayscale() = flowPrefs.getBoolean("pref_grayscale", false) + fun grayscale() = this.preferenceStore.getBoolean("pref_grayscale", false) - fun invertedColors() = flowPrefs.getBoolean("pref_inverted_colors", false) + fun invertedColors() = this.preferenceStore.getBoolean("pref_inverted_colors", false) - fun defaultReadingMode() = prefs.getInt(Keys.defaultReadingMode, ReadingModeType.RIGHT_TO_LEFT.flagValue) + fun defaultReadingMode() = this.preferenceStore.getInt(Keys.defaultReadingMode, ReadingModeType.RIGHT_TO_LEFT.flagValue) - fun defaultOrientationType() = prefs.getInt(Keys.defaultOrientationType, OrientationType.FREE.flagValue) + fun defaultOrientationType() = this.preferenceStore.getInt(Keys.defaultOrientationType, OrientationType.FREE.flagValue) - fun imageScaleType() = flowPrefs.getInt("pref_image_scale_type_key", 1) + fun imageScaleType() = this.preferenceStore.getInt("pref_image_scale_type_key", 1) - fun zoomStart() = flowPrefs.getInt("pref_zoom_start_key", 1) + fun zoomStart() = this.preferenceStore.getInt("pref_zoom_start_key", 1) - fun readerTheme() = flowPrefs.getInt("pref_reader_theme_key", 3) + fun readerTheme() = this.preferenceStore.getInt("pref_reader_theme_key", 3) - fun alwaysShowChapterTransition() = flowPrefs.getBoolean("always_show_chapter_transition", true) + fun alwaysShowChapterTransition() = this.preferenceStore.getBoolean("always_show_chapter_transition", true) - fun cropBorders() = flowPrefs.getBoolean("crop_borders", false) + fun cropBorders() = this.preferenceStore.getBoolean("crop_borders", false) - fun navigateToPan() = flowPrefs.getBoolean("navigate_pan", true) + fun navigateToPan() = this.preferenceStore.getBoolean("navigate_pan", true) - fun landscapeZoom() = flowPrefs.getBoolean("landscape_zoom", true) + fun landscapeZoom() = this.preferenceStore.getBoolean("landscape_zoom", true) - fun cropBordersWebtoon() = flowPrefs.getBoolean("crop_borders_webtoon", false) + fun cropBordersWebtoon() = this.preferenceStore.getBoolean("crop_borders_webtoon", false) - fun webtoonSidePadding() = flowPrefs.getInt("webtoon_side_padding", 0) + fun webtoonSidePadding() = this.preferenceStore.getInt("webtoon_side_padding", 0) - fun readWithTapping() = flowPrefs.getBoolean("reader_tap", true) + fun readWithTapping() = this.preferenceStore.getBoolean("reader_tap", true) - fun pagerNavInverted() = flowPrefs.getEnum("reader_tapping_inverted", Values.TappingInvertMode.NONE) + fun pagerNavInverted() = this.preferenceStore.getEnum("reader_tapping_inverted", Values.TappingInvertMode.NONE) - fun webtoonNavInverted() = flowPrefs.getEnum("reader_tapping_inverted_webtoon", Values.TappingInvertMode.NONE) + fun webtoonNavInverted() = this.preferenceStore.getEnum("reader_tapping_inverted_webtoon", Values.TappingInvertMode.NONE) - fun readWithLongTap() = flowPrefs.getBoolean("reader_long_tap", true) + fun readWithLongTap() = this.preferenceStore.getBoolean("reader_long_tap", true) - fun readWithVolumeKeys() = flowPrefs.getBoolean("reader_volume_keys", false) + fun readWithVolumeKeys() = this.preferenceStore.getBoolean("reader_volume_keys", false) - fun readWithVolumeKeysInverted() = flowPrefs.getBoolean("reader_volume_keys_inverted", false) + fun readWithVolumeKeysInverted() = this.preferenceStore.getBoolean("reader_volume_keys_inverted", false) - fun navigationModePager() = flowPrefs.getInt("reader_navigation_mode_pager", 0) + fun navigationModePager() = this.preferenceStore.getInt("reader_navigation_mode_pager", 0) - fun navigationModeWebtoon() = flowPrefs.getInt("reader_navigation_mode_webtoon", 0) + fun navigationModeWebtoon() = this.preferenceStore.getInt("reader_navigation_mode_webtoon", 0) - fun showNavigationOverlayNewUser() = flowPrefs.getBoolean("reader_navigation_overlay_new_user", true) + fun showNavigationOverlayNewUser() = this.preferenceStore.getBoolean("reader_navigation_overlay_new_user", true) - fun showNavigationOverlayOnStart() = flowPrefs.getBoolean("reader_navigation_overlay_on_start", false) + fun showNavigationOverlayOnStart() = this.preferenceStore.getBoolean("reader_navigation_overlay_on_start", false) - fun readerHideThreshold() = flowPrefs.getEnum("reader_hide_threshold", Values.ReaderHideThreshold.LOW) + fun readerHideThreshold() = this.preferenceStore.getEnum("reader_hide_threshold", Values.ReaderHideThreshold.LOW) - fun portraitColumns() = flowPrefs.getInt("pref_library_columns_portrait_key", 0) + fun portraitColumns() = this.preferenceStore.getInt("pref_library_columns_portrait_key", 0) - fun landscapeColumns() = flowPrefs.getInt("pref_library_columns_landscape_key", 0) + fun landscapeColumns() = this.preferenceStore.getInt("pref_library_columns_landscape_key", 0) - fun autoUpdateTrack() = prefs.getBoolean(Keys.autoUpdateTrack, true) + fun autoUpdateTrack() = this.preferenceStore.getBoolean(Keys.autoUpdateTrack, true) - fun lastUsedSource() = flowPrefs.getLong("last_catalogue_source", -1) + fun lastUsedSource() = this.preferenceStore.getLong("last_catalogue_source", -1) - fun lastUsedCategory() = flowPrefs.getInt("last_used_category", 0) + fun lastUsedCategory() = this.preferenceStore.getInt("last_used_category", 0) - fun lastVersionCode() = flowPrefs.getInt("last_version_code", 0) + fun lastVersionCode() = this.preferenceStore.getInt("last_version_code", 0) - fun sourceDisplayMode() = flowPrefs.getObject("pref_display_mode_catalogue", LibraryDisplayMode.Serializer, LibraryDisplayMode.default) + fun sourceDisplayMode() = this.preferenceStore.getObject("pref_display_mode_catalogue", LibraryDisplayMode.default, LibraryDisplayMode.Serializer::serialize, LibraryDisplayMode.Serializer::deserialize) - fun enabledLanguages() = flowPrefs.getStringSet("source_languages", LocaleHelper.getDefaultEnabledLanguages()) + fun enabledLanguages() = this.preferenceStore.getStringSet("source_languages", LocaleHelper.getDefaultEnabledLanguages()) - fun trackUsername(sync: TrackService) = prefs.getString(Keys.trackUsername(sync.id), "") + fun trackUsername(sync: TrackService) = this.preferenceStore.getString(Keys.trackUsername(sync.id), "") - fun trackPassword(sync: TrackService) = prefs.getString(Keys.trackPassword(sync.id), "") + fun trackPassword(sync: TrackService) = this.preferenceStore.getString(Keys.trackPassword(sync.id), "") fun setTrackCredentials(sync: TrackService, username: String, password: String) { - prefs.edit { - putString(Keys.trackUsername(sync.id), username) - putString(Keys.trackPassword(sync.id), password) - } + trackUsername(sync).set(username) + trackPassword(sync).set(password) } - fun trackToken(sync: TrackService) = flowPrefs.getString(Keys.trackToken(sync.id), "") + fun trackToken(sync: TrackService) = this.preferenceStore.getString(Keys.trackToken(sync.id), "") - fun anilistScoreType() = flowPrefs.getString("anilist_score_type", Anilist.POINT_10) + fun anilistScoreType() = this.preferenceStore.getString("anilist_score_type", Anilist.POINT_10) - fun backupsDirectory() = flowPrefs.getString("backup_directory", defaultBackupDir.toString()) + fun backupsDirectory() = this.preferenceStore.getString("backup_directory", defaultBackupDir.toString()) - fun relativeTime() = flowPrefs.getInt("relative_time", 7) + fun relativeTime() = this.preferenceStore.getInt("relative_time", 7) - fun dateFormat(format: String = flowPrefs.getString(Keys.dateFormat, "").get()): DateFormat = when (format) { + fun dateFormat(format: String = this.preferenceStore.getString(Keys.dateFormat, "").get()): DateFormat = when (format) { "" -> DateFormat.getDateInstance(DateFormat.SHORT) else -> SimpleDateFormat(format, Locale.getDefault()) } - fun downloadsDirectory() = flowPrefs.getString("download_directory", defaultDownloadsDir.toString()) + fun downloadsDirectory() = this.preferenceStore.getString("download_directory", defaultDownloadsDir.toString()) - fun downloadOnlyOverWifi() = prefs.getBoolean(Keys.downloadOnlyOverWifi, true) + fun downloadOnlyOverWifi() = this.preferenceStore.getBoolean(Keys.downloadOnlyOverWifi, true) - fun saveChaptersAsCBZ() = flowPrefs.getBoolean("save_chapter_as_cbz", true) + fun saveChaptersAsCBZ() = this.preferenceStore.getBoolean("save_chapter_as_cbz", true) - fun splitTallImages() = flowPrefs.getBoolean("split_tall_images", false) + fun splitTallImages() = this.preferenceStore.getBoolean("split_tall_images", false) - fun folderPerManga() = prefs.getBoolean(Keys.folderPerManga, false) + fun folderPerManga() = this.preferenceStore.getBoolean(Keys.folderPerManga, false) - fun numberOfBackups() = flowPrefs.getInt("backup_slots", 2) + fun numberOfBackups() = this.preferenceStore.getInt("backup_slots", 2) - fun backupInterval() = flowPrefs.getInt("backup_interval", 12) + fun backupInterval() = this.preferenceStore.getInt("backup_interval", 12) - fun removeAfterReadSlots() = prefs.getInt(Keys.removeAfterReadSlots, -1) + fun removeAfterReadSlots() = this.preferenceStore.getInt(Keys.removeAfterReadSlots, -1) - fun removeAfterMarkedAsRead() = prefs.getBoolean(Keys.removeAfterMarkedAsRead, false) + fun removeAfterMarkedAsRead() = this.preferenceStore.getBoolean(Keys.removeAfterMarkedAsRead, false) - fun removeBookmarkedChapters() = prefs.getBoolean(Keys.removeBookmarkedChapters, false) + fun removeBookmarkedChapters() = this.preferenceStore.getBoolean(Keys.removeBookmarkedChapters, false) - fun removeExcludeCategories() = flowPrefs.getStringSet("remove_exclude_categories", emptySet()) + fun removeExcludeCategories() = this.preferenceStore.getStringSet("remove_exclude_categories", emptySet()) - fun libraryUpdateInterval() = flowPrefs.getInt("pref_library_update_interval_key", 24) - fun libraryUpdateLastTimestamp() = flowPrefs.getLong("library_update_last_timestamp", 0L) + fun libraryUpdateInterval() = this.preferenceStore.getInt("pref_library_update_interval_key", 24) + fun libraryUpdateLastTimestamp() = this.preferenceStore.getLong("library_update_last_timestamp", 0L) - fun libraryUpdateDeviceRestriction() = flowPrefs.getStringSet("library_update_restriction", setOf(DEVICE_ONLY_ON_WIFI)) - fun libraryUpdateMangaRestriction() = flowPrefs.getStringSet("library_update_manga_restriction", setOf(MANGA_HAS_UNREAD, MANGA_NON_COMPLETED, MANGA_NON_READ)) + fun libraryUpdateDeviceRestriction() = this.preferenceStore.getStringSet("library_update_restriction", setOf(DEVICE_ONLY_ON_WIFI)) + fun libraryUpdateMangaRestriction() = this.preferenceStore.getStringSet("library_update_manga_restriction", setOf(MANGA_HAS_UNREAD, MANGA_NON_COMPLETED, MANGA_NON_READ)) - fun showUpdatesNavBadge() = flowPrefs.getBoolean("library_update_show_tab_badge", false) - fun unreadUpdatesCount() = flowPrefs.getInt("library_unread_updates_count", 0) + fun showUpdatesNavBadge() = this.preferenceStore.getBoolean("library_update_show_tab_badge", false) + fun unreadUpdatesCount() = this.preferenceStore.getInt("library_unread_updates_count", 0) - fun libraryUpdateCategories() = flowPrefs.getStringSet("library_update_categories", emptySet()) - fun libraryUpdateCategoriesExclude() = flowPrefs.getStringSet("library_update_categories_exclude", emptySet()) + fun libraryUpdateCategories() = this.preferenceStore.getStringSet("library_update_categories", emptySet()) + fun libraryUpdateCategoriesExclude() = this.preferenceStore.getStringSet("library_update_categories_exclude", emptySet()) - fun libraryDisplayMode() = flowPrefs.getObject("pref_display_mode_library", LibraryDisplayMode.Serializer, LibraryDisplayMode.default) + fun libraryDisplayMode() = this.preferenceStore.getObject("pref_display_mode_library", LibraryDisplayMode.default, LibraryDisplayMode.Serializer::serialize, LibraryDisplayMode.Serializer::deserialize) - fun downloadBadge() = flowPrefs.getBoolean("display_download_badge", false) + fun downloadBadge() = this.preferenceStore.getBoolean("display_download_badge", false) - fun localBadge() = flowPrefs.getBoolean("display_local_badge", true) + fun localBadge() = this.preferenceStore.getBoolean("display_local_badge", true) - fun downloadedOnly() = flowPrefs.getBoolean("pref_downloaded_only", false) + fun downloadedOnly() = this.preferenceStore.getBoolean("pref_downloaded_only", false) - fun unreadBadge() = flowPrefs.getBoolean("display_unread_badge", true) + fun unreadBadge() = this.preferenceStore.getBoolean("display_unread_badge", true) - fun languageBadge() = flowPrefs.getBoolean("display_language_badge", false) + fun languageBadge() = this.preferenceStore.getBoolean("display_language_badge", false) - fun categoryTabs() = flowPrefs.getBoolean("display_category_tabs", true) + fun categoryTabs() = this.preferenceStore.getBoolean("display_category_tabs", true) - fun categoryNumberOfItems() = flowPrefs.getBoolean("display_number_of_items", false) + fun categoryNumberOfItems() = this.preferenceStore.getBoolean("display_number_of_items", false) - fun filterDownloaded() = flowPrefs.getInt(Keys.filterDownloaded, ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value) + fun filterDownloaded() = this.preferenceStore.getInt(Keys.filterDownloaded, ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value) - fun filterUnread() = flowPrefs.getInt(Keys.filterUnread, ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value) + fun filterUnread() = this.preferenceStore.getInt(Keys.filterUnread, ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value) - fun filterStarted() = flowPrefs.getInt(Keys.filterStarted, ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value) + fun filterStarted() = this.preferenceStore.getInt(Keys.filterStarted, ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value) - fun filterCompleted() = flowPrefs.getInt(Keys.filterCompleted, ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value) + fun filterCompleted() = this.preferenceStore.getInt(Keys.filterCompleted, ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value) - fun filterTracking(name: Long) = flowPrefs.getInt("${Keys.filterTracked}_$name", ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value) + fun filterTracking(name: Long) = this.preferenceStore.getInt("${Keys.filterTracked}_$name", ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value) - fun filterLewd() = flowPrefs.getInt(Keys.filterLewd, ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value) + fun filterLewd() = this.preferenceStore.getInt(Keys.filterLewd, ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value) - fun librarySortingMode() = flowPrefs.getObject(Keys.librarySortingMode, LibrarySort.Serializer, LibrarySort.default) + fun filterTracking(name: Int) = this.preferenceStore.getInt("${Keys.filterTracked}_$name", ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value) - fun migrationSortingMode() = flowPrefs.getEnum(Keys.migrationSortingMode, SetMigrateSorting.Mode.ALPHABETICAL) - fun migrationSortingDirection() = flowPrefs.getEnum(Keys.migrationSortingDirection, SetMigrateSorting.Direction.ASCENDING) + fun librarySortingMode() = this.preferenceStore.getObject(Keys.librarySortingMode, LibrarySort.default, LibrarySort.Serializer::serialize, LibrarySort.Serializer::deserialize) - fun automaticExtUpdates() = flowPrefs.getBoolean("automatic_ext_updates", true) + fun migrationSortingMode() = this.preferenceStore.getEnum(Keys.migrationSortingMode, SetMigrateSorting.Mode.ALPHABETICAL) + fun migrationSortingDirection() = this.preferenceStore.getEnum(Keys.migrationSortingDirection, SetMigrateSorting.Direction.ASCENDING) - fun showNsfwSource() = flowPrefs.getBoolean("show_nsfw_source", true) + fun automaticExtUpdates() = this.preferenceStore.getBoolean("automatic_ext_updates", true) - fun extensionUpdatesCount() = flowPrefs.getInt("ext_updates_count", 0) + fun showNsfwSource() = this.preferenceStore.getBoolean("show_nsfw_source", true) - fun lastAppCheck() = flowPrefs.getLong("last_app_check", 0) - fun lastExtCheck() = flowPrefs.getLong("last_ext_check", 0) + fun extensionUpdatesCount() = this.preferenceStore.getInt("ext_updates_count", 0) - fun searchPinnedSourcesOnly() = prefs.getBoolean(Keys.searchPinnedSourcesOnly, false) + fun lastAppCheck() = this.preferenceStore.getLong("last_app_check", 0) + fun lastExtCheck() = this.preferenceStore.getLong("last_ext_check", 0) - fun disabledSources() = flowPrefs.getStringSet("hidden_catalogues", emptySet()) + fun searchPinnedSourcesOnly() = this.preferenceStore.getBoolean(Keys.searchPinnedSourcesOnly, false) - fun pinnedSources() = flowPrefs.getStringSet("pinned_catalogues", emptySet()) + fun disabledSources() = this.preferenceStore.getStringSet("hidden_catalogues", emptySet()) - fun downloadNewChapters() = flowPrefs.getBoolean("download_new", false) + fun pinnedSources() = this.preferenceStore.getStringSet("pinned_catalogues", emptySet()) - fun downloadNewChapterCategories() = flowPrefs.getStringSet("download_new_categories", emptySet()) - fun downloadNewChapterCategoriesExclude() = flowPrefs.getStringSet("download_new_categories_exclude", emptySet()) + fun downloadNewChapters() = this.preferenceStore.getBoolean("download_new", false) - fun autoDownloadWhileReading() = flowPrefs.getInt("auto_download_while_reading", 0) + fun downloadNewChapterCategories() = this.preferenceStore.getStringSet("download_new_categories", emptySet()) + fun downloadNewChapterCategoriesExclude() = this.preferenceStore.getStringSet("download_new_categories_exclude", emptySet()) - fun defaultCategory() = prefs.getInt(Keys.defaultCategory, -1) + fun autoDownloadWhileReading() = this.preferenceStore.getInt("auto_download_while_reading", 0) - fun categorizedDisplaySettings() = flowPrefs.getBoolean("categorized_display", false) + fun defaultCategory() = this.preferenceStore.getInt(Keys.defaultCategory, -1) - fun skipRead() = prefs.getBoolean(Keys.skipRead, false) + fun categorizedDisplaySettings() = this.preferenceStore.getBoolean("categorized_display", false) - fun skipFiltered() = prefs.getBoolean(Keys.skipFiltered, true) + fun skipRead() = this.preferenceStore.getBoolean(Keys.skipRead, false) - fun migrateFlags() = flowPrefs.getInt("migrate_flags", Int.MAX_VALUE) + fun skipFiltered() = this.preferenceStore.getBoolean(Keys.skipFiltered, true) - fun trustedSignatures() = flowPrefs.getStringSet("trusted_signatures", emptySet()) + fun migrateFlags() = this.preferenceStore.getInt("migrate_flags", Int.MAX_VALUE) - fun dohProvider() = prefs.getInt(Keys.dohProvider, -1) + fun trustedSignatures() = this.preferenceStore.getStringSet("trusted_signatures", emptySet()) - fun defaultUserAgent() = flowPrefs.getString(Keys.defaultUserAgent, "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:104.0) Gecko/20100101 Firefox/104.0") + fun filterChapterByRead() = this.preferenceStore.getInt(Keys.defaultChapterFilterByRead, DomainManga.SHOW_ALL.toInt()) - fun filterChapterByRead() = prefs.getInt(Keys.defaultChapterFilterByRead, DomainManga.SHOW_ALL.toInt()) + fun filterChapterByDownloaded() = this.preferenceStore.getInt(Keys.defaultChapterFilterByDownloaded, DomainManga.SHOW_ALL.toInt()) - fun filterChapterByDownloaded() = prefs.getInt(Keys.defaultChapterFilterByDownloaded, DomainManga.SHOW_ALL.toInt()) + fun filterChapterByBookmarked() = this.preferenceStore.getInt(Keys.defaultChapterFilterByBookmarked, DomainManga.SHOW_ALL.toInt()) - fun filterChapterByBookmarked() = prefs.getInt(Keys.defaultChapterFilterByBookmarked, DomainManga.SHOW_ALL.toInt()) + fun sortChapterBySourceOrNumber() = this.preferenceStore.getInt(Keys.defaultChapterSortBySourceOrNumber, DomainManga.CHAPTER_SORTING_SOURCE.toInt()) - fun sortChapterBySourceOrNumber() = prefs.getInt(Keys.defaultChapterSortBySourceOrNumber, DomainManga.CHAPTER_SORTING_SOURCE.toInt()) + fun displayChapterByNameOrNumber() = this.preferenceStore.getInt(Keys.defaultChapterDisplayByNameOrNumber, DomainManga.CHAPTER_DISPLAY_NAME.toInt()) - fun displayChapterByNameOrNumber() = prefs.getInt(Keys.defaultChapterDisplayByNameOrNumber, DomainManga.CHAPTER_DISPLAY_NAME.toInt()) + fun sortChapterByAscendingOrDescending() = this.preferenceStore.getInt(Keys.defaultChapterSortByAscendingOrDescending, DomainManga.CHAPTER_SORT_DESC.toInt()) - fun sortChapterByAscendingOrDescending() = prefs.getInt(Keys.defaultChapterSortByAscendingOrDescending, DomainManga.CHAPTER_SORT_DESC.toInt()) + fun incognitoMode() = this.preferenceStore.getBoolean("incognito_mode", false) - fun incognitoMode() = flowPrefs.getBoolean("incognito_mode", false) + fun tabletUiMode() = this.preferenceStore.getEnum("tablet_ui_mode", Values.TabletUiMode.AUTOMATIC) - fun tabletUiMode() = flowPrefs.getEnum("tablet_ui_mode", Values.TabletUiMode.AUTOMATIC) - - fun extensionInstaller() = flowPrefs.getEnum( + fun extensionInstaller() = this.preferenceStore.getEnum( "extension_installer", if (DeviceUtil.isMiui) Values.ExtensionInstaller.LEGACY else Values.ExtensionInstaller.PACKAGEINSTALLER, ) - fun verboseLogging() = prefs.getBoolean(Keys.verboseLogging, isDevFlavor) + fun autoClearChapterCache() = this.preferenceStore.getBoolean(Keys.autoClearChapterCache, false) - fun autoClearChapterCache() = prefs.getBoolean(Keys.autoClearChapterCache, false) - - fun duplicatePinnedSources() = flowPrefs.getBoolean("duplicate_pinned_sources", false) + fun duplicatePinnedSources() = this.preferenceStore.getBoolean("duplicate_pinned_sources", false) fun setChapterSettingsDefault(manga: Manga) { - prefs.edit { - putInt(Keys.defaultChapterFilterByRead, manga.readFilter) - putInt(Keys.defaultChapterFilterByDownloaded, manga.downloadedFilter) - putInt(Keys.defaultChapterFilterByBookmarked, manga.bookmarkedFilter) - putInt(Keys.defaultChapterSortBySourceOrNumber, manga.sorting) - putInt(Keys.defaultChapterDisplayByNameOrNumber, manga.displayMode) - putInt(Keys.defaultChapterSortByAscendingOrDescending, if (manga.sortDescending()) DomainManga.CHAPTER_SORT_DESC.toInt() else DomainManga.CHAPTER_SORT_ASC.toInt()) - } + filterChapterByRead().set(manga.readFilter) + filterChapterByDownloaded().set(manga.downloadedFilter) + filterChapterByBookmarked().set(manga.bookmarkedFilter) + sortChapterBySourceOrNumber().set(manga.sorting) + displayChapterByNameOrNumber().set(manga.displayMode) + sortChapterByAscendingOrDescending().set(if (manga.sortDescending()) DomainManga.CHAPTER_SORT_DESC.toInt() else DomainManga.CHAPTER_SORT_ASC.toInt()) } // SY --> - fun defaultMangaOrder() = flowPrefs.getString("default_manga_order", "") + fun defaultMangaOrder() = this.preferenceStore.getString("default_manga_order", "") - fun migrationSources() = flowPrefs.getString("migrate_sources", "") + fun migrationSources() = this.preferenceStore.getString("migrate_sources", "") - fun smartMigration() = flowPrefs.getBoolean("smart_migrate", false) + fun smartMigration() = this.preferenceStore.getBoolean("smart_migrate", false) - fun useSourceWithMost() = flowPrefs.getBoolean("use_source_with_most", false) + fun useSourceWithMost() = this.preferenceStore.getBoolean("use_source_with_most", false) - fun skipPreMigration() = flowPrefs.getBoolean("skip_pre_migration", false) + fun skipPreMigration() = this.preferenceStore.getBoolean("skip_pre_migration", false) - fun hideNotFoundMigration() = flowPrefs.getBoolean("hide_not_found_migration", false) + fun hideNotFoundMigration() = this.preferenceStore.getBoolean("hide_not_found_migration", false) - fun isHentaiEnabled() = flowPrefs.getBoolean("eh_is_hentai_enabled", true) + fun isHentaiEnabled() = this.preferenceStore.getBoolean("eh_is_hentai_enabled", true) - fun enableExhentai() = flowPrefs.getBoolean("enable_exhentai", false) + fun enableExhentai() = this.preferenceStore.getBoolean("enable_exhentai", false) - fun imageQuality() = flowPrefs.getString("ehentai_quality", "auto") + fun imageQuality() = this.preferenceStore.getString("ehentai_quality", "auto") - fun useHentaiAtHome() = flowPrefs.getInt("eh_enable_hah", 0) + fun useHentaiAtHome() = this.preferenceStore.getInt("eh_enable_hah", 0) - fun useJapaneseTitle() = flowPrefs.getBoolean("use_jp_title", false) + fun useJapaneseTitle() = this.preferenceStore.getBoolean("use_jp_title", false) - fun exhUseOriginalImages() = flowPrefs.getBoolean("eh_useOrigImages", false) + fun exhUseOriginalImages() = this.preferenceStore.getBoolean("eh_useOrigImages", false) - fun ehTagFilterValue() = flowPrefs.getInt("eh_tag_filtering_value", 0) + fun ehTagFilterValue() = this.preferenceStore.getInt("eh_tag_filtering_value", 0) - fun ehTagWatchingValue() = flowPrefs.getInt("eh_tag_watching_value", 0) + fun ehTagWatchingValue() = this.preferenceStore.getInt("eh_tag_watching_value", 0) // EH Cookies - fun memberIdVal() = flowPrefs.getString("eh_ipb_member_id", "") + fun memberIdVal() = this.preferenceStore.getString("eh_ipb_member_id", "") - fun passHashVal() = flowPrefs.getString("eh_ipb_pass_hash", "") - fun igneousVal() = flowPrefs.getString("eh_igneous", "") - fun ehSettingsProfile() = flowPrefs.getInt("eh_ehSettingsProfile", -1) - fun exhSettingsProfile() = flowPrefs.getInt("eh_exhSettingsProfile", -1) - fun exhSettingsKey() = flowPrefs.getString("eh_settingsKey", "") - fun exhSessionCookie() = flowPrefs.getString("eh_sessionCookie", "") - fun exhHathPerksCookies() = flowPrefs.getString("eh_hathPerksCookie", "") + fun passHashVal() = this.preferenceStore.getString("eh_ipb_pass_hash", "") + fun igneousVal() = this.preferenceStore.getString("eh_igneous", "") + fun ehSettingsProfile() = this.preferenceStore.getInt("eh_ehSettingsProfile", -1) + fun exhSettingsProfile() = this.preferenceStore.getInt("eh_exhSettingsProfile", -1) + fun exhSettingsKey() = this.preferenceStore.getString("eh_settingsKey", "") + fun exhSessionCookie() = this.preferenceStore.getString("eh_sessionCookie", "") + fun exhHathPerksCookies() = this.preferenceStore.getString("eh_hathPerksCookie", "") - fun exhShowSyncIntro() = flowPrefs.getBoolean("eh_show_sync_intro", true) + fun exhShowSyncIntro() = this.preferenceStore.getBoolean("eh_show_sync_intro", true) - fun exhReadOnlySync() = flowPrefs.getBoolean("eh_sync_read_only", false) + fun exhReadOnlySync() = this.preferenceStore.getBoolean("eh_sync_read_only", false) - fun exhLenientSync() = flowPrefs.getBoolean("eh_lenient_sync", false) + fun exhLenientSync() = this.preferenceStore.getBoolean("eh_lenient_sync", false) - fun exhShowSettingsUploadWarning() = flowPrefs.getBoolean("eh_showSettingsUploadWarning2", true) + fun exhShowSettingsUploadWarning() = this.preferenceStore.getBoolean("eh_showSettingsUploadWarning2", true) - fun expandFilters() = flowPrefs.getBoolean("eh_expand_filters", false) + fun expandFilters() = this.preferenceStore.getBoolean("eh_expand_filters", false) - fun readerThreads() = flowPrefs.getInt("eh_reader_threads", 2) + fun readerThreads() = this.preferenceStore.getInt("eh_reader_threads", 2) - fun readerInstantRetry() = flowPrefs.getBoolean("eh_reader_instant_retry", true) + fun readerInstantRetry() = this.preferenceStore.getBoolean("eh_reader_instant_retry", true) - fun autoscrollInterval() = flowPrefs.getFloat("eh_util_autoscroll_interval", 3f) + fun autoscrollInterval() = this.preferenceStore.getFloat("eh_util_autoscroll_interval", 3f) - fun cacheSize() = flowPrefs.getString("eh_cache_size", "75") + fun cacheSize() = this.preferenceStore.getString("eh_cache_size", "75") - fun preserveReadingPosition() = flowPrefs.getBoolean("eh_preserve_reading_position", false) + fun preserveReadingPosition() = this.preferenceStore.getBoolean("eh_preserve_reading_position", false) - fun autoSolveCaptcha() = flowPrefs.getBoolean("eh_autosolve_captchas", false) + fun autoSolveCaptcha() = this.preferenceStore.getBoolean("eh_autosolve_captchas", false) - fun delegateSources() = flowPrefs.getBoolean("eh_delegate_sources", true) + fun ehLastVersionCode() = this.preferenceStore.getInt("eh_last_version_code", 0) - fun ehLastVersionCode() = flowPrefs.getInt("eh_last_version_code", 0) + fun logLevel() = this.preferenceStore.getInt(Keys.eh_logLevel, 0) - fun logLevel() = flowPrefs.getInt(Keys.eh_logLevel, 0) + fun enableSourceBlacklist() = this.preferenceStore.getBoolean("eh_enable_source_blacklist", true) - fun enableSourceBlacklist() = flowPrefs.getBoolean("eh_enable_source_blacklist", true) + fun exhAutoUpdateFrequency() = this.preferenceStore.getInt("eh_auto_update_frequency", 1) - fun exhAutoUpdateFrequency() = flowPrefs.getInt("eh_auto_update_frequency", 1) + fun exhAutoUpdateRequirements() = this.preferenceStore.getStringSet("eh_auto_update_restrictions", emptySet()) - fun exhAutoUpdateRequirements() = flowPrefs.getStringSet("eh_auto_update_restrictions", emptySet()) + fun exhAutoUpdateStats() = this.preferenceStore.getString("eh_auto_update_stats", "") - fun exhAutoUpdateStats() = flowPrefs.getString("eh_auto_update_stats", "") + fun aggressivePageLoading() = this.preferenceStore.getBoolean("eh_aggressive_page_loading", false) - fun aggressivePageLoading() = flowPrefs.getBoolean("eh_aggressive_page_loading", false) + fun preloadSize() = this.preferenceStore.getInt("eh_preload_size", 10) - fun preloadSize() = flowPrefs.getInt("eh_preload_size", 10) + fun useAutoWebtoon() = this.preferenceStore.getBoolean("eh_use_auto_webtoon", true) - fun useAutoWebtoon() = flowPrefs.getBoolean("eh_use_auto_webtoon", true) + fun exhWatchedListDefaultState() = this.preferenceStore.getBoolean("eh_watched_list_default_state", false) - fun exhWatchedListDefaultState() = flowPrefs.getBoolean("eh_watched_list_default_state", false) - - fun exhSettingsLanguages() = flowPrefs.getString( + fun exhSettingsLanguages() = this.preferenceStore.getString( "eh_settings_languages", "false*false*false\nfalse*false*false\nfalse*false*false\nfalse*false*false\nfalse*false*false\nfalse*false*false\nfalse*false*false\nfalse*false*false\nfalse*false*false\nfalse*false*false\nfalse*false*false\nfalse*false*false\nfalse*false*false\nfalse*false*false\nfalse*false*false\nfalse*false*false\nfalse*false*false", ) - fun exhEnabledCategories() = flowPrefs.getString( + fun exhEnabledCategories() = this.preferenceStore.getString( "eh_enabled_categories", "false,false,false,false,false,false,false,false,false,false", ) - fun feedTabInFront() = flowPrefs.getBoolean("latest_tab_position", false) + fun feedTabInFront() = this.preferenceStore.getBoolean("latest_tab_position", false) - fun sourcesTabCategories() = flowPrefs.getStringSet("sources_tab_categories", mutableSetOf()) + fun sourcesTabCategories() = this.preferenceStore.getStringSet("sources_tab_categories", mutableSetOf()) - fun sourcesTabCategoriesFilter() = flowPrefs.getBoolean("sources_tab_categories_filter", false) + fun sourcesTabCategoriesFilter() = this.preferenceStore.getBoolean("sources_tab_categories_filter", false) - fun sourcesTabSourcesInCategories() = flowPrefs.getStringSet("sources_tab_source_categories", mutableSetOf()) + fun sourcesTabSourcesInCategories() = this.preferenceStore.getStringSet("sources_tab_source_categories", mutableSetOf()) - fun sourceSorting() = flowPrefs.getInt("sources_sort", 0) + fun sourceSorting() = this.preferenceStore.getInt("sources_sort", 0) - fun recommendsInOverflow() = flowPrefs.getBoolean("recommends_in_overflow", false) + fun recommendsInOverflow() = this.preferenceStore.getBoolean("recommends_in_overflow", false) - fun mergeInOverflow() = flowPrefs.getBoolean("merge_in_overflow", false) + fun mergeInOverflow() = this.preferenceStore.getBoolean("merge_in_overflow", false) - fun enhancedEHentaiView() = flowPrefs.getBoolean("enhanced_e_hentai_view", true) + fun enhancedEHentaiView() = this.preferenceStore.getBoolean("enhanced_e_hentai_view", true) - fun webtoonEnableZoomOut() = flowPrefs.getBoolean("webtoon_enable_zoom_out", false) + fun webtoonEnableZoomOut() = this.preferenceStore.getBoolean("webtoon_enable_zoom_out", false) - fun startReadingButton() = flowPrefs.getBoolean("start_reading_button", true) + fun startReadingButton() = this.preferenceStore.getBoolean("start_reading_button", true) - fun groupLibraryBy() = flowPrefs.getInt("group_library_by", LibraryGroup.BY_DEFAULT) + fun groupLibraryBy() = this.preferenceStore.getInt("group_library_by", LibraryGroup.BY_DEFAULT) - fun continuousVerticalTappingByPage() = flowPrefs.getBoolean("continuous_vertical_tapping_by_page", false) + fun continuousVerticalTappingByPage() = this.preferenceStore.getBoolean("continuous_vertical_tapping_by_page", false) - fun groupLibraryUpdateType() = flowPrefs.getEnum("group_library_update_type", Values.GroupLibraryMode.GLOBAL) + fun groupLibraryUpdateType() = this.preferenceStore.getEnum("group_library_update_type", Values.GroupLibraryMode.GLOBAL) - fun useNewSourceNavigation() = flowPrefs.getBoolean("use_new_source_navigation", true) + fun useNewSourceNavigation() = this.preferenceStore.getBoolean("use_new_source_navigation", true) - fun preferredMangaDexId() = flowPrefs.getString("preferred_mangaDex_id", "0") + fun preferredMangaDexId() = this.preferenceStore.getString("preferred_mangaDex_id", "0") - fun mangadexSyncToLibraryIndexes() = flowPrefs.getStringSet("pref_mangadex_sync_to_library_indexes", emptySet()) + fun mangadexSyncToLibraryIndexes() = this.preferenceStore.getStringSet("pref_mangadex_sync_to_library_indexes", emptySet()) - fun dataSaver() = flowPrefs.getBoolean("data_saver", false) + fun dataSaver() = this.preferenceStore.getBoolean("data_saver", false) - fun dataSaverIgnoreJpeg() = flowPrefs.getBoolean("ignore_jpeg", false) + fun dataSaverIgnoreJpeg() = this.preferenceStore.getBoolean("ignore_jpeg", false) - fun dataSaverIgnoreGif() = flowPrefs.getBoolean("ignore_gif", true) + fun dataSaverIgnoreGif() = this.preferenceStore.getBoolean("ignore_gif", true) - fun dataSaverImageQuality() = flowPrefs.getInt("data_saver_image_quality", 80) + fun dataSaverImageQuality() = this.preferenceStore.getInt("data_saver_image_quality", 80) - fun dataSaverImageFormatJpeg() = flowPrefs.getBoolean("data_saver_image_format_jpeg", false) + fun dataSaverImageFormatJpeg() = this.preferenceStore.getBoolean("data_saver_image_format_jpeg", false) - fun dataSaverServer() = flowPrefs.getString("data_saver_server", "") + fun dataSaverServer() = this.preferenceStore.getString("data_saver_server", "") - fun dataSaverColorBW() = flowPrefs.getBoolean("data_saver_color_bw", false) + fun dataSaverColorBW() = this.preferenceStore.getBoolean("data_saver_color_bw", false) - fun dataSaverExcludedSources() = flowPrefs.getStringSet("data_saver_excluded", emptySet()) + fun dataSaverExcludedSources() = this.preferenceStore.getStringSet("data_saver_excluded", emptySet()) - fun dataSaverDownloader() = flowPrefs.getBoolean("data_saver_downloader", true) + fun dataSaverDownloader() = this.preferenceStore.getBoolean("data_saver_downloader", true) - fun allowLocalSourceHiddenFolders() = flowPrefs.getBoolean("allow_local_source_hidden_folders", false) + fun allowLocalSourceHiddenFolders() = this.preferenceStore.getBoolean("allow_local_source_hidden_folders", false) - fun authenticatorTimeRanges() = flowPrefs.getStringSet("biometric_time_ranges", mutableSetOf()) + fun authenticatorTimeRanges() = this.preferenceStore.getStringSet("biometric_time_ranges", mutableSetOf()) - fun authenticatorDays() = flowPrefs.getInt("biometric_days", 0x7F) + fun authenticatorDays() = this.preferenceStore.getInt("biometric_days", 0x7F) - fun sortTagsForLibrary() = flowPrefs.getStringSet("sort_tags_for_library", mutableSetOf()) + fun sortTagsForLibrary() = this.preferenceStore.getStringSet("sort_tags_for_library", mutableSetOf()) - fun extensionRepos() = flowPrefs.getStringSet("extension_repos", emptySet()) + fun extensionRepos() = this.preferenceStore.getStringSet("extension_repos", emptySet()) - fun cropBordersContinuousVertical() = flowPrefs.getBoolean("crop_borders_continues_vertical", false) + fun cropBordersContinuousVertical() = this.preferenceStore.getBoolean("crop_borders_continues_vertical", false) - fun forceHorizontalSeekbar() = flowPrefs.getBoolean("pref_force_horz_seekbar", false) + fun forceHorizontalSeekbar() = this.preferenceStore.getBoolean("pref_force_horz_seekbar", false) - fun landscapeVerticalSeekbar() = flowPrefs.getBoolean("pref_show_vert_seekbar_landscape", false) + fun landscapeVerticalSeekbar() = this.preferenceStore.getBoolean("pref_show_vert_seekbar_landscape", false) - fun leftVerticalSeekbar() = flowPrefs.getBoolean("pref_left_handed_vertical_seekbar", false) + fun leftVerticalSeekbar() = this.preferenceStore.getBoolean("pref_left_handed_vertical_seekbar", false) - fun readerBottomButtons() = flowPrefs.getStringSet("reader_bottom_buttons", ReaderBottomButton.BUTTONS_DEFAULTS) + fun readerBottomButtons() = this.preferenceStore.getStringSet("reader_bottom_buttons", ReaderBottomButton.BUTTONS_DEFAULTS) - fun bottomBarLabels() = flowPrefs.getBoolean("pref_show_bottom_bar_labels", true) + fun bottomBarLabels() = this.preferenceStore.getBoolean("pref_show_bottom_bar_labels", true) - fun showNavUpdates() = flowPrefs.getBoolean("pref_show_updates_button", true) + fun showNavUpdates() = this.preferenceStore.getBoolean("pref_show_updates_button", true) - fun showNavHistory() = flowPrefs.getBoolean("pref_show_history_button", true) + fun showNavHistory() = this.preferenceStore.getBoolean("pref_show_history_button", true) - fun pageLayout() = flowPrefs.getInt("page_layout", PagerConfig.PageLayout.AUTOMATIC) + fun pageLayout() = this.preferenceStore.getInt("page_layout", PagerConfig.PageLayout.AUTOMATIC) - fun centerMarginType() = flowPrefs.getInt("center_margin_type", PagerConfig.CenterMarginType.NONE) + fun centerMarginType() = this.preferenceStore.getInt("center_margin_type", PagerConfig.CenterMarginType.NONE) - fun invertDoublePages() = flowPrefs.getBoolean("invert_double_pages", false) + fun invertDoublePages() = this.preferenceStore.getBoolean("invert_double_pages", false) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackService.kt index 4bdbfc851..bc918ca02 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackService.kt @@ -69,9 +69,9 @@ abstract class TrackService(val id: Long) { get() = getUsername().isNotEmpty() && getPassword().isNotEmpty() - fun getUsername() = preferences.trackUsername(this)!! + fun getUsername() = preferences.trackUsername(this).get() - fun getPassword() = preferences.trackPassword(this)!! + fun getPassword() = preferences.trackPassword(this).get() fun saveCredentials(username: String, password: String) { preferences.setTrackCredentials(this, username, password) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates.kt index 8c64ba4c8..f64b90088 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates.kt @@ -99,6 +99,6 @@ class MangaUpdates(private val context: Context, id: Long) : TrackService(id) { } fun restoreSession(): String? { - return preferences.trackPassword(this) + return preferences.trackPassword(this).get() } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt index 4a73e6274..0dca5b91a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt @@ -233,7 +233,7 @@ class ExtensionManager( .map(AvailableSources::lang) val deviceLanguage = Locale.getDefault().language - val defaultLanguages = preferences.enabledLanguages().defaultValue + val defaultLanguages = preferences.enabledLanguages().defaultValue() val languagesToEnable = availableLanguages.filter { it != deviceLanguage && it.startsWith(deviceLanguage) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/SourceManager.kt b/app/src/main/java/eu/kanade/tachiyomi/source/SourceManager.kt index 440fd47c0..6057d773a 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/source/SourceManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/SourceManager.kt @@ -79,7 +79,7 @@ class SourceManager( scope.launch { extensionManager.getInstalledExtensionsFlow() // SY --> - .combine(preferences.enableExhentai().asFlow()) { extensions, enableExhentai -> + .combine(preferences.enableExhentai().changes()) { extensions, enableExhentai -> extensions to enableExhentai } // SY <-- @@ -133,7 +133,6 @@ class SourceManager( val enhancedSource = EnhancedHttpSource( this, delegate.newSourceClass.constructors.find { it.parameters.size == 2 }!!.call(this, context), - ::delegateSources, ) currentDelegatedSources[enhancedSource.originalSource.id] = DelegatedSource( @@ -157,8 +156,6 @@ class SourceManager( // EXH <-- } - private fun delegateSources() = preferences.delegateSources().get() - fun get(sourceKey: Long): Source? { return sourcesMap[sourceKey] } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate.kt index 7fca13c54..92fe1cba6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/base/delegate/SecureActivityDelegate.kt @@ -105,8 +105,8 @@ class SecureActivityDelegateImpl : SecureActivityDelegate, DefaultLifecycleObser } private fun setSecureScreen() { - val secureScreenFlow = preferences.secureScreen().asFlow() - val incognitoModeFlow = preferences.incognitoMode().asFlow() + val secureScreenFlow = preferences.secureScreen().changes() + val incognitoModeFlow = preferences.incognitoMode().changes() combine(secureScreenFlow, incognitoModeFlow) { secureScreen, incognitoMode -> secureScreen == PreferenceValues.SecureScreenMode.ALWAYS || secureScreen == PreferenceValues.SecureScreenMode.INCOGNITO && incognitoMode diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/base/presenter/BasePresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/base/presenter/BasePresenter.kt index f1da3b693..edc2a7752 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/base/presenter/BasePresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/base/presenter/BasePresenter.kt @@ -1,8 +1,8 @@ package eu.kanade.tachiyomi.ui.base.presenter import android.os.Bundle -import com.fredporciuncula.flow.preferences.Preference import eu.kanade.core.prefs.PreferenceMutableState +import eu.kanade.tachiyomi.core.preference.Preference import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope import kotlinx.coroutines.cancel diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionsPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionsPresenter.kt index a4868a703..acc8bb97d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionsPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/extension/ExtensionsPresenter.kt @@ -123,7 +123,7 @@ class ExtensionsPresenter( presenterScope.launchIO { findAvailableExtensions() } - preferences.extensionUpdatesCount().asFlow() + preferences.extensionUpdatesCount().changes() .onEach { state.updates = it } .launchIn(presenterScope) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/MigrationBottomSheetDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/MigrationBottomSheetDialog.kt index c5b0ac46c..970371f0a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/MigrationBottomSheetDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/design/MigrationBottomSheetDialog.kt @@ -10,9 +10,9 @@ import android.widget.RadioButton import android.widget.RadioGroup import android.widget.Toast import androidx.core.view.isVisible -import com.fredporciuncula.flow.preferences.Preference import com.google.android.material.bottomsheet.BottomSheetBehavior import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.core.preference.Preference import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.databinding.MigrationBottomSheetBinding import eu.kanade.tachiyomi.ui.browse.migration.MigrationFlags diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/MigrationSourcesPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/MigrationSourcesPresenter.kt index c8754b43d..b543c24fb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/MigrationSourcesPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/sources/MigrationSourcesPresenter.kt @@ -42,11 +42,11 @@ class MigrationSourcesPresenter( } } - preferences.migrationSortingDirection().asFlow() + preferences.migrationSortingDirection().changes() .onEach { state.sortingDirection = it } .launchIn(presenterScope) - preferences.migrationSortingMode().asFlow() + preferences.migrationSortingMode().changes() .onEach { state.sortingMode = it } .launchIn(presenterScope) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt index e54e76169..b2512f324 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourcePresenter.kt @@ -147,7 +147,7 @@ open class BrowseSourcePresenter( val isLandscape = LocalConfiguration.current.orientation == Configuration.ORIENTATION_LANDSCAPE return produceState(initialValue = GridCells.Adaptive(128.dp), isLandscape) { (if (isLandscape) preferences.landscapeColumns() else preferences.portraitColumns()) - .asFlow() + .changes() .collectLatest { columns -> value = if (columns == 0) GridCells.Adaptive(128.dp) else GridCells.Fixed(columns) } @@ -342,7 +342,7 @@ open class BrowseSourcePresenter( fun addFavorite(manga: DomainManga) { presenterScope.launch { val categories = getCategories() - val defaultCategoryId = preferences.defaultCategory() + val defaultCategoryId = preferences.defaultCategory().get() val defaultCategory = categories.find { it.id == defaultCategoryId.toLong() } when { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchController.kt index 57dbfd815..c5bab14c4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchController.kt @@ -180,7 +180,7 @@ open class GlobalSearchController( * @param searchResult result of search. */ fun setItems(searchResult: List) { - if (searchResult.isEmpty() && preferences.searchPinnedSourcesOnly()) { + if (searchResult.isEmpty() && preferences.searchPinnedSourcesOnly().get()) { binding.emptyView.show(R.string.no_pinned_sources) } else { binding.emptyView.hide() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchPresenter.kt index 196961c4f..4b34e1a14 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/globalsearch/GlobalSearchPresenter.kt @@ -125,7 +125,7 @@ open class GlobalSearchPresenter( return filteredSources } - val onlyPinnedSources = preferences.searchPinnedSourcesOnly() + val onlyPinnedSources = preferences.searchPinnedSourcesOnly().get() val pinnedSourceIds = preferences.pinnedSources().get() return enabledSources diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesPresenter.kt index fb8209f8d..e383c28fb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/BiometricTimesPresenter.kt @@ -30,7 +30,7 @@ class BiometricTimesPresenter( super.onCreate(savedState) presenterScope.launchIO { // todo usecase - preferences.authenticatorTimeRanges().asFlow() + preferences.authenticatorTimeRanges().changes() .collectLatest { val context = view?.activity ?: Injekt.get() state.isLoading = false diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt index 468f88a96..838aa2aea 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt @@ -200,9 +200,9 @@ class LibraryPresenter( // SY --> combine( - preferences.isHentaiEnabled().asFlow(), - preferences.disabledSources().asFlow(), - preferences.enableExhentai().asFlow(), + preferences.isHentaiEnabled().changes(), + preferences.disabledSources().changes(), + preferences.enableExhentai().changes(), ) { isHentaiEnabled, disabledSources, enableExhentai -> state.showSyncExh = isHentaiEnabled && (EH_SOURCE_ID.toString() !in disabledSources || enableExhentai) }.flowOn(Dispatchers.IO).launchIn(presenterScope) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/setting/LibraryDisplayMode.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/setting/LibraryDisplayMode.kt index 5f5b0b15b..bcb0d7bd5 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/setting/LibraryDisplayMode.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/setting/LibraryDisplayMode.kt @@ -1,7 +1,6 @@ package eu.kanade.tachiyomi.ui.library.setting import eu.kanade.domain.category.model.Category -import com.fredporciuncula.flow.preferences.Serializer as PreferencesSerializer sealed class LibraryDisplayMode( override val flag: Long, @@ -14,12 +13,12 @@ sealed class LibraryDisplayMode( object List : LibraryDisplayMode(0b00000010) object CoverOnlyGrid : LibraryDisplayMode(0b00000011) - object Serializer : PreferencesSerializer { - override fun deserialize(serialized: String): LibraryDisplayMode { + object Serializer { + fun deserialize(serialized: String): LibraryDisplayMode { return LibraryDisplayMode.deserialize(serialized) } - override fun serialize(value: LibraryDisplayMode): String { + fun serialize(value: LibraryDisplayMode): String { return value.serialize() } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/setting/LibrarySort.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/setting/LibrarySort.kt index f5b4c4c24..e8e5dfcd4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/setting/LibrarySort.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/setting/LibrarySort.kt @@ -1,7 +1,6 @@ package eu.kanade.tachiyomi.ui.library.setting import eu.kanade.domain.category.model.Category -import com.fredporciuncula.flow.preferences.Serializer as PreferencesSerializer data class LibrarySort( val type: Type, @@ -61,12 +60,12 @@ data class LibrarySort( } } - object Serializer : PreferencesSerializer { - override fun deserialize(serialized: String): LibrarySort { + object Serializer { + fun deserialize(serialized: String): LibrarySort { return LibrarySort.deserialize(serialized) } - override fun serialize(value: LibrarySort): String { + fun serialize(value: LibrarySort): String { return value.serialize() } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt index 5c28d9851..bb2acdcb1 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt @@ -79,6 +79,8 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onEach import logcat.LogPriority +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy import java.util.LinkedList @@ -132,7 +134,15 @@ class MainActivity : BaseActivity() { super.onCreate(savedInstanceState) - val didMigration = if (savedInstanceState == null) EXHMigrations.upgrade(preferences) else false + val didMigration = if (savedInstanceState == null) { + EXHMigrations.upgrade( + context = applicationContext, + preferences = preferences, + networkPreferences = Injekt.get(), + ) + } else { + false + } binding = MainActivityBinding.inflate(layoutInflater) @@ -288,7 +298,7 @@ class MainActivity : BaseActivity() { } // SY --> - merge(preferences.showUpdatesNavBadge().asFlow(), preferences.unreadUpdatesCount().asFlow()) + merge(preferences.showUpdatesNavBadge().changes(), preferences.unreadUpdatesCount().changes()) .onEach { setUnreadUpdatesBadge() } .launchIn(lifecycleScope) @@ -301,7 +311,7 @@ class MainActivity : BaseActivity() { .launchIn(lifecycleScope) binding.incognitoMode.isVisible = preferences.incognitoMode().get() - preferences.incognitoMode().asFlow() + preferences.incognitoMode().changes() .drop(1) .onEach { binding.incognitoMode.isVisible = it @@ -544,7 +554,7 @@ class MainActivity : BaseActivity() { lifecycleScope.launchUI { resetExitConfirmation() } } else if (backstackSize == 1 || !router.handleBack()) { // Regular back (i.e. closing the app) - if (preferences.autoClearChapterCache()) { + if (preferences.autoClearChapterCache().get()) { chapterCache.clear() } super.onBackPressed() @@ -588,7 +598,7 @@ class MainActivity : BaseActivity() { private fun shouldHandleExitConfirmation(): Boolean { return router.backstackSize == 1 && router.getControllerWithTag("$startScreenId") != null && - preferences.confirmExit() && + preferences.confirmExit().get() && !isConfirmingExit } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt index 5440de08e..28a961858 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt @@ -686,7 +686,7 @@ class MangaPresenter( // Now check if user previously set categories, when available val categories = getCategories() - val defaultCategoryId = preferences.defaultCategory().toLong() + val defaultCategoryId = preferences.defaultCategory().get().toLong() val defaultCategory = categories.find { it.id == defaultCategoryId } when { // Default category set diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt index 536fef4cc..8fdc4a870 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderActivity.kt @@ -246,7 +246,7 @@ class ReaderActivity : BaseRxActivity() { initializeMenu() // Finish when incognito mode is disabled - preferences.incognitoMode().asFlow() + preferences.incognitoMode().changes() .drop(1) .onEach { if (!it) finish() } .launchIn(lifecycleScope) @@ -561,7 +561,7 @@ class ReaderActivity : BaseRxActivity() { presenter.setMangaReadingMode(newReadingMode.flagValue) menuToggleToast?.cancel() - if (!preferences.showReadingMode()) { + if (!preferences.showReadingMode().get()) { menuToggleToast = toast(newReadingMode.stringRes) } @@ -604,7 +604,7 @@ class ReaderActivity : BaseRxActivity() { updateCropBordersShortcut() listOf(preferences.cropBorders(), preferences.cropBordersWebtoon() /* SY --> */, preferences.cropBordersContinuousVertical()/* SY <-- */) .forEach { pref -> - pref.asFlow() + pref.changes() .onEach { updateCropBordersShortcut() } .launchIn(lifecycleScope) } @@ -617,7 +617,7 @@ class ReaderActivity : BaseRxActivity() { popupMenu( items = OrientationType.values().map { it.flagValue to it.stringRes }, selectedItemId = presenter.manga?.orientationType - ?: preferences.defaultOrientationType(), + ?: preferences.defaultOrientationType().get(), ) { val newOrientation = OrientationType.fromPreference(itemId) @@ -1079,7 +1079,7 @@ class ReaderActivity : BaseRxActivity() { if (preferences.useAutoWebtoon().get() && manga.readingModeType == ReadingModeType.DEFAULT.flagValue && defaultReaderType != null && defaultReaderType == ReadingModeType.WEBTOON.prefValue) { readingModeToast?.cancel() readingModeToast = toast(resources.getString(R.string.eh_auto_webtoon_snack)) - } else if (preferences.showReadingMode()) { + } else if (preferences.showReadingMode().get()) { // SY <-- showReadingModeToast(presenter.getMangaReadingMode()) } @@ -1510,7 +1510,7 @@ class ReaderActivity : BaseRxActivity() { * Initializes the reader subscriptions. */ init { - preferences.readerTheme().asFlow() + preferences.readerTheme().changes() .onEach { binding.readerContainer.setBackgroundResource( when (preferences.readerTheme().get()) { @@ -1523,41 +1523,41 @@ class ReaderActivity : BaseRxActivity() { } .launchIn(lifecycleScope) - preferences.showPageNumber().asFlow() + preferences.showPageNumber().changes() .onEach { setPageNumberVisibility(it) } .launchIn(lifecycleScope) - preferences.trueColor().asFlow() + preferences.trueColor().changes() .onEach { setTrueColor(it) } .launchIn(lifecycleScope) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - preferences.cutoutShort().asFlow() + preferences.cutoutShort().changes() .onEach { setCutoutShort(it) } .launchIn(lifecycleScope) } - preferences.keepScreenOn().asFlow() + preferences.keepScreenOn().changes() .onEach { setKeepScreenOn(it) } .launchIn(lifecycleScope) - preferences.customBrightness().asFlow() + preferences.customBrightness().changes() .onEach { setCustomBrightness(it) } .launchIn(lifecycleScope) - preferences.colorFilter().asFlow() + preferences.colorFilter().changes() .onEach { setColorFilter(it) } .launchIn(lifecycleScope) - preferences.colorFilterMode().asFlow() + preferences.colorFilterMode().changes() .onEach { setColorFilter(preferences.colorFilter().get()) } .launchIn(lifecycleScope) - merge(preferences.grayscale().asFlow(), preferences.invertedColors().asFlow()) + merge(preferences.grayscale().changes(), preferences.invertedColors().changes()) .onEach { setLayerPaint(preferences.grayscale().get(), preferences.invertedColors().get()) } .launchIn(lifecycleScope) - preferences.fullscreen().asFlow() + preferences.fullscreen().changes() .onEach { WindowCompat.setDecorFitsSystemWindows(window, !it) updateViewerInset(it) @@ -1565,12 +1565,12 @@ class ReaderActivity : BaseRxActivity() { .launchIn(lifecycleScope) // SY --> - preferences.pageLayout().asFlow() + preferences.pageLayout().changes() .drop(1) .onEach { updateBottomButtons() } .launchIn(lifecycleScope) - preferences.dualPageSplitPaged().asFlow() + preferences.dualPageSplitPaged().changes() .drop(1) .onEach { if (viewer !is PagerViewer) return@onEach @@ -1644,7 +1644,7 @@ class ReaderActivity : BaseRxActivity() { */ private fun setCustomBrightness(enabled: Boolean) { if (enabled) { - preferences.customBrightnessValue().asFlow() + preferences.customBrightnessValue().changes() .sample(100) .onEach { setCustomBrightnessValue(it) } .launchIn(lifecycleScope) @@ -1658,7 +1658,7 @@ class ReaderActivity : BaseRxActivity() { */ private fun setColorFilter(enabled: Boolean) { if (enabled) { - preferences.colorFilterValue().asFlow() + preferences.colorFilterValue().changes() .sample(100) .onEach { setColorFilterValue(it) } .launchIn(lifecycleScope) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt index 7a7ba7f81..b4558028c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderPresenter.kt @@ -183,11 +183,11 @@ class ReaderPresenter( ?: error("Requested chapter of id $chapterId not found in chapter list") val chaptersForReader = when { - (preferences.skipRead() || preferences.skipFiltered()) -> { + (preferences.skipRead().get() || preferences.skipFiltered().get()) -> { val filteredChapters = chapters.filterNot { when { - preferences.skipRead() && it.read -> true - preferences.skipFiltered() -> { + preferences.skipRead().get() && it.read -> true + preferences.skipFiltered().get() -> { (manga.readFilter == DomainManga.CHAPTER_SHOW_READ.toInt() && !it.read) || (manga.readFilter == DomainManga.CHAPTER_SHOW_UNREAD.toInt() && it.read) || (manga.downloadedFilter == DomainManga.CHAPTER_SHOW_DOWNLOADED.toInt() && !downloadManager.isChapterDownloaded(it.name, it.scanlator, manga.title, manga.source)) || @@ -603,7 +603,7 @@ class ReaderPresenter( private fun deleteChapterIfNeeded(currentChapter: ReaderChapter) { // Determine which chapter should be deleted and enqueue val currentChapterPosition = chapterList.indexOf(currentChapter) - val removeAfterReadSlots = preferences.removeAfterReadSlots() + val removeAfterReadSlots = preferences.removeAfterReadSlots().get() val chapterToDelete = chapterList.getOrNull(currentChapterPosition - removeAfterReadSlots) if (removeAfterReadSlots != 0 && chapterDownload != null) { @@ -735,7 +735,7 @@ class ReaderPresenter( * Returns the viewer position used by this manga or the default one. */ fun getMangaReadingMode(resolveDefault: Boolean = true): Int { - val default = preferences.defaultReadingMode() + val default = preferences.defaultReadingMode().get() val manga = manga ?: return default val readingMode = ReadingModeType.fromPreference(manga.readingModeType) // SY --> @@ -779,7 +779,7 @@ class ReaderPresenter( * Returns the orientation type used by this manga or the default one. */ fun getMangaOrientationType(resolveDefault: Boolean = true): Int { - val default = preferences.defaultOrientationType() + val default = preferences.defaultOrientationType().get() val orientation = OrientationType.fromPreference(manga?.orientationType) return when { resolveDefault && orientation == OrientationType.DEFAULT -> default @@ -837,7 +837,7 @@ class ReaderPresenter( val filename = generateFilename(manga, page) // Pictures directory. - val relativePath = if (preferences.folderPerManga()) DiskUtil.buildValidFilename(manga.title) else "" + val relativePath = if (preferences.folderPerManga().get()) DiskUtil.buildValidFilename(manga.title) else "" // Copy file in background. try { @@ -871,7 +871,7 @@ class ReaderPresenter( notifier.onClear() // Pictures directory. - val relativePath = if (preferences.folderPerManga()) DiskUtil.buildValidFilename(manga.title) else "" + val relativePath = if (preferences.folderPerManga().get()) DiskUtil.buildValidFilename(manga.title) else "" // Copy file in background. try { @@ -1039,7 +1039,7 @@ class ReaderPresenter( * will run in a background thread and errors are ignored. */ private fun updateTrackChapterRead(readerChapter: ReaderChapter) { - if (!preferences.autoUpdateTrack()) return + if (!preferences.autoUpdateTrack().get()) return val manga = manga ?: return val chapterRead = readerChapter.chapter.chapter_number.toDouble() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderColorFilterSettings.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderColorFilterSettings.kt index 37396e1b0..40b0ef5f0 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderColorFilterSettings.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/setting/ReaderColorFilterSettings.kt @@ -32,15 +32,15 @@ class ReaderColorFilterSettings @JvmOverloads constructor(context: Context, attr init { addView(binding.root) - preferences.colorFilter().asFlow() + preferences.colorFilter().changes() .onEach { setColorFilter(it) } .launchIn((context as ReaderActivity).lifecycleScope) - preferences.colorFilterMode().asFlow() + preferences.colorFilterMode().changes() .onEach { setColorFilter(preferences.colorFilter().get()) } .launchIn(context.lifecycleScope) - preferences.customBrightness().asFlow() + preferences.customBrightness().changes() .onEach { setCustomBrightness(it) } .launchIn(context.lifecycleScope) @@ -139,7 +139,7 @@ class ReaderColorFilterSettings @JvmOverloads constructor(context: Context, attr */ private fun setCustomBrightness(enabled: Boolean) { if (enabled) { - preferences.customBrightnessValue().asFlow() + preferences.customBrightnessValue().changes() .sample(100) .onEach { setCustomBrightnessValue(it) } .launchIn((context as ReaderActivity).lifecycleScope) @@ -167,7 +167,7 @@ class ReaderColorFilterSettings @JvmOverloads constructor(context: Context, attr */ private fun setColorFilter(enabled: Boolean) { if (enabled) { - preferences.colorFilterValue().asFlow() + preferences.colorFilterValue().changes() .sample(100) .onEach { setColorFilterValue(it) } .launchIn((context as ReaderActivity).lifecycleScope) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ViewerConfig.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ViewerConfig.kt index bf3fbc2c8..2bb903115 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ViewerConfig.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/ViewerConfig.kt @@ -1,6 +1,6 @@ package eu.kanade.tachiyomi.ui.reader.viewer -import com.fredporciuncula.flow.preferences.Preference +import eu.kanade.tachiyomi.core.preference.Preference import eu.kanade.tachiyomi.data.preference.PreferenceValues.TappingInvertMode import eu.kanade.tachiyomi.data.preference.PreferencesHelper import kotlinx.coroutines.CoroutineScope @@ -76,7 +76,7 @@ abstract class ViewerConfig(preferences: PreferencesHelper, private val scope: C valueAssignment: (T) -> Unit, onChanged: (T) -> Unit = {}, ) { - asFlow() + changes() .onEach { valueAssignment(it) } .distinctUntilChanged() .onEach { onChanged(it) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerConfig.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerConfig.kt index 4403f9e16..5c777230b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerConfig.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerConfig.kt @@ -106,7 +106,7 @@ class PagerConfig( preferences.pagerNavInverted() .register({ tappingInverted = it }, { navigator.invertMode = it }) - preferences.pagerNavInverted().asFlow() + preferences.pagerNavInverted().changes() .drop(1) .onEach { navigationModeChangedListener?.invoke() } .launchIn(scope) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonConfig.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonConfig.kt index 20259543d..83eaf9608 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonConfig.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonConfig.kt @@ -63,7 +63,7 @@ class WebtoonConfig( preferences.webtoonNavInverted() .register({ tappingInverted = it }, { navigator.invertMode = it }) - preferences.webtoonNavInverted().asFlow() + preferences.webtoonNavInverted().changes() .drop(1) .onEach { navigationModeChangedListener?.invoke() } .launchIn(scope) @@ -83,7 +83,7 @@ class WebtoonConfig( }, ) - preferences.readerTheme().asFlow() + preferences.readerTheme().changes() .drop(1) .distinctUntilChanged() .onEach { themeChangedListener?.invoke() } 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 a4d0ce420..28a05d0cb 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 @@ -27,6 +27,7 @@ import eu.kanade.tachiyomi.data.library.LibraryUpdateService.Target import eu.kanade.tachiyomi.data.preference.PreferenceValues import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.network.NetworkHelper +import eu.kanade.tachiyomi.network.NetworkPreferences import eu.kanade.tachiyomi.network.PREF_DOH_360 import eu.kanade.tachiyomi.network.PREF_DOH_ADGUARD import eu.kanade.tachiyomi.network.PREF_DOH_ALIDNS @@ -70,6 +71,7 @@ import eu.kanade.tachiyomi.util.system.setDefaultSettings import eu.kanade.tachiyomi.util.system.toast import exh.debug.SettingsDebugController import exh.log.EHLogLevel +import exh.pref.SourcePreferences import exh.source.BlacklistedSources import exh.source.EH_SOURCE_ID import exh.source.EXH_SOURCE_ID @@ -89,6 +91,8 @@ class SettingsAdvancedController( private val network: NetworkHelper by injectLazy() private val chapterCache: ChapterCache by injectLazy() private val trackManager: TrackManager by injectLazy() + private val networkPreferences: NetworkPreferences by injectLazy() + private val sourcePreferences: SourcePreferences by injectLazy() private val getAllManga: GetAllManga by injectLazy() private val getChapterByMangaId: GetChapterByMangaId by injectLazy() private val pagePreviewCache: PagePreviewCache by injectLazy() @@ -110,7 +114,7 @@ class SettingsAdvancedController( } /*switchPreference { - key = Keys.verboseLogging + key = networkPreferences.verboseLogging().key() titleRes = R.string.pref_verbose_logging summaryRes = R.string.pref_verbose_logging_summary defaultValue = isDevFlavor @@ -212,7 +216,7 @@ class SettingsAdvancedController( onClick { clearWebViewData() } } intListPreference { - key = Keys.dohProvider + key = networkPreferences.dohProvider().key() titleRes = R.string.pref_dns_over_https entries = arrayOf( context.getString(R.string.disabled), @@ -250,10 +254,11 @@ class SettingsAdvancedController( true } } + val defaultUserAgent = networkPreferences.defaultUserAgent() editTextPreference { - key = Keys.defaultUserAgent + key = defaultUserAgent.key() titleRes = R.string.pref_user_agent_string - text = preferences.defaultUserAgent().get() + text = defaultUserAgent.get() summary = network.defaultUserAgent onChange { @@ -270,10 +275,10 @@ class SettingsAdvancedController( key = "pref_reset_user_agent" titleRes = R.string.pref_reset_user_agent_string - visibleIf(preferences.defaultUserAgent()) { it != preferences.defaultUserAgent().defaultValue } + visibleIf(defaultUserAgent) { it != defaultUserAgent.defaultValue() } onClick { - preferences.defaultUserAgent().delete() + defaultUserAgent.delete() activity?.toast(R.string.requires_app_restart) } } @@ -466,7 +471,7 @@ class SettingsAdvancedController( } switchPreference { - bindTo(preferences.delegateSources()) + bindTo(sourcePreferences.delegateSources()) titleRes = R.string.toggle_delegated_sources summary = context.getString(R.string.toggle_delegated_sources_summary, context.getString(R.string.app_name), DELEGATED_SOURCES.values.map { it.sourceName }.distinct().joinToString()) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBackupController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBackupController.kt index bd516b20c..2fcbb8358 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBackupController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBackupController.kt @@ -136,7 +136,7 @@ class SettingsBackupController : SettingsController() { } } - preferences.backupsDirectory().asFlow() + preferences.backupsDirectory().changes() .onEach { path -> val dir = UniFile.fromUri(context, path.toUri()) summary = dir.filePath + "/automatic" diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsController.kt index 24c4ed648..a2e20a57d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsController.kt @@ -130,7 +130,7 @@ abstract class SettingsController : PreferenceController() { (activity as? AppCompatActivity)?.supportActionBar?.title = getTitle() } - inline fun Preference.visibleIf(preference: com.fredporciuncula.flow.preferences.Preference, crossinline block: (T) -> Boolean) { + inline fun Preference.visibleIf(preference: eu.kanade.tachiyomi.core.preference.Preference, crossinline block: (T) -> Boolean) { preference.asHotFlow { isVisible = block(it) } .launchIn(viewScope) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsDownloadController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsDownloadController.kt index c0b7ad20f..fcf6ae368 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsDownloadController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsDownloadController.kt @@ -58,7 +58,7 @@ class SettingsDownloadController : SettingsController() { ctrl.showDialog(router) } - preferences.downloadsDirectory().asFlow() + preferences.downloadsDirectory().changes() .onEach { path -> val dir = UniFile.fromUri(context, path.toUri()) summary = dir.filePath ?: path @@ -114,7 +114,7 @@ class SettingsDownloadController : SettingsController() { entries = categories.map { it.visualName(context) }.toTypedArray() entryValues = categories.map { it.id.toString() }.toTypedArray() - preferences.removeExcludeCategories().asFlow() + preferences.removeExcludeCategories().changes() .onEach { mutable -> val selected = mutable .mapNotNull { id -> categories.find { it.id == id.toLong() } } @@ -171,10 +171,10 @@ class SettingsDownloadController : SettingsController() { } } - preferences.downloadNewChapterCategories().asFlow() + preferences.downloadNewChapterCategories().changes() .onEach { updateSummary() } .launchIn(viewScope) - preferences.downloadNewChapterCategoriesExclude().asFlow() + preferences.downloadNewChapterCategoriesExclude().changes() .onEach { updateSummary() } .launchIn(viewScope) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsEhController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsEhController.kt index 78642bca3..b4b326779 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsEhController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsEhController.kt @@ -12,12 +12,12 @@ import androidx.core.content.ContextCompat import androidx.core.content.getSystemService import androidx.core.widget.doAfterTextChanged import androidx.preference.PreferenceScreen -import com.fredporciuncula.flow.preferences.Preference import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.domain.manga.interactor.DeleteFavoriteEntries import eu.kanade.domain.manga.interactor.GetExhFavoriteMangaWithMetadata import eu.kanade.domain.manga.interactor.GetFlatMetadataById import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.core.preference.Preference import eu.kanade.tachiyomi.data.preference.DEVICE_CHARGING import eu.kanade.tachiyomi.data.preference.DEVICE_ONLY_ON_WIFI import eu.kanade.tachiyomi.databinding.DialogStubTextinputBinding @@ -75,7 +75,7 @@ class SettingsEhController : SettingsController() { fun Preference<*>.reconfigure(): Boolean { // Listen for change commit - asFlow() + changes() .take(1) // Only listen for first commit .onEach { // Only listen for first change commit @@ -99,7 +99,7 @@ class SettingsEhController : SettingsController() { summaryOff = context.getString(R.string.requires_login) isPersistent = false preferences.enableExhentai() - .asFlow() + .changes() .onEach { isChecked = it } @@ -395,7 +395,7 @@ class SettingsEhController : SettingsController() { ) entryValues = arrayOf("0", "1", "2", "3", "6", "12", "24", "48") - preferences.exhAutoUpdateFrequency().asFlow() + preferences.exhAutoUpdateFrequency().changes() .onEach { newVal -> summary = if (newVal == 0) { context.getString(R.string.time_between_batches_summary_1, context.getString(R.string.app_name)) @@ -445,7 +445,7 @@ class SettingsEhController : SettingsController() { true } - preferences.exhAutoUpdateRequirements().asFlow() + preferences.exhAutoUpdateRequirements().changes() .onEach { updateSummary() } .launchIn(viewScope) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsLibraryController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsLibraryController.kt index 1a527e530..dd9eef206 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsLibraryController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsLibraryController.kt @@ -82,7 +82,7 @@ class SettingsLibraryController : SettingsController() { } } - combine(preferences.portraitColumns().asFlow(), preferences.landscapeColumns().asFlow()) { portraitCols, landscapeCols -> Pair(portraitCols, landscapeCols) } + combine(preferences.portraitColumns().changes(), preferences.landscapeColumns().changes()) { portraitCols, landscapeCols -> Pair(portraitCols, landscapeCols) } .onEach { (portraitCols, landscapeCols) -> val portrait = getColumnValue(portraitCols) val landscape = getColumnValue(landscapeCols) @@ -117,7 +117,7 @@ class SettingsLibraryController : SettingsController() { entryValues = arrayOf("-1") + allCategories.map { it.id.toString() }.toTypedArray() defaultValue = "-1" - val selectedCategory = allCategories.find { it.id == preferences.defaultCategory().toLong() } + val selectedCategory = allCategories.find { it.id == preferences.defaultCategory().get().toLong() } summary = selectedCategory?.visualName(context) ?: context.getString(R.string.default_category_summary) onChange { newValue -> @@ -132,7 +132,7 @@ class SettingsLibraryController : SettingsController() { bindTo(preferences.categorizedDisplaySettings()) titleRes = R.string.categorized_display_settings - preferences.categorizedDisplaySettings().asFlow() + preferences.categorizedDisplaySettings().changes() .onEach { if (it.not()) { resetCategoryFlags.await() @@ -200,7 +200,7 @@ class SettingsLibraryController : SettingsController() { summary = context.getString(R.string.restrictions, restrictionsText) } - preferences.libraryUpdateDeviceRestriction().asFlow() + preferences.libraryUpdateDeviceRestriction().changes() .onEach { updateSummary() } .launchIn(viewScope) } @@ -229,7 +229,7 @@ class SettingsLibraryController : SettingsController() { summary = restrictionsText } - preferences.libraryUpdateMangaRestriction().asFlow() + preferences.libraryUpdateMangaRestriction().changes() .onEach { updateSummary() } .launchIn(viewScope) } @@ -272,10 +272,10 @@ class SettingsLibraryController : SettingsController() { } } - preferences.libraryUpdateCategories().asFlow() + preferences.libraryUpdateCategories().changes() .onEach { updateSummary() } .launchIn(viewScope) - preferences.libraryUpdateCategoriesExclude().asFlow() + preferences.libraryUpdateCategoriesExclude().changes() .onEach { updateSummary() } .launchIn(viewScope) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/chapter/ChapterSettingsHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/util/chapter/ChapterSettingsHelper.kt index dbef6ab2f..134c388c5 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/chapter/ChapterSettingsHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/chapter/ChapterSettingsHelper.kt @@ -27,12 +27,12 @@ object ChapterSettingsHelper { suspend fun applySettingDefaults(mangaId: Long) { setMangaChapterFlags.awaitSetAllFlags( mangaId = mangaId, - unreadFilter = preferences.filterChapterByRead().toLong(), - downloadedFilter = preferences.filterChapterByDownloaded().toLong(), - bookmarkedFilter = preferences.filterChapterByBookmarked().toLong(), - sortingMode = preferences.sortChapterBySourceOrNumber().toLong(), - sortingDirection = preferences.sortChapterByAscendingOrDescending().toLong(), - displayMode = preferences.displayChapterByNameOrNumber().toLong(), + unreadFilter = preferences.filterChapterByRead().get().toLong(), + downloadedFilter = preferences.filterChapterByDownloaded().get().toLong(), + bookmarkedFilter = preferences.filterChapterByBookmarked().get().toLong(), + sortingMode = preferences.sortChapterBySourceOrNumber().get().toLong(), + sortingDirection = preferences.sortChapterByAscendingOrDescending().get().toLong(), + displayMode = preferences.displayChapterByNameOrNumber().get().toLong(), ) } @@ -45,12 +45,12 @@ object ChapterSettingsHelper { .map { manga -> setMangaChapterFlags.awaitSetAllFlags( mangaId = manga.id, - unreadFilter = preferences.filterChapterByRead().toLong(), - downloadedFilter = preferences.filterChapterByDownloaded().toLong(), - bookmarkedFilter = preferences.filterChapterByBookmarked().toLong(), - sortingMode = preferences.sortChapterBySourceOrNumber().toLong(), - sortingDirection = preferences.sortChapterByAscendingOrDescending().toLong(), - displayMode = preferences.displayChapterByNameOrNumber().toLong(), + unreadFilter = preferences.filterChapterByRead().get().toLong(), + downloadedFilter = preferences.filterChapterByDownloaded().get().toLong(), + bookmarkedFilter = preferences.filterChapterByBookmarked().get().toLong(), + sortingMode = preferences.sortChapterBySourceOrNumber().get().toLong(), + sortingDirection = preferences.sortChapterByAscendingOrDescending().get().toLong(), + displayMode = preferences.displayChapterByNameOrNumber().get().toLong(), ) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/preference/PreferenceDSL.kt b/app/src/main/java/eu/kanade/tachiyomi/util/preference/PreferenceDSL.kt index 7ecd1ae8b..d8f9b1f2b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/preference/PreferenceDSL.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/preference/PreferenceDSL.kt @@ -106,15 +106,14 @@ inline fun

PreferenceGroup.addThenInit(p: P, block: P.() -> Uni } } -inline fun Preference.bindTo(preference: com.fredporciuncula.flow.preferences.Preference) { - key = preference.key - defaultValue = preference.defaultValue +inline fun Preference.bindTo(preference: eu.kanade.tachiyomi.core.preference.Preference) { + key = preference.key() + defaultValue = preference.defaultValue() } -inline fun ListPreference.bindTo(preference: com.fredporciuncula.flow.preferences.Preference) { - key = preference.key - // ListPreferences persist values as strings, even when we're using our IntListPreference - defaultValue = preference.defaultValue.toString() +inline fun ListPreference.bindTo(preference: eu.kanade.tachiyomi.core.preference.Preference) { + key = preference.key() + defaultValue = preference.defaultValue().toString() } inline fun Preference.onClick(crossinline block: () -> Unit) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/preference/PreferenceExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/preference/PreferenceExtensions.kt index 1c7db68e0..213c94f27 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/preference/PreferenceExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/preference/PreferenceExtensions.kt @@ -1,7 +1,7 @@ package eu.kanade.tachiyomi.util.preference import android.widget.CompoundButton -import com.fredporciuncula.flow.preferences.Preference +import eu.kanade.tachiyomi.core.preference.Preference import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.onEach @@ -15,7 +15,7 @@ fun CompoundButton.bindToPreference(pref: Preference) { fun Preference.asHotFlow(block: (T) -> Unit): Flow { block(get()) - return asFlow() + return changes() .onEach { block(it) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/MaterialSpinnerView.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/MaterialSpinnerView.kt index f294fe5cd..38d021872 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/MaterialSpinnerView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/MaterialSpinnerView.kt @@ -14,8 +14,8 @@ import androidx.appcompat.widget.PopupMenu import androidx.core.content.withStyledAttributes import androidx.core.view.forEach import androidx.core.view.get -import com.fredporciuncula.flow.preferences.Preference import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.core.preference.Preference import eu.kanade.tachiyomi.databinding.PrefSpinnerBinding import eu.kanade.tachiyomi.util.system.getResourceColor diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/TachiyomiSearchView.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/TachiyomiSearchView.kt index aa5e6705f..5c77eca76 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/TachiyomiSearchView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/TachiyomiSearchView.kt @@ -31,13 +31,15 @@ class TachiyomiSearchView @JvmOverloads constructor( override fun onAttachedToWindow() { super.onAttachedToWindow() scope = CoroutineScope(SupervisorJob() + Dispatchers.Main) - Injekt.get().incognitoMode().asHotFlow { - imeOptions = if (it) { - imeOptions or EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING - } else { - imeOptions and EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING.inv() + Injekt.get().incognitoMode() + .asHotFlow { + imeOptions = if (it) { + imeOptions or EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING + } else { + imeOptions and EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING.inv() + } } - }.launchIn(scope!!) + .launchIn(scope!!) } override fun setOnQueryTextListener(listener: OnQueryTextListener?) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/TachiyomiTextInputEditText.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/TachiyomiTextInputEditText.kt index 7951062db..4c227efd0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/TachiyomiTextInputEditText.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/TachiyomiTextInputEditText.kt @@ -49,13 +49,15 @@ class TachiyomiTextInputEditText @JvmOverloads constructor( * if [PreferencesHelper.incognitoMode] is true. Some IMEs may not respect this flag. */ fun EditText.setIncognito(viewScope: CoroutineScope) { - Injekt.get().incognitoMode().asHotFlow { - imeOptions = if (it) { - imeOptions or EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING - } else { - imeOptions and EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING.inv() + Injekt.get().incognitoMode() + .asHotFlow { + imeOptions = if (it) { + imeOptions or EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING + } else { + imeOptions and EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING.inv() + } } - }.launchIn(viewScope) + .launchIn(viewScope) } } } diff --git a/app/src/main/java/exh/EXHMigrations.kt b/app/src/main/java/exh/EXHMigrations.kt index cb5363f01..573f93438 100644 --- a/app/src/main/java/exh/EXHMigrations.kt +++ b/app/src/main/java/exh/EXHMigrations.kt @@ -2,6 +2,7 @@ package exh +import android.content.Context import androidx.core.content.edit import androidx.preference.PreferenceManager import eu.kanade.data.DatabaseHandler @@ -28,6 +29,7 @@ import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.updater.AppUpdateJob import eu.kanade.tachiyomi.extension.ExtensionUpdateJob +import eu.kanade.tachiyomi.network.NetworkPreferences import eu.kanade.tachiyomi.network.PREF_DOH_CLOUDFLARE import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.SourceManager @@ -87,8 +89,11 @@ object EXHMigrations { * @param preferences Preferences of the application. * @return true if a migration is performed, false otherwise. */ - fun upgrade(preferences: PreferencesHelper): Boolean { - val context = preferences.context + fun upgrade( + context: Context, + preferences: PreferencesHelper, + networkPreferences: NetworkPreferences, + ): Boolean { val oldVersion = preferences.ehLastVersionCode().get() try { if (oldVersion < BuildConfig.VERSION_CODE) { @@ -211,7 +216,7 @@ object EXHMigrations { val wasDohEnabled = prefs.getBoolean("enable_doh", false) if (wasDohEnabled) { prefs.edit { - putInt(PreferenceKeys.dohProvider, PREF_DOH_CLOUDFLARE) + putInt(networkPreferences.dohProvider().key(), PREF_DOH_CLOUDFLARE) remove("enable_doh") } } diff --git a/app/src/main/java/exh/debug/DebugFunctions.kt b/app/src/main/java/exh/debug/DebugFunctions.kt index 4d8b4436a..49d47f607 100644 --- a/app/src/main/java/exh/debug/DebugFunctions.kt +++ b/app/src/main/java/exh/debug/DebugFunctions.kt @@ -11,6 +11,7 @@ import eu.kanade.domain.manga.interactor.GetSearchMetadata import eu.kanade.domain.manga.interactor.InsertFlatMetadata import eu.kanade.domain.manga.interactor.UpdateManga import eu.kanade.tachiyomi.data.preference.PreferencesHelper +import eu.kanade.tachiyomi.network.NetworkPreferences import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.online.all.NHentai import exh.EXHMigrations @@ -30,6 +31,7 @@ object DebugFunctions { val app: Application by injectLazy() val handler: DatabaseHandler by injectLazy() val prefs: PreferencesHelper by injectLazy() + val networkPrefs: NetworkPreferences by injectLazy() val sourceManager: SourceManager by injectLazy() val updateManga: UpdateManga by injectLazy() val getFavorites: GetFavorites by injectLazy() @@ -41,12 +43,12 @@ object DebugFunctions { fun forceUpgradeMigration() { prefs.ehLastVersionCode().set(1) - EXHMigrations.upgrade(prefs) + EXHMigrations.upgrade(app, prefs, networkPrefs) } fun forceSetupJobs() { prefs.ehLastVersionCode().set(0) - EXHMigrations.upgrade(prefs) + EXHMigrations.upgrade(app, prefs, networkPrefs) } fun resetAgedFlagInEXHManga() { diff --git a/app/src/main/java/exh/debug/DebugToggles.kt b/app/src/main/java/exh/debug/DebugToggles.kt index 2301e3fb8..5c3ec3535 100644 --- a/app/src/main/java/exh/debug/DebugToggles.kt +++ b/app/src/main/java/exh/debug/DebugToggles.kt @@ -1,7 +1,7 @@ package exh.debug import eu.kanade.core.prefs.PreferenceMutableState -import eu.kanade.tachiyomi.data.preference.PreferencesHelper +import eu.kanade.tachiyomi.core.preference.PreferenceStore import kotlinx.coroutines.CoroutineScope import uy.kohesive.injekt.injectLazy import java.util.Locale @@ -26,14 +26,14 @@ enum class DebugToggles(val default: Boolean) { private val prefKey = "eh_debug_toggle_${name.lowercase(Locale.US)}" var enabled: Boolean - get() = prefs.flowPrefs.getBoolean(prefKey, default).get() + get() = preferenceStore.getBoolean(prefKey, default).get() set(value) { - prefs.flowPrefs.getBoolean(prefKey).set(value) + preferenceStore.getBoolean(prefKey).set(value) } - fun asPref(scope: CoroutineScope) = PreferenceMutableState(prefs.flowPrefs.getBoolean(prefKey, default), scope) + fun asPref(scope: CoroutineScope) = PreferenceMutableState(preferenceStore.getBoolean(prefKey, default), scope) companion object { - private val prefs: PreferencesHelper by injectLazy() + private val preferenceStore: PreferenceStore by injectLazy() } } diff --git a/app/src/main/java/exh/md/network/MangaDexLoginHelper.kt b/app/src/main/java/exh/md/network/MangaDexLoginHelper.kt index 0c6a5f7c0..caa8b4a21 100644 --- a/app/src/main/java/exh/md/network/MangaDexLoginHelper.kt +++ b/app/src/main/java/exh/md/network/MangaDexLoginHelper.kt @@ -66,9 +66,9 @@ class MangaDexLoginHelper(authServiceLazy: Lazy, val prefer } suspend fun login(): Boolean { - val username = preferences.trackUsername(mdList) - val password = preferences.trackPassword(mdList) - if (username.isNullOrBlank() || password.isNullOrBlank()) { + val username = preferences.trackUsername(mdList).get() + val password = preferences.trackPassword(mdList).get() + if (username.isBlank() || password.isBlank()) { xLogI("No username or password stored, can't login") return false } diff --git a/app/src/main/java/exh/util/DataSaver.kt b/app/src/main/java/exh/util/DataSaver.kt index 0e867820b..3b41fb079 100644 --- a/app/src/main/java/exh/util/DataSaver.kt +++ b/app/src/main/java/exh/util/DataSaver.kt @@ -1,6 +1,6 @@ package exh.util -import com.fredporciuncula.flow.preferences.Preference +import eu.kanade.tachiyomi.core.preference.Preference import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.model.Page diff --git a/core/src/main/java/eu/kanade/tachiyomi/core/preference/AndroidPreference.kt b/core/src/main/java/eu/kanade/tachiyomi/core/preference/AndroidPreference.kt new file mode 100644 index 000000000..7d6f43485 --- /dev/null +++ b/core/src/main/java/eu/kanade/tachiyomi/core/preference/AndroidPreference.kt @@ -0,0 +1,176 @@ +package eu.kanade.tachiyomi.core.preference + +import android.content.SharedPreferences +import android.content.SharedPreferences.Editor +import androidx.core.content.edit +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.conflate +import kotlinx.coroutines.flow.filter +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.onStart +import kotlinx.coroutines.flow.stateIn + +sealed class AndroidPreference( + private val preferences: SharedPreferences, + private val keyFlow: Flow, + private val key: String, + private val defaultValue: T, +) : Preference { + + abstract fun read(preferences: SharedPreferences, key: String, defaultValue: T): T + + abstract fun write(key: String, value: T): Editor.() -> Unit + + override fun key(): String { + return key + } + + override fun get(): T { + return read(preferences, key, defaultValue) + } + + override fun set(value: T) { + preferences.edit(action = write(key, value)) + } + + override fun isSet(): Boolean { + return preferences.contains(key) + } + + override fun delete() { + preferences.edit { + remove(key) + } + } + + override fun defaultValue(): T { + return defaultValue + } + + override fun changes(): Flow { + return keyFlow + .filter { it == key || it == null } + .onStart { emit("ignition") } + .map { get() } + .conflate() + } + + override fun stateIn(scope: CoroutineScope): StateFlow { + return changes().stateIn(scope, SharingStarted.Eagerly, get()) + } + + class StringPrimitive( + preferences: SharedPreferences, + keyFlow: Flow, + key: String, + defaultValue: String + ) : AndroidPreference(preferences, keyFlow, key, defaultValue) { + override fun read(preferences: SharedPreferences, key: String, defaultValue: String): String { + return preferences.getString(key, defaultValue) ?: defaultValue + } + + override fun write(key: String, value: String): Editor.() -> Unit = { + putString(key, value) + } + } + + class LongPrimitive( + preferences: SharedPreferences, + keyFlow: Flow, + key: String, + defaultValue: Long + ) : AndroidPreference(preferences, keyFlow, key, defaultValue) { + override fun read(preferences: SharedPreferences, key: String, defaultValue: Long): Long { + return preferences.getLong(key, defaultValue) + } + + override fun write(key: String, value: Long): Editor.() -> Unit = { + putLong(key, value) + } + } + + class IntPrimitive( + preferences: SharedPreferences, + keyFlow: Flow, + key: String, + defaultValue: Int + ) : AndroidPreference(preferences, keyFlow, key, defaultValue) { + override fun read(preferences: SharedPreferences, key: String, defaultValue: Int): Int { + return preferences.getInt(key, defaultValue) + } + + override fun write(key: String, value: Int): Editor.() -> Unit = { + putInt(key, value) + } + } + + class FloatPrimitive( + preferences: SharedPreferences, + keyFlow: Flow, + key: String, + defaultValue: Float + ) : AndroidPreference(preferences, keyFlow, key, defaultValue) { + override fun read(preferences: SharedPreferences, key: String, defaultValue: Float): Float { + return preferences.getFloat(key, defaultValue) + } + + override fun write(key: String, value: Float): Editor.() -> Unit = { + putFloat(key, value) + } + } + + class BooleanPrimitive( + preferences: SharedPreferences, + keyFlow: Flow, + key: String, + defaultValue: Boolean + ) : AndroidPreference(preferences, keyFlow, key, defaultValue) { + override fun read(preferences: SharedPreferences, key: String, defaultValue: Boolean): Boolean { + return preferences.getBoolean(key, defaultValue) + } + + override fun write(key: String, value: Boolean): Editor.() -> Unit = { + putBoolean(key, value) + } + } + + class StringSetPrimitive( + preferences: SharedPreferences, + keyFlow: Flow, + key: String, + defaultValue: Set + ) : AndroidPreference>(preferences, keyFlow, key, defaultValue) { + override fun read(preferences: SharedPreferences, key: String, defaultValue: Set): Set { + return preferences.getStringSet(key, defaultValue) ?: defaultValue + } + + override fun write(key: String, value: Set): Editor.() -> Unit = { + putStringSet(key, value) + } + } + + class Object( + preferences: SharedPreferences, + keyFlow: Flow, + key: String, + defaultValue: T, + val serializer: (T) -> String, + val deserializer: (String) -> T + ) : AndroidPreference(preferences, keyFlow, key, defaultValue) { + override fun read(preferences: SharedPreferences, key: String, defaultValue: T): T { + return try { + preferences.getString(key, null)?.let(deserializer) ?: defaultValue + } catch (e: Exception) { + defaultValue + } + } + + override fun write(key: String, value: T): Editor.() -> Unit = { + putString(key, serializer(value)) + } + } + +} diff --git a/core/src/main/java/eu/kanade/tachiyomi/core/preference/AndroidPreferenceStore.kt b/core/src/main/java/eu/kanade/tachiyomi/core/preference/AndroidPreferenceStore.kt new file mode 100644 index 000000000..49fa9d714 --- /dev/null +++ b/core/src/main/java/eu/kanade/tachiyomi/core/preference/AndroidPreferenceStore.kt @@ -0,0 +1,72 @@ +package eu.kanade.tachiyomi.core.preference + +import android.content.Context +import android.content.SharedPreferences +import androidx.preference.PreferenceManager +import eu.kanade.tachiyomi.core.preference.AndroidPreference.BooleanPrimitive +import eu.kanade.tachiyomi.core.preference.AndroidPreference.FloatPrimitive +import eu.kanade.tachiyomi.core.preference.AndroidPreference.IntPrimitive +import eu.kanade.tachiyomi.core.preference.AndroidPreference.LongPrimitive +import eu.kanade.tachiyomi.core.preference.AndroidPreference.Object +import eu.kanade.tachiyomi.core.preference.AndroidPreference.StringPrimitive +import eu.kanade.tachiyomi.core.preference.AndroidPreference.StringSetPrimitive +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.callbackFlow + +class AndroidPreferenceStore( + context: Context +) : PreferenceStore { + + private val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) + + private val keyFlow = sharedPreferences.keyFlow + + override fun getString(key: String, defaultValue: String): Preference { + return StringPrimitive(sharedPreferences, keyFlow, key, defaultValue) + } + + override fun getLong(key: String, defaultValue: Long): Preference { + return LongPrimitive(sharedPreferences, keyFlow,key, defaultValue) + } + + override fun getInt(key: String, defaultValue: Int): Preference { + return IntPrimitive(sharedPreferences, keyFlow,key, defaultValue) + } + + override fun getFloat(key: String, defaultValue: Float): Preference { + return FloatPrimitive(sharedPreferences, keyFlow,key, defaultValue) + } + + override fun getBoolean(key: String, defaultValue: Boolean): Preference { + return BooleanPrimitive(sharedPreferences, keyFlow, key, defaultValue) + } + + override fun getStringSet(key: String, defaultValue: Set): Preference> { + return StringSetPrimitive(sharedPreferences, keyFlow, key, defaultValue) + } + + override fun getObject( + key: String, + defaultValue: T, + serializer: (T) -> String, + deserializer: (String) -> T, + ): Preference { + return Object( + preferences = sharedPreferences, + keyFlow = keyFlow, + key = key, + defaultValue = defaultValue, + serializer = serializer, + deserializer = deserializer + ) +} +} + +private val SharedPreferences.keyFlow + get() = callbackFlow { + val listener = SharedPreferences.OnSharedPreferenceChangeListener { _, key: String? -> trySend(key) } + registerOnSharedPreferenceChangeListener(listener) + awaitClose { + unregisterOnSharedPreferenceChangeListener(listener) + } + } diff --git a/core/src/main/java/eu/kanade/tachiyomi/core/preference/Preference.kt b/core/src/main/java/eu/kanade/tachiyomi/core/preference/Preference.kt new file mode 100644 index 000000000..a88bbc51a --- /dev/null +++ b/core/src/main/java/eu/kanade/tachiyomi/core/preference/Preference.kt @@ -0,0 +1,27 @@ +package eu.kanade.tachiyomi.core.preference + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.StateFlow + +interface Preference { + + fun key(): String + + fun get(): T + + fun set(value: T) + + fun isSet(): Boolean + + fun delete() + + fun defaultValue(): T + + fun changes(): Flow + + fun stateIn(scope: CoroutineScope): StateFlow + +} + +inline fun Preference.getAndSet(crossinline block: (T) -> R) = set(block(get())) diff --git a/core/src/main/java/eu/kanade/tachiyomi/core/preference/PreferenceStore.kt b/core/src/main/java/eu/kanade/tachiyomi/core/preference/PreferenceStore.kt new file mode 100644 index 000000000..374368c7d --- /dev/null +++ b/core/src/main/java/eu/kanade/tachiyomi/core/preference/PreferenceStore.kt @@ -0,0 +1,42 @@ +package eu.kanade.tachiyomi.core.preference + +interface PreferenceStore { + + fun getString(key: String, defaultValue: String = ""): Preference + + fun getLong(key: String, defaultValue: Long = 0): Preference + + fun getInt(key: String, defaultValue: Int = 0): Preference + + fun getFloat(key: String, defaultValue: Float = 0f): Preference + + fun getBoolean(key: String, defaultValue: Boolean = false): Preference + + fun getStringSet(key: String, defaultValue: Set = emptySet()): Preference> + + fun getObject( + key: String, + defaultValue: T, + serializer: (T) -> String, + deserializer: (String) -> T + ): Preference + +} + +inline fun > PreferenceStore.getEnum( + key: String, + defaultValue: T +) : Preference { + return getObject( + key = key, + defaultValue = defaultValue, + serializer = { it.name }, + deserializer = { + try { + enumValueOf(it) + } catch (e: IllegalArgumentException) { + defaultValue + } + } + ) +} diff --git a/core/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt b/core/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt index 0eb42e802..2a167dea0 100755 --- a/core/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt +++ b/core/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt @@ -1,7 +1,6 @@ package eu.kanade.tachiyomi.network import android.content.Context -import androidx.preference.PreferenceManager import eu.kanade.tachiyomi.i18n.BuildConfig import eu.kanade.tachiyomi.network.interceptor.CloudflareInterceptor import eu.kanade.tachiyomi.network.interceptor.Http103Interceptor @@ -9,14 +8,14 @@ import eu.kanade.tachiyomi.network.interceptor.UserAgentInterceptor import okhttp3.Cache import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor +import uy.kohesive.injekt.injectLazy import java.io.File import java.util.concurrent.TimeUnit /* SY --> */ open /* SY <-- */ class NetworkHelper(context: Context) { - // TODO: Abstract preferences similar to 1.x - val preferences = PreferenceManager.getDefaultSharedPreferences(context) + private val preferences: NetworkPreferences by injectLazy() private val cacheDir = File(context.cacheDir, "network_cache") private val cacheSize = 5L * 1024 * 1024 // 5 MiB @@ -46,7 +45,7 @@ open /* SY <-- */ class NetworkHelper(context: Context) { builder.addNetworkInterceptor(httpLoggingInterceptor) } - when (preferences.getInt("doh_provider", -1)) { + when (preferences.dohProvider().get()) { PREF_DOH_CLOUDFLARE -> builder.dohCloudflare() PREF_DOH_GOOGLE -> builder.dohGoogle() PREF_DOH_ADGUARD -> builder.dohAdGuard() @@ -74,6 +73,6 @@ open /* SY <-- */ class NetworkHelper(context: Context) { } val defaultUserAgent by lazy { - preferences.getString("default_user_agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:104.0) Gecko/20100101 Firefox/104.0")!! + preferences.defaultUserAgent().get() } } diff --git a/core/src/main/java/eu/kanade/tachiyomi/network/NetworkPreferences.kt b/core/src/main/java/eu/kanade/tachiyomi/network/NetworkPreferences.kt new file mode 100644 index 000000000..37d92a5a6 --- /dev/null +++ b/core/src/main/java/eu/kanade/tachiyomi/network/NetworkPreferences.kt @@ -0,0 +1,23 @@ +package eu.kanade.tachiyomi.network + +import eu.kanade.tachiyomi.core.preference.Preference +import eu.kanade.tachiyomi.core.preference.PreferenceStore + +class NetworkPreferences( + private val preferenceStore: PreferenceStore, + private val verboseLogging: Boolean = false +) { + + fun verboseLogging(): Preference { + return preferenceStore.getBoolean("verbose_logging", verboseLogging) + } + + fun dohProvider(): Preference { + return preferenceStore.getInt("doh_provider", -1) + } + + fun defaultUserAgent(): Preference { + return preferenceStore.getString("default_user_agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:104.0) Gecko/20100101 Firefox/104.0") + } + +} diff --git a/core/src/main/java/exh/pref/SourcePreferences.kt b/core/src/main/java/exh/pref/SourcePreferences.kt new file mode 100644 index 000000000..0b8e992dc --- /dev/null +++ b/core/src/main/java/exh/pref/SourcePreferences.kt @@ -0,0 +1,17 @@ +package exh.pref + +import eu.kanade.tachiyomi.core.preference.Preference +import eu.kanade.tachiyomi.core.preference.PreferenceStore + +class SourcePreferences( + private val preferenceStore: PreferenceStore, +) { + + fun delegateSources(): Preference { + return preferenceStore.getBoolean("eh_delegate_sources", true) + } + + fun useJapaneseTitle(): Preference { + return preferenceStore.getBoolean("use_jp_title", false) + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f032232f1..2c4e306a5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -37,7 +37,6 @@ sqlitektx = "androidx.sqlite:sqlite-ktx:2.3.0-alpha05" sqlite-android = "com.github.requery:sqlite-android:3.36.0" preferencektx = "androidx.preference:preference-ktx:1.2.0" -flowpreferences = "com.fredporciuncula:flow-preferences:1.8.0" nucleus-core = { module = "info.android15.nucleus:nucleus", version.ref = "nucleus_version" } nucleus-supportv7 = { module = "info.android15.nucleus:nucleus-support-v7", version.ref = "nucleus_version" } diff --git a/source-api/src/main/java/eu/kanade/tachiyomi/source/online/HttpSource.kt b/source-api/src/main/java/eu/kanade/tachiyomi/source/online/HttpSource.kt index 9ede350b1..0e0279f9c 100755 --- a/source-api/src/main/java/eu/kanade/tachiyomi/source/online/HttpSource.kt +++ b/source-api/src/main/java/eu/kanade/tachiyomi/source/online/HttpSource.kt @@ -14,6 +14,7 @@ import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import exh.log.maybeInjectEHLogger +import exh.pref.SourcePreferences import exh.source.DelegatedHttpSource import okhttp3.Headers import okhttp3.OkHttpClient @@ -409,7 +410,7 @@ abstract class HttpSource : CatalogueSource { // EXH --> private var delegate: DelegatedHttpSource? = null - get() = if (Injekt.get().preferences.getBoolean("eh_delegate_sources", true)) { // todo + get() = if (Injekt.get().delegateSources().get()) { field } else { null diff --git a/source-api/src/main/java/exh/metadata/metadata/EHentaiSearchMetadata.kt b/source-api/src/main/java/exh/metadata/metadata/EHentaiSearchMetadata.kt index a619cfefd..7e3cc7b12 100644 --- a/source-api/src/main/java/exh/metadata/metadata/EHentaiSearchMetadata.kt +++ b/source-api/src/main/java/exh/metadata/metadata/EHentaiSearchMetadata.kt @@ -2,12 +2,12 @@ package exh.metadata.metadata import android.content.Context import androidx.core.net.toUri -import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.source.R import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.copy import exh.metadata.MetadataUtil import exh.metadata.metadata.base.RaisedSearchMetadata +import exh.pref.SourcePreferences import kotlinx.serialization.Serializable import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -53,7 +53,7 @@ class EHentaiSearchMetadata : RaisedSearchMetadata() { // No title bug? val title = altTitle - ?.takeIf { Injekt.get().preferences.getBoolean("use_jp_title", false) } // todo + ?.takeIf { Injekt.get().useJapaneseTitle().get() } // todo ?: title // Set artist (if we can find one) diff --git a/source-api/src/main/java/exh/source/EnhancedHttpSource.kt b/source-api/src/main/java/exh/source/EnhancedHttpSource.kt index 018cc7aaa..cb6fed48a 100644 --- a/source-api/src/main/java/exh/source/EnhancedHttpSource.kt +++ b/source-api/src/main/java/exh/source/EnhancedHttpSource.kt @@ -6,13 +6,15 @@ import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.HttpSource +import exh.pref.SourcePreferences import okhttp3.Response +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get @Suppress("OverridingDeprecatedMember", "DEPRECATION") class EnhancedHttpSource( val originalSource: HttpSource, - val enhancedSource: HttpSource, - val delegateSources:() -> Boolean + val enhancedSource: HttpSource ) : HttpSource() { /** @@ -247,7 +249,7 @@ class EnhancedHttpSource( override fun getFilterList() = source().getFilterList() fun source(): HttpSource { - return if (delegateSources()) { + return if (Injekt.get().delegateSources().get()) { enhancedSource } else { originalSource