diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt index f00884ef76..9aaf17eea3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt @@ -131,9 +131,6 @@ object PreferenceKeys { const val libraryUpdateInterval = "pref_library_update_interval_key" - const val libraryUpdateCategories = "library_update_categories" - const val libraryUpdateCategoriesExclude = "library_update_categories_exclude" - const val filterDownloaded = "pref_filter_downloaded_key" const val filterUnread = "pref_filter_unread_key" @@ -160,9 +157,6 @@ object PreferenceKeys { const val downloadNew = "download_new" - const val downloadNewCategories = "download_new_categories" - const val downloadNewCategoriesExclude = "download_new_categories_exclude" - const val libraryLayout = "pref_display_library_layout" const val gridSize = "grid_size_float" 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 951f874a90..bceb50c477 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 @@ -260,8 +260,8 @@ class PreferencesHelper(val context: Context) { fun libraryUpdateMangaRestriction() = flowPrefs.getStringSet("library_update_manga_restriction", setOf(MANGA_HAS_UNREAD, MANGA_NON_COMPLETED, MANGA_NON_READ)) - fun libraryUpdateCategories() = flowPrefs.getStringSet(Keys.libraryUpdateCategories, emptySet()) - fun libraryUpdateCategoriesExclude() = flowPrefs.getStringSet(Keys.libraryUpdateCategoriesExclude, emptySet()) + fun libraryUpdateCategories() = flowPrefs.getStringSet("library_update_categories", emptySet()) + fun libraryUpdateCategoriesExclude() = flowPrefs.getStringSet("library_update_categories_exclude", emptySet()) fun libraryLayout() = flowPrefs.getInt(Keys.libraryLayout, LibraryItem.LAYOUT_COMFORTABLE_GRID) @@ -309,8 +309,8 @@ class PreferencesHelper(val context: Context) { fun downloadNewChapters() = flowPrefs.getBoolean(Keys.downloadNew, false) - fun downloadNewChaptersInCategories() = flowPrefs.getStringSet(Keys.downloadNewCategories, emptySet()) - fun excludeCategoriesInDownloadNew() = flowPrefs.getStringSet(Keys.downloadNewCategoriesExclude, emptySet()) + fun downloadNewChaptersInCategories() = flowPrefs.getStringSet("download_new_categories", emptySet()) + fun excludeCategoriesInDownloadNew() = flowPrefs.getStringSet("download_new_categories_exclude", emptySet()) fun autoDownloadAfterReading() = flowPrefs.getInt("auto_download_after_reading", 0) 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 bcf55855d3..6af04bebb4 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 @@ -27,6 +27,7 @@ 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) @@ -72,10 +73,7 @@ inline fun PreferenceGroup.listPreference( inline fun PreferenceGroup.intListPreference( activity: Activity?, - block: ( - @DSL - IntListMatPreference - ).() -> Unit, + block: (@DSL IntListMatPreference).() -> Unit, ): IntListMatPreference { return initThenAdd(IntListMatPreference(activity, context), block) @@ -83,22 +81,14 @@ inline fun PreferenceGroup.intListPreference( inline fun PreferenceGroup.multiSelectListPreferenceMat( activity: Activity?, - block: ( - @DSL - MultiListMatPreference - ).() - -> Unit, + block: (@DSL MultiListMatPreference).() -> Unit, ): MultiListMatPreference { return initThenAdd(MultiListMatPreference(activity, context), block) } inline fun PreferenceGroup.triStateListPreference( activity: Activity?, - block: ( - @DSL - TriStateListPreference - ).() - -> Unit, + block: (@DSL TriStateListPreference).() -> Unit, ): TriStateListPreference { return initThenAdd(TriStateListPreference(activity, context), block) } @@ -168,23 +158,39 @@ inline fun Preference.onChange(crossinline block: (Any?) -> Boolean) { setOnPreferenceChangeListener { _, newValue -> block(newValue) } } -fun Preference.bindTo(preference: com.fredporciuncula.flow.preferences.Preference) { +fun Preference.bindTo(preference: FlowPreference) { key = preference.key defaultValue = preference.defaultValue } -fun ListPreference.bindTo(preference: com.fredporciuncula.flow.preferences.Preference) { +fun ListPreference.bindTo(preference: FlowPreference) { key = preference.key defaultValue = preference.defaultValue.toString() } -fun ListMatPreference.bindTo(preference: com.fredporciuncula.flow.preferences.Preference) { +fun ListMatPreference.bindTo(preference: FlowPreference) { key = preference.key val defValue = preference.defaultValue defaultValue = if (defValue is Set<*>) defValue else defValue.toString() } -fun IntListMatPreference.bindTo(preference: com.fredporciuncula.flow.preferences.Preference) { +@Deprecated( + "Do not bind tri-states prefs with a single preference", + ReplaceWith("bindTo(preference, excludePreference = )"), + DeprecationLevel.ERROR, +) +fun TriStateListPreference.bindTo(preference: FlowPreference) { key = preference.key } + +fun TriStateListPreference.bindTo( + includePreference: FlowPreference>, + excludePreference: FlowPreference>, +) { + key = includePreference.key + excludeKey = excludePreference.key + defaultValue = includePreference.defaultValue to excludePreference.defaultValue +} + +fun IntListMatPreference.bindTo(preference: FlowPreference) { key = preference.key defaultValue = preference.defaultValue } 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 5d326386eb..a4c9d796aa 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 @@ -136,11 +136,7 @@ class SettingsAppearanceController : SettingsController() { intListPreference(activity) { key = Keys.sideNavIconAlignment titleRes = R.string.side_nav_icon_alignment - entriesRes = arrayOf( - R.string.top, - R.string.center, - R.string.bottom, - ) + entriesRes = arrayOf(R.string.top, R.string.center, R.string.bottom) entryRange = 0..2 defaultValue = 1 isVisible = max( 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 9f95c2f55e..88064302ac 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 @@ -86,8 +86,9 @@ class SettingsDownloadController : SettingsController() { titleRes = R.string.download_new_chapters } triStateListPreference(activity) { - key = Keys.downloadNewCategories - excludeKey = Keys.downloadNewCategoriesExclude + preferences.apply { + bindTo(downloadNewChaptersInCategories(), excludeCategoriesInDownloadNew()) + } titleRes = R.string.categories entries = categories.map { it.name } entryValues = categories.map { it.id.toString() } 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 8114c65f54..b82446624c 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 @@ -162,8 +162,9 @@ class SettingsLibraryController : SettingsController() { } triStateListPreference(activity) { - key = Keys.libraryUpdateCategories - excludeKey = Keys.libraryUpdateCategoriesExclude + preferences.apply { + bindTo(libraryUpdateCategories(), libraryUpdateCategoriesExclude()) + } titleRes = R.string.categories val categories = listOf(Category.createDefault(context)) + dbCategories diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/preference/IntListMatPreference.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/IntListMatPreference.kt index 93d631a940..4cd0b3b39a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/preference/IntListMatPreference.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/IntListMatPreference.kt @@ -3,14 +3,13 @@ package eu.kanade.tachiyomi.widget.preference import android.app.Activity import android.content.Context import android.util.AttributeSet +import androidx.core.content.edit import com.google.android.material.dialog.MaterialAlertDialogBuilder class IntListMatPreference @JvmOverloads constructor( activity: Activity?, context: Context, - attrs: - AttributeSet? = - null, + attrs: AttributeSet? = null, ) : MatPreference(activity, context, attrs) { var entryValues: List = emptyList() @@ -25,23 +24,23 @@ class IntListMatPreference @JvmOverloads constructor( var customSelectedValue: Int? = null override var customSummaryProvider: SummaryProvider? = SummaryProvider { - val index = entryValues.indexOf(prefs.getInt(key, defValue).get()) + val index = entryValues.indexOf(sharedPreferences?.getInt(key, defValue) ?: defValue) if (entries.isEmpty() || index == -1) "" else entries[index] } override fun onSetInitialValue(defaultValue: Any?) { super.onSetInitialValue(defaultValue) - defValue = defaultValue as? Int ?: defValue + defValue = defaultValue?.toString()?.toIntOrNull() ?: defValue } override fun dialog(): MaterialAlertDialogBuilder { return super.dialog().apply { - val default = entryValues.indexOf(customSelectedValue ?: prefs.getInt(key, defValue).get()) + val default = entryValues.indexOf(customSelectedValue ?: sharedPreferences?.getInt(key, defValue)) setSingleChoiceItems(entries.toTypedArray(), default) { dialog, pos -> val value = entryValues[pos] if (key != null) { - prefs.getInt(key, defValue).set(value) + sharedPreferences?.edit { putInt(key, value) } } callChangeListener(value) notifyChanged() diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/preference/ListMatPreference.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/ListMatPreference.kt index 57f472c7f5..a1a8c7bec3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/preference/ListMatPreference.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/ListMatPreference.kt @@ -4,7 +4,7 @@ import android.annotation.SuppressLint import android.app.Activity import android.content.Context import android.util.AttributeSet -import androidx.preference.Preference +import androidx.core.content.edit import com.google.android.material.dialog.MaterialAlertDialogBuilder open class ListMatPreference @JvmOverloads constructor( @@ -15,8 +15,6 @@ open class ListMatPreference @JvmOverloads constructor( ) : MatPreference(activity, context, attrs) { - var sharedPref: String? = null - var otherPref: Preference? = null var entryValues: List = emptyList() var entriesRes: Array get() = emptyArray() @@ -30,7 +28,7 @@ open class ListMatPreference @JvmOverloads constructor( } override var customSummaryProvider: SummaryProvider? = SummaryProvider { - val index = entryValues.indexOf(prefs.getStringPref(key, defValue).get()) + val index = entryValues.indexOf(sharedPreferences?.getString(key, defValue)) if (entries.isEmpty() || index == -1) "" else entries[index] } @@ -43,32 +41,12 @@ open class ListMatPreference @JvmOverloads constructor( @SuppressLint("CheckResult") open fun MaterialAlertDialogBuilder.setListItems() { - val default = entryValues.indexOf( - if (sharedPref != null) { - val settings = context.getSharedPreferences(sharedPref, Context.MODE_PRIVATE) - settings.getString(key, "") - } else prefs.getStringPref(key, defValue).get(), - ) + val default = entryValues.indexOf(sharedPreferences?.getString(key, defValue) ?: defValue) setSingleChoiceItems(entries.toTypedArray(), default) { dialog, pos -> val value = entryValues[pos] - if (sharedPref != null) { - val oldDef = if (default > -1) entries[default] else "" - val settings = context.getSharedPreferences(sharedPref, Context.MODE_PRIVATE) - val edit = settings.edit() - edit.putString(key, value) - edit.apply() - otherPref?.callChangeListener(value) - if (oldDef == otherPref?.summary || otherPref?.summary.isNullOrEmpty()) otherPref?.summary = - entries[pos] - else otherPref?.summary = otherPref?.summary?.toString()?.replace( - oldDef, - entries[pos], - ) ?: entries[pos] - } else { - prefs.getStringPref(key, defValue).set(value) - this@ListMatPreference.summary = this@ListMatPreference.summary - callChangeListener(value) - } + sharedPreferences?.edit { putString(key, value) } + this@ListMatPreference.summary = this@ListMatPreference.summary + callChangeListener(value) dialog.dismiss() } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/preference/MultiListMatPreference.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/MultiListMatPreference.kt index eb4c754b75..4895d8a246 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/preference/MultiListMatPreference.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/MultiListMatPreference.kt @@ -6,6 +6,7 @@ import android.content.Context import android.util.AttributeSet import androidx.appcompat.app.AlertDialog import androidx.appcompat.widget.AppCompatCheckedTextView +import androidx.core.content.edit import androidx.core.view.children import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.tachiyomi.util.system.disableItems @@ -43,7 +44,7 @@ class MultiListMatPreference @JvmOverloads constructor( } override var customSummaryProvider: SummaryProvider? = SummaryProvider { - var values = prefs.getStringSet(key, defValue).get().mapNotNull { value -> + var values = (sharedPreferences?.getStringSet(key, defValue) ?: defValue).mapNotNull { value -> entryValues.indexOf(value).takeUnless { it == -1 } }.toIntArray().sorted().map { entries[it] } allSelectionRes?.let { allRes -> @@ -63,7 +64,7 @@ class MultiListMatPreference @JvmOverloads constructor( @SuppressLint("CheckResult") override fun MaterialAlertDialogBuilder.setListItems() { - val set = prefs.getStringSet(key, defValue).get() + val set = sharedPreferences?.getStringSet(key, defValue) ?: defValue val items = if (allSelectionRes != null) { if (showAllLast) entries + listOf(context.getString(allSelectionRes!!)) else listOf(context.getString(allSelectionRes!!)) + entries @@ -83,7 +84,7 @@ class MultiListMatPreference @JvmOverloads constructor( entryValues.getOrNull(it - if (allSelectionRes != null && !showAllLast) 1 else 0) }.toSet() if (allSelectionRes != null && !allIsAlwaysSelected && selected[allPos]) value = emptySet() - prefs.getStringSet(key, emptySet()).set(value) + sharedPreferences?.edit { putStringSet(key, value) } callChangeListener(value) notifyChanged() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/preference/TriStateListPreference.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/TriStateListPreference.kt index 1d89fb82ba..00d4664971 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/preference/TriStateListPreference.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/TriStateListPreference.kt @@ -4,9 +4,11 @@ import android.annotation.SuppressLint import android.app.Activity import android.content.Context import android.util.AttributeSet +import androidx.core.content.edit import androidx.core.text.buildSpannedString import com.google.android.material.dialog.MaterialAlertDialogBuilder import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.ui.setting.defaultValue import eu.kanade.tachiyomi.util.system.setTriStateItems import eu.kanade.tachiyomi.widget.TriStateCheckBox @@ -36,30 +38,36 @@ class TriStateListPreference @JvmOverloads constructor( } private var defValue: Set = emptySet() + private var exlDefValue: Set = emptySet() override fun onSetInitialValue(defaultValue: Any?) { super.onSetInitialValue(defaultValue) - defValue = (defaultValue as? Collection<*>).orEmpty().mapNotNull { it as? String }.toSet() + defValue = when (defaultValue) { + is Pair<*, *> -> { + val firstCollection = (defaultValue.first as? Collection<*>).orEmpty() + val secondCollection = (defaultValue.second as? Collection<*>).orEmpty() + exlDefValue = secondCollection.mapNotNull { it as? String }.toSet() + firstCollection.mapNotNull { it as? String }.toSet() + } + else -> (defaultValue as? Collection<*>).orEmpty().mapNotNull { it as? String }.toSet() + } } override var customSummaryProvider: SummaryProvider? = SummaryProvider { - var includedStrings = prefs.getStringSet(key, defValue).get().mapNotNull { value -> + var includedStrings = sharedPreferences?.getStringSet(key, defValue)?.mapNotNull { value -> entryValues.indexOf(value).takeUnless { it == -1 } - }.toIntArray().sorted().map { entries[it] } + }?.toIntArray()?.sorted()?.map { entries[it] } ?: return@SummaryProvider "" allSelectionRes?.let { allRes -> when { includedStrings.isEmpty() -> includedStrings = listOf(context.getString(allRes)) allIsAlwaysSelected && !showAllLast -> - includedStrings = - listOf(context.getString(allRes)) + includedStrings + includedStrings = listOf(context.getString(allRes)) + includedStrings allIsAlwaysSelected -> includedStrings = includedStrings + context.getString(allRes) } } - val excludedStrings = excludeKey?.let { - prefs.getStringSet(it, defValue).get().mapNotNull { value -> - entryValues.indexOf(value).takeUnless { - it == -1 - } + val excludedStrings = excludeKey?.let { excludeKey -> + sharedPreferences?.getStringSet(excludeKey, exlDefValue)?.mapNotNull { value -> + entryValues.indexOf(value).takeUnless { it == -1 } } }?.toIntArray()?.sorted()?.map { entries[it] }?.takeIf { it.isNotEmpty() } ?: listOf(context.getString(R.string.none)) @@ -72,14 +80,14 @@ class TriStateListPreference @JvmOverloads constructor( @SuppressLint("CheckResult") override fun MaterialAlertDialogBuilder.setListItems() { - val set = prefs.getStringSet(key, defValue).get() + val set = sharedPreferences?.getStringSet(key, defValue) ?: defValue val items = if (allSelectionRes != null) { if (showAllLast) entries + listOf(context.getString(allSelectionRes!!)) else listOf(context.getString(allSelectionRes!!)) + entries } else entries val allPos = if (showAllLast) items.size - 1 else 0 val excludedSet = excludeKey?.let { - prefs.getStringSet(it, defValue).get() + sharedPreferences?.getStringSet(it, defValue) ?: defValue }.orEmpty() val allValue = intArrayOf( if (set.isEmpty()) TriStateCheckBox.State.CHECKED.ordinal @@ -99,8 +107,10 @@ class TriStateListPreference @JvmOverloads constructor( var includedItems = set var excludedItems = excludedSet setPositiveButton(android.R.string.ok) { _, _ -> - prefs.getStringSet(key, emptySet()).set(includedItems) - excludeKey?.let { prefs.getStringSet(it, emptySet()).set(excludedItems) } + sharedPreferences?.edit { + putStringSet(key, includedItems) + excludeKey?.let { putStringSet(it, excludedItems) } + } callChangeListener(includedItems to excludedItems) notifyChanged() }