Use master-detals pattern for settings

pull/137/head
Koitharu 4 years ago
parent b916d4016e
commit 41fb351fe0
No known key found for this signature in database
GPG Key ID: 8E861F8CE6E7CE27

@ -6,14 +6,18 @@ import androidx.annotation.CallSuper
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.core.graphics.Insets import androidx.core.graphics.Insets
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.fragment.app.Fragment
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import org.koin.android.ext.android.inject import org.koin.android.ext.android.inject
import org.koitharu.kotatsu.base.ui.util.RecyclerViewOwner import org.koitharu.kotatsu.base.ui.util.RecyclerViewOwner
import org.koitharu.kotatsu.base.ui.util.WindowInsetsDelegate import org.koitharu.kotatsu.base.ui.util.WindowInsetsDelegate
import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.AppSettings
import org.koitharu.kotatsu.settings.SettingsActivity
import org.koitharu.kotatsu.settings.SettingsHeadersFragment
abstract class BasePreferenceFragment(@StringRes private val titleId: Int) : PreferenceFragmentCompat(), abstract class BasePreferenceFragment(@StringRes private val titleId: Int) :
PreferenceFragmentCompat(),
WindowInsetsDelegate.WindowInsetsListener, WindowInsetsDelegate.WindowInsetsListener,
RecyclerViewOwner { RecyclerViewOwner {
@ -39,16 +43,20 @@ abstract class BasePreferenceFragment(@StringRes private val titleId: Int) : Pre
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
if (titleId != 0) { if (titleId != 0) {
activity?.setTitle(titleId) setTitle(getString(titleId))
} }
} }
@CallSuper @CallSuper
override fun onWindowInsetsChanged(insets: Insets) { override fun onWindowInsetsChanged(insets: Insets) {
listView.updatePadding( listView.updatePadding(
left = insets.left,
right = insets.right,
bottom = insets.bottom bottom = insets.bottom
) )
} }
}
@Suppress("UsePropertyAccessSyntax")
protected fun setTitle(title: CharSequence) {
(parentFragment as? SettingsHeadersFragment)?.setTitle(title)
?: activity?.setTitle(title)
}
}

@ -253,11 +253,9 @@ class AppSettings(context: Context) {
const val KEY_APP_UPDATE = "app_update" const val KEY_APP_UPDATE = "app_update"
const val KEY_APP_UPDATE_AUTO = "app_update_auto" const val KEY_APP_UPDATE_AUTO = "app_update_auto"
const val KEY_APP_TRANSLATION = "about_app_translation" const val KEY_APP_TRANSLATION = "about_app_translation"
const val KEY_APP_GRATITUDES = "about_gratitudes"
const val KEY_FEEDBACK_4PDA = "about_feedback_4pda" const val KEY_FEEDBACK_4PDA = "about_feedback_4pda"
const val KEY_FEEDBACK_DISCORD = "about_feedback_discord" const val KEY_FEEDBACK_DISCORD = "about_feedback_discord"
const val KEY_FEEDBACK_GITHUB = "about_feedback_github" const val KEY_FEEDBACK_GITHUB = "about_feedback_github"
const val KEY_SUPPORT_DEVELOPER = "about_support_developer"
private const val NETWORK_NEVER = 0 private const val NETWORK_NEVER = 0
private const val NETWORK_ALWAYS = 1 private const val NETWORK_ALWAYS = 1

@ -17,6 +17,7 @@ import org.koitharu.kotatsu.main.ui.AppBarOwner
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.settings.* import org.koitharu.kotatsu.settings.*
@Deprecated("")
class SimpleSettingsActivity : BaseActivity<ActivitySettingsSimpleBinding>(), AppBarOwner { class SimpleSettingsActivity : BaseActivity<ActivitySettingsSimpleBinding>(), AppBarOwner {
override val appBar: AppBarLayout override val appBar: AppBarLayout
@ -36,7 +37,7 @@ class SimpleSettingsActivity : BaseActivity<ActivitySettingsSimpleBinding>(), Ap
ACTION_SOURCE -> SourceSettingsFragment.newInstance( ACTION_SOURCE -> SourceSettingsFragment.newInstance(
intent.getSerializableExtra(EXTRA_SOURCE) as? MangaSource ?: MangaSource.LOCAL intent.getSerializableExtra(EXTRA_SOURCE) as? MangaSource ?: MangaSource.LOCAL
) )
else -> MainSettingsFragment() else -> SettingsHeadersFragment()
} }
) )
} }

@ -0,0 +1,100 @@
package org.koitharu.kotatsu.settings
import android.content.Intent
import android.content.SharedPreferences
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatDelegate
import androidx.preference.ListPreference
import androidx.preference.Preference
import androidx.preference.TwoStatePreference
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.base.ui.BasePreferenceFragment
import org.koitharu.kotatsu.core.prefs.AppSettings
import org.koitharu.kotatsu.core.prefs.ListMode
import org.koitharu.kotatsu.settings.protect.ProtectSetupActivity
import org.koitharu.kotatsu.settings.utils.SliderPreference
import org.koitharu.kotatsu.utils.ext.names
import org.koitharu.kotatsu.utils.ext.setDefaultValueCompat
import java.util.*
class AppearanceSettingsFragment :
BasePreferenceFragment(R.string.appearance),
SharedPreferences.OnSharedPreferenceChangeListener {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.pref_appearance)
findPreference<SliderPreference>(AppSettings.KEY_GRID_SIZE)?.run {
summary = "%d%%".format(value)
setOnPreferenceChangeListener { preference, newValue ->
preference.summary = "%d%%".format(newValue)
true
}
}
preferenceScreen?.findPreference<ListPreference>(AppSettings.KEY_LIST_MODE)?.run {
entryValues = ListMode.values().names()
setDefaultValueCompat(ListMode.GRID.name)
}
findPreference<Preference>(AppSettings.KEY_DYNAMIC_THEME)?.isVisible = AppSettings.isDynamicColorAvailable
findPreference<ListPreference>(AppSettings.KEY_DATE_FORMAT)?.run {
entryValues = resources.getStringArray(R.array.date_formats)
val now = Date().time
entries = entryValues.map { value ->
val formattedDate = settings.getDateFormat(value.toString()).format(now)
if (value == "") {
"${context.getString(R.string.system_default)} ($formattedDate)"
} else {
formattedDate
}
}.toTypedArray()
setDefaultValueCompat("")
summary = "%s"
}
findPreference<TwoStatePreference>(AppSettings.KEY_PROTECT_APP)
?.isChecked = !settings.appPassword.isNullOrEmpty()
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
settings.subscribe(this)
}
override fun onDestroyView() {
settings.unsubscribe(this)
super.onDestroyView()
}
override fun onSharedPreferenceChanged(prefs: SharedPreferences?, key: String?) {
when (key) {
AppSettings.KEY_THEME -> {
AppCompatDelegate.setDefaultNightMode(settings.theme)
}
AppSettings.KEY_DYNAMIC_THEME -> {
findPreference<Preference>(key)?.setSummary(R.string.restart_required)
}
AppSettings.KEY_THEME_AMOLED -> {
findPreference<Preference>(key)?.setSummary(R.string.restart_required)
}
AppSettings.KEY_APP_PASSWORD -> {
findPreference<TwoStatePreference>(AppSettings.KEY_PROTECT_APP)
?.isChecked = !settings.appPassword.isNullOrEmpty()
}
}
}
override fun onPreferenceTreeClick(preference: Preference): Boolean {
return when (preference.key) {
AppSettings.KEY_PROTECT_APP -> {
val pref = (preference as? TwoStatePreference ?: return false)
if (pref.isChecked) {
pref.isChecked = false
startActivity(Intent(preference.context, ProtectSetupActivity::class.java))
} else {
settings.appPassword = null
}
true
}
else -> super.onPreferenceTreeClick(preference)
}
}
}

@ -0,0 +1,96 @@
package org.koitharu.kotatsu.settings
import android.content.SharedPreferences
import android.os.Bundle
import android.view.View
import androidx.preference.Preference
import java.io.File
import kotlinx.coroutines.launch
import org.koin.android.ext.android.inject
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.base.ui.BasePreferenceFragment
import org.koitharu.kotatsu.base.ui.dialog.StorageSelectDialog
import org.koitharu.kotatsu.core.prefs.AppSettings
import org.koitharu.kotatsu.local.data.LocalStorageManager
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.utils.ext.getStorageName
import org.koitharu.kotatsu.utils.ext.viewLifecycleScope
class ContentSettingsFragment :
BasePreferenceFragment(R.string.content),
SharedPreferences.OnSharedPreferenceChangeListener,
StorageSelectDialog.OnStorageSelectListener {
private val storageManager by inject<LocalStorageManager>()
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.pref_content)
findPreference<Preference>(AppSettings.KEY_SUGGESTIONS)?.setSummary(
if (settings.isSuggestionsEnabled) R.string.enabled else R.string.disabled
)
bindRemoteSourcesSummary()
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
findPreference<Preference>(AppSettings.KEY_LOCAL_STORAGE)?.bindStorageName()
settings.subscribe(this)
}
override fun onDestroyView() {
settings.unsubscribe(this)
super.onDestroyView()
}
override fun onSharedPreferenceChanged(prefs: SharedPreferences?, key: String?) {
when (key) {
AppSettings.KEY_LOCAL_STORAGE -> {
findPreference<Preference>(key)?.bindStorageName()
}
AppSettings.KEY_SUGGESTIONS -> {
findPreference<Preference>(AppSettings.KEY_SUGGESTIONS)?.setSummary(
if (settings.isSuggestionsEnabled) R.string.enabled else R.string.disabled
)
}
AppSettings.KEY_SOURCES_HIDDEN -> {
bindRemoteSourcesSummary()
}
}
}
override fun onPreferenceTreeClick(preference: Preference): Boolean {
return when (preference.key) {
AppSettings.KEY_LOCAL_STORAGE -> {
val ctx = context ?: return false
StorageSelectDialog.Builder(ctx, storageManager, this)
.setTitle(preference.title ?: "")
.setNegativeButton(android.R.string.cancel)
.create()
.show()
true
}
else -> super.onPreferenceTreeClick(preference)
}
}
override fun onStorageSelected(file: File) {
settings.mangaStorageDir = file
}
private fun Preference.bindStorageName() {
viewLifecycleScope.launch {
val storage = storageManager.getDefaultWriteableDir()
summary = storage?.getStorageName(context) ?: getString(R.string.not_available)
}
}
private fun bindRemoteSourcesSummary() {
findPreference<Preference>(AppSettings.KEY_REMOTE_SOURCES)?.run {
val total = MangaSource.values().size - 1
summary = getString(
R.string.enabled_d_of_d, total - settings.hiddenSources.size, total
)
}
}
}

