From e3f5ed87032be9324125ba6b5b8b7e0b5cb6472f Mon Sep 17 00:00:00 2001 From: Janne Mareike Koschinski <janne@kuschku.de> Date: Sun, 16 Dec 2018 15:50:04 +0100 Subject: [PATCH] Implement support for global DayNight mode (on Android P through developer settings or on LineageOS devices) --- .../settings/AppearanceSettings.kt | 4 ++ .../util/service/ServiceBoundActivity.kt | 10 +++- .../main/res/values-night/themes_daynight.xml | 7 +++ .../res/values-v28/strings_preferences.xml | 53 +++++++++++++++++++ .../main/res/values/strings_preferences.xml | 4 ++ app/src/main/res/values/themes_daynight.xml | 7 +++ 6 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/values-night/themes_daynight.xml create mode 100644 app/src/main/res/values-v28/strings_preferences.xml create mode 100644 app/src/main/res/values/themes_daynight.xml diff --git a/app/src/main/java/de/kuschku/quasseldroid/settings/AppearanceSettings.kt b/app/src/main/java/de/kuschku/quasseldroid/settings/AppearanceSettings.kt index db619e3e9..be4ada3f6 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/settings/AppearanceSettings.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/settings/AppearanceSettings.kt @@ -40,13 +40,17 @@ data class AppearanceSettings( } enum class Theme(@StyleRes val style: Int) { + MATERIAL_DAYNIGHT(R.style.Theme_ChatTheme_Material_DayNight), MATERIAL_LIGHT(R.style.Theme_ChatTheme_Material_Light), MATERIAL_DARK(R.style.Theme_ChatTheme_Material_Dark), + QUASSEL_DAYNIGHT(R.style.Theme_ChatTheme_Quassel_DayNight), QUASSEL_LIGHT(R.style.Theme_ChatTheme_Quassel_Light), QUASSEL_DARK(R.style.Theme_ChatTheme_Quassel_Dark), AMOLED(R.style.Theme_ChatTheme_Amoled), + SOLARIZED_DAYNIGHT(R.style.Theme_ChatTheme_Solarized_DayNight), SOLARIZED_LIGHT(R.style.Theme_ChatTheme_Solarized_Light), SOLARIZED_DARK(R.style.Theme_ChatTheme_Solarized_Dark), + GRUVBOX_DAYNIGHT(R.style.Theme_ChatTheme_Gruvbox_DayNight), GRUVBOX_LIGHT(R.style.Theme_ChatTheme_Gruvbox_Light), GRUVBOX_DARK(R.style.Theme_ChatTheme_Gruvbox_Dark), DRACULA(R.style.Theme_ChatTheme_Dracula); diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/service/ServiceBoundActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/util/service/ServiceBoundActivity.kt index 8841e67a7..744467503 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/util/service/ServiceBoundActivity.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/util/service/ServiceBoundActivity.kt @@ -19,8 +19,10 @@ package de.kuschku.quasseldroid.util.service +import android.app.UiModeManager import android.content.Context import android.content.SharedPreferences +import android.content.res.Configuration import android.os.Build import android.os.Bundle import android.view.WindowManager @@ -51,6 +53,9 @@ abstract class ServiceBoundActivity : protected val backend: BehaviorSubject<Optional<Backend>> get() = connection.backend + private var uiModeManager: UiModeManager? = null + private var nightMode: Int? = null + protected fun runInBackground(f: () -> Unit) { connection.backend.value.ifPresent { it.sessionManager().handlerService.backend(f) @@ -92,6 +97,8 @@ abstract class ServiceBoundActivity : if (appearanceSettings.keepScreenOn) { window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } + + nightMode = resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK } fun updateRecentsHeader() { @@ -106,7 +113,8 @@ abstract class ServiceBoundActivity : } override fun onStart() { - if (Settings.appearance(this) != appearanceSettings) { + if (Settings.appearance(this) != appearanceSettings || + (resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) != nightMode) { recreate() } sharedPreferences(Keys.Status.NAME, Context.MODE_PRIVATE) { diff --git a/app/src/main/res/values-night/themes_daynight.xml b/app/src/main/res/values-night/themes_daynight.xml new file mode 100644 index 000000000..93e83ee63 --- /dev/null +++ b/app/src/main/res/values-night/themes_daynight.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <style name="Theme.ChatTheme.Material_DayNight" parent="Theme.ChatTheme.Material_Dark" /> + <style name="Theme.ChatTheme.Quassel_DayNight" parent="Theme.ChatTheme.Quassel_Dark" /> + <style name="Theme.ChatTheme.Solarized_DayNight" parent="Theme.ChatTheme.Solarized_Dark" /> + <style name="Theme.ChatTheme.Gruvbox_DayNight" parent="Theme.ChatTheme.Gruvbox_Dark" /> +</resources> \ No newline at end of file diff --git a/app/src/main/res/values-v28/strings_preferences.xml b/app/src/main/res/values-v28/strings_preferences.xml new file mode 100644 index 000000000..5179943e7 --- /dev/null +++ b/app/src/main/res/values-v28/strings_preferences.xml @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="utf-8"?><!-- + Quasseldroid - Quassel client for Android + + Copyright (c) 2018 Janne Koschinski + Copyright (c) 2018 The Quassel Project + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License version 3 as published + by the Free Software Foundation. + + 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. + + You should have received a copy of the GNU General Public License along + with this program. If not, see <http://www.gnu.org/licenses/>. + --> + +<resources> + <string-array name="preference_theme_entries" translatable="false"> + <item>@string/preference_theme_entry_material_daynight</item> + <item>@string/preference_theme_entry_material_light</item> + <item>@string/preference_theme_entry_material_dark</item> + <item>@string/preference_theme_entry_quassel_daynight</item> + <item>@string/preference_theme_entry_quassel_light</item> + <item>@string/preference_theme_entry_quassel_dark</item> + <item>@string/preference_theme_entry_amoled</item> + <item>@string/preference_theme_entry_solarized_daynight</item> + <item>@string/preference_theme_entry_solarized_light</item> + <item>@string/preference_theme_entry_solarized_dark</item> + <item>@string/preference_theme_entry_gruvbox_daynight</item> + <item>@string/preference_theme_entry_gruvbox_light</item> + <item>@string/preference_theme_entry_gruvbox_dark</item> + <item>@string/preference_theme_entry_dracula</item> + </string-array> + <string-array name="preference_theme_entryvalues" translatable="false"> + <item>MATERIAL_DAYNIGHT</item> + <item>MATERIAL_LIGHT</item> + <item>MATERIAL_DARK</item> + <item>QUASSEL_DAYNIGHT</item> + <item>QUASSEL_LIGHT</item> + <item>QUASSEL_DARK</item> + <item>AMOLED</item> + <item>SOLARIZED_DAYNIGHT</item> + <item>SOLARIZED_LIGHT</item> + <item>SOLARIZED_DARK</item> + <item>GRUVBOX_DAYNIGHT</item> + <item>GRUVBOX_LIGHT</item> + <item>GRUVBOX_DARK</item> + <item>DRACULA</item> + </string-array> +</resources> diff --git a/app/src/main/res/values/strings_preferences.xml b/app/src/main/res/values/strings_preferences.xml index a9b8cfa3d..3a3f47cb2 100644 --- a/app/src/main/res/values/strings_preferences.xml +++ b/app/src/main/res/values/strings_preferences.xml @@ -22,13 +22,17 @@ <string name="preference_theme_key" translatable="false">theme</string> <string name="preference_theme_title">Theme</string> + <string name="preference_theme_entry_material_daynight">Material (Auto)</string> <string name="preference_theme_entry_material_light">Material (Light)</string> <string name="preference_theme_entry_material_dark">Material (Dark)</string> + <string name="preference_theme_entry_quassel_daynight">Quassel (Auto)</string> <string name="preference_theme_entry_quassel_light">Quassel (Light)</string> <string name="preference_theme_entry_quassel_dark">Quassel (Dark)</string> <string name="preference_theme_entry_amoled">AMOLED</string> + <string name="preference_theme_entry_solarized_daynight">Solarized (Auto)</string> <string name="preference_theme_entry_solarized_light">Solarized (Light)</string> <string name="preference_theme_entry_solarized_dark">Solarized (Dark)</string> + <string name="preference_theme_entry_gruvbox_daynight">Gruvbox (Auto)</string> <string name="preference_theme_entry_gruvbox_light">Gruvbox (Light)</string> <string name="preference_theme_entry_gruvbox_dark">Gruvbox (Dark)</string> <string name="preference_theme_entry_dracula">Dracula</string> diff --git a/app/src/main/res/values/themes_daynight.xml b/app/src/main/res/values/themes_daynight.xml new file mode 100644 index 000000000..1077e105b --- /dev/null +++ b/app/src/main/res/values/themes_daynight.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <style name="Theme.ChatTheme.Material_DayNight" parent="Theme.ChatTheme.Material_Light" /> + <style name="Theme.ChatTheme.Quassel_DayNight" parent="Theme.ChatTheme.Quassel_Light" /> + <style name="Theme.ChatTheme.Solarized_DayNight" parent="Theme.ChatTheme.Solarized_Light" /> + <style name="Theme.ChatTheme.Gruvbox_DayNight" parent="Theme.ChatTheme.Gruvbox_Light" /> +</resources> \ No newline at end of file -- GitLab