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 a999f094..0c2f645d 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 1ed25749..2f9150ca 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 c68fd2c9..0bafe401 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 af531c21..5bf101e8 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 b3d6db86..0db53ab9 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); + } } }