From af87ccf8f13c00c08e3e77eda9799dec7f8bddcf Mon Sep 17 00:00:00 2001 From: ziro Date: Wed, 10 Jan 2024 16:42:18 +0700 Subject: [PATCH] refactor: Migrate to upstream's preference abstraction --- app/build.gradle.kts | 7 +- app/src/main/java/eu/kanade/tachiyomi/App.kt | 8 +- .../java/eu/kanade/tachiyomi/AppModule.kt | 24 +- .../java/eu/kanade/tachiyomi/Migrations.kt | 6 +- .../preference/AndroidPreference.kt | 2 +- .../preference/AndroidPreferenceStore.kt | 16 +- .../{data => core}/preference/Preference.kt | 30 +- .../preference/PreferenceStore.kt | 2 +- .../tachiyomi/data/backup/BackupCreator.kt | 4 +- .../tachiyomi/data/backup/BackupRestorer.kt | 5 +- .../tachiyomi/data/cache/ChapterCache.kt | 2 +- .../tachiyomi/data/download/DownloadCache.kt | 2 +- .../data/download/DownloadProvider.kt | 2 +- .../DelayedLibrarySuggestionsJob.kt | 2 +- .../preference/EmptyPreferenceDataStore.kt | 48 --- .../data/preference/PreferencesHelper.kt | 375 +++++++++--------- .../tachiyomi/data/track/TrackPreferences.kt | 4 +- .../tachiyomi/extension/ExtensionManager.kt | 2 +- .../tachiyomi/source/online/all/MangaDex.kt | 1 - .../ui/category/ManageCategoryDialog.kt | 2 +- .../ui/extension/ExtensionFilterController.kt | 5 +- .../details/ExtensionDetailsController.kt | 6 +- .../tachiyomi/ui/library/LibraryController.kt | 6 +- .../tachiyomi/ui/library/LibraryPresenter.kt | 9 +- .../ui/library/filter/FilterBottomSheet.kt | 2 +- .../ui/library/filter/FilterTagGroup.kt | 2 +- .../kanade/tachiyomi/ui/main/MainActivity.kt | 8 +- .../design/MigrationBottomSheetDialog.kt | 2 +- .../tachiyomi/ui/more/OverflowDialog.kt | 2 +- .../tachiyomi/ui/reader/ReaderActivity.kt | 43 +- .../ui/reader/settings/ReaderFilterView.kt | 10 +- .../ui/reader/viewer/ViewerConfig.kt | 15 +- .../ui/reader/viewer/pager/PagerConfig.kt | 4 +- .../ui/reader/viewer/webtoon/WebtoonConfig.kt | 2 +- .../ui/recents/RecentMangaAdapter.kt | 12 +- .../tachiyomi/ui/recents/RecentsPresenter.kt | 2 +- .../tachiyomi/ui/setting/PreferenceDSL.kt | 43 +- .../ui/setting/SettingsAdvancedController.kt | 4 +- .../setting/SettingsAppearanceController.kt | 8 +- .../ui/setting/SettingsBackupController.kt | 5 +- .../ui/setting/SettingsBrowseController.kt | 4 +- .../ui/setting/SettingsController.kt | 6 +- .../ui/setting/SettingsDownloadController.kt | 8 +- .../ui/setting/SettingsLibraryController.kt | 11 +- .../ui/setting/SettingsReaderController.kt | 11 +- .../ui/setting/SettingsSecurityController.kt | 4 +- .../ui/setting/SettingsSourcesController.kt | 4 +- .../ui/setting/SettingsTrackingController.kt | 4 +- .../tachiyomi/ui/source/BrowseController.kt | 2 +- .../tachiyomi/ui/source/SourcePresenter.kt | 2 +- .../ui/source/browse/BrowseSourceItem.kt | 2 +- .../ui/webview/BaseWebViewActivity.kt | 4 +- .../tachiyomi/util/PreferenceExtensions.kt | 2 +- .../util/view/ControllerExtensions.kt | 2 +- .../tachiyomi/widget/AutofitRecyclerView.kt | 2 +- .../tachiyomi/widget/MaterialSpinnerView.kt | 2 +- .../widget/TachiyomiTextInputEditText.kt | 7 +- gradle/androidx.versions.toml | 4 +- gradle/compose.versions.toml | 2 +- gradle/kotlinx.versions.toml | 2 +- gradle/libs.versions.toml | 1 - 61 files changed, 388 insertions(+), 432 deletions(-) rename app/src/main/java/eu/kanade/tachiyomi/{data => core}/preference/AndroidPreference.kt (99%) rename app/src/main/java/eu/kanade/tachiyomi/{data => core}/preference/AndroidPreferenceStore.kt (83%) rename app/src/main/java/eu/kanade/tachiyomi/{data => core}/preference/Preference.kt (58%) rename app/src/main/java/eu/kanade/tachiyomi/{data => core}/preference/PreferenceStore.kt (96%) delete mode 100644 app/src/main/java/eu/kanade/tachiyomi/data/preference/EmptyPreferenceDataStore.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f4c877bf1e..5abc2c2878 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -82,6 +82,8 @@ android { buildFeatures { viewBinding = true compose = true + // If you're here because there's not BuildConfig, build the app first, it'll generate it for you + buildConfig = true // Disable some unused things aidl = false @@ -108,7 +110,7 @@ android { } composeOptions { - kotlinCompilerExtensionVersion = "1.5.3" + kotlinCompilerExtensionVersion = compose.versions.compose.get() } compileOptions { @@ -179,9 +181,6 @@ dependencies { implementation(libs.rxjava) implementation(libs.rxrelay) - // Coroutines - implementation(libs.flow.preferences) - // Network client implementation(libs.okhttp) implementation(libs.okhttp.logging.interceptor) diff --git a/app/src/main/java/eu/kanade/tachiyomi/App.kt b/app/src/main/java/eu/kanade/tachiyomi/App.kt index 80a3657cb2..a885d92f81 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/App.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/App.kt @@ -24,7 +24,6 @@ import eu.kanade.tachiyomi.appwidget.TachiyomiWidgetManager import eu.kanade.tachiyomi.data.image.coil.CoilSetup import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.data.preference.PreferencesHelper -import eu.kanade.tachiyomi.data.preference.asImmediateFlow import eu.kanade.tachiyomi.ui.library.LibraryPresenter import eu.kanade.tachiyomi.ui.recents.RecentsPresenter import eu.kanade.tachiyomi.ui.security.SecureActivityDelegate @@ -64,6 +63,7 @@ open class App : Application(), DefaultLifecycleObserver { if (packageName != process) WebView.setDataDirectorySuffix(process) } + Injekt.importModule(PreferenceModule(this)) Injekt.importModule(AppModule(this)) CoilSetup(this) @@ -72,8 +72,8 @@ open class App : Application(), DefaultLifecycleObserver { ProcessLifecycleOwner.get().lifecycle.addObserver(this) MangaCoverMetadata.load() - preferences.nightMode() - .asImmediateFlow { AppCompatDelegate.setDefaultNightMode(it) } + preferences.nightMode().changes() + .onEach { AppCompatDelegate.setDefaultNightMode(it) } .launchIn(ProcessLifecycleOwner.get().lifecycleScope) ProcessLifecycleOwner.get().lifecycleScope.launchIO { @@ -81,7 +81,7 @@ open class App : Application(), DefaultLifecycleObserver { } // 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) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/AppModule.kt b/app/src/main/java/eu/kanade/tachiyomi/AppModule.kt index 8fd7670b83..d10908b5e4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/AppModule.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/AppModule.kt @@ -7,8 +7,8 @@ import eu.kanade.tachiyomi.data.cache.CoverCache import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.library.CustomMangaManager -import eu.kanade.tachiyomi.data.preference.AndroidPreferenceStore -import eu.kanade.tachiyomi.data.preference.PreferenceStore +import eu.kanade.tachiyomi.core.preference.AndroidPreferenceStore +import eu.kanade.tachiyomi.core.preference.PreferenceStore import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.track.TrackPreferences @@ -34,8 +34,6 @@ class AppModule(val app: Application) : InjektModule { AndroidPreferenceStore(app) } - addSingletonFactory { PreferencesHelper(app) } - addSingletonFactory { TrackPreferences(get()) } addSingletonFactory { DatabaseHelper(app) } @@ -71,8 +69,6 @@ class AppModule(val app: Application) : InjektModule { // Asynchronously init expensive components for a faster cold start ContextCompat.getMainExecutor(app).execute { - get() - get() get() @@ -85,3 +81,19 @@ class AppModule(val app: Application) : InjektModule { } } } + + +class PreferenceModule(val application: Application) : InjektModule { + override fun InjektRegistrar.registerInjectables() { + addSingletonFactory { + AndroidPreferenceStore(application) + } + + addSingletonFactory { + PreferencesHelper( + context = application, + preferenceStore = get(), + ) + } + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt b/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt index 3a350dcd30..17fcf27aeb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt @@ -5,12 +5,12 @@ import androidx.preference.PreferenceManager import eu.kanade.tachiyomi.data.backup.BackupCreatorJob import eu.kanade.tachiyomi.data.download.DownloadProvider import eu.kanade.tachiyomi.data.library.LibraryUpdateJob -import eu.kanade.tachiyomi.data.preference.Preference +import eu.kanade.tachiyomi.core.preference.Preference import eu.kanade.tachiyomi.data.preference.PreferenceKeys -import eu.kanade.tachiyomi.data.preference.PreferenceStore +import eu.kanade.tachiyomi.core.preference.PreferenceStore import eu.kanade.tachiyomi.data.preference.PreferenceValues import eu.kanade.tachiyomi.data.preference.PreferencesHelper -import eu.kanade.tachiyomi.data.preference.plusAssign +import eu.kanade.tachiyomi.core.preference.plusAssign import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.updater.AppDownloadInstallJob import eu.kanade.tachiyomi.data.updater.AppUpdateJob diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/AndroidPreference.kt b/app/src/main/java/eu/kanade/tachiyomi/core/preference/AndroidPreference.kt similarity index 99% rename from app/src/main/java/eu/kanade/tachiyomi/data/preference/AndroidPreference.kt rename to app/src/main/java/eu/kanade/tachiyomi/core/preference/AndroidPreference.kt index 7ef2c88af0..eda04365f8 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/AndroidPreference.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/core/preference/AndroidPreference.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.data.preference +package eu.kanade.tachiyomi.core.preference import android.content.SharedPreferences import android.content.SharedPreferences.Editor diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/AndroidPreferenceStore.kt b/app/src/main/java/eu/kanade/tachiyomi/core/preference/AndroidPreferenceStore.kt similarity index 83% rename from app/src/main/java/eu/kanade/tachiyomi/data/preference/AndroidPreferenceStore.kt rename to app/src/main/java/eu/kanade/tachiyomi/core/preference/AndroidPreferenceStore.kt index 917da39452..dba829a48d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/AndroidPreferenceStore.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/core/preference/AndroidPreferenceStore.kt @@ -1,15 +1,15 @@ -package eu.kanade.tachiyomi.data.preference +package eu.kanade.tachiyomi.core.preference import android.content.Context import android.content.SharedPreferences import androidx.preference.PreferenceManager -import eu.kanade.tachiyomi.data.preference.AndroidPreference.BooleanPrimitive -import eu.kanade.tachiyomi.data.preference.AndroidPreference.FloatPrimitive -import eu.kanade.tachiyomi.data.preference.AndroidPreference.IntPrimitive -import eu.kanade.tachiyomi.data.preference.AndroidPreference.LongPrimitive -import eu.kanade.tachiyomi.data.preference.AndroidPreference.Object -import eu.kanade.tachiyomi.data.preference.AndroidPreference.StringPrimitive -import eu.kanade.tachiyomi.data.preference.AndroidPreference.StringSetPrimitive +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 diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/Preference.kt b/app/src/main/java/eu/kanade/tachiyomi/core/preference/Preference.kt similarity index 58% rename from app/src/main/java/eu/kanade/tachiyomi/data/preference/Preference.kt rename to app/src/main/java/eu/kanade/tachiyomi/core/preference/Preference.kt index 23f0904bca..2950d0db48 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/Preference.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/core/preference/Preference.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.data.preference +package eu.kanade.tachiyomi.core.preference import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow @@ -22,21 +22,29 @@ interface Preference { fun stateIn(scope: CoroutineScope): StateFlow - val isPrivate: Boolean - get() = key().startsWith(PRIVATE_PREFIX) - companion object { /** - * A preference that should not be exposed in places like backups. + * A preference that should not be exposed in places like backups without user consent. */ fun isPrivate(key: String): Boolean { return key.startsWith(PRIVATE_PREFIX) } - fun privateKey(key: String): String { - return "$PRIVATE_PREFIX$key" + return "${PRIVATE_PREFIX}$key" } + /** + * A preference used for internal app state that isn't really a user preference + * and therefore should not be in places like backups. + */ + fun isAppState(key: String): Boolean { + return key.startsWith(APP_STATE_PREFIX) + } + fun appStateKey(key: String): String { + return "${APP_STATE_PREFIX}$key" + } + + private const val APP_STATE_PREFIX = "__APP_STATE_" private const val PRIVATE_PREFIX = "__PRIVATE_" } } @@ -45,6 +53,14 @@ inline fun Preference.getAndSet(crossinline block: (T) -> block(get()), ) +operator fun Preference>.plusAssign(item: Collection) { + get() + item +} + +operator fun Preference>.minusAssign(item: Collection) { + get() - item +} + operator fun Preference>.plusAssign(item: T) { set(get() + item) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceStore.kt b/app/src/main/java/eu/kanade/tachiyomi/core/preference/PreferenceStore.kt similarity index 96% rename from app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceStore.kt rename to app/src/main/java/eu/kanade/tachiyomi/core/preference/PreferenceStore.kt index 88aaada5f9..1865d7e50b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceStore.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/core/preference/PreferenceStore.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.data.preference +package eu.kanade.tachiyomi.core.preference interface PreferenceStore { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreator.kt index dc3e1db6fc..9e427684b5 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreator.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupCreator.kt @@ -39,8 +39,8 @@ import eu.kanade.tachiyomi.data.backup.models.StringSetPreferenceValue import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.library.CustomMangaManager -import eu.kanade.tachiyomi.data.preference.Preference -import eu.kanade.tachiyomi.data.preference.PreferenceStore +import eu.kanade.tachiyomi.core.preference.Preference +import eu.kanade.tachiyomi.core.preference.PreferenceStore import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.SourceManager diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestorer.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestorer.kt index 6bb0163ad2..e9961309a4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestorer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestorer.kt @@ -23,8 +23,8 @@ import eu.kanade.tachiyomi.data.database.models.MangaCategory import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.library.CustomMangaManager import eu.kanade.tachiyomi.data.library.LibraryUpdateJob -import eu.kanade.tachiyomi.data.preference.AndroidPreferenceStore -import eu.kanade.tachiyomi.data.preference.PreferenceStore +import eu.kanade.tachiyomi.core.preference.AndroidPreferenceStore +import eu.kanade.tachiyomi.core.preference.PreferenceStore import eu.kanade.tachiyomi.extension.ExtensionUpdateJob import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.sourcePreferences @@ -34,7 +34,6 @@ import eu.kanade.tachiyomi.util.system.createFileInCacheDir import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.isActive import kotlinx.serialization.protobuf.ProtoBuf -import okio.source import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy 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 b4cf67095e..e5917688d6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/cache/ChapterCache.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/cache/ChapterCache.kt @@ -80,7 +80,7 @@ class ChapterCache(private val context: Context) { get() = Formatter.formatFileSize(context, realSize) init { - preferences.preloadSize().asFlow() + preferences.preloadSize().changes() .drop(1) .onEach { // Save old cache for destruction later 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 8712edc8c2..1665a81e95 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 @@ -54,7 +54,7 @@ class DownloadCache( val scope = CoroutineScope(Job() + Dispatchers.IO) init { - preferences.downloadsDirectory().asFlow() + preferences.downloadsDirectory().changes() .drop(1) .onEach { lastRenew = 0L } // invalidate cache .launchIn(scope) 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 a27c990e65..6e62c3b537 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt @@ -44,7 +44,7 @@ class DownloadProvider(private val context: Context) { } init { - preferences.downloadsDirectory().asFlow().drop(1).onEach { + preferences.downloadsDirectory().changes().drop(1).onEach { downloadsDir = UniFile.fromUri(context, it.toUri()) }.launchIn(scope) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/DelayedLibrarySuggestionsJob.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/DelayedLibrarySuggestionsJob.kt index fb78e85319..f50005952e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/DelayedLibrarySuggestionsJob.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/DelayedLibrarySuggestionsJob.kt @@ -16,7 +16,7 @@ class DelayedLibrarySuggestionsJob(context: Context, workerParams: WorkerParamet override suspend fun doWork(): Result { val preferences = Injekt.get() - if (preferences.showLibrarySearchSuggestions().isNotSet()) { + if (!preferences.showLibrarySearchSuggestions().isSet()) { preferences.showLibrarySearchSuggestions().set(true) LibraryPresenter.setSearchSuggestion(preferences, Injekt.get(), Injekt.get()) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/EmptyPreferenceDataStore.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/EmptyPreferenceDataStore.kt deleted file mode 100644 index 2f2081a27b..0000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/EmptyPreferenceDataStore.kt +++ /dev/null @@ -1,48 +0,0 @@ -package eu.kanade.tachiyomi.data.preference - -import androidx.preference.PreferenceDataStore - -class EmptyPreferenceDataStore : PreferenceDataStore() { - - override fun getBoolean(key: String?, defValue: Boolean): Boolean { - return false - } - - override fun putBoolean(key: String?, value: Boolean) { - } - - override fun getInt(key: String?, defValue: Int): Int { - return 0 - } - - override fun putInt(key: String?, value: Int) { - } - - override fun getLong(key: String?, defValue: Long): Long { - return 0 - } - - override fun putLong(key: String?, value: Long) { - } - - override fun getFloat(key: String?, defValue: Float): Float { - return 0f - } - - override fun putFloat(key: String?, value: Float) { - } - - override fun getString(key: String?, defValue: String?): String? { - return null - } - - override fun putString(key: String?, value: String?) { - } - - override fun getStringSet(key: String?, defValues: Set?): Set? { - return null - } - - override fun putStringSet(key: String?, values: Set?) { - } -} 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 cefcb4ba83..b21007beb7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt @@ -5,11 +5,12 @@ import android.net.Uri import android.os.Environment import androidx.appcompat.app.AppCompatDelegate import androidx.preference.PreferenceManager -import com.fredporciuncula.flow.preferences.FlowSharedPreferences -import com.fredporciuncula.flow.preferences.Preference import com.google.android.material.color.DynamicColors import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.core.preference.Preference +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.updater.AppDownloadInstallJob import eu.kanade.tachiyomi.extension.model.InstalledExtensionsOrder @@ -27,25 +28,18 @@ import eu.kanade.tachiyomi.ui.recents.RecentsPresenter import eu.kanade.tachiyomi.util.system.Themes import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job -import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import java.io.File import java.text.DateFormat import java.text.SimpleDateFormat -import java.util.Locale +import java.util.* import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys import eu.kanade.tachiyomi.data.preference.PreferenceValues as Values -fun Preference.asImmediateFlow(block: (value: T) -> Unit): Flow { +fun Preference.changesIn(scope: CoroutineScope, block: (value: T) -> Unit): Job { block(get()) - return asFlow() - .onEach { block(it) } -} - -fun Preference.asImmediateFlowIn(scope: CoroutineScope, block: (value: T) -> Unit): Job { - block(get()) - return asFlow() + return changes() .onEach { block(it) } .launchIn(scope) } @@ -68,10 +62,9 @@ operator fun Preference>.minusAssign(item: Collection) { set(get() - item) } -class PreferencesHelper(val context: Context) { +class PreferencesHelper(val context: Context, val preferenceStore: PreferenceStore) { private val prefs = PreferenceManager.getDefaultSharedPreferences(context) - private val flowPrefs = FlowSharedPreferences(prefs) private val defaultDownloadsDir = Uri.fromFile( File( @@ -89,236 +82,236 @@ class PreferencesHelper(val context: Context) { ), ) - fun getInt(key: String, default: Int) = flowPrefs.getInt(key, default) - fun getStringPref(key: String, default: String = "") = flowPrefs.getString(key, default) - fun getStringSet(key: String, default: Set) = flowPrefs.getStringSet(key, default) + fun getInt(key: String, default: Int) = preferenceStore.getInt(key, default) + fun getStringPref(key: String, default: String = "") = preferenceStore.getString(key, default) + fun getStringSet(key: String, default: Set) = preferenceStore.getStringSet(key, default) - fun startingTab() = flowPrefs.getInt(Keys.startingTab, 0) - fun backReturnsToStart() = flowPrefs.getBoolean(Keys.backToStart, true) + fun startingTab() = preferenceStore.getInt(Keys.startingTab, 0) + fun backReturnsToStart() = preferenceStore.getBoolean(Keys.backToStart, true) - fun hasShownNotifPermission() = flowPrefs.getBoolean("has_shown_notification_permission", false) + fun hasShownNotifPermission() = preferenceStore.getBoolean("has_shown_notification_permission", false) - fun hasDeniedA11FilePermission() = flowPrefs.getBoolean(Keys.deniedA11FilePermission, false) + fun hasDeniedA11FilePermission() = preferenceStore.getBoolean(Keys.deniedA11FilePermission, false) fun clear() = prefs.edit().clear().apply() - fun nightMode() = flowPrefs.getInt(Keys.nightMode, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) + fun nightMode() = preferenceStore.getInt(Keys.nightMode, AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) - fun themeDarkAmoled() = flowPrefs.getBoolean(Keys.themeDarkAmoled, false) + fun themeDarkAmoled() = preferenceStore.getBoolean(Keys.themeDarkAmoled, false) private val supportsDynamic = DynamicColors.isDynamicColorAvailable() - fun lightTheme() = flowPrefs.getEnum(Keys.lightTheme, if (supportsDynamic) Themes.MONET else Themes.DEFAULT) - fun darkTheme() = flowPrefs.getEnum(Keys.darkTheme, if (supportsDynamic) Themes.MONET else Themes.DEFAULT) + fun lightTheme() = preferenceStore.getEnum(Keys.lightTheme, if (supportsDynamic) Themes.MONET else Themes.DEFAULT) + fun darkTheme() = preferenceStore.getEnum(Keys.darkTheme, if (supportsDynamic) Themes.MONET else Themes.DEFAULT) - fun pageTransitions() = flowPrefs.getBoolean(Keys.enableTransitions, true) + fun pageTransitions() = preferenceStore.getBoolean(Keys.enableTransitions, true) - fun pagerCutoutBehavior() = flowPrefs.getInt(Keys.pagerCutoutBehavior, 0) + fun pagerCutoutBehavior() = preferenceStore.getInt(Keys.pagerCutoutBehavior, 0) - fun landscapeCutoutBehavior() = flowPrefs.getInt("landscape_cutout_behavior", 0) + fun landscapeCutoutBehavior() = preferenceStore.getInt("landscape_cutout_behavior", 0) - fun doubleTapAnimSpeed() = flowPrefs.getInt(Keys.doubleTapAnimationSpeed, 500) + fun doubleTapAnimSpeed() = preferenceStore.getInt(Keys.doubleTapAnimationSpeed, 500) - fun showPageNumber() = flowPrefs.getBoolean(Keys.showPageNumber, true) + fun showPageNumber() = preferenceStore.getBoolean(Keys.showPageNumber, true) - fun trueColor() = flowPrefs.getBoolean(Keys.trueColor, false) + fun trueColor() = preferenceStore.getBoolean(Keys.trueColor, false) - fun fullscreen() = flowPrefs.getBoolean(Keys.fullscreen, true) + fun fullscreen() = preferenceStore.getBoolean(Keys.fullscreen, true) - fun keepScreenOn() = flowPrefs.getBoolean(Keys.keepScreenOn, true) + fun keepScreenOn() = preferenceStore.getBoolean(Keys.keepScreenOn, true) - fun customBrightness() = flowPrefs.getBoolean(Keys.customBrightness, false) + fun customBrightness() = preferenceStore.getBoolean(Keys.customBrightness, false) - fun customBrightnessValue() = flowPrefs.getInt(Keys.customBrightnessValue, 0) + fun customBrightnessValue() = preferenceStore.getInt(Keys.customBrightnessValue, 0) - fun colorFilter() = flowPrefs.getBoolean(Keys.colorFilter, false) + fun colorFilter() = preferenceStore.getBoolean(Keys.colorFilter, false) - fun colorFilterValue() = flowPrefs.getInt(Keys.colorFilterValue, 0) + fun colorFilterValue() = preferenceStore.getInt(Keys.colorFilterValue, 0) - fun colorFilterMode() = flowPrefs.getInt(Keys.colorFilterMode, 0) + fun colorFilterMode() = preferenceStore.getInt(Keys.colorFilterMode, 0) fun defaultReadingMode() = prefs.getInt(Keys.defaultReadingMode, ReadingModeType.RIGHT_TO_LEFT.flagValue) - fun defaultOrientationType() = flowPrefs.getInt(Keys.defaultOrientationType, OrientationType.FREE.flagValue) + fun defaultOrientationType() = preferenceStore.getInt(Keys.defaultOrientationType, OrientationType.FREE.flagValue) - fun imageScaleType() = flowPrefs.getInt(Keys.imageScaleType, 1) + fun imageScaleType() = preferenceStore.getInt(Keys.imageScaleType, 1) - fun zoomStart() = flowPrefs.getInt(Keys.zoomStart, 1) + fun zoomStart() = preferenceStore.getInt(Keys.zoomStart, 1) - fun readerTheme() = flowPrefs.getInt(Keys.readerTheme, 2) + fun readerTheme() = preferenceStore.getInt(Keys.readerTheme, 2) - fun cropBorders() = flowPrefs.getBoolean(Keys.cropBorders, false) + fun cropBorders() = preferenceStore.getBoolean(Keys.cropBorders, false) - fun cropBordersWebtoon() = flowPrefs.getBoolean(Keys.cropBordersWebtoon, false) + fun cropBordersWebtoon() = preferenceStore.getBoolean(Keys.cropBordersWebtoon, false) - fun navigateToPan() = flowPrefs.getBoolean("navigate_pan", true) + fun navigateToPan() = preferenceStore.getBoolean("navigate_pan", true) - fun landscapeZoom() = flowPrefs.getBoolean("landscape_zoom", false) + fun landscapeZoom() = preferenceStore.getBoolean("landscape_zoom", false) - fun grayscale() = flowPrefs.getBoolean("pref_grayscale", false) + fun grayscale() = preferenceStore.getBoolean("pref_grayscale", false) - fun invertedColors() = flowPrefs.getBoolean("pref_inverted_colors", false) + fun invertedColors() = preferenceStore.getBoolean("pref_inverted_colors", false) - fun webtoonSidePadding() = flowPrefs.getInt(Keys.webtoonSidePadding, 0) + fun webtoonSidePadding() = preferenceStore.getInt(Keys.webtoonSidePadding, 0) - fun webtoonEnableZoomOut() = flowPrefs.getBoolean(Keys.webtoonEnableZoomOut, false) + fun webtoonEnableZoomOut() = preferenceStore.getBoolean(Keys.webtoonEnableZoomOut, false) - fun readWithLongTap() = flowPrefs.getBoolean(Keys.readWithLongTap, true) + fun readWithLongTap() = preferenceStore.getBoolean(Keys.readWithLongTap, true) - fun readWithVolumeKeys() = flowPrefs.getBoolean(Keys.readWithVolumeKeys, false) + fun readWithVolumeKeys() = preferenceStore.getBoolean(Keys.readWithVolumeKeys, false) - fun readWithVolumeKeysInverted() = flowPrefs.getBoolean(Keys.readWithVolumeKeysInverted, false) + fun readWithVolumeKeysInverted() = preferenceStore.getBoolean(Keys.readWithVolumeKeysInverted, false) - fun navigationModePager() = flowPrefs.getInt(Keys.navigationModePager, 0) + fun navigationModePager() = preferenceStore.getInt(Keys.navigationModePager, 0) - fun navigationModeWebtoon() = flowPrefs.getInt(Keys.navigationModeWebtoon, 0) + fun navigationModeWebtoon() = preferenceStore.getInt(Keys.navigationModeWebtoon, 0) - fun pagerNavInverted() = flowPrefs.getEnum(Keys.pagerNavInverted, ViewerNavigation.TappingInvertMode.NONE) + fun pagerNavInverted() = preferenceStore.getEnum(Keys.pagerNavInverted, ViewerNavigation.TappingInvertMode.NONE) - fun webtoonNavInverted() = flowPrefs.getEnum(Keys.webtoonNavInverted, ViewerNavigation.TappingInvertMode.NONE) + fun webtoonNavInverted() = preferenceStore.getEnum(Keys.webtoonNavInverted, ViewerNavigation.TappingInvertMode.NONE) - fun pageLayout() = flowPrefs.getInt(Keys.pageLayout, PageLayout.AUTOMATIC.value) + fun pageLayout() = preferenceStore.getInt(Keys.pageLayout, PageLayout.AUTOMATIC.value) - fun automaticSplitsPage() = flowPrefs.getBoolean(Keys.automaticSplitsPage, false) + fun automaticSplitsPage() = preferenceStore.getBoolean(Keys.automaticSplitsPage, false) - fun invertDoublePages() = flowPrefs.getBoolean(Keys.invertDoublePages, false) + fun invertDoublePages() = preferenceStore.getBoolean(Keys.invertDoublePages, false) - fun webtoonPageLayout() = flowPrefs.getInt(Keys.webtoonPageLayout, PageLayout.SINGLE_PAGE.value) + fun webtoonPageLayout() = preferenceStore.getInt(Keys.webtoonPageLayout, PageLayout.SINGLE_PAGE.value) - fun webtoonReaderHideThreshold() = flowPrefs.getEnum("reader_hide_threshold", Values.ReaderHideThreshold.LOW) + fun webtoonReaderHideThreshold() = preferenceStore.getEnum("reader_hide_threshold", Values.ReaderHideThreshold.LOW) - fun webtoonInvertDoublePages() = flowPrefs.getBoolean(Keys.webtoonInvertDoublePages, false) + fun webtoonInvertDoublePages() = preferenceStore.getBoolean(Keys.webtoonInvertDoublePages, false) - fun readerBottomButtons() = flowPrefs.getStringSet( + fun readerBottomButtons() = preferenceStore.getStringSet( Keys.readerBottomButtons, ReaderBottomButton.BUTTONS_DEFAULTS, ) - fun showNavigationOverlayNewUser() = flowPrefs.getBoolean(Keys.showNavigationOverlayNewUser, true) + fun showNavigationOverlayNewUser() = preferenceStore.getBoolean(Keys.showNavigationOverlayNewUser, true) - fun showNavigationOverlayNewUserWebtoon() = flowPrefs.getBoolean(Keys.showNavigationOverlayNewUserWebtoon, true) + fun showNavigationOverlayNewUserWebtoon() = preferenceStore.getBoolean(Keys.showNavigationOverlayNewUserWebtoon, true) - fun preloadSize() = flowPrefs.getInt(Keys.preloadSize, 6) + fun preloadSize() = preferenceStore.getInt(Keys.preloadSize, 6) fun autoUpdateTrack() = prefs.getBoolean(Keys.autoUpdateTrack, true) fun trackMarkedAsRead() = prefs.getBoolean(Keys.trackMarkedAsRead, false) - fun trackingsToAddOnline() = flowPrefs.getStringSet(Keys.trackingsToAddOnline, emptySet()) + fun trackingsToAddOnline() = preferenceStore.getStringSet(Keys.trackingsToAddOnline, emptySet()) - fun lastUsedCatalogueSource() = flowPrefs.getLong(Keys.lastUsedCatalogueSource, -1) + fun lastUsedCatalogueSource() = preferenceStore.getLong(Keys.lastUsedCatalogueSource, -1) - fun lastUsedCategory() = flowPrefs.getInt(Keys.lastUsedCategory, 0) + fun lastUsedCategory() = preferenceStore.getInt(Keys.lastUsedCategory, 0) - fun lastUsedSources() = flowPrefs.getStringSet("last_used_sources", emptySet()) + fun lastUsedSources() = preferenceStore.getStringSet("last_used_sources", emptySet()) - fun lastVersionCode() = flowPrefs.getInt("last_version_code", 0) + fun lastVersionCode() = preferenceStore.getInt("last_version_code", 0) - fun browseAsList() = flowPrefs.getBoolean(Keys.catalogueAsList, false) + fun browseAsList() = preferenceStore.getBoolean(Keys.catalogueAsList, false) - fun enabledLanguages() = flowPrefs.getStringSet( + fun enabledLanguages() = preferenceStore.getStringSet( Keys.enabledLanguages, setOfNotNull("all", "en", Locale.getDefault().language.takeIf { !it.startsWith("en") }), ) - fun sourceSorting() = flowPrefs.getInt(Keys.sourcesSort, 0) + fun sourceSorting() = preferenceStore.getInt(Keys.sourcesSort, 0) - fun anilistScoreType() = flowPrefs.getString("anilist_score_type", "POINT_10") + fun anilistScoreType() = preferenceStore.getString("anilist_score_type", "POINT_10") - fun backupsDirectory() = flowPrefs.getString(Keys.backupDirectory, defaultBackupDir.toString()) + fun backupsDirectory() = preferenceStore.getString(Keys.backupDirectory, defaultBackupDir.toString()) - fun dateFormat(format: String = flowPrefs.getString(Keys.dateFormat, "").get()): DateFormat = when (format) { + fun dateFormat(format: String = preferenceStore.getString(Keys.dateFormat, "").get()): DateFormat = when (format) { "" -> DateFormat.getDateInstance(DateFormat.SHORT) else -> SimpleDateFormat(format, Locale.getDefault()) } - fun appLanguage() = flowPrefs.getString("app_language", "") + fun appLanguage() = preferenceStore.getString("app_language", "") - fun downloadsDirectory() = flowPrefs.getString(Keys.downloadsDirectory, defaultDownloadsDir.toString()) + fun downloadsDirectory() = preferenceStore.getString(Keys.downloadsDirectory, defaultDownloadsDir.toString()) fun downloadOnlyOverWifi() = prefs.getBoolean(Keys.downloadOnlyOverWifi, true) - fun folderPerManga() = flowPrefs.getBoolean("create_folder_per_manga", false) + fun folderPerManga() = preferenceStore.getBoolean("create_folder_per_manga", false) - fun librarySearchSuggestion() = flowPrefs.getString(Keys.librarySearchSuggestion, "") + fun librarySearchSuggestion() = preferenceStore.getString(Keys.librarySearchSuggestion, "") - fun showLibrarySearchSuggestions() = flowPrefs.getBoolean(Keys.showLibrarySearchSuggestions, false) + fun showLibrarySearchSuggestions() = preferenceStore.getBoolean(Keys.showLibrarySearchSuggestions, false) - fun lastLibrarySuggestion() = flowPrefs.getLong("last_library_suggestion", 0L) + fun lastLibrarySuggestion() = preferenceStore.getLong("last_library_suggestion", 0L) - fun numberOfBackups() = flowPrefs.getInt(Keys.numberOfBackups, 2) + fun numberOfBackups() = preferenceStore.getInt(Keys.numberOfBackups, 2) - fun backupInterval() = flowPrefs.getInt(Keys.backupInterval, 0) - fun removeAfterReadSlots() = flowPrefs.getInt(Keys.removeAfterReadSlots, -1) + fun backupInterval() = preferenceStore.getInt(Keys.backupInterval, 0) + fun removeAfterReadSlots() = preferenceStore.getInt(Keys.removeAfterReadSlots, -1) fun removeAfterMarkedAsRead() = prefs.getBoolean(Keys.removeAfterMarkedAsRead, false) - fun libraryUpdateInterval() = flowPrefs.getInt(Keys.libraryUpdateInterval, 24) + fun libraryUpdateInterval() = preferenceStore.getInt(Keys.libraryUpdateInterval, 24) - fun libraryUpdateLastTimestamp() = flowPrefs.getLong("library_update_last_timestamp", 0L) + fun libraryUpdateLastTimestamp() = preferenceStore.getLong("library_update_last_timestamp", 0L) - fun libraryUpdateDeviceRestriction() = flowPrefs.getStringSet("library_update_restriction", setOf(DEVICE_ONLY_ON_WIFI)) + fun libraryUpdateDeviceRestriction() = preferenceStore.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 libraryUpdateMangaRestriction() = preferenceStore.getStringSet("library_update_manga_restriction", setOf(MANGA_HAS_UNREAD, MANGA_NON_COMPLETED, MANGA_NON_READ)) - fun libraryUpdateCategories() = flowPrefs.getStringSet("library_update_categories", emptySet()) - fun libraryUpdateCategoriesExclude() = flowPrefs.getStringSet("library_update_categories_exclude", emptySet()) + fun libraryUpdateCategories() = preferenceStore.getStringSet("library_update_categories", emptySet()) + fun libraryUpdateCategoriesExclude() = preferenceStore.getStringSet("library_update_categories_exclude", emptySet()) - fun libraryLayout() = flowPrefs.getInt(Keys.libraryLayout, LibraryItem.LAYOUT_COMFORTABLE_GRID) + fun libraryLayout() = preferenceStore.getInt(Keys.libraryLayout, LibraryItem.LAYOUT_COMFORTABLE_GRID) - fun gridSize() = flowPrefs.getFloat(Keys.gridSize, 1f) + fun gridSize() = preferenceStore.getFloat(Keys.gridSize, 1f) - fun uniformGrid() = flowPrefs.getBoolean(Keys.uniformGrid, true) + fun uniformGrid() = preferenceStore.getBoolean(Keys.uniformGrid, true) - fun outlineOnCovers() = flowPrefs.getBoolean(Keys.outlineOnCovers, true) + fun outlineOnCovers() = preferenceStore.getBoolean(Keys.outlineOnCovers, true) - fun downloadBadge() = flowPrefs.getBoolean(Keys.downloadBadge, false) + fun downloadBadge() = preferenceStore.getBoolean(Keys.downloadBadge, false) - fun languageBadge() = flowPrefs.getBoolean(Keys.languageBadge, false) + fun languageBadge() = preferenceStore.getBoolean(Keys.languageBadge, false) - fun filterDownloaded() = flowPrefs.getInt(Keys.filterDownloaded, 0) + fun filterDownloaded() = preferenceStore.getInt(Keys.filterDownloaded, 0) - fun filterUnread() = flowPrefs.getInt(Keys.filterUnread, 0) + fun filterUnread() = preferenceStore.getInt(Keys.filterUnread, 0) - fun filterCompleted() = flowPrefs.getInt(Keys.filterCompleted, 0) + fun filterCompleted() = preferenceStore.getInt(Keys.filterCompleted, 0) - fun filterBookmarked() = flowPrefs.getInt("pref_filter_bookmarked_key", 0) + fun filterBookmarked() = preferenceStore.getInt("pref_filter_bookmarked_key", 0) - fun filterTracked() = flowPrefs.getInt(Keys.filterTracked, 0) + fun filterTracked() = preferenceStore.getInt(Keys.filterTracked, 0) - fun filterMangaType() = flowPrefs.getInt(Keys.filterMangaType, 0) + fun filterMangaType() = preferenceStore.getInt(Keys.filterMangaType, 0) - fun showEmptyCategoriesWhileFiltering() = flowPrefs.getBoolean(Keys.showEmptyCategoriesFiltering, false) + fun showEmptyCategoriesWhileFiltering() = preferenceStore.getBoolean(Keys.showEmptyCategoriesFiltering, false) - fun librarySortingMode() = flowPrefs.getInt("library_sorting_mode", 0) + fun librarySortingMode() = preferenceStore.getInt("library_sorting_mode", 0) - fun librarySortingAscending() = flowPrefs.getBoolean("library_sorting_ascending", true) + fun librarySortingAscending() = preferenceStore.getBoolean("library_sorting_ascending", true) - fun automaticExtUpdates() = flowPrefs.getBoolean(Keys.automaticExtUpdates, true) + fun automaticExtUpdates() = preferenceStore.getBoolean(Keys.automaticExtUpdates, true) - fun installedExtensionsOrder() = flowPrefs.getInt(Keys.installedExtensionsOrder, InstalledExtensionsOrder.Name.value) + fun installedExtensionsOrder() = preferenceStore.getInt(Keys.installedExtensionsOrder, InstalledExtensionsOrder.Name.value) - fun migrationSourceOrder() = flowPrefs.getInt("migration_source_order", Values.MigrationSourceOrder.Alphabetically.value) + fun migrationSourceOrder() = preferenceStore.getInt("migration_source_order", Values.MigrationSourceOrder.Alphabetically.value) - fun collapsedCategories() = flowPrefs.getStringSet("collapsed_categories", mutableSetOf()) + fun collapsedCategories() = preferenceStore.getStringSet("collapsed_categories", mutableSetOf()) - fun collapsedDynamicCategories() = flowPrefs.getStringSet("collapsed_dynamic_categories", mutableSetOf()) + fun collapsedDynamicCategories() = preferenceStore.getStringSet("collapsed_dynamic_categories", mutableSetOf()) - fun collapsedDynamicAtBottom() = flowPrefs.getBoolean("collapsed_dynamic_at_bottom", false) + fun collapsedDynamicAtBottom() = preferenceStore.getBoolean("collapsed_dynamic_at_bottom", false) - fun hiddenSources() = flowPrefs.getStringSet("hidden_catalogues", mutableSetOf()) + fun hiddenSources() = preferenceStore.getStringSet("hidden_catalogues", mutableSetOf()) - fun pinnedCatalogues() = flowPrefs.getStringSet("pinned_catalogues", mutableSetOf()) + fun pinnedCatalogues() = preferenceStore.getStringSet("pinned_catalogues", mutableSetOf()) - fun saveChaptersAsCBZ() = flowPrefs.getBoolean("save_chapter_as_cbz", true) + fun saveChaptersAsCBZ() = preferenceStore.getBoolean("save_chapter_as_cbz", true) - fun splitTallImages() = flowPrefs.getBoolean("split_tall_images", false) + fun splitTallImages() = preferenceStore.getBoolean("split_tall_images", false) - fun downloadNewChapters() = flowPrefs.getBoolean(Keys.downloadNew, false) + fun downloadNewChapters() = preferenceStore.getBoolean(Keys.downloadNew, false) - fun downloadNewChaptersInCategories() = flowPrefs.getStringSet("download_new_categories", emptySet()) - fun excludeCategoriesInDownloadNew() = flowPrefs.getStringSet("download_new_categories_exclude", emptySet()) + fun downloadNewChaptersInCategories() = preferenceStore.getStringSet("download_new_categories", emptySet()) + fun excludeCategoriesInDownloadNew() = preferenceStore.getStringSet("download_new_categories_exclude", emptySet()) - fun autoDownloadWhileReading() = flowPrefs.getInt("auto_download_while_reading", 0) + fun autoDownloadWhileReading() = preferenceStore.getInt("auto_download_while_reading", 0) fun defaultCategory() = prefs.getInt(Keys.defaultCategory, -2) @@ -326,159 +319,159 @@ class PreferencesHelper(val context: Context) { fun skipFiltered() = prefs.getBoolean(Keys.skipFiltered, true) - fun skipDupe() = flowPrefs.getBoolean("skip_dupe", false) + fun skipDupe() = preferenceStore.getBoolean("skip_dupe", false) - fun useBiometrics() = flowPrefs.getBoolean(Keys.useBiometrics, false) + fun useBiometrics() = preferenceStore.getBoolean(Keys.useBiometrics, false) - fun lockAfter() = flowPrefs.getInt(Keys.lockAfter, 0) + fun lockAfter() = preferenceStore.getInt(Keys.lockAfter, 0) - fun lastUnlock() = flowPrefs.getLong(Keys.lastUnlock, 0) + fun lastUnlock() = preferenceStore.getLong(Keys.lastUnlock, 0) - fun secureScreen() = flowPrefs.getEnum("secure_screen_v2", Values.SecureScreenMode.INCOGNITO) + fun secureScreen() = preferenceStore.getEnum("secure_screen_v2", Values.SecureScreenMode.INCOGNITO) fun hideNotificationContent() = prefs.getBoolean(Keys.hideNotificationContent, false) - fun removeArticles() = flowPrefs.getBoolean(Keys.removeArticles, false) + fun removeArticles() = preferenceStore.getBoolean(Keys.removeArticles, false) - fun migrateFlags() = flowPrefs.getInt("migrate_flags", Int.MAX_VALUE) + fun migrateFlags() = preferenceStore.getInt("migrate_flags", Int.MAX_VALUE) - fun trustedSignatures() = flowPrefs.getStringSet("trusted_signatures", emptySet()) + fun trustedSignatures() = preferenceStore.getStringSet("trusted_signatures", emptySet()) // using string instead of set so it is ordered - fun migrationSources() = flowPrefs.getString("migrate_sources", "") + fun migrationSources() = preferenceStore.getString("migrate_sources", "") - fun useSourceWithMost() = flowPrefs.getBoolean("use_source_with_most", false) + fun useSourceWithMost() = preferenceStore.getBoolean("use_source_with_most", false) - fun skipPreMigration() = flowPrefs.getBoolean(Keys.skipPreMigration, false) + fun skipPreMigration() = preferenceStore.getBoolean(Keys.skipPreMigration, false) - fun defaultMangaOrder() = flowPrefs.getString("default_manga_order", "") + fun defaultMangaOrder() = preferenceStore.getString("default_manga_order", "") - fun refreshCoversToo() = flowPrefs.getBoolean(Keys.refreshCoversToo, true) + fun refreshCoversToo() = preferenceStore.getBoolean(Keys.refreshCoversToo, true) - fun extensionUpdatesCount() = flowPrefs.getInt("ext_updates_count", 0) + fun extensionUpdatesCount() = preferenceStore.getInt("ext_updates_count", 0) - fun recentsViewType() = flowPrefs.getInt("recents_view_type", 0) + fun recentsViewType() = preferenceStore.getInt("recents_view_type", 0) - fun showRecentsDownloads() = flowPrefs.getEnum(Keys.showDLsInRecents, RecentMangaAdapter.ShowRecentsDLs.All) + fun showRecentsDownloads() = preferenceStore.getEnum(Keys.showDLsInRecents, RecentMangaAdapter.ShowRecentsDLs.All) - fun showRecentsRemHistory() = flowPrefs.getBoolean(Keys.showRemHistoryInRecents, true) + fun showRecentsRemHistory() = preferenceStore.getBoolean(Keys.showRemHistoryInRecents, true) - fun showReadInAllRecents() = flowPrefs.getBoolean(Keys.showReadInAllRecents, false) + fun showReadInAllRecents() = preferenceStore.getBoolean(Keys.showReadInAllRecents, false) - fun showUpdatedTime() = flowPrefs.getBoolean(Keys.showUpdatedTime, false) + fun showUpdatedTime() = preferenceStore.getBoolean(Keys.showUpdatedTime, false) - fun sortFetchedTime() = flowPrefs.getBoolean("sort_fetched_time", false) + fun sortFetchedTime() = preferenceStore.getBoolean("sort_fetched_time", false) - fun collapseGroupedUpdates() = flowPrefs.getBoolean("group_chapters_updates", false) + fun collapseGroupedUpdates() = preferenceStore.getBoolean("group_chapters_updates", false) - fun groupChaptersHistory() = flowPrefs.getEnum("group_chapters_history_type", RecentsPresenter.GroupType.ByWeek) + fun groupChaptersHistory() = preferenceStore.getEnum("group_chapters_history_type", RecentsPresenter.GroupType.ByWeek) - fun collapseGroupedHistory() = flowPrefs.getBoolean("collapse_group_history", true) + fun collapseGroupedHistory() = preferenceStore.getBoolean("collapse_group_history", true) - fun showTitleFirstInRecents() = flowPrefs.getBoolean(Keys.showTitleFirstInRecents, false) + fun showTitleFirstInRecents() = preferenceStore.getBoolean(Keys.showTitleFirstInRecents, false) - fun lastExtCheck() = flowPrefs.getLong("last_ext_check", 0) + fun lastExtCheck() = preferenceStore.getLong("last_ext_check", 0) - fun lastAppCheck() = flowPrefs.getLong("last_app_check", 0) + fun lastAppCheck() = preferenceStore.getLong("last_app_check", 0) - fun checkForBetas() = flowPrefs.getBoolean("check_for_betas", BuildConfig.BETA) + fun checkForBetas() = preferenceStore.getBoolean("check_for_betas", BuildConfig.BETA) - fun unreadBadgeType() = flowPrefs.getInt("unread_badge_type", 2) + fun unreadBadgeType() = preferenceStore.getInt("unread_badge_type", 2) - fun categoryNumberOfItems() = flowPrefs.getBoolean(Keys.categoryNumberOfItems, false) + fun categoryNumberOfItems() = preferenceStore.getBoolean(Keys.categoryNumberOfItems, false) - fun hideStartReadingButton() = flowPrefs.getBoolean("hide_reading_button", false) + fun hideStartReadingButton() = preferenceStore.getBoolean("hide_reading_button", false) - fun alwaysShowChapterTransition() = flowPrefs.getBoolean(Keys.alwaysShowChapterTransition, true) + fun alwaysShowChapterTransition() = preferenceStore.getBoolean(Keys.alwaysShowChapterTransition, true) - fun deleteRemovedChapters() = flowPrefs.getInt(Keys.deleteRemovedChapters, 0) + fun deleteRemovedChapters() = preferenceStore.getInt(Keys.deleteRemovedChapters, 0) - fun removeBookmarkedChapters() = flowPrefs.getBoolean("pref_remove_bookmarked", false) + fun removeBookmarkedChapters() = preferenceStore.getBoolean("pref_remove_bookmarked", false) - fun removeExcludeCategories() = flowPrefs.getStringSet("remove_exclude_categories", emptySet()) + fun removeExcludeCategories() = preferenceStore.getStringSet("remove_exclude_categories", emptySet()) - fun showAllCategories() = flowPrefs.getBoolean("show_all_categories", true) + fun showAllCategories() = preferenceStore.getBoolean("show_all_categories", true) - fun showAllCategoriesWhenSearchingSingleCategory() = flowPrefs.getBoolean("show_all_categories_when_searching_single_category", false) + fun showAllCategoriesWhenSearchingSingleCategory() = preferenceStore.getBoolean("show_all_categories_when_searching_single_category", false) - fun hopperGravity() = flowPrefs.getInt("hopper_gravity", 1) + fun hopperGravity() = preferenceStore.getInt("hopper_gravity", 1) - fun filterOrder() = flowPrefs.getString("filter_order", FilterBottomSheet.Filters.DEFAULT_ORDER) + fun filterOrder() = preferenceStore.getString("filter_order", FilterBottomSheet.Filters.DEFAULT_ORDER) - fun hopperLongPressAction() = flowPrefs.getInt(Keys.hopperLongPress, 0) + fun hopperLongPressAction() = preferenceStore.getInt(Keys.hopperLongPress, 0) - fun hideHopper() = flowPrefs.getBoolean("hide_hopper", false) + fun hideHopper() = preferenceStore.getBoolean("hide_hopper", false) - fun autohideHopper() = flowPrefs.getBoolean(Keys.autoHideHopper, true) + fun autohideHopper() = preferenceStore.getBoolean(Keys.autoHideHopper, true) - fun groupLibraryBy() = flowPrefs.getInt("group_library_by", 0) + fun groupLibraryBy() = preferenceStore.getInt("group_library_by", 0) - fun showCategoryInTitle() = flowPrefs.getBoolean("category_in_title", false) + fun showCategoryInTitle() = preferenceStore.getBoolean("category_in_title", false) - fun onlySearchPinned() = flowPrefs.getBoolean(Keys.onlySearchPinned, false) + fun onlySearchPinned() = preferenceStore.getBoolean(Keys.onlySearchPinned, false) - fun hideInLibraryItems() = flowPrefs.getBoolean("browse_hide_in_library_items", false) + fun hideInLibraryItems() = preferenceStore.getBoolean("browse_hide_in_library_items", false) // Tutorial preferences - fun shownFilterTutorial() = flowPrefs.getBoolean("shown_filter_tutorial", false) + fun shownFilterTutorial() = preferenceStore.getBoolean("shown_filter_tutorial", false) - fun shownChapterSwipeTutorial() = flowPrefs.getBoolean("shown_swipe_tutorial", false) + fun shownChapterSwipeTutorial() = preferenceStore.getBoolean("shown_swipe_tutorial", false) - fun shownDownloadQueueTutorial() = flowPrefs.getBoolean("shown_download_queue", false) + fun shownDownloadQueueTutorial() = preferenceStore.getBoolean("shown_download_queue", false) - fun shownLongPressCategoryTutorial() = flowPrefs.getBoolean("shown_long_press_category", false) + fun shownLongPressCategoryTutorial() = preferenceStore.getBoolean("shown_long_press_category", false) - fun shownHopperSwipeTutorial() = flowPrefs.getBoolean("shown_hopper_swipe", false) + fun shownHopperSwipeTutorial() = preferenceStore.getBoolean("shown_hopper_swipe", false) - fun shownDownloadSwipeTutorial() = flowPrefs.getBoolean("shown_download_tutorial", false) + fun shownDownloadSwipeTutorial() = preferenceStore.getBoolean("shown_download_tutorial", false) - fun hideBottomNavOnScroll() = flowPrefs.getBoolean(Keys.hideBottomNavOnScroll, true) + fun hideBottomNavOnScroll() = preferenceStore.getBoolean(Keys.hideBottomNavOnScroll, true) - fun sideNavIconAlignment() = flowPrefs.getInt(Keys.sideNavIconAlignment, 1) + fun sideNavIconAlignment() = preferenceStore.getInt(Keys.sideNavIconAlignment, 1) - fun showNsfwSources() = flowPrefs.getBoolean(Keys.showNsfwSource, true) + fun showNsfwSources() = preferenceStore.getBoolean(Keys.showNsfwSource, true) fun themeMangaDetails() = prefs.getBoolean(Keys.themeMangaDetails, true) - fun useLargeToolbar() = flowPrefs.getBoolean("use_large_toolbar", true) + fun useLargeToolbar() = preferenceStore.getBoolean("use_large_toolbar", true) fun dohProvider() = prefs.getInt(Keys.dohProvider, -1) - fun defaultUserAgent() = flowPrefs.getString("default_user_agent", NetworkHelper.DEFAULT_USER_AGENT) + fun defaultUserAgent() = preferenceStore.getString("default_user_agent", NetworkHelper.DEFAULT_USER_AGENT) fun showSeriesInShortcuts() = prefs.getBoolean(Keys.showSeriesInShortcuts, true) fun showSourcesInShortcuts() = prefs.getBoolean(Keys.showSourcesInShortcuts, true) fun openChapterInShortcuts() = prefs.getBoolean(Keys.openChapterInShortcuts, true) - fun incognitoMode() = flowPrefs.getBoolean(Keys.incognitoMode, false) + fun incognitoMode() = preferenceStore.getBoolean(Keys.incognitoMode, false) - fun hasPromptedBeforeUpdateAll() = flowPrefs.getBoolean("has_prompted_update_all", false) + fun hasPromptedBeforeUpdateAll() = preferenceStore.getBoolean("has_prompted_update_all", false) - fun sideNavMode() = flowPrefs.getInt(Keys.sideNavMode, 0) + fun sideNavMode() = preferenceStore.getInt(Keys.sideNavMode, 0) fun appShouldAutoUpdate() = prefs.getInt(Keys.shouldAutoUpdate, AppDownloadInstallJob.ONLY_ON_UNMETERED) fun autoUpdateExtensions() = prefs.getInt(Keys.autoUpdateExtensions, AppDownloadInstallJob.ONLY_ON_UNMETERED) - fun extensionInstaller() = flowPrefs.getInt("extension_installer", ExtensionInstaller.PACKAGE_INSTALLER) + fun extensionInstaller() = preferenceStore.getInt("extension_installer", ExtensionInstaller.PACKAGE_INSTALLER) - fun filterChapterByRead() = flowPrefs.getInt(Keys.defaultChapterFilterByRead, Manga.SHOW_ALL) + fun filterChapterByRead() = preferenceStore.getInt(Keys.defaultChapterFilterByRead, Manga.SHOW_ALL) - fun filterChapterByDownloaded() = flowPrefs.getInt(Keys.defaultChapterFilterByDownloaded, Manga.SHOW_ALL) + fun filterChapterByDownloaded() = preferenceStore.getInt(Keys.defaultChapterFilterByDownloaded, Manga.SHOW_ALL) - fun filterChapterByBookmarked() = flowPrefs.getInt(Keys.defaultChapterFilterByBookmarked, Manga.SHOW_ALL) + fun filterChapterByBookmarked() = preferenceStore.getInt(Keys.defaultChapterFilterByBookmarked, Manga.SHOW_ALL) - fun sortChapterOrder() = flowPrefs.getInt(Keys.defaultChapterSortBySourceOrNumber, Manga.CHAPTER_SORTING_SOURCE) + fun sortChapterOrder() = preferenceStore.getInt(Keys.defaultChapterSortBySourceOrNumber, Manga.CHAPTER_SORTING_SOURCE) - fun hideChapterTitlesByDefault() = flowPrefs.getBoolean(Keys.hideChapterTitles, false) + fun hideChapterTitlesByDefault() = preferenceStore.getBoolean(Keys.hideChapterTitles, false) - fun chaptersDescAsDefault() = flowPrefs.getBoolean(Keys.chaptersDescAsDefault, true) + fun chaptersDescAsDefault() = preferenceStore.getBoolean(Keys.chaptersDescAsDefault, true) fun sortChapterByAscendingOrDescending() = prefs.getInt(Keys.defaultChapterSortByAscendingOrDescending, Manga.CHAPTER_SORT_DESC) - fun coverRatios() = flowPrefs.getStringSet(Keys.coverRatios, emptySet()) + fun coverRatios() = preferenceStore.getStringSet(Keys.coverRatios, emptySet()) - fun coverColors() = flowPrefs.getStringSet(Keys.coverColors, emptySet()) + fun coverColors() = preferenceStore.getStringSet(Keys.coverColors, emptySet()) - fun useStaggeredGrid() = flowPrefs.getBoolean("use_staggered_grid", false) + fun useStaggeredGrid() = preferenceStore.getBoolean("use_staggered_grid", false) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackPreferences.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackPreferences.kt index b105b89452..1117bc5fb1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackPreferences.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackPreferences.kt @@ -1,7 +1,7 @@ package eu.kanade.tachiyomi.data.track -import eu.kanade.tachiyomi.data.preference.Preference -import eu.kanade.tachiyomi.data.preference.PreferenceStore +import eu.kanade.tachiyomi.core.preference.Preference +import eu.kanade.tachiyomi.core.preference.PreferenceStore import eu.kanade.tachiyomi.data.track.anilist.Anilist class TrackPreferences( 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 73a3e3c530..ce85e00955 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/ExtensionManager.kt @@ -163,7 +163,7 @@ class ExtensionManager( .map(Extension.AvailableSource::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) && !it.startsWith("en") } diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/MangaDex.kt b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/MangaDex.kt index 50a9a4ebfc..6c3998e493 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/source/online/all/MangaDex.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/online/all/MangaDex.kt @@ -14,7 +14,6 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async import kotlinx.coroutines.withContext import kotlinx.serialization.Serializable -import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json import okhttp3.CacheControl import uy.kohesive.injekt.Injekt diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/ManageCategoryDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/ManageCategoryDialog.kt index 26d38f0149..242e853ceb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/ManageCategoryDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/ManageCategoryDialog.kt @@ -6,9 +6,9 @@ import android.content.DialogInterface import android.os.Bundle import androidx.core.view.isVisible import androidx.core.widget.addTextChangedListener -import com.fredporciuncula.flow.preferences.Preference import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.core.preference.Preference import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.models.Category import eu.kanade.tachiyomi.data.library.LibraryUpdateJob diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionFilterController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionFilterController.kt index 96e81dab4d..e1792e1f5b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionFilterController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionFilterController.kt @@ -3,14 +3,13 @@ package eu.kanade.tachiyomi.ui.extension import androidx.preference.PreferenceScreen import androidx.preference.SwitchPreferenceCompat import eu.kanade.tachiyomi.R -import eu.kanade.tachiyomi.data.preference.minusAssign -import eu.kanade.tachiyomi.data.preference.plusAssign +import eu.kanade.tachiyomi.core.preference.minusAssign +import eu.kanade.tachiyomi.core.preference.plusAssign import eu.kanade.tachiyomi.extension.ExtensionManager import eu.kanade.tachiyomi.ui.setting.SettingsController import eu.kanade.tachiyomi.ui.setting.onChange import eu.kanade.tachiyomi.ui.setting.titleRes import eu.kanade.tachiyomi.util.system.LocaleHelper -import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy class ExtensionFilterController : SettingsController() { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/details/ExtensionDetailsController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/details/ExtensionDetailsController.kt index fd834c50f6..7e68109c25 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/details/ExtensionDetailsController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/details/ExtensionDetailsController.kt @@ -24,8 +24,8 @@ import com.google.android.material.snackbar.Snackbar import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.SharedPreferencesDataStore -import eu.kanade.tachiyomi.data.preference.minusAssign -import eu.kanade.tachiyomi.data.preference.plusAssign +import eu.kanade.tachiyomi.core.preference.minusAssign +import eu.kanade.tachiyomi.core.preference.plusAssign import eu.kanade.tachiyomi.databinding.ExtensionDetailControllerBinding import eu.kanade.tachiyomi.extension.model.Extension import eu.kanade.tachiyomi.network.NetworkHelper @@ -267,7 +267,7 @@ class ExtensionDetailsController(bundle: Bundle? = null) : } // React to enable/disable all changes - preferences.hiddenSources().asFlow() + preferences.hiddenSources().changes() .onEach { val enabled = source.isEnabled() isChecked = enabled diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt index 1b7ab60591..c25445b0e9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt @@ -48,7 +48,6 @@ import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.StaggeredGridLayoutManager import com.bluelinelabs.conductor.ControllerChangeHandler import com.bluelinelabs.conductor.ControllerChangeType -import com.fredporciuncula.flow.preferences.Preference import com.github.florent37.viewtooltip.ViewTooltip import com.google.android.material.snackbar.BaseTransientBottomBar import com.google.android.material.snackbar.Snackbar @@ -58,6 +57,7 @@ import eu.davidea.flexibleadapter.items.IFlexible import eu.davidea.flexibleadapter.items.IHeader import eu.davidea.flexibleadapter.items.ISectionable import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.core.preference.Preference import eu.kanade.tachiyomi.data.database.models.Category import eu.kanade.tachiyomi.data.database.models.LibraryManga import eu.kanade.tachiyomi.data.database.models.Manga @@ -1003,7 +1003,7 @@ open class LibraryController( preferences.gridSize(), preferences.useStaggeredGrid(), ).forEach { - it.asFlow() + it.changes() .drop(1) .onEach { reattachAdapter() @@ -1017,7 +1017,7 @@ open class LibraryController( @SuppressLint("NotifyDataSetChanged") private fun Preference.register(onChanged: ((T) -> Unit)? = null) { - asFlow() + changes() .drop(1) .onEach { onChanged?.invoke(it) 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 0c99e67c40..d9b3cc5b31 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt @@ -1,6 +1,7 @@ package eu.kanade.tachiyomi.ui.library import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.core.preference.getAndSet import eu.kanade.tachiyomi.data.cache.CoverCache import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.models.Category @@ -13,8 +14,8 @@ import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.preference.DelayedLibrarySuggestionsJob import eu.kanade.tachiyomi.data.preference.PreferencesHelper -import eu.kanade.tachiyomi.data.preference.minusAssign -import eu.kanade.tachiyomi.data.preference.plusAssign +import eu.kanade.tachiyomi.core.preference.minusAssign +import eu.kanade.tachiyomi.core.preference.plusAssign import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.source.LocalSource import eu.kanade.tachiyomi.source.SourceManager @@ -145,7 +146,7 @@ class LibraryPresenter( lastAllLibraryItems = null } getLibrary() - if (preferences.showLibrarySearchSuggestions().isNotSet()) { + if (!preferences.showLibrarySearchSuggestions().isSet()) { DelayedLibrarySuggestionsJob.setupTask(context, true) } else if (preferences.showLibrarySearchSuggestions().get() && Date().time >= preferences.lastLibrarySuggestion().get() + TimeUnit.HOURS.toMillis(2) @@ -1415,7 +1416,7 @@ class LibraryPresenter( } ?: "", ) - if (preferences.showLibrarySearchSuggestions().isNotSet()) { + if (!preferences.showLibrarySearchSuggestions().isSet()) { preferences.showLibrarySearchSuggestions().set(true) } preferences.lastLibrarySuggestion().set(Date().time) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/filter/FilterBottomSheet.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/filter/FilterBottomSheet.kt index 37006ab4a2..122ca9b61a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/filter/FilterBottomSheet.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/filter/FilterBottomSheet.kt @@ -204,7 +204,7 @@ class FilterBottomSheet @JvmOverloads constructor(context: Context, attrs: Attri setExpandText(controller.canCollapseOrExpandCategory(), false) - preferences.filterOrder().asFlow() + preferences.filterOrder().changes() .drop(1) .onEach { filterOrder = it diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/filter/FilterTagGroup.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/filter/FilterTagGroup.kt index 1762d61a01..9126ec367d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/filter/FilterTagGroup.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/filter/FilterTagGroup.kt @@ -6,8 +6,8 @@ import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import androidx.core.view.isVisible -import com.fredporciuncula.flow.preferences.Preference import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.core.preference.Preference import eu.kanade.tachiyomi.databinding.FilterTagGroupBinding import eu.kanade.tachiyomi.util.system.dpToPx import eu.kanade.tachiyomi.util.system.getResourceColor 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 26e4de7950..0136deffd0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt @@ -78,7 +78,7 @@ import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.library.LibraryUpdateJob import eu.kanade.tachiyomi.data.notification.NotificationReceiver import eu.kanade.tachiyomi.data.notification.Notifications -import eu.kanade.tachiyomi.data.preference.asImmediateFlowIn +import eu.kanade.tachiyomi.data.preference.changesIn import eu.kanade.tachiyomi.data.updater.AppUpdateChecker import eu.kanade.tachiyomi.data.updater.AppUpdateNotifier import eu.kanade.tachiyomi.data.updater.AppUpdateResult @@ -641,17 +641,17 @@ open class MainActivity : BaseActivity() { getExtensionUpdates(true) preferences.extensionUpdatesCount() - .asImmediateFlowIn(lifecycleScope) { + .changesIn(lifecycleScope) { setExtensionsBadge() } preferences.incognitoMode() - .asImmediateFlowIn(lifecycleScope) { + .changesIn(lifecycleScope) { binding.toolbar.setIncognitoMode(it) binding.searchToolbar.setIncognitoMode(it) SecureActivityDelegate.setSecure(this) } preferences.sideNavIconAlignment() - .asImmediateFlowIn(lifecycleScope) { + .changesIn(lifecycleScope) { binding.sideNav?.menuGravity = when (it) { 1 -> Gravity.CENTER 2 -> Gravity.BOTTOM diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/migration/manga/design/MigrationBottomSheetDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/migration/manga/design/MigrationBottomSheetDialog.kt index 5b8cbd57d7..d534ec6198 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/migration/manga/design/MigrationBottomSheetDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/migration/manga/design/MigrationBottomSheetDialog.kt @@ -18,8 +18,8 @@ import androidx.core.view.children import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams import com.bluelinelabs.conductor.Controller -import com.fredporciuncula.flow.preferences.Preference 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.migration.MigrationFlags diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/more/OverflowDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/more/OverflowDialog.kt index 240411fcd1..4b61566d76 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/more/OverflowDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/more/OverflowDialog.kt @@ -13,7 +13,7 @@ import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.preference.PreferencesHelper -import eu.kanade.tachiyomi.data.preference.toggle +import eu.kanade.tachiyomi.core.preference.toggle import eu.kanade.tachiyomi.databinding.TachiOverflowLayoutBinding import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.util.lang.addBetaTag 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 a3e78c4f04..e50e69a9ed 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 @@ -37,7 +37,6 @@ import android.view.animation.AnimationUtils import android.widget.TextView import androidx.activity.BackEventCompat import androidx.activity.OnBackPressedCallback -import androidx.activity.addCallback import androidx.activity.viewModels import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.content.ContextCompat @@ -76,8 +75,8 @@ import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.Chapter import eu.kanade.tachiyomi.data.database.models.Manga -import eu.kanade.tachiyomi.data.preference.asImmediateFlowIn -import eu.kanade.tachiyomi.data.preference.toggle +import eu.kanade.tachiyomi.core.preference.toggle +import eu.kanade.tachiyomi.data.preference.changesIn import eu.kanade.tachiyomi.data.track.TrackService import eu.kanade.tachiyomi.databinding.ReaderActivityBinding import eu.kanade.tachiyomi.source.model.Page @@ -371,7 +370,7 @@ class ReaderActivity : BaseActivity() { initializeMenu() preferences.incognitoMode() - .asImmediateFlowIn(lifecycleScope) { + .changesIn(lifecycleScope) { SecureActivityDelegate.setSecure(this) } reEnableBackPressedCallBack() @@ -524,7 +523,7 @@ class ReaderActivity : BaseActivity() { } private fun canShowSplitAtBottom(): Boolean { - return if (preferences.readerBottomButtons().isNotSet()) { + return if (!preferences.readerBottomButtons().isSet()) { isTablet() } else { ReaderBottomButton.ShiftDoublePage.isIn(preferences.readerBottomButtons().get()) @@ -842,7 +841,7 @@ class ReaderActivity : BaseActivity() { listOf(preferences.cropBorders(), preferences.cropBordersWebtoon()) .forEach { pref -> - pref.asFlow() + pref.changes() .onEach { updateCropBordersShortcut() } .launchIn(scope) } @@ -1899,7 +1898,7 @@ class ReaderActivity : BaseActivity() { * Initializes the reader subscriptions. */ init { - preferences.defaultOrientationType().asFlow() + preferences.defaultOrientationType().changes() .drop(1) .onEach { delay(250) @@ -1907,38 +1906,38 @@ class ReaderActivity : BaseActivity() { } .launchIn(scope) - preferences.showPageNumber().asImmediateFlowIn(scope) { setPageNumberVisibility(it) } + preferences.showPageNumber().changesIn(scope) { setPageNumberVisibility(it) } - preferences.landscapeCutoutBehavior().asFlow() + preferences.landscapeCutoutBehavior().changes() .drop(1) .onEach { setCutoutMode() } .launchIn(scope) - preferences.trueColor().asImmediateFlowIn(scope) { setTrueColor(it) } + preferences.trueColor().changesIn(scope) { setTrueColor(it) } - preferences.fullscreen().asImmediateFlowIn(scope) { setFullscreen(it) } + preferences.fullscreen().changesIn(scope) { setFullscreen(it) } - preferences.keepScreenOn().asImmediateFlowIn(scope) { setKeepScreenOn(it) } + preferences.keepScreenOn().changesIn(scope) { setKeepScreenOn(it) } - preferences.customBrightness().asImmediateFlowIn(scope) { setCustomBrightness(it) } + preferences.customBrightness().changesIn(scope) { setCustomBrightness(it) } - preferences.colorFilter().asImmediateFlowIn(scope) { setColorFilter(it) } + preferences.colorFilter().changesIn(scope) { setColorFilter(it) } - preferences.colorFilterMode().asImmediateFlowIn(scope) { + preferences.colorFilterMode().changesIn(scope) { setColorFilter(preferences.colorFilter().get()) } - 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.alwaysShowChapterTransition().asImmediateFlowIn(scope) { + preferences.alwaysShowChapterTransition().changesIn(scope) { showNewChapter = it } - preferences.pageLayout().asImmediateFlowIn(scope) { setBottomNavButtons(it) } + preferences.pageLayout().changesIn(scope) { setBottomNavButtons(it) } - preferences.automaticSplitsPage().asFlow() + preferences.automaticSplitsPage().changes() .drop(1) .onEach { val isPaused = !this@ReaderActivity.lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED) @@ -1950,7 +1949,7 @@ class ReaderActivity : BaseActivity() { } .launchIn(scope) - preferences.readerBottomButtons().asImmediateFlowIn(scope) { updateBottomShortcuts() } + preferences.readerBottomButtons().changesIn(scope) { updateBottomShortcuts() } } /** @@ -1996,7 +1995,7 @@ class ReaderActivity : BaseActivity() { */ private fun setCustomBrightness(enabled: Boolean) { if (enabled) { - preferences.customBrightnessValue().asFlow() + preferences.customBrightnessValue().changes() .sample(100) .onEach { setCustomBrightnessValue(it) } .launchIn(scope) @@ -2010,7 +2009,7 @@ class ReaderActivity : BaseActivity() { */ private fun setColorFilter(enabled: Boolean) { if (enabled) { - preferences.colorFilterValue().asFlow() + preferences.colorFilterValue().changes() .sample(100) .onEach { setColorFilterValue(it) } .launchIn(scope) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/settings/ReaderFilterView.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/settings/ReaderFilterView.kt index 84f2986e6b..05ec2094bf 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/settings/ReaderFilterView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/settings/ReaderFilterView.kt @@ -26,15 +26,15 @@ class ReaderFilterView @JvmOverloads constructor(context: Context, attrs: Attrib override fun inflateBinding() = ReaderColorFilterBinding.bind(this) override fun initGeneralPreferences() { activity = context as? ReaderActivity ?: return - preferences.colorFilter().asFlow() + preferences.colorFilter().changes() .onEach { setColorFilter(it) } .launchIn(activity.scope) - preferences.colorFilterMode().asFlow() + preferences.colorFilterMode().changes() .onEach { setColorFilter(preferences.colorFilter().get()) } .launchIn(activity.scope) - preferences.customBrightness().asFlow() + preferences.customBrightness().changes() .onEach { setCustomBrightness(it) } .launchIn(activity.scope) @@ -152,7 +152,7 @@ class ReaderFilterView @JvmOverloads constructor(context: Context, attrs: Attrib */ private fun setCustomBrightness(enabled: Boolean) { if (enabled) { - preferences.customBrightnessValue().asFlow() + preferences.customBrightnessValue().changes() .sample(100) .onEach { setCustomBrightnessValue(it) } .launchIn(activity.scope) @@ -189,7 +189,7 @@ class ReaderFilterView @JvmOverloads constructor(context: Context, attrs: Attrib */ private fun setColorFilter(enabled: Boolean) { if (enabled) { - preferences.colorFilterValue().asFlow() + preferences.colorFilterValue().changes() .sample(100) .onEach { setColorFilterValue(it) } .launchIn(activity.scope) 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 60b5e8d1ad..2d269a66f7 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,10 +1,9 @@ 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.PreferencesHelper +import eu.kanade.tachiyomi.data.preference.changesIn import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach /** * Common configuration for all viewers. @@ -52,12 +51,10 @@ abstract class ViewerConfig(preferences: PreferencesHelper, protected val scope: valueAssignment: (T) -> Unit, onChanged: (T) -> Unit = {}, ) { - asFlow() - .onEach { - valueAssignment(it) - onChanged(it) - } - .launchIn(scope) + changesIn(scope) { + valueAssignment(it) + onChanged(it) + } } protected abstract fun defaultNavigation(): ViewerNavigation 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 3aac71b74f..b8b41efc61 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 @@ -92,7 +92,7 @@ class PagerConfig( }, ) - preferences.pagerNavInverted().asFlow() + preferences.pagerNavInverted().changes() .drop(1) .onEach { navigationModeInvertedListener?.invoke() @@ -121,7 +121,7 @@ class PagerConfig( .register({ invertDoublePages = it }, { imagePropertyChangedListener?.invoke() }) preferences.pageLayout() - .asFlow() + .changes() .drop(1) .onEach { autoDoublePages = it == PageLayout.AUTOMATIC.value 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 75b9408a49..2e341ad697 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 @@ -57,7 +57,7 @@ class WebtoonConfig( }, ) - preferences.webtoonNavInverted().asFlow() + preferences.webtoonNavInverted().changes() .drop(1) .onEach { navigationModeInvertedListener?.invoke() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentMangaAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentMangaAdapter.kt index d7675ff5c3..6888434df4 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentMangaAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentMangaAdapter.kt @@ -2,12 +2,12 @@ package eu.kanade.tachiyomi.ui.recents import android.view.View import androidx.recyclerview.widget.ItemTouchHelper -import com.fredporciuncula.flow.preferences.Preference import eu.davidea.flexibleadapter.items.IFlexible +import eu.kanade.tachiyomi.core.preference.Preference import eu.kanade.tachiyomi.data.database.models.Chapter import eu.kanade.tachiyomi.data.database.models.ChapterHistory import eu.kanade.tachiyomi.data.preference.PreferencesHelper -import eu.kanade.tachiyomi.data.preference.asImmediateFlowIn +import eu.kanade.tachiyomi.data.preference.changesIn import eu.kanade.tachiyomi.ui.manga.chapter.BaseChapterAdapter import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.drop @@ -63,19 +63,19 @@ class RecentMangaAdapter(val delegate: RecentsInterface) : preferences.uniformGrid().register { uniformCovers = it } preferences.collapseGroupedUpdates().register { collapseGroupedUpdates = it } preferences.collapseGroupedHistory().register { collapseGroupedHistory = it } - preferences.sortFetchedTime().asImmediateFlowIn(delegate.scope()) { sortByFetched = it } + preferences.sortFetchedTime().changesIn(delegate.scope()) { sortByFetched = it } preferences.outlineOnCovers().register(false) { showOutline = it (0 until itemCount).forEach { i -> (recyclerView.findViewHolderForAdapterPosition(i) as? RecentMangaHolder)?.updateCards() } } - preferences.libraryUpdateLastTimestamp().asFlow().onEach { + preferences.libraryUpdateLastTimestamp().changesIn(delegate.scope()) { lastUpdatedTime = it if (viewType.isUpdates) { notifyItemChanged(0) } - }.launchIn(delegate.scope()) + } } fun getItemByChapterId(id: Long): RecentMangaItem? { @@ -86,7 +86,7 @@ class RecentMangaAdapter(val delegate: RecentsInterface) : } private fun Preference.register(notify: Boolean = true, onChanged: (T) -> Unit) { - asFlow() + changes() .drop(1) .onEach { onChanged(it) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsPresenter.kt index 35d94a2903..b3d66c5c5e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsPresenter.kt @@ -101,7 +101,7 @@ class RecentsPresenter( preferences.showReadInAllRecents(), preferences.sortFetchedTime(), ).forEach { - it.asFlow() + it.changes() .drop(1) .onEach { resetOffsets() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/PreferenceDSL.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/PreferenceDSL.kt index a073a63e91..3af1c97e05 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/PreferenceDSL.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/PreferenceDSL.kt @@ -28,7 +28,6 @@ import eu.kanade.tachiyomi.widget.preference.IntListMatPreference import eu.kanade.tachiyomi.widget.preference.ListMatPreference import eu.kanade.tachiyomi.widget.preference.MultiListMatPreference import eu.kanade.tachiyomi.widget.preference.TriStateListPreference -import com.fredporciuncula.flow.preferences.Preference as FlowPreference @DslMarker @Target(AnnotationTarget.TYPE) @@ -156,24 +155,24 @@ inline fun Preference.onChange(crossinline block: (Any?) -> Boolean) { setOnPreferenceChangeListener { _, newValue -> block(newValue) } } -fun Preference.bindTo(preference: FlowPreference) { - key = preference.key - defaultValue = preference.defaultValue +fun Preference.bindTo(preference: eu.kanade.tachiyomi.core.preference.Preference) { + key = preference.key() + defaultValue = preference.defaultValue() } -fun ListPreference.bindTo(preference: FlowPreference) { - key = preference.key - defaultValue = preference.defaultValue.toString() +fun ListPreference.bindTo(preference: eu.kanade.tachiyomi.core.preference.Preference) { + key = preference.key() + defaultValue = preference.defaultValue().toString() } -fun EditTextPreference.bindTo(preference: FlowPreference) { - key = preference.key - defaultValue = preference.defaultValue.toString() +fun EditTextPreference.bindTo(preference: eu.kanade.tachiyomi.core.preference.Preference) { + key = preference.key() + defaultValue = preference.defaultValue().toString() } -fun ListMatPreference.bindTo(preference: FlowPreference) { - key = preference.key - val defValue = preference.defaultValue +fun ListMatPreference.bindTo(preference: eu.kanade.tachiyomi.core.preference.Preference) { + key = preference.key() + val defValue = preference.defaultValue() defaultValue = if (defValue is Set<*>) defValue else defValue.toString() } @@ -182,20 +181,20 @@ fun ListMatPreference.bindTo(preference: FlowPreference) { ReplaceWith("bindTo(preference, excludePreference = )"), DeprecationLevel.ERROR, ) -fun TriStateListPreference.bindTo(preference: FlowPreference) { key = preference.key } +fun TriStateListPreference.bindTo(preference: eu.kanade.tachiyomi.core.preference.Preference) { key = preference.key() } fun TriStateListPreference.bindTo( - includePreference: FlowPreference>, - excludePreference: FlowPreference>, + includePreference: eu.kanade.tachiyomi.core.preference.Preference>, + excludePreference: eu.kanade.tachiyomi.core.preference.Preference>, ) { - key = includePreference.key - excludeKey = excludePreference.key - defaultValue = includePreference.defaultValue to excludePreference.defaultValue + key = includePreference.key() + excludeKey = excludePreference.key() + defaultValue = includePreference.defaultValue() to excludePreference.defaultValue() } -fun IntListMatPreference.bindTo(preference: FlowPreference) { - key = preference.key - defaultValue = preference.defaultValue +fun IntListMatPreference.bindTo(preference: eu.kanade.tachiyomi.core.preference.Preference) { + key = preference.key() + defaultValue = preference.defaultValue() } fun SwitchPreferenceCompat.requireAuthentication( 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 8ccb0d1a19..e0be4eaf81 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 @@ -26,7 +26,7 @@ import eu.kanade.tachiyomi.data.download.DownloadProvider import eu.kanade.tachiyomi.data.library.LibraryUpdateJob import eu.kanade.tachiyomi.data.library.LibraryUpdateJob.Target import eu.kanade.tachiyomi.data.preference.PreferenceKeys -import eu.kanade.tachiyomi.data.preference.asImmediateFlowIn +import eu.kanade.tachiyomi.data.preference.changesIn import eu.kanade.tachiyomi.extension.ShizukuInstaller import eu.kanade.tachiyomi.extension.util.ExtensionInstaller import eu.kanade.tachiyomi.network.NetworkHelper @@ -364,7 +364,7 @@ class SettingsAdvancedController : SettingsController() { } } infoPreference(R.string.ext_installer_summary).apply { - preferences.extensionInstaller().asImmediateFlowIn(viewScope) { + preferences.extensionInstaller().changesIn(viewScope) { isVisible = it != ExtensionInstaller.PACKAGE_INSTALLER && Build.VERSION.SDK_INT < Build.VERSION_CODES.S } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAppearanceController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAppearanceController.kt index 3d8a911a4f..20ceb0064a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAppearanceController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAppearanceController.kt @@ -8,8 +8,7 @@ import androidx.core.view.doOnNextLayout import androidx.core.view.isVisible import androidx.preference.PreferenceScreen import eu.kanade.tachiyomi.R -import eu.kanade.tachiyomi.data.preference.asImmediateFlow -import eu.kanade.tachiyomi.data.preference.asImmediateFlowIn +import eu.kanade.tachiyomi.data.preference.changesIn import eu.kanade.tachiyomi.util.system.SideNavMode import eu.kanade.tachiyomi.util.system.appDelegateNightMode import eu.kanade.tachiyomi.util.system.dpToPx @@ -18,6 +17,7 @@ import eu.kanade.tachiyomi.util.system.isInNightMode import eu.kanade.tachiyomi.util.view.activityBinding import eu.kanade.tachiyomi.util.view.moveRecyclerViewUp import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach import kotlin.math.max import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys @@ -61,7 +61,7 @@ class SettingsAppearanceController : SettingsController() { } true } - preferences.nightMode().asImmediateFlow { mode -> + preferences.nightMode().changes().onEach { mode -> isChecked = mode == AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM }.launchIn(viewScope) } @@ -71,7 +71,7 @@ class SettingsAppearanceController : SettingsController() { titleRes = R.string.pure_black_dark_mode defaultValue = false - preferences.nightMode().asImmediateFlowIn(viewScope) { mode -> + preferences.nightMode().changesIn(viewScope) { mode -> isVisible = mode != AppCompatDelegate.MODE_NIGHT_NO } 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 088300fe6a..8f811329ba 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 @@ -122,10 +122,11 @@ class SettingsBackupController : SettingsController() { visibleIf(preferences.backupInterval()) { it > 0 } - preferences.backupsDirectory().asFlow() + preferences.backupsDirectory().changes() .onEach { path -> val dir = UniFile.fromUri(context, path.toUri()) - summary = dir.filePath + "/automatic" + val filePath = dir.filePath + summary = if (filePath != null) "$filePath/automatic" else "Invalid directory: $dir" } .launchIn(viewScope) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBrowseController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBrowseController.kt index d156623180..6f32406ae9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBrowseController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBrowseController.kt @@ -10,7 +10,7 @@ import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.data.preference.PreferenceKeys -import eu.kanade.tachiyomi.data.preference.asImmediateFlowIn +import eu.kanade.tachiyomi.data.preference.changesIn import eu.kanade.tachiyomi.data.updater.AppDownloadInstallJob import eu.kanade.tachiyomi.extension.ExtensionManager import eu.kanade.tachiyomi.extension.ExtensionUpdateJob @@ -95,7 +95,7 @@ class SettingsBrowseController : SettingsController() { } else { null } - preferences.automaticExtUpdates().asImmediateFlowIn(viewScope) { value -> + preferences.automaticExtUpdates().changesIn(viewScope) { value -> arrayOf(intPref, infoPref, switchPref).forEach { it?.isVisible = value } } } 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 dacfe5e64c..884e6ad606 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 @@ -21,7 +21,7 @@ import com.bluelinelabs.conductor.ControllerChangeHandler import com.bluelinelabs.conductor.ControllerChangeType import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.preference.PreferencesHelper -import eu.kanade.tachiyomi.data.preference.asImmediateFlowIn +import eu.kanade.tachiyomi.data.preference.changesIn import eu.kanade.tachiyomi.ui.base.controller.BaseController import eu.kanade.tachiyomi.ui.main.FloatingSearchInterface import eu.kanade.tachiyomi.ui.main.MainActivity @@ -136,7 +136,7 @@ abstract class SettingsController : PreferenceController(), BackHandlerControlle super.onChangeStarted(handler, type) } - inline fun Preference.visibleIf(preference: com.fredporciuncula.flow.preferences.Preference, crossinline block: (T) -> Boolean) { - preference.asImmediateFlowIn(viewScope) { isVisible = block(it) } + inline fun Preference.visibleIf(preference: eu.kanade.tachiyomi.core.preference.Preference, crossinline block: (T) -> Boolean) { + preference.changesIn(viewScope) { isVisible = block(it) } } } 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 6e78d053e2..377f994eae 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 @@ -13,7 +13,7 @@ import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.models.Category import eu.kanade.tachiyomi.data.preference.PreferencesHelper -import eu.kanade.tachiyomi.data.preference.asImmediateFlowIn +import eu.kanade.tachiyomi.data.preference.changesIn import eu.kanade.tachiyomi.util.system.withOriginalWidth import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -35,7 +35,7 @@ class SettingsDownloadController : SettingsController() { DownloadDirectoriesDialog(this@SettingsDownloadController).show() } - preferences.downloadsDirectory().asImmediateFlowIn(viewScope) { path -> + preferences.downloadsDirectory().changesIn(viewScope) { path -> val dir = UniFile.fromUri(context, path.toUri()) summary = dir.filePath ?: path } @@ -86,7 +86,7 @@ class SettingsDownloadController : SettingsController() { entries = categories.map { it.name } entryValues = categories.map { it.id.toString() } noSelectionRes = R.string.none - preferences.removeAfterReadSlots().asImmediateFlowIn(viewScope) { isVisible = it != -1 } + preferences.removeAfterReadSlots().changesIn(viewScope) { isVisible = it != -1 } } switchPreference { bindTo(preferences.removeBookmarkedChapters()) @@ -110,7 +110,7 @@ class SettingsDownloadController : SettingsController() { entryValues = categories.map { it.id.toString() } allSelectionRes = R.string.all - preferences.downloadNewChapters().asImmediateFlowIn(viewScope) { isVisible = it } + preferences.downloadNewChapters().changesIn(viewScope) { isVisible = it } } } 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 8ce78bc2ee..14bbc2d2fa 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 @@ -5,14 +5,7 @@ import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.models.Category import eu.kanade.tachiyomi.data.library.LibraryUpdateJob -import eu.kanade.tachiyomi.data.preference.DEVICE_BATTERY_NOT_LOW -import eu.kanade.tachiyomi.data.preference.DEVICE_CHARGING -import eu.kanade.tachiyomi.data.preference.DEVICE_ONLY_ON_WIFI -import eu.kanade.tachiyomi.data.preference.DelayedLibrarySuggestionsJob -import eu.kanade.tachiyomi.data.preference.MANGA_HAS_UNREAD -import eu.kanade.tachiyomi.data.preference.MANGA_NON_COMPLETED -import eu.kanade.tachiyomi.data.preference.MANGA_NON_READ -import eu.kanade.tachiyomi.data.preference.asImmediateFlowIn +import eu.kanade.tachiyomi.data.preference.* import eu.kanade.tachiyomi.ui.category.CategoryController import eu.kanade.tachiyomi.ui.library.LibraryPresenter import eu.kanade.tachiyomi.ui.library.display.TabbedLibraryDisplaySheet @@ -145,7 +138,7 @@ class SettingsLibraryController : SettingsController() { preSummaryRes = R.string.restrictions_ noSelectionRes = R.string.none - preferences.libraryUpdateInterval().asImmediateFlowIn(viewScope) { + preferences.libraryUpdateInterval().changesIn(viewScope) { isVisible = it > 0 } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsReaderController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsReaderController.kt index 4a75bf8ab1..9969a510d6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsReaderController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsReaderController.kt @@ -7,8 +7,7 @@ import androidx.core.content.getSystemService import androidx.preference.PreferenceScreen import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.preference.PreferenceValues -import eu.kanade.tachiyomi.data.preference.asImmediateFlow -import eu.kanade.tachiyomi.data.preference.asImmediateFlowIn +import eu.kanade.tachiyomi.data.preference.changesIn import eu.kanade.tachiyomi.ui.reader.settings.OrientationType import eu.kanade.tachiyomi.ui.reader.settings.PageLayout import eu.kanade.tachiyomi.ui.reader.settings.ReaderBackgroundColor @@ -277,19 +276,19 @@ class SettingsReaderController : SettingsController() { defaultValue = PageLayout.AUTOMATIC.value } infoPreference(R.string.automatic_can_still_switch).apply { - preferences.pageLayout().asImmediateFlowIn(viewScope) { isVisible = it == PageLayout.AUTOMATIC.value } + preferences.pageLayout().changesIn(viewScope) { isVisible = it == PageLayout.AUTOMATIC.value } } switchPreference { key = Keys.automaticSplitsPage titleRes = R.string.split_double_pages_portrait defaultValue = false - preferences.pageLayout().asImmediateFlowIn(viewScope) { isVisible = it == PageLayout.AUTOMATIC.value } + preferences.pageLayout().changesIn(viewScope) { isVisible = it == PageLayout.AUTOMATIC.value } } switchPreference { key = Keys.invertDoublePages titleRes = R.string.invert_double_pages defaultValue = false - preferences.pageLayout().asImmediateFlowIn(viewScope) { isVisible = it != PageLayout.SINGLE_PAGE.value } + preferences.pageLayout().changesIn(viewScope) { isVisible = it != PageLayout.SINGLE_PAGE.value } } } preferenceCategory { @@ -383,7 +382,7 @@ class SettingsReaderController : SettingsController() { titleRes = R.string.invert_volume_keys defaultValue = false - preferences.readWithVolumeKeys().asImmediateFlow { isVisible = it }.launchIn(viewScope) + preferences.readWithVolumeKeys().changesIn(viewScope) { isVisible = it } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsSecurityController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsSecurityController.kt index 7fca50b8af..4cc112bda6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsSecurityController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsSecurityController.kt @@ -5,7 +5,7 @@ import androidx.preference.PreferenceScreen import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.preference.PreferenceKeys import eu.kanade.tachiyomi.data.preference.PreferenceValues -import eu.kanade.tachiyomi.data.preference.asImmediateFlowIn +import eu.kanade.tachiyomi.data.preference.changesIn import eu.kanade.tachiyomi.ui.security.SecureActivityDelegate import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.isAuthenticationSupported @@ -43,7 +43,7 @@ class SettingsSecurityController : SettingsController() { entryValues = values defaultValue = 0 - preferences.useBiometrics().asImmediateFlowIn(viewScope) { isVisible = it } + preferences.useBiometrics().changesIn(viewScope) { isVisible = it } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsSourcesController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsSourcesController.kt index 12e71ecae0..dae27850a9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsSourcesController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsSourcesController.kt @@ -9,8 +9,8 @@ import androidx.preference.CheckBoxPreference import androidx.preference.PreferenceGroup import androidx.preference.PreferenceScreen import eu.kanade.tachiyomi.R -import eu.kanade.tachiyomi.data.preference.minusAssign -import eu.kanade.tachiyomi.data.preference.plusAssign +import eu.kanade.tachiyomi.core.preference.minusAssign +import eu.kanade.tachiyomi.core.preference.plusAssign import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.icon import eu.kanade.tachiyomi.source.online.HttpSource diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsTrackingController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsTrackingController.kt index fbb1303f34..5f83597b26 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsTrackingController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsTrackingController.kt @@ -4,7 +4,7 @@ import android.app.Activity import androidx.preference.PreferenceGroup import androidx.preference.PreferenceScreen import eu.kanade.tachiyomi.R -import eu.kanade.tachiyomi.data.preference.asImmediateFlowIn +import eu.kanade.tachiyomi.data.preference.changesIn import eu.kanade.tachiyomi.data.track.EnhancedTrackService import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.data.track.TrackPreferences @@ -62,7 +62,7 @@ class SettingsTrackingController : title = context.getString(R.string.update_tracking_scoring_type, context.getString(R.string.anilist)) preferences.getStringPref(trackManager.aniList.getUsername()) - .asImmediateFlowIn(viewScope) { + .changesIn(viewScope) { isVisible = it.isNotEmpty() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/source/BrowseController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/source/BrowseController.kt index 2ba51e2e7f..18ec518b70 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/source/BrowseController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/source/BrowseController.kt @@ -176,7 +176,7 @@ class BrowseController : requestFilePermissionsSafe(301, preferences) binding.bottomSheet.root.onCreate(this) - preferences.extensionInstaller().asFlow() + preferences.extensionInstaller().changes() .drop(1) .onEach { binding.bottomSheet.root.setCanInstallPrivately(it == ExtensionInstaller.PRIVATE) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/source/SourcePresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/source/SourcePresenter.kt index 07ff83d89f..b71c4c4c10 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/source/SourcePresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/source/SourcePresenter.kt @@ -96,7 +96,7 @@ class SourcePresenter( private fun loadLastUsedSource() { lastUsedJob?.cancel() - lastUsedJob = preferences.lastUsedCatalogueSource().asFlow() + lastUsedJob = preferences.lastUsedCatalogueSource().changes() .drop(1) .onEach { lastUsedItem = getLastUsedSource(it) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/source/browse/BrowseSourceItem.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/source/browse/BrowseSourceItem.kt index ded29b777b..3225cbe79c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/source/browse/BrowseSourceItem.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/source/browse/BrowseSourceItem.kt @@ -8,11 +8,11 @@ import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat import androidx.core.view.updateLayoutParams import androidx.recyclerview.widget.RecyclerView -import com.fredporciuncula.flow.preferences.Preference import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import eu.davidea.flexibleadapter.items.IFlexible import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.core.preference.Preference import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.databinding.MangaGridItemBinding import eu.kanade.tachiyomi.ui.library.LibraryItem diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/webview/BaseWebViewActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/webview/BaseWebViewActivity.kt index 5d9d4decb8..54aa271a7f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/webview/BaseWebViewActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/webview/BaseWebViewActivity.kt @@ -27,7 +27,7 @@ import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding import androidx.lifecycle.lifecycleScope import eu.kanade.tachiyomi.R -import eu.kanade.tachiyomi.data.preference.asImmediateFlowIn +import eu.kanade.tachiyomi.data.preference.changesIn import eu.kanade.tachiyomi.databinding.WebviewActivityBinding import eu.kanade.tachiyomi.ui.base.activity.BaseActivity import eu.kanade.tachiyomi.ui.security.SecureActivityDelegate @@ -151,7 +151,7 @@ open class BaseWebViewActivity : BaseActivity() { } preferences.incognitoMode() - .asImmediateFlowIn(lifecycleScope) { + .changesIn(lifecycleScope) { SecureActivityDelegate.setSecure(this) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/PreferenceExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/PreferenceExtensions.kt index 8f9e80f5e4..ba5bd43b33 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/PreferenceExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/PreferenceExtensions.kt @@ -5,7 +5,7 @@ import android.widget.CompoundButton import android.widget.RadioButton import android.widget.RadioGroup import android.widget.Spinner -import com.fredporciuncula.flow.preferences.Preference +import eu.kanade.tachiyomi.core.preference.Preference import eu.kanade.tachiyomi.widget.IgnoreFirstSpinnerListener inline fun SharedPreferences.getItem(key: String, default: T): T { diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/view/ControllerExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/view/ControllerExtensions.kt index af104354b5..0d63ae638d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/view/ControllerExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/view/ControllerExtensions.kt @@ -820,7 +820,7 @@ fun Controller.requestFilePermissionsSafe( } .setNegativeButton(android.R.string.cancel, null) .show() - } else if ((Build.VERSION.SDK_INT < Build.VERSION_CODES.R || Environment.isExternalStorageManager()) && preferences.backupInterval().isNotSet()) { + } else if ((Build.VERSION.SDK_INT < Build.VERSION_CODES.R || Environment.isExternalStorageManager()) && !preferences.backupInterval().isSet()) { preferences.backupInterval().set(24) BackupCreatorJob.setupTask(activity, 24) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/AutofitRecyclerView.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/AutofitRecyclerView.kt index 871a1bf9c4..a5ca9816d2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/AutofitRecyclerView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/AutofitRecyclerView.kt @@ -139,7 +139,7 @@ class AutofitRecyclerView @JvmOverloads constructor(context: Context, attrs: Att fun setGridSize(preferences: PreferencesHelper) { // Migrate to float for grid size - if (preferences.gridSize().isNotSet()) { + if (!preferences.gridSize().isSet()) { val prefs = PreferenceManager.getDefaultSharedPreferences(context) val oldGridSize = prefs.getInt("grid_size", -1) if (oldGridSize != -1) { 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 aa4f0a09ce..1096af86b6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/MaterialSpinnerView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/MaterialSpinnerView.kt @@ -16,8 +16,8 @@ import androidx.core.content.ContextCompat import androidx.core.graphics.ColorUtils 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.MaterialSpinnerViewBinding import eu.kanade.tachiyomi.util.lang.tintText import eu.kanade.tachiyomi.util.system.getResourceColor 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 054d5982eb..1deaa32997 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/TachiyomiTextInputEditText.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/TachiyomiTextInputEditText.kt @@ -7,12 +7,11 @@ import androidx.core.view.inputmethod.EditorInfoCompat import com.google.android.material.textfield.TextInputEditText import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.preference.PreferencesHelper -import eu.kanade.tachiyomi.data.preference.asImmediateFlow +import eu.kanade.tachiyomi.data.preference.changesIn import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.cancel -import kotlinx.coroutines.flow.launchIn import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -49,13 +48,13 @@ class TachiyomiTextInputEditText @JvmOverloads constructor( */ fun EditText.setIncognito(viewScope: CoroutineScope) { try { - Injekt.get().incognitoMode().asImmediateFlow { + Injekt.get().incognitoMode().changesIn(viewScope) { imeOptions = if (it) { imeOptions or EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING } else { imeOptions and EditorInfoCompat.IME_FLAG_NO_PERSONALIZED_LEARNING.inv() } - }.launchIn(viewScope) + } } catch (_: Exception) { } } diff --git a/gradle/androidx.versions.toml b/gradle/androidx.versions.toml index f749c0bdad..643332de2c 100644 --- a/gradle/androidx.versions.toml +++ b/gradle/androidx.versions.toml @@ -1,5 +1,5 @@ [versions] -activity = "1.8.0" +activity = "1.8.2" lifecycle = "2.6.2" [libraries] @@ -20,7 +20,7 @@ lifecycle-process = { module = "androidx.lifecycle:lifecycle-process", version.r lifecycle-runtime = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycle" } multidex = { module = "androidx.multidex:multidex", version = "2.0.1" } palette = { module = "androidx.palette:palette", version = "1.0.0" } -preference = { module = "androidx.preference:preference", version = "1.2.1" } +preference = { module = "androidx.preference:preference-ktx", version = "1.2.1" } recyclerview = { module = "androidx.recyclerview:recyclerview", version = "1.3.1" } sqlite = { module = "androidx.sqlite:sqlite", version = "2.3.1" } swiperefreshlayout = { module = "androidx.swiperefreshlayout:swiperefreshlayout", version = "1.1.0" } diff --git a/gradle/compose.versions.toml b/gradle/compose.versions.toml index be254e90c1..29dc117ae1 100644 --- a/gradle/compose.versions.toml +++ b/gradle/compose.versions.toml @@ -1,5 +1,5 @@ [versions] -compose = "1.5.1" +compose = "1.5.3" [libraries] animation = { module = "androidx.compose.animation:animation", version.ref = "compose" } diff --git a/gradle/kotlinx.versions.toml b/gradle/kotlinx.versions.toml index 24544a878e..2631b09286 100644 --- a/gradle/kotlinx.versions.toml +++ b/gradle/kotlinx.versions.toml @@ -1,5 +1,5 @@ [versions] -kotlin = "1.9.20" +kotlin = "1.9.10" coroutines = "1.7.3" serialization = "1.6.0" diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3983b048e1..f56e1a3ad3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -26,7 +26,6 @@ firebase-crashlytics-gradle = { module = "com.google.firebase:firebase-crashlyti flexbox = { module = "com.google.android.flexbox:flexbox", version = "3.0.0" } flexible-adapter-ui = { module = "com.github.arkon.FlexibleAdapter:flexible-adapter-ui", version.ref = "flexible-adapter" } flexible-adapter = { module = "com.github.arkon.FlexibleAdapter:flexible-adapter", version.ref = "flexible-adapter" } -flow-preferences = { module = "com.fredporciuncula:flow-preferences", version = "1.6.0" } google-services = { module = "com.google.gms:google-services", version = "4.3.15" } gradle = { module = "com.android.tools.build:gradle", version = "8.1.4" } guava = { module = "com.google.guava:guava", version = "31.1-android" }