diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/AppearancePreferenceFragment.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/AppearancePreferenceFragment.java
index c444ec6b73..2db16b982e 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/preferences/AppearancePreferenceFragment.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/AppearancePreferenceFragment.java
@@ -7,6 +7,7 @@ import androidx.preference.ListPreference;
import org.thoughtcrime.securesms.ApplicationPreferencesActivity;
import org.thoughtcrime.securesms.R;
+import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import java.util.Arrays;
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/DynamicDarkActionBarTheme.java b/app/src/main/java/org/thoughtcrime/securesms/util/DynamicDarkActionBarTheme.java
index 2bdcc8c84d..3c68c31c28 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/DynamicDarkActionBarTheme.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/DynamicDarkActionBarTheme.java
@@ -1,18 +1,16 @@
package org.thoughtcrime.securesms.util;
-import android.app.Activity;
+import androidx.annotation.StyleRes;
import org.thoughtcrime.securesms.R;
public class DynamicDarkActionBarTheme extends DynamicTheme {
- @Override
- protected int getSelectedTheme(Activity activity) {
- String theme = TextSecurePreferences.getTheme(activity);
-
- if (theme.equals("dark")) {
- return R.style.TextSecure_DarkTheme_Conversation;
- }
+ protected @StyleRes int getLightThemeStyle() {
return R.style.TextSecure_LightTheme_Conversation;
}
+
+ protected @StyleRes int getDarkThemeStyle() {
+ return R.style.TextSecure_DarkTheme_Conversation;
+ }
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/DynamicDarkToolbarTheme.java b/app/src/main/java/org/thoughtcrime/securesms/util/DynamicDarkToolbarTheme.java
index 94990b69da..213b58f219 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/DynamicDarkToolbarTheme.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/DynamicDarkToolbarTheme.java
@@ -1,18 +1,16 @@
package org.thoughtcrime.securesms.util;
-import android.app.Activity;
+import androidx.annotation.StyleRes;
import org.thoughtcrime.securesms.R;
public class DynamicDarkToolbarTheme extends DynamicTheme {
- @Override
- protected int getSelectedTheme(Activity activity) {
- String theme = TextSecurePreferences.getTheme(activity);
-
- if (theme.equals("dark")) {
- return R.style.TextSecure_DarkNoActionBar_DarkToolbar;
- }
+ protected @StyleRes int getLightThemeStyle() {
return R.style.TextSecure_LightNoActionBar_DarkToolbar;
}
+
+ protected @StyleRes int getDarkThemeStyle() {
+ return R.style.TextSecure_DarkNoActionBar_DarkToolbar;
+ }
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/DynamicIntroTheme.java b/app/src/main/java/org/thoughtcrime/securesms/util/DynamicIntroTheme.java
index a4e7f37445..551e997a7b 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/DynamicIntroTheme.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/DynamicIntroTheme.java
@@ -1,16 +1,16 @@
package org.thoughtcrime.securesms.util;
-import android.app.Activity;
+import androidx.annotation.StyleRes;
import org.thoughtcrime.securesms.R;
public class DynamicIntroTheme extends DynamicTheme {
- @Override
- protected int getSelectedTheme(Activity activity) {
- String theme = TextSecurePreferences.getTheme(activity);
-
- if (theme.equals("dark")) return R.style.TextSecure_DarkIntroTheme;
+ protected @StyleRes int getLightThemeStyle() {
return R.style.TextSecure_LightIntroTheme;
}
+
+ protected @StyleRes int getDarkThemeStyle() {
+ return R.style.TextSecure_DarkIntroTheme;
+ }
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/DynamicNoActionBarInviteTheme.java b/app/src/main/java/org/thoughtcrime/securesms/util/DynamicNoActionBarInviteTheme.java
index c548af04ee..dd8227d151 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/DynamicNoActionBarInviteTheme.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/DynamicNoActionBarInviteTheme.java
@@ -1,16 +1,16 @@
package org.thoughtcrime.securesms.util;
-import android.app.Activity;
+import androidx.annotation.StyleRes;
import org.thoughtcrime.securesms.R;
public class DynamicNoActionBarInviteTheme extends DynamicTheme {
- @Override
- protected int getSelectedTheme(Activity activity) {
- String theme = TextSecurePreferences.getTheme(activity);
-
- if (theme.equals("dark")) return R.style.Signal_NoActionBar_Invite;
+ protected @StyleRes int getLightThemeStyle() {
return R.style.Signal_Light_NoActionBar_Invite;
}
+
+ protected @StyleRes int getDarkThemeStyle() {
+ return R.style.Signal_NoActionBar_Invite;
+ }
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/DynamicNoActionBarTheme.java b/app/src/main/java/org/thoughtcrime/securesms/util/DynamicNoActionBarTheme.java
index 6c256b9439..e4b56125e7 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/DynamicNoActionBarTheme.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/DynamicNoActionBarTheme.java
@@ -1,16 +1,16 @@
package org.thoughtcrime.securesms.util;
-import android.app.Activity;
+import androidx.annotation.StyleRes;
import org.thoughtcrime.securesms.R;
public class DynamicNoActionBarTheme extends DynamicTheme {
- @Override
- protected int getSelectedTheme(Activity activity) {
- String theme = TextSecurePreferences.getTheme(activity);
-
- if (theme.equals("dark")) return R.style.TextSecure_DarkNoActionBar;
+ protected @StyleRes int getLightThemeStyle() {
return R.style.TextSecure_LightNoActionBar;
}
+
+ protected @StyleRes int getDarkThemeStyle() {
+ return R.style.TextSecure_DarkNoActionBar;
+ }
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/DynamicRegistrationTheme.java b/app/src/main/java/org/thoughtcrime/securesms/util/DynamicRegistrationTheme.java
index d4f1a9219b..6425b7b6a2 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/DynamicRegistrationTheme.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/DynamicRegistrationTheme.java
@@ -1,16 +1,16 @@
package org.thoughtcrime.securesms.util;
-import android.app.Activity;
+import androidx.annotation.StyleRes;
import org.thoughtcrime.securesms.R;
public class DynamicRegistrationTheme extends DynamicTheme {
- @Override
- protected int getSelectedTheme(Activity activity) {
- String theme = TextSecurePreferences.getTheme(activity);
-
- if (theme.equals("dark")) return R.style.TextSecure_DarkRegistrationTheme;
+ protected @StyleRes int getLightThemeStyle() {
return R.style.TextSecure_LightRegistrationTheme;
}
+
+ protected @StyleRes int getDarkThemeStyle() {
+ return R.style.TextSecure_DarkRegistrationTheme;
+ }
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/DynamicTheme.java b/app/src/main/java/org/thoughtcrime/securesms/util/DynamicTheme.java
index b89acd261e..9c7ad71bf3 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/DynamicTheme.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/DynamicTheme.java
@@ -3,15 +3,19 @@ package org.thoughtcrime.securesms.util;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
+import android.os.Build;
+import androidx.annotation.NonNull;
+import androidx.annotation.StyleRes;
import androidx.appcompat.app.AppCompatDelegate;
import org.thoughtcrime.securesms.R;
public class DynamicTheme {
- public static final String DARK = "dark";
- public static final String LIGHT = "light";
+ public static final String DARK = "dark";
+ public static final String LIGHT = "light";
+ public static final String SYSTEM = "system";
private int currentTheme;
@@ -30,16 +34,38 @@ public class DynamicTheme {
}
}
- protected int getSelectedTheme(Activity activity) {
+ private @StyleRes int getSelectedTheme(Activity activity) {
String theme = TextSecurePreferences.getTheme(activity);
- if (theme.equals(DARK)) {
- return R.style.TextSecure_DarkTheme;
+ if (theme.equals(SYSTEM) && systemThemeAvailable()) {
+ if (isSystemInDarkTheme(activity)) {
+ return getDarkThemeStyle();
+ } else {
+ return getLightThemeStyle();
+ }
+ } else if (theme.equals(DARK)) {
+ return getDarkThemeStyle();
+ } else {
+ return getLightThemeStyle();
}
+ }
+ protected @StyleRes int getLightThemeStyle() {
return R.style.TextSecure_LightTheme;
}
+ protected @StyleRes int getDarkThemeStyle() {
+ return R.style.TextSecure_DarkTheme;
+ }
+
+ public static boolean systemThemeAvailable() {
+ return Build.VERSION.SDK_INT >= 29;
+ }
+
+ private static boolean isSystemInDarkTheme(@NonNull Activity activity) {
+ return (activity.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES;
+ }
+
private static final class OverridePendingTransition {
static void invoke(Activity activity) {
activity.overridePendingTransition(0, 0);
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java b/app/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java
index 80fa0c1c2f..87437d54f1 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java
@@ -886,7 +886,7 @@ public class TextSecurePreferences {
}
public static String getTheme(Context context) {
- return getStringPreference(context, THEME_PREF, "light");
+ return getStringPreference(context, THEME_PREF, DynamicTheme.systemThemeAvailable() ? DynamicTheme.SYSTEM : DynamicTheme.LIGHT);
}
public static boolean isVerifying(Context context) {
diff --git a/app/src/main/res/values-v29/arrays.xml b/app/src/main/res/values-v29/arrays.xml
new file mode 100644
index 0000000000..35e5761e19
--- /dev/null
+++ b/app/src/main/res/values-v29/arrays.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ - @string/preferences__system_theme
+ - @string/preferences__light_theme
+ - @string/preferences__dark_theme
+
+
+
+ - system
+ - light
+ - dark
+
+
+
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
index 56f580881d..103fe60a2a 100644
--- a/app/src/main/res/values/arrays.xml
+++ b/app/src/main/res/values/arrays.xml
@@ -1,5 +1,5 @@
-
+
- @string/preferences__default
@@ -143,12 +143,12 @@
- vi
-
+
- @string/preferences__light_theme
- @string/preferences__dark_theme
-
+
- light
- dark
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c9b79203dd..25ef4276e7 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1471,7 +1471,7 @@
Linked devices
Light
Dark
- System
+ System default
Appearance
Theme
Default
diff --git a/app/src/main/res/xml-v29/preferences_appearance.xml b/app/src/main/res/xml-v29/preferences_appearance.xml
new file mode 100644
index 0000000000..5eb45ac398
--- /dev/null
+++ b/app/src/main/res/xml-v29/preferences_appearance.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+