From edd82e2797ee3f5b809363b09211d484124fbcc5 Mon Sep 17 00:00:00 2001 From: kitsunyan Date: Fri, 31 Jul 2020 00:40:17 +0300 Subject: [PATCH] Add "System" theme which respects day/night state on Android 10 --- .../foxydroid/content/Preferences.kt | 27 +++++++++++++++---- .../foxydroid/screen/PreferencesFragment.kt | 1 + .../foxydroid/screen/ScreenActivity.kt | 2 +- src/main/res/values/strings.xml | 1 + 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/nya/kitsunyan/foxydroid/content/Preferences.kt b/src/main/kotlin/nya/kitsunyan/foxydroid/content/Preferences.kt index 65c624b..470fe68 100644 --- a/src/main/kotlin/nya/kitsunyan/foxydroid/content/Preferences.kt +++ b/src/main/kotlin/nya/kitsunyan/foxydroid/content/Preferences.kt @@ -2,10 +2,12 @@ package nya.kitsunyan.foxydroid.content import android.content.Context import android.content.SharedPreferences +import android.content.res.Configuration import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.subjects.PublishSubject import nya.kitsunyan.foxydroid.R import nya.kitsunyan.foxydroid.entity.ProductItem +import nya.kitsunyan.foxydroid.utility.extension.android.* import java.net.Proxy object Preferences { @@ -84,7 +86,8 @@ object Preferences { object ProxyPort: Key("proxy_port", Value.IntValue(9050)) object ProxyType: Key("proxy_type", Value.EnumerationValue(Preferences.ProxyType.Direct)) object SortOrder: Key("sort_order", Value.EnumerationValue(Preferences.SortOrder.Update)) - object Theme: Key("theme", Value.EnumerationValue(Preferences.Theme.Light)) + object Theme: Key("theme", Value.EnumerationValue(if (Android.sdk(29)) + Preferences.Theme.System else Preferences.Theme.Light)) object UpdateNotify: Key("update_notify", Value.BooleanValue(true)) object UpdateUnstable: Key("update_unstable", Value.BooleanValue(false)) } @@ -116,12 +119,26 @@ object Preferences { object Update: SortOrder("update", ProductItem.Order.LAST_UPDATE) } - sealed class Theme(override val valueString: String, val resId: Int): Enumeration { + sealed class Theme(override val valueString: String): Enumeration { override val values: List - get() = listOf(Light, Dark) + get() = if (Android.sdk(29)) listOf(System, Light, Dark) else listOf(Light, Dark) - object Light: Theme("light", R.style.Theme_Main_Light) - object Dark: Theme("dark", R.style.Theme_Main_Dark) + abstract fun getResId(configuration: Configuration): Int + + object System: Theme("system") { + override fun getResId(configuration: Configuration): Int { + return if ((configuration.uiMode and Configuration.UI_MODE_NIGHT_YES) != 0) + R.style.Theme_Main_Dark else R.style.Theme_Main_Light + } + } + + object Light: Theme("light") { + override fun getResId(configuration: Configuration): Int = R.style.Theme_Main_Light + } + + object Dark: Theme("dark") { + override fun getResId(configuration: Configuration): Int = R.style.Theme_Main_Dark + } } operator fun get(key: Key): T { diff --git a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/PreferencesFragment.kt b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/PreferencesFragment.kt index 7078feb..383f753 100644 --- a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/PreferencesFragment.kt +++ b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/PreferencesFragment.kt @@ -77,6 +77,7 @@ class PreferencesFragment: ScreenFragment() { preferences.addCategory(getString(R.string.other)) { addEnumeration(Preferences.Key.Theme, getString(R.string.theme)) { when (it) { + is Preferences.Theme.System -> getString(R.string.system) is Preferences.Theme.Light -> getString(R.string.light) is Preferences.Theme.Dark -> getString(R.string.dark) } diff --git a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ScreenActivity.kt b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ScreenActivity.kt index b21cda3..2466e1c 100644 --- a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ScreenActivity.kt +++ b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/ScreenActivity.kt @@ -69,7 +69,7 @@ abstract class ScreenActivity: FragmentActivity() { } override fun onCreate(savedInstanceState: Bundle?) { - setTheme(Preferences[Preferences.Key.Theme].resId) + setTheme(Preferences[Preferences.Key.Theme].getResId(resources.configuration)) super.onCreate(savedInstanceState) window.decorView.systemUiVisibility = window.decorView.systemUiVisibility or View.SYSTEM_UI_FLAG_LAYOUT_STABLE or diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index e391c6c..6dcf864 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -141,6 +141,7 @@ Sync repositories automatically Syncing Syncing %s + System Tap to install. Theme Tracks or reports your activity