From d0e42e3382dc71adfb1e42d4a8b2fe2b6ef7cd70 Mon Sep 17 00:00:00 2001 From: jannis Date: Mon, 19 Aug 2019 21:17:17 +0200 Subject: [PATCH] - SettingsActivity - set Units and weight - not tested --- app/src/main/AndroidManifest.xml | 38 ++-- .../main/java/de/tadris/fitness/Instance.java | 6 +- .../de/tadris/fitness/UserPreferences.java | 29 --- .../de/tadris/fitness/WorkoutAdapter.java | 2 +- .../activity/RecordWorkoutActivity.java | 3 +- .../fitness/activity/SettingsActivity.java | 179 ++++++++++++++++++ .../fitness/activity/ShowWorkoutActivity.java | 2 +- .../de/tadris/fitness/util/unit/Imperial.java | 54 ++++++ .../fitness/util/unit/ImperialWithMeters.java | 23 +++ .../de/tadris/fitness/util/unit/Metric.java | 54 ++++++ .../fitness/util/unit/MetricPhysical.java | 19 ++ .../de/tadris/fitness/util/unit/Unit.java | 16 ++ .../fitness/util/{ => unit}/UnitUtils.java | 57 ++++-- .../main/res/layout/dialog_weight_picker.xml | 14 ++ app/src/main/res/values/strings.xml | 5 + app/src/main/res/values/unit_systems.xml | 18 ++ app/src/main/res/xml/preferences_main.xml | 18 ++ 17 files changed, 456 insertions(+), 81 deletions(-) delete mode 100644 app/src/main/java/de/tadris/fitness/UserPreferences.java create mode 100644 app/src/main/java/de/tadris/fitness/activity/SettingsActivity.java create mode 100644 app/src/main/java/de/tadris/fitness/util/unit/Imperial.java create mode 100644 app/src/main/java/de/tadris/fitness/util/unit/ImperialWithMeters.java create mode 100644 app/src/main/java/de/tadris/fitness/util/unit/Metric.java create mode 100644 app/src/main/java/de/tadris/fitness/util/unit/MetricPhysical.java create mode 100644 app/src/main/java/de/tadris/fitness/util/unit/Unit.java rename app/src/main/java/de/tadris/fitness/util/{ => unit}/UnitUtils.java (58%) create mode 100644 app/src/main/res/layout/dialog_weight_picker.xml create mode 100644 app/src/main/res/values/unit_systems.xml create mode 100644 app/src/main/res/xml/preferences_main.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1501da5..954565a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,23 +1,4 @@ - - @@ -35,13 +16,18 @@ android:supportsRtl="true" android:theme="@style/AppTheme" tools:ignore="GoogleAppIndexingWarning"> - - - - + + + + diff --git a/app/src/main/java/de/tadris/fitness/Instance.java b/app/src/main/java/de/tadris/fitness/Instance.java index 517a295..b0e92fe 100644 --- a/app/src/main/java/de/tadris/fitness/Instance.java +++ b/app/src/main/java/de/tadris/fitness/Instance.java @@ -20,11 +20,14 @@ package de.tadris.fitness; import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; import androidx.room.Room; import de.tadris.fitness.data.AppDatabase; import de.tadris.fitness.location.LocationListener; +import de.tadris.fitness.util.unit.UnitUtils; public class Instance { @@ -41,13 +44,12 @@ public class Instance { public AppDatabase db; public LocationListener locationListener; - public UserPreferences userPreferences; private Instance(Context context) { db = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, DATABASE_NAME) .allowMainThreadQueries() .build(); locationListener= new LocationListener(context); - userPreferences= new UserPreferences(); + UnitUtils.setUnit(context); } } diff --git a/app/src/main/java/de/tadris/fitness/UserPreferences.java b/app/src/main/java/de/tadris/fitness/UserPreferences.java deleted file mode 100644 index 968607d..0000000 --- a/app/src/main/java/de/tadris/fitness/UserPreferences.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2019 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; - -public class UserPreferences { - - /** - * Weight in kg - */ - public float weight= 80; - -} diff --git a/app/src/main/java/de/tadris/fitness/WorkoutAdapter.java b/app/src/main/java/de/tadris/fitness/WorkoutAdapter.java index 851e6c0..e1571c2 100644 --- a/app/src/main/java/de/tadris/fitness/WorkoutAdapter.java +++ b/app/src/main/java/de/tadris/fitness/WorkoutAdapter.java @@ -28,7 +28,7 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import de.tadris.fitness.data.Workout; -import de.tadris.fitness.util.UnitUtils; +import de.tadris.fitness.util.unit.UnitUtils; public class WorkoutAdapter extends RecyclerView.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 d385a86..5023915 100644 --- a/app/src/main/java/de/tadris/fitness/activity/RecordWorkoutActivity.java +++ b/app/src/main/java/de/tadris/fitness/activity/RecordWorkoutActivity.java @@ -50,8 +50,7 @@ import de.tadris.fitness.location.LocationListener; import de.tadris.fitness.location.WorkoutRecorder; import de.tadris.fitness.map.MapManager; import de.tadris.fitness.util.ThemeManager; -import de.tadris.fitness.util.UnitUtils; -import de.tadris.fitness.util.WorkoutTypeCalculator; +import de.tadris.fitness.util.unit.UnitUtils; public class RecordWorkoutActivity extends FitoTrackActivity implements LocationListener.LocationChangeListener { diff --git a/app/src/main/java/de/tadris/fitness/activity/SettingsActivity.java b/app/src/main/java/de/tadris/fitness/activity/SettingsActivity.java new file mode 100644 index 0000000..ad1eac9 --- /dev/null +++ b/app/src/main/java/de/tadris/fitness/activity/SettingsActivity.java @@ -0,0 +1,179 @@ +package de.tadris.fitness.activity; + +import android.app.ActionBar; +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.DialogInterface; +import android.content.SharedPreferences; +import android.media.Ringtone; +import android.media.RingtoneManager; +import android.net.Uri; +import android.preference.ListPreference; +import android.preference.Preference; +import android.preference.PreferenceActivity; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.preference.RingtonePreference; +import android.text.TextUtils; +import android.view.MenuItem; +import android.view.View; +import android.widget.Button; +import android.widget.NumberPicker; + +import androidx.core.app.NavUtils; + +import de.tadris.fitness.R; +import de.tadris.fitness.util.unit.Unit; +import de.tadris.fitness.util.unit.UnitUtils; + +public class SettingsActivity extends PreferenceActivity { + + /** + * A preference value change listener that updates the preference's summary + * to reflect its new value. + */ + private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = (preference, value) -> { + String stringValue = value.toString(); + + if (preference instanceof ListPreference) { + // For list preferences, look up the correct display value in + // the preference's 'entries' list. + ListPreference listPreference = (ListPreference) preference; + int index = listPreference.findIndexOfValue(stringValue); + + // Set the summary to reflect the new value. + preference.setSummary( + index >= 0 + ? listPreference.getEntries()[index] + : null); + + } else if (preference instanceof RingtonePreference) { + // For ringtone preferences, look up the correct display value + // using RingtoneManager. + if (TextUtils.isEmpty(stringValue)) { + // Empty values correspond to 'silent' (no ringtone). + preference.setSummary(R.string.pref_ringtone_silent); + + } else { + Ringtone ringtone = RingtoneManager.getRingtone( + preference.getContext(), Uri.parse(stringValue)); + + if (ringtone == null) { + // Clear the summary if there was a lookup error. + preference.setSummary(null); + } else { + // Set the summary to reflect the new ringtone display + // name. + String name = ringtone.getTitle(preference.getContext()); + preference.setSummary(name); + } + } + + } else { + // For all other preferences, set the summary to the value's + // simple string representation. + preference.setSummary(stringValue); + } + return true; + }; + + /*@Override + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + public void onBuildHeaders(List
target) { + loadHeadersFromResource(R.xml.pref_headers, target); + }*/ + + /** + * Binds a preference's summary to its value. More specifically, when the + * preference's value is changed, its summary (line of text below the + * preference title) is updated to reflect the value. The summary is also + * immediately updated upon calling this method. The exact display format is + * dependent on the type of preference. + * + * @see #sBindPreferenceSummaryToValueListener + */ + private static void bindPreferenceSummaryToValue(Preference preference) { + // Set the listener to watch for value changes. + preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener); + + // Trigger the listener immediately with the preference's + // current value. + sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, + PreferenceManager + .getDefaultSharedPreferences(preference.getContext()) + .getString(preference.getKey(), "")); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setupActionBar(); + + addPreferencesFromResource(R.xml.preferences_main); + + bindPreferenceSummaryToValue(findPreference("unitSystem")); + + findPreference("weight").setOnPreferenceClickListener(preference -> showWeightPicker()); + + } + + private boolean showWeightPicker() { + final AlertDialog.Builder d = new AlertDialog.Builder(this); + final SharedPreferences preferences= PreferenceManager.getDefaultSharedPreferences(this); + d.setTitle(getString(R.string.pref_weight)); + View v= getLayoutInflater().inflate(R.layout.dialog_weight_picker, null); + NumberPicker np = v.findViewById(R.id.weightPicker); + np.setMaxValue((int) UnitUtils.CHOSEN_SYSTEM.getWeightFromKilogram(150)); + np.setMinValue((int) UnitUtils.CHOSEN_SYSTEM.getWeightFromKilogram(20)); + np.setValue(preferences.getInt("weight", 80)); + np.setFormatter(value -> value + UnitUtils.CHOSEN_SYSTEM.getWeightUnit()); + np.setWrapSelectorWheel(false); + + d.setView(v); + + d.setNegativeButton(R.string.cancel, null); + d.setPositiveButton(R.string.okay, (DialogInterface.OnClickListener) (dialog, which) -> { + int unitValue= np.getValue(); + int kilograms= (int)Math.round(UnitUtils.CHOSEN_SYSTEM.getKilogramFromUnit(unitValue)); + preferences.edit().putInt("weight", kilograms).apply(); + }); + + d.create().show(); + + return true; + } + + /** + * Set up the {@link android.app.ActionBar}, if the API is available. + */ + private void setupActionBar() { + ActionBar actionBar = getActionBar(); + if (actionBar != null) { + // Show the Up button in the action bar. + actionBar.setDisplayHomeAsUpEnabled(true); + } + } + + @Override + protected void onPause() { + super.onPause(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + UnitUtils.setUnit(this); + } + + @Override + public boolean onMenuItemSelected(int featureId, MenuItem item) { + int id = item.getItemId(); + if (id == android.R.id.home) { + if (!super.onMenuItemSelected(featureId, item)) { + NavUtils.navigateUpFromSameTask(this); + } + return true; + } + return super.onMenuItemSelected(featureId, item); + } +} diff --git a/app/src/main/java/de/tadris/fitness/activity/ShowWorkoutActivity.java b/app/src/main/java/de/tadris/fitness/activity/ShowWorkoutActivity.java index 2721da2..3da5e35 100644 --- a/app/src/main/java/de/tadris/fitness/activity/ShowWorkoutActivity.java +++ b/app/src/main/java/de/tadris/fitness/activity/ShowWorkoutActivity.java @@ -63,7 +63,7 @@ import de.tadris.fitness.data.WorkoutSample; import de.tadris.fitness.map.MapManager; import de.tadris.fitness.map.WorkoutLayer; import de.tadris.fitness.util.ThemeManager; -import de.tadris.fitness.util.UnitUtils; +import de.tadris.fitness.util.unit.UnitUtils; import de.tadris.fitness.util.WorkoutTypeCalculator; public class ShowWorkoutActivity extends FitoTrackActivity { diff --git a/app/src/main/java/de/tadris/fitness/util/unit/Imperial.java b/app/src/main/java/de/tadris/fitness/util/unit/Imperial.java new file mode 100644 index 0000000..f4e3c85 --- /dev/null +++ b/app/src/main/java/de/tadris/fitness/util/unit/Imperial.java @@ -0,0 +1,54 @@ +package de.tadris.fitness.util.unit; + +public class Imperial implements Unit { + + @Override + public int getId() { + return 3; + } + + @Override + public double getDistanceFromMeters(double meters) { + return meters * 1.093613d; + } + + @Override + public double getDistanceFromKilometers(double kilometers) { + return kilometers * 0.62137d; + } + + @Override + public double getWeightFromKilogram(double kilogram) { + return kilogram * 2.2046; + } + + @Override + public double getKilogramFromUnit(double unit) { + return unit / 2.2046; + } + + @Override + public double getSpeedFromMeterPerSecond(double meterPerSecond) { + return meterPerSecond*3.6*0.62137d; + } + + @Override + public String getLongDistanceUnit() { + return "mi"; + } + + @Override + public String getShortDistanceUnit() { + return "yd"; + } + + @Override + public String getWeightUnit() { + return "lbs"; + } + + @Override + public String getSpeedUnit() { + return "mi/h"; + } +} diff --git a/app/src/main/java/de/tadris/fitness/util/unit/ImperialWithMeters.java b/app/src/main/java/de/tadris/fitness/util/unit/ImperialWithMeters.java new file mode 100644 index 0000000..caf47fa --- /dev/null +++ b/app/src/main/java/de/tadris/fitness/util/unit/ImperialWithMeters.java @@ -0,0 +1,23 @@ +package de.tadris.fitness.util.unit; + +public class ImperialWithMeters extends Imperial { + + @Override + public int getId() { + return 4; + } + + @Override + public double getDistanceFromMeters(double meters) { + return meters; + } + @Override + public String getLongDistanceUnit() { + return "m"; + } + + @Override + public String getShortDistanceUnit() { + return "yd"; + } +} diff --git a/app/src/main/java/de/tadris/fitness/util/unit/Metric.java b/app/src/main/java/de/tadris/fitness/util/unit/Metric.java new file mode 100644 index 0000000..8dba963 --- /dev/null +++ b/app/src/main/java/de/tadris/fitness/util/unit/Metric.java @@ -0,0 +1,54 @@ +package de.tadris.fitness.util.unit; + +public class Metric implements Unit{ + + @Override + public int getId() { + return 1; + } + + @Override + public double getDistanceFromMeters(double meters) { + return meters; + } + + @Override + public double getDistanceFromKilometers(double kilometers) { + return kilometers; + } + + @Override + public double getWeightFromKilogram(double kilogram) { + return kilogram; + } + + @Override + public double getKilogramFromUnit(double unit) { + return unit; + } + + @Override + public double getSpeedFromMeterPerSecond(double meterPerSecond) { + return meterPerSecond * 3.6; + } + + @Override + public String getLongDistanceUnit() { + return "km"; + } + + @Override + public String getShortDistanceUnit() { + return "m"; + } + + @Override + public String getWeightUnit() { + return "kg"; + } + + @Override + public String getSpeedUnit() { + return "km/h"; + } +} diff --git a/app/src/main/java/de/tadris/fitness/util/unit/MetricPhysical.java b/app/src/main/java/de/tadris/fitness/util/unit/MetricPhysical.java new file mode 100644 index 0000000..af979a4 --- /dev/null +++ b/app/src/main/java/de/tadris/fitness/util/unit/MetricPhysical.java @@ -0,0 +1,19 @@ +package de.tadris.fitness.util.unit; + +public class MetricPhysical extends Metric{ + + @Override + public int getId() { + return 2; + } + + @Override + public double getSpeedFromMeterPerSecond(double meterPerSecond) { + return meterPerSecond; + } + + @Override + public String getSpeedUnit() { + return "m/s"; + } +} diff --git a/app/src/main/java/de/tadris/fitness/util/unit/Unit.java b/app/src/main/java/de/tadris/fitness/util/unit/Unit.java new file mode 100644 index 0000000..f0817d0 --- /dev/null +++ b/app/src/main/java/de/tadris/fitness/util/unit/Unit.java @@ -0,0 +1,16 @@ +package de.tadris.fitness.util.unit; + +public interface Unit { + + int getId(); + double getDistanceFromMeters(double meters); + double getDistanceFromKilometers(double kilometers); + double getWeightFromKilogram(double kilogram); + double getKilogramFromUnit(double unit); + double getSpeedFromMeterPerSecond(double meterPerSecond); + String getLongDistanceUnit(); + String getShortDistanceUnit(); + String getWeightUnit(); + String getSpeedUnit(); + +} diff --git a/app/src/main/java/de/tadris/fitness/util/UnitUtils.java b/app/src/main/java/de/tadris/fitness/util/unit/UnitUtils.java similarity index 58% rename from app/src/main/java/de/tadris/fitness/util/UnitUtils.java rename to app/src/main/java/de/tadris/fitness/util/unit/UnitUtils.java index 7c06993..831ebd6 100644 --- a/app/src/main/java/de/tadris/fitness/util/UnitUtils.java +++ b/app/src/main/java/de/tadris/fitness/util/unit/UnitUtils.java @@ -17,10 +17,36 @@ * along with this program. If not, see . */ -package de.tadris.fitness.util; +package de.tadris.fitness.util.unit; + +import android.content.Context; +import android.preference.PreferenceManager; public class UnitUtils { + public static final Unit UNITS_METRIC= new Metric(); + public static final Unit UNITS_METRIC_PHYSICAL= new MetricPhysical(); + public static final Unit UNITS_IMPERIAL_YARDS= new Imperial(); + public static final Unit UNITS_IMPERIAL_METERS= new ImperialWithMeters(); + public static final Unit[] supportedUnits= new Unit[] { + UNITS_METRIC, UNITS_METRIC_PHYSICAL, UNITS_IMPERIAL_YARDS, UNITS_IMPERIAL_METERS + }; + + public static Unit CHOSEN_SYSTEM= UNITS_METRIC; + + public static void setUnit(Context context){ + PreferenceManager.getDefaultSharedPreferences(context).getInt("unitSystem", UnitUtils.UNITS_METRIC.getId()); + } + + public static void setUnit(int id){ + CHOSEN_SYSTEM= UNITS_METRIC; + for(Unit unit : supportedUnits){ + if(id == unit.getId()){ + CHOSEN_SYSTEM= unit; + } + } + } + public static String getHourMinuteTime(long time){ long seks= time / 1000; long mins= seks / 60; @@ -51,18 +77,18 @@ public class UnitUtils { * @return Pace */ public static String getPace(double pace){ - // TODO: use preferred unit chosen by user - return round(pace, 1) + " min/km"; + double one= CHOSEN_SYSTEM.getDistanceFromKilometers(1); + return round(pace / one, 1) + " min/" + CHOSEN_SYSTEM.getLongDistanceUnit(); } /** - * + *CHOSEN_SYSTEM.getLongDistanceUnit() * @param consumption consumption in kcal/km * @return */ public static String getRelativeEnergyConsumption(double consumption){ - // TODO: use preferred unit chosen by user - return round(consumption, 2) + " kcal/km"; + double one= CHOSEN_SYSTEM.getDistanceFromKilometers(1); + return round(consumption / one, 2) + " kcal/" + CHOSEN_SYSTEM.getLongDistanceUnit(); } /** @@ -71,11 +97,11 @@ public class UnitUtils { * @return String in preferred unit */ public static String getDistance(int distance){ - // TODO: use preferred unit chosen by user - if(distance >= 1000){ - return getDistanceInKilometers((double)distance); + double units= CHOSEN_SYSTEM.getDistanceFromMeters(distance); + if(units >= 1000){ + return round(units / 1000, 1) + " " + CHOSEN_SYSTEM.getLongDistanceUnit(); }else{ - return getDistanceInMeters(distance); + return (int)units + " " + CHOSEN_SYSTEM.getShortDistanceUnit(); } } @@ -85,16 +111,7 @@ public class UnitUtils { * @return speed in km/h */ public static String getSpeed(double speed){ - // TODO: use preferred unit chosen by user - return round(speed*3.6, 1) + " km/h"; - } - - public static String getDistanceInMeters(int distance){ - return distance + " m"; - } - - public static String getDistanceInKilometers(double distance){ - return round(distance / 1000, 1) + " km"; + return round(CHOSEN_SYSTEM.getSpeedFromMeterPerSecond(speed), 1) + " " + CHOSEN_SYSTEM.getSpeedUnit(); } public static double round(double d, int count){ diff --git a/app/src/main/res/layout/dialog_weight_picker.xml b/app/src/main/res/layout/dialog_weight_picker.xml new file mode 100644 index 0000000..089f04d --- /dev/null +++ b/app/src/main/res/layout/dialog_weight_picker.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dd0b5a5..0adace8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -23,6 +23,8 @@ Stop Delete + Silent + Time Date Duration @@ -52,4 +54,7 @@ Do you really want to delete the workout? Cancel + Your Weight + Your weight is needed to calculate the burned calories + Preferred system of units diff --git a/app/src/main/res/values/unit_systems.xml b/app/src/main/res/values/unit_systems.xml new file mode 100644 index 0000000..3c8d795 --- /dev/null +++ b/app/src/main/res/values/unit_systems.xml @@ -0,0 +1,18 @@ + + + + + Metric + Metric Physical (m/s) + Imperial + Imperial with meters + + + + 1 + 2 + 3 + 4 + + + \ 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 new file mode 100644 index 0000000..87faae1 --- /dev/null +++ b/app/src/main/res/xml/preferences_main.xml @@ -0,0 +1,18 @@ + + + + + + + + + \ No newline at end of file