|
|
|
|
@ -13,7 +13,9 @@ import androidx.core.content.edit
|
|
|
|
|
import androidx.core.os.LocaleListCompat
|
|
|
|
|
import androidx.preference.PreferenceManager
|
|
|
|
|
import dagger.hilt.android.qualifiers.ApplicationContext
|
|
|
|
|
import org.json.JSONArray
|
|
|
|
|
import org.koitharu.kotatsu.BuildConfig
|
|
|
|
|
import org.koitharu.kotatsu.core.backup.mapJSONToSet
|
|
|
|
|
import org.koitharu.kotatsu.core.model.ZoomMode
|
|
|
|
|
import org.koitharu.kotatsu.core.network.DoHProvider
|
|
|
|
|
import org.koitharu.kotatsu.core.util.ext.connectivityManager
|
|
|
|
|
@ -72,17 +74,14 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) {
|
|
|
|
|
get() = prefs.getEnumValue(KEY_LIST_MODE, ListMode.GRID)
|
|
|
|
|
set(value) = prefs.edit { putEnumValue(KEY_LIST_MODE, value) }
|
|
|
|
|
|
|
|
|
|
var theme: Int
|
|
|
|
|
val theme: Int
|
|
|
|
|
get() = prefs.getString(KEY_THEME, null)?.toIntOrNull() ?: AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
|
|
|
|
|
set(value) = prefs.edit { putString(KEY_THEME, value.toString()) }
|
|
|
|
|
|
|
|
|
|
var colorScheme: ColorScheme
|
|
|
|
|
val colorScheme: ColorScheme
|
|
|
|
|
get() = prefs.getEnumValue(KEY_COLOR_THEME, ColorScheme.default)
|
|
|
|
|
set(value) = prefs.edit { putEnumValue(KEY_COLOR_THEME, value) }
|
|
|
|
|
|
|
|
|
|
var isAmoledTheme: Boolean
|
|
|
|
|
val isAmoledTheme: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_THEME_AMOLED, false)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_THEME_AMOLED, value) }
|
|
|
|
|
|
|
|
|
|
var gridSize: Int
|
|
|
|
|
get() = prefs.getInt(KEY_GRID_SIZE, 100)
|
|
|
|
|
@ -99,12 +98,11 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var readerPageSwitch: Set<String>
|
|
|
|
|
val readerPageSwitch: Set<String>
|
|
|
|
|
get() = prefs.getStringSet(KEY_READER_SWITCHERS, null) ?: setOf(PAGE_SWITCH_TAPS)
|
|
|
|
|
set(value) = prefs.edit { putStringSet(KEY_READER_SWITCHERS, value) }
|
|
|
|
|
var isReaderTapsAdaptive: Boolean
|
|
|
|
|
|
|
|
|
|
val isReaderTapsAdaptive: Boolean
|
|
|
|
|
get() = !prefs.getBoolean(KEY_READER_TAPS_LTR, false)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_READER_TAPS_LTR, value) }
|
|
|
|
|
|
|
|
|
|
var isTrafficWarningEnabled: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_TRAFFIC_WARNING, true)
|
|
|
|
|
@ -114,50 +112,41 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) {
|
|
|
|
|
get() = prefs.getBoolean(KEY_ALL_FAVOURITES_VISIBLE, true)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_ALL_FAVOURITES_VISIBLE, value) }
|
|
|
|
|
|
|
|
|
|
var isTrackerEnabled: Boolean
|
|
|
|
|
val isTrackerEnabled: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_TRACKER_ENABLED, true)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_TRACKER_ENABLED, value) }
|
|
|
|
|
|
|
|
|
|
var isTrackerNotificationsEnabled: Boolean
|
|
|
|
|
val isTrackerNotificationsEnabled: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_TRACKER_NOTIFICATIONS, true)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_TRACKER_NOTIFICATIONS, value) }
|
|
|
|
|
|
|
|
|
|
var notificationSound: Uri
|
|
|
|
|
get() = prefs.getString(KEY_NOTIFICATIONS_SOUND, null)?.toUriOrNull()
|
|
|
|
|
?: Settings.System.DEFAULT_NOTIFICATION_URI
|
|
|
|
|
set(value) = prefs.edit { putString(KEY_NOTIFICATIONS_SOUND, value.toString()) }
|
|
|
|
|
|
|
|
|
|
var notificationVibrate: Boolean
|
|
|
|
|
val notificationVibrate: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_NOTIFICATIONS_VIBRATE, false)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_NOTIFICATIONS_VIBRATE, value) }
|
|
|
|
|
|
|
|
|
|
var notificationLight: Boolean
|
|
|
|
|
val notificationLight: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_NOTIFICATIONS_LIGHT, true)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_NOTIFICATIONS_LIGHT, value) }
|
|
|
|
|
|
|
|
|
|
var readerAnimation: Boolean
|
|
|
|
|
val readerAnimation: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_READER_ANIMATION, false)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_READER_ANIMATION, value) }
|
|
|
|
|
|
|
|
|
|
var defaultReaderMode: ReaderMode
|
|
|
|
|
val defaultReaderMode: ReaderMode
|
|
|
|
|
get() = prefs.getEnumValue(KEY_READER_MODE, ReaderMode.STANDARD)
|
|
|
|
|
set(value) = prefs.edit { putEnumValue(KEY_READER_MODE, value) }
|
|
|
|
|
|
|
|
|
|
var isReaderModeDetectionEnabled: Boolean
|
|
|
|
|
val isReaderModeDetectionEnabled: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_READER_MODE_DETECT, true)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_READER_MODE_DETECT, value) }
|
|
|
|
|
|
|
|
|
|
var isHistoryGroupingEnabled: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_HISTORY_GROUPING, true)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_HISTORY_GROUPING, value) }
|
|
|
|
|
|
|
|
|
|
var isReadingIndicatorsEnabled: Boolean
|
|
|
|
|
val isReadingIndicatorsEnabled: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_READING_INDICATORS, true)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_READING_INDICATORS, value) }
|
|
|
|
|
|
|
|
|
|
var isHistoryExcludeNsfw: Boolean
|
|
|
|
|
val isHistoryExcludeNsfw: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_HISTORY_EXCLUDE_NSFW, false)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_HISTORY_EXCLUDE_NSFW, value) }
|
|
|
|
|
|
|
|
|
|
var isIncognitoModeEnabled: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_INCOGNITO_MODE, false)
|
|
|
|
|
@ -167,41 +156,34 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) {
|
|
|
|
|
get() = prefs.getBoolean(KEY_REVERSE_CHAPTERS, false)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_REVERSE_CHAPTERS, value) }
|
|
|
|
|
|
|
|
|
|
var zoomMode: ZoomMode
|
|
|
|
|
val zoomMode: ZoomMode
|
|
|
|
|
get() = prefs.getEnumValue(KEY_ZOOM_MODE, ZoomMode.FIT_CENTER)
|
|
|
|
|
set(value) = prefs.edit { putEnumValue(KEY_ZOOM_MODE, value) }
|
|
|
|
|
|
|
|
|
|
var trackSources: Set<String>
|
|
|
|
|
val trackSources: Set<String>
|
|
|
|
|
get() = prefs.getStringSet(KEY_TRACK_SOURCES, null) ?: arraySetOf(TRACK_FAVOURITES, TRACK_HISTORY)
|
|
|
|
|
set(value) = prefs.edit { putStringSet(KEY_TRACK_SOURCES, value) }
|
|
|
|
|
|
|
|
|
|
var appPassword: String?
|
|
|
|
|
get() = prefs.getString(KEY_APP_PASSWORD, null)
|
|
|
|
|
set(value) = prefs.edit { if (value != null) putString(KEY_APP_PASSWORD, value) else remove(KEY_APP_PASSWORD) }
|
|
|
|
|
|
|
|
|
|
var isLoggingEnabled: Boolean
|
|
|
|
|
val isLoggingEnabled: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_LOGGING_ENABLED, false)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_LOGGING_ENABLED, value) }
|
|
|
|
|
|
|
|
|
|
var isBiometricProtectionEnabled: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_PROTECT_APP_BIOMETRIC, true)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_PROTECT_APP_BIOMETRIC, value) }
|
|
|
|
|
|
|
|
|
|
var isMirrorSwitchingAvailable: Boolean
|
|
|
|
|
val isMirrorSwitchingAvailable: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_MIRROR_SWITCHING, true)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_MIRROR_SWITCHING, value) }
|
|
|
|
|
|
|
|
|
|
var isExitConfirmationEnabled: Boolean
|
|
|
|
|
val isExitConfirmationEnabled: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_EXIT_CONFIRM, false)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_EXIT_CONFIRM, value) }
|
|
|
|
|
|
|
|
|
|
var isDynamicShortcutsEnabled: Boolean
|
|
|
|
|
val isDynamicShortcutsEnabled: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_SHORTCUTS, true)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_SHORTCUTS, value) }
|
|
|
|
|
|
|
|
|
|
var isUnstableUpdatesAllowed: Boolean
|
|
|
|
|
val isUnstableUpdatesAllowed: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_UPDATES_UNSTABLE, false)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_UPDATES_UNSTABLE, value) }
|
|
|
|
|
|
|
|
|
|
val isContentPrefetchEnabled: Boolean
|
|
|
|
|
get() {
|
|
|
|
|
@ -282,27 +264,23 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var isDownloadsSlowdownEnabled: Boolean
|
|
|
|
|
val isDownloadsSlowdownEnabled: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_DOWNLOADS_SLOWDOWN, false)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_DOWNLOADS_SLOWDOWN, value) }
|
|
|
|
|
|
|
|
|
|
var isDownloadsWiFiOnly: Boolean
|
|
|
|
|
val isDownloadsWiFiOnly: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_DOWNLOADS_WIFI, false)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_DOWNLOADS_WIFI, value) }
|
|
|
|
|
|
|
|
|
|
var isSuggestionsEnabled: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_SUGGESTIONS, false)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_SUGGESTIONS, value) }
|
|
|
|
|
|
|
|
|
|
var isSuggestionsExcludeNsfw: Boolean
|
|
|
|
|
val isSuggestionsExcludeNsfw: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_SUGGESTIONS_EXCLUDE_NSFW, false)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_SUGGESTIONS_EXCLUDE_NSFW, value) }
|
|
|
|
|
|
|
|
|
|
var isSuggestionsNotificationAvailable: Boolean
|
|
|
|
|
val isSuggestionsNotificationAvailable: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_SUGGESTIONS_NOTIFICATIONS, true)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_SUGGESTIONS_NOTIFICATIONS, value) }
|
|
|
|
|
|
|
|
|
|
var suggestionsTagsBlacklist: Set<String>
|
|
|
|
|
val suggestionsTagsBlacklist: Set<String>
|
|
|
|
|
get() {
|
|
|
|
|
val string = prefs.getString(KEY_SUGGESTIONS_EXCLUDE_TAGS, null)?.trimEnd(' ', ',')
|
|
|
|
|
if (string.isNullOrEmpty()) {
|
|
|
|
|
@ -310,27 +288,21 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) {
|
|
|
|
|
}
|
|
|
|
|
return string.split(',').mapToSet { it.trim() }
|
|
|
|
|
}
|
|
|
|
|
set(value) = prefs.edit { putStringSet(KEY_SUGGESTIONS_EXCLUDE_TAGS, value) }
|
|
|
|
|
|
|
|
|
|
var isReaderBarEnabled: Boolean
|
|
|
|
|
val isReaderBarEnabled: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_READER_BAR, true)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_READER_BAR, value) }
|
|
|
|
|
|
|
|
|
|
var isReaderSliderEnabled: Boolean
|
|
|
|
|
val isReaderSliderEnabled: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_READER_SLIDER, true)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_READER_SLIDER, value) }
|
|
|
|
|
|
|
|
|
|
var isImagesProxyEnabled: Boolean
|
|
|
|
|
val isImagesProxyEnabled: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_IMAGES_PROXY, false)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_IMAGES_PROXY, value) }
|
|
|
|
|
|
|
|
|
|
var dnsOverHttps: DoHProvider
|
|
|
|
|
val dnsOverHttps: DoHProvider
|
|
|
|
|
get() = prefs.getEnumValue(KEY_DOH, DoHProvider.NONE)
|
|
|
|
|
set(value) = prefs.edit { putEnumValue(KEY_DOH, value) }
|
|
|
|
|
|
|
|
|
|
var isSSLBypassEnabled: Boolean
|
|
|
|
|
val isSSLBypassEnabled: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_SSL_BYPASS, false)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_SSL_BYPASS, value) }
|
|
|
|
|
|
|
|
|
|
val proxyType: Proxy.Type
|
|
|
|
|
get() {
|
|
|
|
|
@ -354,10 +326,8 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) {
|
|
|
|
|
get() = prefs.getEnumValue(KEY_LOCAL_LIST_ORDER, SortOrder.NEWEST)
|
|
|
|
|
set(value) = prefs.edit { putEnumValue(KEY_LOCAL_LIST_ORDER, value) }
|
|
|
|
|
|
|
|
|
|
var isWebtoonZoomEnable: Boolean
|
|
|
|
|
val isWebtoonZoomEnable: Boolean
|
|
|
|
|
get() = prefs.getBoolean(KEY_WEBTOON_ZOOM, true)
|
|
|
|
|
set(value) = prefs.edit { putBoolean(KEY_WEBTOON_ZOOM, value) }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@get:FloatRange(from = 0.0, to = 1.0)
|
|
|
|
|
var readerAutoscrollSpeed: Float
|
|
|
|
|
@ -409,6 +379,23 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) {
|
|
|
|
|
|
|
|
|
|
fun observe() = prefs.observe()
|
|
|
|
|
|
|
|
|
|
fun getAllValues(): Map<String, *> = prefs.all
|
|
|
|
|
|
|
|
|
|
fun restoreValuesFromMap(m: Map<String, *>) {
|
|
|
|
|
prefs.edit {
|
|
|
|
|
m.forEach { e ->
|
|
|
|
|
when (e.value) {
|
|
|
|
|
is Boolean -> putBoolean(e.key, e.value as Boolean)
|
|
|
|
|
is Int -> putInt(e.key, e.value as Int)
|
|
|
|
|
is Long -> putLong(e.key, e.value as Long)
|
|
|
|
|
is Float -> putFloat(e.key, e.value as Float)
|
|
|
|
|
is String -> putString(e.key, e.value as String)
|
|
|
|
|
is JSONArray -> putStringSet(e.key, (e.value as JSONArray).mapJSONToSet<String, String> { it })
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun isBackgroundNetworkRestricted(): Boolean {
|
|
|
|
|
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
|
|
|
|
connectivityManager.restrictBackgroundStatus == ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED
|
|
|
|
|
|