import/export settings
This commit is contained in:
parent
b559a13bab
commit
49e90a27b8
97 changed files with 1721 additions and 1441 deletions
|
@ -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) {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 ->
|
||||
|
|
|
@ -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 ->
|
||||
|
|
|
@ -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 ->
|
||||
|
|
|
@ -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
|
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
|
@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
|
@ -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()
|
||||
}
|
||||
|
||||
|
|
|
@ -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>() {
|
||||
|
|
|
@ -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>() {
|
||||
|
|
|
@ -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>() {
|
||||
|
|
362
app/src/main/java/ani/dantotsu/settings/saving/PrefManager.kt
Normal file
362
app/src/main/java/ani/dantotsu/settings/saving/PrefManager.kt
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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
|
||||
}!!
|
||||
}
|
||||
}
|
|
@ -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, "")),
|
||||
}
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue