import/export settings

This commit is contained in:
rebelonion 2024-02-02 02:04:46 -06:00
parent b559a13bab
commit 49e90a27b8
97 changed files with 1721 additions and 1441 deletions

View file

@ -1,23 +1,27 @@
package ani.dantotsu.settings
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager
import java.io.Serializable
data class CurrentNovelReaderSettings(
var currentThemeName: String = "Default",
var layout: Layouts = Layouts.PAGED,
var dualPageMode: CurrentReaderSettings.DualPageModes = CurrentReaderSettings.DualPageModes.Automatic,
var lineHeight: Float = 1.4f,
var margin: Float = 0.06f,
var justify: Boolean = true,
var hyphenation: Boolean = true,
var useDarkTheme: Boolean = false,
var useOledTheme: Boolean = false,
var invert: Boolean = false,
var maxInlineSize: Int = 720,
var maxBlockSize: Int = 1440,
var horizontalScrollBar: Boolean = true,
var keepScreenOn: Boolean = false,
var volumeButtons: Boolean = false,
var currentThemeName: String = PrefManager.getVal(PrefName.CurrentThemeName),
var layout: Layouts = Layouts[PrefManager.getVal(PrefName.LayoutNovel)]
?: Layouts.PAGED,
var dualPageMode: CurrentReaderSettings.DualPageModes = CurrentReaderSettings.DualPageModes[PrefManager.getVal(PrefName.DualPageModeNovel)]
?: CurrentReaderSettings.DualPageModes.Automatic,
var lineHeight: Float = PrefManager.getVal(PrefName.LineHeight),
var margin: Float = PrefManager.getVal(PrefName.Margin),
var justify: Boolean = PrefManager.getVal(PrefName.Justify),
var hyphenation: Boolean = PrefManager.getVal(PrefName.Hyphenation),
var useDarkTheme: Boolean = PrefManager.getVal(PrefName.UseDarkThemeNovel),
var useOledTheme: Boolean = PrefManager.getVal(PrefName.UseOledThemeNovel),
var invert: Boolean = PrefManager.getVal(PrefName.Invert),
var maxInlineSize: Int = PrefManager.getVal(PrefName.MaxInlineSize),
var maxBlockSize: Int = PrefManager.getVal(PrefName.MaxBlockSize),
var horizontalScrollBar: Boolean = PrefManager.getVal(PrefName.HorizontalScrollBarNovel),
var keepScreenOn: Boolean = PrefManager.getVal(PrefName.KeepScreenOnNovel),
var volumeButtons: Boolean = PrefManager.getVal(PrefName.VolumeButtonsNovel)
) : Serializable {
enum class Layouts(val string: String) {

View file

@ -1,23 +1,28 @@
package ani.dantotsu.settings
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager
import java.io.Serializable
data class CurrentReaderSettings(
var direction: Directions = Directions.TOP_TO_BOTTOM,
var layout: Layouts = Layouts.CONTINUOUS,
var dualPageMode: DualPageModes = DualPageModes.Automatic,
var overScrollMode: Boolean = true,
var trueColors: Boolean = false,
var rotation: Boolean = true,
var padding: Boolean = true,
var hidePageNumbers: Boolean = false,
var horizontalScrollBar: Boolean = true,
var keepScreenOn: Boolean = false,
var volumeButtons: Boolean = false,
var wrapImages: Boolean = false,
var longClickImage: Boolean = true,
var cropBorders: Boolean = false,
var cropBorderThreshold: Int = 10,
var direction: Directions = Directions[PrefManager.getVal(PrefName.Direction)]
?: Directions.TOP_TO_BOTTOM,
var layout: Layouts = Layouts[PrefManager.getVal(PrefName.LayoutReader)]
?: Layouts.CONTINUOUS,
var dualPageMode: DualPageModes = DualPageModes[PrefManager.getVal(PrefName.DualPageModeReader)]
?: DualPageModes.Automatic,
var overScrollMode: Boolean = PrefManager.getVal(PrefName.OverScrollMode),
var trueColors: Boolean = PrefManager.getVal(PrefName.TrueColors),
var rotation: Boolean = PrefManager.getVal(PrefName.Rotation),
var padding: Boolean = PrefManager.getVal(PrefName.Padding),
var hidePageNumbers: Boolean = PrefManager.getVal(PrefName.HidePageNumbers),
var horizontalScrollBar: Boolean = PrefManager.getVal(PrefName.HorizontalScrollBar),
var keepScreenOn: Boolean = PrefManager.getVal(PrefName.KeepScreenOn),
var volumeButtons: Boolean = PrefManager.getVal(PrefName.VolumeButtonsReader),
var wrapImages: Boolean = PrefManager.getVal(PrefName.WrapImages),
var longClickImage: Boolean = PrefManager.getVal(PrefName.LongClickImage),
var cropBorders: Boolean = PrefManager.getVal(PrefName.CropBorders),
var cropBorderThreshold: Int = PrefManager.getVal(PrefName.CropBorderThreshold)
) : Serializable {
enum class Directions {

View file

@ -4,15 +4,12 @@ import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import ani.dantotsu.databinding.ItemDeveloperBinding
import ani.dantotsu.loadData
import ani.dantotsu.loadImage
import ani.dantotsu.openLinkInBrowser
import ani.dantotsu.setAnimation
class DevelopersAdapter(private val developers: Array<Developer>) :
RecyclerView.Adapter<DevelopersAdapter.DeveloperViewHolder>() {
private val uiSettings =
loadData<UserInterfaceSettings>("ui_settings") ?: UserInterfaceSettings()
inner class DeveloperViewHolder(val binding: ItemDeveloperBinding) :
RecyclerView.ViewHolder(binding.root) {
@ -35,7 +32,7 @@ class DevelopersAdapter(private val developers: Array<Developer>) :
override fun onBindViewHolder(holder: DeveloperViewHolder, position: Int) {
val b = holder.binding
setAnimation(b.root.context, b.root, uiSettings)
setAnimation(b.root.context, b.root)
val dev = developers[position]
b.devName.text = dev.name
b.devProfile.loadImage(dev.pfp)

View file

@ -18,7 +18,7 @@ import ani.dantotsu.*
import ani.dantotsu.databinding.ActivityExtensionsBinding
import ani.dantotsu.others.LanguageMapper
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefWrapper
import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.themes.ThemeManager
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator
@ -118,11 +118,11 @@ class ExtensionsActivity : AppCompatActivity() {
binding.languageselect.setOnClickListener {
val languageOptions = LanguageMapper.Companion.Language.entries.map{ it.name }.toTypedArray()
val builder = AlertDialog.Builder(currContext(), R.style.MyPopup)
val listOrder = PrefWrapper.getVal(PrefName.LangSort,"all")
val listOrder: String = PrefManager.getVal(PrefName.LangSort)
val index = LanguageMapper.Companion.Language.entries.toTypedArray().indexOfFirst{it.code == listOrder}
builder.setTitle("Language")
builder.setSingleChoiceItems(languageOptions, index){ dialog, i ->
PrefWrapper.setVal(PrefName.LangSort, LanguageMapper.Companion.Language.entries[i].code)
PrefManager.setVal(PrefName.LangSort, LanguageMapper.Companion.Language.entries[i].code)
dialog.dismiss()
}
val dialog = builder.show()

View file

@ -6,7 +6,6 @@ import android.widget.TextView
import androidx.fragment.app.FragmentManager
import androidx.recyclerview.widget.RecyclerView
import ani.dantotsu.databinding.ItemQuestionBinding
import ani.dantotsu.loadData
import ani.dantotsu.others.CustomBottomDialog
import ani.dantotsu.setAnimation
import io.noties.markwon.Markwon
@ -17,8 +16,6 @@ class FAQAdapter(
private val manager: FragmentManager
) :
RecyclerView.Adapter<FAQAdapter.FAQViewHolder>() {
private val uiSettings =
loadData<UserInterfaceSettings>("ui_settings") ?: UserInterfaceSettings()
inner class FAQViewHolder(val binding: ItemQuestionBinding) :
RecyclerView.ViewHolder(binding.root)
@ -35,7 +32,7 @@ class FAQAdapter(
override fun onBindViewHolder(holder: FAQViewHolder, position: Int) {
val b = holder.binding.root
setAnimation(b.context, b, uiSettings)
setAnimation(b.context, b)
val faq = questions[position]
b.text = faq.second
b.setCompoundDrawablesWithIntrinsicBounds(faq.first, 0, 0, 0)

View file

@ -23,11 +23,10 @@ import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.widget.ViewPager2
import ani.dantotsu.R
import ani.dantotsu.databinding.FragmentAnimeExtensionsBinding
import ani.dantotsu.loadData
import ani.dantotsu.others.LanguageMapper
import ani.dantotsu.settings.extensionprefs.AnimeSourcePreferencesFragment
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefWrapper
import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.snackString
import com.google.android.material.tabs.TabLayout
import com.google.android.material.textfield.TextInputLayout
@ -48,7 +47,7 @@ class InstalledAnimeExtensionsFragment : Fragment(), SearchQueryHandler {
private var _binding: FragmentAnimeExtensionsBinding? = null
private val binding get() = _binding!!
private lateinit var extensionsRecyclerView: RecyclerView
private val skipIcons = PrefWrapper.getVal(PrefName.SkipExtensionIcons, false)
private val skipIcons: Boolean = PrefManager.getVal(PrefName.SkipExtensionIcons)
private val animeExtensionManager: AnimeExtensionManager = Injekt.get()
private val extensionsAdapter = AnimeExtensionsAdapter(
{ pkg ->

View file

@ -24,11 +24,10 @@ import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.widget.ViewPager2
import ani.dantotsu.R
import ani.dantotsu.databinding.FragmentMangaExtensionsBinding
import ani.dantotsu.loadData
import ani.dantotsu.others.LanguageMapper
import ani.dantotsu.settings.extensionprefs.MangaSourcePreferencesFragment
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefWrapper
import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.snackString
import com.google.android.material.tabs.TabLayout
import com.google.android.material.textfield.TextInputLayout
@ -47,7 +46,7 @@ class InstalledMangaExtensionsFragment : Fragment(), SearchQueryHandler {
private var _binding: FragmentMangaExtensionsBinding? = null
private val binding get() = _binding!!
private lateinit var extensionsRecyclerView: RecyclerView
private val skipIcons = PrefWrapper.getVal(PrefName.SkipExtensionIcons, false)
private val skipIcons: Boolean = PrefManager.getVal(PrefName.SkipExtensionIcons)
private val mangaExtensionManager: MangaExtensionManager = Injekt.get()
private val extensionsAdapter = MangaExtensionsAdapter(
{ pkg ->

View file

@ -20,12 +20,11 @@ import androidx.recyclerview.widget.RecyclerView
import ani.dantotsu.R
import ani.dantotsu.currContext
import ani.dantotsu.databinding.FragmentNovelExtensionsBinding
import ani.dantotsu.loadData
import ani.dantotsu.others.LanguageMapper
import ani.dantotsu.parsers.novel.NovelExtension
import ani.dantotsu.parsers.novel.NovelExtensionManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefWrapper
import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.snackString
import com.google.firebase.crashlytics.FirebaseCrashlytics
import eu.kanade.tachiyomi.data.notification.Notifications
@ -39,7 +38,7 @@ class InstalledNovelExtensionsFragment : Fragment(), SearchQueryHandler {
private var _binding: FragmentNovelExtensionsBinding? = null
private val binding get() = _binding!!
private lateinit var extensionsRecyclerView: RecyclerView
val skipIcons = PrefWrapper.getVal(PrefName.SkipExtensionIcons, false)
private val skipIcons: Boolean = PrefManager.getVal(PrefName.SkipExtensionIcons)
private val novelExtensionManager: NovelExtensionManager = Injekt.get()
private val extensionsAdapter = NovelExtensionsAdapter(
{ pkg ->

View file

@ -1,48 +0,0 @@
package ani.dantotsu.settings
import java.io.Serializable
data class PlayerSettings(
var defaultSpeed: Int = 5,
var cursedSpeeds: Boolean = false,
var resize: Int = 0,
//Subtitles
var subtitles: Boolean = true,
var primaryColor: Int = 4,
var secondaryColor: Int = 0,
var outline: Int = 0,
var subBackground: Int = 0,
var subWindow: Int = 0,
var font: Int = 0,
var fontSize: Int = 20,
var locale: Int = 2,
//TimeStamps
var timeStampsEnabled: Boolean = true,
var useProxyForTimeStamps: Boolean = false,
var showTimeStampButton: Boolean = true,
//Auto
var autoSkipOPED: Boolean = false,
var autoPlay: Boolean = true,
var autoSkipFiller: Boolean = false,
//Update Progress
var askIndividual: Boolean = true,
var updateForH: Boolean = false,
var watchPercentage: Float = 0.8f,
//Behaviour
var alwaysContinue: Boolean = true,
var focusPause: Boolean = true,
var gestures: Boolean = true,
var doubleTap: Boolean = true,
var fastforward: Boolean = true,
var seekTime: Int = 10,
var skipTime: Int = 85,
//Other
var cast: Boolean = true,
var pip: Boolean = true
) : Serializable

View file

@ -14,12 +14,12 @@ import androidx.core.widget.addTextChangedListener
import ani.dantotsu.R
import ani.dantotsu.databinding.ActivityPlayerSettingsBinding
import ani.dantotsu.initActivity
import ani.dantotsu.loadData
import ani.dantotsu.media.Media
import ani.dantotsu.navBarHeight
import ani.dantotsu.others.getSerialized
import ani.dantotsu.parsers.Subtitle
import ani.dantotsu.saveData
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.snackString
import ani.dantotsu.statusBarHeight
import ani.dantotsu.themes.ThemeManager
@ -61,12 +61,6 @@ class PlayerSettingsActivity : AppCompatActivity() {
bottomMargin = navBarHeight
}
val settings = loadData<PlayerSettings>(player, toast = false) ?: PlayerSettings().apply {
saveData(
player,
this
)
}
binding.playerSettingsBack.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
@ -91,128 +85,113 @@ class PlayerSettingsActivity : AppCompatActivity() {
2f
)
val cursedSpeeds = arrayOf(1f, 1.25f, 1.5f, 1.75f, 2f, 2.5f, 3f, 4f, 5f, 10f, 25f, 50f)
var curSpeedArr = if (settings.cursedSpeeds) cursedSpeeds else speeds
//var curSpeedArr = if (settings.cursedSpeeds) cursedSpeeds else speeds
var curSpeedArr = if (PrefManager.getVal(PrefName.CursedSpeeds)) cursedSpeeds else speeds
var speedsName = curSpeedArr.map { "${it}x" }.toTypedArray()
binding.playerSettingsSpeed.text =
getString(R.string.default_playback_speed, speedsName[settings.defaultSpeed])
getString(R.string.default_playback_speed, speedsName[PrefManager.getVal(PrefName.DefaultSpeed)])
val speedDialog = AlertDialog.Builder(this, R.style.MyPopup)
.setTitle(getString(R.string.default_speed))
binding.playerSettingsSpeed.setOnClickListener {
val dialog =
speedDialog.setSingleChoiceItems(speedsName, settings.defaultSpeed) { dialog, i ->
settings.defaultSpeed = i
speedDialog.setSingleChoiceItems(speedsName, PrefManager.getVal(PrefName.DefaultSpeed)) { dialog, i ->
PrefManager.setVal(PrefName.DefaultSpeed, i)
binding.playerSettingsSpeed.text =
getString(R.string.default_playback_speed, speedsName[i])
saveData(player, settings)
dialog.dismiss()
}.show()
dialog.window?.setDimAmount(0.8f)
}
binding.playerSettingsCursedSpeeds.isChecked = settings.cursedSpeeds
binding.playerSettingsCursedSpeeds.isChecked = PrefManager.getVal(PrefName.CursedSpeeds)
binding.playerSettingsCursedSpeeds.setOnCheckedChangeListener { _, isChecked ->
settings.cursedSpeeds = isChecked
curSpeedArr = if (settings.cursedSpeeds) cursedSpeeds else speeds
settings.defaultSpeed = if (settings.cursedSpeeds) 0 else 5
PrefManager.setVal(PrefName.CursedSpeeds, isChecked)
curSpeedArr = if (isChecked) cursedSpeeds else speeds
val newDefaultSpeed = if (isChecked) 0 else 5
PrefManager.setVal(PrefName.DefaultSpeed, newDefaultSpeed)
speedsName = curSpeedArr.map { "${it}x" }.toTypedArray()
binding.playerSettingsSpeed.text =
getString(R.string.default_playback_speed, speedsName[settings.defaultSpeed])
saveData(player, settings)
getString(R.string.default_playback_speed, speedsName[PrefManager.getVal(PrefName.DefaultSpeed)])
}
//Time Stamp
binding.playerSettingsTimeStamps.isChecked = settings.timeStampsEnabled
// Time Stamp
binding.playerSettingsTimeStamps.isChecked = PrefManager.getVal(PrefName.TimeStampsEnabled)
binding.playerSettingsTimeStamps.setOnCheckedChangeListener { _, isChecked ->
settings.timeStampsEnabled = isChecked
saveData(player, settings)
PrefManager.setVal(PrefName.TimeStampsEnabled, isChecked)
}
binding.playerSettingsTimeStampsProxy.isChecked = settings.useProxyForTimeStamps
binding.playerSettingsTimeStampsProxy.isChecked = PrefManager.getVal(PrefName.UseProxyForTimeStamps)
binding.playerSettingsTimeStampsProxy.setOnCheckedChangeListener { _, isChecked ->
settings.useProxyForTimeStamps = isChecked
saveData(player, settings)
PrefManager.setVal(PrefName.UseProxyForTimeStamps, isChecked)
}
binding.playerSettingsShowTimeStamp.isChecked = settings.showTimeStampButton
binding.playerSettingsShowTimeStamp.isChecked = PrefManager.getVal(PrefName.ShowTimeStampButton)
binding.playerSettingsShowTimeStamp.setOnCheckedChangeListener { _, isChecked ->
settings.showTimeStampButton = isChecked
saveData(player, settings)
PrefManager.setVal(PrefName.ShowTimeStampButton, isChecked)
}
//Auto
binding.playerSettingsAutoSkipOpEd.isChecked = settings.autoSkipOPED
// Auto
binding.playerSettingsAutoSkipOpEd.isChecked = PrefManager.getVal(PrefName.AutoSkipOPED)
binding.playerSettingsAutoSkipOpEd.setOnCheckedChangeListener { _, isChecked ->
settings.autoSkipOPED = isChecked
saveData(player, settings)
PrefManager.setVal(PrefName.AutoSkipOPED, isChecked)
}
binding.playerSettingsAutoPlay.isChecked = settings.autoPlay
binding.playerSettingsAutoPlay.isChecked = PrefManager.getVal(PrefName.AutoPlay)
binding.playerSettingsAutoPlay.setOnCheckedChangeListener { _, isChecked ->
settings.autoPlay = isChecked
saveData(player, settings)
PrefManager.setVal(PrefName.AutoPlay, isChecked)
}
binding.playerSettingsAutoSkip.isChecked = settings.autoSkipFiller
binding.playerSettingsAutoSkip.isChecked = PrefManager.getVal(PrefName.AutoSkipFiller)
binding.playerSettingsAutoSkip.setOnCheckedChangeListener { _, isChecked ->
settings.autoSkipFiller = isChecked
saveData(player, settings)
PrefManager.setVal(PrefName.AutoSkipFiller, isChecked)
}
//Update Progress
binding.playerSettingsAskUpdateProgress.isChecked = settings.askIndividual
binding.playerSettingsAskUpdateProgress.isChecked = PrefManager.getVal(PrefName.AskIndividualPlayer)
binding.playerSettingsAskUpdateProgress.setOnCheckedChangeListener { _, isChecked ->
settings.askIndividual = isChecked
saveData(player, settings)
PrefManager.setVal(PrefName.AskIndividualPlayer, isChecked)
}
binding.playerSettingsAskUpdateHentai.isChecked = settings.updateForH
binding.playerSettingsAskUpdateHentai.isChecked = PrefManager.getVal(PrefName.UpdateForHPlayer)
binding.playerSettingsAskUpdateHentai.setOnCheckedChangeListener { _, isChecked ->
settings.updateForH = isChecked
PrefManager.setVal(PrefName.UpdateForHPlayer, isChecked)
if (isChecked) snackString(getString(R.string.very_bold))
saveData(player, settings)
}
binding.playerSettingsCompletePercentage.value =
(settings.watchPercentage * 100).roundToInt().toFloat()
binding.playerSettingsCompletePercentage.value = (PrefManager.getVal<Float>(PrefName.WatchPercentage) * 100).roundToInt().toFloat()
binding.playerSettingsCompletePercentage.addOnChangeListener { _, value, _ ->
settings.watchPercentage = value / 100
saveData(player, settings)
PrefManager.setVal(PrefName.WatchPercentage, value / 100)
}
//Behaviour
binding.playerSettingsAlwaysContinue.isChecked = settings.alwaysContinue
binding.playerSettingsAlwaysContinue.isChecked = PrefManager.getVal(PrefName.AlwaysContinue)
binding.playerSettingsAlwaysContinue.setOnCheckedChangeListener { _, isChecked ->
settings.alwaysContinue = isChecked
saveData(player, settings)
PrefManager.setVal(PrefName.AlwaysContinue, isChecked)
}
binding.playerSettingsPauseVideo.isChecked = settings.focusPause
binding.playerSettingsPauseVideo.isChecked = PrefManager.getVal(PrefName.FocusPause)
binding.playerSettingsPauseVideo.setOnCheckedChangeListener { _, isChecked ->
settings.focusPause = isChecked
saveData(player, settings)
PrefManager.setVal(PrefName.FocusPause, isChecked)
}
binding.playerSettingsVerticalGestures.isChecked = settings.gestures
binding.playerSettingsVerticalGestures.isChecked = PrefManager.getVal(PrefName.Gestures)
binding.playerSettingsVerticalGestures.setOnCheckedChangeListener { _, isChecked ->
settings.gestures = isChecked
saveData(player, settings)
PrefManager.setVal(PrefName.Gestures, isChecked)
}
binding.playerSettingsDoubleTap.isChecked = settings.doubleTap
binding.playerSettingsDoubleTap.isChecked = PrefManager.getVal(PrefName.DoubleTap)
binding.playerSettingsDoubleTap.setOnCheckedChangeListener { _, isChecked ->
settings.doubleTap = isChecked
saveData(player, settings)
PrefManager.setVal(PrefName.DoubleTap, isChecked)
}
binding.playerSettingsFastForward.isChecked = settings.fastforward
binding.playerSettingsFastForward.isChecked = PrefManager.getVal(PrefName.FastForward)
binding.playerSettingsFastForward.setOnCheckedChangeListener { _, isChecked ->
settings.fastforward = isChecked
saveData(player, settings)
PrefManager.setVal(PrefName.FastForward, isChecked)
}
binding.playerSettingsSeekTime.value = settings.seekTime.toFloat()
binding.playerSettingsSeekTime.value = PrefManager.getVal<Int>(PrefName.SeekTime).toFloat()
binding.playerSettingsSeekTime.addOnChangeListener { _, value, _ ->
settings.seekTime = value.toInt()
saveData(player, settings)
PrefManager.setVal(PrefName.SeekTime, value.toInt())
}
binding.exoSkipTime.setText(settings.skipTime.toString())
binding.exoSkipTime.setText(PrefManager.getVal<Int>(PrefName.SkipTime).toString())
binding.exoSkipTime.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) {
binding.exoSkipTime.clearFocus()
@ -222,8 +201,7 @@ class PlayerSettingsActivity : AppCompatActivity() {
binding.exoSkipTime.addTextChangedListener {
val time = binding.exoSkipTime.text.toString().toIntOrNull()
if (time != null) {
settings.skipTime = time
saveData(player, settings)
PrefManager.setVal(PrefName.SkipTime, time)
}
}
@ -231,32 +209,29 @@ class PlayerSettingsActivity : AppCompatActivity() {
binding.playerSettingsPiP.apply {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
visibility = View.VISIBLE
isChecked = settings.pip
isChecked = PrefManager.getVal(PrefName.Pip)
setOnCheckedChangeListener { _, isChecked ->
settings.pip = isChecked
saveData(player, settings)
PrefManager.setVal(PrefName.Pip, isChecked)
}
} else visibility = View.GONE
}
binding.playerSettingsCast.isChecked = settings.cast
binding.playerSettingsCast.isChecked = PrefManager.getVal(PrefName.Cast)
binding.playerSettingsCast.setOnCheckedChangeListener { _, isChecked ->
settings.cast = isChecked
saveData(player, settings)
PrefManager.setVal(PrefName.Cast, isChecked)
}
val resizeModes = arrayOf("Original", "Zoom", "Stretch")
val resizeDialog = AlertDialog.Builder(this, R.style.MyPopup)
.setTitle(getString(R.string.default_resize_mode))
binding.playerResizeMode.setOnClickListener {
val dialog =
resizeDialog.setSingleChoiceItems(resizeModes, settings.resize) { dialog, count ->
settings.resize = count
saveData(player, settings)
dialog.dismiss()
}.show()
val dialog = resizeDialog.setSingleChoiceItems(resizeModes, PrefManager.getVal<Int>(PrefName.Resize)) { dialog, count ->
PrefManager.setVal(PrefName.Resize, count)
dialog.dismiss()
}.show()
dialog.window?.setDimAmount(0.8f)
}
fun restartApp() {
Snackbar.make(
binding.root,
@ -311,10 +286,9 @@ class PlayerSettingsActivity : AppCompatActivity() {
false -> 0.5f
}
}
binding.subSwitch.isChecked = settings.subtitles
binding.subSwitch.isChecked = PrefManager.getVal(PrefName.Subtitles)
binding.subSwitch.setOnCheckedChangeListener { _, isChecked ->
settings.subtitles = isChecked
saveData(player, settings)
PrefManager.setVal(PrefName.Subtitles, isChecked)
toggleSubOptions(isChecked)
restartApp()
}
@ -337,10 +311,9 @@ class PlayerSettingsActivity : AppCompatActivity() {
binding.videoSubColorPrimary.setOnClickListener {
val dialog = primaryColorDialog.setSingleChoiceItems(
colorsPrimary,
settings.primaryColor
PrefManager.getVal(PrefName.PrimaryColor)
) { dialog, count ->
settings.primaryColor = count
saveData(player, settings)
PrefManager.setVal(PrefName.PrimaryColor, count)
dialog.dismiss()
}.show()
dialog.window?.setDimAmount(0.8f)
@ -364,10 +337,9 @@ class PlayerSettingsActivity : AppCompatActivity() {
binding.videoSubColorSecondary.setOnClickListener {
val dialog = secondaryColorDialog.setSingleChoiceItems(
colorsSecondary,
settings.secondaryColor
PrefManager.getVal(PrefName.SecondaryColor)
) { dialog, count ->
settings.secondaryColor = count
saveData(player, settings)
PrefManager.setVal(PrefName.SecondaryColor, count)
dialog.dismiss()
}.show()
dialog.window?.setDimAmount(0.8f)
@ -378,10 +350,9 @@ class PlayerSettingsActivity : AppCompatActivity() {
binding.videoSubOutline.setOnClickListener {
val dialog = outlineDialog.setSingleChoiceItems(
typesOutline,
settings.outline
PrefManager.getVal(PrefName.Outline)
) { dialog, count ->
settings.outline = count
saveData(player, settings)
PrefManager.setVal(PrefName.Outline, count)
dialog.dismiss()
}.show()
dialog.window?.setDimAmount(0.8f)
@ -405,10 +376,9 @@ class PlayerSettingsActivity : AppCompatActivity() {
binding.videoSubColorBackground.setOnClickListener {
val dialog = subBackgroundDialog.setSingleChoiceItems(
colorsSubBackground,
settings.subBackground
PrefManager.getVal(PrefName.SubBackground)
) { dialog, count ->
settings.subBackground = count
saveData(player, settings)
PrefManager.setVal(PrefName.SubBackground, count)
dialog.dismiss()
}.show()
dialog.window?.setDimAmount(0.8f)
@ -433,10 +403,9 @@ class PlayerSettingsActivity : AppCompatActivity() {
binding.videoSubColorWindow.setOnClickListener {
val dialog = subWindowDialog.setSingleChoiceItems(
colorsSubWindow,
settings.subWindow
PrefManager.getVal(PrefName.SubWindow)
) { dialog, count ->
settings.subWindow = count
saveData(player, settings)
PrefManager.setVal(PrefName.SubWindow, count)
dialog.dismiss()
}.show()
dialog.window?.setDimAmount(0.8f)
@ -452,14 +421,13 @@ class PlayerSettingsActivity : AppCompatActivity() {
val fontDialog = AlertDialog.Builder(this, R.style.MyPopup)
.setTitle(getString(R.string.subtitle_font))
binding.videoSubFont.setOnClickListener {
val dialog = fontDialog.setSingleChoiceItems(fonts, settings.font) { dialog, count ->
settings.font = count
saveData(player, settings)
val dialog = fontDialog.setSingleChoiceItems(fonts, PrefManager.getVal(PrefName.Font)) { dialog, count ->
PrefManager.setVal(PrefName.Font, count)
dialog.dismiss()
}.show()
dialog.window?.setDimAmount(0.8f)
}
binding.subtitleFontSize.setText(settings.fontSize.toString())
binding.subtitleFontSize.setText(PrefManager.getVal<Int>(PrefName.FontSize).toString())
binding.subtitleFontSize.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE) {
binding.subtitleFontSize.clearFocus()
@ -469,10 +437,9 @@ class PlayerSettingsActivity : AppCompatActivity() {
binding.subtitleFontSize.addTextChangedListener {
val size = binding.subtitleFontSize.text.toString().toIntOrNull()
if (size != null) {
settings.fontSize = size
saveData(player, settings)
PrefManager.setVal(PrefName.FontSize, size)
}
}
toggleSubOptions(settings.subtitles)
toggleSubOptions(PrefManager.getVal(PrefName.Subtitles))
}
}

View file

@ -1,15 +0,0 @@
package ani.dantotsu.settings
import java.io.Serializable
data class ReaderSettings(
var showSource: Boolean = true,
var showSystemBars: Boolean = false,
var autoDetectWebtoon: Boolean = true,
var default: CurrentReaderSettings = CurrentReaderSettings(),
var defaultLN: CurrentNovelReaderSettings = CurrentNovelReaderSettings(),
var askIndividual: Boolean = true,
var updateForH: Boolean = false
) : Serializable

View file

@ -7,16 +7,17 @@ import androidx.core.view.updateLayoutParams
import ani.dantotsu.R
import ani.dantotsu.databinding.ActivityReaderSettingsBinding
import ani.dantotsu.initActivity
import ani.dantotsu.loadData
import ani.dantotsu.navBarHeight
import ani.dantotsu.saveData
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.snackString
import ani.dantotsu.statusBarHeight
import ani.dantotsu.themes.ThemeManager
class ReaderSettingsActivity : AppCompatActivity() {
lateinit var binding: ActivityReaderSettingsBinding
private val reader = "reader_settings"
private var defaultSettings = CurrentReaderSettings()
private var defaultSettingsLN = CurrentNovelReaderSettings()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@ -30,34 +31,24 @@ class ReaderSettingsActivity : AppCompatActivity() {
bottomMargin = navBarHeight
}
val settings = loadData<ReaderSettings>(reader, toast = false) ?: ReaderSettings().apply {
saveData(
reader,
this
)
}
binding.readerSettingsBack.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
//Manga Settings
binding.readerSettingsSourceName.isChecked = settings.showSource
binding.readerSettingsSourceName.isChecked = PrefManager.getVal(PrefName.ShowSource)
binding.readerSettingsSourceName.setOnCheckedChangeListener { _, isChecked ->
settings.showSource = isChecked
saveData(reader, settings)
PrefManager.setVal(PrefName.ShowSource, isChecked)
}
binding.readerSettingsSystemBars.isChecked = settings.showSystemBars
binding.readerSettingsSystemBars.isChecked = PrefManager.getVal(PrefName.ShowSystemBars)
binding.readerSettingsSystemBars.setOnCheckedChangeListener { _, isChecked ->
settings.showSystemBars = isChecked
saveData(reader, settings)
PrefManager.setVal(PrefName.ShowSystemBars, isChecked)
}
//Default Manga
binding.readerSettingsAutoWebToon.isChecked = settings.autoDetectWebtoon
binding.readerSettingsAutoWebToon.isChecked = PrefManager.getVal(PrefName.AutoDetectWebtoon)
binding.readerSettingsAutoWebToon.setOnCheckedChangeListener { _, isChecked ->
settings.autoDetectWebtoon = isChecked
saveData(reader, settings)
PrefManager.setVal(PrefName.AutoDetectWebtoon, isChecked)
}
@ -68,8 +59,8 @@ class ReaderSettingsActivity : AppCompatActivity() {
)
binding.readerSettingsLayoutText.text =
resources.getStringArray(R.array.manga_layouts)[settings.default.layout.ordinal]
var selectedLayout = layoutList[settings.default.layout.ordinal]
resources.getStringArray(R.array.manga_layouts)[defaultSettings.layout.ordinal]
var selectedLayout = layoutList[defaultSettings.layout.ordinal]
selectedLayout.alpha = 1f
layoutList.forEachIndexed { index, imageButton ->
@ -77,25 +68,25 @@ class ReaderSettingsActivity : AppCompatActivity() {
selectedLayout.alpha = 0.33f
selectedLayout = imageButton
selectedLayout.alpha = 1f
settings.default.layout =
defaultSettings.layout =
CurrentReaderSettings.Layouts[index] ?: CurrentReaderSettings.Layouts.CONTINUOUS
binding.readerSettingsLayoutText.text =
resources.getStringArray(R.array.manga_layouts)[settings.default.layout.ordinal]
saveData(reader, settings)
resources.getStringArray(R.array.manga_layouts)[defaultSettings.layout.ordinal]
PrefManager.setVal(PrefName.LayoutReader, defaultSettings.layout.ordinal)
}
}
binding.readerSettingsDirectionText.text =
resources.getStringArray(R.array.manga_directions)[settings.default.direction.ordinal]
binding.readerSettingsDirection.rotation = 90f * (settings.default.direction.ordinal)
resources.getStringArray(R.array.manga_directions)[defaultSettings.direction.ordinal]
binding.readerSettingsDirection.rotation = 90f * (defaultSettings.direction.ordinal)
binding.readerSettingsDirection.setOnClickListener {
settings.default.direction =
CurrentReaderSettings.Directions[settings.default.direction.ordinal + 1]
defaultSettings.direction =
CurrentReaderSettings.Directions[defaultSettings.direction.ordinal + 1]
?: CurrentReaderSettings.Directions.TOP_TO_BOTTOM
binding.readerSettingsDirectionText.text =
resources.getStringArray(R.array.manga_directions)[settings.default.direction.ordinal]
binding.readerSettingsDirection.rotation = 90f * (settings.default.direction.ordinal)
saveData(reader, settings)
resources.getStringArray(R.array.manga_directions)[defaultSettings.direction.ordinal]
binding.readerSettingsDirection.rotation = 90f * (defaultSettings.direction.ordinal)
PrefManager.setVal(PrefName.Direction, defaultSettings.direction.ordinal)
}
val dualList = listOf(
@ -104,8 +95,8 @@ class ReaderSettingsActivity : AppCompatActivity() {
binding.readerSettingsDualForce
)
binding.readerSettingsDualPageText.text = settings.default.dualPageMode.toString()
var selectedDual = dualList[settings.default.dualPageMode.ordinal]
binding.readerSettingsDualPageText.text = defaultSettings.dualPageMode.toString()
var selectedDual = dualList[defaultSettings.dualPageMode.ordinal]
selectedDual.alpha = 1f
dualList.forEachIndexed { index, imageButton ->
@ -113,75 +104,75 @@ class ReaderSettingsActivity : AppCompatActivity() {
selectedDual.alpha = 0.33f
selectedDual = imageButton
selectedDual.alpha = 1f
settings.default.dualPageMode = CurrentReaderSettings.DualPageModes[index]
defaultSettings.dualPageMode = CurrentReaderSettings.DualPageModes[index]
?: CurrentReaderSettings.DualPageModes.Automatic
binding.readerSettingsDualPageText.text = settings.default.dualPageMode.toString()
saveData(reader, settings)
binding.readerSettingsDualPageText.text = defaultSettings.dualPageMode.toString()
PrefManager.setVal(PrefName.DualPageModeReader, defaultSettings.dualPageMode.ordinal)
}
}
binding.readerSettingsTrueColors.isChecked = settings.default.trueColors
binding.readerSettingsTrueColors.isChecked = defaultSettings.trueColors
binding.readerSettingsTrueColors.setOnCheckedChangeListener { _, isChecked ->
settings.default.trueColors = isChecked
saveData(reader, settings)
defaultSettings.trueColors = isChecked
PrefManager.setVal(PrefName.TrueColors, isChecked)
}
binding.readerSettingsCropBorders.isChecked = settings.default.cropBorders
binding.readerSettingsCropBorders.isChecked = defaultSettings.cropBorders
binding.readerSettingsCropBorders.setOnCheckedChangeListener { _, isChecked ->
settings.default.cropBorders = isChecked
saveData(reader, settings)
defaultSettings.cropBorders = isChecked
PrefManager.setVal(PrefName.CropBorders, isChecked)
}
binding.readerSettingsImageRotation.isChecked = settings.default.rotation
binding.readerSettingsImageRotation.isChecked = defaultSettings.rotation
binding.readerSettingsImageRotation.setOnCheckedChangeListener { _, isChecked ->
settings.default.rotation = isChecked
saveData(reader, settings)
defaultSettings.rotation = isChecked
PrefManager.setVal(PrefName.Rotation, isChecked)
}
binding.readerSettingsHorizontalScrollBar.isChecked = settings.default.horizontalScrollBar
binding.readerSettingsHorizontalScrollBar.isChecked = defaultSettings.horizontalScrollBar
binding.readerSettingsHorizontalScrollBar.setOnCheckedChangeListener { _, isChecked ->
settings.default.horizontalScrollBar = isChecked
saveData(reader, settings)
defaultSettings.horizontalScrollBar = isChecked
PrefManager.setVal(PrefName.HorizontalScrollBar, isChecked)
}
binding.readerSettingsPadding.isChecked = settings.default.padding
binding.readerSettingsPadding.isChecked = defaultSettings.padding
binding.readerSettingsPadding.setOnCheckedChangeListener { _, isChecked ->
settings.default.padding = isChecked
saveData(reader, settings)
defaultSettings.padding = isChecked
PrefManager.setVal(PrefName.Padding, isChecked)
}
binding.readerSettingsKeepScreenOn.isChecked = settings.default.keepScreenOn
binding.readerSettingsKeepScreenOn.isChecked = defaultSettings.keepScreenOn
binding.readerSettingsKeepScreenOn.setOnCheckedChangeListener { _, isChecked ->
settings.default.keepScreenOn = isChecked
saveData(reader, settings)
defaultSettings.keepScreenOn = isChecked
PrefManager.setVal(PrefName.KeepScreenOn, isChecked)
}
binding.readerSettingsHidePageNumbers.isChecked = settings.default.hidePageNumbers
binding.readerSettingsHidePageNumbers.isChecked = defaultSettings.hidePageNumbers
binding.readerSettingsHidePageNumbers.setOnCheckedChangeListener { _, isChecked ->
settings.default.hidePageNumbers = isChecked
saveData(reader, settings)
defaultSettings.hidePageNumbers = isChecked
PrefManager.setVal(PrefName.HidePageNumbers, isChecked)
}
binding.readerSettingsOverscroll.isChecked = settings.default.overScrollMode
binding.readerSettingsOverscroll.isChecked = defaultSettings.overScrollMode
binding.readerSettingsOverscroll.setOnCheckedChangeListener { _, isChecked ->
settings.default.overScrollMode = isChecked
saveData(reader, settings)
defaultSettings.overScrollMode = isChecked
PrefManager.setVal(PrefName.OverScrollMode, isChecked)
}
binding.readerSettingsVolumeButton.isChecked = settings.default.volumeButtons
binding.readerSettingsVolumeButton.isChecked = defaultSettings.volumeButtons
binding.readerSettingsVolumeButton.setOnCheckedChangeListener { _, isChecked ->
settings.default.volumeButtons = isChecked
saveData(reader, settings)
defaultSettings.volumeButtons = isChecked
PrefManager.setVal(PrefName.VolumeButtonsReader, isChecked)
}
binding.readerSettingsWrapImages.isChecked = settings.default.wrapImages
binding.readerSettingsWrapImages.isChecked = defaultSettings.wrapImages
binding.readerSettingsWrapImages.setOnCheckedChangeListener { _, isChecked ->
settings.default.wrapImages = isChecked
saveData(reader, settings)
defaultSettings.wrapImages = isChecked
PrefManager.setVal(PrefName.WrapImages, isChecked)
}
binding.readerSettingsLongClickImage.isChecked = settings.default.longClickImage
binding.readerSettingsLongClickImage.isChecked = defaultSettings.longClickImage
binding.readerSettingsLongClickImage.setOnCheckedChangeListener { _, isChecked ->
settings.default.longClickImage = isChecked
saveData(reader, settings)
defaultSettings.longClickImage = isChecked
PrefManager.setVal(PrefName.LongClickImage, isChecked)
}
//LN settings
@ -190,8 +181,8 @@ class ReaderSettingsActivity : AppCompatActivity() {
binding.LNcontinuous
)
binding.LNlayoutText.text = settings.defaultLN.layout.string
var selectedLN = layoutListLN[settings.defaultLN.layout.ordinal]
binding.LNlayoutText.text = defaultSettingsLN.layout.string
var selectedLN = layoutListLN[defaultSettingsLN.layout.ordinal]
selectedLN.alpha = 1f
layoutListLN.forEachIndexed { index, imageButton ->
@ -199,10 +190,10 @@ class ReaderSettingsActivity : AppCompatActivity() {
selectedLN.alpha = 0.33f
selectedLN = imageButton
selectedLN.alpha = 1f
settings.defaultLN.layout = CurrentNovelReaderSettings.Layouts[index]
defaultSettingsLN.layout = CurrentNovelReaderSettings.Layouts[index]
?: CurrentNovelReaderSettings.Layouts.PAGED
binding.LNlayoutText.text = settings.defaultLN.layout.string
saveData(reader, settings)
binding.LNlayoutText.text = defaultSettingsLN.layout.string
PrefManager.setVal(PrefName.LayoutNovel, defaultSettingsLN.layout.ordinal)
}
}
@ -212,8 +203,8 @@ class ReaderSettingsActivity : AppCompatActivity() {
binding.LNdualForce
)
binding.LNdualPageText.text = settings.defaultLN.dualPageMode.toString()
var selectedDualLN = dualListLN[settings.defaultLN.dualPageMode.ordinal]
binding.LNdualPageText.text = defaultSettingsLN.dualPageMode.toString()
var selectedDualLN = dualListLN[defaultSettingsLN.dualPageMode.ordinal]
selectedDualLN.alpha = 1f
dualListLN.forEachIndexed { index, imageButton ->
@ -221,143 +212,141 @@ class ReaderSettingsActivity : AppCompatActivity() {
selectedDualLN.alpha = 0.33f
selectedDualLN = imageButton
selectedDualLN.alpha = 1f
settings.defaultLN.dualPageMode = CurrentReaderSettings.DualPageModes[index]
defaultSettingsLN.dualPageMode = CurrentReaderSettings.DualPageModes[index]
?: CurrentReaderSettings.DualPageModes.Automatic
binding.LNdualPageText.text = settings.defaultLN.dualPageMode.toString()
saveData(reader, settings)
binding.LNdualPageText.text = defaultSettingsLN.dualPageMode.toString()
PrefManager.setVal(PrefName.DualPageModeNovel, defaultSettingsLN.dualPageMode.ordinal)
}
}
binding.LNlineHeight.setText(settings.defaultLN.lineHeight.toString())
binding.LNlineHeight.setText(defaultSettingsLN.lineHeight.toString())
binding.LNlineHeight.setOnFocusChangeListener { _, hasFocus ->
if (!hasFocus) {
val value = binding.LNlineHeight.text.toString().toFloatOrNull() ?: 1.4f
settings.defaultLN.lineHeight = value
defaultSettingsLN.lineHeight = value
binding.LNlineHeight.setText(value.toString())
saveData(reader, settings)
PrefManager.setVal(PrefName.LineHeight, value)
}
}
binding.LNincrementLineHeight.setOnClickListener {
val value = binding.LNlineHeight.text.toString().toFloatOrNull() ?: 1.4f
settings.defaultLN.lineHeight = value + 0.1f
binding.LNlineHeight.setText(settings.defaultLN.lineHeight.toString())
saveData(reader, settings)
defaultSettingsLN.lineHeight = value + 0.1f
binding.LNlineHeight.setText(defaultSettingsLN.lineHeight.toString())
PrefManager.setVal(PrefName.LineHeight, defaultSettingsLN.lineHeight)
}
binding.LNdecrementLineHeight.setOnClickListener {
val value = binding.LNlineHeight.text.toString().toFloatOrNull() ?: 1.4f
settings.defaultLN.lineHeight = value - 0.1f
binding.LNlineHeight.setText(settings.defaultLN.lineHeight.toString())
saveData(reader, settings)
defaultSettingsLN.lineHeight = value - 0.1f
binding.LNlineHeight.setText(defaultSettingsLN.lineHeight.toString())
PrefManager.setVal(PrefName.LineHeight, defaultSettingsLN.lineHeight)
}
binding.LNmargin.setText(settings.defaultLN.margin.toString())
binding.LNmargin.setText(defaultSettingsLN.margin.toString())
binding.LNmargin.setOnFocusChangeListener { _, hasFocus ->
if (!hasFocus) {
val value = binding.LNmargin.text.toString().toFloatOrNull() ?: 0.06f
settings.defaultLN.margin = value
defaultSettingsLN.margin = value
binding.LNmargin.setText(value.toString())
saveData(reader, settings)
PrefManager.setVal(PrefName.Margin, value)
}
}
binding.LNincrementMargin.setOnClickListener {
val value = binding.LNmargin.text.toString().toFloatOrNull() ?: 0.06f
settings.defaultLN.margin = value + 0.01f
binding.LNmargin.setText(settings.defaultLN.margin.toString())
saveData(reader, settings)
defaultSettingsLN.margin = value + 0.01f
binding.LNmargin.setText(defaultSettingsLN.margin.toString())
PrefManager.setVal(PrefName.Margin, defaultSettingsLN.margin)
}
binding.LNdecrementMargin.setOnClickListener {
val value = binding.LNmargin.text.toString().toFloatOrNull() ?: 0.06f
settings.defaultLN.margin = value - 0.01f
binding.LNmargin.setText(settings.defaultLN.margin.toString())
saveData(reader, settings)
defaultSettingsLN.margin = value - 0.01f
binding.LNmargin.setText(defaultSettingsLN.margin.toString())
PrefManager.setVal(PrefName.Margin, defaultSettingsLN.margin)
}
binding.LNmaxInlineSize.setText(settings.defaultLN.maxInlineSize.toString())
binding.LNmaxInlineSize.setText(defaultSettingsLN.maxInlineSize.toString())
binding.LNmaxInlineSize.setOnFocusChangeListener { _, hasFocus ->
if (!hasFocus) {
val value = binding.LNmaxInlineSize.text.toString().toIntOrNull() ?: 720
settings.defaultLN.maxInlineSize = value
defaultSettingsLN.maxInlineSize = value
binding.LNmaxInlineSize.setText(value.toString())
saveData(reader, settings)
PrefManager.setVal(PrefName.MaxInlineSize, value)
}
}
binding.LNincrementMaxInlineSize.setOnClickListener {
val value = binding.LNmaxInlineSize.text.toString().toIntOrNull() ?: 720
settings.defaultLN.maxInlineSize = value + 10
binding.LNmaxInlineSize.setText(settings.defaultLN.maxInlineSize.toString())
saveData(reader, settings)
defaultSettingsLN.maxInlineSize = value + 10
binding.LNmaxInlineSize.setText(defaultSettingsLN.maxInlineSize.toString())
PrefManager.setVal(PrefName.MaxInlineSize, defaultSettingsLN.maxInlineSize)
}
binding.LNdecrementMaxInlineSize.setOnClickListener {
val value = binding.LNmaxInlineSize.text.toString().toIntOrNull() ?: 720
settings.defaultLN.maxInlineSize = value - 10
binding.LNmaxInlineSize.setText(settings.defaultLN.maxInlineSize.toString())
saveData(reader, settings)
defaultSettingsLN.maxInlineSize = value - 10
binding.LNmaxInlineSize.setText(defaultSettingsLN.maxInlineSize.toString())
PrefManager.setVal(PrefName.MaxInlineSize, defaultSettingsLN.maxInlineSize)
}
binding.LNmaxBlockSize.setText(settings.defaultLN.maxBlockSize.toString())
binding.LNmaxBlockSize.setText(defaultSettingsLN.maxBlockSize.toString())
binding.LNmaxBlockSize.setOnFocusChangeListener { _, hasFocus ->
if (!hasFocus) {
val value = binding.LNmaxBlockSize.text.toString().toIntOrNull() ?: 720
settings.defaultLN.maxBlockSize = value
defaultSettingsLN.maxBlockSize = value
binding.LNmaxBlockSize.setText(value.toString())
saveData(reader, settings)
PrefManager.setVal(PrefName.MaxBlockSize, value)
}
}
binding.LNincrementMaxBlockSize.setOnClickListener {
val value = binding.LNmaxBlockSize.text.toString().toIntOrNull() ?: 720
settings.defaultLN.maxInlineSize = value + 10
binding.LNmaxBlockSize.setText(settings.defaultLN.maxInlineSize.toString())
saveData(reader, settings)
defaultSettingsLN.maxInlineSize = value + 10
binding.LNmaxBlockSize.setText(defaultSettingsLN.maxInlineSize.toString())
PrefManager.setVal(PrefName.MaxBlockSize, defaultSettingsLN.maxInlineSize)
}
binding.LNdecrementMaxBlockSize.setOnClickListener {
val value = binding.LNmaxBlockSize.text.toString().toIntOrNull() ?: 720
settings.defaultLN.maxBlockSize = value - 10
binding.LNmaxBlockSize.setText(settings.defaultLN.maxBlockSize.toString())
saveData(reader, settings)
defaultSettingsLN.maxBlockSize = value - 10
binding.LNmaxBlockSize.setText(defaultSettingsLN.maxBlockSize.toString())
PrefManager.setVal(PrefName.MaxBlockSize, defaultSettingsLN.maxBlockSize)
}
binding.LNuseDarkTheme.isChecked = settings.defaultLN.useDarkTheme
binding.LNuseDarkTheme.isChecked = defaultSettingsLN.useDarkTheme
binding.LNuseDarkTheme.setOnCheckedChangeListener { _, isChecked ->
settings.defaultLN.useDarkTheme = isChecked
saveData(reader, settings)
defaultSettingsLN.useDarkTheme = isChecked
PrefManager.setVal(PrefName.UseDarkThemeNovel, isChecked)
}
binding.LNuseOledTheme.isChecked = settings.defaultLN.useOledTheme
binding.LNuseOledTheme.isChecked = defaultSettingsLN.useOledTheme
binding.LNuseOledTheme.setOnCheckedChangeListener { _, isChecked ->
settings.defaultLN.useOledTheme = isChecked
saveData(reader, settings)
defaultSettingsLN.useOledTheme = isChecked
PrefManager.setVal(PrefName.UseOledThemeNovel, isChecked)
}
binding.LNkeepScreenOn.isChecked = settings.defaultLN.keepScreenOn
binding.LNkeepScreenOn.isChecked = defaultSettingsLN.keepScreenOn
binding.LNkeepScreenOn.setOnCheckedChangeListener { _, isChecked ->
settings.defaultLN.keepScreenOn = isChecked
saveData(reader, settings)
defaultSettingsLN.keepScreenOn = isChecked
PrefManager.setVal(PrefName.KeepScreenOnNovel, isChecked)
}
binding.LNvolumeButton.isChecked = settings.defaultLN.volumeButtons
binding.LNvolumeButton.isChecked = defaultSettingsLN.volumeButtons
binding.LNvolumeButton.setOnCheckedChangeListener { _, isChecked ->
settings.defaultLN.volumeButtons = isChecked
saveData(reader, settings)
defaultSettingsLN.volumeButtons = isChecked
PrefManager.setVal(PrefName.VolumeButtonsNovel, isChecked)
}
//Update Progress
binding.readerSettingsAskUpdateProgress.isChecked = settings.askIndividual
binding.readerSettingsAskUpdateProgress.isChecked = PrefManager.getVal(PrefName.AskIndividualReader)
binding.readerSettingsAskUpdateProgress.setOnCheckedChangeListener { _, isChecked ->
settings.askIndividual = isChecked
saveData(reader, settings)
PrefManager.setVal(PrefName.AskIndividualReader, isChecked)
}
binding.readerSettingsAskUpdateDoujins.isChecked = settings.updateForH
binding.readerSettingsAskUpdateDoujins.isChecked = PrefManager.getVal(PrefName.UpdateForHReader)
binding.readerSettingsAskUpdateDoujins.setOnCheckedChangeListener { _, isChecked ->
settings.updateForH = isChecked
PrefManager.setVal(PrefName.UpdateForHReader, isChecked)
if (isChecked) snackString(getString(R.string.very_bold))
saveData(reader, settings)
}
}

View file

@ -2,9 +2,7 @@ package ani.dantotsu.settings
import android.annotation.SuppressLint
import android.app.AlertDialog
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.graphics.drawable.Animatable
import android.os.Build.*
import android.os.Build.VERSION.*
@ -15,6 +13,9 @@ import android.widget.ArrayAdapter
import android.widget.TextView
import android.widget.Toast
import androidx.activity.OnBackPressedCallback
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.result.contract.ActivityResultContracts.CreateDocument
import androidx.annotation.OptIn
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
@ -23,6 +24,7 @@ import androidx.lifecycle.lifecycleScope
import androidx.media3.common.util.UnstableApi
import androidx.media3.exoplayer.offline.DownloadService
import ani.dantotsu.*
import ani.dantotsu.Mapper.json
import ani.dantotsu.connections.anilist.Anilist
import ani.dantotsu.connections.discord.Discord
import ani.dantotsu.connections.mal.MAL
@ -35,7 +37,8 @@ import ani.dantotsu.others.CustomBottomDialog
import ani.dantotsu.parsers.AnimeSources
import ani.dantotsu.parsers.MangaSources
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefWrapper
import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.settings.saving.internal.Location
import ani.dantotsu.subcriptions.Notifications
import ani.dantotsu.subcriptions.Notifications.Companion.openSettings
import ani.dantotsu.subcriptions.Subscription.Companion.defaultTime
@ -44,11 +47,12 @@ import ani.dantotsu.subcriptions.Subscription.Companion.timeMinutes
import ani.dantotsu.themes.ThemeManager
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.textfield.TextInputEditText
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import eltos.simpledialogfragment.SimpleDialog
import eltos.simpledialogfragment.SimpleDialog.OnDialogResultListener.BUTTON_POSITIVE
import eltos.simpledialogfragment.color.SimpleColorDialog
import eu.kanade.domain.base.BasePreferences
import eu.kanade.tachiyomi.network.NetworkPreferences
import io.noties.markwon.Markwon
import io.noties.markwon.SoftBreakAddsNewLinePlugin
import kotlinx.coroutines.Dispatchers
@ -65,20 +69,58 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
}
lateinit var binding: ActivitySettingsBinding
private val extensionInstaller = Injekt.get<BasePreferences>().extensionInstaller()
private val networkPreferences = Injekt.get<NetworkPreferences>()
private var cursedCounter = 0
private lateinit var openDocumentLauncher: ActivityResultLauncher<String>
@OptIn(UnstableApi::class)
@SuppressLint("SetTextI18n")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
ThemeManager(this).applyTheme()
binding = ActivitySettingsBinding.inflate(layoutInflater)
setContentView(binding.root)
initActivity(this)
var selectedImpExp = ""
openDocumentLauncher = registerForActivityResult(CreateDocument("*/*")) { uri ->
if (uri != null) {
try {
val jsonString = contentResolver.openInputStream(uri)?.bufferedReader()
.use { it?.readText() }
val location: Location =
Location.entries.find { it.name.lowercase() == selectedImpExp.lowercase() }
?: return@registerForActivityResult
val gson = Gson()
val type = object : TypeToken<Map<String, Map<String, Any>>>() {}.type
val rawMap: Map<String, Map<String, Any>> = gson.fromJson(jsonString, type)
val deserializedMap = mutableMapOf<String, Any?>()
rawMap.forEach { (key, typeValueMap) ->
val typeName = typeValueMap["type"] as? String
val value = typeValueMap["value"]
deserializedMap[key] = when (typeName) { //wierdly null sometimes so cast to string
"kotlin.Int" -> (value as? Double)?.toInt()
"kotlin.String" -> value.toString()
"kotlin.Boolean" -> value as? Boolean
"kotlin.Float" -> value.toString().toFloatOrNull()
"kotlin.Long" -> (value as? Double)?.toLong()
"java.util.HashSet" -> value as? ArrayList<*>
else -> null
}
}
PrefManager.importAllPrefs(deserializedMap, location)
} catch (e: Exception) {
e.printStackTrace()
toast("Error importing settings")
}
}
}
binding.settingsVersion.text = getString(R.string.version_current, BuildConfig.VERSION_NAME)
binding.settingsVersion.setOnLongClickListener {
copyToClipboard(getDeviceInfo(), false)
@ -97,16 +139,16 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
onBackPressedDispatcher.onBackPressed()
}
binding.settingsUseMaterialYou.isChecked = PrefWrapper.getVal(PrefName.UseMaterialYou, false)
binding.settingsUseMaterialYou.isChecked = PrefManager.getVal(PrefName.UseMaterialYou)
binding.settingsUseMaterialYou.setOnCheckedChangeListener { _, isChecked ->
PrefWrapper.setVal(PrefName.UseMaterialYou, isChecked)
PrefManager.setVal(PrefName.UseMaterialYou, isChecked)
if (isChecked) binding.settingsUseCustomTheme.isChecked = false
restartApp()
}
binding.settingsUseCustomTheme.isChecked = PrefWrapper.getVal(PrefName.UseCustomTheme, false)
binding.settingsUseCustomTheme.isChecked = PrefManager.getVal(PrefName.UseCustomTheme)
binding.settingsUseCustomTheme.setOnCheckedChangeListener { _, isChecked ->
PrefWrapper.setVal(PrefName.UseCustomTheme, isChecked)
PrefManager.setVal(PrefName.UseCustomTheme, isChecked)
if (isChecked) {
binding.settingsUseMaterialYou.isChecked = false
}
@ -114,19 +156,19 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
restartApp()
}
binding.settingsUseSourceTheme.isChecked = PrefWrapper.getVal(PrefName.UseSourceTheme, false)
binding.settingsUseSourceTheme.isChecked = PrefManager.getVal(PrefName.UseSourceTheme)
binding.settingsUseSourceTheme.setOnCheckedChangeListener { _, isChecked ->
PrefWrapper.setVal(PrefName.UseSourceTheme, isChecked)
PrefManager.setVal(PrefName.UseSourceTheme, isChecked)
restartApp()
}
binding.settingsUseOLED.isChecked = PrefWrapper.getVal(PrefName.UseOLED, false)
binding.settingsUseOLED.isChecked = PrefManager.getVal(PrefName.UseOLED)
binding.settingsUseOLED.setOnCheckedChangeListener { _, isChecked ->
PrefWrapper.setVal(PrefName.UseOLED, isChecked)
PrefManager.setVal(PrefName.UseOLED, isChecked)
restartApp()
}
val themeString = PrefWrapper.getVal(PrefName.Theme, "PURPLE")
val themeString: String = PrefManager.getVal(PrefName.Theme)
binding.themeSwitcher.setText(
themeString.substring(0, 1) + themeString.substring(1).lowercase()
)
@ -140,7 +182,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
)
binding.themeSwitcher.setOnItemClickListener { _, _, i, _ ->
PrefWrapper.setVal(PrefName.Theme, ThemeManager.Companion.Theme.entries[i].theme)
PrefManager.setVal(PrefName.Theme, ThemeManager.Companion.Theme.entries[i].theme)
//ActivityHelper.shouldRefreshMainActivity = true
binding.themeSwitcher.clearFocus()
restartApp()
@ -149,7 +191,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
binding.customTheme.setOnClickListener {
val originalColor = PrefWrapper.getVal(PrefName.CustomThemeInt, Color.parseColor("#6200EE"))
val originalColor: Int = PrefManager.getVal(PrefName.CustomThemeInt)
class CustomColorDialog : SimpleColorDialog() { //idk where to put it
override fun onPositiveButtonClick() {
@ -176,7 +218,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
val names = animeSourcesWithoutDownloadsSource.map { it.name }
val pinnedSourcesBoolean =
animeSourcesWithoutDownloadsSource.map { it.name in AnimeSources.pinnedAnimeSources }
val pinnedSourcesOriginal = PrefWrapper.getVal(PrefName.PinnedAnimeSources, setOf<String>())
val pinnedSourcesOriginal: Set<String> = PrefManager.getVal(PrefName.PinnedAnimeSources)
val pinnedSources = pinnedSourcesOriginal.toMutableSet() ?: mutableSetOf()
val alertDialog = AlertDialog.Builder(this, R.style.MyPopup)
.setTitle("Pinned Anime Sources")
@ -191,7 +233,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
}
}
.setPositiveButton("OK") { dialog, _ ->
PrefWrapper.setVal(PrefName.PinnedAnimeSources, pinnedSources)
PrefManager.setVal(PrefName.PinnedAnimeSources, pinnedSources)
AnimeSources.pinnedAnimeSources = pinnedSources
AnimeSources.performReorderAnimeSources()
dialog.dismiss()
@ -208,19 +250,43 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
val managers = arrayOf("Default", "1DM", "ADM")
val downloadManagerDialog =
AlertDialog.Builder(this, R.style.MyPopup).setTitle("Download Manager")
var downloadManager = PrefWrapper.getVal(PrefName.DownloadManager, 0)
var downloadManager: Int = PrefManager.getVal(PrefName.DownloadManager)
binding.settingsDownloadManager.setOnClickListener {
val dialog = downloadManagerDialog.setSingleChoiceItems(
managers,
downloadManager
) { dialog, count ->
downloadManager = count
PrefWrapper.setVal(PrefName.DownloadManager, downloadManager)
PrefManager.setVal(PrefName.DownloadManager, downloadManager)
dialog.dismiss()
}.show()
dialog.window?.setDimAmount(0.8f)
}
binding.importExportSettings.setOnClickListener {
val dialog = AlertDialog.Builder(this, R.style.MyPopup)
.setTitle("Import/Export Settings")
.setSingleChoiceItems(Location.entries.map { it.name }.toTypedArray(), 0) { dialog, which ->
selectedImpExp = Location.entries[which].name
}
.setPositiveButton("Import...") { dialog, _ ->
openDocumentLauncher.launch("Select a file")
dialog.dismiss()
}
.setNegativeButton("Export...") { dialog, which ->
savePrefsToDownloads(Location.entries[which].name,
PrefManager.exportAllPrefs(Location.entries[which]),
this@SettingsActivity)
dialog.dismiss()
}
.setNeutralButton("Cancel") { dialog, _ ->
dialog.dismiss()
}
.create()
dialog.window?.setDimAmount(0.8f)
dialog.show()
}
binding.purgeAnimeDownloads.setOnClickListener {
val dialog = AlertDialog.Builder(this, R.style.MyPopup)
.setTitle("Purge Anime Downloads")
@ -287,30 +353,29 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
}
}
binding.skipExtensionIcons.isChecked = PrefWrapper.getVal(PrefName.SkipExtensionIcons, false)
binding.skipExtensionIcons.isChecked = PrefManager.getVal(PrefName.SkipExtensionIcons)
binding.skipExtensionIcons.setOnCheckedChangeListener { _, isChecked ->
PrefWrapper.getVal(PrefName.SkipExtensionIcons, isChecked)
PrefManager.getVal(PrefName.SkipExtensionIcons, isChecked)
}
binding.NSFWExtension.isChecked = PrefWrapper.getVal(PrefName.NSFWExtension, true)
binding.NSFWExtension.isChecked = PrefManager.getVal(PrefName.NSFWExtension)
binding.NSFWExtension.setOnCheckedChangeListener { _, isChecked ->
PrefWrapper.setVal(PrefName.NSFWExtension,isChecked)
PrefManager.setVal(PrefName.NSFWExtension,isChecked)
}
binding.userAgent.setOnClickListener {
val dialogView = layoutInflater.inflate(R.layout.dialog_user_agent, null)
val editText = dialogView.findViewById<TextInputEditText>(R.id.userAgentTextBox)
editText.setText(networkPreferences.defaultUserAgent().get())
editText.setText(PrefManager.getVal<String>(PrefName.DefaultUserAgent))
val alertDialog = AlertDialog.Builder(this, R.style.MyPopup)
.setTitle("User Agent")
.setView(dialogView)
.setPositiveButton("OK") { dialog, _ ->
networkPreferences.defaultUserAgent().set(editText.text.toString())
PrefManager.setVal(PrefName.DefaultUserAgent, editText.text.toString())
dialog.dismiss()
}
.setNeutralButton("Reset") { dialog, _ ->
networkPreferences.defaultUserAgent()
.set("Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:110.0) Gecko/20100101 Firefox/110.0")
PrefManager.removeVal(PrefName.DefaultUserAgent)
editText.setText("")
dialog.dismiss()
}
@ -340,45 +405,45 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
"Shecan",
"Libre"
)
binding.settingsExtensionDns.setText(exDns[networkPreferences.dohProvider().get()], false)
binding.settingsExtensionDns.setText(exDns[PrefManager.getVal(PrefName.DohProvider)])
binding.settingsExtensionDns.setAdapter(ArrayAdapter(this, R.layout.item_dropdown, exDns))
binding.settingsExtensionDns.setOnItemClickListener { _, _, i, _ ->
networkPreferences.dohProvider().set(i)
PrefManager.setVal(PrefName.DohProvider, i)
binding.settingsExtensionDns.clearFocus()
Toast.makeText(this, "Restart app to apply changes", Toast.LENGTH_LONG).show()
}
binding.settingsDownloadInSd.isChecked = PrefWrapper.getVal(PrefName.SdDl, false)
binding.settingsDownloadInSd.isChecked = PrefManager.getVal(PrefName.SdDl)
binding.settingsDownloadInSd.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
val arrayOfFiles = ContextCompat.getExternalFilesDirs(this, null)
if (arrayOfFiles.size > 1 && arrayOfFiles[1] != null) {
PrefWrapper.setVal(PrefName.SdDl, true)
PrefManager.setVal(PrefName.SdDl, true)
} else {
binding.settingsDownloadInSd.isChecked = false
PrefWrapper.setVal(PrefName.SdDl, true)
PrefManager.setVal(PrefName.SdDl, true)
snackString(getString(R.string.noSdFound))
}
} else PrefWrapper.setVal(PrefName.SdDl, true)
} else PrefManager.setVal(PrefName.SdDl, true)
}
binding.settingsContinueMedia.isChecked = PrefWrapper.getVal(PrefName.ContinueMedia, true)
binding.settingsContinueMedia.isChecked = PrefManager.getVal(PrefName.ContinueMedia)
binding.settingsContinueMedia.setOnCheckedChangeListener { _, isChecked ->
PrefWrapper.setVal(PrefName.ContinueMedia, isChecked)
PrefManager.setVal(PrefName.ContinueMedia, isChecked)
}
binding.settingsRecentlyListOnly.isChecked = PrefWrapper.getVal(PrefName.RecentlyListOnly, false)
binding.settingsRecentlyListOnly.isChecked = PrefManager.getVal(PrefName.RecentlyListOnly)
binding.settingsRecentlyListOnly.setOnCheckedChangeListener { _, isChecked ->
PrefWrapper.setVal(PrefName.RecentlyListOnly, isChecked)
PrefManager.setVal(PrefName.RecentlyListOnly, isChecked)
}
binding.settingsShareUsername.isChecked = PrefWrapper.getVal(PrefName.SharedUserID, true)
binding.settingsShareUsername.isChecked = PrefManager.getVal(PrefName.SharedUserID)
binding.settingsShareUsername.setOnCheckedChangeListener { _, isChecked ->
PrefWrapper.setVal(PrefName.SharedUserID, isChecked)
PrefManager.setVal(PrefName.SharedUserID, isChecked)
}
binding.settingsPreferDub.isChecked = PrefWrapper.getVal(PrefName.SettingsPreferDub, false)
binding.settingsPreferDub.isChecked = PrefManager.getVal(PrefName.SettingsPreferDub)
binding.settingsPreferDub.setOnCheckedChangeListener { _, isChecked ->
PrefWrapper.setVal(PrefName.SettingsPreferDub, isChecked)
PrefManager.setVal(PrefName.SettingsPreferDub, isChecked)
}
binding.settingsPinnedMangaSources.setOnClickListener {
@ -387,7 +452,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
val names = mangaSourcesWithoutDownloadsSource.map { it.name }
val pinnedSourcesBoolean =
mangaSourcesWithoutDownloadsSource.map { it.name in MangaSources.pinnedMangaSources }
val pinnedSourcesOriginal = PrefWrapper.getVal(PrefName.PinnedMangaSources, setOf<String>())
val pinnedSourcesOriginal: Set<String> = PrefManager.getVal(PrefName.PinnedMangaSources)
val pinnedSources = pinnedSourcesOriginal.toMutableSet()
val alertDialog = AlertDialog.Builder(this, R.style.MyPopup)
.setTitle("Pinned Manga Sources")
@ -402,7 +467,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
}
}
.setPositiveButton("OK") { dialog, _ ->
PrefWrapper.setVal(PrefName.PinnedMangaSources, pinnedSources)
PrefManager.setVal(PrefName.PinnedMangaSources, pinnedSources)
MangaSources.pinnedMangaSources = pinnedSources
MangaSources.performReorderMangaSources()
dialog.dismiss()
@ -416,10 +481,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
startActivity(Intent(this, ReaderSettingsActivity::class.java))
}
val uiSettings: UserInterfaceSettings =
loadData("ui_settings", toast = false)
?: UserInterfaceSettings().apply { saveData("ui_settings", this) }
var previous: View = when (uiSettings.darkMode) {
var previous: View = when (PrefManager.getNullableVal(PrefName.DarkMode, null as Boolean?)) {
null -> binding.settingsUiAuto
true -> binding.settingsUiDark
false -> binding.settingsUiLight
@ -429,8 +491,11 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
previous.alpha = 0.33f
previous = current
current.alpha = 1f
uiSettings.darkMode = mode
saveData("ui_settings", uiSettings)
if (mode == null) {
PrefManager.removeVal(PrefName.DarkMode)
} else {
PrefManager.setVal(PrefName.DarkMode, mode)
}
Refresh.all()
finish()
startActivity(Intent(this, SettingsActivity::class.java))
@ -450,7 +515,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
uiTheme(true, it)
}
var previousStart: View = when (uiSettings.defaultStartUpTab) {
var previousStart: View = when (PrefManager.getVal<Int>(PrefName.DefaultStartUpTab)) {
0 -> binding.uiSettingsAnime
1 -> binding.uiSettingsHome
2 -> binding.uiSettingsManga
@ -461,8 +526,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
previousStart.alpha = 0.33f
previousStart = current
current.alpha = 1f
uiSettings.defaultStartUpTab = mode
saveData("ui_settings", uiSettings)
PrefManager.setVal(PrefName.DefaultStartUpTab, mode)
initActivity(this)
}
@ -479,13 +543,12 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
uiTheme(2, it)
}
binding.settingsShowYt.isChecked = uiSettings.showYtButton
binding.settingsShowYt.isChecked = PrefManager.getVal(PrefName.ShowYtButton)
binding.settingsShowYt.setOnCheckedChangeListener { _, isChecked ->
uiSettings.showYtButton = isChecked
saveData("ui_settings", uiSettings)
PrefManager.setVal(PrefName.ShowYtButton, isChecked)
}
var previousEp: View = when (uiSettings.animeDefaultView) {
var previousEp: View = when (PrefManager.getVal<Int>(PrefName.AnimeDefaultView)) {
0 -> binding.settingsEpList
1 -> binding.settingsEpGrid
2 -> binding.settingsEpCompact
@ -496,8 +559,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
previousEp.alpha = 0.33f
previousEp = current
current.alpha = 1f
uiSettings.animeDefaultView = mode
saveData("ui_settings", uiSettings)
PrefManager.setVal(PrefName.AnimeDefaultView, mode)
}
binding.settingsEpList.setOnClickListener {
@ -512,7 +574,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
uiEp(2, it)
}
var previousChp: View = when (uiSettings.mangaDefaultView) {
var previousChp: View = when (PrefManager.getVal<Int>(PrefName.MangaDefaultView)) {
0 -> binding.settingsChpList
1 -> binding.settingsChpCompact
else -> binding.settingsChpList
@ -522,8 +584,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
previousChp.alpha = 0.33f
previousChp = current
current.alpha = 1f
uiSettings.mangaDefaultView = mode
saveData("ui_settings", uiSettings)
PrefManager.setVal(PrefName.MangaDefaultView, mode)
}
binding.settingsChpList.setOnClickListener {
@ -571,7 +632,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
Toast.makeText(this, "youwu have been cuwsed :pwayge:", Toast.LENGTH_LONG).show()
val url = "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
openLinkInBrowser(url)
//PrefWrapper.setVal(PrefName.SomethingSpecial, !PrefWrapper.getVal(PrefName.SomethingSpecial, false))
//PrefManager.setVal(PrefName.SomethingSpecial, !PrefManager.getVal(PrefName.SomethingSpecial, false))
} else {
snackString(array[(Math.random() * array.size).toInt()], this)
}
@ -599,7 +660,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
}
}
var curTime = PrefWrapper.getVal(PrefName.SubscriptionsTimeS, defaultTime)
var curTime = PrefManager.getVal(PrefName.SubscriptionsTimeS, defaultTime)
val timeNames = timeMinutes.map {
val mins = it % 60
val hours = it / 60
@ -615,7 +676,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
curTime = i
binding.settingsSubscriptionsTime.text =
getString(R.string.subscriptions_checking_time_s, timeNames[i])
PrefWrapper.setVal(PrefName.SubscriptionsTimeS, curTime)
PrefManager.setVal(PrefName.SubscriptionsTimeS, curTime)
dialog.dismiss()
startSubscription(true)
}.show()
@ -628,9 +689,9 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
}
binding.settingsNotificationsCheckingSubscriptions.isChecked =
PrefWrapper.getVal(PrefName.SubscriptionCheckingNotifications, true)
PrefManager.getVal(PrefName.SubscriptionCheckingNotifications)
binding.settingsNotificationsCheckingSubscriptions.setOnCheckedChangeListener { _, isChecked ->
PrefWrapper.setVal(PrefName.SubscriptionCheckingNotifications, isChecked)
PrefManager.setVal(PrefName.SubscriptionCheckingNotifications, isChecked)
if (isChecked)
Notifications.createChannel(
this,
@ -648,10 +709,9 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
}
binding.settingsCheckUpdate.isChecked = PrefWrapper.getVal(PrefName.CheckUpdate, true)
binding.settingsCheckUpdate.isChecked = PrefManager.getVal(PrefName.CheckUpdate)
binding.settingsCheckUpdate.setOnCheckedChangeListener { _, isChecked ->
saveData("check_update", isChecked)
PrefWrapper.setVal(PrefName.CheckUpdate, isChecked)
PrefManager.setVal(PrefName.CheckUpdate, isChecked)
if (!isChecked) {
snackString(getString(R.string.long_click_to_check_update))
}
@ -733,9 +793,9 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
}
if (Discord.token != null) {
val id = PrefWrapper.getVal(PrefName.DiscordId, null as String?)
val avatar = PrefWrapper.getVal(PrefName.DiscordAvatar, null as String?)
val username = PrefWrapper.getVal(PrefName.DiscordUserName, null as String?)
val id = PrefManager.getVal(PrefName.DiscordId, null as String?)
val avatar = PrefManager.getVal(PrefName.DiscordAvatar, null as String?)
val username = PrefManager.getVal(PrefName.DiscordUserName, null as String?)
if (id != null && avatar != null) {
binding.settingsDiscordAvatar.loadImage("https://cdn.discordapp.com/avatars/$id/$avatar.png")
}
@ -790,7 +850,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene
if (which == BUTTON_POSITIVE) {
if (dialogTag == "colorPicker") {
val color = extras.getInt(SimpleColorDialog.COLOR)
PrefWrapper.setVal(PrefName.CustomThemeInt, color)
PrefManager.setVal(PrefName.CustomThemeInt, color)
logger("Custom Theme: $color")
}
}

View file

@ -26,7 +26,7 @@ import ani.dantotsu.openLinkInBrowser
import ani.dantotsu.others.imagesearch.ImageSearchActivity
import ani.dantotsu.setSafeOnClickListener
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefWrapper
import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.startMainActivity
class SettingsDialogFragment : BottomSheetDialogFragment() {
@ -76,10 +76,10 @@ class SettingsDialogFragment : BottomSheetDialogFragment() {
}
binding.settingsIncognito.isChecked =
PrefWrapper.getVal(PrefName.Incognito, false)
PrefManager.getVal(PrefName.Incognito)
binding.settingsIncognito.setOnCheckedChangeListener { _, isChecked ->
PrefWrapper.setVal(PrefName.Incognito, isChecked)
PrefManager.setVal(PrefName.Incognito, isChecked)
incognitoNotification(requireContext())
}
binding.settingsExtensionSettings.setSafeOnClickListener {
@ -99,7 +99,7 @@ class SettingsDialogFragment : BottomSheetDialogFragment() {
dismiss()
}
binding.settingsDownloads.isChecked = PrefWrapper.getVal(PrefName.OfflineMode, false)
binding.settingsDownloads.isChecked = PrefManager.getVal(PrefName.OfflineMode)
binding.settingsDownloads.setOnCheckedChangeListener { _, isChecked ->
when (pageType) {
PageType.MANGA -> {
@ -149,7 +149,7 @@ class SettingsDialogFragment : BottomSheetDialogFragment() {
}
dismiss()
PrefWrapper.setVal(PrefName.OfflineMode, isChecked)
PrefManager.setVal(PrefName.OfflineMode, isChecked)
}
}

View file

@ -1,30 +0,0 @@
package ani.dantotsu.settings
import java.io.Serializable
data class UserInterfaceSettings(
var darkMode: Boolean? = null,
var showYtButton: Boolean = true,
var animeDefaultView: Int = 0,
var mangaDefaultView: Int = 0,
//App
var immersiveMode: Boolean = false,
var smallView: Boolean = true,
var defaultStartUpTab: Int = 1,
var homeLayoutShow: MutableList<Boolean> = mutableListOf(
true,
false,
false,
true,
false,
false,
true
),
//Animations
var bannerAnimations: Boolean = true,
var layoutAnimations: Boolean = true,
var animationSpeed: Float = 1f
) : Serializable

View file

@ -9,9 +9,9 @@ import androidx.core.view.updateLayoutParams
import ani.dantotsu.R
import ani.dantotsu.databinding.ActivityUserInterfaceSettingsBinding
import ani.dantotsu.initActivity
import ani.dantotsu.loadData
import ani.dantotsu.navBarHeight
import ani.dantotsu.saveData
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefManager
import ani.dantotsu.statusBarHeight
import ani.dantotsu.themes.ThemeManager
import com.google.android.material.snackbar.Snackbar
@ -32,9 +32,6 @@ class UserInterfaceSettingsActivity : AppCompatActivity() {
bottomMargin = navBarHeight
}
val settings = loadData<UserInterfaceSettings>(ui, toast = false)
?: UserInterfaceSettings().apply { saveData(ui, this) }
binding.uiSettingsBack.setOnClickListener {
onBackPressedDispatcher.onBackPressed()
}
@ -45,39 +42,36 @@ class UserInterfaceSettingsActivity : AppCompatActivity() {
.setTitle(getString(R.string.home_layout_show)).apply {
setMultiChoiceItems(
views,
settings.homeLayoutShow.toBooleanArray()
PrefManager.getVal<List<Boolean>>(PrefName.HomeLayoutShow).toBooleanArray()
) { _, i, value ->
settings.homeLayoutShow[i] = value
saveData(ui, settings)
val set = PrefManager.getVal<List<Boolean>>(PrefName.HomeLayoutShow).toMutableList()
set[i] = value
PrefManager.setVal(PrefName.HomeLayoutShow, set)
}
}.show()
dialog.window?.setDimAmount(0.8f)
}
binding.uiSettingsSmallView.isChecked = settings.smallView
binding.uiSettingsSmallView.isChecked = PrefManager.getVal(PrefName.SmallView)
binding.uiSettingsSmallView.setOnCheckedChangeListener { _, isChecked ->
settings.smallView = isChecked
saveData(ui, settings)
PrefManager.setVal(PrefName.SmallView, isChecked)
restartApp()
}
binding.uiSettingsImmersive.isChecked = settings.immersiveMode
binding.uiSettingsImmersive.isChecked = PrefManager.getVal(PrefName.ImmersiveMode)
binding.uiSettingsImmersive.setOnCheckedChangeListener { _, isChecked ->
settings.immersiveMode = isChecked
saveData(ui, settings)
PrefManager.setVal(PrefName.ImmersiveMode, isChecked)
restartApp()
}
binding.uiSettingsBannerAnimation.isChecked = settings.bannerAnimations
binding.uiSettingsBannerAnimation.isChecked = PrefManager.getVal(PrefName.BannerAnimations)
binding.uiSettingsBannerAnimation.setOnCheckedChangeListener { _, isChecked ->
settings.bannerAnimations = isChecked
saveData(ui, settings)
PrefManager.setVal(PrefName.BannerAnimations, isChecked)
restartApp()
}
binding.uiSettingsLayoutAnimation.isChecked = settings.layoutAnimations
binding.uiSettingsLayoutAnimation.isChecked = PrefManager.getVal(PrefName.LayoutAnimations)
binding.uiSettingsLayoutAnimation.setOnCheckedChangeListener { _, isChecked ->
settings.layoutAnimations = isChecked
saveData(ui, settings)
PrefManager.setVal(PrefName.LayoutAnimations, isChecked)
restartApp()
}
@ -93,10 +87,9 @@ class UserInterfaceSettingsActivity : AppCompatActivity() {
0f to 0f
)
val mapReverse = map.map { it.value to it.key }.toMap()
binding.uiSettingsAnimationSpeed.value = mapReverse[settings.animationSpeed] ?: 1f
binding.uiSettingsAnimationSpeed.value = mapReverse[PrefManager.getVal(PrefName.AnimationSpeed)] ?: 1f
binding.uiSettingsAnimationSpeed.addOnChangeListener { _, value, _ ->
settings.animationSpeed = map[value] ?: 1f
saveData(ui, settings)
PrefManager.setVal(PrefName.AnimationSpeed, map[value] ?: 1f)
restartApp()
}

View file

@ -21,7 +21,7 @@ import ani.dantotsu.R
import ani.dantotsu.databinding.ItemExtensionAllBinding
import ani.dantotsu.others.LanguageMapper
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefWrapper
import ani.dantotsu.settings.saving.PrefManager
import com.bumptech.glide.Glide
import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager
import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension
@ -93,14 +93,14 @@ class AnimeExtensionPagingSource(
val availableExtensions =
availableExtensionsFlow.filterNot { it.pkgName in installedExtensions }
val query = searchQuery
val isNsfwEnabled: Boolean = PrefWrapper.getVal(PrefName.NSFWExtension,true)
val isNsfwEnabled: Boolean = PrefManager.getVal(PrefName.NSFWExtension)
val filteredExtensions = if (query.isEmpty()) {
availableExtensions
} else {
availableExtensions.filter { it.name.contains(query, ignoreCase = true) }
}
val lang = PrefWrapper.getVal(PrefName.LangSort, "all")
val lang: String = PrefManager.getVal(PrefName.LangSort)
val langFilter = if (lang != "all") filteredExtensions.filter { it.lang == lang } else filteredExtensions
val filternfsw = if (isNsfwEnabled) langFilter else langFilter.filterNot { it.isNsfw }
return try {
@ -128,7 +128,7 @@ class AnimeExtensionAdapter(private val clickListener: OnAnimeInstallClickListen
DIFF_CALLBACK
) {
private val skipIcons = PrefWrapper.getVal(PrefName.SkipExtensionIcons, false)
private val skipIcons: Boolean = PrefManager.getVal(PrefName.SkipExtensionIcons)
companion object {
private val DIFF_CALLBACK = object : DiffUtil.ItemCallback<AnimeExtension.Available>() {

View file

@ -19,10 +19,9 @@ import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import ani.dantotsu.R
import ani.dantotsu.databinding.ItemExtensionAllBinding
import ani.dantotsu.loadData
import ani.dantotsu.others.LanguageMapper
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefWrapper
import ani.dantotsu.settings.saving.PrefManager
import com.bumptech.glide.Glide
import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager
import eu.kanade.tachiyomi.extension.manga.model.MangaExtension
@ -94,13 +93,13 @@ class MangaExtensionPagingSource(
val availableExtensions =
availableExtensionsFlow.filterNot { it.pkgName in installedExtensions }
val query = searchQuery
val isNsfwEnabled: Boolean = PrefWrapper.getVal(PrefName.NSFWExtension,true)
val isNsfwEnabled: Boolean = PrefManager.getVal(PrefName.NSFWExtension)
val filteredExtensions = if (query.isEmpty()) {
availableExtensions
} else {
availableExtensions.filter { it.name.contains(query, ignoreCase = true) }
}
val lang = PrefWrapper.getVal(PrefName.LangSort, "all")
val lang: String = PrefManager.getVal(PrefName.LangSort)
val langFilter = if (lang != "all") filteredExtensions.filter { it.lang == lang } else filteredExtensions
val filternfsw = if (isNsfwEnabled) langFilter else langFilter.filterNot { it.isNsfw }
return try {
@ -128,7 +127,7 @@ class MangaExtensionAdapter(private val clickListener: OnMangaInstallClickListen
DIFF_CALLBACK
) {
private val skipIcons = PrefWrapper.getVal(PrefName.SkipExtensionIcons, false)
private val skipIcons: Boolean = PrefManager.getVal(PrefName.SkipExtensionIcons)
companion object {
private val DIFF_CALLBACK = object : DiffUtil.ItemCallback<MangaExtension.Available>() {

View file

@ -18,12 +18,11 @@ import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import ani.dantotsu.R
import ani.dantotsu.databinding.ItemExtensionAllBinding
import ani.dantotsu.loadData
import ani.dantotsu.others.LanguageMapper
import ani.dantotsu.parsers.novel.NovelExtension
import ani.dantotsu.parsers.novel.NovelExtensionManager
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefWrapper
import ani.dantotsu.settings.saving.PrefManager
import com.bumptech.glide.Glide
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@ -95,7 +94,7 @@ class NovelExtensionPagingSource(
val availableExtensions =
availableExtensionsFlow.filterNot { it.pkgName in installedExtensions }
val query = searchQuery
val isNsfwEnabled: Boolean = PrefWrapper.getVal(PrefName.NSFWExtension,true)
val isNsfwEnabled: Boolean = PrefManager.getVal(PrefName.NSFWExtension)
val filteredExtensions = if (query.isEmpty()) {
availableExtensions
} else {
@ -132,7 +131,7 @@ class NovelExtensionAdapter(private val clickListener: OnNovelInstallClickListen
DIFF_CALLBACK
) {
private val skipIcons = PrefWrapper.getVal(PrefName.SkipExtensionIcons, false)
private val skipIcons: Boolean = PrefManager.getVal(PrefName.SkipExtensionIcons)
companion object {
private val DIFF_CALLBACK = object : DiffUtil.ItemCallback<NovelExtension.Available>() {

View file

@ -0,0 +1,362 @@
package ani.dantotsu.settings.saving
import android.content.Context
import android.content.SharedPreferences
import android.util.Base64
import ani.dantotsu.settings.saving.internal.Compat
import ani.dantotsu.settings.saving.internal.Location
import ani.dantotsu.snackString
import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream
import java.io.ObjectInputStream
import java.io.ObjectOutputStream
object PrefManager {
private var generalPreferences: SharedPreferences? = null
private var animePreferences: SharedPreferences? = null
private var mangaPreferences: SharedPreferences? = null
private var playerPreferences: SharedPreferences? = null
private var readerPreferences: SharedPreferences? = null
private var irrelevantPreferences: SharedPreferences? = null
private var animeDownloadsPreferences: SharedPreferences? = null
private var protectedPreferences: SharedPreferences? = null
fun init(context: Context) { //must be called in Application class or will crash
generalPreferences = context.getSharedPreferences(Location.General.location, Context.MODE_PRIVATE)
animePreferences = context.getSharedPreferences(Location.Anime.location, Context.MODE_PRIVATE)
mangaPreferences = context.getSharedPreferences(Location.Manga.location, Context.MODE_PRIVATE)
playerPreferences = context.getSharedPreferences(Location.Player.location, Context.MODE_PRIVATE)
readerPreferences = context.getSharedPreferences(Location.Reader.location, Context.MODE_PRIVATE)
irrelevantPreferences = context.getSharedPreferences(Location.Irrelevant.location, Context.MODE_PRIVATE)
animeDownloadsPreferences = context.getSharedPreferences(Location.AnimeDownloads.location, Context.MODE_PRIVATE)
protectedPreferences = context.getSharedPreferences(Location.Protected.location, Context.MODE_PRIVATE)
Compat.importOldPrefs(context)
}
fun <T> setVal(prefName: PrefName, value: T?) {
val pref = getPrefLocation(prefName.data.prefLocation)
with(pref.edit()) {
when (value) {
is Boolean -> putBoolean(prefName.name, value)
is Int -> putInt(prefName.name, value)
is Float -> putFloat(prefName.name, value)
is Long -> putLong(prefName.name, value)
is String -> putString(prefName.name, value)
is Set<*> -> convertAndPutStringSet(prefName.name, value)
null -> remove(prefName.name)
else -> serialzeClass(prefName.name, value)
}
apply()
}
}
@Suppress("UNCHECKED_CAST")
fun <T> getVal(prefName: PrefName, default: T) : T {
return try {
val pref = getPrefLocation(prefName.data.prefLocation)
when (prefName.data.type) {
Boolean::class -> pref.getBoolean(prefName.name, default as Boolean) as T
Int::class -> pref.getInt(prefName.name, default as Int) as T
Float::class -> pref.getFloat(prefName.name, default as Float) as T
Long::class -> pref.getLong(prefName.name, default as Long) as T
String::class -> pref.getString(prefName.name, default as String?) as T
Set::class -> convertFromStringSet(pref.getStringSet(prefName.name, null), default) as T
List::class -> deserialzeClass(prefName.name, default) as T
else -> throw IllegalArgumentException("Type not supported")
}
} catch (e: Exception) {
default
}
}
@Suppress("UNCHECKED_CAST")
fun <T> getVal(prefName: PrefName) : T {
return try {
val pref = getPrefLocation(prefName.data.prefLocation)
when (prefName.data.type) {
Boolean::class -> pref.getBoolean(prefName.name, prefName.data.default as Boolean) as T
Int::class -> pref.getInt(prefName.name, prefName.data.default as Int) as T
Float::class -> pref.getFloat(prefName.name, prefName.data.default as Float) as T
Long::class -> pref.getLong(prefName.name, prefName.data.default as Long) as T
String::class -> pref.getString(prefName.name, prefName.data.default as String?) as T
Set::class -> convertFromStringSet(pref.getStringSet(prefName.name, null), prefName.data.default) as T
List::class -> deserialzeClass(prefName.name, prefName.data.default) as T
else -> throw IllegalArgumentException("Type not supported")
}
} catch (e: Exception) {
prefName.data.default as T
}
}
@Suppress("UNCHECKED_CAST")
fun <T> getNullableVal(prefName: PrefName, default: T?) : T? {
return try {
val pref = getPrefLocation(prefName.data.prefLocation)
when (prefName.data.type) {
Boolean::class -> pref.getBoolean(prefName.name, prefName.data.default as Boolean) as T?
Int::class -> pref.getInt(prefName.name, prefName.data.default as Int) as T?
Float::class -> pref.getFloat(prefName.name, prefName.data.default as Float) as T?
Long::class -> pref.getLong(prefName.name, prefName.data.default as Long) as T?
String::class -> pref.getString(prefName.name, prefName.data.default as String?) as T?
Set::class -> convertFromStringSet(pref.getStringSet(prefName.name, null), prefName.data.default) as T?
else -> deserialzeClass(prefName.name, default)
}
} catch (e: Exception) {
default
}
}
@Suppress("UNCHECKED_CAST")
fun <T> getCustomVal(key: String, default: T): T {
return try {
when (default) {
is Boolean -> irrelevantPreferences!!.getBoolean(key, default) as T
is Int -> irrelevantPreferences!!.getInt(key, default) as T
is Float -> irrelevantPreferences!!.getFloat(key, default) as T
is Long -> irrelevantPreferences!!.getLong(key, default) as T
is String -> irrelevantPreferences!!.getString(key, default) as T
is Set<*> -> convertFromStringSet(irrelevantPreferences!!.getStringSet(key, null), default) as T
else -> throw IllegalArgumentException("Type not supported")
}
} catch (e: Exception) {
default
}
}
@Suppress("UNCHECKED_CAST")
fun <T> getNullableCustomVal(key: String, default: T): T? {
return try {
when (default) {
is Boolean -> irrelevantPreferences!!.getBoolean(key, default) as T?
is Int -> irrelevantPreferences!!.getInt(key, default) as T?
is Float -> irrelevantPreferences!!.getFloat(key, default) as T?
is Long -> irrelevantPreferences!!.getLong(key, default) as T?
is String -> irrelevantPreferences!!.getString(key, default) as T?
is Set<*> -> convertFromStringSet(irrelevantPreferences!!.getStringSet(key, null), default) as T?
else -> deserialzeClass(key, default)
}
} catch (e: Exception) {
default
}
}
fun removeVal(prefName: PrefName) {
val pref = getPrefLocation(prefName.data.prefLocation)
with(pref.edit()) {
remove(prefName.name)
apply()
}
}
fun <T> setCustomVal(key: String, value: T?) {
//for custom force irrelevant
with(irrelevantPreferences!!.edit()) {
when (value) {
is Boolean -> putBoolean(key, value as Boolean)
is Int -> putInt(key, value as Int)
is Float -> putFloat(key, value as Float)
is Long -> putLong(key, value as Long)
is String -> putString(key, value as String)
is Set<*> -> convertAndPutStringSet(key, value)
null -> remove(key)
else -> serialzeClass(key, value)
}
apply()
}
}
fun removeCustomVal(key: String) {
//for custom force irrelevant
with(irrelevantPreferences!!.edit()) {
remove(key)
apply()
}
}
@Suppress("UNCHECKED_CAST")
fun <T> getLiveVal(prefName: PrefName, default: T) : SharedPreferenceLiveData<T> {
val pref = getPrefLocation(prefName.data.prefLocation)
return when (prefName.data.type) {
Boolean::class -> SharedPreferenceBooleanLiveData(
pref,
prefName.name,
default as Boolean
) as SharedPreferenceLiveData<T>
Int::class -> SharedPreferenceIntLiveData(
pref,
prefName.name,
default as Int
) as SharedPreferenceLiveData<T>
Float::class -> SharedPreferenceFloatLiveData(
pref,
prefName.name,
default as Float
) as SharedPreferenceLiveData<T>
Long::class -> SharedPreferenceLongLiveData(
pref,
prefName.name,
default as Long
) as SharedPreferenceLiveData<T>
String::class -> SharedPreferenceStringLiveData(
pref,
prefName.name,
default as String
) as SharedPreferenceLiveData<T>
Set::class -> SharedPreferenceStringSetLiveData(
pref,
prefName.name,
default as Set<String>
) as SharedPreferenceLiveData<T>
else -> throw IllegalArgumentException("Type not supported")
}
}
fun SharedPreferenceLiveData<*>.asLiveBool(): SharedPreferenceBooleanLiveData =
this as? SharedPreferenceBooleanLiveData
?: throw ClassCastException("Cannot cast to SharedPreferenceLiveData<Boolean>")
fun SharedPreferenceLiveData<*>.asLiveInt(): SharedPreferenceIntLiveData =
this as? SharedPreferenceIntLiveData
?: throw ClassCastException("Cannot cast to SharedPreferenceLiveData<Int>")
fun SharedPreferenceLiveData<*>.asLiveFloat(): SharedPreferenceFloatLiveData =
this as? SharedPreferenceFloatLiveData
?: throw ClassCastException("Cannot cast to SharedPreferenceLiveData<Float>")
fun SharedPreferenceLiveData<*>.asLiveLong(): SharedPreferenceLongLiveData =
this as? SharedPreferenceLongLiveData
?: throw ClassCastException("Cannot cast to SharedPreferenceLiveData<Long>")
fun SharedPreferenceLiveData<*>.asLiveString(): SharedPreferenceStringLiveData =
this as? SharedPreferenceStringLiveData
?: throw ClassCastException("Cannot cast to SharedPreferenceLiveData<String>")
fun SharedPreferenceLiveData<*>.asLiveStringSet(): SharedPreferenceStringSetLiveData =
this as? SharedPreferenceStringSetLiveData
?: throw ClassCastException("Cannot cast to SharedPreferenceLiveData<Set<String>>")
fun getAnimeDownloadPreferences(): SharedPreferences = animeDownloadsPreferences!! //needs to be used externally
fun exportAllPrefs(prefLocation: Location): Map<String, *>{
val pref = getPrefLocation(prefLocation)
val typedMap = mutableMapOf<String, Any>()
pref.all.forEach { (key, value) ->
val typeValueMap = mapOf(
"type" to value?.javaClass?.kotlin?.qualifiedName,
"value" to value
)
typedMap[key] = typeValueMap
}
return typedMap
}
@Suppress("UNCHECKED_CAST")
fun importAllPrefs(prefs: Map<String, *>, prefLocation: Location) {
val pref = getPrefLocation(prefLocation)
with(pref.edit()) {
prefs.forEach { (key, value) ->
when (value) {
is Boolean -> putBoolean(key, value)
is Int -> putInt(key, value)
is Float -> putFloat(key, value)
is Long -> putLong(key, value)
is String -> putString(key, value)
is HashSet<*> -> putStringSet(key, value as Set<String>)
is ArrayList<*> -> putStringSet(key, arrayListToSet(value))
is Set<*> -> putStringSet(key, value as Set<String>)
else -> snackString("Error importing preference: Type not supported")
}
}
apply()
}
}
private fun arrayListToSet(arrayList: ArrayList<*>): Set<String> {
return arrayList.map { it.toString() }.toSet()
}
private fun getPrefLocation(prefLoc: Location): SharedPreferences {
return when (prefLoc) {
Location.General -> generalPreferences
Location.UI -> generalPreferences
Location.Anime -> animePreferences
Location.Manga -> mangaPreferences
Location.Player -> playerPreferences
Location.Reader -> readerPreferences
Location.NovelReader -> readerPreferences
Location.Irrelevant -> irrelevantPreferences
Location.AnimeDownloads -> animeDownloadsPreferences
Location.Protected -> protectedPreferences
}!!
}
private fun <T> convertFromStringSet(stringSet: Set<String>?, default: T): Set<*> {
if (stringSet.isNullOrEmpty()) return default as Set<*>
return try {
val typeIdentifier = stringSet.first()
val convertedSet = stringSet.drop(1) // Remove the type identifier
when (typeIdentifier) {
"Int" -> convertedSet.mapNotNull { it.toIntOrNull() }.toSet()
"Boolean" -> convertedSet.mapNotNull { it.toBooleanStrictOrNull() }.toSet()
"Float" -> convertedSet.mapNotNull { it.toFloatOrNull() }.toSet()
"Long" -> convertedSet.mapNotNull { it.toLongOrNull() }.toSet()
"String" -> convertedSet.toSet()
else -> stringSet
}
} catch (e: Exception) {
snackString("Error converting preference: ${e.message}")
default as Set<*>
}
}
private fun SharedPreferences.Editor.convertAndPutStringSet(key: String, value: Set<*>) {
val typeIdentifier = when (value.firstOrNull()) {
is Int -> "Int"
is Boolean -> "Boolean"
is Float -> "Float"
is Long -> "Long"
is String -> "String"
null -> return
else -> throw IllegalArgumentException("Type not supported")
}
val stringSet = setOf(typeIdentifier) + value.map { it.toString() }
putStringSet(key, stringSet)
}
private fun <T> serialzeClass(key: String, value: T){
try {
val bos = ByteArrayOutputStream()
ObjectOutputStream(bos).use { oos ->
oos.writeObject(value)
}
val serialized = Base64.encodeToString(bos.toByteArray(), Base64.DEFAULT)
irrelevantPreferences!!.edit().putString(key, serialized).apply()
} catch (e: Exception) {
snackString("Error serializing preference: ${e.message}")
}
}
@Suppress("UNCHECKED_CAST")
private fun <T> deserialzeClass(key: String, default: T?): T? {
return try {
val serialized = irrelevantPreferences!!.getString(key, null)
if (serialized != null) {
val data = Base64.decode(serialized, Base64.DEFAULT)
val bis = ByteArrayInputStream(data)
val ois = ObjectInputStream(bis)
val obj = ois.readObject() as T?
obj
} else {
default
}
} catch (e: Exception) {
snackString("Error deserializing preference: ${e.message}")
default
}
}
}

View file

@ -1,196 +0,0 @@
package ani.dantotsu.settings.saving
import android.annotation.SuppressLint
import android.content.Context
import android.content.SharedPreferences
import ani.dantotsu.settings.saving.internal.Compat
import ani.dantotsu.settings.saving.internal.Location
import ani.dantotsu.snackString
object PrefWrapper {
private var generalPreferences: SharedPreferences? = null
private var animePreferences: SharedPreferences? = null
private var mangaPreferences: SharedPreferences? = null
private var playerPreferences: SharedPreferences? = null
private var readerPreferences: SharedPreferences? = null
private var irrelevantPreferences: SharedPreferences? = null
private var animeDownloadsPreferences: SharedPreferences? = null
private var protectedPreferences: SharedPreferences? = null
fun init(context: Context) { //must be called in Application class or will crash
generalPreferences = context.getSharedPreferences(Location.General.location, Context.MODE_PRIVATE)
animePreferences = context.getSharedPreferences(Location.Anime.location, Context.MODE_PRIVATE)
mangaPreferences = context.getSharedPreferences(Location.Manga.location, Context.MODE_PRIVATE)
playerPreferences = context.getSharedPreferences(Location.Player.location, Context.MODE_PRIVATE)
readerPreferences = context.getSharedPreferences(Location.Reader.location, Context.MODE_PRIVATE)
irrelevantPreferences = context.getSharedPreferences(Location.Irrelevant.location, Context.MODE_PRIVATE)
animeDownloadsPreferences = context.getSharedPreferences(Location.AnimeDownloads.location, Context.MODE_PRIVATE)
protectedPreferences = context.getSharedPreferences(Location.Protected.location, Context.MODE_PRIVATE)
Compat.importOldPrefs(context)
}
@Suppress("UNCHECKED_CAST")
fun <T> setVal(prefName: PrefName, value: T) {
val pref = getPrefLocation(prefName)
with(pref.edit()) {
when (prefName.data.type) {
Boolean::class -> putBoolean(prefName.name, value as Boolean)
Int::class -> putInt(prefName.name, value as Int)
Float::class -> putFloat(prefName.name, value as Float)
Long::class -> putLong(prefName.name, value as Long)
String::class -> putString(prefName.name, value as String?)
Set::class -> putStringSet(prefName.name, value as Set<String>)
else -> throw IllegalArgumentException("Type not supported")
}
apply()
}
}
@Suppress("UNCHECKED_CAST")
fun <T> getVal(prefName: PrefName, default: T) : T {
return try {
val pref = getPrefLocation(prefName)
when (prefName.data.type) {
Boolean::class -> pref.getBoolean(prefName.name, default as Boolean) as T
Int::class -> pref.getInt(prefName.name, default as Int) as T
Float::class -> pref.getFloat(prefName.name, default as Float) as T
Long::class -> pref.getLong(prefName.name, default as Long) as T
String::class -> pref.getString(prefName.name, default as String?) as T
Set::class -> pref.getStringSet(prefName.name, default as Set<String>) as T
else -> throw IllegalArgumentException("Type not supported")
}
} catch (e: Exception) {
snackString("Error getting preference: ${e.message}")
default
}
}
@Suppress("UNCHECKED_CAST")
fun <T> getLiveVal(prefName: PrefName, default: T) : SharedPreferenceLiveData<T> {
val pref = getPrefLocation(prefName)
return when (prefName.data.type) {
Boolean::class -> SharedPreferenceBooleanLiveData(
pref,
prefName.name,
default as Boolean
) as SharedPreferenceLiveData<T>
Int::class -> SharedPreferenceIntLiveData(
pref,
prefName.name,
default as Int
) as SharedPreferenceLiveData<T>
Float::class -> SharedPreferenceFloatLiveData(
pref,
prefName.name,
default as Float
) as SharedPreferenceLiveData<T>
Long::class -> SharedPreferenceLongLiveData(
pref,
prefName.name,
default as Long
) as SharedPreferenceLiveData<T>
String::class -> SharedPreferenceStringLiveData(
pref,
prefName.name,
default as String
) as SharedPreferenceLiveData<T>
Set::class -> SharedPreferenceStringSetLiveData(
pref,
prefName.name,
default as Set<String>
) as SharedPreferenceLiveData<T>
else -> throw IllegalArgumentException("Type not supported")
}
}
fun removeVal(prefName: PrefName) {
val pref = getPrefLocation(prefName)
with(pref.edit()) {
remove(prefName.name)
apply()
}
}
@Suppress("UNCHECKED_CAST")
fun <T> setCustomVal(key: String, value: T) {
//for custom force irrelevant
with(irrelevantPreferences!!.edit()) {
when (value) {
is Boolean -> putBoolean(key, value as Boolean)
is Int -> putInt(key, value as Int)
is Float -> putFloat(key, value as Float)
is Long -> putLong(key, value as Long)
is String -> putString(key, value as String)
is Set<*> -> putStringSet(key, value as Set<String>)
else -> throw IllegalArgumentException("Type not supported")
}
apply()
}
}
@Suppress("UNCHECKED_CAST")
fun <T> getCustomVal(key: String, default: T): T {
//for custom force irrelevant
return try {
when (default) {
is Boolean -> irrelevantPreferences!!.getBoolean(key, default) as T
is Int -> irrelevantPreferences!!.getInt(key, default) as T
is Float -> irrelevantPreferences!!.getFloat(key, default) as T
is Long -> irrelevantPreferences!!.getLong(key, default) as T
is String -> irrelevantPreferences!!.getString(key, default) as T
is Set<*> -> irrelevantPreferences!!.getStringSet(key, default as Set<String>) as T
else -> throw IllegalArgumentException("Type not supported")
}
} catch (e: Exception) {
default
}
}
fun removeCustomVal(key: String) {
//for custom force irrelevant
with(irrelevantPreferences!!.edit()) {
remove(key)
apply()
}
}
fun SharedPreferenceLiveData<*>.asLiveBool(): SharedPreferenceBooleanLiveData =
this as? SharedPreferenceBooleanLiveData
?: throw ClassCastException("Cannot cast to SharedPreferenceLiveData<Boolean>")
fun SharedPreferenceLiveData<*>.asLiveInt(): SharedPreferenceIntLiveData =
this as? SharedPreferenceIntLiveData
?: throw ClassCastException("Cannot cast to SharedPreferenceLiveData<Int>")
fun SharedPreferenceLiveData<*>.asLiveFloat(): SharedPreferenceFloatLiveData =
this as? SharedPreferenceFloatLiveData
?: throw ClassCastException("Cannot cast to SharedPreferenceLiveData<Float>")
fun SharedPreferenceLiveData<*>.asLiveLong(): SharedPreferenceLongLiveData =
this as? SharedPreferenceLongLiveData
?: throw ClassCastException("Cannot cast to SharedPreferenceLiveData<Long>")
fun SharedPreferenceLiveData<*>.asLiveString(): SharedPreferenceStringLiveData =
this as? SharedPreferenceStringLiveData
?: throw ClassCastException("Cannot cast to SharedPreferenceLiveData<String>")
fun SharedPreferenceLiveData<*>.asLiveStringSet(): SharedPreferenceStringSetLiveData =
this as? SharedPreferenceStringSetLiveData
?: throw ClassCastException("Cannot cast to SharedPreferenceLiveData<Set<String>>")
fun getAnimeDownloadPreferences(): SharedPreferences = animeDownloadsPreferences!! //needs to be used externally
private fun getPrefLocation(prefName: PrefName): SharedPreferences {
return when (prefName.data.prefLocation) {
Location.General -> generalPreferences
Location.Anime -> animePreferences
Location.Manga -> mangaPreferences
Location.Player -> playerPreferences
Location.Reader -> readerPreferences
Location.Irrelevant -> irrelevantPreferences
Location.AnimeDownloads -> animeDownloadsPreferences
Location.Protected -> protectedPreferences
}!!
}
}

View file

@ -1,56 +1,153 @@
package ani.dantotsu.settings.saving
import android.graphics.Color
import ani.dantotsu.connections.mal.MAL
import ani.dantotsu.settings.saving.internal.Pref
import ani.dantotsu.settings.saving.internal.Location
enum class PrefName(val data: Pref) {
enum class PrefName(val data: Pref) { //TODO: Split this into multiple files
//General
SharedUserID(Pref(Location.General, Boolean::class)),
OfflineView(Pref(Location.General, Int::class)),
UseOLED(Pref(Location.General, Boolean::class)),
UseCustomTheme(Pref(Location.General, Boolean::class)),
CustomThemeInt(Pref(Location.General, Int::class)),
UseSourceTheme(Pref(Location.General, Boolean::class)),
UseMaterialYou(Pref(Location.General, Boolean::class)),
Theme(Pref(Location.General, String::class)),
DownloadManager(Pref(Location.General, Int::class)),
NSFWExtension(Pref(Location.General, Boolean::class)),
SkipExtensionIcons(Pref(Location.General, Boolean::class)),
SdDl(Pref(Location.General, Boolean::class)),
ContinueMedia(Pref(Location.General, Boolean::class)),
RecentlyListOnly(Pref(Location.General, Boolean::class)),
SettingsPreferDub(Pref(Location.General, Boolean::class)),
SubscriptionsTimeS(Pref(Location.General, Int::class)),
SubscriptionCheckingNotifications(Pref(Location.General, Boolean::class)),
CheckUpdate(Pref(Location.General, Boolean::class)),
SharedUserID(Pref(Location.General, Boolean::class, true)),
OfflineView(Pref(Location.General, Int::class, 0)),
DownloadManager(Pref(Location.General, Int::class, 0)),
NSFWExtension(Pref(Location.General, Boolean::class, false)),
SdDl(Pref(Location.General, Boolean::class, false)),
ContinueMedia(Pref(Location.General, Boolean::class, true)),
RecentlyListOnly(Pref(Location.General, Boolean::class, false)),
SettingsPreferDub(Pref(Location.General, Boolean::class, false)),
SubscriptionsTimeS(Pref(Location.General, Int::class, 0)),
SubscriptionCheckingNotifications(Pref(Location.General, Boolean::class, true)),
CheckUpdate(Pref(Location.General, Boolean::class, true)),
VerboseLogging(Pref(Location.General, Boolean::class, false)),
DohProvider(Pref(Location.General, Int::class, 0)),
DefaultUserAgent(Pref(Location.General, String::class, "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:110.0) Gecko/20100101 Firefox/110.0")),
//User Interface
UseOLED(Pref(Location.UI, Boolean::class, false)),
UseCustomTheme(Pref(Location.UI, Boolean::class, false)),
CustomThemeInt(Pref(Location.UI, Int::class, Color.parseColor("#6200EE"))),
UseSourceTheme(Pref(Location.UI, Boolean::class, false)),
UseMaterialYou(Pref(Location.UI, Boolean::class, false)),
Theme(Pref(Location.UI, String::class, "PURPLE")),
SkipExtensionIcons(Pref(Location.UI, Boolean::class, false)),
DarkMode(Pref(Location.UI, Boolean::class, true)),
ShowYtButton(Pref(Location.UI, Boolean::class, true)),
AnimeDefaultView(Pref(Location.UI, Int::class, 0)),
MangaDefaultView(Pref(Location.UI, Int::class, 0)),
ImmersiveMode(Pref(Location.UI, Boolean::class, false)),
SmallView(Pref(Location.UI, Boolean::class, true)),
DefaultStartUpTab(Pref(Location.UI, Int::class, 1)),
HomeLayoutShow(Pref(Location.UI, List::class, listOf(true, false, false, true, false, false, true))),
BannerAnimations(Pref(Location.UI, Boolean::class, true)),
LayoutAnimations(Pref(Location.UI, Boolean::class, true)),
AnimationSpeed(Pref(Location.UI, Float::class, 1f)),
ListGrid(Pref(Location.UI, Boolean::class, true)),
//Anime
AnimeListSortOrder(Pref(Location.Anime, String::class)),
PinnedAnimeSources(Pref(Location.Anime, Set::class)),
PopularAnimeList(Pref(Location.Anime, Boolean::class)),
AnimeSearchHistory(Pref(Location.Anime, Set::class)),
AnimeListSortOrder(Pref(Location.Anime, String::class, "score")),
PinnedAnimeSources(Pref(Location.Anime, Set::class, setOf<String>())),
PopularAnimeList(Pref(Location.Anime, Boolean::class, true)),
AnimeSearchHistory(Pref(Location.Anime, Set::class, setOf<String>())),
//Manga
MangaListSortOrder(Pref(Location.Manga, String::class)),
PinnedMangaSources(Pref(Location.Manga, Set::class)),
PopularMangaList(Pref(Location.Manga, Boolean::class)),
MangaSearchHistory(Pref(Location.Manga, Set::class)),
MangaListSortOrder(Pref(Location.Manga, String::class, "score")),
PinnedMangaSources(Pref(Location.Manga, Set::class, setOf<String>())),
PopularMangaList(Pref(Location.Manga, Boolean::class, true)),
MangaSearchHistory(Pref(Location.Manga, Set::class, setOf<String>())),
//Player
DefaultSpeed(Pref(Location.Player, Int::class, 5)),
CursedSpeeds(Pref(Location.Player, Boolean::class, false)),
Resize(Pref(Location.Player, Int::class, 0)),
Subtitles(Pref(Location.Player, Boolean::class, true)),
PrimaryColor(Pref(Location.Player, Int::class, 4)),
SecondaryColor(Pref(Location.Player, Int::class, 0)),
Outline(Pref(Location.Player, Int::class, 0)),
SubBackground(Pref(Location.Player, Int::class, 0)),
SubWindow(Pref(Location.Player, Int::class, 0)),
Font(Pref(Location.Player, Int::class, 0)),
FontSize(Pref(Location.Player, Int::class, 20)),
Locale(Pref(Location.Player, Int::class, 2)),
TimeStampsEnabled(Pref(Location.Player, Boolean::class, true)),
UseProxyForTimeStamps(Pref(Location.Player, Boolean::class, false)),
ShowTimeStampButton(Pref(Location.Player, Boolean::class, true)),
AutoSkipOPED(Pref(Location.Player, Boolean::class, false)),
AutoPlay(Pref(Location.Player, Boolean::class, true)),
AutoSkipFiller(Pref(Location.Player, Boolean::class, false)),
AskIndividualPlayer(Pref(Location.Player, Boolean::class, true)),
UpdateForHPlayer(Pref(Location.Player, Boolean::class, false)),
WatchPercentage(Pref(Location.Player, Float::class, 0.8f)),
AlwaysContinue(Pref(Location.Player, Boolean::class, true)),
FocusPause(Pref(Location.Player, Boolean::class, true)),
Gestures(Pref(Location.Player, Boolean::class, true)),
DoubleTap(Pref(Location.Player, Boolean::class, true)),
FastForward(Pref(Location.Player, Boolean::class, true)),
SeekTime(Pref(Location.Player, Int::class, 10)),
SkipTime(Pref(Location.Player, Int::class, 85)),
Cast(Pref(Location.Player, Boolean::class, true)),
Pip(Pref(Location.Player, Boolean::class, true)),
ContinueAnime(Pref(Location.Player, Set::class, setOf<Int>())),
//Reader
ShowSource(Pref(Location.Reader, Boolean::class, true)),
ShowSystemBars(Pref(Location.Reader, Boolean::class, false)),
AutoDetectWebtoon(Pref(Location.Reader, Boolean::class, true)),
AskIndividualReader(Pref(Location.Reader, Boolean::class, true)),
UpdateForHReader(Pref(Location.Reader, Boolean::class, false)),
Direction(Pref(Location.Reader, Int::class, 0)),
LayoutReader(Pref(Location.Reader, Int::class, 2)),
DualPageModeReader(Pref(Location.Reader, Int::class, 1)),
OverScrollMode(Pref(Location.Reader, Boolean::class, true)),
TrueColors(Pref(Location.Reader, Boolean::class, false)),
Rotation(Pref(Location.Reader, Boolean::class, true)),
Padding(Pref(Location.Reader, Boolean::class, true)),
HidePageNumbers(Pref(Location.Reader, Boolean::class, false)),
HorizontalScrollBar(Pref(Location.Reader, Boolean::class, true)),
KeepScreenOn(Pref(Location.Reader, Boolean::class, false)),
VolumeButtonsReader(Pref(Location.Reader, Boolean::class, false)),
WrapImages(Pref(Location.Reader, Boolean::class, false)),
LongClickImage(Pref(Location.Reader, Boolean::class, true)),
CropBorders(Pref(Location.Reader, Boolean::class, false)),
CropBorderThreshold(Pref(Location.Reader, Int::class, 10)),
//Novel Reader
CurrentThemeName(Pref(Location.NovelReader, String::class, "Default")),
LayoutNovel(Pref(Location.NovelReader, Int::class, 0)),
DualPageModeNovel(Pref(Location.NovelReader, Int::class, 1)),
LineHeight(Pref(Location.NovelReader, Float::class, 1.4f)),
Margin(Pref(Location.NovelReader, Float::class, 0.06f)),
Justify(Pref(Location.NovelReader, Boolean::class, true)),
Hyphenation(Pref(Location.NovelReader, Boolean::class, true)),
UseDarkThemeNovel(Pref(Location.NovelReader, Boolean::class, false)),
UseOledThemeNovel(Pref(Location.NovelReader, Boolean::class, false)),
Invert(Pref(Location.NovelReader, Boolean::class, false)),
MaxInlineSize(Pref(Location.NovelReader, Int::class, 720)),
MaxBlockSize(Pref(Location.NovelReader, Int::class, 1440)),
HorizontalScrollBarNovel(Pref(Location.NovelReader, Boolean::class, true)),
KeepScreenOnNovel(Pref(Location.NovelReader, Boolean::class, false)),
VolumeButtonsNovel(Pref(Location.NovelReader, Boolean::class, false)),
//Irrelevant
Incognito(Pref(Location.Irrelevant, Boolean::class)),
OfflineMode(Pref(Location.Irrelevant, Boolean::class)),
DownloadsKeys(Pref(Location.Irrelevant, String::class)),
NovelLastExtCheck(Pref(Location.Irrelevant, Long::class)),
SomethingSpecial(Pref(Location.Irrelevant, Boolean::class)),
AllowOpeningLinks(Pref(Location.Irrelevant, Boolean::class)),
SearchStyle(Pref(Location.Irrelevant, Int::class)),
HasUpdatedPrefs(Pref(Location.Irrelevant, Boolean::class)),
LangSort(Pref(Location.Irrelevant, String::class)),
Incognito(Pref(Location.Irrelevant, Boolean::class, false)),
OfflineMode(Pref(Location.Irrelevant, Boolean::class, false)),
DownloadsKeys(Pref(Location.Irrelevant, String::class, "")),
NovelLastExtCheck(Pref(Location.Irrelevant, Long::class, 0L)),
SomethingSpecial(Pref(Location.Irrelevant, Boolean::class, false)),
AllowOpeningLinks(Pref(Location.Irrelevant, Boolean::class, false)),
SearchStyle(Pref(Location.Irrelevant, Int::class, 0)),
HasUpdatedPrefs(Pref(Location.Irrelevant, Boolean::class, false)),
LangSort(Pref(Location.Irrelevant, String::class, "all")),
GenresList(Pref(Location.Irrelevant, Set::class, setOf<String>())),
TagsListIsAdult(Pref(Location.Irrelevant, Set::class, setOf<String>())),
TagsListNonAdult(Pref(Location.Irrelevant, Set::class, setOf<String>())),
MakeDefault(Pref(Location.Irrelevant, Boolean::class, true)),
//Protected
DiscordToken(Pref(Location.Protected, String::class)),
DiscordId(Pref(Location.Protected, String::class)),
DiscordUserName(Pref(Location.Protected, String::class)),
DiscordAvatar(Pref(Location.Protected, String::class)),
AnilistUserName(Pref(Location.Protected, String::class)),
DiscordToken(Pref(Location.Protected, String::class, "")),
DiscordId(Pref(Location.Protected, String::class, "")),
DiscordUserName(Pref(Location.Protected, String::class, "")),
DiscordAvatar(Pref(Location.Protected, String::class, "")),
AnilistUserName(Pref(Location.Protected, String::class, "")),
MALCodeChallenge(Pref(Location.Protected, String::class, "")),
MALToken(Pref(Location.Protected, MAL.ResponseToken::class, "")),
}

View file

@ -2,17 +2,17 @@ package ani.dantotsu.settings.saving.internal
import android.content.Context
import ani.dantotsu.settings.saving.PrefName
import ani.dantotsu.settings.saving.PrefWrapper
import ani.dantotsu.settings.saving.PrefManager
class Compat {
companion object {
fun importOldPrefs(context: Context) {
if (PrefWrapper.getVal(PrefName.HasUpdatedPrefs, false)) return
if (PrefManager.getVal(PrefName.HasUpdatedPrefs)) return
val oldPrefs = context.getSharedPreferences("downloads_pref", Context.MODE_PRIVATE)
val jsonString = oldPrefs.getString("downloads_key", null)
PrefWrapper.setVal(PrefName.DownloadsKeys, jsonString)
PrefManager.setVal(PrefName.DownloadsKeys, jsonString)
oldPrefs.edit().clear().apply()
PrefWrapper.setVal(PrefName.HasUpdatedPrefs, true)
PrefManager.setVal(PrefName.HasUpdatedPrefs, true)
}
}
}

View file

@ -5,14 +5,17 @@ import kotlin.reflect.KClass
data class Pref(
val prefLocation: Location,
val type: KClass<*>
val type: KClass<*>,
val default: Any
)
enum class Location(val location: String) {
General("ani.dantotsu.general"),
UI("ani.dantotsu.ui"),
Anime("ani.dantotsu.anime"),
Manga("ani.dantotsu.manga"),
Player("ani.dantotsu.player"),
Reader("ani.dantotsu.reader"),
NovelReader("ani.dantotsu.novelReader"),
Irrelevant("ani.dantotsu.irrelevant"),
AnimeDownloads("animeDownloads"), //different for legacy reasons
Protected("ani.dantotsu.protected")