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);
+ }
}
}