@ -1,182 +0,0 @@
package org.koitharu.kotatsu.settings
import android.content.ComponentName
import android.content.Intent
import android.content.SharedPreferences
import android.os.Bundle
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import androidx.appcompat.app.AppCompatDelegate
import androidx.preference.ListPreference
import androidx.preference.Preference
import androidx.preference.PreferenceScreen
import androidx.preference.TwoStatePreference
import kotlinx.coroutines.launch
import org.koin.android.ext.android.inject
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.base.ui.BasePreferenceFragment
import org.koitharu.kotatsu.base.ui.dialog.StorageSelectDialog
import org.koitharu.kotatsu.core.prefs.AppSettings
import org.koitharu.kotatsu.core.prefs.ListMode
import org.koitharu.kotatsu.local.data.LocalStorageManager
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.settings.protect.ProtectSetupActivity
import org.koitharu.kotatsu.settings.utils.SliderPreference
import org.koitharu.kotatsu.utils.ext.getStorageName
import org.koitharu.kotatsu.utils.ext.names
import org.koitharu.kotatsu.utils.ext.setDefaultValueCompat
import org.koitharu.kotatsu.utils.ext.viewLifecycleScope
import java.io.File
import java.util.*
class MainSettingsFragment : BasePreferenceFragment(R.string.settings),
SharedPreferences.OnSharedPreferenceChangeListener,
StorageSelectDialog.OnStorageSelectListener {
private val storageManager by inject<LocalStorageManager>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.pref_main)
findPreference<SliderPreference>(AppSettings.KEY_GRID_SIZE)?.run {
summary = "%d%%".format(value)
setOnPreferenceChangeListener { preference, newValue ->
preference.summary = "%d%%".format(newValue)
true
}
}
preferenceScreen?.findPreference<ListPreference>(AppSettings.KEY_LIST_MODE)?.run {
entryValues = ListMode.values().names()
setDefaultValueCompat(ListMode.GRID.name)
}
findPreference<Preference>(AppSettings.KEY_DYNAMIC_THEME)?.isVisible =
AppSettings.isDynamicColorAvailable
findPreference<ListPreference>(AppSettings.KEY_DATE_FORMAT)?.run {
entryValues = resources.getStringArray(R.array.date_formats)
val now = Date().time
entries = entryValues.map { value ->
val formattedDate = settings.getDateFormat(value.toString()).format(now)
if (value == "") {
"${context.getString(R.string.system_default)} ($formattedDate)"
} else {
formattedDate
}
}.toTypedArray()
setDefaultValueCompat("")
summary = "%s"
}
findPreference<Preference>(AppSettings.KEY_SUGGESTIONS)?.setSummary(
if (settings.isSuggestionsEnabled) R.string.enabled else R.string.disabled
)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
findPreference<Preference>(AppSettings.KEY_LOCAL_STORAGE)?.bindStorageName()
findPreference<TwoStatePreference>(AppSettings.KEY_PROTECT_APP)?.isChecked =
!settings.appPassword.isNullOrEmpty()
settings.subscribe(this)
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
inflater.inflate(R.menu.opt_settings, menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.action_leaks -> {
val intent = Intent()
intent.component = ComponentName(requireContext(), "leakcanary.internal.activity.LeakActivity")
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
startActivity(intent)
true
}
else -> super.onOptionsItemSelected(item)
}
}
override fun onDestroyView() {
settings.unsubscribe(this)
super.onDestroyView()
}
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) {
when (key) {
AppSettings.KEY_THEME -> {
AppCompatDelegate.setDefaultNightMode(settings.theme)
}
AppSettings.KEY_DYNAMIC_THEME -> {
findPreference<Preference>(key)?.setSummary(R.string.restart_required)
}
AppSettings.KEY_THEME_AMOLED -> {
findPreference<Preference>(key)?.setSummary(R.string.restart_required)
}
AppSettings.KEY_LOCAL_STORAGE -> {
findPreference<Preference>(key)?.bindStorageName()
}
AppSettings.KEY_APP_PASSWORD -> {
findPreference<TwoStatePreference>(AppSettings.KEY_PROTECT_APP)
?.isChecked = !settings.appPassword.isNullOrEmpty()
}
AppSettings.KEY_SUGGESTIONS -> {
findPreference<Preference>(AppSettings.KEY_SUGGESTIONS)?.setSummary(
if (settings.isSuggestionsEnabled) R.string.enabled else R.string.disabled
)
}
}
}
override fun onResume() {
super.onResume()
findPreference<PreferenceScreen>(AppSettings.KEY_REMOTE_SOURCES)?.run {
val total = MangaSource.values().size - 1
summary = getString(
R.string.enabled_d_of_d, total - settings.hiddenSources.size, total
)
}
}
override fun onPreferenceTreeClick(preference: Preference): Boolean {
return when (preference.key) {
AppSettings.KEY_LOCAL_STORAGE -> {
val ctx = context ?: return false
StorageSelectDialog.Builder(ctx, storageManager, this)
.setTitle(preference.title ?: "")
.setNegativeButton(android.R.string.cancel)
.create()
.show()
true
}
AppSettings.KEY_PROTECT_APP -> {
val pref = (preference as? TwoStatePreference ?: return false)
if (pref.isChecked) {
pref.isChecked = false
startActivity(Intent(preference.context, ProtectSetupActivity::class.java))
} else {
settings.appPassword = null
}
true
}
else -> super.onPreferenceTreeClick(preference)
}
}
override fun onStorageSelected(file: File) {
settings.mangaStorageDir = file
}
private fun Preference.bindStorageName() {
viewLifecycleScope.launch {
val storage = storageManager.getDefaultWriteableDir()
summary = storage?.getStorageName(context) ?: getString(R.string.not_available)
}
}
}

@ -0,0 +1,12 @@
package org.koitharu.kotatsu.settings
import android.os.Bundle
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.base.ui.BasePreferenceFragment
class RootSettingsFragment : BasePreferenceFragment(R.string.settings) {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.pref_root)
}
}

@ -1,9 +1,13 @@
package org.koitharu.kotatsu.settings package org.koitharu.kotatsu.settings
import android.content.ComponentName
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import androidx.core.graphics.Insets import androidx.core.graphics.Insets
import androidx.core.view.updatePadding
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction import androidx.fragment.app.FragmentTransaction
@ -16,7 +20,6 @@ import org.koitharu.kotatsu.base.ui.BaseActivity
import org.koitharu.kotatsu.base.ui.util.RecyclerViewOwner import org.koitharu.kotatsu.base.ui.util.RecyclerViewOwner
import org.koitharu.kotatsu.databinding.ActivitySettingsBinding import org.koitharu.kotatsu.databinding.ActivitySettingsBinding
import org.koitharu.kotatsu.main.ui.AppBarOwner import org.koitharu.kotatsu.main.ui.AppBarOwner
import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.utils.ext.isScrolledToTop import org.koitharu.kotatsu.utils.ext.isScrolledToTop
class SettingsActivity : class SettingsActivity :
@ -35,7 +38,7 @@ class SettingsActivity :
if (supportFragmentManager.findFragmentById(R.id.container) == null) { if (supportFragmentManager.findFragmentById(R.id.container) == null) {
supportFragmentManager.commit { supportFragmentManager.commit {
replace(R.id.container, MainSettingsFragment()) replace(R.id.container, SettingsHeadersFragment())
} }
} }
} }
@ -55,6 +58,22 @@ class SettingsActivity :
super.onStop() super.onStop()
} }
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.opt_settings, menu)
return super.onCreateOptionsMenu(menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) {
R.id.action_leaks -> {
val intent = Intent()
intent.component = ComponentName(this, "leakcanary.internal.activity.LeakActivity")
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
startActivity(intent)
true
}
else -> super.onOptionsItemSelected(item)
}
override fun onBackStackChanged() { override fun onBackStackChanged() {
val fragment = supportFragmentManager.findFragmentById(R.id.container) as? RecyclerViewOwner ?: return val fragment = supportFragmentManager.findFragmentById(R.id.container) as? RecyclerViewOwner ?: return
val recyclerView = fragment.recyclerView val recyclerView = fragment.recyclerView
@ -70,30 +89,31 @@ class SettingsActivity :
val fm = supportFragmentManager val fm = supportFragmentManager
val fragment = fm.fragmentFactory.instantiate(classLoader, pref.fragment ?: return false) val fragment = fm.fragmentFactory.instantiate(classLoader, pref.fragment ?: return false)
fragment.arguments = pref.extras fragment.arguments = pref.extras
fragment.setTargetFragment(caller, 0) // fragment.setTargetFragment(caller, 0)
openFragment(fragment) openFragment(fragment)
return true return true
} }
fun openMangaSourceSettings(mangaSource: MangaSource) { override fun onWindowInsetsChanged(insets: Insets) {
openFragment(SourceSettingsFragment.newInstance(mangaSource)) binding.appbar.updatePadding(
left = insets.left,
right = insets.right,
)
binding.container.updatePadding(
left = insets.left,
right = insets.right,
)
} }
fun openNotificationSettingsLegacy() { fun openFragment(fragment: Fragment) {
openFragment(NotificationSettingsLegacyFragment())
}
private fun openFragment(fragment: Fragment) {
supportFragmentManager.commit { supportFragmentManager.commit {
setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
replace(R.id.container, fragment)
setReorderingAllowed(true) setReorderingAllowed(true)
replace(R.id.container, fragment)
setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
addToBackStack(null) addToBackStack(null)
} }
} }
override fun onWindowInsetsChanged(insets: Insets) = Unit
companion object { companion object {
fun newIntent(context: Context) = Intent(context, SettingsActivity::class.java) fun newIntent(context: Context) = Intent(context, SettingsActivity::class.java)

@ -0,0 +1,49 @@
package org.koitharu.kotatsu.settings
import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentTransaction
import androidx.fragment.app.commit
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceHeaderFragmentCompat
import androidx.slidingpanelayout.widget.SlidingPaneLayout
import org.koitharu.kotatsu.R
class SettingsHeadersFragment : PreferenceHeaderFragmentCompat(), SlidingPaneLayout.PanelSlideListener {
private var currentTitle: CharSequence? = null
override fun onCreatePreferenceHeader(): PreferenceFragmentCompat = RootSettingsFragment()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
slidingPaneLayout.addPanelSlideListener(this)
}
override fun onPanelSlide(panel: View, slideOffset: Float) = Unit
override fun onPanelOpened(panel: View) {
activity?.title = currentTitle ?: getString(R.string.settings)
}
override fun onPanelClosed(panel: View) {
activity?.setTitle(R.string.settings)
}
fun setTitle(title: CharSequence?) {
currentTitle = title
if (slidingPaneLayout.isSlideable && slidingPaneLayout.isOpen) {
activity?.title = title
}
}
fun openFragment(fragment: Fragment) {
childFragmentManager.commit {
setReorderingAllowed(true)
replace(androidx.preference.R.id.preferences_detail, fragment)
setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
addToBackStack(null)
}
}
}

@ -25,7 +25,7 @@ class SourceSettingsFragment : BasePreferenceFragment(0) {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
activity?.title = source.title setTitle(source.title)
} }
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {

@ -31,7 +31,6 @@ class TrackerSettingsFragment : BasePreferenceFragment(R.string.check_for_new_ch
append(getString(R.string.read_more)) append(getString(R.string.read_more))
} }
} }
warningPreference
} }
} }
@ -43,10 +42,10 @@ class TrackerSettingsFragment : BasePreferenceFragment(R.string.check_for_new_ch
.putExtra(Settings.EXTRA_APP_PACKAGE, requireContext().packageName) .putExtra(Settings.EXTRA_APP_PACKAGE, requireContext().packageName)
.putExtra(Settings.EXTRA_CHANNEL_ID, TrackWorker.CHANNEL_ID) .putExtra(Settings.EXTRA_CHANNEL_ID, TrackWorker.CHANNEL_ID)
startActivity(intent) startActivity(intent)
true
} else { } else {
(activity as? SettingsActivity)?.openNotificationSettingsLegacy() super.onPreferenceTreeClick(preference)
} }
true
} }
else -> super.onPreferenceTreeClick(preference) else -> super.onPreferenceTreeClick(preference)
} }

