From bf644f4e09502b316aa05f7155fd40da801829f7 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Sun, 29 Dec 2019 12:22:19 -0600 Subject: [PATCH] Rename night mode to dark theme; abide by system-wide settings (API 29) Closes issue #513 --- .../activities/AndroidThemeSwitcher.kt | 12 ++++++ .../activities/settings/SettingsFragment.java | 4 +- .../src/main/res/values/strings.xml | 6 +-- .../uhabits/core/preferences/Preferences.java | 2 +- .../isoron/uhabits/core/ui/ThemeSwitcher.java | 37 ++++++++++++++----- 5 files changed, 46 insertions(+), 15 deletions(-) diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/AndroidThemeSwitcher.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/AndroidThemeSwitcher.kt index a999f0941..0c2f645da 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/AndroidThemeSwitcher.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/AndroidThemeSwitcher.kt @@ -19,6 +19,8 @@ package org.isoron.uhabits.activities +import android.content.res.Configuration.* +import android.os.Build.VERSION.* import android.support.v4.content.* import org.isoron.androidbase.activities.* import org.isoron.uhabits.* @@ -33,6 +35,16 @@ class AndroidThemeSwitcher preferences: Preferences ) : ThemeSwitcher(preferences) { + override fun getSystemTheme(): Int { + if(SDK_INT < 29) return THEME_LIGHT; + val uiMode = activity.resources.configuration.uiMode + return if ((uiMode and UI_MODE_NIGHT_MASK) == UI_MODE_NIGHT_YES) { + THEME_DARK; + } else { + THEME_LIGHT; + } + } + override fun applyDarkTheme() { activity.setTheme(R.style.AppBaseThemeDark) activity.window.navigationBarColor = diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java index 1ed257495..2f9150cab 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java @@ -27,14 +27,14 @@ import android.provider.*; import android.support.annotation.*; import android.support.v7.preference.*; -import org.isoron.uhabits.*; import org.isoron.uhabits.R; +import org.isoron.uhabits.*; import org.isoron.uhabits.core.preferences.*; import org.isoron.uhabits.core.ui.*; import org.isoron.uhabits.notifications.*; import static android.media.RingtoneManager.*; -import static android.os.Build.VERSION.SDK_INT; +import static android.os.Build.VERSION.*; import static org.isoron.uhabits.activities.habits.list.ListHabitsScreenKt.*; public class SettingsFragment extends PreferenceFragmentCompat diff --git a/android/uhabits-android/src/main/res/values/strings.xml b/android/uhabits-android/src/main/res/values/strings.xml index c68fd2c99..0bafe4017 100644 --- a/android/uhabits-android/src/main/res/values/strings.xml +++ b/android/uhabits-android/src/main/res/values/strings.xml @@ -169,9 +169,9 @@ Troubleshooting Help translate this app - Night mode - Use pure black in night mode - Replaces gray backgrounds with pure black in night mode. Reduces battery usage in phones with AMOLED display. + Dark theme + Use pure black in dark theme + Replaces gray backgrounds with pure black in dark theme. Reduces battery usage in phones with AMOLED display. Interface Reverse order of days Show days in reverse order on the main screen. diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/preferences/Preferences.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/preferences/Preferences.java index af531c21c..5bf101e84 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/preferences/Preferences.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/preferences/Preferences.java @@ -186,7 +186,7 @@ public class Preferences public int getTheme() { - return storage.getInt("pref_theme", ThemeSwitcher.THEME_LIGHT); + return storage.getInt("pref_theme", ThemeSwitcher.THEME_AUTOMATIC); } public void setTheme(int theme) diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/ThemeSwitcher.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/ThemeSwitcher.java index b3d6db862..0db53ab9b 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/ThemeSwitcher.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/ThemeSwitcher.java @@ -27,7 +27,9 @@ public abstract class ThemeSwitcher { public static final int THEME_DARK = 1; - public static final int THEME_LIGHT = 0; + public static final int THEME_LIGHT = 2; + + public static final int THEME_AUTOMATIC = 0; private final Preferences preferences; @@ -38,7 +40,7 @@ public abstract class ThemeSwitcher public void apply() { - if (preferences.getTheme() == THEME_DARK) + if (isNightMode()) { if (preferences.isPureBlackEnabled()) applyPureBlackTheme(); else applyDarkTheme(); @@ -55,19 +57,36 @@ public abstract class ThemeSwitcher public abstract void applyPureBlackTheme(); + public abstract int getSystemTheme(); + public boolean isNightMode() { - return preferences.getTheme() == THEME_DARK; - } + int systemTheme = getSystemTheme(); + int userTheme = preferences.getTheme(); - public void setTheme(int theme) - { - preferences.setTheme(theme); + return (userTheme == THEME_DARK || + (systemTheme == THEME_DARK && userTheme == THEME_AUTOMATIC)); } public void toggleNightMode() { - if (isNightMode()) setTheme(THEME_LIGHT); - else setTheme(THEME_DARK); + int systemTheme = getSystemTheme(); + int userTheme = preferences.getTheme(); + + if(userTheme == THEME_AUTOMATIC) + { + if(systemTheme == THEME_LIGHT) preferences.setTheme(THEME_DARK); + if(systemTheme == THEME_DARK) preferences.setTheme(THEME_LIGHT); + } + else if(userTheme == THEME_LIGHT) + { + if (systemTheme == THEME_LIGHT) preferences.setTheme(THEME_DARK); + if (systemTheme == THEME_DARK) preferences.setTheme(THEME_AUTOMATIC); + } + else if(userTheme == THEME_DARK) + { + if (systemTheme == THEME_LIGHT) preferences.setTheme(THEME_AUTOMATIC); + if (systemTheme == THEME_DARK) preferences.setTheme(THEME_LIGHT); + } } }