From 4150d060ee8cbc0814afcd2916fd8561615224af Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Sun, 6 Sep 2020 16:06:13 +0200 Subject: [PATCH] Theming: enable day/night mode incl. app-wide setting. --- .../java/de/dennisguse/opentracks/Startup.java | 3 +++ .../opentracks/settings/SettingsActivity.java | 4 ++++ .../opentracks/util/ActivityUtils.java | 4 ++++ .../opentracks/util/PreferencesUtils.java | 15 +++++++++++++++ src/main/res/values/settings.xml | 17 +++++++++++++++++ src/main/res/values/strings.xml | 5 +++++ src/main/res/values/themes_custom.xml | 2 +- src/main/res/xml/settings.xml | 7 +++++++ 8 files changed, 56 insertions(+), 1 deletion(-) 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. --> -