diff --git a/src/main/java/de/dennisguse/opentracks/Startup.java b/src/main/java/de/dennisguse/opentracks/Startup.java
index 9d45f2651..6d17a1bfc 100644
--- a/src/main/java/de/dennisguse/opentracks/Startup.java
+++ b/src/main/java/de/dennisguse/opentracks/Startup.java
@@ -6,6 +6,7 @@ import android.util.Log;
import java.util.Locale;
+import de.dennisguse.opentracks.util.ActivityUtils;
import de.dennisguse.opentracks.util.PreferencesUtils;
/**
@@ -32,6 +33,8 @@ public class Startup extends Application {
PreferencesUtils.setString(this, R.string.stats_units_key, statsUnits);
}
+ ActivityUtils.applyNightMode(this);
+
//TODO Workaround to reset recordingTrackId on app startup as the TrackRecordingService (likely) crashed.
if (PreferencesUtils.isRecording(this)) {
Log.e(TAG, "Reset recordingTrackId; likely the TrackRecordingService crashed.");
diff --git a/src/main/java/de/dennisguse/opentracks/settings/SettingsActivity.java b/src/main/java/de/dennisguse/opentracks/settings/SettingsActivity.java
index 471b0e9f9..284fa2162 100644
--- a/src/main/java/de/dennisguse/opentracks/settings/SettingsActivity.java
+++ b/src/main/java/de/dennisguse/opentracks/settings/SettingsActivity.java
@@ -21,6 +21,7 @@ import de.dennisguse.opentracks.io.file.TrackFileFormat;
import de.dennisguse.opentracks.settings.bluetooth.BluetoothLeCyclingCadenceAndSpeedPreference;
import de.dennisguse.opentracks.settings.bluetooth.BluetoothLeHeartRatePreference;
import de.dennisguse.opentracks.settings.bluetooth.BluetoothLeSensorPreference;
+import de.dennisguse.opentracks.util.ActivityUtils;
import de.dennisguse.opentracks.util.BluetoothUtils;
import de.dennisguse.opentracks.util.HackUtils;
import de.dennisguse.opentracks.util.PreferencesUtils;
@@ -65,6 +66,9 @@ public class SettingsActivity extends AppCompatActivity implements ChooseActivit
if (PreferencesUtils.isKey(getActivity(), R.string.stats_units_key, key)) {
getActivity().runOnUiThread(this::updateUnits);
}
+ if (PreferencesUtils.isKey(getActivity(), R.string.night_mode_key, key)) {
+ getActivity().runOnUiThread(() -> ActivityUtils.applyNightMode(getContext()));
+ }
};
// Used to forward update from ChooseActivityTypeDialogFragment; TODO Could be replaced with LiveData.
diff --git a/src/main/java/de/dennisguse/opentracks/util/ActivityUtils.java b/src/main/java/de/dennisguse/opentracks/util/ActivityUtils.java
index aa223f592..9de9331ed 100644
--- a/src/main/java/de/dennisguse/opentracks/util/ActivityUtils.java
+++ b/src/main/java/de/dennisguse/opentracks/util/ActivityUtils.java
@@ -16,6 +16,7 @@ import android.widget.AbsListView;
import android.widget.ListView;
import android.widget.Toast;
+import androidx.appcompat.app.AppCompatDelegate;
import androidx.appcompat.widget.SearchView;
import java.util.ArrayList;
@@ -151,4 +152,7 @@ public class ActivityUtils {
toast.show();
}
+ public static void applyNightMode(Context context) {
+ AppCompatDelegate.setDefaultNightMode(PreferencesUtils.getDefaultNightMode(context));
+ }
}
diff --git a/src/main/java/de/dennisguse/opentracks/util/PreferencesUtils.java b/src/main/java/de/dennisguse/opentracks/util/PreferencesUtils.java
index 6aabbbf3a..187a9d8dc 100644
--- a/src/main/java/de/dennisguse/opentracks/util/PreferencesUtils.java
+++ b/src/main/java/de/dennisguse/opentracks/util/PreferencesUtils.java
@@ -108,6 +108,8 @@ public class PreferencesUtils {
* @param keyId the key id
* @param value the value
*/
+ //TODO Don't use; this function is only to be used TrackRecordingService and will be removed.
+ @VisibleForTesting
public static void setBoolean(Context context, int keyId, boolean value) {
SharedPreferences sharedPreferences = getSharedPreferences(context);
Editor editor = sharedPreferences.edit();
@@ -162,6 +164,8 @@ public class PreferencesUtils {
* @param keyId the key id
* @param value the value
*/
+ //TODO Don't use; this function is only to be used TrackRecordingService and will be removed.
+ @Deprecated
@VisibleForTesting
public static void setLong(Context context, int keyId, long value) {
SharedPreferences sharedPreferences = getSharedPreferences(context);
@@ -189,6 +193,7 @@ public class PreferencesUtils {
* @param keyId the key id
* @param value the value
*/
+ @VisibleForTesting
public static void setString(Context context, int keyId, String value) {
SharedPreferences sharedPreferences = getSharedPreferences(context);
Editor editor = sharedPreferences.edit();
@@ -347,6 +352,16 @@ public class PreferencesUtils {
return getBoolean(context, R.string.import_prevent_reimport_key, defaultValue);
}
+ /**
+ * @return {@link androidx.appcompat.app.AppCompatDelegate}.MODE_*
+ */
+ public static int getDefaultNightMode(Context context) {
+ final String defaultValue = getKey(context, R.string.night_mode_default);
+ final String value = getString(context, R.string.night_mode_key, defaultValue);
+
+ return Integer.parseInt(value);
+ }
+
@Deprecated //Use TrackRecordingService
public static boolean isRecording(Context context) {
return isRecording(getRecordingTrackId(context));
diff --git a/src/main/res/values/settings.xml b/src/main/res/values/settings.xml
index fef1d4469..466aada83 100644
--- a/src/main/res/values/settings.xml
+++ b/src/main/res/values/settings.xml
@@ -221,4 +221,21 @@
settingsRecordingKey
1500
+
+
+ nightMode
+ @string/night_mode_no_value
+ 1
+ 2
+ -1
+
+ - @string/night_mode_system_value
+ - @string/night_mode_no_value
+ - @string/night_mode_yes_value
+
+
+ - @string/settings_night_mode_option_system
+ - @string/settings_night_mode_option_day
+ - @string/settings_night_mode_option_night
+
\ No newline at end of file
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index c781324fd..626f6c834 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -371,6 +371,11 @@ limitations under the License.
Date (local)
Number
Default track name
+ UI Theme
+ System
+ Day
+ Night
+
Reset
All settings will be reverted to the default values. This will not delete any tracks on the device.
diff --git a/src/main/res/values/themes_custom.xml b/src/main/res/values/themes_custom.xml
index cf6ca8974..c2ad0a186 100644
--- a/src/main/res/values/themes_custom.xml
+++ b/src/main/res/values/themes_custom.xml
@@ -15,7 +15,7 @@ limitations under the License.
-->
-