mirror of
https://github.com/tachiyomiorg/tachiyomi.git
synced 2025-01-10 00:29:25 +01:00
Made settings use material dialog box
Even the list preference in extensions details ...this was a nightmare
This commit is contained in:
parent
fc734a980f
commit
43e801130e
@ -31,6 +31,10 @@ class PreferencesHelper(val context: Context) {
|
|||||||
File(Environment.getExternalStorageDirectory().absolutePath + File.separator +
|
File(Environment.getExternalStorageDirectory().absolutePath + File.separator +
|
||||||
context.getString(R.string.app_name), "backup"))
|
context.getString(R.string.app_name), "backup"))
|
||||||
|
|
||||||
|
fun getInt(key: String, default: Int?) = rxPrefs.getInteger(key, default)
|
||||||
|
fun getStringPref(key: String, default: String?) = rxPrefs.getString(key, default)
|
||||||
|
fun getStringSet(key: String, default: Set<String>) = rxPrefs.getStringSet(key, default)
|
||||||
|
|
||||||
fun startScreen() = prefs.getInt(Keys.startScreen, 1)
|
fun startScreen() = prefs.getInt(Keys.startScreen, 1)
|
||||||
|
|
||||||
fun clear() = prefs.edit().clear().apply()
|
fun clear() = prefs.edit().clear().apply()
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package eu.kanade.tachiyomi.ui.extension
|
package eu.kanade.tachiyomi.ui.extension
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
|
import android.app.Dialog
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.util.TypedValue
|
import android.util.TypedValue
|
||||||
@ -31,6 +32,7 @@ import eu.kanade.tachiyomi.ui.base.controller.NucleusController
|
|||||||
import eu.kanade.tachiyomi.ui.setting.preferenceCategory
|
import eu.kanade.tachiyomi.ui.setting.preferenceCategory
|
||||||
import eu.kanade.tachiyomi.util.LocaleHelper
|
import eu.kanade.tachiyomi.util.LocaleHelper
|
||||||
import eu.kanade.tachiyomi.util.RecyclerWindowInsetsListener
|
import eu.kanade.tachiyomi.util.RecyclerWindowInsetsListener
|
||||||
|
import eu.kanade.tachiyomi.widget.preference.ListMatPreference
|
||||||
import eu.kanade.tachiyomi.widget.preference.LoginPreference
|
import eu.kanade.tachiyomi.widget.preference.LoginPreference
|
||||||
import eu.kanade.tachiyomi.widget.preference.SourceLoginDialog
|
import eu.kanade.tachiyomi.widget.preference.SourceLoginDialog
|
||||||
import kotlinx.android.synthetic.main.extension_detail_controller.*
|
import kotlinx.android.synthetic.main.extension_detail_controller.*
|
||||||
@ -154,6 +156,7 @@ class ExtensionDetailsController(bundle: Bundle? = null) :
|
|||||||
while (newScreen.preferenceCount != 0) {
|
while (newScreen.preferenceCount != 0) {
|
||||||
val pref = newScreen.getPreference(0)
|
val pref = newScreen.getPreference(0)
|
||||||
pref.preferenceDataStore = dataStore
|
pref.preferenceDataStore = dataStore
|
||||||
|
pref.fragment = "source_${source.id}"
|
||||||
pref.order = Int.MAX_VALUE // reset to default order
|
pref.order = Int.MAX_VALUE // reset to default order
|
||||||
|
|
||||||
newScreen.removePreference(pref)
|
newScreen.removePreference(pref)
|
||||||
@ -177,6 +180,18 @@ class ExtensionDetailsController(bundle: Bundle? = null) :
|
|||||||
screen.getPreference(it) === preference
|
screen.getPreference(it) === preference
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (preference is ListPreference) {
|
||||||
|
ListMatPreference(preference.context).apply {
|
||||||
|
key = preference.key
|
||||||
|
sharedPref = preference.fragment
|
||||||
|
otherPref = preference
|
||||||
|
preferenceDataStore = preference.preferenceDataStore
|
||||||
|
entries = preference.entries.mapNotNull { it.toString() }
|
||||||
|
entryValues = preference.entryValues.mapNotNull { it.toString() }
|
||||||
|
}.dialog().show()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
val f = when (preference) {
|
val f = when (preference) {
|
||||||
is EditTextPreference -> EditTextPreferenceDialogController
|
is EditTextPreference -> EditTextPreferenceDialogController
|
||||||
.newInstance(preference.getKey())
|
.newInstance(preference.getKey())
|
||||||
|
@ -3,7 +3,18 @@ package eu.kanade.tachiyomi.ui.setting
|
|||||||
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat
|
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat
|
||||||
import androidx.core.graphics.drawable.DrawableCompat
|
import androidx.core.graphics.drawable.DrawableCompat
|
||||||
import androidx.preference.*
|
import androidx.preference.*
|
||||||
|
import com.afollestad.materialdialogs.MaterialDialog
|
||||||
|
import com.afollestad.materialdialogs.list.listItems
|
||||||
|
import com.afollestad.materialdialogs.list.listItemsSingleChoice
|
||||||
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
|
import eu.kanade.tachiyomi.data.preference.getOrDefault
|
||||||
|
import eu.kanade.tachiyomi.widget.preference.IntListMatPreference
|
||||||
import eu.kanade.tachiyomi.widget.preference.IntListPreference
|
import eu.kanade.tachiyomi.widget.preference.IntListPreference
|
||||||
|
import eu.kanade.tachiyomi.widget.preference.ListMatPreference
|
||||||
|
import eu.kanade.tachiyomi.widget.preference.MultiListMatPreference
|
||||||
|
import uy.kohesive.injekt.Injekt
|
||||||
|
import uy.kohesive.injekt.api.get
|
||||||
|
import uy.kohesive.injekt.injectLazy
|
||||||
|
|
||||||
@DslMarker
|
@DslMarker
|
||||||
@Target(AnnotationTarget.TYPE)
|
@Target(AnnotationTarget.TYPE)
|
||||||
@ -29,16 +40,19 @@ inline fun PreferenceGroup.editTextPreference(block: (@DSL EditTextPreference).(
|
|||||||
return initThenAdd(EditTextPreference(context), block).also(::initDialog)
|
return initThenAdd(EditTextPreference(context), block).also(::initDialog)
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun PreferenceGroup.listPreference(block: (@DSL ListPreference).() -> Unit): ListPreference {
|
inline fun PreferenceGroup.listPreference(block: (@DSL ListMatPreference).() -> Unit):
|
||||||
return initThenAdd(ListPreference(context), block).also(::initDialog)
|
ListMatPreference {
|
||||||
|
return initThenAdd(ListMatPreference(context), block)
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun PreferenceGroup.intListPreference(block: (@DSL IntListPreference).() -> Unit): IntListPreference {
|
inline fun PreferenceGroup.intListPreference(block: (@DSL IntListMatPreference).() -> Unit):
|
||||||
return initThenAdd(IntListPreference(context), block).also(::initDialog)
|
IntListMatPreference {
|
||||||
|
return initThenAdd(IntListMatPreference(context), block)
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun PreferenceGroup.multiSelectListPreference(block: (@DSL MultiSelectListPreference).() -> Unit): MultiSelectListPreference {
|
inline fun PreferenceGroup.multiSelectListPreferenceMat(block: (@DSL MultiListMatPreference).()
|
||||||
return initThenAdd(MultiSelectListPreference(context), block).also(::initDialog)
|
-> Unit): MultiListMatPreference {
|
||||||
|
return initThenAdd(MultiListMatPreference(context), block)
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun PreferenceScreen.preferenceCategory(block: (@DSL PreferenceCategory).() -> Unit): PreferenceCategory {
|
inline fun PreferenceScreen.preferenceCategory(block: (@DSL PreferenceCategory).() -> Unit): PreferenceCategory {
|
||||||
@ -102,11 +116,3 @@ var Preference.summaryRes: Int
|
|||||||
var Preference.iconTint: Int
|
var Preference.iconTint: Int
|
||||||
get() = 0 // set only
|
get() = 0 // set only
|
||||||
set(value) { DrawableCompat.setTint(icon, value) }
|
set(value) { DrawableCompat.setTint(icon, value) }
|
||||||
|
|
||||||
var ListPreference.entriesRes: Array<Int>
|
|
||||||
get() = emptyArray() // set only
|
|
||||||
set(value) { entries = value.map { context.getString(it) }.toTypedArray() }
|
|
||||||
|
|
||||||
var MultiSelectListPreference.entriesRes: Array<Int>
|
|
||||||
get() = emptyArray() // set only
|
|
||||||
set(value) { entries = value.map { context.getString(it) }.toTypedArray() }
|
|
||||||
|
@ -22,8 +22,6 @@ import eu.kanade.tachiyomi.ui.base.controller.DialogController
|
|||||||
import eu.kanade.tachiyomi.ui.base.controller.popControllerWithTag
|
import eu.kanade.tachiyomi.ui.base.controller.popControllerWithTag
|
||||||
import eu.kanade.tachiyomi.ui.base.controller.requestPermissionsSafe
|
import eu.kanade.tachiyomi.ui.base.controller.requestPermissionsSafe
|
||||||
import eu.kanade.tachiyomi.util.*
|
import eu.kanade.tachiyomi.util.*
|
||||||
import java.io.File
|
|
||||||
import java.util.concurrent.TimeUnit
|
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys
|
import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys
|
||||||
|
|
||||||
class SettingsBackupController : SettingsController() {
|
class SettingsBackupController : SettingsController() {
|
||||||
@ -84,15 +82,14 @@ class SettingsBackupController : SettingsController() {
|
|||||||
entriesRes = arrayOf(R.string.update_never, R.string.update_6hour,
|
entriesRes = arrayOf(R.string.update_never, R.string.update_6hour,
|
||||||
R.string.update_12hour, R.string.update_24hour,
|
R.string.update_12hour, R.string.update_24hour,
|
||||||
R.string.update_48hour, R.string.update_weekly)
|
R.string.update_48hour, R.string.update_weekly)
|
||||||
entryValues = arrayOf("0", "6", "12", "24", "48", "168")
|
entryValues = listOf(0, 6, 12, 24, 48, 168)
|
||||||
defaultValue = "0"
|
defaultValue = 0
|
||||||
summary = "%s"
|
|
||||||
|
|
||||||
onChange { newValue ->
|
onChange { newValue ->
|
||||||
// Always cancel the previous task, it seems that sometimes they are not updated
|
// Always cancel the previous task, it seems that sometimes they are not updated
|
||||||
BackupCreatorJob.cancelTask()
|
BackupCreatorJob.cancelTask()
|
||||||
|
|
||||||
val interval = (newValue as String).toInt()
|
val interval = newValue as Int
|
||||||
if (interval > 0) {
|
if (interval > 0) {
|
||||||
BackupCreatorJob.setupTask(interval)
|
BackupCreatorJob.setupTask(interval)
|
||||||
}
|
}
|
||||||
@ -123,10 +120,9 @@ class SettingsBackupController : SettingsController() {
|
|||||||
val backupNumber = intListPreference {
|
val backupNumber = intListPreference {
|
||||||
key = Keys.numberOfBackups
|
key = Keys.numberOfBackups
|
||||||
titleRes = R.string.pref_backup_slots
|
titleRes = R.string.pref_backup_slots
|
||||||
entries = arrayOf("1", "2", "3", "4", "5")
|
entries = listOf("1", "2", "3", "4", "5")
|
||||||
entryValues = entries
|
entryRange = 1..5
|
||||||
defaultValue = "1"
|
defaultValue = 1
|
||||||
summary = "%s"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
preferences.backupInterval().asObservable()
|
preferences.backupInterval().asObservable()
|
||||||
|
@ -65,9 +65,8 @@ class SettingsDownloadController : SettingsController() {
|
|||||||
entriesRes = arrayOf(R.string.disabled, R.string.last_read_chapter,
|
entriesRes = arrayOf(R.string.disabled, R.string.last_read_chapter,
|
||||||
R.string.second_to_last, R.string.third_to_last, R.string.fourth_to_last,
|
R.string.second_to_last, R.string.third_to_last, R.string.fourth_to_last,
|
||||||
R.string.fifth_to_last)
|
R.string.fifth_to_last)
|
||||||
entryValues = arrayOf("-1", "0", "1", "2", "3", "4")
|
entryRange = -1..4
|
||||||
defaultValue = "-1"
|
defaultValue = -1
|
||||||
summary = "%s"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,11 +80,12 @@ class SettingsDownloadController : SettingsController() {
|
|||||||
titleRes = R.string.pref_download_new
|
titleRes = R.string.pref_download_new
|
||||||
defaultValue = false
|
defaultValue = false
|
||||||
}
|
}
|
||||||
multiSelectListPreference {
|
multiSelectListPreferenceMat {
|
||||||
key = Keys.downloadNewCategories
|
key = Keys.downloadNewCategories
|
||||||
titleRes = R.string.pref_download_new_categories
|
titleRes = R.string.pref_download_new_categories
|
||||||
entries = dbCategories.map { it.name }.toTypedArray()
|
entries = dbCategories.map { it.name }
|
||||||
entryValues = dbCategories.map { it.id.toString() }.toTypedArray()
|
entryValues = dbCategories.map { it.id.toString() }
|
||||||
|
allSelectionRes = R.string.all
|
||||||
|
|
||||||
preferences.downloadNew().asObservable()
|
preferences.downloadNew().asObservable()
|
||||||
.subscribeUntilDestroy { isVisible = it }
|
.subscribeUntilDestroy { isVisible = it }
|
||||||
@ -96,7 +96,7 @@ class SettingsDownloadController : SettingsController() {
|
|||||||
.mapNotNull { id -> dbCategories.find { it.id == id.toInt() } }
|
.mapNotNull { id -> dbCategories.find { it.id == id.toInt() } }
|
||||||
.sortedBy { it.order }
|
.sortedBy { it.order }
|
||||||
|
|
||||||
summary = if (selectedCategories.isEmpty())
|
customSummary = if (selectedCategories.isEmpty())
|
||||||
resources?.getString(R.string.all)
|
resources?.getString(R.string.all)
|
||||||
else
|
else
|
||||||
selectedCategories.joinToString { it.name }
|
selectedCategories.joinToString { it.name }
|
||||||
|
@ -7,7 +7,7 @@ import eu.kanade.tachiyomi.R
|
|||||||
import eu.kanade.tachiyomi.data.preference.getOrDefault
|
import eu.kanade.tachiyomi.data.preference.getOrDefault
|
||||||
import eu.kanade.tachiyomi.data.updater.UpdaterJob
|
import eu.kanade.tachiyomi.data.updater.UpdaterJob
|
||||||
import eu.kanade.tachiyomi.util.LocaleHelper
|
import eu.kanade.tachiyomi.util.LocaleHelper
|
||||||
import eu.kanade.tachiyomi.widget.preference.IntListPreference
|
import eu.kanade.tachiyomi.widget.preference.IntListMatPreference
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys
|
import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys
|
||||||
|
|
||||||
class SettingsGeneralController : SettingsController() {
|
class SettingsGeneralController : SettingsController() {
|
||||||
@ -20,14 +20,14 @@ class SettingsGeneralController : SettingsController() {
|
|||||||
listPreference {
|
listPreference {
|
||||||
key = Keys.lang
|
key = Keys.lang
|
||||||
titleRes = R.string.pref_language
|
titleRes = R.string.pref_language
|
||||||
entryValues = arrayOf("", "ar", "bg", "bn", "ca", "cs", "de", "el", "en-US", "en-GB",
|
entryValues = listOf("", "ar", "bg", "bn", "ca", "cs", "de", "el", "en-US", "en-GB",
|
||||||
"es", "fr", "hi", "hu", "in", "it", "ja", "ko", "lv", "ms", "nb-rNO", "nl", "pl", "pt",
|
"es", "fr", "hi", "hu", "in", "it", "ja", "ko", "lv", "ms", "nb-rNO", "nl", "pl", "pt",
|
||||||
"pt-BR", "ro", "ru", "sc", "sr", "sv", "th", "tl", "tr", "uk", "vi", "zh-rCN")
|
"pt-BR", "ro", "ru", "sc", "sr", "sv", "th", "tl", "tr", "uk", "vi", "zh-rCN")
|
||||||
entries = entryValues.map { value ->
|
entries = entryValues.map { value ->
|
||||||
val locale = LocaleHelper.getLocaleFromString(value.toString())
|
val locale = LocaleHelper.getLocaleFromString(value.toString())
|
||||||
locale?.getDisplayName(locale)?.capitalize() ?:
|
locale?.getDisplayName(locale)?.capitalize() ?:
|
||||||
context.getString(R.string.system_default)
|
context.getString(R.string.system_default)
|
||||||
}.toTypedArray()
|
}
|
||||||
defaultValue = ""
|
defaultValue = ""
|
||||||
summary = "%s"
|
summary = "%s"
|
||||||
|
|
||||||
@ -41,6 +41,29 @@ class SettingsGeneralController : SettingsController() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
intListPreference {
|
intListPreference {
|
||||||
|
key = Keys.theme
|
||||||
|
titleRes = R.string.pref_theme
|
||||||
|
entriesRes = arrayOf(R.string.light_theme, R.string.dark_theme,
|
||||||
|
R.string.amoled_theme, R.string.darkblue_theme,
|
||||||
|
R.string.system_theme, R.string.system_amoled_theme, R.string.system_darkblue_theme)
|
||||||
|
entryRange = 1..7
|
||||||
|
defaultValue = 5
|
||||||
|
|
||||||
|
onChange {
|
||||||
|
activity?.recreate()
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
intListPreference {
|
||||||
|
key = Keys.startScreen
|
||||||
|
titleRes = R.string.pref_start_screen
|
||||||
|
entriesRes = arrayOf(R.string.label_library, R.string.label_recent_manga,
|
||||||
|
R.string.label_recent_updates)
|
||||||
|
entryRange = 1..3
|
||||||
|
defaultValue = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
/*intListPreference {
|
||||||
key = Keys.theme
|
key = Keys.theme
|
||||||
titleRes = R.string.pref_theme
|
titleRes = R.string.pref_theme
|
||||||
entriesRes = arrayOf(R.string.light_theme, R.string.dark_theme,
|
entriesRes = arrayOf(R.string.light_theme, R.string.dark_theme,
|
||||||
@ -63,7 +86,7 @@ class SettingsGeneralController : SettingsController() {
|
|||||||
entryValues = arrayOf("1", "2", "3")
|
entryValues = arrayOf("1", "2", "3")
|
||||||
defaultValue = "1"
|
defaultValue = "1"
|
||||||
summary = "%s"
|
summary = "%s"
|
||||||
}
|
}*/
|
||||||
switchPreference {
|
switchPreference {
|
||||||
key = Keys.automaticUpdates
|
key = Keys.automaticUpdates
|
||||||
titleRes = R.string.pref_enable_automatic_updates
|
titleRes = R.string.pref_enable_automatic_updates
|
||||||
@ -87,7 +110,7 @@ class SettingsGeneralController : SettingsController() {
|
|||||||
|
|
||||||
val biometricManager = BiometricManager.from(context)
|
val biometricManager = BiometricManager.from(context)
|
||||||
if (biometricManager.canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS) {
|
if (biometricManager.canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS) {
|
||||||
var preference:IntListPreference? = null
|
var preference:IntListMatPreference? = null
|
||||||
switchPreference {
|
switchPreference {
|
||||||
key = Keys.useBiometrics
|
key = Keys.useBiometrics
|
||||||
titleRes = R.string.lock_with_biometrics
|
titleRes = R.string.lock_with_biometrics
|
||||||
@ -102,18 +125,17 @@ class SettingsGeneralController : SettingsController() {
|
|||||||
key = Keys.lockAfter
|
key = Keys.lockAfter
|
||||||
titleRes = R.string.lock_when_idle
|
titleRes = R.string.lock_when_idle
|
||||||
isVisible = preferences.useBiometrics().getOrDefault()
|
isVisible = preferences.useBiometrics().getOrDefault()
|
||||||
val values = arrayOf("0", "2", "5", "10", "20", "30", "60", "90", "120", "-1")
|
val values = listOf(0, 2, 5, 10, 20, 30, 60, 90, 120, -1)
|
||||||
entries = values.map {
|
entries = values.mapNotNull {
|
||||||
when (it) {
|
when (it) {
|
||||||
"0" -> context.getString(R.string.lock_always)
|
0 -> context.getString(R.string.lock_always)
|
||||||
"-1" -> context.getString(R.string.lock_never)
|
-1 -> context.getString(R.string.lock_never)
|
||||||
else -> resources?.getQuantityString(R.plurals.lock_after_mins, it.toInt(),
|
else -> resources?.getQuantityString(R.plurals.lock_after_mins, it.toInt(),
|
||||||
it)
|
it)
|
||||||
}
|
}
|
||||||
}.toTypedArray()
|
}
|
||||||
entryValues = values
|
entryValues = values
|
||||||
defaultValue = "0"
|
defaultValue = 0
|
||||||
summary = "%s"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,6 @@ import android.app.Dialog
|
|||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.biometric.BiometricManager
|
|
||||||
import androidx.preference.PreferenceScreen
|
import androidx.preference.PreferenceScreen
|
||||||
import com.afollestad.materialdialogs.MaterialDialog
|
import com.afollestad.materialdialogs.MaterialDialog
|
||||||
import com.afollestad.materialdialogs.customview.customView
|
import com.afollestad.materialdialogs.customview.customView
|
||||||
@ -15,8 +14,6 @@ import eu.kanade.tachiyomi.data.library.LibraryUpdateJob
|
|||||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
import eu.kanade.tachiyomi.data.preference.getOrDefault
|
import eu.kanade.tachiyomi.data.preference.getOrDefault
|
||||||
import eu.kanade.tachiyomi.ui.base.controller.DialogController
|
import eu.kanade.tachiyomi.ui.base.controller.DialogController
|
||||||
import eu.kanade.tachiyomi.util.LocaleHelper
|
|
||||||
import eu.kanade.tachiyomi.widget.preference.IntListPreference
|
|
||||||
import kotlinx.android.synthetic.main.pref_library_columns.view.*
|
import kotlinx.android.synthetic.main.pref_library_columns.view.*
|
||||||
import rx.Observable
|
import rx.Observable
|
||||||
import uy.kohesive.injekt.Injekt
|
import uy.kohesive.injekt.Injekt
|
||||||
@ -60,27 +57,26 @@ class SettingsLibraryController : SettingsController() {
|
|||||||
entriesRes = arrayOf(R.string.update_never, R.string.update_1hour,
|
entriesRes = arrayOf(R.string.update_never, R.string.update_1hour,
|
||||||
R.string.update_2hour, R.string.update_3hour, R.string.update_6hour,
|
R.string.update_2hour, R.string.update_3hour, R.string.update_6hour,
|
||||||
R.string.update_12hour, R.string.update_24hour, R.string.update_48hour)
|
R.string.update_12hour, R.string.update_24hour, R.string.update_48hour)
|
||||||
entryValues = arrayOf("0", "1", "2", "3", "6", "12", "24", "48")
|
entryValues = listOf(0, 1, 2, 3, 6, 12, 24, 48)
|
||||||
defaultValue = "0"
|
defaultValue = 0
|
||||||
summary = "%s"
|
|
||||||
|
|
||||||
onChange { newValue ->
|
onChange { newValue ->
|
||||||
// Always cancel the previous task, it seems that sometimes they are not updated.
|
// Always cancel the previous task, it seems that sometimes they are not updated.
|
||||||
LibraryUpdateJob.cancelTask()
|
LibraryUpdateJob.cancelTask()
|
||||||
|
|
||||||
val interval = (newValue as String).toInt()
|
val interval = newValue as Int
|
||||||
if (interval > 0) {
|
if (interval > 0) {
|
||||||
LibraryUpdateJob.setupTask(interval)
|
LibraryUpdateJob.setupTask(interval)
|
||||||
}
|
}
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
multiSelectListPreference {
|
multiSelectListPreferenceMat {
|
||||||
key = Keys.libraryUpdateRestriction
|
key = Keys.libraryUpdateRestriction
|
||||||
titleRes = R.string.pref_library_update_restriction
|
titleRes = R.string.pref_library_update_restriction
|
||||||
entriesRes = arrayOf(R.string.wifi, R.string.charging)
|
entriesRes = arrayOf(R.string.wifi, R.string.charging)
|
||||||
entryValues = arrayOf("wifi", "ac")
|
entryValues = listOf("wifi", "ac")
|
||||||
summaryRes = R.string.pref_library_update_restriction_summary
|
customSummartRes = R.string.pref_library_update_restriction_summary
|
||||||
|
|
||||||
preferences.libraryUpdateInterval().asObservable()
|
preferences.libraryUpdateInterval().asObservable()
|
||||||
.subscribeUntilDestroy { isVisible = it > 0 }
|
.subscribeUntilDestroy { isVisible = it > 0 }
|
||||||
@ -99,11 +95,12 @@ class SettingsLibraryController : SettingsController() {
|
|||||||
|
|
||||||
val dbCategories = db.getCategories().executeAsBlocking()
|
val dbCategories = db.getCategories().executeAsBlocking()
|
||||||
|
|
||||||
multiSelectListPreference {
|
multiSelectListPreferenceMat {
|
||||||
key = Keys.libraryUpdateCategories
|
key = Keys.libraryUpdateCategories
|
||||||
titleRes = R.string.pref_library_update_categories
|
titleRes = R.string.pref_library_update_categories
|
||||||
entries = dbCategories.map { it.name }.toTypedArray()
|
entries = dbCategories.map { it.name }
|
||||||
entryValues = dbCategories.map { it.id.toString() }.toTypedArray()
|
entryValues = dbCategories.map { it.id.toString() }
|
||||||
|
allSelectionRes = R.string.all
|
||||||
|
|
||||||
preferences.libraryUpdateCategories().asObservable()
|
preferences.libraryUpdateCategories().asObservable()
|
||||||
.subscribeUntilDestroy {
|
.subscribeUntilDestroy {
|
||||||
@ -111,7 +108,7 @@ class SettingsLibraryController : SettingsController() {
|
|||||||
.mapNotNull { id -> dbCategories.find { it.id == id.toInt() } }
|
.mapNotNull { id -> dbCategories.find { it.id == id.toInt() } }
|
||||||
.sortedBy { it.order }
|
.sortedBy { it.order }
|
||||||
|
|
||||||
summary = if (selectedCategories.isEmpty())
|
customSummary = if (selectedCategories.isEmpty())
|
||||||
context.getString(R.string.all)
|
context.getString(R.string.all)
|
||||||
else
|
else
|
||||||
selectedCategories.joinToString { it.name }
|
selectedCategories.joinToString { it.name }
|
||||||
@ -127,11 +124,8 @@ class SettingsLibraryController : SettingsController() {
|
|||||||
R.string.action_sort_alpha,
|
R.string.action_sort_alpha,
|
||||||
R.string.action_sort_last_updated
|
R.string.action_sort_last_updated
|
||||||
)
|
)
|
||||||
entryValues = arrayOf(
|
entryRange = 0..1
|
||||||
"0",
|
defaultValue = 0
|
||||||
"1"
|
|
||||||
)
|
|
||||||
defaultValue = "0"
|
|
||||||
summaryRes = R.string.pref_library_update_prioritization_summary
|
summaryRes = R.string.pref_library_update_prioritization_summary
|
||||||
}
|
}
|
||||||
intListPreference {
|
intListPreference {
|
||||||
@ -139,16 +133,16 @@ class SettingsLibraryController : SettingsController() {
|
|||||||
titleRes = R.string.default_category
|
titleRes = R.string.default_category
|
||||||
|
|
||||||
val categories = listOf(Category.createDefault()) + dbCategories
|
val categories = listOf(Category.createDefault()) + dbCategories
|
||||||
entries = arrayOf(context.getString(R.string.default_category_summary)) +
|
entries = listOf(context.getString(R.string.default_category_summary)) +
|
||||||
categories.map { it.name }.toTypedArray()
|
categories.map { it.name }.toTypedArray()
|
||||||
entryValues = arrayOf("-1") + categories.map { it.id.toString() }.toTypedArray()
|
entryValues = listOf(-1) + categories.mapNotNull { it.id }.toList()
|
||||||
defaultValue = "-1"
|
defaultValue = "-1"
|
||||||
|
|
||||||
val selectedCategory = categories.find { it.id == preferences.defaultCategory() }
|
val selectedCategory = categories.find { it.id == preferences.defaultCategory() }
|
||||||
summary = selectedCategory?.name ?: context.getString(R.string.default_category_summary)
|
summary = selectedCategory?.name ?: context.getString(R.string.default_category_summary)
|
||||||
onChange { newValue ->
|
onChange { newValue ->
|
||||||
summary = categories.find {
|
summary = categories.find {
|
||||||
it.id == (newValue as String).toInt()
|
it.id == newValue as Int
|
||||||
}?.name ?: context.getString(R.string.default_category_summary)
|
}?.name ?: context.getString(R.string.default_category_summary)
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
@ -15,9 +15,8 @@ class SettingsReaderController : SettingsController() {
|
|||||||
titleRes = R.string.pref_viewer_type
|
titleRes = R.string.pref_viewer_type
|
||||||
entriesRes = arrayOf(R.string.left_to_right_viewer, R.string.right_to_left_viewer,
|
entriesRes = arrayOf(R.string.left_to_right_viewer, R.string.right_to_left_viewer,
|
||||||
R.string.vertical_viewer, R.string.webtoon_viewer)
|
R.string.vertical_viewer, R.string.webtoon_viewer)
|
||||||
entryValues = arrayOf("1", "2", "3", "4")
|
entryRange = 1..4
|
||||||
defaultValue = "1"
|
defaultValue = 1
|
||||||
summary = "%s"
|
|
||||||
}
|
}
|
||||||
intListPreference {
|
intListPreference {
|
||||||
key = Keys.imageScaleType
|
key = Keys.imageScaleType
|
||||||
@ -25,44 +24,41 @@ class SettingsReaderController : SettingsController() {
|
|||||||
entriesRes = arrayOf(R.string.scale_type_fit_screen, R.string.scale_type_stretch,
|
entriesRes = arrayOf(R.string.scale_type_fit_screen, R.string.scale_type_stretch,
|
||||||
R.string.scale_type_fit_width, R.string.scale_type_fit_height,
|
R.string.scale_type_fit_width, R.string.scale_type_fit_height,
|
||||||
R.string.scale_type_original_size, R.string.scale_type_smart_fit)
|
R.string.scale_type_original_size, R.string.scale_type_smart_fit)
|
||||||
entryValues = arrayOf("1", "2", "3", "4", "5", "6")
|
entryRange = 1..6
|
||||||
defaultValue = "1"
|
defaultValue = 1
|
||||||
summary = "%s"
|
|
||||||
}
|
}
|
||||||
intListPreference {
|
intListPreference {
|
||||||
key = Keys.zoomStart
|
key = Keys.zoomStart
|
||||||
titleRes = R.string.pref_zoom_start
|
titleRes = R.string.pref_zoom_start
|
||||||
entriesRes = arrayOf(R.string.zoom_start_automatic, R.string.zoom_start_left,
|
entriesRes = arrayOf(R.string.zoom_start_automatic, R.string.zoom_start_left,
|
||||||
R.string.zoom_start_right, R.string.zoom_start_center)
|
R.string.zoom_start_right, R.string.zoom_start_center)
|
||||||
entryValues = arrayOf("1", "2", "3", "4")
|
entryRange = 1..4
|
||||||
defaultValue = "1"
|
defaultValue = 1
|
||||||
summary = "%s"
|
|
||||||
}
|
}
|
||||||
intListPreference {
|
intListPreference {
|
||||||
key = Keys.rotation
|
key = Keys.rotation
|
||||||
titleRes = R.string.pref_rotation_type
|
titleRes = R.string.pref_rotation_type
|
||||||
entriesRes = arrayOf(R.string.rotation_free, R.string.rotation_lock,
|
entriesRes = arrayOf(R.string.rotation_free, R.string.rotation_lock,
|
||||||
R.string.rotation_force_portrait, R.string.rotation_force_landscape)
|
R.string.rotation_force_portrait, R.string.rotation_force_landscape)
|
||||||
entryValues = arrayOf("1", "2", "3", "4")
|
entryRange = 1..4
|
||||||
defaultValue = "1"
|
defaultValue = 1
|
||||||
summary = "%s"
|
|
||||||
}
|
}
|
||||||
intListPreference {
|
intListPreference {
|
||||||
key = Keys.readerTheme
|
key = Keys.readerTheme
|
||||||
titleRes = R.string.pref_reader_theme
|
titleRes = R.string.pref_reader_theme
|
||||||
entriesRes = arrayOf(R.string.white_background, R.string.black_background, R.string
|
entriesRes = arrayOf(R.string.white_background, R.string.black_background, R.string
|
||||||
.reader_theme_smart, R.string.reader_theme_smart_theme)
|
.reader_theme_smart, R.string.reader_theme_smart_theme)
|
||||||
entryValues = arrayOf("0", "1", "2", "3")
|
entryRange = 0..3
|
||||||
defaultValue = "0"
|
defaultValue = 2
|
||||||
summary = "%s"
|
|
||||||
}
|
}
|
||||||
intListPreference {
|
intListPreference {
|
||||||
key = Keys.doubleTapAnimationSpeed
|
key = Keys.doubleTapAnimationSpeed
|
||||||
titleRes = R.string.pref_double_tap_anim_speed
|
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_fast), context.getString(R.string.double_tap_anim_speed_normal))
|
entries = listOf(context.getString(R.string.double_tap_anim_speed_0), context.getString(R
|
||||||
entryValues = arrayOf("1", "250", "500") // using a value of 0 breaks the image viewer, so min is 1
|
.string.double_tap_anim_speed_fast), context.getString(R.string.double_tap_anim_speed_normal))
|
||||||
defaultValue = "500"
|
entryValues = listOf(1, 250, 500) // using a value of 0 breaks the image viewer, so
|
||||||
summary = "%s"
|
// min is 1
|
||||||
|
defaultValue = 500
|
||||||
}
|
}
|
||||||
switchPreference {
|
switchPreference {
|
||||||
key = Keys.skipRead
|
key = Keys.skipRead
|
||||||
|
@ -0,0 +1,60 @@
|
|||||||
|
package eu.kanade.tachiyomi.widget.preference
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import androidx.preference.Preference
|
||||||
|
import com.afollestad.materialdialogs.MaterialDialog
|
||||||
|
import com.afollestad.materialdialogs.list.listItemsSingleChoice
|
||||||
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
|
import eu.kanade.tachiyomi.data.preference.getOrDefault
|
||||||
|
import eu.kanade.tachiyomi.ui.setting.defaultValue
|
||||||
|
import uy.kohesive.injekt.Injekt
|
||||||
|
import uy.kohesive.injekt.api.get
|
||||||
|
|
||||||
|
class IntListMatPreference @JvmOverloads constructor(context: Context, attrs: AttributeSet? =
|
||||||
|
null) :
|
||||||
|
Preference(context, attrs) {
|
||||||
|
private val prefs: PreferencesHelper = Injekt.get()
|
||||||
|
|
||||||
|
var entryValues:List<Int> = emptyList()
|
||||||
|
var entryRange:IntRange
|
||||||
|
get() = 0..0
|
||||||
|
set(value) { entryValues = value.toList() }
|
||||||
|
var entriesRes:Array<Int>
|
||||||
|
get() = emptyArray()
|
||||||
|
set(value) { entries = value.map { context.getString(it) } }
|
||||||
|
private var defValue:Int = 0
|
||||||
|
var entries:List<String> = emptyList()
|
||||||
|
|
||||||
|
override fun onSetInitialValue(defaultValue: Any?) {
|
||||||
|
super.onSetInitialValue(defaultValue)
|
||||||
|
defValue = defaultValue as? Int ?: defValue
|
||||||
|
}
|
||||||
|
override fun getSummary(): CharSequence {
|
||||||
|
val index = entryValues.indexOf(prefs.getInt(key, defValue).getOrDefault())
|
||||||
|
return if (entries.isEmpty() || index == -1) ""
|
||||||
|
else entries[index]
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onClick() {
|
||||||
|
dialog().show()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun dialog(): MaterialDialog {
|
||||||
|
return MaterialDialog(context).apply {
|
||||||
|
title(text = title.toString())
|
||||||
|
negativeButton(android.R.string.cancel)
|
||||||
|
val default = entryValues.indexOf(prefs.getInt(key, defValue).getOrDefault())
|
||||||
|
listItemsSingleChoice(items = entries,
|
||||||
|
waitForPositiveButton = false,
|
||||||
|
initialSelection = default) {
|
||||||
|
_, pos, _ ->
|
||||||
|
val value = entryValues[pos]
|
||||||
|
prefs.getInt(key, defValue).set(value)
|
||||||
|
callChangeListener(value)
|
||||||
|
this@IntListMatPreference.summary = this@IntListMatPreference.summary
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,79 @@
|
|||||||
|
package eu.kanade.tachiyomi.widget.preference
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.SharedPreferences
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import androidx.preference.Preference
|
||||||
|
import androidx.preference.PreferenceManager
|
||||||
|
import com.afollestad.materialdialogs.MaterialDialog
|
||||||
|
import com.afollestad.materialdialogs.list.listItemsSingleChoice
|
||||||
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
|
import eu.kanade.tachiyomi.data.preference.getOrDefault
|
||||||
|
import eu.kanade.tachiyomi.ui.setting.defaultValue
|
||||||
|
import uy.kohesive.injekt.Injekt
|
||||||
|
import uy.kohesive.injekt.api.get
|
||||||
|
|
||||||
|
open class ListMatPreference @JvmOverloads constructor(context: Context, attrs: AttributeSet? =
|
||||||
|
null) :
|
||||||
|
Preference(context, attrs) {
|
||||||
|
protected val prefs: PreferencesHelper = Injekt.get()
|
||||||
|
|
||||||
|
var sharedPref:String? = null
|
||||||
|
var otherPref:Preference? = null
|
||||||
|
var entryValues:List<String> = emptyList()
|
||||||
|
var entriesRes:Array<Int>
|
||||||
|
get() = emptyArray()
|
||||||
|
set(value) { entries = value.map { context.getString(it) } }
|
||||||
|
protected var defValue:String = ""
|
||||||
|
var entries:List<String> = emptyList()
|
||||||
|
|
||||||
|
override fun onSetInitialValue(defaultValue: Any?) {
|
||||||
|
super.onSetInitialValue(defaultValue)
|
||||||
|
defValue = defaultValue as? String ?: defValue
|
||||||
|
}
|
||||||
|
override fun getSummary(): CharSequence {
|
||||||
|
val index = entryValues.indexOf(prefs.getStringPref(key, defValue).getOrDefault())
|
||||||
|
return if (entries.isEmpty() || index == -1) ""
|
||||||
|
else entries[index]
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onClick() {
|
||||||
|
dialog().show()
|
||||||
|
}
|
||||||
|
|
||||||
|
open fun dialog(): MaterialDialog {
|
||||||
|
return MaterialDialog(context).apply {
|
||||||
|
if (this@ListMatPreference.title != null)
|
||||||
|
title(text = this@ListMatPreference.title.toString())
|
||||||
|
negativeButton(android.R.string.cancel)
|
||||||
|
val default = entryValues.indexOf(if (sharedPref != null) {
|
||||||
|
val settings = context.getSharedPreferences(sharedPref, Context.MODE_PRIVATE)
|
||||||
|
settings.getString(key, "")
|
||||||
|
}
|
||||||
|
else prefs.getStringPref(key, defValue).getOrDefault())
|
||||||
|
listItemsSingleChoice(items = entries,
|
||||||
|
waitForPositiveButton = false,
|
||||||
|
initialSelection = default) { _, pos, _ ->
|
||||||
|
val value = entryValues[pos]
|
||||||
|
if (sharedPref != null) {
|
||||||
|
val oldDef = if (default > -1) entries[default] else ""
|
||||||
|
val settings = context.getSharedPreferences(sharedPref, Context.MODE_PRIVATE)
|
||||||
|
val edit = settings.edit()
|
||||||
|
edit.putString(key, value)
|
||||||
|
edit.apply()
|
||||||
|
otherPref?.callChangeListener(value)
|
||||||
|
if (oldDef == otherPref?.summary || otherPref?.summary.isNullOrEmpty()) otherPref?.summary =
|
||||||
|
entries[pos]
|
||||||
|
else otherPref?.summary = otherPref?.summary?.toString()?.replace(oldDef,
|
||||||
|
entries[pos]
|
||||||
|
) ?: entries[pos]
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
prefs.getStringPref(key, defValue).set(value)
|
||||||
|
this@ListMatPreference.summary = this@ListMatPreference.summary
|
||||||
|
}
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,59 @@
|
|||||||
|
package eu.kanade.tachiyomi.widget.preference
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import com.afollestad.materialdialogs.MaterialDialog
|
||||||
|
import com.afollestad.materialdialogs.list.checkItem
|
||||||
|
import com.afollestad.materialdialogs.list.isItemChecked
|
||||||
|
import com.afollestad.materialdialogs.list.listItemsMultiChoice
|
||||||
|
import com.afollestad.materialdialogs.list.uncheckItem
|
||||||
|
import eu.kanade.tachiyomi.data.preference.getOrDefault
|
||||||
|
|
||||||
|
class MultiListMatPreference @JvmOverloads constructor(context: Context, attrs: AttributeSet? =
|
||||||
|
null) :
|
||||||
|
ListMatPreference(context, attrs) {
|
||||||
|
|
||||||
|
var allSelectionRes:Int? = null
|
||||||
|
var customSummartRes:Int
|
||||||
|
get() = 0
|
||||||
|
set(value) { customSummary = context.getString(value) }
|
||||||
|
var customSummary:String? = null
|
||||||
|
var positions:IntArray? = null
|
||||||
|
|
||||||
|
override fun getSummary(): CharSequence {
|
||||||
|
return customSummary ?: super.getSummary()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun dialog():MaterialDialog {
|
||||||
|
return MaterialDialog(context).apply {
|
||||||
|
title(text = title.toString())
|
||||||
|
negativeButton(android.R.string.cancel)
|
||||||
|
positiveButton(android.R.string.ok) {
|
||||||
|
var value = positions?.map {
|
||||||
|
entryValues[it - if (allSelectionRes != null) 1 else 0] }?.toSet() ?: emptySet()
|
||||||
|
if (allSelectionRes != null && isItemChecked(0)) value = emptySet()
|
||||||
|
prefs.getStringSet(key, emptySet()).set(value)
|
||||||
|
callChangeListener(value)
|
||||||
|
this@MultiListMatPreference.summary = this@MultiListMatPreference.summary
|
||||||
|
}
|
||||||
|
val set = prefs.getStringSet(key, emptySet()).getOrDefault()
|
||||||
|
var default = set.map {
|
||||||
|
entryValues.indexOf(it) + if (allSelectionRes != null) 1 else 0 }
|
||||||
|
.toIntArray()
|
||||||
|
if (allSelectionRes != null && default.isEmpty()) default = intArrayOf(0)
|
||||||
|
val items = if (allSelectionRes != null)
|
||||||
|
(listOf(context.getString(allSelectionRes!!)) + entries) else entries
|
||||||
|
listItemsMultiChoice(items = items,
|
||||||
|
allowEmptySelection = true,
|
||||||
|
disabledIndices = if (allSelectionRes != null) intArrayOf(0) else null,
|
||||||
|
waitForPositiveButton = false,
|
||||||
|
initialSelection = default) { _, pos, _ ->
|
||||||
|
positions = pos
|
||||||
|
if (allSelectionRes != null) {
|
||||||
|
if (pos.isEmpty()) checkItem(0)
|
||||||
|
else uncheckItem(0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -3,5 +3,6 @@
|
|||||||
<style name="Theme.Tachiyomi" parent="Theme.Base">
|
<style name="Theme.Tachiyomi" parent="Theme.Base">
|
||||||
<item name="android:statusBarColor">@android:color/transparent</item>
|
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||||
<item name="android:navigationBarColor">@android:color/transparent</item>
|
<item name="android:navigationBarColor">@android:color/transparent</item>
|
||||||
|
<item name="md_button_casing">literal</item>
|
||||||
</style>
|
</style>
|
||||||
</resources>
|
</resources>
|
@ -5,5 +5,6 @@
|
|||||||
<style name="Theme.Tachiyomi" parent="Theme.Base">
|
<style name="Theme.Tachiyomi" parent="Theme.Base">
|
||||||
<item name="android:statusBarColor">@android:color/transparent</item>
|
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||||
<item name="android:navigationBarColor">@android:color/transparent</item>
|
<item name="android:navigationBarColor">@android:color/transparent</item>
|
||||||
|
<item name="md_button_casing">literal</item>
|
||||||
</style>
|
</style>
|
||||||
</resources>
|
</resources>
|
Loading…
x
Reference in New Issue
Block a user