@ -1,13 +1,13 @@
package org.koitharu.kotatsu.settings.about package org.koitharu.kotatsu.settings.about
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.View import androidx.core.net.toUri
import androidx.preference.Preference import androidx.preference.Preference
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.BuildConfig
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.base.ui.BasePreferenceFragment import org.koitharu.kotatsu.base.ui.BasePreferenceFragment
import org.koitharu.kotatsu.browser.BrowserActivity
import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.prefs.AppSettings
import org.koitharu.kotatsu.settings.AppUpdateChecker import org.koitharu.kotatsu.settings.AppUpdateChecker
import org.koitharu.kotatsu.utils.ext.viewLifecycleScope import org.koitharu.kotatsu.utils.ext.viewLifecycleScope
@ -16,20 +16,16 @@ class AboutSettingsFragment : BasePreferenceFragment(R.string.about) {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.pref_about) addPreferencesFromResource(R.xml.pref_about)
} val isUpdateSupported = AppUpdateChecker.isUpdateSupported(requireContext())
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
findPreference<Preference>(AppSettings.KEY_APP_UPDATE_AUTO)?.run { findPreference<Preference>(AppSettings.KEY_APP_UPDATE_AUTO)?.run {
isVisible = AppUpdateChecker.isUpdateSupported(context) isVisible = isUpdateSupported
} }
findPreference<Preference>(AppSettings.KEY_APP_VERSION)?.run { findPreference<Preference>(AppSettings.KEY_APP_VERSION)?.run {
title = getString(R.string.app_version, BuildConfig.VERSION_NAME) title = getString(R.string.app_version, BuildConfig.VERSION_NAME)
isEnabled = AppUpdateChecker.isUpdateSupported(context) isEnabled = isUpdateSupported
} }
} }
override fun onPreferenceTreeClick(preference: Preference): Boolean { override fun onPreferenceTreeClick(preference: Preference): Boolean {
return when (preference.key) { return when (preference.key) {
AppSettings.KEY_APP_VERSION -> { AppSettings.KEY_APP_VERSION -> {
@ -37,39 +33,19 @@ class AboutSettingsFragment : BasePreferenceFragment(R.string.about) {
true true
} }
AppSettings.KEY_APP_TRANSLATION -> { AppSettings.KEY_APP_TRANSLATION -> {
startActivity(context?.let { BrowserActivity.newIntent(it, openLink(getString(R.string.url_weblate), preference.title)
"https://hosted.weblate.org/engage/kotatsu",
resources.getString(R.string.about_app_translation)) })
true true
} }
AppSettings.KEY_FEEDBACK_4PDA -> { AppSettings.KEY_FEEDBACK_4PDA -> {
startActivity(context?.let { BrowserActivity.newIntent(it, openLink(getString(R.string.url_forpda), preference.title)
"https://4pda.to/forum/index.php?showtopic=697669",
resources.getString(R.string.about_feedback_4pda)) })
true true
} }
AppSettings.KEY_FEEDBACK_DISCORD -> { AppSettings.KEY_FEEDBACK_DISCORD -> {
startActivity(context?.let { BrowserActivity.newIntent(it, openLink(getString(R.string.url_discord), preference.title)
"https://discord.gg/NNJ5RgVBC5",
"Discord") })
true true
} }
AppSettings.KEY_FEEDBACK_GITHUB -> { AppSettings.KEY_FEEDBACK_GITHUB -> {
startActivity(context?.let { BrowserActivity.newIntent(it, openLink(getString(R.string.url_github_issues), preference.title)
"https://github.com/nv95/Kotatsu/issues",
"GitHub") })
true
}
AppSettings.KEY_SUPPORT_DEVELOPER -> {
startActivity(context?.let { BrowserActivity.newIntent(it,
"https://yoomoney.ru/to/410012543938752",
resources.getString(R.string.about_support_developer)) })
true
}
AppSettings.KEY_APP_GRATITUDES -> {
startActivity(context?.let { BrowserActivity.newIntent(it,
"https://github.com/nv95/Kotatsu/graphs/contributors",
resources.getString(R.string.about_gratitudes)) })
true true
} }
else -> super.onPreferenceTreeClick(preference) else -> super.onPreferenceTreeClick(preference)
@ -95,4 +71,16 @@ class AboutSettingsFragment : BasePreferenceFragment(R.string.about) {
} }
} }
} }
}
private fun openLink(url: String, title: CharSequence?) {
val intent = Intent(Intent.ACTION_VIEW)
intent.data = url.toUri()
startActivity(
if (title != null) {
Intent.createChooser(intent, title)
} else {
intent
}
)
}
}

@ -1,41 +0,0 @@
package org.koitharu.kotatsu.settings.about
import android.os.Bundle
import android.text.SpannableStringBuilder
import android.text.method.LinkMovementMethod
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.graphics.Insets
import androidx.core.text.HtmlCompat
import androidx.core.text.parseAsHtml
import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.base.ui.BaseFragment
import org.koitharu.kotatsu.databinding.FragmentCopyrightBinding
class LicenseFragment : BaseFragment<FragmentCopyrightBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.textView.apply {
text =
SpannableStringBuilder(resources.openRawResource(R.raw.copyright).bufferedReader()
.readText()
.parseAsHtml(HtmlCompat.FROM_HTML_SEPARATOR_LINE_BREAK_LIST))
movementMethod = LinkMovementMethod.getInstance()
}
}
override fun onInflateView(
inflater: LayoutInflater,
container: ViewGroup?
) = FragmentCopyrightBinding.inflate(inflater, container, false)
override fun onResume() {
super.onResume()
activity?.setTitle(R.string.about_license)
}
override fun onWindowInsetsChanged(insets: Insets) = Unit
}

