mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +01:00 
			
		
		
		
	Reduce redundancy in some preference declarations
The remaining ones could also be converted to FlowPreferences for this, but it's not really necessary.
This commit is contained in:
		@@ -5,140 +5,28 @@ package eu.kanade.tachiyomi.data.preference
 | 
			
		||||
 */
 | 
			
		||||
object PreferenceKeys {
 | 
			
		||||
 | 
			
		||||
    const val themeMode = "pref_theme_mode_key"
 | 
			
		||||
 | 
			
		||||
    const val appTheme = "pref_app_theme"
 | 
			
		||||
 | 
			
		||||
    const val themeDarkAmoled = "pref_theme_dark_amoled_key"
 | 
			
		||||
 | 
			
		||||
    const val confirmExit = "pref_confirm_exit"
 | 
			
		||||
 | 
			
		||||
    const val hideBottomBarOnScroll = "pref_hide_bottom_bar_on_scroll"
 | 
			
		||||
 | 
			
		||||
    const val sideNavIconAlignment = "pref_side_nav_icon_alignment"
 | 
			
		||||
 | 
			
		||||
    const val enableTransitions = "pref_enable_transitions_key"
 | 
			
		||||
 | 
			
		||||
    const val doubleTapAnimationSpeed = "pref_double_tap_anim_speed"
 | 
			
		||||
 | 
			
		||||
    const val showPageNumber = "pref_show_page_number_key"
 | 
			
		||||
 | 
			
		||||
    const val dualPageSplitPaged = "pref_dual_page_split"
 | 
			
		||||
 | 
			
		||||
    const val dualPageSplitWebtoon = "pref_dual_page_split_webtoon"
 | 
			
		||||
 | 
			
		||||
    const val dualPageInvertPaged = "pref_dual_page_invert"
 | 
			
		||||
 | 
			
		||||
    const val dualPageInvertWebtoon = "pref_dual_page_invert_webtoon"
 | 
			
		||||
 | 
			
		||||
    const val showReadingMode = "pref_show_reading_mode"
 | 
			
		||||
 | 
			
		||||
    const val trueColor = "pref_true_color_key"
 | 
			
		||||
 | 
			
		||||
    const val fullscreen = "fullscreen"
 | 
			
		||||
 | 
			
		||||
    const val cutoutShort = "cutout_short"
 | 
			
		||||
 | 
			
		||||
    const val keepScreenOn = "pref_keep_screen_on_key"
 | 
			
		||||
 | 
			
		||||
    const val customBrightness = "pref_custom_brightness_key"
 | 
			
		||||
 | 
			
		||||
    const val customBrightnessValue = "custom_brightness_value"
 | 
			
		||||
 | 
			
		||||
    const val colorFilter = "pref_color_filter_key"
 | 
			
		||||
 | 
			
		||||
    const val colorFilterValue = "color_filter_value"
 | 
			
		||||
 | 
			
		||||
    const val colorFilterMode = "color_filter_mode"
 | 
			
		||||
 | 
			
		||||
    const val grayscale = "pref_grayscale"
 | 
			
		||||
 | 
			
		||||
    const val invertedColors = "pref_inverted_colors"
 | 
			
		||||
 | 
			
		||||
    const val defaultReadingMode = "pref_default_reading_mode_key"
 | 
			
		||||
 | 
			
		||||
    const val defaultOrientationType = "pref_default_orientation_type_key"
 | 
			
		||||
 | 
			
		||||
    const val imageScaleType = "pref_image_scale_type_key"
 | 
			
		||||
 | 
			
		||||
    const val zoomStart = "pref_zoom_start_key"
 | 
			
		||||
 | 
			
		||||
    const val readerTheme = "pref_reader_theme_key"
 | 
			
		||||
 | 
			
		||||
    const val cropBorders = "crop_borders"
 | 
			
		||||
 | 
			
		||||
    const val cropBordersWebtoon = "crop_borders_webtoon"
 | 
			
		||||
 | 
			
		||||
    const val readWithTapping = "reader_tap"
 | 
			
		||||
 | 
			
		||||
    const val pagerNavInverted = "reader_tapping_inverted"
 | 
			
		||||
 | 
			
		||||
    const val webtoonNavInverted = "reader_tapping_inverted_webtoon"
 | 
			
		||||
 | 
			
		||||
    const val readWithLongTap = "reader_long_tap"
 | 
			
		||||
 | 
			
		||||
    const val readWithVolumeKeys = "reader_volume_keys"
 | 
			
		||||
 | 
			
		||||
    const val readWithVolumeKeysInverted = "reader_volume_keys_inverted"
 | 
			
		||||
 | 
			
		||||
    const val navigationModePager = "reader_navigation_mode_pager"
 | 
			
		||||
 | 
			
		||||
    const val navigationModeWebtoon = "reader_navigation_mode_webtoon"
 | 
			
		||||
 | 
			
		||||
    const val showNavigationOverlayNewUser = "reader_navigation_overlay_new_user"
 | 
			
		||||
 | 
			
		||||
    const val showNavigationOverlayOnStart = "reader_navigation_overlay_on_start"
 | 
			
		||||
 | 
			
		||||
    const val readerHideThreshold = "reader_hide_threshold"
 | 
			
		||||
 | 
			
		||||
    const val webtoonSidePadding = "webtoon_side_padding"
 | 
			
		||||
 | 
			
		||||
    const val portraitColumns = "pref_library_columns_portrait_key"
 | 
			
		||||
 | 
			
		||||
    const val landscapeColumns = "pref_library_columns_landscape_key"
 | 
			
		||||
 | 
			
		||||
    const val jumpToChapters = "jump_to_chapters"
 | 
			
		||||
 | 
			
		||||
    const val autoUpdateTrack = "pref_auto_update_manga_sync_key"
 | 
			
		||||
 | 
			
		||||
    const val lastUsedSource = "last_catalogue_source"
 | 
			
		||||
 | 
			
		||||
    const val lastUsedCategory = "last_used_category"
 | 
			
		||||
 | 
			
		||||
    const val sourceDisplayMode = "pref_display_mode_catalogue"
 | 
			
		||||
 | 
			
		||||
    const val enabledLanguages = "source_languages"
 | 
			
		||||
 | 
			
		||||
    const val backupDirectory = "backup_directory"
 | 
			
		||||
 | 
			
		||||
    const val downloadsDirectory = "download_directory"
 | 
			
		||||
 | 
			
		||||
    const val downloadOnlyOverWifi = "pref_download_only_over_wifi_key"
 | 
			
		||||
 | 
			
		||||
    const val folderPerManga = "create_folder_per_manga"
 | 
			
		||||
 | 
			
		||||
    const val numberOfBackups = "backup_slots"
 | 
			
		||||
 | 
			
		||||
    const val backupInterval = "backup_interval"
 | 
			
		||||
 | 
			
		||||
    const val removeAfterReadSlots = "remove_after_read_slots"
 | 
			
		||||
 | 
			
		||||
    const val removeAfterMarkedAsRead = "pref_remove_after_marked_as_read_key"
 | 
			
		||||
 | 
			
		||||
    const val removeBookmarkedChapters = "pref_remove_bookmarked"
 | 
			
		||||
 | 
			
		||||
    const val libraryUpdateInterval = "pref_library_update_interval_key"
 | 
			
		||||
 | 
			
		||||
    const val libraryUpdateDeviceRestriction = "library_update_restriction"
 | 
			
		||||
    const val libraryUpdateMangaRestriction = "library_update_manga_restriction"
 | 
			
		||||
 | 
			
		||||
    const val showUpdatesNavBadge = "library_update_show_tab_badge"
 | 
			
		||||
 | 
			
		||||
    const val libraryUpdateCategories = "library_update_categories"
 | 
			
		||||
    const val libraryUpdateCategoriesExclude = "library_update_categories_exclude"
 | 
			
		||||
 | 
			
		||||
    const val downloadedOnly = "pref_downloaded_only"
 | 
			
		||||
 | 
			
		||||
    const val filterDownloaded = "pref_filter_library_downloaded"
 | 
			
		||||
 | 
			
		||||
    const val filterUnread = "pref_filter_library_unread"
 | 
			
