From 11db59d8a1864c1b40728c39598e01c5aabaa4a1 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Wed, 27 Apr 2022 14:43:41 -0400 Subject: [PATCH] Improve the Android 12 splash screen. --- .../thoughtcrime/securesms/MainActivity.java | 7 ++++ .../appearance/AppearanceSettingsFragment.kt | 5 +-- .../app/appearance/AppearanceSettingsState.kt | 4 ++- .../appearance/AppearanceSettingsViewModel.kt | 6 +++- .../securesms/keyvalue/SettingsValues.java | 31 +++++++++++++--- .../securesms/util/DynamicTheme.java | 16 ++++----- .../securesms/util/SplashScreenUtil.java | 36 +++++++++++++++++++ .../securesms/util/TextSecurePreferences.java | 2 +- app/src/main/res/drawable-night/ic_splash.xml | 11 ++++++ app/src/main/res/drawable/ic_splash.xml | 11 ++++++ app/src/main/res/drawable/ic_splash_dark.xml | 11 ++++++ app/src/main/res/drawable/ic_splash_light.xml | 11 ++++++ app/src/main/res/values-night-v31/themes.xml | 7 ++++ app/src/main/res/values-v31/themes.xml | 19 ++++++++++ 14 files changed, 159 insertions(+), 18 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/util/SplashScreenUtil.java create mode 100644 app/src/main/res/drawable-night/ic_splash.xml create mode 100644 app/src/main/res/drawable/ic_splash.xml create mode 100644 app/src/main/res/drawable/ic_splash_dark.xml create mode 100644 app/src/main/res/drawable/ic_splash_light.xml create mode 100644 app/src/main/res/values-night-v31/themes.xml create mode 100644 app/src/main/res/values-v31/themes.xml diff --git a/app/src/main/java/org/thoughtcrime/securesms/MainActivity.java b/app/src/main/java/org/thoughtcrime/securesms/MainActivity.java index 1f4c50d142..5bd103649b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/MainActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/MainActivity.java @@ -24,6 +24,7 @@ import org.thoughtcrime.securesms.util.CachedInflater; import org.thoughtcrime.securesms.util.CommunicationActions; import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme; import org.thoughtcrime.securesms.util.DynamicTheme; +import org.thoughtcrime.securesms.util.SplashScreenUtil; import org.thoughtcrime.securesms.util.WindowUtil; public class MainActivity extends PassphraseRequiredActivity implements VoiceNoteMediaControllerOwner { @@ -100,6 +101,12 @@ public class MainActivity extends PassphraseRequiredActivity implements VoiceNot updateTabVisibility(); } + @Override + protected void onStop() { + super.onStop(); + SplashScreenUtil.setSplashScreenThemeIfNecessary(this, SignalStore.settings().getTheme()); + } + @Override public void onBackPressed() { if (!navigator.onBackPressed()) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/appearance/AppearanceSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/appearance/AppearanceSettingsFragment.kt index 06a21ec3fb..c7f75db492 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/appearance/AppearanceSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/appearance/AppearanceSettingsFragment.kt @@ -8,6 +8,7 @@ import org.thoughtcrime.securesms.components.settings.DSLSettingsAdapter import org.thoughtcrime.securesms.components.settings.DSLSettingsFragment import org.thoughtcrime.securesms.components.settings.DSLSettingsText import org.thoughtcrime.securesms.components.settings.configure +import org.thoughtcrime.securesms.keyvalue.SettingsValues import org.thoughtcrime.securesms.util.navigation.safeNavigate class AppearanceSettingsFragment : DSLSettingsFragment(R.string.preferences__appearance) { @@ -36,9 +37,9 @@ class AppearanceSettingsFragment : DSLSettingsFragment(R.string.preferences__app radioListPref( title = DSLSettingsText.from(R.string.preferences__theme), listItems = themeLabels, - selected = themeValues.indexOf(state.theme), + selected = themeValues.indexOf(state.theme.serialize()), onSelected = { - viewModel.setTheme(themeValues[it]) + viewModel.setTheme(activity, SettingsValues.Theme.deserialize(themeValues[it])) } ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/appearance/AppearanceSettingsState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/appearance/AppearanceSettingsState.kt index 8652f59d79..9001e98438 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/appearance/AppearanceSettingsState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/appearance/AppearanceSettingsState.kt @@ -1,7 +1,9 @@ package org.thoughtcrime.securesms.components.settings.app.appearance +import org.thoughtcrime.securesms.keyvalue.SettingsValues + data class AppearanceSettingsState( - val theme: String, + val theme: SettingsValues.Theme, val messageFontSize: Int, val language: String ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/appearance/AppearanceSettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/appearance/AppearanceSettingsViewModel.kt index d976f7283b..e93817e5bd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/appearance/AppearanceSettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/appearance/AppearanceSettingsViewModel.kt @@ -1,9 +1,12 @@ package org.thoughtcrime.securesms.components.settings.app.appearance +import android.app.Activity import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel import org.thoughtcrime.securesms.jobs.EmojiSearchIndexDownloadJob +import org.thoughtcrime.securesms.keyvalue.SettingsValues.Theme import org.thoughtcrime.securesms.keyvalue.SignalStore +import org.thoughtcrime.securesms.util.SplashScreenUtil import org.thoughtcrime.securesms.util.livedata.Store class AppearanceSettingsViewModel : ViewModel() { @@ -21,9 +24,10 @@ class AppearanceSettingsViewModel : ViewModel() { val state: LiveData = store.stateLiveData - fun setTheme(theme: String) { + fun setTheme(activity: Activity?, theme: Theme) { store.update { it.copy(theme = theme) } SignalStore.settings().theme = theme + SplashScreenUtil.setSplashScreenThemeIfNecessary(activity, theme) } fun setLanguage(language: String) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/SettingsValues.java b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/SettingsValues.java index 61ddb5ae6e..48915c4ee3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/SettingsValues.java +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/SettingsValues.java @@ -181,12 +181,12 @@ public final class SettingsValues extends SignalStoreValues { return CallBandwidthMode.fromCode(getInteger(CALL_BANDWIDTH_MODE, CallBandwidthMode.HIGH_ALWAYS.getCode())); } - public @NonNull String getTheme() { - return getString(THEME, TextSecurePreferences.getTheme(ApplicationDependencies.getApplication())); + public @NonNull Theme getTheme() { + return Theme.deserialize(getString(THEME, TextSecurePreferences.getTheme(ApplicationDependencies.getApplication()))); } - public void setTheme(@NonNull String theme) { - putString(THEME, theme); + public void setTheme(@NonNull Theme theme) { + putString(THEME, theme.serialize()); onConfigurationSettingChanged.postValue(THEME); } @@ -432,4 +432,27 @@ public final class SettingsValues extends SignalStoreValues { return value; } } + + public enum Theme { + SYSTEM("system"), LIGHT("light"), DARK("dark"); + + private final String value; + + Theme(String value) { + this.value = value; + } + + public @NonNull String serialize() { + return value; + } + + public static @NonNull Theme deserialize(@NonNull String value) { + switch (value) { + case "system": return SYSTEM; + case "light": return LIGHT; + case "dark": return DARK; + default: throw new IllegalArgumentException("Unrecognized value " + value); + } + } + } } 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 77a5995691..0daf7c0341 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/DynamicTheme.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/DynamicTheme.java @@ -11,16 +11,14 @@ import androidx.appcompat.app.AppCompatDelegate; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.keyvalue.SettingsValues; +import org.thoughtcrime.securesms.keyvalue.SettingsValues.Theme; import org.thoughtcrime.securesms.keyvalue.SignalStore; public class DynamicTheme { private static final String TAG = Log.tag(DynamicTheme.class); - public static final String DARK = "dark"; - public static final String LIGHT = "light"; - public static final String SYSTEM = "system"; - private static int globalNightModeConfiguration; private int onCreateNightModeConfiguration; @@ -55,9 +53,9 @@ public class DynamicTheme { } public static void setDefaultDayNightMode(@NonNull Context context) { - String theme = SignalStore.settings().getTheme(); + Theme theme = SignalStore.settings().getTheme(); - if (theme.equals(SYSTEM)) { + if (theme == Theme.SYSTEM) { Log.d(TAG, "Setting to follow system expecting: " + ConfigurationUtil.getNightModeConfiguration(context.getApplicationContext())); AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); } else if (DynamicTheme.isDarkTheme(context)) { @@ -75,12 +73,12 @@ public class DynamicTheme { * Takes the system theme into account. */ public static boolean isDarkTheme(@NonNull Context context) { - String theme = SignalStore.settings().getTheme(); + Theme theme = SignalStore.settings().getTheme(); - if (theme.equals(SYSTEM) && systemThemeAvailable()) { + if (theme == Theme.SYSTEM && systemThemeAvailable()) { return isSystemInDarkTheme(context); } else { - return theme.equals(DARK); + return theme == Theme.DARK; } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/SplashScreenUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/SplashScreenUtil.java new file mode 100644 index 0000000000..4fce435641 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/util/SplashScreenUtil.java @@ -0,0 +1,36 @@ +package org.thoughtcrime.securesms.util; + +import android.app.Activity; +import android.content.res.Resources; +import android.os.Build; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.keyvalue.SettingsValues; + +public final class SplashScreenUtil { + private SplashScreenUtil() {} + + /** + * Sets the splash screen for Android 12+ devices based on the passed-in theme. + */ + public static void setSplashScreenThemeIfNecessary(@Nullable Activity activity, @NonNull SettingsValues.Theme theme) { + if (Build.VERSION.SDK_INT < 31 || activity == null) { + return; + } + + switch (theme) { + case LIGHT: + activity.getSplashScreen().setSplashScreenTheme(R.style.Theme_Signal_DayNight_NoActionBar_LightSplash); + break; + case DARK: + activity.getSplashScreen().setSplashScreenTheme(R.style.Theme_Signal_DayNight_NoActionBar_DarkSplash); + break; + case SYSTEM: + activity.getSplashScreen().setSplashScreenTheme(Resources.ID_NULL); + break; + } + } +} 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 dcc923cdc8..a4e9b94a51 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java @@ -774,7 +774,7 @@ public class TextSecurePreferences { * @deprecated Use {@link SettingsValues#getTheme()} via {@link org.thoughtcrime.securesms.keyvalue.SignalStore} instead. */ public static String getTheme(Context context) { - return getStringPreference(context, THEME_PREF, DynamicTheme.systemThemeAvailable() ? DynamicTheme.SYSTEM : DynamicTheme.LIGHT); + return getStringPreference(context, THEME_PREF, DynamicTheme.systemThemeAvailable() ? "system" : "light"); } public static boolean isShowInviteReminders(Context context) { diff --git a/app/src/main/res/drawable-night/ic_splash.xml b/app/src/main/res/drawable-night/ic_splash.xml new file mode 100644 index 0000000000..01190022fb --- /dev/null +++ b/app/src/main/res/drawable-night/ic_splash.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/ic_splash.xml b/app/src/main/res/drawable/ic_splash.xml new file mode 100644 index 0000000000..d25c900f52 --- /dev/null +++ b/app/src/main/res/drawable/ic_splash.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/ic_splash_dark.xml b/app/src/main/res/drawable/ic_splash_dark.xml new file mode 100644 index 0000000000..01190022fb --- /dev/null +++ b/app/src/main/res/drawable/ic_splash_dark.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/ic_splash_light.xml b/app/src/main/res/drawable/ic_splash_light.xml new file mode 100644 index 0000000000..d25c900f52 --- /dev/null +++ b/app/src/main/res/drawable/ic_splash_light.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/values-night-v31/themes.xml b/app/src/main/res/values-night-v31/themes.xml new file mode 100644 index 0000000000..0e66907302 --- /dev/null +++ b/app/src/main/res/values-night-v31/themes.xml @@ -0,0 +1,7 @@ + + + + diff --git a/app/src/main/res/values-v31/themes.xml b/app/src/main/res/values-v31/themes.xml new file mode 100644 index 0000000000..ba85f52477 --- /dev/null +++ b/app/src/main/res/values-v31/themes.xml @@ -0,0 +1,19 @@ + + + + + + + + + +