From 2dc5840872864e42d1273dd8e9279f8945454f50 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Fri, 21 Feb 2020 18:57:50 +0200 Subject: [PATCH] Add theme settings --- .../java/org/koitharu/kotatsu/KotatsuApp.kt | 2 ++ .../kotatsu/core/prefs/AppSettings.kt | 4 ++++ .../ui/common/BasePreferenceFragment.kt | 5 ++--- .../ui/settings/AppearanceSettingsFragment.kt | 7 +++++++ .../prefs/StringIntPreferenceDelegate.kt | 20 +++++++++++++++++++ app/src/main/res/values/arrays.xml | 8 ++++++++ app/src/main/res/values/constants.xml | 6 ++++++ app/src/main/res/values/strings.xml | 4 ++++ app/src/main/res/xml/pref_appearance.xml | 11 +++++++++- 9 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/StringIntPreferenceDelegate.kt create mode 100644 app/src/main/res/values/arrays.xml diff --git a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt index 8f6c5d63b..835585831 100644 --- a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt +++ b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt @@ -1,6 +1,7 @@ package org.koitharu.kotatsu import android.app.Application +import androidx.appcompat.app.AppCompatDelegate import androidx.room.Room import coil.Coil import coil.ImageLoader @@ -23,6 +24,7 @@ class KotatsuApp : Application() { super.onCreate() initKoin() initCoil() + AppCompatDelegate.setDefaultNightMode(AppSettings(this).theme) } private fun initKoin() { diff --git a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt index 1f893eab3..358aa4090 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt @@ -3,9 +3,11 @@ package org.koitharu.kotatsu.core.prefs import android.content.Context import android.content.SharedPreferences import android.content.res.Resources +import androidx.appcompat.app.AppCompatDelegate import androidx.preference.PreferenceManager import org.koitharu.kotatsu.R import org.koitharu.kotatsu.utils.delegates.prefs.EnumPreferenceDelegate +import org.koitharu.kotatsu.utils.delegates.prefs.StringIntPreferenceDelegate class AppSettings private constructor(resources: Resources, private val prefs: SharedPreferences) : SharedPreferences by prefs { @@ -13,6 +15,8 @@ class AppSettings private constructor(resources: Resources, private val prefs: S var listMode by EnumPreferenceDelegate(ListMode::class.java, resources.getString(R.string.key_list_mode), ListMode.DETAILED_LIST) + val theme by StringIntPreferenceDelegate(resources.getString(R.string.key_theme), AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) + fun subscribe(listener: SharedPreferences.OnSharedPreferenceChangeListener) { prefs.registerOnSharedPreferenceChangeListener(listener) } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/BasePreferenceFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/common/BasePreferenceFragment.kt index 5dafed16d..21bb9001c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/common/BasePreferenceFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/common/BasePreferenceFragment.kt @@ -1,6 +1,5 @@ package org.koitharu.kotatsu.ui.common -import android.content.Context import androidx.annotation.StringRes import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat @@ -13,8 +12,8 @@ abstract class BasePreferenceFragment(@StringRes private val titleId: Int) : protected val settings by inject() - override fun onAttach(context: Context) { - super.onAttach(context) + override fun onResume() { + super.onResume() activity?.setTitle(titleId) } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/settings/AppearanceSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/settings/AppearanceSettingsFragment.kt index 6786a0f79..33e6ee0ac 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/settings/AppearanceSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/settings/AppearanceSettingsFragment.kt @@ -3,12 +3,15 @@ package org.koitharu.kotatsu.ui.settings import android.content.SharedPreferences import android.os.Bundle import android.view.View +import androidx.appcompat.app.AppCompatDelegate import androidx.collection.arrayMapOf +import androidx.preference.ListPreference import androidx.preference.Preference import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.prefs.ListMode import org.koitharu.kotatsu.ui.common.BasePreferenceFragment import org.koitharu.kotatsu.ui.main.list.ListModeSelectDialog +import org.koitharu.kotatsu.utils.ext.bindSummary class AppearanceSettingsFragment : BasePreferenceFragment(R.string.appearance), SharedPreferences.OnSharedPreferenceChangeListener { @@ -18,6 +21,7 @@ class AppearanceSettingsFragment : BasePreferenceFragment(R.string.appearance), findPreference(R.string.key_list_mode)?.summary = listModes[settings.listMode]?.let(::getString) + findPreference(R.string.key_theme)?.bindSummary() } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -44,6 +48,9 @@ class AppearanceSettingsFragment : BasePreferenceFragment(R.string.appearance), when (key) { getString(R.string.key_list_mode) -> findPreference(R.string.key_list_mode)?.summary = listModes[settings.listMode]?.let(::getString) + getString(R.string.key_theme) -> { + AppCompatDelegate.setDefaultNightMode(settings.theme) + } } } diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/StringIntPreferenceDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/StringIntPreferenceDelegate.kt new file mode 100644 index 000000000..6c670921d --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/StringIntPreferenceDelegate.kt @@ -0,0 +1,20 @@ +package org.koitharu.kotatsu.utils.delegates.prefs + +import android.content.SharedPreferences +import androidx.core.content.edit +import kotlin.properties.ReadWriteProperty +import kotlin.reflect.KProperty + +class StringIntPreferenceDelegate(private val key: String, private val defValue: Int) : + ReadWriteProperty { + + override fun getValue(thisRef: SharedPreferences, property: KProperty<*>): Int { + return thisRef.getString(key, defValue.toString())?.toIntOrNull() ?: defValue + } + + override fun setValue(thisRef: SharedPreferences, property: KProperty<*>, value: Int) { + thisRef.edit { + putString(key, value.toString()) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml new file mode 100644 index 000000000..d74093503 --- /dev/null +++ b/app/src/main/res/values/arrays.xml @@ -0,0 +1,8 @@ + + + + @string/automatic + @string/light + @string/dark + + \ No newline at end of file diff --git a/app/src/main/res/values/constants.xml b/app/src/main/res/values/constants.xml index ed7161f72..7629a618e 100644 --- a/app/src/main/res/values/constants.xml +++ b/app/src/main/res/values/constants.xml @@ -1,4 +1,10 @@ list_mode + theme + + -1 + 1 + 2 + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5a03a3933..69bc6e79a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -56,4 +56,8 @@ Genre Filter Appearance + Theme + Light + Dark + Automatic \ No newline at end of file diff --git a/app/src/main/res/xml/pref_appearance.xml b/app/src/main/res/xml/pref_appearance.xml index 3187a5c20..407e22e52 100644 --- a/app/src/main/res/xml/pref_appearance.xml +++ b/app/src/main/res/xml/pref_appearance.xml @@ -3,10 +3,19 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> + + \ No newline at end of file