		||||
@@ -153,59 +41,22 @@ object PreferenceKeys {
 | 
			
		||||
    const val migrationSortingMode = "pref_migration_sorting"
 | 
			
		||||
    const val migrationSortingDirection = "pref_migration_direction"
 | 
			
		||||
 | 
			
		||||
    const val automaticExtUpdates = "automatic_ext_updates"
 | 
			
		||||
 | 
			
		||||
    const val showNsfwSource = "show_nsfw_source"
 | 
			
		||||
 | 
			
		||||
    const val startScreen = "start_screen"
 | 
			
		||||
 | 
			
		||||
    const val useAuthenticator = "use_biometric_lock"
 | 
			
		||||
 | 
			
		||||
    const val lockAppAfter = "lock_app_after"
 | 
			
		||||
 | 
			
		||||
    const val lastAppUnlock = "last_app_unlock"
 | 
			
		||||
 | 
			
		||||
    const val secureScreen = "secure_screen"
 | 
			
		||||
 | 
			
		||||
    const val hideNotificationContent = "hide_notification_content"
 | 
			
		||||
 | 
			
		||||
    const val autoUpdateMetadata = "auto_update_metadata"
 | 
			
		||||
 | 
			
		||||
    const val autoUpdateTrackers = "auto_update_trackers"
 | 
			
		||||
 | 
			
		||||
    const val downloadNew = "download_new"
 | 
			
		||||
 | 
			
		||||
    const val downloadNewCategories = "download_new_categories"
 | 
			
		||||
    const val downloadNewCategoriesExclude = "download_new_categories_exclude"
 | 
			
		||||
    const val removeExcludeCategories = "remove_exclude_categories"
 | 
			
		||||
 | 
			
		||||
    const val libraryDisplayMode = "pref_display_mode_library"
 | 
			
		||||
 | 
			
		||||
    const val relativeTime: String = "relative_time"
 | 
			
		||||
    const val dateFormat = "app_date_format"
 | 
			
		||||
 | 
			
		||||
    const val defaultCategory = "default_category"
 | 
			
		||||
 | 
			
		||||
    const val categorizedDisplay = "categorized_display"
 | 
			
		||||
 | 
			
		||||
    const val skipRead = "skip_read"
 | 
			
		||||
 | 
			
		||||
    const val skipFiltered = "skip_filtered"
 | 
			
		||||
 | 
			
		||||
    const val downloadBadge = "display_download_badge"
 | 
			
		||||
 | 
			
		||||
    const val unreadBadge = "display_unread_badge"
 | 
			
		||||
 | 
			
		||||
    const val languageBadge = "display_language_badge"
 | 
			
		||||
 | 
			
		||||
    const val localBadge = "display_local_badge"
 | 
			
		||||
 | 
			
		||||
    const val categoryTabs = "display_category_tabs"
 | 
			
		||||
 | 
			
		||||
    const val categoryNumberOfItems = "display_number_of_items"
 | 
			
		||||
 | 
			
		||||
    const val alwaysShowChapterTransition = "always_show_chapter_transition"
 | 
			
		||||
 | 
			
		||||
    const val searchPinnedSourcesOnly = "search_pinned_sources_only"
 | 
			
		||||
 | 
			
		||||
    const val dohProvider = "doh_provider"
 | 
			
		||||
@@ -222,12 +73,6 @@ object PreferenceKeys {
 | 
			
		||||
 | 
			
		||||
    const val defaultChapterDisplayByNameOrNumber = "default_chapter_display_by_name_or_number"
 | 
			
		||||
 | 
			
		||||
    const val incognitoMode = "incognito_mode"
 | 
			
		||||
 | 
			
		||||
    const val tabletUiMode = "tablet_ui_mode"
 | 
			
		||||
 | 
			
		||||
    const val extensionInstaller = "extension_installer"
 | 
			
		||||
 | 
			
		||||
    const val verboseLogging = "verbose_logging"
 | 
			
		||||
 | 
			
		||||
    const val autoClearChapterCache = "auto_clear_chapter_cache"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,16 @@
 | 
			
		||||
package eu.kanade.tachiyomi.data.preference
 | 
			
		||||
 | 
			
		||||
import android.content.Context
 | 
			
		||||
import android.os.Build
 | 
			
		||||
import android.os.Environment
 | 
			
		||||
import androidx.core.content.edit
 | 
			
		||||
import androidx.core.net.toUri
 | 
			
		||||
import androidx.preference.PreferenceManager
 | 
			
		||||
import com.google.android.material.color.DynamicColors
 | 
			
		||||
import com.tfcporciuncula.flow.FlowSharedPreferences
 | 
			
		||||
import com.tfcporciuncula.flow.Preference
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Manga
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.PreferenceValues.ThemeMode.system
 | 
			
		||||
import eu.kanade.tachiyomi.data.track.TrackService
 | 
			
		||||
import eu.kanade.tachiyomi.data.track.anilist.Anilist
 | 
			
		||||
import eu.kanade.tachiyomi.ui.browse.migration.sources.MigrationSourcesController
 | 
			
		||||
@@ -69,17 +70,17 @@ class PreferencesHelper(val context: Context) {
 | 
			
		||||
 | 
			
		||||
    fun confirmExit() = prefs.getBoolean(Keys.confirmExit, false)
 | 
			
		||||
 | 
			
		||||
    fun hideBottomBarOnScroll() = flowPrefs.getBoolean(Keys.hideBottomBarOnScroll, true)
 | 
			
		||||
    fun hideBottomBarOnScroll() = flowPrefs.getBoolean("pref_hide_bottom_bar_on_scroll", true)
 | 
			
		||||
 | 
			
		||||
    fun sideNavIconAlignment() = flowPrefs.getInt(Keys.sideNavIconAlignment, 0)
 | 
			
		||||
    fun sideNavIconAlignment() = flowPrefs.getInt("pref_side_nav_icon_alignment", 0)
 | 
			
		||||
 | 
			
		||||
    fun useAuthenticator() = flowPrefs.getBoolean(Keys.useAuthenticator, false)
 | 
			
		||||
    fun useAuthenticator() = flowPrefs.getBoolean("use_biometric_lock", false)
 | 
			
		||||
 | 
			
		||||
    fun lockAppAfter() = flowPrefs.getInt(Keys.lockAppAfter, 0)
 | 
			
		||||
    fun lockAppAfter() = flowPrefs.getInt("lock_app_after", 0)
 | 
			
		||||
 | 
			
		||||
    fun lastAppUnlock() = flowPrefs.getLong(Keys.lastAppUnlock, 0)
 | 
			
		||||
    fun lastAppUnlock() = flowPrefs.getLong("last_app_unlock", 0)
 | 
			
		||||
 | 
			
		||||
    fun secureScreen() = flowPrefs.getBoolean(Keys.secureScreen, false)
 | 
			
		||||
    fun secureScreen() = flowPrefs.getBoolean("secure_screen", false)
 | 
			
		||||
 | 
			
		||||
    fun hideNotificationContent() = prefs.getBoolean(Keys.hideNotificationContent, false)
 | 
			
		||||
 | 
			
		||||
@@ -87,107 +88,113 @@ class PreferencesHelper(val context: Context) {
 | 
			
		||||
 | 
			
		||||
    fun autoUpdateTrackers() = prefs.getBoolean(Keys.autoUpdateTrackers, false)
 | 
			
		||||
 | 
			
		||||
    fun themeMode() = flowPrefs.getEnum(Keys.themeMode, system)
 | 
			
		||||
    fun themeMode() = flowPrefs.getEnum(
 | 
			
		||||
        "pref_theme_mode_key",
 | 
			
		||||
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { Values.ThemeMode.system } else { Values.ThemeMode.light }
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    fun appTheme() = flowPrefs.getEnum(Keys.appTheme, Values.AppTheme.DEFAULT)
 | 
			
		||||
    fun appTheme() = flowPrefs.getEnum(
 | 
			
		||||
        "pref_app_theme",
 | 
			
		||||
        if (DynamicColors.isDynamicColorAvailable()) { Values.AppTheme.MONET } else { Values.AppTheme.DEFAULT }
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    fun themeDarkAmoled() = flowPrefs.getBoolean(Keys.themeDarkAmoled, false)
 | 
			
		||||
    fun themeDarkAmoled() = flowPrefs.getBoolean("pref_theme_dark_amoled_key", false)
 | 
			
		||||
 | 
			
		||||
    fun pageTransitions() = flowPrefs.getBoolean(Keys.enableTransitions, true)
 | 
			
		||||
    fun pageTransitions() = flowPrefs.getBoolean("pref_enable_transitions_key", true)
 | 
			
		||||
 | 
			
		||||
    fun doubleTapAnimSpeed() = flowPrefs.getInt(Keys.doubleTapAnimationSpeed, 500)
 | 
			
		||||
    fun doubleTapAnimSpeed() = flowPrefs.getInt("pref_double_tap_anim_speed", 500)
 | 
			
		||||
 | 
			
		||||
    fun showPageNumber() = flowPrefs.getBoolean(Keys.showPageNumber, true)
 | 
			
		||||
    fun showPageNumber() = flowPrefs.getBoolean("pref_show_page_number_key", true)
 | 
			
		||||
 | 
			
		||||
    fun dualPageSplitPaged() = flowPrefs.getBoolean(Keys.dualPageSplitPaged, false)
 | 
			
		||||
    fun dualPageSplitPaged() = flowPrefs.getBoolean("pref_dual_page_split", false)
 | 
			
		||||
 | 
			
		||||
    fun dualPageSplitWebtoon() = flowPrefs.getBoolean(Keys.dualPageSplitWebtoon, false)
 | 
			
		||||
    fun dualPageSplitWebtoon() = flowPrefs.getBoolean("pref_dual_page_split_webtoon", false)
 | 
			
		||||
 | 
			
		||||
    fun dualPageInvertPaged() = flowPrefs.getBoolean(Keys.dualPageInvertPaged, false)
 | 
			
		||||
    fun dualPageInvertPaged() = flowPrefs.getBoolean("pref_dual_page_invert", false)
 | 
			
		||||
 | 
			
		||||
    fun dualPageInvertWebtoon() = flowPrefs.getBoolean(Keys.dualPageInvertWebtoon, false)
 | 
			
		||||
    fun dualPageInvertWebtoon() = flowPrefs.getBoolean("pref_dual_page_invert_webtoon", false)
 | 
			
		||||
 | 
			
		||||
    fun showReadingMode() = prefs.getBoolean(Keys.showReadingMode, true)
 | 
			
		||||
 | 
			
		||||
    fun trueColor() = flowPrefs.getBoolean(Keys.trueColor, false)
 | 
			
		||||
    fun trueColor() = flowPrefs.getBoolean("pref_true_color_key", false)
 | 
			
		||||
 | 
			
		||||
    fun fullscreen() = flowPrefs.getBoolean(Keys.fullscreen, true)
 | 
			
		||||
    fun fullscreen() = flowPrefs.getBoolean("fullscreen", true)
 | 
			
		||||
 | 
			
		||||
    fun cutoutShort() = flowPrefs.getBoolean(Keys.cutoutShort, true)
 | 
			
		||||
    fun cutoutShort() = flowPrefs.getBoolean("cutout_short", true)
 | 
			
		||||
 | 
			
		||||
    fun keepScreenOn() = flowPrefs.getBoolean(Keys.keepScreenOn, true)
 | 
			
		||||
    fun keepScreenOn() = flowPrefs.getBoolean("pref_keep_screen_on_key", true)
 | 
			
		||||
 | 
			
		||||
    fun customBrightness() = flowPrefs.getBoolean(Keys.customBrightness, false)
 | 
			
		||||
    fun customBrightness() = flowPrefs.getBoolean("pref_custom_brightness_key", false)
 | 
			
		||||
 | 
			
		||||
    fun customBrightnessValue() = flowPrefs.getInt(Keys.customBrightnessValue, 0)
 | 
			
		||||
    fun customBrightnessValue() = flowPrefs.getInt("custom_brightness_value", 0)
 | 
			
		||||
 | 
			
		||||
    fun colorFilter() = flowPrefs.getBoolean(Keys.colorFilter, false)
 | 
			
		||||
    fun colorFilter() = flowPrefs.getBoolean("pref_color_filter_key", false)
 | 
			
		||||
 | 
			
		||||
    fun colorFilterValue() = flowPrefs.getInt(Keys.colorFilterValue, 0)
 | 
			
		||||
    fun colorFilterValue() = flowPrefs.getInt("color_filter_value", 0)
 | 
			
		||||
 | 
			
		||||
    fun colorFilterMode() = flowPrefs.getInt(Keys.colorFilterMode, 0)
 | 
			
		||||
    fun colorFilterMode() = flowPrefs.getInt("color_filter_mode", 0)
 | 
			
		||||
 | 
			
		||||
    fun grayscale() = flowPrefs.getBoolean(Keys.grayscale, false)
 | 
			
		||||
    fun grayscale() = flowPrefs.getBoolean("pref_grayscale", false)
 | 
			
		||||
 | 
			
		||||
    fun invertedColors() = flowPrefs.getBoolean(Keys.invertedColors, false)
 | 
			
		||||
    fun invertedColors() = flowPrefs.getBoolean("pref_inverted_colors", false)
 | 
			
		||||
 | 
			
		||||
    fun defaultReadingMode() = prefs.getInt(Keys.defaultReadingMode, ReadingModeType.RIGHT_TO_LEFT.flagValue)
 | 
			
		||||
 | 
			
		||||
    fun defaultOrientationType() = prefs.getInt(Keys.defaultOrientationType, OrientationType.FREE.flagValue)
 | 
			
		||||
 | 
			
		||||
    fun imageScaleType() = flowPrefs.getInt(Keys.imageScaleType, 1)
 | 
			
		||||
    fun imageScaleType() = flowPrefs.getInt("pref_image_scale_type_key", 1)
 | 
			
		||||
 | 
			
		||||
    fun zoomStart() = flowPrefs.getInt(Keys.zoomStart, 1)
 | 
			
		||||
    fun zoomStart() = flowPrefs.getInt("pref_zoom_start_key", 1)
 | 
			
		||||
 | 
			
		||||
    fun readerTheme() = flowPrefs.getInt(Keys.readerTheme, 1)
 | 
			
		||||
    fun readerTheme() = flowPrefs.getInt("pref_reader_theme_key", 1)
 | 
			
		||||
 | 
			
		||||
    fun alwaysShowChapterTransition() = flowPrefs.getBoolean(Keys.alwaysShowChapterTransition, true)
 | 
			
		||||
    fun alwaysShowChapterTransition() = flowPrefs.getBoolean("always_show_chapter_transition", true)
 | 
			
		||||
 | 
			
		||||
    fun cropBorders() = flowPrefs.getBoolean(Keys.cropBorders, false)
 | 
			
		||||
    fun cropBorders() = flowPrefs.getBoolean("crop_borders", false)
 | 
			
		||||
 | 
			
		||||
    fun cropBordersWebtoon() = flowPrefs.getBoolean(Keys.cropBordersWebtoon, false)
 | 
			
		||||
    fun cropBordersWebtoon() = flowPrefs.getBoolean("crop_borders_webtoon", false)
 | 
			
		||||
 | 
			
		||||
    fun webtoonSidePadding() = flowPrefs.getInt(Keys.webtoonSidePadding, 0)
 | 
			
		||||
    fun webtoonSidePadding() = flowPrefs.getInt("webtoon_side_padding", 0)
 | 
			
		||||
 | 
			
		||||
    fun readWithTapping() = flowPrefs.getBoolean(Keys.readWithTapping, true)
 | 
			
		||||
    fun readWithTapping() = flowPrefs.getBoolean("reader_tap", true)
 | 
			
		||||
 | 
			
		||||
    fun pagerNavInverted() = flowPrefs.getEnum(Keys.pagerNavInverted, Values.TappingInvertMode.NONE)
 | 
			
		||||
    fun pagerNavInverted() = flowPrefs.getEnum("reader_tapping_inverted", Values.TappingInvertMode.NONE)
 | 
			
		||||
 | 
			
		||||
    fun webtoonNavInverted() = flowPrefs.getEnum(Keys.webtoonNavInverted, Values.TappingInvertMode.NONE)
 | 
			
		||||
    fun webtoonNavInverted() = flowPrefs.getEnum("reader_tapping_inverted_webtoon", Values.TappingInvertMode.NONE)
 | 
			
		||||
 | 
			
		||||
    fun readWithLongTap() = flowPrefs.getBoolean(Keys.readWithLongTap, true)
 | 
			
		||||
    fun readWithLongTap() = flowPrefs.getBoolean("reader_long_tap", true)
 | 
			
		||||
 | 
			
		||||
    fun readWithVolumeKeys() = flowPrefs.getBoolean(Keys.readWithVolumeKeys, false)
 | 
			
		||||
    fun readWithVolumeKeys() = flowPrefs.getBoolean("reader_volume_keys", false)
 | 
			
		||||
 | 
			
		||||
    fun readWithVolumeKeysInverted() = flowPrefs.getBoolean(Keys.readWithVolumeKeysInverted, false)
 | 
			
		||||
    fun readWithVolumeKeysInverted() = flowPrefs.getBoolean("reader_volume_keys_inverted", false)
 | 
			
		||||
 | 
			
		||||
    fun navigationModePager() = flowPrefs.getInt(Keys.navigationModePager, 0)
 | 
			
		||||
    fun navigationModePager() = flowPrefs.getInt("reader_navigation_mode_pager", 0)
 | 
			
		||||
 | 
			
		||||
    fun navigationModeWebtoon() = flowPrefs.getInt(Keys.navigationModeWebtoon, 0)
 | 
			
		||||
    fun navigationModeWebtoon() = flowPrefs.getInt("reader_navigation_mode_webtoon", 0)
 | 
			
		||||
 | 
			
		||||
    fun showNavigationOverlayNewUser() = flowPrefs.getBoolean(Keys.showNavigationOverlayNewUser, true)
 | 
			
		||||
    fun showNavigationOverlayNewUser() = flowPrefs.getBoolean("reader_navigation_overlay_new_user", true)
 | 
			
		||||
 | 
			
		||||
    fun showNavigationOverlayOnStart() = flowPrefs.getBoolean(Keys.showNavigationOverlayOnStart, false)
 | 
			
		||||
    fun showNavigationOverlayOnStart() = flowPrefs.getBoolean("reader_navigation_overlay_on_start", false)
 | 
			
		||||
 | 
			
		||||
    fun readerHideTreshold() = flowPrefs.getEnum(Keys.readerHideThreshold, Values.ReaderHideThreshold.LOW)
 | 
			
		||||
    fun readerHideThreshold() = flowPrefs.getEnum("reader_hide_threshold", Values.ReaderHideThreshold.LOW)
 | 
			
		||||
 | 
			
		||||
    fun portraitColumns() = flowPrefs.getInt(Keys.portraitColumns, 0)
 | 
			
		||||
    fun portraitColumns() = flowPrefs.getInt("pref_library_columns_portrait_key", 0)
 | 
			
		||||
 | 
			
		||||
    fun landscapeColumns() = flowPrefs.getInt(Keys.landscapeColumns, 0)
 | 
			
		||||
    fun landscapeColumns() = flowPrefs.getInt("pref_library_columns_landscape_key", 0)
 | 
			
		||||
 | 
			
		||||
    fun jumpToChapters() = prefs.getBoolean(Keys.jumpToChapters, false)
 | 
			
		||||
 | 
			
		||||
    fun autoUpdateTrack() = prefs.getBoolean(Keys.autoUpdateTrack, true)
 | 
			
		||||
 | 
			
		||||
    fun lastUsedSource() = flowPrefs.getLong(Keys.lastUsedSource, -1)
 | 
			
		||||
    fun lastUsedSource() = flowPrefs.getLong("last_catalogue_source", -1)
 | 
			
		||||
 | 
			
		||||
    fun lastUsedCategory() = flowPrefs.getInt(Keys.lastUsedCategory, 0)
 | 
			
		||||
    fun lastUsedCategory() = flowPrefs.getInt("last_used_category", 0)
 | 
			
		||||
 | 
			
		||||
    fun lastVersionCode() = flowPrefs.getInt("last_version_code", 0)
 | 
			
		||||
 | 
			
		||||
    fun sourceDisplayMode() = flowPrefs.getEnum(Keys.sourceDisplayMode, DisplayModeSetting.COMPACT_GRID)
 | 
			
		||||
    fun sourceDisplayMode() = flowPrefs.getEnum("pref_display_mode_catalogue", DisplayModeSetting.COMPACT_GRID)
 | 
			
		||||
 | 
			
		||||
    fun enabledLanguages() = flowPrefs.getStringSet(Keys.enabledLanguages, setOf("all", "en", Locale.getDefault().language))
 | 
			
		||||
    fun enabledLanguages() = flowPrefs.getStringSet("source_languages", setOf("all", "en", Locale.getDefault().language))
 | 
			
		||||
 | 
			
		||||
    fun trackUsername(sync: TrackService) = prefs.getString(Keys.trackUsername(sync.id), "")
 | 
			
		||||
 | 
			
		||||
@@ -204,24 +211,24 @@ class PreferencesHelper(val context: Context) {
 | 
			
		||||
 | 
			
		||||
    fun anilistScoreType() = flowPrefs.getString("anilist_score_type", Anilist.POINT_10)
 | 
			
		||||
 | 
			
		||||
    fun backupsDirectory() = flowPrefs.getString(Keys.backupDirectory, defaultBackupDir.toString())
 | 
			
		||||
    fun backupsDirectory() = flowPrefs.getString("backup_directory", defaultBackupDir.toString())
 | 
			
		||||
 | 
			
		||||
    fun relativeTime() = flowPrefs.getInt(Keys.relativeTime, 7)
 | 
			
		||||
    fun relativeTime() = flowPrefs.getInt("relative_time", 7)
 | 
			
		||||
 | 
			
		||||
    fun dateFormat(format: String = flowPrefs.getString(Keys.dateFormat, "").get()): DateFormat = when (format) {
 | 
			
		||||
        "" -> DateFormat.getDateInstance(DateFormat.SHORT)
 | 
			
		||||
        else -> SimpleDateFormat(format, Locale.getDefault())
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun downloadsDirectory() = flowPrefs.getString(Keys.downloadsDirectory, defaultDownloadsDir.toString())
 | 
			
		||||
    fun downloadsDirectory() = flowPrefs.getString("download_directory", defaultDownloadsDir.toString())
 | 
			
		||||
 | 
			
		||||
    fun downloadOnlyOverWifi() = prefs.getBoolean(Keys.downloadOnlyOverWifi, true)
 | 
			
		||||
 | 
			
		||||
    fun folderPerManga() = prefs.getBoolean(Keys.folderPerManga, false)
 | 
			
		||||
 | 
			
		||||
    fun numberOfBackups() = flowPrefs.getInt(Keys.numberOfBackups, 1)
 | 
			
		||||
    fun numberOfBackups() = flowPrefs.getInt("backup_slots", 1)
 | 
			
		||||
 | 
			
		||||
    fun backupInterval() = flowPrefs.getInt(Keys.backupInterval, 0)
 | 
			
		||||
    fun backupInterval() = flowPrefs.getInt("backup_interval", 0)
 | 
			
		||||
 | 
			
		||||
    fun removeAfterReadSlots() = prefs.getInt(Keys.removeAfterReadSlots, -1)
 | 
			
		||||
 | 
			
		||||
@@ -229,34 +236,34 @@ class PreferencesHelper(val context: Context) {
 | 
			
		||||
 | 
			
		||||
    fun removeBookmarkedChapters() = prefs.getBoolean(Keys.removeBookmarkedChapters, false)
 | 
			
		||||
 | 
			
		||||
    fun removeExcludeCategories() = flowPrefs.getStringSet(Keys.removeExcludeCategories, emptySet())
 | 
			
		||||
    fun removeExcludeCategories() = flowPrefs.getStringSet("remove_exclude_categories", emptySet())
 | 
			
		||||
 | 
			
		||||
    fun libraryUpdateInterval() = flowPrefs.getInt(Keys.libraryUpdateInterval, 24)
 | 
			
		||||
    fun libraryUpdateInterval() = flowPrefs.getInt("pref_library_update_interval_key", 24)
 | 
			
		||||
 | 
			
		||||
    fun libraryUpdateDeviceRestriction() = flowPrefs.getStringSet(Keys.libraryUpdateDeviceRestriction, setOf(DEVICE_ONLY_ON_WIFI))
 | 
			
		||||
    fun libraryUpdateMangaRestriction() = flowPrefs.getStringSet(Keys.libraryUpdateMangaRestriction, setOf(MANGA_FULLY_READ, MANGA_ONGOING))
 | 
			
		||||
    fun libraryUpdateDeviceRestriction() = flowPrefs.getStringSet("library_update_restriction", setOf(DEVICE_ONLY_ON_WIFI))
 | 
			
		||||
    fun libraryUpdateMangaRestriction() = flowPrefs.getStringSet("library_update_manga_restriction", setOf(MANGA_FULLY_READ, MANGA_ONGOING))
 | 
			
		||||
 | 
			
		||||
    fun showUpdatesNavBadge() = flowPrefs.getBoolean(Keys.showUpdatesNavBadge, false)
 | 
			
		||||
    fun showUpdatesNavBadge() = flowPrefs.getBoolean("library_update_show_tab_badge", false)
 | 
			
		||||
    fun unreadUpdatesCount() = flowPrefs.getInt("library_unread_updates_count", 0)
 | 
			
		||||
 | 
			
		||||
    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 libraryDisplayMode() = flowPrefs.getEnum(Keys.libraryDisplayMode, DisplayModeSetting.COMPACT_GRID)
 | 
			
		||||
    fun libraryDisplayMode() = flowPrefs.getEnum("pref_display_mode_library", DisplayModeSetting.COMPACT_GRID)
 | 
			
		||||
 | 
			
		||||
    fun downloadBadge() = flowPrefs.getBoolean(Keys.downloadBadge, false)
 | 
			
		||||
    fun downloadBadge() = flowPrefs.getBoolean("display_download_badge", false)
 | 
			
		||||
 | 
			
		||||
    fun localBadge() = flowPrefs.getBoolean(Keys.localBadge, true)
 | 
			
		||||
    fun localBadge() = flowPrefs.getBoolean("display_local_badge", true)
 | 
			
		||||
 | 
			
		||||
    fun downloadedOnly() = flowPrefs.getBoolean(Keys.downloadedOnly, false)
 | 
			
		||||
    fun downloadedOnly() = flowPrefs.getBoolean("pref_downloaded_only", false)
 | 
			
		||||
 | 
			
		||||
    fun unreadBadge() = flowPrefs.getBoolean(Keys.unreadBadge, true)
 | 
			
		||||
    fun unreadBadge() = flowPrefs.getBoolean("display_unread_badge", true)
 | 
			
		||||
 | 
			
		||||
    fun languageBadge() = flowPrefs.getBoolean(Keys.languageBadge, false)
 | 
			
		||||
    fun languageBadge() = flowPrefs.getBoolean("display_language_badge", false)
 | 
			
		||||
 | 
			
		||||
    fun categoryTabs() = flowPrefs.getBoolean(Keys.categoryTabs, true)
 | 
			
		||||
    fun categoryTabs() = flowPrefs.getBoolean("display_category_tabs", true)
 | 
			
		||||
 | 
			
		||||
    fun categoryNumberOfItems() = flowPrefs.getBoolean(Keys.categoryNumberOfItems, false)
 | 
			
		||||
    fun categoryNumberOfItems() = flowPrefs.getBoolean("display_number_of_items", false)
 | 
			
		||||
 | 
			
		||||
    fun filterDownloaded() = flowPrefs.getInt(Keys.filterDownloaded, ExtendedNavigationView.Item.TriStateGroup.State.IGNORE.value)
 | 
			
		||||
 | 
			
		||||
@@ -272,9 +279,9 @@ class PreferencesHelper(val context: Context) {
 | 
			
		||||
    fun migrationSortingMode() = flowPrefs.getEnum(Keys.migrationSortingMode, MigrationSourcesController.SortSetting.ALPHABETICAL)
 | 
			
		||||
    fun migrationSortingDirection() = flowPrefs.getEnum(Keys.migrationSortingDirection, MigrationSourcesController.DirectionSetting.ASCENDING)
 | 
			
		||||
 | 
			
		||||
    fun automaticExtUpdates() = flowPrefs.getBoolean(Keys.automaticExtUpdates, true)
 | 
			
		||||
    fun automaticExtUpdates() = flowPrefs.getBoolean("automatic_ext_updates", true)
 | 
			
		||||
 | 
			
		||||
    fun showNsfwSource() = flowPrefs.getBoolean(Keys.showNsfwSource, true)
 | 
			
		||||
    fun showNsfwSource() = flowPrefs.getBoolean("show_nsfw_source", true)
 | 
			
		||||
 | 
			
		||||
    fun extensionUpdatesCount() = flowPrefs.getInt("ext_updates_count", 0)
 | 
			
		||||
 | 
			
		||||
@@ -287,14 +294,14 @@ class PreferencesHelper(val context: Context) {
 | 
			
		||||
 | 
			
		||||
    fun pinnedSources() = flowPrefs.getStringSet("pinned_catalogues", emptySet())
 | 
			
		||||
 | 
			
		||||
    fun downloadNew() = flowPrefs.getBoolean(Keys.downloadNew, false)
 | 
			
		||||
    fun downloadNew() = flowPrefs.getBoolean("download_new", false)
 | 
			
		||||
 | 
			
		||||
    fun downloadNewCategories() = flowPrefs.getStringSet(Keys.downloadNewCategories, emptySet())
 | 
			
		||||
    fun downloadNewCategoriesExclude() = flowPrefs.getStringSet(Keys.downloadNewCategoriesExclude, emptySet())
 | 
			
		||||
    fun downloadNewCategories() = flowPrefs.getStringSet("download_new_categories", emptySet())
 | 
			
		||||
    fun downloadNewCategoriesExclude() = flowPrefs.getStringSet("download_new_categories_exclude", emptySet())
 | 
			
		||||
 | 
			
		||||
    fun defaultCategory() = prefs.getInt(Keys.defaultCategory, -1)
 | 
			
		||||
 | 
			
		||||
    fun categorisedDisplaySettings() = flowPrefs.getBoolean(Keys.categorizedDisplay, false)
 | 
			
		||||
    fun categorizedDisplaySettings() = flowPrefs.getBoolean("categorized_display", false)
 | 
			
		||||
 | 
			
		||||
    fun skipRead() = prefs.getBoolean(Keys.skipRead, false)
 | 
			
		||||
 | 
			
		||||
@@ -320,12 +327,12 @@ class PreferencesHelper(val context: Context) {
 | 
			
		||||
 | 
			
		||||
    fun sortChapterByAscendingOrDescending() = prefs.getInt(Keys.defaultChapterSortByAscendingOrDescending, Manga.CHAPTER_SORT_DESC)
 | 
			
		||||
 | 
			
		||||
    fun incognitoMode() = flowPrefs.getBoolean(Keys.incognitoMode, false)
 | 
			
		||||
    fun incognitoMode() = flowPrefs.getBoolean("incognito_mode", false)
 | 
			
		||||
 | 
			
		||||
    fun tabletUiMode() = flowPrefs.getEnum(Keys.tabletUiMode, Values.TabletUiMode.AUTOMATIC)
 | 
			
		||||
    fun tabletUiMode() = flowPrefs.getEnum("tablet_ui_mode", Values.TabletUiMode.AUTOMATIC)
 | 
			
		||||
 | 
			
		||||
    fun extensionInstaller() = flowPrefs.getEnum(
 | 
			
		||||
        Keys.extensionInstaller,
 | 
			
		||||
        "extension_installer",
 | 
			
		||||
        if (DeviceUtil.isMiui) Values.ExtensionInstaller.LEGACY else Values.ExtensionInstaller.PACKAGEINSTALLER
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -67,8 +67,10 @@ open class ExtensionPresenter(
 | 
			
		||||
            .sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER, { it.name }))
 | 
			
		||||
 | 
			
		||||
        val installedSorted = installed.filter { !it.hasUpdate && (showNsfwSources || !it.isNsfw) }
 | 
			
		||||
            .sortedWith(compareBy<Extension.Installed> { !it.isObsolete }
 | 
			
		||||
                .thenBy(String.CASE_INSENSITIVE_ORDER) { it.name })
 | 
			
		||||
            .sortedWith(
 | 
			
		||||
                compareBy<Extension.Installed> { !it.isObsolete }
 | 
			
		||||
                    .thenBy(String.CASE_INSENSITIVE_ORDER) { it.name }
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
        val untrustedSorted = untrusted.sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER, { it.name }))
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -49,7 +49,7 @@ class LibraryAdapter(
 | 
			
		||||
 | 
			
		||||
    private var boundViews = arrayListOf<View>()
 | 
			
		||||
 | 
			
		||||
    private val isPerCategory by lazy { preferences.categorisedDisplaySettings().get() }
 | 
			
		||||
    private val isPerCategory by lazy { preferences.categorizedDisplaySettings().get() }
 | 
			
		||||
    private var currentDisplayMode = preferences.libraryDisplayMode().get()
 | 
			
		||||
 | 
			
		||||
    init {
 | 
			
		||||
 
 | 
			
		||||
@@ -195,7 +195,7 @@ class LibraryController(
 | 
			
		||||
                is LibrarySettingsSheet.Filter.FilterGroup -> onFilterChanged()
 | 
			
		||||
                is LibrarySettingsSheet.Sort.SortGroup -> onSortChanged()
 | 
			
		||||
                is LibrarySettingsSheet.Display.DisplayGroup -> {
 | 
			
		||||
                    val delay = if (preferences.categorisedDisplaySettings().get()) 125L else 0L
 | 
			
		||||
                    val delay = if (preferences.categorizedDisplaySettings().get()) 125L else 0L
 | 
			
		||||
 | 
			
		||||
                    Observable.timer(delay, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread())
 | 
			
		||||
                        .subscribe {
 | 
			
		||||
 
 | 
			
		||||
@@ -369,7 +369,7 @@ class LibraryPresenter(
 | 
			
		||||
     */
 | 
			
		||||
    private fun getLibraryMangasObservable(): Observable<LibraryMap> {
 | 
			
		||||
        val defaultLibraryDisplayMode = preferences.libraryDisplayMode()
 | 
			
		||||
        val shouldSetFromCategory = preferences.categorisedDisplaySettings()
 | 
			
		||||
        val shouldSetFromCategory = preferences.categorizedDisplaySettings()
 | 
			
		||||
        return db.getLibraryMangas().asRxObservable()
 | 
			
		||||
            .map { list ->
 | 
			
		||||
                list.map { libraryManga ->
 | 
			
		||||
 
 | 
			
		||||
@@ -245,7 +245,7 @@ class LibrarySettingsSheet(
 | 
			
		||||
                    SortDirectionSetting.DESCENDING
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (preferences.categorisedDisplaySettings().get() && currentCategory != null && currentCategory?.id != 0) {
 | 
			
		||||
                if (preferences.categorizedDisplaySettings().get() && currentCategory != null && currentCategory?.id != 0) {
 | 
			
		||||
                    currentCategory?.sortDirection = flag.flag
 | 
			
		||||
 | 
			
		||||
                    db.insertCategory(currentCategory!!).executeAsBlocking()
 | 
			
		||||
@@ -267,7 +267,7 @@ class LibrarySettingsSheet(
 | 
			
		||||
                    else -> throw NotImplementedError("Unknown display mode")
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (preferences.categorisedDisplaySettings().get() && currentCategory != null && currentCategory?.id != 0) {
 | 
			
		||||
                if (preferences.categorizedDisplaySettings().get() && currentCategory != null && currentCategory?.id != 0) {
 | 
			
		||||
                    currentCategory?.sortMode = flag.flag
 | 
			
		||||
 | 
			
		||||
                    db.insertCategory(currentCategory!!).executeAsBlocking()
 | 
			
		||||
@@ -304,7 +304,7 @@ class LibrarySettingsSheet(
 | 
			
		||||
 | 
			
		||||
        // Gets user preference of currently selected display mode at current category
 | 
			
		||||
        private fun getDisplayModePreference(): DisplayModeSetting {
 | 
			
		||||
            return if (preferences.categorisedDisplaySettings().get() && currentCategory != null && currentCategory?.id != 0) {
 | 
			
		||||
            return if (preferences.categorizedDisplaySettings().get() && currentCategory != null && currentCategory?.id != 0) {
 | 
			
		||||
                DisplayModeSetting.fromFlag(currentCategory?.displayMode)
 | 
			
		||||
            } else {
 | 
			
		||||
                preferences.libraryDisplayMode().get()
 | 
			
		||||
@@ -353,7 +353,7 @@ class LibrarySettingsSheet(
 | 
			
		||||
                    else -> throw NotImplementedError("Unknown display mode")
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (preferences.categorisedDisplaySettings().get() && currentCategory != null && currentCategory?.id != 0) {
 | 
			
		||||
                if (preferences.categorizedDisplaySettings().get() && currentCategory != null && currentCategory?.id != 0) {
 | 
			
		||||
                    currentCategory?.displayMode = flag.flag
 | 
			
		||||
 | 
			
		||||
                    db.insertCategory(currentCategory!!).executeAsBlocking()
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@ enum class SortDirectionSetting(val flag: Int) {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        fun get(preferences: PreferencesHelper, category: Category?): SortDirectionSetting {
 | 
			
		||||
            return if (preferences.categorisedDisplaySettings().get() && category != null && category.id != 0) {
 | 
			
		||||
            return if (preferences.categorizedDisplaySettings().get() && category != null && category.id != 0) {
 | 
			
		||||
                fromFlag(category.sortDirection)
 | 
			
		||||
            } else {
 | 
			
		||||
                preferences.librarySortingAscending().get()
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ enum class SortModeSetting(val flag: Int) {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        fun get(preferences: PreferencesHelper, category: Category?): SortModeSetting {
 | 
			
		||||
            return if (preferences.categorisedDisplaySettings().get() && category != null && category.id != 0) {
 | 
			
		||||
            return if (preferences.categorizedDisplaySettings().get() && category != null && category.id != 0) {
 | 
			
		||||
                fromFlag(category.sortMode)
 | 
			
		||||
            } else {
 | 
			
		||||
                preferences.librarySortingMode().get()
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,7 @@ import eu.kanade.tachiyomi.ui.setting.SettingsBackupController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.setting.SettingsController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.setting.SettingsMainController
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.add
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.defaultValue
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.bindTo
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.iconRes
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.iconTint
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.onClick
 | 
			
		||||
@@ -36,7 +36,6 @@ import rx.Subscription
 | 
			
		||||
import rx.android.schedulers.AndroidSchedulers
 | 
			
		||||
import rx.subscriptions.CompositeSubscription
 | 
			
		||||
import uy.kohesive.injekt.injectLazy
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys
 | 
			
		||||
 | 
			
		||||
class MoreController :
 | 
			
		||||
    SettingsController(),
 | 
			
		||||
@@ -58,7 +57,7 @@ class MoreController :
 | 
			
		||||
        add(MoreHeaderPreference(context))
 | 
			
		||||
 | 
			
		||||
        switchPreference {
 | 
			
		||||
            key = Keys.downloadedOnly
 | 
			
		||||
            bindTo(preferences.downloadedOnly())
 | 
			
		||||
            titleRes = R.string.label_downloaded_only
 | 
			
		||||
            summaryRes = R.string.downloaded_only_summary
 | 
			
		||||
            iconRes = R.drawable.ic_cloud_off_24dp
 | 
			
		||||
@@ -66,12 +65,11 @@ class MoreController :
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        switchPreference {
 | 
			
		||||
            key = Keys.incognitoMode
 | 
			
		||||
            bindTo(preferences.incognitoMode())
 | 
			
		||||
            summaryRes = R.string.pref_incognito_mode_summary
 | 
			
		||||
            titleRes = R.string.pref_incognito_mode
 | 
			
		||||
            iconRes = R.drawable.ic_glasses_24dp
 | 
			
		||||
            iconTint = tintColor
 | 
			
		||||
            defaultValue = false
 | 
			
		||||
 | 
			
		||||
            preferences.incognitoMode().asFlow()
 | 
			
		||||
                .onEach { isChecked = it }
 | 
			
		||||
 
 | 
			
		||||
@@ -76,7 +76,7 @@ class WebtoonViewer(val activity: ReaderActivity, val isContinuous: Boolean = tr
 | 
			
		||||
 | 
			
		||||
    private val threshold: Int =
 | 
			
		||||
        Injekt.get<PreferencesHelper>()
 | 
			
		||||
            .readerHideTreshold()
 | 
			
		||||
            .readerHideThreshold()
 | 
			
		||||
            .get()
 | 
			
		||||
            .threshold
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,7 @@ import eu.kanade.tachiyomi.ui.setting.database.ClearDatabaseController
 | 
			
		||||
import eu.kanade.tachiyomi.util.CrashLogUtil
 | 
			
		||||
import eu.kanade.tachiyomi.util.lang.launchIO
 | 
			
		||||
import eu.kanade.tachiyomi.util.lang.withUIContext
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.bindTo
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.defaultValue
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.entriesRes
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.intListPreference
 | 
			
		||||
@@ -35,7 +36,6 @@ import eu.kanade.tachiyomi.util.preference.preferenceCategory
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.summaryRes
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.switchPreference
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.titleRes
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.DeviceUtil
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.isPackageInstalled
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.powerManager
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.toast
 | 
			
		||||
@@ -206,7 +206,7 @@ class SettingsAdvancedController : SettingsController() {
 | 
			
		||||
            titleRes = R.string.label_extensions
 | 
			
		||||
 | 
			
		||||
            listPreference {
 | 
			
		||||
                key = Keys.extensionInstaller
 | 
			
		||||
                bindTo(preferences.extensionInstaller())
 | 
			
		||||
                titleRes = R.string.ext_installer_pref
 | 
			
		||||
                summary = "%s"
 | 
			
		||||
                entriesRes = arrayOf(
 | 
			
		||||
@@ -215,11 +215,6 @@ class SettingsAdvancedController : SettingsController() {
 | 
			
		||||
                    R.string.ext_installer_shizuku,
 | 
			
		||||
                )
 | 
			
		||||
                entryValues = PreferenceValues.ExtensionInstaller.values().map { it.name }.toTypedArray()
 | 
			
		||||
                defaultValue = if (DeviceUtil.isMiui) {
 | 
			
		||||
                    PreferenceValues.ExtensionInstaller.LEGACY
 | 
			
		||||
                } else {
 | 
			
		||||
                    PreferenceValues.ExtensionInstaller.PACKAGEINSTALLER
 | 
			
		||||
                }.name
 | 
			
		||||
 | 
			
		||||
                onChange {
 | 
			
		||||
                    if (it == PreferenceValues.ExtensionInstaller.SHIZUKU.name &&
 | 
			
		||||
@@ -245,12 +240,11 @@ class SettingsAdvancedController : SettingsController() {
 | 
			
		||||
            titleRes = R.string.pref_category_display
 | 
			
		||||
 | 
			
		||||
            listPreference {
 | 
			
		||||
                key = Keys.tabletUiMode
 | 
			
		||||
                bindTo(preferences.tabletUiMode())
 | 
			
		||||
                titleRes = R.string.pref_tablet_ui_mode
 | 
			
		||||
                summary = "%s"
 | 
			
		||||
                entriesRes = arrayOf(R.string.automatic_background, R.string.lock_always, R.string.landscape, R.string.lock_never)
 | 
			
		||||
                entryValues = PreferenceValues.TabletUiMode.values().map { it.name }.toTypedArray()
 | 
			
		||||
                defaultValue = PreferenceValues.TabletUiMode.AUTOMATIC.name
 | 
			
		||||
 | 
			
		||||
                onChange {
 | 
			
		||||
                    activity?.toast(R.string.requires_app_restart)
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ import androidx.core.app.ActivityCompat
 | 
			
		||||
import androidx.preference.PreferenceScreen
 | 
			
		||||
import com.google.android.material.color.DynamicColors
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.bindTo
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.defaultValue
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.entriesRes
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.initThenAdd
 | 
			
		||||
@@ -33,7 +34,7 @@ class SettingsAppearanceController : SettingsController() {
 | 
			
		||||
            titleRes = R.string.pref_category_theme
 | 
			
		||||
 | 
			
		||||
            listPreference {
 | 
			
		||||
                key = Keys.themeMode
 | 
			
		||||
                bindTo(preferences.themeMode())
 | 
			
		||||
                titleRes = R.string.pref_theme_mode
 | 
			
		||||
 | 
			
		||||
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
 | 
			
		||||
@@ -47,7 +48,6 @@ class SettingsAppearanceController : SettingsController() {
 | 
			
		||||
                        Values.ThemeMode.light.name,
 | 
			
		||||
                        Values.ThemeMode.dark.name
 | 
			
		||||
                    )
 | 
			
		||||
                    defaultValue = Values.ThemeMode.system.name
 | 
			
		||||
                } else {
 | 
			
		||||
                    entriesRes = arrayOf(
 | 
			
		||||
                        R.string.theme_light,
 | 
			
		||||
@@ -57,13 +57,12 @@ class SettingsAppearanceController : SettingsController() {
 | 
			
		||||
                        Values.ThemeMode.light.name,
 | 
			
		||||
                        Values.ThemeMode.dark.name
 | 
			
		||||
                    )
 | 
			
		||||
                    defaultValue = Values.ThemeMode.light.name
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                summary = "%s"
 | 
			
		||||
            }
 | 
			
		||||
            themesPreference = initThenAdd(ThemesPreference(context)) {
 | 
			
		||||
                key = Keys.appTheme
 | 
			
		||||
                bindTo(preferences.appTheme())
 | 
			
		||||
                titleRes = R.string.pref_app_theme
 | 
			
		||||
 | 
			
		||||
                val appThemes = Values.AppTheme.values().filter {
 | 
			
		||||
@@ -75,7 +74,6 @@ class SettingsAppearanceController : SettingsController() {
 | 
			
		||||
                    it.titleResId != null && monetFilter
 | 
			
		||||
                }
 | 
			
		||||
                entries = appThemes
 | 
			
		||||
                defaultValue = appThemes[0].name
 | 
			
		||||
 | 
			
		||||
                onChange {
 | 
			
		||||
                    activity?.let { ActivityCompat.recreate(it) }
 | 
			
		||||
@@ -83,9 +81,8 @@ class SettingsAppearanceController : SettingsController() {
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            switchPreference {
 | 
			
		||||
                key = Keys.themeDarkAmoled
 | 
			
		||||
                bindTo(preferences.themeDarkAmoled())
 | 
			
		||||
                titleRes = R.string.pref_dark_theme_pure_black
 | 
			
		||||
                defaultValue = false
 | 
			
		||||
 | 
			
		||||
                visibleIf(preferences.themeMode()) { it != Values.ThemeMode.light }
 | 
			
		||||
 | 
			
		||||
@@ -101,7 +98,7 @@ class SettingsAppearanceController : SettingsController() {
 | 
			
		||||
 | 
			
		||||
            if (context.isTablet()) {
 | 
			
		||||
                intListPreference {
 | 
			
		||||
                    key = Keys.sideNavIconAlignment
 | 
			
		||||
                    bindTo(preferences.sideNavIconAlignment())
 | 
			
		||||
                    titleRes = R.string.pref_side_nav_icon_alignment
 | 
			
		||||
                    entriesRes = arrayOf(
 | 
			
		||||
                        R.string.alignment_top,
 | 
			
		||||
@@ -109,14 +106,12 @@ class SettingsAppearanceController : SettingsController() {
 | 
			
		||||
                        R.string.alignment_bottom,
 | 
			
		||||
                    )
 | 
			
		||||
                    entryValues = arrayOf("0", "1", "2")
 | 
			
		||||
                    defaultValue = "0"
 | 
			
		||||
                    summary = "%s"
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                switchPreference {
 | 
			
		||||
                    key = Keys.hideBottomBarOnScroll
 | 
			
		||||
                    bindTo(preferences.hideBottomBarOnScroll())
 | 
			
		||||
                    titleRes = R.string.pref_hide_bottom_bar_on_scroll
 | 
			
		||||
                    defaultValue = true
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -125,7 +120,7 @@ class SettingsAppearanceController : SettingsController() {
 | 
			
		||||
            titleRes = R.string.pref_category_timestamps
 | 
			
		||||
 | 
			
		||||
            intListPreference {
 | 
			
		||||
                key = Keys.relativeTime
 | 
			
		||||
                bindTo(preferences.relativeTime())
 | 
			
		||||
                titleRes = R.string.pref_relative_format
 | 
			
		||||
                val values = arrayOf("0", "2", "7")
 | 
			
		||||
                entryValues = values
 | 
			
		||||
@@ -136,7 +131,6 @@ class SettingsAppearanceController : SettingsController() {
 | 
			
		||||
                        else -> context.getString(R.string.pref_relative_time_long)
 | 
			
		||||
                    }
 | 
			
		||||
                }.toTypedArray()
 | 
			
		||||
                defaultValue = "7"
 | 
			
		||||
                summary = "%s"
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@ import eu.kanade.tachiyomi.data.backup.full.models.BackupFull
 | 
			
		||||
import eu.kanade.tachiyomi.data.backup.legacy.LegacyBackupRestoreValidator
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.DialogController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.requestPermissionsSafe
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.defaultValue
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.bindTo
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.entriesRes
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.infoPreference
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.intListPreference
 | 
			
		||||
@@ -39,7 +39,6 @@ import eu.kanade.tachiyomi.util.system.DeviceUtil
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.toast
 | 
			
		||||
import kotlinx.coroutines.flow.launchIn
 | 
			
		||||
import kotlinx.coroutines.flow.onEach
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys
 | 
			
		||||
 | 
			
		||||
class SettingsBackupController : SettingsController() {
 | 
			
		||||
 | 
			
		||||
@@ -103,7 +102,7 @@ class SettingsBackupController : SettingsController() {
 | 
			
		||||
            titleRes = R.string.pref_backup_service_category
 | 
			
		||||
 | 
			
		||||
            intListPreference {
 | 
			
		||||
                key = Keys.backupInterval
 | 
			
		||||
                bindTo(preferences.backupInterval())
 | 
			
		||||
                titleRes = R.string.pref_backup_interval
 | 
			
		||||
                entriesRes = arrayOf(
 | 
			
		||||
                    R.string.update_never,
 | 
			
		||||
@@ -114,7 +113,6 @@ class SettingsBackupController : SettingsController() {
 | 
			
		||||
                    R.string.update_weekly
 | 
			
		||||
                )
 | 
			
		||||
                entryValues = arrayOf("0", "6", "12", "24", "48", "168")
 | 
			
		||||
                defaultValue = "0"
 | 
			
		||||
                summary = "%s"
 | 
			
		||||
 | 
			
		||||
                onChange { newValue ->
 | 
			
		||||
@@ -124,7 +122,7 @@ class SettingsBackupController : SettingsController() {
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            preference {
 | 
			
		||||
                key = Keys.backupDirectory
 | 
			
		||||
                bindTo(preferences.backupsDirectory())
 | 
			
		||||
                titleRes = R.string.pref_backup_directory
 | 
			
		||||
 | 
			
		||||
                onClick {
 | 
			
		||||
@@ -146,11 +144,10 @@ class SettingsBackupController : SettingsController() {
 | 
			
		||||
                    .launchIn(viewScope)
 | 
			
		||||
            }
 | 
			
		||||
            intListPreference {
 | 
			
		||||
                key = Keys.numberOfBackups
 | 
			
		||||
                bindTo(preferences.numberOfBackups())
 | 
			
		||||
                titleRes = R.string.pref_backup_slots
 | 
			
		||||
                entries = arrayOf("1", "2", "3", "4", "5")
 | 
			
		||||
                entryValues = entries
 | 
			
		||||
                defaultValue = "1"
 | 
			
		||||
                summary = "%s"
 | 
			
		||||
 | 
			
		||||
                visibleIf(preferences.backupInterval()) { it > 0 }
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@ import androidx.fragment.app.FragmentActivity
 | 
			
		||||
import androidx.preference.PreferenceScreen
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.extension.ExtensionUpdateJob
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.bindTo
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.defaultValue
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.infoPreference
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.onChange
 | 
			
		||||
@@ -24,9 +25,8 @@ class SettingsBrowseController : SettingsController() {
 | 
			
		||||
            titleRes = R.string.label_extensions
 | 
			
		||||
 | 
			
		||||
            switchPreference {
 | 
			
		||||
                key = Keys.automaticExtUpdates
 | 
			
		||||
                bindTo(preferences.automaticExtUpdates())
 | 
			
		||||
                titleRes = R.string.pref_enable_automatic_extension_updates
 | 
			
		||||
                defaultValue = true
 | 
			
		||||
 | 
			
		||||
                onChange { newValue ->
 | 
			
		||||
                    val checked = newValue as Boolean
 | 
			
		||||
@@ -50,10 +50,9 @@ class SettingsBrowseController : SettingsController() {
 | 
			
		||||
            titleRes = R.string.pref_category_nsfw_content
 | 
			
		||||
 | 
			
		||||
            switchPreference {
 | 
			
		||||
                key = Keys.showNsfwSource
 | 
			
		||||
                bindTo(preferences.showNsfwSource())
 | 
			
		||||
                titleRes = R.string.pref_show_nsfw_source
 | 
			
		||||
                summaryRes = R.string.requires_app_restart
 | 
			
		||||
                defaultValue = true
 | 
			
		||||
 | 
			
		||||
                if (context.isAuthenticationSupported() && activity != null) {
 | 
			
		||||
                    requireAuthentication(
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,7 @@ 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.ui.base.controller.DialogController
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.bindTo
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.defaultValue
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.entriesRes
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.intListPreference
 | 
			
		||||
@@ -48,7 +49,7 @@ class SettingsDownloadController : SettingsController() {
 | 
			
		||||
        val categories = listOf(Category.createDefault(context)) + dbCategories
 | 
			
		||||
 | 
			
		||||
        preference {
 | 
			
		||||
            key = Keys.downloadsDirectory
 | 
			
		||||
            bindTo(preferences.downloadsDirectory())
 | 
			
		||||
            titleRes = R.string.pref_download_directory
 | 
			
		||||
            onClick {
 | 
			
		||||
                val ctrl = DownloadDirectoriesDialog()
 | 
			
		||||
@@ -97,7 +98,7 @@ class SettingsDownloadController : SettingsController() {
 | 
			
		||||
                defaultValue = false
 | 
			
		||||
            }
 | 
			
		||||
            multiSelectListPreference {
 | 
			
		||||
                key = Keys.removeExcludeCategories
 | 
			
		||||
                bindTo(preferences.removeExcludeCategories())
 | 
			
		||||
                titleRes = R.string.pref_remove_exclude_categories
 | 
			
		||||
                entries = categories.map { it.name }.toTypedArray()
 | 
			
		||||
                entryValues = categories.map { it.id.toString() }.toTypedArray()
 | 
			
		||||
@@ -121,12 +122,11 @@ class SettingsDownloadController : SettingsController() {
 | 
			
		||||
            titleRes = R.string.pref_category_auto_download
 | 
			
		||||
 | 
			
		||||
            switchPreference {
 | 
			
		||||
                key = Keys.downloadNew
 | 
			
		||||
                bindTo(preferences.downloadNew())
 | 
			
		||||
                titleRes = R.string.pref_download_new
 | 
			
		||||
                defaultValue = false
 | 
			
		||||
            }
 | 
			
		||||
            preference {
 | 
			
		||||
                key = Keys.downloadNewCategories
 | 
			
		||||
                bindTo(preferences.downloadNewCategories())
 | 
			
		||||
                titleRes = R.string.categories
 | 
			
		||||
                onClick {
 | 
			
		||||
                    DownloadCategoriesDialog().showDialog(router)
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@ import android.os.Build
 | 
			
		||||
import android.provider.Settings
 | 
			
		||||
import androidx.preference.PreferenceScreen
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.bindTo
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.defaultValue
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.entriesRes
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.intListPreference
 | 
			
		||||
@@ -33,9 +34,8 @@ class SettingsGeneralController : SettingsController() {
 | 
			
		||||
            summary = "%s"
 | 
			
		||||
        }
 | 
			
		||||
        switchPreference {
 | 
			
		||||
            key = Keys.showUpdatesNavBadge
 | 
			
		||||
            bindTo(preferences.showUpdatesNavBadge())
 | 
			
		||||
            titleRes = R.string.pref_library_update_show_tab_badge
 | 
			
		||||
            defaultValue = false
 | 
			
		||||
        }
 | 
			
		||||
        switchPreference {
 | 
			
		||||
            key = Keys.confirmExit
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,6 @@ import android.os.Bundle
 | 
			
		||||
import android.view.LayoutInflater
 | 
			
		||||
import androidx.core.content.ContextCompat
 | 
			
		||||
import androidx.core.text.buildSpannedString
 | 
			
		||||
import androidx.preference.Preference
 | 
			
		||||
import androidx.preference.PreferenceScreen
 | 
			
		||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
@@ -22,6 +21,7 @@ import eu.kanade.tachiyomi.databinding.PrefLibraryColumnsBinding
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.DialogController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
 | 
			
		||||
import eu.kanade.tachiyomi.ui.category.CategoryController
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.bindTo
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.defaultValue
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.entriesRes
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.intListPreference
 | 
			
		||||
@@ -127,9 +127,8 @@ class SettingsLibraryController : SettingsController() {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            switchPreference {
 | 
			
		||||
                key = Keys.categorizedDisplay
 | 
			
		||||
                bindTo(preferences.categorizedDisplaySettings())
 | 
			
		||||
                titleRes = R.string.categorized_display_settings
 | 
			
		||||
                defaultValue = false
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -137,7 +136,7 @@ class SettingsLibraryController : SettingsController() {
 | 
			
		||||
            titleRes = R.string.pref_category_library_update
 | 
			
		||||
 | 
			
		||||
            intListPreference {
 | 
			
		||||
                key = Keys.libraryUpdateInterval
 | 
			
		||||
                bindTo(preferences.libraryUpdateInterval())
 | 
			
		||||
                titleRes = R.string.pref_library_update_interval
 | 
			
		||||
                entriesRes = arrayOf(
 | 
			
		||||
                    R.string.update_never,
 | 
			
		||||
@@ -148,7 +147,6 @@ class SettingsLibraryController : SettingsController() {
 | 
			
		||||
                    R.string.update_weekly
 | 
			
		||||
                )
 | 
			
		||||
                entryValues = arrayOf("0", "12", "24", "48", "72", "168")
 | 
			
		||||
                defaultValue = "24"
 | 
			
		||||
                summary = "%s"
 | 
			
		||||
 | 
			
		||||
                onChange { newValue ->
 | 
			
		||||
@@ -158,13 +156,12 @@ class SettingsLibraryController : SettingsController() {
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            multiSelectListPreference {
 | 
			
		||||
                key = Keys.libraryUpdateDeviceRestriction
 | 
			
		||||
                bindTo(preferences.libraryUpdateDeviceRestriction())
 | 
			
		||||
                titleRes = R.string.pref_library_update_restriction
 | 
			
		||||
                entriesRes = arrayOf(R.string.connected_to_wifi, R.string.charging)
 | 
			
		||||
                entryValues = arrayOf(DEVICE_ONLY_ON_WIFI, DEVICE_CHARGING)
 | 
			
		||||
                defaultValue = preferences.libraryUpdateDeviceRestriction().defaultValue
 | 
			
		||||
 | 
			
		||||
                visibleIfGlobalUpdateEnabled()
 | 
			
		||||
                visibleIf(preferences.libraryUpdateInterval()) { it > 0 }
 | 
			
		||||
 | 
			
		||||
                onChange {
 | 
			
		||||
                    // Post to event looper to allow the preference to be updated.
 | 
			
		||||
@@ -196,11 +193,10 @@ class SettingsLibraryController : SettingsController() {
 | 
			
		||||
                    .launchIn(viewScope)
 | 
			
		||||
            }
 | 
			
		||||
            multiSelectListPreference {
 | 
			
		||||
                key = Keys.libraryUpdateMangaRestriction
 | 
			
		||||
                bindTo(preferences.libraryUpdateMangaRestriction())
 | 
			
		||||
                titleRes = R.string.pref_library_update_manga_restriction
 | 
			
		||||
                entriesRes = arrayOf(R.string.pref_update_only_completely_read, R.string.pref_update_only_non_completed)
 | 
			
		||||
                entryValues = arrayOf(MANGA_FULLY_READ, MANGA_ONGOING)
 | 
			
		||||
                defaultValue = preferences.libraryUpdateMangaRestriction().defaultValue
 | 
			
		||||
 | 
			
		||||
                fun updateSummary() {
 | 
			
		||||
                    val restrictions = preferences.libraryUpdateMangaRestriction().get()
 | 
			
		||||
@@ -226,7 +222,7 @@ class SettingsLibraryController : SettingsController() {
 | 
			
		||||
                    .launchIn(viewScope)
 | 
			
		||||
            }
 | 
			
		||||
            preference {
 | 
			
		||||
                key = Keys.libraryUpdateCategories
 | 
			
		||||
                bindTo(preferences.libraryUpdateCategories())
 | 
			
		||||
                titleRes = R.string.categories
 | 
			
		||||
 | 
			
		||||
                onClick {
 | 
			
		||||
@@ -290,10 +286,6 @@ class SettingsLibraryController : SettingsController() {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private inline fun Preference.visibleIfGlobalUpdateEnabled() {
 | 
			
		||||
        visibleIf(preferences.libraryUpdateInterval()) { it > 0 }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class LibraryColumnsDialog : DialogController() {
 | 
			
		||||
 | 
			
		||||
        private val preferences: PreferencesHelper = Injekt.get()
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ import eu.kanade.tachiyomi.data.preference.PreferenceValues
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.PreferenceValues.TappingInvertMode
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.setting.OrientationType
 | 
			
		||||
import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.bindTo
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.defaultValue
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.entriesRes
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.intListPreference
 | 
			
		||||
@@ -39,11 +40,10 @@ class SettingsReaderController : SettingsController() {
 | 
			
		||||
            summary = "%s"
 | 
			
		||||
        }
 | 
			
		||||
        intListPreference {
 | 
			
		||||
            key = Keys.doubleTapAnimationSpeed
 | 
			
		||||
            bindTo(preferences.doubleTapAnimSpeed())
 | 
			
		||||
            titleRes = R.string.pref_double_tap_anim_speed
 | 
			
		||||
            entries = arrayOf(context.getString(R.string.double_tap_anim_speed_0), context.getString(R.string.double_tap_anim_speed_normal), context.getString(R.string.double_tap_anim_speed_fast))
 | 
			
		||||
            entryValues = arrayOf("1", "500", "250") // using a value of 0 breaks the image viewer, so min is 1
 | 
			
		||||
            defaultValue = "500"
 | 
			
		||||
            summary = "%s"
 | 
			
		||||
        }
 | 
			
		||||
        switchPreference {
 | 
			
		||||
@@ -53,23 +53,20 @@ class SettingsReaderController : SettingsController() {
 | 
			
		||||
            defaultValue = true
 | 
			
		||||
        }
 | 
			
		||||
        switchPreference {
 | 
			
		||||
            key = Keys.showNavigationOverlayOnStart
 | 
			
		||||
            bindTo(preferences.showNavigationOverlayOnStart())
 | 
			
		||||
            titleRes = R.string.pref_show_navigation_mode
 | 
			
		||||
            summaryRes = R.string.pref_show_navigation_mode_summary
 | 
			
		||||
            defaultValue = false
 | 
			
		||||
        }
 | 
			
		||||
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
 | 
			
		||||
            switchPreference {
 | 
			
		||||
                key = Keys.trueColor
 | 
			
		||||
                bindTo(preferences.trueColor())
 | 
			
		||||
                titleRes = R.string.pref_true_color
 | 
			
		||||
                summaryRes = R.string.pref_true_color_summary
 | 
			
		||||
                defaultValue = false
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        switchPreference {
 | 
			
		||||
            key = Keys.enableTransitions
 | 
			
		||||
            bindTo(preferences.pageTransitions())
 | 
			
		||||
            titleRes = R.string.pref_page_transitions
 | 
			
		||||
            defaultValue = true
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        preferenceCategory {
 | 
			
		||||
@@ -91,38 +88,33 @@ class SettingsReaderController : SettingsController() {
 | 
			
		||||
                summary = "%s"
 | 
			
		||||
            }
 | 
			
		||||
            intListPreference {
 | 
			
		||||
                key = Keys.readerTheme
 | 
			
		||||
                bindTo(preferences.readerTheme())
 | 
			
		||||
                titleRes = R.string.pref_reader_theme
 | 
			
		||||
                entriesRes = arrayOf(R.string.black_background, R.string.gray_background, R.string.white_background, R.string.automatic_background)
 | 
			
		||||
                entryValues = arrayOf("1", "2", "0", "3")
 | 
			
		||||
                defaultValue = "1"
 | 
			
		||||
                summary = "%s"
 | 
			
		||||
            }
 | 
			
		||||
            switchPreference {
 | 
			
		||||
                key = Keys.fullscreen
 | 
			
		||||
                bindTo(preferences.fullscreen())
 | 
			
		||||
                titleRes = R.string.pref_fullscreen
 | 
			
		||||
                defaultValue = true
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (activity?.hasDisplayCutout() == true) {
 | 
			
		||||
                switchPreference {
 | 
			
		||||
                    key = Keys.cutoutShort
 | 
			
		||||
                    bindTo(preferences.cutoutShort())
 | 
			
		||||
                    titleRes = R.string.pref_cutout_short
 | 
			
		||||
                    defaultValue = true
 | 
			
		||||
 | 
			
		||||
                    visibleIf(preferences.fullscreen()) { it }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            switchPreference {
 | 
			
		||||
                key = Keys.keepScreenOn
 | 
			
		||||
                bindTo(preferences.keepScreenOn())
 | 
			
		||||
                titleRes = R.string.pref_keep_screen_on
 | 
			
		||||
                defaultValue = true
 | 
			
		||||
            }
 | 
			
		||||
            switchPreference {
 | 
			
		||||
                key = Keys.showPageNumber
 | 
			
		||||
                bindTo(preferences.showPageNumber())
 | 
			
		||||
                titleRes = R.string.pref_show_page_number
 | 
			
		||||
                defaultValue = true
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -140,9 +132,8 @@ class SettingsReaderController : SettingsController() {
 | 
			
		||||
                defaultValue = true
 | 
			
		||||
            }
 | 
			
		||||
            switchPreference {
 | 
			
		||||
                key = Keys.alwaysShowChapterTransition
 | 
			
		||||
                bindTo(preferences.alwaysShowChapterTransition())
 | 
			
		||||
                titleRes = R.string.pref_always_show_chapter_transition
 | 
			
		||||
                defaultValue = true
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -150,18 +141,17 @@ class SettingsReaderController : SettingsController() {
 | 
			
		||||
            titleRes = R.string.pager_viewer
 | 
			
		||||
 | 
			
		||||
            intListPreference {
 | 
			
		||||
                key = Keys.navigationModePager
 | 
			
		||||
                bindTo(preferences.navigationModePager())
 | 
			
		||||
                titleRes = R.string.pref_viewer_nav
 | 
			
		||||
                entries = context.resources.getStringArray(R.array.pager_nav).also { values ->
 | 
			
		||||
                    entryValues = values.indices.map { index -> "$index" }.toTypedArray()
 | 
			
		||||
                }
 | 
			
		||||
                defaultValue = "0"
 | 
			
		||||
                summary = "%s"
 | 
			
		||||
 | 
			
		||||
                visibleIf(preferences.readWithTapping()) { it }
 | 
			
		||||
            }
 | 
			
		||||
            listPreference {
 | 
			
		||||
                key = Keys.pagerNavInverted
 | 
			
		||||
                bindTo(preferences.pagerNavInverted())
 | 
			
		||||
                titleRes = R.string.pref_read_with_tapping_inverted
 | 
			
		||||
                entriesRes = arrayOf(
 | 
			
		||||
                    R.string.tapping_inverted_none,
 | 
			
		||||
@@ -175,13 +165,12 @@ class SettingsReaderController : SettingsController() {
 | 
			
		||||
                    TappingInvertMode.VERTICAL.name,
 | 
			
		||||
                    TappingInvertMode.BOTH.name
 | 
			
		||||
                )
 | 
			
		||||
                defaultValue = TappingInvertMode.NONE.name
 | 
			
		||||
                summary = "%s"
 | 
			
		||||
 | 
			
		||||
                visibleIf(preferences.readWithTapping()) { it }
 | 
			
		||||
            }
 | 
			
		||||
            intListPreference {
 | 
			
		||||
                key = Keys.imageScaleType
 | 
			
		||||
                bindTo(preferences.imageScaleType())
 | 
			
		||||
                titleRes = R.string.pref_image_scale_type
 | 
			
		||||
                entriesRes = arrayOf(
 | 
			
		||||
                    R.string.scale_type_fit_screen,
 | 
			
		||||
@@ -192,11 +181,10 @@ class SettingsReaderController : SettingsController() {
 | 
			
		||||
                    R.string.scale_type_smart_fit
 | 
			
		||||
                )
 | 
			
		||||
                entryValues = arrayOf("1", "2", "3", "4", "5", "6")
 | 
			
		||||
                defaultValue = "1"
 | 
			
		||||
                summary = "%s"
 | 
			
		||||
            }
 | 
			
		||||
            intListPreference {
 | 
			
		||||
                key = Keys.zoomStart
 | 
			
		||||
                bindTo(preferences.zoomStart())
 | 
			
		||||
                titleRes = R.string.pref_zoom_start
 | 
			
		||||
                entriesRes = arrayOf(
 | 
			
		||||
                    R.string.zoom_start_automatic,
 | 
			
		||||
@@ -205,24 +193,20 @@ class SettingsReaderController : SettingsController() {
 | 
			
		||||
                    R.string.zoom_start_center
 | 
			
		||||
                )
 | 
			
		||||
                entryValues = arrayOf("1", "2", "3", "4")
 | 
			
		||||
                defaultValue = "1"
 | 
			
		||||
                summary = "%s"
 | 
			
		||||
            }
 | 
			
		||||
            switchPreference {
 | 
			
		||||
                key = Keys.cropBorders
 | 
			
		||||
                bindTo(preferences.cropBorders())
 | 
			
		||||
                titleRes = R.string.pref_crop_borders
 | 
			
		||||
                defaultValue = false
 | 
			
		||||
            }
 | 
			
		||||
            switchPreference {
 | 
			
		||||
                key = Keys.dualPageSplitPaged
 | 
			
		||||
                bindTo(preferences.dualPageSplitPaged())
 | 
			
		||||
                titleRes = R.string.pref_dual_page_split
 | 
			
		||||
                defaultValue = false
 | 
			
		||||
            }
 | 
			
		||||
            switchPreference {
 | 
			
		||||
                key = Keys.dualPageInvertPaged
 | 
			
		||||
                bindTo(preferences.dualPageInvertPaged())
 | 
			
		||||
                titleRes = R.string.pref_dual_page_invert
 | 
			
		||||
                summaryRes = R.string.pref_dual_page_invert_summary
 | 
			
		||||
                defaultValue = false
 | 
			
		||||
                visibleIf(preferences.dualPageSplitPaged()) { it }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -231,18 +215,16 @@ class SettingsReaderController : SettingsController() {
 | 
			
		||||
            titleRes = R.string.webtoon_viewer
 | 
			
		||||
 | 
			
		||||
            intListPreference {
 | 
			
		||||
                key = Keys.navigationModeWebtoon
 | 
			
		||||
                bindTo(preferences.navigationModeWebtoon())
 | 
			
		||||
                titleRes = R.string.pref_viewer_nav
 | 
			
		||||
                entries = context.resources.getStringArray(R.array.webtoon_nav).also { values ->
 | 
			
		||||
                    entryValues = values.indices.map { index -> "$index" }.toTypedArray()
 | 
			
		||||
                }
 | 
			
		||||
                defaultValue = "0"
 | 
			
		||||
                summary = "%s"
 | 
			
		||||
 | 
			
		||||
                visibleIf(preferences.readWithTapping()) { it }
 | 
			
		||||
            }
 | 
			
		||||
            listPreference {
 | 
			
		||||
                key = Keys.webtoonNavInverted
 | 
			
		||||
                bindTo(preferences.webtoonNavInverted())
 | 
			
		||||
                titleRes = R.string.pref_read_with_tapping_inverted
 | 
			
		||||
                entriesRes = arrayOf(
 | 
			
		||||
                    R.string.tapping_inverted_none,
 | 
			
		||||
@@ -256,13 +238,12 @@ class SettingsReaderController : SettingsController() {
 | 
			
		||||
                    TappingInvertMode.VERTICAL.name,
 | 
			
		||||
                    TappingInvertMode.BOTH.name
 | 
			
		||||
                )
 | 
			
		||||
                defaultValue = TappingInvertMode.NONE.name
 | 
			
		||||
                summary = "%s"
 | 
			
		||||
 | 
			
		||||
                visibleIf(preferences.readWithTapping()) { it }
 | 
			
		||||
            }
 | 
			
		||||
            intListPreference {
 | 
			
		||||
                key = Keys.webtoonSidePadding
 | 
			
		||||
                bindTo(preferences.webtoonSidePadding())
 | 
			
		||||
                titleRes = R.string.pref_webtoon_side_padding
 | 
			
		||||
                entriesRes = arrayOf(
 | 
			
		||||
                    R.string.webtoon_side_padding_0,
 | 
			
		||||
@@ -272,11 +253,10 @@ class SettingsReaderController : SettingsController() {
 | 
			
		||||
                    R.string.webtoon_side_padding_25
 | 
			
		||||
                )
 | 
			
		||||
                entryValues = arrayOf("0", "10", "15", "20", "25")
 | 
			
		||||
                defaultValue = "0"
 | 
			
		||||
                summary = "%s"
 | 
			
		||||
            }
 | 
			
		||||
            listPreference {
 | 
			
		||||
                key = Keys.readerHideThreshold
 | 
			
		||||
                bindTo(preferences.readerHideThreshold())
 | 
			
		||||
                titleRes = R.string.pref_hide_threshold
 | 
			
		||||
                entriesRes = arrayOf(
 | 
			
		||||
                    R.string.pref_highest,
 | 
			
		||||
@@ -287,24 +267,20 @@ class SettingsReaderController : SettingsController() {
 | 
			
		||||
                entryValues = PreferenceValues.ReaderHideThreshold.values()
 | 
			
		||||
                    .map { it.name }
 | 
			
		||||
                    .toTypedArray()
 | 
			
		||||
                defaultValue = "${PreferenceValues.ReaderHideThreshold.LOW}"
 | 
			
		||||
                summary = "%s"
 | 
			
		||||
            }
 | 
			
		||||
            switchPreference {
 | 
			
		||||
                key = Keys.cropBordersWebtoon
 | 
			
		||||
                bindTo(preferences.cropBordersWebtoon())
 | 
			
		||||
                titleRes = R.string.pref_crop_borders
 | 
			
		||||
                defaultValue = false
 | 
			
		||||
            }
 | 
			
		||||
            switchPreference {
 | 
			
		||||
                key = Keys.dualPageSplitWebtoon
 | 
			
		||||
                bindTo(preferences.dualPageSplitWebtoon())
 | 
			
		||||
                titleRes = R.string.pref_dual_page_split
 | 
			
		||||
                defaultValue = false
 | 
			
		||||
            }
 | 
			
		||||
            switchPreference {
 | 
			
		||||
                key = Keys.dualPageInvertWebtoon
 | 
			
		||||
                bindTo(preferences.dualPageInvertWebtoon())
 | 
			
		||||
                titleRes = R.string.pref_dual_page_invert
 | 
			
		||||
                summaryRes = R.string.pref_dual_page_invert_summary
 | 
			
		||||
                defaultValue = false
 | 
			
		||||
                visibleIf(preferences.dualPageSplitWebtoon()) { it }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -313,19 +289,16 @@ class SettingsReaderController : SettingsController() {
 | 
			
		||||
            titleRes = R.string.pref_reader_navigation
 | 
			
		||||
 | 
			
		||||
            switchPreference {
 | 
			
		||||
                key = Keys.readWithTapping
 | 
			
		||||
                bindTo(preferences.readWithTapping())
 | 
			
		||||
                titleRes = R.string.pref_read_with_tapping
 | 
			
		||||
                defaultValue = true
 | 
			
		||||
            }
 | 
			
		||||
            switchPreference {
 | 
			
		||||
                key = Keys.readWithVolumeKeys
 | 
			
		||||
                bindTo(preferences.readWithVolumeKeys())
 | 
			
		||||
                titleRes = R.string.pref_read_with_volume_keys
 | 
			
		||||
                defaultValue = false
 | 
			
		||||
            }
 | 
			
		||||
            switchPreference {
 | 
			
		||||
                key = Keys.readWithVolumeKeysInverted
 | 
			
		||||
                bindTo(preferences.readWithVolumeKeysInverted())
 | 
			
		||||
                titleRes = R.string.pref_read_with_volume_keys_inverted
 | 
			
		||||
                defaultValue = false
 | 
			
		||||
                visibleIf(preferences.readWithVolumeKeys()) { it }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -334,9 +307,8 @@ class SettingsReaderController : SettingsController() {
 | 
			
		||||
            titleRes = R.string.pref_reader_actions
 | 
			
		||||
 | 
			
		||||
            switchPreference {
 | 
			
		||||
                key = Keys.readWithLongTap
 | 
			
		||||
                bindTo(preferences.readWithLongTap())
 | 
			
		||||
                titleRes = R.string.pref_read_with_long_tap
 | 
			
		||||
                defaultValue = true
 | 
			
		||||
            }
 | 
			
		||||
            switchPreference {
 | 
			
		||||
                key = Keys.folderPerManga
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@ import androidx.fragment.app.FragmentActivity
 | 
			
		||||
import androidx.preference.Preference
 | 
			
		||||
import androidx.preference.PreferenceScreen
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.bindTo
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.defaultValue
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.intListPreference
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.requireAuthentication
 | 
			
		||||
@@ -24,9 +25,8 @@ class SettingsSecurityController : SettingsController() {
 | 
			
		||||
 | 
			
		||||
        if (context.isAuthenticationSupported()) {
 | 
			
		||||
            switchPreference {
 | 
			
		||||
                key = Keys.useAuthenticator
 | 
			
		||||
                bindTo(preferences.useAuthenticator())
 | 
			
		||||
                titleRes = R.string.lock_with_biometrics
 | 
			
		||||
                defaultValue = false
 | 
			
		||||
 | 
			
		||||
                requireAuthentication(
 | 
			
		||||
                    activity as? FragmentActivity,
 | 
			
		||||
@@ -36,7 +36,7 @@ class SettingsSecurityController : SettingsController() {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            intListPreference {
 | 
			
		||||
                key = Keys.lockAppAfter
 | 
			
		||||
                bindTo(preferences.lockAppAfter())
 | 
			
		||||
                titleRes = R.string.lock_when_idle
 | 
			
		||||
                val values = arrayOf("0", "1", "2", "5", "10", "-1")
 | 
			
		||||
                entries = values.mapNotNull {
 | 
			
		||||
@@ -47,7 +47,6 @@ class SettingsSecurityController : SettingsController() {
 | 
			
		||||
                    }
 | 
			
		||||
                }.toTypedArray()
 | 
			
		||||
                entryValues = values
 | 
			
		||||
                defaultValue = "0"
 | 
			
		||||
                summary = "%s"
 | 
			
		||||
                onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue ->
 | 
			
		||||
                    if (value == newValue) return@OnPreferenceChangeListener false
 | 
			
		||||
@@ -82,10 +81,9 @@ class SettingsSecurityController : SettingsController() {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        switchPreference {
 | 
			
		||||
            key = Keys.secureScreen
 | 
			
		||||
            bindTo(preferences.secureScreen())
 | 
			
		||||
            titleRes = R.string.secure_screen
 | 
			
		||||
            summaryRes = R.string.secure_screen_summary
 | 
			
		||||
            defaultValue = false
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        switchPreference {
 | 
			
		||||
 
 | 
			
		||||
@@ -123,6 +123,11 @@ inline fun <P : Preference> PreferenceGroup.addThenInit(p: P, block: P.() -> Uni
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline fun <T> Preference.bindTo(preference: com.tfcporciuncula.flow.Preference<T>) {
 | 
			
		||||
    key = preference.key
 | 
			
		||||
    defaultValue = preference.defaultValue
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline fun Preference.onClick(crossinline block: () -> Unit) {
 | 
			
		||||
    setOnPreferenceClickListener { block(); true }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user