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
+
+
+
+