From 5adc2a05365c475c0bb33401dba897dc1298cfe3 Mon Sep 17 00:00:00 2001 From: jannis Date: Wed, 11 Mar 2020 16:33:52 +0100 Subject: [PATCH] #48 Dark mode --- .../main/java/de/tadris/fitness/Instance.java | 3 + .../fitness/activity/FitoTrackActivity.java | 8 ++ .../activity/FitoTrackSettingsActivity.java | 9 ++ .../fitness/activity/LauncherActivity.java | 2 +- .../activity/ListWorkoutsActivity.java | 3 +- .../activity/RecordWorkoutActivity.java | 2 +- .../fitness/activity/SettingsActivity.java | 1 + .../fitness/activity/WorkoutActivity.java | 2 +- .../de/tadris/fitness/data/WorkoutType.java | 21 ++--- .../fitness/util/CalorieCalculator.java | 2 +- .../tadris/fitness/util/FitoTrackThemes.java | 84 +++++++++++++++++++ app/src/main/res/layout/activity_main.xml | 2 +- .../main/res/layout/enter_workout_line.xml | 8 +- app/src/main/res/layout/show_entry.xml | 8 +- app/src/main/res/layout/view_workout.xml | 4 +- app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/strings.xml | 1 + app/src/main/res/values/styles.xml | 56 +++++++++---- app/src/main/res/values/theme_setting.xml | 34 ++++++++ app/src/main/res/xml/preferences_main.xml | 7 ++ 20 files changed, 213 insertions(+), 45 deletions(-) create mode 100644 app/src/main/java/de/tadris/fitness/util/FitoTrackThemes.java create mode 100644 app/src/main/res/values/theme_setting.xml diff --git a/app/src/main/java/de/tadris/fitness/Instance.java b/app/src/main/java/de/tadris/fitness/Instance.java index 44afe9b..f001ea3 100644 --- a/app/src/main/java/de/tadris/fitness/Instance.java +++ b/app/src/main/java/de/tadris/fitness/Instance.java @@ -32,6 +32,7 @@ import java.util.List; import de.tadris.fitness.data.AppDatabase; import de.tadris.fitness.data.UserPreferences; import de.tadris.fitness.recording.LocationListener; +import de.tadris.fitness.util.FitoTrackThemes; import de.tadris.fitness.util.unit.UnitUtils; public class Instance { @@ -50,12 +51,14 @@ public class Instance { public final AppDatabase db; public final List locationChangeListeners = new ArrayList<>(); public final UserPreferences userPreferences; + public final FitoTrackThemes themes; public boolean pressureAvailable= false; public float lastPressure= 0; private Instance(Context context) { userPreferences= new UserPreferences(context); + themes = new FitoTrackThemes(context); db = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, DATABASE_NAME) .addMigrations(new Migration(1, 2) { @Override diff --git a/app/src/main/java/de/tadris/fitness/activity/FitoTrackActivity.java b/app/src/main/java/de/tadris/fitness/activity/FitoTrackActivity.java index 90fe2a8..499ad2a 100644 --- a/app/src/main/java/de/tadris/fitness/activity/FitoTrackActivity.java +++ b/app/src/main/java/de/tadris/fitness/activity/FitoTrackActivity.java @@ -23,15 +23,23 @@ import android.Manifest; import android.app.Activity; import android.app.AlertDialog; import android.content.pm.PackageManager; +import android.os.Bundle; import android.util.TypedValue; +import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.core.app.ActivityCompat; +import de.tadris.fitness.Instance; import de.tadris.fitness.R; abstract public class FitoTrackActivity extends Activity { + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setTheme(Instance.getInstance(this).themes.getDefaultTheme()); + } int getThemePrimaryColor() { final TypedValue value = new TypedValue (); diff --git a/app/src/main/java/de/tadris/fitness/activity/FitoTrackSettingsActivity.java b/app/src/main/java/de/tadris/fitness/activity/FitoTrackSettingsActivity.java index 64af96c..3c910d5 100644 --- a/app/src/main/java/de/tadris/fitness/activity/FitoTrackSettingsActivity.java +++ b/app/src/main/java/de/tadris/fitness/activity/FitoTrackSettingsActivity.java @@ -23,6 +23,7 @@ import android.app.AlertDialog; import android.media.Ringtone; import android.media.RingtoneManager; import android.net.Uri; +import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceActivity; @@ -31,13 +32,21 @@ import android.preference.RingtonePreference; import android.text.TextUtils; import android.view.MenuItem; +import androidx.annotation.Nullable; import androidx.annotation.StringRes; +import de.tadris.fitness.Instance; import de.tadris.fitness.R; import de.tadris.fitness.util.unit.UnitUtils; public abstract class FitoTrackSettingsActivity extends PreferenceActivity { + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + setTheme(Instance.getInstance(this).themes.getDefaultTheme()); + super.onCreate(savedInstanceState); + } + protected void showErrorDialog(Exception e, @StringRes int title, @StringRes int message) { new AlertDialog.Builder(this) .setTitle(title) diff --git a/app/src/main/java/de/tadris/fitness/activity/LauncherActivity.java b/app/src/main/java/de/tadris/fitness/activity/LauncherActivity.java index 2bd9ae9..ca04ef8 100644 --- a/app/src/main/java/de/tadris/fitness/activity/LauncherActivity.java +++ b/app/src/main/java/de/tadris/fitness/activity/LauncherActivity.java @@ -32,7 +32,7 @@ public class LauncherActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setTheme(R.style.AppThemeNoActionbar); + setTheme(android.R.style.Theme_Material_Light_NoActionBar); setContentView(R.layout.activity_main); } diff --git a/app/src/main/java/de/tadris/fitness/activity/ListWorkoutsActivity.java b/app/src/main/java/de/tadris/fitness/activity/ListWorkoutsActivity.java index fbf48aa..ac6d047 100644 --- a/app/src/main/java/de/tadris/fitness/activity/ListWorkoutsActivity.java +++ b/app/src/main/java/de/tadris/fitness/activity/ListWorkoutsActivity.java @@ -19,7 +19,6 @@ package de.tadris.fitness.activity; -import android.app.Activity; import android.app.AlertDialog; import android.content.Intent; import android.content.SharedPreferences; @@ -41,7 +40,7 @@ import de.tadris.fitness.data.WorkoutType; import de.tadris.fitness.util.DialogUtils; import de.tadris.fitness.view.WorkoutAdapter; -public class ListWorkoutsActivity extends Activity implements WorkoutAdapter.WorkoutAdapterListener { +public class ListWorkoutsActivity extends FitoTrackActivity implements WorkoutAdapter.WorkoutAdapterListener { private RecyclerView listView; private RecyclerView.Adapter adapter; diff --git a/app/src/main/java/de/tadris/fitness/activity/RecordWorkoutActivity.java b/app/src/main/java/de/tadris/fitness/activity/RecordWorkoutActivity.java index 7fd4e6d..2d4f3a2 100644 --- a/app/src/main/java/de/tadris/fitness/activity/RecordWorkoutActivity.java +++ b/app/src/main/java/de/tadris/fitness/activity/RecordWorkoutActivity.java @@ -90,7 +90,7 @@ public class RecordWorkoutActivity extends FitoTrackActivity implements Location @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setTheme(ACTIVITY.theme); + setTheme(Instance.getInstance(this).themes.getWorkoutTypeTheme(ACTIVITY)); setContentView(R.layout.activity_record_workout); setTitle(R.string.recordWorkout); diff --git a/app/src/main/java/de/tadris/fitness/activity/SettingsActivity.java b/app/src/main/java/de/tadris/fitness/activity/SettingsActivity.java index eaa03e2..6eed2f7 100644 --- a/app/src/main/java/de/tadris/fitness/activity/SettingsActivity.java +++ b/app/src/main/java/de/tadris/fitness/activity/SettingsActivity.java @@ -62,6 +62,7 @@ public class SettingsActivity extends FitoTrackSettingsActivity { bindPreferenceSummaryToValue(findPreference("unitSystem")); bindPreferenceSummaryToValue(findPreference("mapStyle")); + bindPreferenceSummaryToValue(findPreference("themeSetting")); findPreference("weight").setOnPreferenceClickListener(preference -> { showWeightPicker(); diff --git a/app/src/main/java/de/tadris/fitness/activity/WorkoutActivity.java b/app/src/main/java/de/tadris/fitness/activity/WorkoutActivity.java index 9e436fa..5db661f 100644 --- a/app/src/main/java/de/tadris/fitness/activity/WorkoutActivity.java +++ b/app/src/main/java/de/tadris/fitness/activity/WorkoutActivity.java @@ -75,7 +75,7 @@ public abstract class WorkoutActivity extends InformationActivity { void initBeforeContent() { workout= selectedWorkout; samples= Arrays.asList(Instance.getInstance(this).db.workoutDao().getAllSamplesOfWorkout(workout.id)); - setTheme(workout.getWorkoutType().theme); + setTheme(Instance.getInstance(this).themes.getWorkoutTypeTheme(workout.getWorkoutType())); } void initAfterContent() { diff --git a/app/src/main/java/de/tadris/fitness/data/WorkoutType.java b/app/src/main/java/de/tadris/fitness/data/WorkoutType.java index d316bcc..123b16d 100644 --- a/app/src/main/java/de/tadris/fitness/data/WorkoutType.java +++ b/app/src/main/java/de/tadris/fitness/data/WorkoutType.java @@ -26,25 +26,26 @@ import de.tadris.fitness.R; public enum WorkoutType { - RUNNING("running", R.string.workoutTypeRunning, 7, true, R.style.Running), - HIKING("hiking", R.string.workoutTypeHiking, 7, true, R.style.Hiking), - CYCLING("cycling", R.string.workoutTypeCycling, 12, true, R.style.Bicycling), - OTHER("other", R.string.workoutTypeOther, 7, true, R.style.AppTheme); + RUNNING("running", R.string.workoutTypeRunning, 7, true, R.style.Running, R.style.RunningDark), + HIKING("hiking", R.string.workoutTypeHiking, 7, true, R.style.Hiking, R.style.HikingDark), + CYCLING("cycling", R.string.workoutTypeCycling, 12, true, R.style.Bicycling, R.style.BicyclingDark), + OTHER("other", R.string.workoutTypeOther, 7, true, R.style.AppTheme, R.style.AppThemeDark); public String id; - public @StringRes - int title; + @StringRes + public int title; public int minDistance; // Minimum distance between samples public boolean hasGPS; - public @StyleRes - int theme; + @StyleRes + public int lightTheme, darkTheme; - WorkoutType(String id, int title, int minDistance, boolean hasGPS, int theme) { + WorkoutType(String id, int title, int minDistance, boolean hasGPS, int lightTheme, int darkTheme) { this.id = id; this.title = title; this.minDistance = minDistance; this.hasGPS = hasGPS; - this.theme = theme; + this.lightTheme = lightTheme; + this.darkTheme = darkTheme; } public static WorkoutType getTypeById(String id) { diff --git a/app/src/main/java/de/tadris/fitness/util/CalorieCalculator.java b/app/src/main/java/de/tadris/fitness/util/CalorieCalculator.java index 307f793..fcc37e3 100644 --- a/app/src/main/java/de/tadris/fitness/util/CalorieCalculator.java +++ b/app/src/main/java/de/tadris/fitness/util/CalorieCalculator.java @@ -55,7 +55,7 @@ public class CalorieCalculator { if (type == WorkoutType.CYCLING) { return Math.max(3, (speedInKmh-10) / 1.5); } - return -1; + return 0; } } diff --git a/app/src/main/java/de/tadris/fitness/util/FitoTrackThemes.java b/app/src/main/java/de/tadris/fitness/util/FitoTrackThemes.java new file mode 100644 index 0000000..f7b79f5 --- /dev/null +++ b/app/src/main/java/de/tadris/fitness/util/FitoTrackThemes.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2020 Jannis Scheibe + * + * This file is part of FitoTrack + * + * FitoTrack is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * FitoTrack is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package de.tadris.fitness.util; + +import android.content.Context; +import android.content.res.Configuration; +import android.preference.PreferenceManager; + +import androidx.annotation.StyleRes; + +import de.tadris.fitness.R; +import de.tadris.fitness.data.WorkoutType; + +public class FitoTrackThemes { + + private static final int THEME_SETTING_AUTO = 0; + private static final int THEME_SETTING_LIGHT = 1; + private static final int THEME_SETTING_DARK = 2; + + private Context context; + + public FitoTrackThemes(Context context) { + this.context = context; + } + + @StyleRes + public int getDefaultTheme() { + if (shouldUseLightMode()) { + return R.style.AppTheme; + } else { + return R.style.AppThemeDark; + } + } + + @StyleRes + public int getWorkoutTypeTheme(WorkoutType type) { + if (shouldUseLightMode()) { + return type.lightTheme; + } else { + return type.darkTheme; + } + } + + private boolean shouldUseLightMode() { + switch (getThemeSetting()) { + default: + case THEME_SETTING_AUTO: + return !isSystemNightModeEnabled(); + case THEME_SETTING_LIGHT: + return true; + case THEME_SETTING_DARK: + return false; + } + } + + private int getThemeSetting() { + String setting = PreferenceManager.getDefaultSharedPreferences(context).getString("themeSetting", String.valueOf(THEME_SETTING_AUTO)); + assert setting != null; + return Integer.parseInt(setting); + } + + private boolean isSystemNightModeEnabled() { + int nightModeFlags = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; + return nightModeFlags == Configuration.UI_MODE_NIGHT_YES; + } + +} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 287b98e..e634bad 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -21,7 +21,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:theme="@style/AppThemeNoActionbar" + android:theme="@android:style/Theme.Material.Light.NoActionBar" tools:context=".activity.LauncherActivity"> + android:textAppearance="@android:style/TextAppearance.Material.Medium" /> + android:textAlignment="textEnd" + android:textAppearance="@android:style/TextAppearance.Material.Medium" /> diff --git a/app/src/main/res/layout/show_entry.xml b/app/src/main/res/layout/show_entry.xml index 5f1fab7..26c83cd 100644 --- a/app/src/main/res/layout/show_entry.xml +++ b/app/src/main/res/layout/show_entry.xml @@ -41,7 +41,7 @@ android:fontFamily="sans-serif-black" android:text="" android:textAllCaps="true" - android:textColor="@color/textColorLight" + android:textColor="?android:textColorSecondary" android:textStyle="bold" /> @@ -73,7 +73,7 @@ android:fontFamily="sans-serif-black" android:text="" android:textAllCaps="true" - android:textColor="@color/textColorLight" + android:textColor="?android:textColorSecondary" android:textStyle="bold" /> diff --git a/app/src/main/res/layout/view_workout.xml b/app/src/main/res/layout/view_workout.xml index 1d0a830..e380892 100644 --- a/app/src/main/res/layout/view_workout.xml +++ b/app/src/main/res/layout/view_workout.xml @@ -36,7 +36,7 @@ android:layout_weight="1" android:text="Aug 19, 2019 20:15" android:textAllCaps="true" - android:textColor="@color/textLighterBlack" + android:textColor="?android:textColorPrimary" android:textSize="18sp" android:textStyle="bold" /> @@ -80,7 +80,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:text="27min" - android:textColor="@color/textLighterBlack" + android:textColor="?android:textColorPrimary" android:textSize="30sp" /> diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 7a29852..2bea43a 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -34,5 +34,6 @@ #007267 #C8000000 + #C8FFFFFF #C8414141 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 255cb43..dffb3cc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -172,4 +172,5 @@ Saving failed Info © OpenStreetMap contributors + Theme diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 1e81eef..d8dfc58 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,5 +1,5 @@ - @color/colorPrimary - @color/colorPrimaryDark - @color/colorAccent - - - - - - + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/theme_setting.xml b/app/src/main/res/values/theme_setting.xml new file mode 100644 index 0000000..6ab06ae --- /dev/null +++ b/app/src/main/res/values/theme_setting.xml @@ -0,0 +1,34 @@ + + + + + + System + Light + Dark + + + + 0 + 1 + 2 + + + \ No newline at end of file diff --git a/app/src/main/res/xml/preferences_main.xml b/app/src/main/res/xml/preferences_main.xml index 2b22513..5ed10dc 100644 --- a/app/src/main/res/xml/preferences_main.xml +++ b/app/src/main/res/xml/preferences_main.xml @@ -33,6 +33,13 @@ android:summary="@string/pref_weight_summary" android:title="@string/pref_weight" /> + +