From bf584583623564d3037b868fe3521ca75a1ba517 Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Tue, 13 Feb 2024 22:15:47 +0100 Subject: [PATCH] UI: re-add OLED friendly (aka black) theme. Fixes #1625. --- .../opentracks/AbstractActivity.java | 5 +++ .../opentracks/settings/PreferencesUtils.java | 30 ++++++++++--- .../UserInterfaceSettingsFragment.java | 8 +++- src/main/res/values/settings.xml | 3 ++ src/main/res/values/strings.xml | 2 + src/main/res/values/styles_theme.xml | 43 ++++++++++++++++--- 6 files changed, 77 insertions(+), 14 deletions(-) diff --git a/src/main/java/de/dennisguse/opentracks/AbstractActivity.java b/src/main/java/de/dennisguse/opentracks/AbstractActivity.java index 4a6a9bb67..f31ce9638 100644 --- a/src/main/java/de/dennisguse/opentracks/AbstractActivity.java +++ b/src/main/java/de/dennisguse/opentracks/AbstractActivity.java @@ -22,6 +22,7 @@ import android.view.View; import androidx.appcompat.app.AppCompatActivity; import de.dennisguse.opentracks.services.announcement.TTSManager; +import de.dennisguse.opentracks.settings.PreferencesUtils; /** * @author Jimmy Shih @@ -30,6 +31,10 @@ public abstract class AbstractActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { + if (PreferencesUtils.shouldApplyOledTheme()) { + setTheme(R.style.OpenTracksThemeOled); + } + super.onCreate(savedInstanceState); // Set volume control stream for text to speech diff --git a/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java b/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java index a93d2f97c..9263de001 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java +++ b/src/main/java/de/dennisguse/opentracks/settings/PreferencesUtils.java @@ -87,6 +87,10 @@ public class PreferencesUtils { changeListener.onSharedPreferenceChanged(sharedPreferences, null); } + public static void registerOnSharedPreferenceChangeListenerSilent(SharedPreferences.OnSharedPreferenceChangeListener changeListener) { + sharedPreferences.registerOnSharedPreferenceChangeListener(changeListener); + } + public static void unregisterOnSharedPreferenceChangeListener(SharedPreferences.OnSharedPreferenceChangeListener changeListener) { sharedPreferences.unregisterOnSharedPreferenceChangeListener(changeListener); } @@ -670,13 +674,29 @@ public class PreferencesUtils { } /** - * @return {@link androidx.appcompat.app.AppCompatDelegate}.MODE_* + * @return * {@link androidx.appcompat.app.AppCompatDelegate}.MODE_* + * * 3: Night OLED friendly */ - public static int getDefaultNightMode() { + private static String getUiMode() { final String defaultValue = getKey(R.string.night_mode_default); final String value = getString(R.string.night_mode_key, defaultValue); - return Integer.parseInt(value); + return value; + } + + public static boolean shouldApplyOledTheme() { + return resources.getString(R.string.night_mode_night_oled_value) + .equals(getUiMode()); + } + + public static void applyNightMode() { + String uiMode = getUiMode(); + if (resources.getString(R.string.night_mode_night_oled_value) + .equals(uiMode)) { + return; + } + + AppCompatDelegate.setDefaultNightMode(Integer.parseInt(uiMode)); } public static void resetPreferences(Context context, boolean readAgain) { @@ -823,10 +843,6 @@ public class PreferencesUtils { } } - public static void applyNightMode() { - AppCompatDelegate.setDefaultNightMode(PreferencesUtils.getDefaultNightMode()); - } - //TODO Check if resetPreferences can be used instead. @Deprecated @VisibleForTesting diff --git a/src/main/java/de/dennisguse/opentracks/settings/UserInterfaceSettingsFragment.java b/src/main/java/de/dennisguse/opentracks/settings/UserInterfaceSettingsFragment.java index ca122b43d..b2b8aed53 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/UserInterfaceSettingsFragment.java +++ b/src/main/java/de/dennisguse/opentracks/settings/UserInterfaceSettingsFragment.java @@ -4,6 +4,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.os.Build; import android.os.Bundle; +import android.widget.Toast; import androidx.fragment.app.DialogFragment; import androidx.preference.ListPreference; @@ -20,7 +21,10 @@ public class UserInterfaceSettingsFragment extends PreferenceFragmentCompat { private final SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = (sharedPreferences, key) -> { if (PreferencesUtils.isKey(R.string.night_mode_key, key)) { - getActivity().runOnUiThread(PreferencesUtils::applyNightMode); + getActivity().runOnUiThread(() -> { + PreferencesUtils.applyNightMode(); + Toast.makeText(getContext(), R.string.settings_theme_switch_restart, Toast.LENGTH_LONG).show(); + }); } }; @@ -50,7 +54,7 @@ public class UserInterfaceSettingsFragment extends PreferenceFragmentCompat { @Override public void onResume() { super.onResume(); - PreferencesUtils.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); + PreferencesUtils.registerOnSharedPreferenceChangeListenerSilent(sharedPreferenceChangeListener); } @Override diff --git a/src/main/res/values/settings.xml b/src/main/res/values/settings.xml index 7610e13a1..2c276fec6 100644 --- a/src/main/res/values/settings.xml +++ b/src/main/res/values/settings.xml @@ -281,16 +281,19 @@ @string/night_mode_system_value 1 2 + 3 -1 @string/night_mode_system_value @string/night_mode_no_value @string/night_mode_yes_value + @string/night_mode_night_oled_value @string/settings_night_mode_option_system @string/settings_night_mode_option_day @string/settings_night_mode_option_night + @string/settings_night_mode_option_night_oled diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 298737c8d..0e0623147 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -377,6 +377,7 @@ limitations under the License. By time Recording + Theme changes may require a manual restart. Dynamic Colors Use user-defined Dynamic Colors (Android 12+ only; requires a manual restart) Customize your recording layout @@ -404,6 +405,7 @@ limitations under the License. System Day Night + Night (OLED friendly) Time interval Lap length diff --git a/src/main/res/values/styles_theme.xml b/src/main/res/values/styles_theme.xml index 5b4539976..edbf68858 100644 --- a/src/main/res/values/styles_theme.xml +++ b/src/main/res/values/styles_theme.xml @@ -8,19 +8,20 @@ @style/MaterialSwitchPreferenceCompat - ?attr/colorSurfaceBright - true - ?attr/colorSurfaceContainer - @style/MaterialSnackbarTheme @style/MaterialSnackbarTextButtonTheme @style/MaterialSnackbarTextViewTheme - @style/Widget.OpenTracks.BottomAppBar @style/Widget.OpenTracks.FloatingActionButton true + + @style/Widget.OpenTracks.BottomAppBar + + ?attr/colorSurfaceBright + true + ?attr/colorSurfaceContainer + + + +