From 4e7a92637ce8c0dd6177b7331ea61afc09bfddac Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Thu, 13 Feb 2020 13:09:54 -0500 Subject: [PATCH] Follow system theme on Android 10+. --- .../AppearancePreferenceFragment.java | 1 + .../util/DynamicDarkActionBarTheme.java | 14 ++++---- .../util/DynamicDarkToolbarTheme.java | 14 ++++---- .../securesms/util/DynamicIntroTheme.java | 12 +++---- .../util/DynamicNoActionBarInviteTheme.java | 12 +++---- .../util/DynamicNoActionBarTheme.java | 12 +++---- .../util/DynamicRegistrationTheme.java | 12 +++---- .../securesms/util/DynamicTheme.java | 36 ++++++++++++++++--- .../securesms/util/TextSecurePreferences.java | 2 +- app/src/main/res/values-v29/arrays.xml | 16 +++++++++ app/src/main/res/values/arrays.xml | 6 ++-- app/src/main/res/values/strings.xml | 2 +- .../res/xml-v29/preferences_appearance.xml | 18 ++++++++++ 13 files changed, 107 insertions(+), 50 deletions(-) create mode 100644 app/src/main/res/values-v29/arrays.xml create mode 100644 app/src/main/res/xml-v29/preferences_appearance.xml 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 @@ + + + + + + + +