@ -15,6 +15,8 @@ import org.koitharu.kotatsu.base.ui.util.RecyclerViewOwner
import org.koitharu.kotatsu.databinding.FragmentSettingsSourcesBinding import org.koitharu.kotatsu.databinding.FragmentSettingsSourcesBinding
import org.koitharu.kotatsu.main.ui.AppBarOwner import org.koitharu.kotatsu.main.ui.AppBarOwner
import org.koitharu.kotatsu.settings.SettingsActivity import org.koitharu.kotatsu.settings.SettingsActivity
import org.koitharu.kotatsu.settings.SettingsHeadersFragment
import org.koitharu.kotatsu.settings.SourceSettingsFragment
import org.koitharu.kotatsu.settings.sources.adapter.SourceConfigAdapter import org.koitharu.kotatsu.settings.sources.adapter.SourceConfigAdapter
import org.koitharu.kotatsu.settings.sources.adapter.SourceConfigListener import org.koitharu.kotatsu.settings.sources.adapter.SourceConfigListener
import org.koitharu.kotatsu.settings.sources.model.SourceConfigItem import org.koitharu.kotatsu.settings.sources.model.SourceConfigItem
@ -87,7 +89,9 @@ class SourcesSettingsFragment : BaseFragment<FragmentSettingsSourcesBinding>(),
} }
override fun onItemSettingsClick(item: SourceConfigItem.SourceItem) { override fun onItemSettingsClick(item: SourceConfigItem.SourceItem) {
(activity as? SettingsActivity)?.openMangaSourceSettings(item.source) val fragment = SourceSettingsFragment.newInstance(item.source)
(parentFragment as? SettingsHeadersFragment)?.openFragment(fragment)
?: (activity as? SettingsActivity)?.openFragment(fragment)
} }
override fun onItemEnabledChanged(item: SourceConfigItem.SourceItem, isEnabled: Boolean) { override fun onItemEnabledChanged(item: SourceConfigItem.SourceItem, isEnabled: Boolean) {

@ -30,18 +30,22 @@ class SliderPreference @JvmOverloads constructor(
set(value) = setValueInternal(value, notifyChanged = true) set(value) = setValueInternal(value, notifyChanged = true)
private val sliderListener = Slider.OnChangeListener { _, value, fromUser -> private val sliderListener = Slider.OnChangeListener { _, value, fromUser ->
if (fromUser) { if (fromUser) {
syncValueInternal(value.toInt()) syncValueInternal(value.toInt())
}
} }
}
init { init {
context.withStyledAttributes(attrs, context.withStyledAttributes(
attrs,
R.styleable.SliderPreference, R.styleable.SliderPreference,
defStyleAttr, defStyleAttr,
defStyleRes) { defStyleRes
valueFrom = getFloat(R.styleable.SliderPreference_android_valueFrom, ) {
valueFrom.toFloat()).toInt() valueFrom = getFloat(
R.styleable.SliderPreference_android_valueFrom,
valueFrom.toFloat()
).toInt()
valueTo = valueTo =
getFloat(R.styleable.SliderPreference_android_valueTo, valueTo.toFloat()).toInt() getFloat(R.styleable.SliderPreference_android_valueTo, valueTo.toFloat()).toInt()
stepSize = stepSize =

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#000"
android:pathData="M12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2C17.5,2 22,6 22,11A6,6 0 0,1 16,17H14.2C13.9,17 13.7,17.2 13.7,17.5C13.7,17.6 13.8,17.7 13.8,17.8C14.2,18.3 14.4,18.9 14.4,19.5C14.5,20.9 13.4,22 12,22M12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20C12.3,20 12.5,19.8 12.5,19.5C12.5,19.3 12.4,19.2 12.4,19.1C12,18.6 11.8,18.1 11.8,17.5C11.8,16.1 12.9,15 14.3,15H16A4,4 0 0,0 20,11C20,7.1 16.4,4 12,4M6.5,10C7.3,10 8,10.7 8,11.5C8,12.3 7.3,13 6.5,13C5.7,13 5,12.3 5,11.5C5,10.7 5.7,10 6.5,10M9.5,6C10.3,6 11,6.7 11,7.5C11,8.3 10.3,9 9.5,9C8.7,9 8,8.3 8,7.5C8,6.7 8.7,6 9.5,6M14.5,6C15.3,6 16,6.7 16,7.5C16,8.3 15.3,9 14.5,9C13.7,9 13,8.3 13,7.5C13,6.7 13.7,6 14.5,6M17.5,10C18.3,10 19,10.7 19,11.5C19,12.3 18.3,13 17.5,13C16.7,13 16,12.3 16,11.5C16,10.7 16.7,10 17.5,10Z" />
</vector>

@ -1,16 +0,0 @@
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/colorControlNormal"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M3.333 11.965a8.632 8.632 0 1 1 17.264 0 8.632 8.632 0 1 1-17.264 0"
android:strokeWidth="2"
android:strokeColor="@android:color/white" />
<path
android:fillColor="@android:color/white"
android:pathData="M6.889 10.777h2.453a2.81 2.87 0 1 1 0 2.393H6.89a5.15 5.263 0 1 0 0-2.392z"
android:strokeWidth="1" />
</vector>

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout <LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -8,12 +8,14 @@
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar" android:id="@+id/appbar"
android:layout_width="0dp" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
app:elevation="@dimen/design_appbar_elevation"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent"
app:liftOnScroll="false">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@id/toolbar" android:id="@id/toolbar"
@ -22,23 +24,9 @@
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<com.google.android.material.card.MaterialCardView <androidx.fragment.app.FragmentContainerView
style="?materialCardViewOutlinedStyle" android:id="@id/container"
android:layout_width="0dp" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="match_parent" />
android:layout_marginTop="12dp"
android:layout_marginBottom="12dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/appbar"
app:layout_constraintWidth_percent="0.6">
<androidx.fragment.app.FragmentContainerView
android:id="@id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</com.google.android.material.card.MaterialCardView>
</androidx.constraintlayout.widget.ConstraintLayout> </LinearLayout>

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:textIsSelectable="true" />
</ScrollView>

@ -1,24 +0,0 @@
<p><a href="https://github.com/nv95/Kotatsu">Kotatsu</a> is a free and open source manga reader for Android.</p>
<p>Copyright (C) 2020 by Koitharu</p>
<p>This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.</p>
<p>This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.</p>
<p>You should have received a copy of the GNU General Public License
along with this program. If not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.</p>
<h3>Open Source Licenses</h3>
<ul>
<li>AOSP: <a href="https://source.android.com/setup/start/licenses">APL 2.0</a></li>
<li>OkHttp: <a href="https://github.com/square/okhttp/blob/master/LICENSE.txt">APL 2.0</a></li>
<li>Okio: <a href="https://github.com/square/okio/blob/master/LICENSE.txt">APL 2.0</a></li>
<li>jsoup: <a href="https://github.com/jhy/jsoup/blob/master/LICENSE">MIT</a></li>
<li>AdapterDelegates: <a href="https://github.com/sockeqwe/AdapterDelegates/blob/master/LICENSE">APL 2.0</a></li>
<li>Koin: <a href="https://github.com/InsertKoinIO/koin/blob/master/LICENSE">APL 2.0</a></li>
<li>Coil: <a href="https://github.com/coil-kt/coil/blob/main/LICENSE.txt">APL 2.0</a></li>
<li>Subsampling Scale Image View: <a href="https://github.com/davemorrissey/subsampling-scale-image-view/blob/master/LICENSE">APL 2.0</a></li>
<li>Disk LRU Cache: <a href="https://github.com/solkin/disk-lru-cache/blob/master/LICENSE">MIT</a></li>
</ul>

@ -217,13 +217,7 @@
<string name="chapter_is_missing_text">Гэтая глава адсутнічае на вашай прыладзе. Спампуйце ціпрачытайце яе онлайн.</string> <string name="chapter_is_missing_text">Гэтая глава адсутнічае на вашай прыладзе. Спампуйце ціпрачытайце яе онлайн.</string>
<string name="text_downloads_holder">На дадзены момант няма актыўных спамповак</string> <string name="text_downloads_holder">На дадзены момант няма актыўных спамповак</string>
<string name="queued">У чарзе</string> <string name="queued">У чарзе</string>
<string name="about_license">Ліцэнзія</string> <string name="about_feedback_4pda">Тэма на 4PDA</string>
<string name="about_copyright_and_licenses">Аўтарскія правы і ліцэнзіі</string>
<string name="about_gratitudes_summary">Гэтыя людзі робяць Kotatsu лепш</string>
<string name="about_gratitudes">Падзякі</string>
<string name="about_support_developer_summary">Калі вам падабаецца гэтая праграма, вы можаце дапамагчы фінансава з дапамогай ЮMoney (был. Яндекс.Деньги)</string>
<string name="about_support_developer">Падтрымаць распрацоўшчыка</string>
<string name="about_feedback_4pda">Тэма на 4PDA</string>
<string name="about_feedback">Зваротная сувязь</string> <string name="about_feedback">Зваротная сувязь</string>
<string name="about_app_translation_summary">Дапамагчы з перакладам праграмы</string> <string name="about_app_translation_summary">Дапамагчы з перакладам праграмы</string>
<string name="about_app_translation">Пераклад</string> <string name="about_app_translation">Пераклад</string>

@ -217,13 +217,7 @@
<string name="chapter_is_missing_text">Dieses Kapitel fehlt auf deinem Gerät. Lade ihn herunter oder lese ihn online.</string> <string name="chapter_is_missing_text">Dieses Kapitel fehlt auf deinem Gerät. Lade ihn herunter oder lese ihn online.</string>
<string name="text_downloads_holder">Zurzeit sind keine aktiven Datenübertragungen vorhanden</string> <string name="text_downloads_holder">Zurzeit sind keine aktiven Datenübertragungen vorhanden</string>
<string name="queued">In Warteschlange</string> <string name="queued">In Warteschlange</string>
<string name="about_support_developer_summary">Wenn diese Anwendung dir gefällt, kannst du über Yoomoney (Yandex.Money) finanziell helfen</string> <string name="about_feedback_4pda">Thema auf 4PDA</string>
<string name="about_license">Lizenz</string>
<string name="about_copyright_and_licenses">Urheberrecht und Lizenzen</string>
<string name="about_gratitudes_summary">Diese Leute machen Kotatsu besser</string>
<string name="about_gratitudes">Danksagung</string>
<string name="about_support_developer">Den Entwickler unterstützen</string>
<string name="about_feedback_4pda">Thema auf 4PDA</string>
<string name="about_feedback">Rückmeldung</string> <string name="about_feedback">Rückmeldung</string>
<string name="about_app_translation">Übersetzung</string> <string name="about_app_translation">Übersetzung</string>
<string name="about_app_translation_summary">Diese Anwendung übersetzen</string> <string name="about_app_translation_summary">Diese Anwendung übersetzen</string>

@ -205,14 +205,8 @@
<string name="text_history_holder_secondary">Encuentra qué leer en el menú lateral.</string> <string name="text_history_holder_secondary">Encuentra qué leer en el menú lateral.</string>
<string name="text_history_holder_primary">Lo que leas se mostrará aquí</string> <string name="text_history_holder_primary">Lo que leas se mostrará aquí</string>
<string name="text_empty_holder_primary">Está un poco vacío aquí…</string> <string name="text_empty_holder_primary">Está un poco vacío aquí…</string>
<string name="about_gratitudes">Agradecimientos</string> <string name="search_only_on_s">Buscar sólo en %s</string>
<string name="about_support_developer_summary">Si te gusta esta aplicación, puedes ayudar económicamente a través de Yoomoney (ex. Yandex.Money)</string> <string name="chapter_is_missing">Falta un capítulo</string>
<string name="about_support_developer">Apoyar al desarrollador</string>
<string name="search_only_on_s">Buscar sólo en %s</string>
<string name="about_gratitudes_summary">Todas estas personas hicieron que Kotatsu fuera mejor</string>
<string name="about_license">Licencia</string>
<string name="about_copyright_and_licenses">Derechos de autor y licencias</string>
<string name="chapter_is_missing">Falta un capítulo</string>
<string name="about_app_translation_summary">Traducir esta aplicación</string> <string name="about_app_translation_summary">Traducir esta aplicación</string>
<string name="about_feedback">Comentarios</string> <string name="about_feedback">Comentarios</string>
<string name="about_app_translation">Traducción</string> <string name="about_app_translation">Traducción</string>

@ -4,13 +4,7 @@
<string name="genres">Tyylilajit</string> <string name="genres">Tyylilajit</string>
<string name="auth_not_supported_by">%s -valtuutusta ei tueta</string> <string name="auth_not_supported_by">%s -valtuutusta ei tueta</string>
<string name="auth_complete">Valtuutus valmis</string> <string name="auth_complete">Valtuutus valmis</string>
<string name="about_license">Lisenssi</string> <string name="about_feedback_4pda">Aihe 4PDA: ssa</string>
<string name="about_copyright_and_licenses">Tekijänoikeudet ja lisenssit</string>
<string name="about_gratitudes_summary">Nämä ihmiset tekevät Kotatsusta paremman</string>
<string name="about_gratitudes">Kiitokset</string>
<string name="about_support_developer_summary">Jos pidät tästä sovelluksesta, voit auttaa taloudellisesti Yoomoneyn (ent. Yandex.Money) kautta</string>
<string name="about_support_developer">Tue kehittäjää</string>
<string name="about_feedback_4pda">Aihe 4PDA: ssa</string>
<string name="about_feedback">Palaute</string> <string name="about_feedback">Palaute</string>
<string name="about_app_translation">Käännös</string> <string name="about_app_translation">Käännös</string>
<string name="about_app_translation_summary">Käännä tämä sovellus</string> <string name="about_app_translation_summary">Käännä tämä sovellus</string>

@ -217,13 +217,7 @@
<string name="chapter_is_missing_text">Téléchargez ou lisez ce chapitre manquant en ligne.</string> <string name="chapter_is_missing_text">Téléchargez ou lisez ce chapitre manquant en ligne.</string>
<string name="text_downloads_holder">Aucun téléchargement actif</string> <string name="text_downloads_holder">Aucun téléchargement actif</string>
<string name="queued">En file d\'attente</string> <string name="queued">En file d\'attente</string>
<string name="about_support_developer_summary">Si vous aimez cette application, vous pouvez envoyer de l\'argent via Yoomoney (ex. Yandex.Money)</string> <string name="about_feedback_4pda">Sujet sur 4PDA</string>
<string name="about_support_developer">Soutenir le concepteur</string>
<string name="about_license">Licence</string>
<string name="about_copyright_and_licenses">Droits d\'auteur et licences</string>
<string name="about_gratitudes_summary">Ces personnes ont toutes rendu Kotatsu meilleur</string>
<string name="about_gratitudes">Remerciements</string>
<string name="about_feedback_4pda">Sujet sur 4PDA</string>
<string name="about_feedback">Remarques</string> <string name="about_feedback">Remarques</string>
<string name="about_app_translation">Traduction</string> <string name="about_app_translation">Traduction</string>
<string name="about_app_translation_summary">Traduire cette application</string> <string name="about_app_translation_summary">Traduire cette application</string>

@ -217,13 +217,7 @@
<string name="chapter_is_missing_text">Questo capitolo manca sul tuo dispositivo. Scaricalo o leggilo in linea.</string> <string name="chapter_is_missing_text">Questo capitolo manca sul tuo dispositivo. Scaricalo o leggilo in linea.</string>
<string name="text_downloads_holder">Attualmente non ci sono scaricamenti attivi</string> <string name="text_downloads_holder">Attualmente non ci sono scaricamenti attivi</string>
<string name="queued">In coda</string> <string name="queued">In coda</string>
<string name="about_license">Licenza</string> <string name="about_feedback_4pda">Argomento su 4PDA</string>
<string name="about_copyright_and_licenses">Diritti d\'autore e licenze</string>
<string name="about_gratitudes_summary">Queste persone rendono Kotatsu migliore</string>
<string name="about_gratitudes">Ringraziamenti</string>
<string name="about_support_developer_summary">Se ti piace questa applicazione, puoi aiutare finanziariamente via Yoomoney (Yandex.Money)</string>
<string name="about_support_developer">Sostieni lo sviluppatore</string>
<string name="about_feedback_4pda">Argomento su 4PDA</string>
<string name="about_feedback">Commenti</string> <string name="about_feedback">Commenti</string>
<string name="about_app_translation">Traduzione</string> <string name="about_app_translation">Traduzione</string>
<string name="about_app_translation_summary">Traduci questa applicazione</string> <string name="about_app_translation_summary">Traduci questa applicazione</string>

@ -163,10 +163,7 @@
<string name="prefer_rtl_reader">右から左(←)の読書を好む</string> <string name="prefer_rtl_reader">右から左(←)の読書を好む</string>
<string name="about_feedback">フィードバック</string> <string name="about_feedback">フィードバック</string>
<string name="about_feedback_4pda">4PDAに関する話題</string> <string name="about_feedback_4pda">4PDAに関する話題</string>
<string name="about_support_developer">開発者をサポートします(Yoomoneyが開きます)</string> <string name="auth_complete">承認済み</string>
<string name="about_support_developer_summary">このアプリが気に入ったら、Yoomoney(Yandex.Moneyなど)から開発者をサポートできます</string>
<string name="about_license">ライセンス</string>
<string name="auth_complete">承認済み</string>
<string name="auth_not_supported_by">%sへのログインはサポートされていません</string> <string name="auth_not_supported_by">%sへのログインはサポートされていません</string>
<string name="state_finished">完成</string> <string name="state_finished">完成</string>
<string name="state_ongoing">進行中</string> <string name="state_ongoing">進行中</string>
@ -212,12 +209,10 @@
<string name="about_app_translation">このアプリを翻訳</string> <string name="about_app_translation">このアプリを翻訳</string>
<string name="data_restored_success">全てのデータが復元されました</string> <string name="data_restored_success">全てのデータが復元されました</string>
<string name="data_restored">復元</string> <string name="data_restored">復元</string>
<string name="about_gratitudes">感謝の気持ち</string> <string name="preparing_">準備中…</string>
<string name="preparing_">準備中…</string>
<string name="zoom_mode_keep_start">開始時に維持</string> <string name="zoom_mode_keep_start">開始時に維持</string>
<string name="backup_restore">バックアップと復元</string> <string name="backup_restore">バックアップと復元</string>
<string name="about_copyright_and_licenses">著作権とライセンス</string> <string name="reverse">リバース</string>
<string name="reverse">リバース</string>
<string name="reader_mode_hint">選択した構成はこの漫画のために記憶されます</string> <string name="reader_mode_hint">選択した構成はこの漫画のために記憶されます</string>
<string name="clear_cookies">クッキーを削除</string> <string name="clear_cookies">クッキーを削除</string>
<string name="report_github">GitHubでissueを作成する(GitHubのアカウントが必要です)</string> <string name="report_github">GitHubでissueを作成する(GitHubのアカウントが必要です)</string>
@ -235,8 +230,7 @@
<string name="scale_mode">スケールモード</string> <string name="scale_mode">スケールモード</string>
<string name="error_empty_name">名前を入力する必要があります</string> <string name="error_empty_name">名前を入力する必要があります</string>
<string name="today">今日</string> <string name="today">今日</string>
<string name="about_gratitudes_summary">この人達のお陰でKotatsuがより良くなりました</string> <string name="about_app_translation_summary">Kotatsuを翻訳する(Weblateのサイトに移動します)</string>
<string name="about_app_translation_summary">Kotatsuを翻訳する(Weblateのサイトに移動します)</string>
<string name="next">次のページ</string> <string name="next">次のページ</string>
<string name="silent">サイレント</string> <string name="silent">サイレント</string>
<string name="sign_in">サインイン</string> <string name="sign_in">サインイン</string>

@ -223,13 +223,7 @@
<string name="about_app_translation">Oversettelse</string> <string name="about_app_translation">Oversettelse</string>
<string name="about_feedback">Tilbakemelding</string> <string name="about_feedback">Tilbakemelding</string>
<string name="about_feedback_4pda">Emne på 4PDA</string> <string name="about_feedback_4pda">Emne på 4PDA</string>
<string name="about_support_developer">Støtt utvikleren</string> <string name="auth_complete">Identitetsbekreftet</string>
<string name="about_support_developer_summary">Hvis du liker programmet kan du kronerulle det på Yoomoney (tidligere Yandex.Money)</string>
<string name="about_gratitudes">Takk rettes til</string>
<string name="about_gratitudes_summary">Folk som gjorde Kotatsu enda bedre</string>
<string name="about_copyright_and_licenses">Opphavsrett og lisenser</string>
<string name="about_license">Lisens</string>
<string name="auth_complete">Identitetsbekreftet</string>
<string name="auth_not_supported_by">Innlogging på %s støttes ikke</string> <string name="auth_not_supported_by">Innlogging på %s støttes ikke</string>
<string name="text_clear_cookies_prompt">Du vil bli utlogget fra alle kilder</string> <string name="text_clear_cookies_prompt">Du vil bli utlogget fra alle kilder</string>
<string name="genres">Sjangere</string> <string name="genres">Sjangere</string>

@ -183,12 +183,7 @@
<string name="about_app_translation">Tradução</string> <string name="about_app_translation">Tradução</string>
<string name="about_feedback">Comentar</string> <string name="about_feedback">Comentar</string>
<string name="about_feedback_4pda">Tópico no 4PDA</string> <string name="about_feedback_4pda">Tópico no 4PDA</string>
<string name="about_support_developer">Apoie o desenvolvedor</string> <string name="auth_complete">Autorizado</string>
<string name="about_support_developer_summary">Se você gosta deste aplicativo, você pode enviar dinheiro através do Yoomoney (ex. Yandex.Money)</string>
<string name="about_gratitudes">Gratidão</string>
<string name="about_gratitudes_summary">Todas essas pessoas tornaram o Kotatsu melhor</string>
<string name="about_license">Licença</string>
<string name="auth_complete">Autorizado</string>
<string name="auth_not_supported_by">O login em %s não é suportado</string> <string name="auth_not_supported_by">O login em %s não é suportado</string>
<string name="text_clear_cookies_prompt">Você será desconectado de todas as fontes</string> <string name="text_clear_cookies_prompt">Você será desconectado de todas as fontes</string>
<string name="genres">Gêneros</string> <string name="genres">Gêneros</string>
@ -266,8 +261,7 @@
<string name="data_restored_with_errors">Os dados foram restaurados, mas há erros</string> <string name="data_restored_with_errors">Os dados foram restaurados, mas há erros</string>
<string name="report_github">Criar problema no GitHub</string> <string name="report_github">Criar problema no GitHub</string>
<string name="file_not_found">Arquivo não encontrado</string> <string name="file_not_found">Arquivo não encontrado</string>
<string name="about_copyright_and_licenses">Direitos autorais e licenças</string> <string name="search_chapters">Localizar capítulo</string>
<string name="search_chapters">Localizar capítulo</string>
<string name="chapters_empty">Não há capítulos neste mangá</string> <string name="chapters_empty">Não há capítulos neste mangá</string>
<string name="percent_string_pattern">%1$s%%</string> <string name="percent_string_pattern">%1$s%%</string>
</resources> </resources>

@ -185,13 +185,7 @@
<string name="about_app_translation_summary">Traduzir esta aplicação</string> <string name="about_app_translation_summary">Traduzir esta aplicação</string>
<string name="about_feedback">Comentar</string> <string name="about_feedback">Comentar</string>
<string name="about_feedback_4pda">Tópico no 4PDA</string> <string name="about_feedback_4pda">Tópico no 4PDA</string>
<string name="about_support_developer">Apoiar o desenvolvedor</string> <string name="chapter_is_missing_text">Baixe ou leia este capítulo perdido online.</string>
<string name="about_support_developer_summary">Se você gosta deste aplicativo, você pode enviar dinheiro através do Yoomoney (ex. Yandex.Money)</string>
<string name="about_gratitudes">Agradecimentos</string>
<string name="about_gratitudes_summary">Todas essas pessoas tornaram o Kotatsu melhor</string>
<string name="about_copyright_and_licenses">Direitos de autor e licenças</string>
<string name="about_license">Licença</string>
<string name="chapter_is_missing_text">Baixe ou leia este capítulo perdido online.</string>
<string name="chapter_is_missing">O capítulo está em falta</string> <string name="chapter_is_missing">O capítulo está em falta</string>
<string name="auth_complete">Autorizado</string> <string name="auth_complete">Autorizado</string>
<string name="auth_not_supported_by">O login em %s não é suportado</string> <string name="auth_not_supported_by">O login em %s não é suportado</string>

@ -220,13 +220,7 @@
<string name="about_app_translation">Перевод</string> <string name="about_app_translation">Перевод</string>
<string name="about_feedback_4pda">Тема на 4PDA</string> <string name="about_feedback_4pda">Тема на 4PDA</string>
<string name="about_feedback">Обратная связь</string> <string name="about_feedback">Обратная связь</string>
<string name="about_support_developer">Поддержать разработчика</string> <string name="auth_complete">Авторизация выполнена</string>
<string name="about_support_developer_summary">Если вам нравится это приложение, вы можете помочь финансово с помощью ЮMoney (бывш. Яндекс.Деньги)</string>
<string name="about_gratitudes">Благодарности</string>
<string name="about_gratitudes_summary">Все эти люди сделали Kotatsu лучше</string>
<string name="about_copyright_and_licenses">Авторские права и лицензии</string>
<string name="about_license">Лицензия</string>
<string name="auth_complete">Авторизация выполнена</string>
<string name="auth_not_supported_by">Вход в %s не поддерживается</string> <string name="auth_not_supported_by">Вход в %s не поддерживается</string>
<string name="text_clear_cookies_prompt">Вы выйдете из всех источников</string> <string name="text_clear_cookies_prompt">Вы выйдете из всех источников</string>
<string name="genres">Жанры</string> <string name="genres">Жанры</string>
@ -269,4 +263,6 @@
<string name="various_languages">Разные языки</string> <string name="various_languages">Разные языки</string>
<string name="search_chapters">Найти главу</string> <string name="search_chapters">Найти главу</string>
<string name="chapters_empty">В этой манге нет глав</string> <string name="chapters_empty">В этой манге нет глав</string>
<string name="appearance">Оформление</string>
<string name="content">Контент</string>
</resources> </resources>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<bool name="config_materialPreferenceIconSpaceReserved" tools:ignore="MissingDefaultResource,UnusedAttribute" tools:node="replace">
false
</bool>
</resources>

@ -131,8 +131,7 @@
<string name="restore_backup">Yedekten geri yükle</string> <string name="restore_backup">Yedekten geri yükle</string>
<string name="update">Güncelle</string> <string name="update">Güncelle</string>
<string name="sign_in">Oturum aç</string> <string name="sign_in">Oturum aç</string>
<string name="about_license">Lisans</string> <string name="state_finished">Bitti</string>
<string name="state_finished">Bitti</string>
<string name="about">Hakkında</string> <string name="about">Hakkında</string>
<string name="auth_required">Bu içeriği görüntülemek için oturum açın</string> <string name="auth_required">Bu içeriği görüntülemek için oturum açın</string>
<string name="confirm">Onayla</string> <string name="confirm">Onayla</string>
@ -185,9 +184,7 @@
<string name="about_app_translation">Çeviri</string> <string name="about_app_translation">Çeviri</string>
<string name="search_only_on_s">Yalnızca %s içinde ara</string> <string name="search_only_on_s">Yalnızca %s içinde ara</string>
<string name="about_feedback_4pda">4PDA\'daki konu</string> <string name="about_feedback_4pda">4PDA\'daki konu</string>
<string name="about_gratitudes">Teşekkürler</string> <string name="state_ongoing">Devam ediyor</string>
<string name="about_gratitudes_summary">Tüm bu insanlar Kotatsu\'yu daha iyi hale getirdi</string>
<string name="state_ongoing">Devam ediyor</string>
<string name="text_clear_cookies_prompt">Tüm kaynaklardaki oturumunuz kapatılacak</string> <string name="text_clear_cookies_prompt">Tüm kaynaklardaki oturumunuz kapatılacak</string>
<string name="enabled_sources">Kullanılan kaynaklar</string> <string name="enabled_sources">Kullanılan kaynaklar</string>
<string name="available_sources">Kullanılabilir kaynaklar</string> <string name="available_sources">Kullanılabilir kaynaklar</string>
@ -226,16 +223,13 @@
<string name="captcha_required">CAPTCHA gerekli</string> <string name="captcha_required">CAPTCHA gerekli</string>
<string name="cookies_cleared">Tüm çerezler kaldırıldı</string> <string name="cookies_cleared">Tüm çerezler kaldırıldı</string>
<string name="reader_mode_hint">Seçilen yapılandırma bu manga için hatırlanacak</string> <string name="reader_mode_hint">Seçilen yapılandırma bu manga için hatırlanacak</string>
<string name="about_support_developer_summary">Bu uygulamayı beğendiyseniz Yoomoney (eski Yandex.Money) üzerinden para gönderebilirsiniz</string> <string name="text_clear_updates_feed_prompt">Tüm güncelleme geçmişi kalıcı olarak silinsin mi\?</string>
<string name="text_clear_updates_feed_prompt">Tüm güncelleme geçmişi kalıcı olarak silinsin mi\?</string>
<string name="_and_x_more">…ve %1$d daha fazlası</string> <string name="_and_x_more">…ve %1$d daha fazlası</string>
<string name="protect_application_subtitle">Uygulamayı başlatmak için bir parola girin</string> <string name="protect_application_subtitle">Uygulamayı başlatmak için bir parola girin</string>
<string name="text_clear_search_history_prompt">Tüm son arama sorguları kalıcı olarak kaldırılsın mı\?</string> <string name="text_clear_search_history_prompt">Tüm son arama sorguları kalıcı olarak kaldırılsın mı\?</string>
<string name="about_feedback">Geri bildirim</string> <string name="about_feedback">Geri bildirim</string>
<string name="backup_saved">Yedek kaydedildi</string> <string name="backup_saved">Yedek kaydedildi</string>
<string name="about_support_developer">Geliştiriciyi destekleyin</string> <string name="genres">Türler</string>
<string name="about_copyright_and_licenses">Telif Hakkı ve Lisanslar</string>
<string name="genres">Türler</string>
<string name="date_format">Tarih biçimi</string> <string name="date_format">Tarih biçimi</string>
<string name="system_default">Öntanımlı</string> <string name="system_default">Öntanımlı</string>
<string name="error_empty_name">Bir ad girmelisiniz</string> <string name="error_empty_name">Bir ad girmelisiniz</string>

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources xmlns:tools="http://schemas.android.com/tools">
<bool name="is_tablet">false</bool> <bool name="is_tablet">false</bool>
<bool name="light_status_bar">true</bool> <bool name="light_status_bar">true</bool>
<bool name="light_navigation_bar">false</bool> <bool name="light_navigation_bar">false</bool>

@ -1,5 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="url_github_issues">https://github.com/nv95/Kotatsu/issues</string>
<string name="url_discord">https://discord.gg/NNJ5RgVBC5</string>
<string name="url_forpda">https://4pda.to/forum/index.php?showtopic=697669</string>
<string name="url_weblate">https://hosted.weblate.org/engage/kotatsu</string>
<string-array name="values_theme" translatable="false"> <string-array name="values_theme" translatable="false">
<item>-1</item> <item>-1</item>
<item>1</item> <item>1</item>

@ -222,13 +222,7 @@
<string name="about_app_translation">Translation</string> <string name="about_app_translation">Translation</string>
<string name="about_feedback">Feedback</string> <string name="about_feedback">Feedback</string>
<string name="about_feedback_4pda">Topic on 4PDA</string> <string name="about_feedback_4pda">Topic on 4PDA</string>
<string name="about_support_developer">Support the developer</string> <string name="auth_complete">Authorized</string>
<string name="about_support_developer_summary">If you like this app, you can send money through Yoomoney (ex. Yandex.Money)</string>
<string name="about_gratitudes">Gratitudes</string>
<string name="about_gratitudes_summary">These people all made Kotatsu better</string>
<string name="about_copyright_and_licenses">Copyright and Licenses</string>
<string name="about_license">License</string>
<string name="auth_complete">Authorized</string>
<string name="auth_not_supported_by">Logging in on %s is not supported</string> <string name="auth_not_supported_by">Logging in on %s is not supported</string>
<string name="text_clear_cookies_prompt">You will be logged out from all sources</string> <string name="text_clear_cookies_prompt">You will be logged out from all sources</string>
<string name="genres">Genres</string> <string name="genres">Genres</string>
@ -270,4 +264,8 @@
<string name="search_chapters">Find chapter</string> <string name="search_chapters">Find chapter</string>
<string name="chapters_empty">No chapters in this manga</string> <string name="chapters_empty">No chapters in this manga</string>
<string name="percent_string_pattern">%1$s%%</string> <string name="percent_string_pattern">%1$s%%</string>
<string name="appearance">Appearance</string>
<string name="content">Content</string>
<string name="github" translatable="false">GitHub</string>
<string name="discord" translatable="false">Discord</string>
</resources> </resources>

@ -1,4 +1,4 @@
<resources> <resources xmlns:tools="http://schemas.android.com/tools">
<!--Toolbars--> <!--Toolbars-->

@ -1,84 +1,44 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen <PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android">
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
app:initialExpandedChildrenCount="5">
<PreferenceCategory <PreferenceCategory android:title="@string/app_name">
app:iconSpaceReserved="false"
app:title="@string/app_name">
<Preference <Preference
app:iconSpaceReserved="false" android:key="app_version"
app:key="app_version" android:persistent="false"
app:persistent="false" android:summary="@string/check_for_updates" />
app:summary="@string/check_for_updates" />
<SwitchPreferenceCompat <SwitchPreferenceCompat
app:defaultValue="true" android:defaultValue="true"
app:iconSpaceReserved="false" android:key="app_update_auto"
app:isPreferenceVisible="false" android:summary="@string/show_notification_app_update"
app:key="app_update_auto" android:title="@string/application_update" />
app:summary="@string/show_notification_app_update"
app:title="@string/application_update"
tools:isPreferenceVisible="true" />
<Preference
app:iconSpaceReserved="false"
app:key="about_app_translation"
app:summary="@string/about_app_translation_summary"
app:title="@string/about_app_translation" />
<Preference
app:iconSpaceReserved="false"
app:key="about_support_developer"
app:summary="@string/about_support_developer_summary"
app:title="@string/about_support_developer" />
<Preference
app:iconSpaceReserved="false"
app:key="about_gratitudes"
app:summary="@string/about_gratitudes_summary"
app:title="@string/about_gratitudes" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory <PreferenceCategory android:title="@string/about_feedback">
app:iconSpaceReserved="false"
app:title="@string/about_feedback">
<Preference <Preference
app:iconSpaceReserved="false" android:key="about_feedback_github"
app:key="about_feedback_4pda" android:persistent="false"
app:summary="https://4pda.to/forum/index.php?showtopic=697669" android:summary="@string/url_github_issues"
app:title="@string/about_feedback_4pda" /> android:title="@string/github" />
<Preference <Preference
app:iconSpaceReserved="false" android:key="about_feedback_4pda"
app:key="about_feedback_discord" android:summary="@string/url_forpda"
app:summary="https://discord.gg/NNJ5RgVBC5" android:title="@string/about_feedback_4pda" />
app:title="Discord" />
<Preference <Preference
app:iconSpaceReserved="false" android:key="about_feedback_discord"
app:key="about_feedback_github" android:summary="@string/url_discord"
app:summary="https://github.com/nv95/Kotatsu/issues" android:title="@string/discord" />
app:title="GitHub" />
</PreferenceCategory>
<PreferenceCategory
app:iconSpaceReserved="false"
app:key="copyright"
app:title="@string/about_copyright_and_licenses">
<Preference <Preference
android:fragment="org.koitharu.kotatsu.settings.about.LicenseFragment" android:key="about_app_translation"
app:icon="@drawable/ic_copyleft" android:summary="@string/about_app_translation_summary"
app:iconSpaceReserved="false" android:title="@string/about_app_translation" />
app:key="about_license"
app:title="@string/about_license" />
</PreferenceCategory> </PreferenceCategory>

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<ListPreference
android:defaultValue="-1"
android:entries="@array/themes"
android:entryValues="@array/values_theme"
android:key="theme"
android:title="@string/theme"
app:useSimpleSummaryProvider="true" />
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="dynamic_theme"
android:summary="@string/dynamic_theme_summary"
android:title="@string/dynamic_theme"
app:isPreferenceVisible="false" />
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="amoled_theme"
android:summary="@string/black_dark_theme_summary"
android:title="@string/black_dark_theme" />
<ListPreference
android:key="date_format"
android:title="@string/date_format" />
<ListPreference
android:entries="@array/list_modes"
android:key="list_mode_2"
android:title="@string/list_mode"
app:allowDividerAbove="true"
app:useSimpleSummaryProvider="true" />
<org.koitharu.kotatsu.settings.utils.SliderPreference
android:key="grid_size"
android:stepSize="5"
android:title="@string/grid_size"
android:valueFrom="50"
android:valueTo="150"
app:defaultValue="100" />
<SwitchPreferenceCompat
android:key="protect_app"
android:persistent="false"
android:summary="@string/protect_application_summary"
android:title="@string/protect_application"
app:allowDividerAbove="true" />
</PreferenceScreen>

@ -6,14 +6,12 @@
<Preference <Preference
android:key="backup" android:key="backup"
android:persistent="false" android:persistent="false"
android:title="@string/create_backup" android:title="@string/create_backup" />
app:iconSpaceReserved="false" />
<Preference <Preference
android:key="restore" android:key="restore"
android:persistent="false" android:persistent="false"
android:title="@string/restore_backup" android:title="@string/restore_backup" />
app:iconSpaceReserved="false" />
<Preference <Preference
android:icon="@drawable/ic_info_outline" android:icon="@drawable/ic_info_outline"

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceScreen
android:fragment="org.koitharu.kotatsu.settings.sources.SourcesSettingsFragment"
android:key="remote_sources"
android:title="@string/remote_sources" />
<Preference
android:key="local_storage"
android:persistent="false"
android:title="@string/manga_save_location" />
<PreferenceScreen
android:fragment="org.koitharu.kotatsu.settings.SuggestionsSettingsFragment"
android:key="suggestions"
android:persistent="false"
android:title="@string/suggestions" />
<PreferenceScreen
android:fragment="org.koitharu.kotatsu.settings.backup.BackupSettingsFragment"
android:title="@string/backup_restore"
app:allowDividerAbove="true" />
</PreferenceScreen>

@ -1,51 +1,42 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen <PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android">
xmlns:app="http://schemas.android.com/apk/res-auto">
<Preference <Preference
android:key="search_history_clear" android:key="search_history_clear"
android:persistent="false" android:persistent="false"
android:summary="@string/loading_" android:summary="@string/loading_"
android:title="@string/clear_search_history" android:title="@string/clear_search_history" />
app:iconSpaceReserved="false" />
<Preference <Preference
android:key="updates_feed_clear" android:key="updates_feed_clear"
android:persistent="false" android:persistent="false"
android:summary="@string/loading_" android:summary="@string/loading_"
android:title="@string/clear_updates_feed" android:title="@string/clear_updates_feed" />
app:iconSpaceReserved="false" />
<SwitchPreferenceCompat <SwitchPreferenceCompat
android:key="history_exclude_nsfw" android:key="history_exclude_nsfw"
android:title="@string/exclude_nsfw_from_history" android:title="@string/exclude_nsfw_from_history" />
app:iconSpaceReserved="false" />
<PreferenceCategory <PreferenceCategory android:title="@string/cache">
android:title="@string/cache"
app:iconSpaceReserved="false">
<Preference <Preference
android:key="thumbs_cache_clear" android:key="thumbs_cache_clear"
android:persistent="false" android:persistent="false"
android:summary="@string/computing_" android:summary="@string/computing_"
android:title="@string/clear_thumbs_cache" android:title="@string/clear_thumbs_cache" />
app:iconSpaceReserved="false" />
<Preference <Preference
android:key="pages_cache_clear" android:key="pages_cache_clear"
android:persistent="false" android:persistent="false"
android:summary="@string/computing_" android:summary="@string/computing_"
android:title="@string/clear_pages_cache" android:title="@string/clear_pages_cache" />
app:iconSpaceReserved="false" />
</PreferenceCategory> </PreferenceCategory>
<Preference <Preference
android:key="cookies_clear" android:key="cookies_clear"
android:persistent="false" android:persistent="false"
android:title="@string/clear_cookies" android:title="@string/clear_cookies" />
app:iconSpaceReserved="false" />
</PreferenceScreen> </PreferenceScreen>

@ -1,102 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<ListPreference
android:defaultValue="-1"
android:entries="@array/themes"
android:entryValues="@array/values_theme"
android:key="theme"
android:title="@string/theme"
app:iconSpaceReserved="false"
app:useSimpleSummaryProvider="true" />
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="dynamic_theme"
android:summary="@string/dynamic_theme_summary"
android:title="@string/dynamic_theme"
app:iconSpaceReserved="false" />
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="amoled_theme"
android:summary="@string/black_dark_theme_summary"
android:title="@string/black_dark_theme"
app:iconSpaceReserved="false" />
<ListPreference
android:key="date_format"
android:title="@string/date_format"
app:iconSpaceReserved="false" />
<ListPreference
android:entries="@array/list_modes"
android:key="list_mode_2"
android:title="@string/list_mode"
app:allowDividerAbove="true"
app:iconSpaceReserved="false"
app:useSimpleSummaryProvider="true" />
<org.koitharu.kotatsu.settings.utils.SliderPreference
android:key="grid_size"
android:stepSize="5"
android:title="@string/grid_size"
android:valueFrom="50"
android:valueTo="150"
app:defaultValue="100"
app:iconSpaceReserved="false" />
<PreferenceScreen
android:fragment="org.koitharu.kotatsu.settings.sources.SourcesSettingsFragment"
android:key="remote_sources"
android:title="@string/remote_sources"
app:allowDividerAbove="true"
app:iconSpaceReserved="false" />
<PreferenceScreen
android:fragment="org.koitharu.kotatsu.settings.SuggestionsSettingsFragment"
android:key="suggestions"
android:persistent="false"
android:title="@string/suggestions"
app:iconSpaceReserved="false" />
<Preference
android:key="local_storage"
android:title="@string/manga_save_location"
app:iconSpaceReserved="false" />
<PreferenceScreen
android:fragment="org.koitharu.kotatsu.settings.HistorySettingsFragment"
android:title="@string/history_and_cache"
app:iconSpaceReserved="false" />
<SwitchPreferenceCompat
android:key="protect_app"
android:persistent="false"
android:summary="@string/protect_application_summary"
android:title="@string/protect_application"
app:iconSpaceReserved="false" />
<PreferenceScreen
android:fragment="org.koitharu.kotatsu.settings.ReaderSettingsFragment"
android:title="@string/reader_settings"
app:iconSpaceReserved="false" />
<PreferenceScreen
android:fragment="org.koitharu.kotatsu.settings.TrackerSettingsFragment"
android:title="@string/check_for_new_chapters"
app:iconSpaceReserved="false" />
<PreferenceScreen
android:fragment="org.koitharu.kotatsu.settings.backup.BackupSettingsFragment"
android:title="@string/backup_restore"
app:iconSpaceReserved="false" />
<PreferenceScreen
android:fragment="org.koitharu.kotatsu.settings.about.AboutSettingsFragment"
android:title="@string/about"
app:iconSpaceReserved="false" />
</PreferenceScreen>

@ -1,23 +1,19 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen <PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android">
xmlns:app="http://schemas.android.com/apk/res-auto">
<Preference <Preference
android:key="notifications_sound" android:key="notifications_sound"
android:title="@string/notification_sound" android:title="@string/notification_sound" />
app:iconSpaceReserved="false" />
<CheckBoxPreference <CheckBoxPreference
android:defaultValue="false" android:defaultValue="false"
android:key="notifications_vibrate" android:key="notifications_vibrate"
android:title="@string/vibration" android:title="@string/vibration" />
app:iconSpaceReserved="false" />
<CheckBoxPreference <CheckBoxPreference
android:defaultValue="true" android:defaultValue="true"
android:key="notifications_light" android:key="notifications_light"
android:title="@string/light_indicator" android:title="@string/light_indicator" />
app:iconSpaceReserved="false" />
</PreferenceScreen> </PreferenceScreen>

@ -7,14 +7,13 @@
android:defaultValue="false" android:defaultValue="false"
android:key="reader_prefer_rtl" android:key="reader_prefer_rtl"
android:summary="@string/prefer_rtl_reader_summary" android:summary="@string/prefer_rtl_reader_summary"
android:title="@string/prefer_rtl_reader" android:title="@string/prefer_rtl_reader" />
app:iconSpaceReserved="false" />
<ListPreference <ListPreference
android:entries="@array/zoom_modes" android:entries="@array/zoom_modes"
android:key="zoom_mode" android:key="zoom_mode"
android:title="@string/scale_mode" android:title="@string/scale_mode"
app:iconSpaceReserved="false"
app:useSimpleSummaryProvider="true" /> app:useSimpleSummaryProvider="true" />
<MultiSelectListPreference <MultiSelectListPreference
@ -23,20 +22,17 @@
android:entryValues="@array/values_reader_switchers" android:entryValues="@array/values_reader_switchers"
android:key="reader_switchers" android:key="reader_switchers"
android:title="@string/switch_pages" android:title="@string/switch_pages"
app:allowDividerAbove="true" app:allowDividerAbove="true" />
app:iconSpaceReserved="false" />
<SwitchPreferenceCompat <SwitchPreferenceCompat
android:defaultValue="false" android:defaultValue="false"
android:key="reader_animation" android:key="reader_animation"
android:title="@string/pages_animation" android:title="@string/pages_animation" />
app:iconSpaceReserved="false" />
<SwitchPreferenceCompat <SwitchPreferenceCompat
android:defaultValue="false" android:defaultValue="false"
android:key="pages_numbers" android:key="pages_numbers"
android:title="@string/show_pages_numbers" android:title="@string/show_pages_numbers" />
app:iconSpaceReserved="false" />
<ListPreference <ListPreference
android:entries="@array/screenshots_policy" android:entries="@array/screenshots_policy"
@ -44,7 +40,7 @@
android:key="screenshots_policy" android:key="screenshots_policy"
android:title="@string/screenshots_policy" android:title="@string/screenshots_policy"
app:defaultValue="allow" app:defaultValue="allow"
app:iconSpaceReserved="false"
app:useSimpleSummaryProvider="true" /> app:useSimpleSummaryProvider="true" />
<ListPreference <ListPreference
@ -53,7 +49,7 @@
android:key="pages_preload" android:key="pages_preload"
android:title="@string/preload_pages" android:title="@string/preload_pages"
app:defaultValue="2" app:defaultValue="2"
app:iconSpaceReserved="false"
app:useSimpleSummaryProvider="true" /> app:useSimpleSummaryProvider="true" />
</PreferenceScreen> </PreferenceScreen>

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceScreen
android:fragment="org.koitharu.kotatsu.settings.AppearanceSettingsFragment"
android:icon="@drawable/ic_appearance"
android:key="appearance"
android:title="@string/appearance" />
<PreferenceScreen
android:fragment="org.koitharu.kotatsu.settings.ContentSettingsFragment"
android:icon="@drawable/ic_manga_source"
android:key="content"
android:title="@string/content" />
<PreferenceScreen
android:fragment="org.koitharu.kotatsu.settings.HistorySettingsFragment"
android:icon="@drawable/ic_history"
android:title="@string/history_and_cache" />
<PreferenceScreen
android:fragment="org.koitharu.kotatsu.settings.ReaderSettingsFragment"
android:icon="@drawable/ic_book_page"
android:title="@string/reader_settings" />
<PreferenceScreen
android:fragment="org.koitharu.kotatsu.settings.TrackerSettingsFragment"
android:icon="@drawable/ic_feed"
android:title="@string/check_for_new_chapters" />
<PreferenceScreen
android:fragment="org.koitharu.kotatsu.settings.about.AboutSettingsFragment"
android:icon="@drawable/ic_info_outline"
android:title="@string/about" />
</PreferenceScreen>

@ -5,10 +5,9 @@
<Preference <Preference
android:key="auth" android:key="auth"
android:order="100"
android:persistent="false" android:persistent="false"
android:title="@string/sign_in" android:title="@string/sign_in"
android:order="100" app:allowDividerAbove="true" />
app:allowDividerAbove="true"
app:iconSpaceReserved="false" />
</PreferenceScreen> </PreferenceScreen>

@ -7,14 +7,12 @@
android:defaultValue="false" android:defaultValue="false"
android:key="suggestions" android:key="suggestions"
android:summary="@string/suggestions_summary" android:summary="@string/suggestions_summary"
android:title="@string/suggestions_enable" android:title="@string/suggestions_enable" />
app:iconSpaceReserved="false" />
<SwitchPreferenceCompat <SwitchPreferenceCompat
android:dependency="suggestions" android:dependency="suggestions"
android:key="suggestions_exclude_nsfw" android:key="suggestions_exclude_nsfw"
android:title="@string/exclude_nsfw_from_suggestions" android:title="@string/exclude_nsfw_from_suggestions" />
app:iconSpaceReserved="false" />
<Preference <Preference
android:icon="@drawable/ic_info_outline" android:icon="@drawable/ic_info_outline"

@ -8,25 +8,23 @@
android:entries="@array/track_sources" android:entries="@array/track_sources"
android:entryValues="@array/values_track_sources" android:entryValues="@array/values_track_sources"
android:key="track_sources" android:key="track_sources"
android:title="@string/track_sources" android:title="@string/track_sources" />
app:iconSpaceReserved="false" />
<SwitchPreferenceCompat <SwitchPreferenceCompat
android:defaultValue="true" android:defaultValue="true"
android:key="tracker_notifications" android:key="tracker_notifications"
android:summary="@string/show_notification_new_chapters" android:summary="@string/show_notification_new_chapters"
android:title="@string/notifications" android:title="@string/notifications" />
app:iconSpaceReserved="false" />
<Preference <Preference
android:dependency="tracker_notifications" android:dependency="tracker_notifications"
android:fragment="org.koitharu.kotatsu.settings.NotificationSettingsLegacyFragment"
android:key="notifications_settings" android:key="notifications_settings"
android:title="@string/notifications_settings" android:title="@string/notifications_settings" />
app:iconSpaceReserved="false" />
<org.koitharu.kotatsu.settings.utils.LinksPreference <org.koitharu.kotatsu.settings.utils.LinksPreference
android:key="track_warning"
android:icon="@drawable/ic_info_outline" android:icon="@drawable/ic_info_outline"
android:key="track_warning"
android:persistent="false" android:persistent="false"
android:selectable="false" android:selectable="false"
android:summary="@string/tracker_warning" android:summary="@string/tracker_warning"

Loading…
Cancel
Save