From cadedb9a6009943a1891d72a53d5c28148d9efe9 Mon Sep 17 00:00:00 2001 From: OliE Date: Sun, 18 Jun 2017 08:37:34 +0200 Subject: [PATCH] add option to average data points in the diagram for one day/month make time and date editable on new measurement dialog --- .../gui/activities/DataEntryActivity.java | 4 +- .../gui/activities/UserSettingsActivity.java | 4 +- .../gui/fragments/GraphFragment.java | 71 +++++++++++++------ .../app/src/main/res/values-de/strings.xml | 1 + .../app/src/main/res/values/strings.xml | 1 + .../src/main/res/xml/graph_preferences.xml | 1 + 6 files changed, 56 insertions(+), 26 deletions(-) diff --git a/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java b/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java index 034d6c98..d6470ddb 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java @@ -258,8 +258,8 @@ public class DataEntryActivity extends Activity { btnRight.setVisibility(View.GONE); expandButton.setVisibility(View.GONE); switchEditMode.setVisibility(View.GONE); - dateMeasurement.setVisibility(View.GONE); - timeMeasurement.setVisibility(View.GONE); + dateMeasurement.setVisibility(View.VISIBLE); + timeMeasurement.setVisibility(View.VISIBLE); break; } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/activities/UserSettingsActivity.java b/android_app/app/src/main/java/com/health/openscale/gui/activities/UserSettingsActivity.java index 26d7a315..b208383b 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/activities/UserSettingsActivity.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/activities/UserSettingsActivity.java @@ -292,7 +292,7 @@ public class UserSettingsActivity extends Activity { String date = txtBirthday.getText().toString(); String goal_date = txtGoalDate.getText().toString(); - int id = -1; + int id = 0; if (getIntent().getExtras().getInt("mode") == EDIT_USER_REQUEST) { @@ -302,7 +302,7 @@ public class UserSettingsActivity extends Activity { { openScale.addScaleUser(name, date, body_height, scale_unit, gender, initial_weight, goal_weight, goal_date); - id = openScale.getScaleUserList().get(openScale.getScaleUserList().size()-1).id; + id = openScale.getScaleUserList().get(openScale.getScaleUserList().size() - 1).id; } SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); diff --git a/android_app/app/src/main/java/com/health/openscale/gui/fragments/GraphFragment.java b/android_app/app/src/main/java/com/health/openscale/gui/fragments/GraphFragment.java index 5deca431..a0d27981 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/fragments/GraphFragment.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/fragments/GraphFragment.java @@ -42,6 +42,7 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.List; import java.util.Locale; +import java.util.Stack; import lecho.lib.hellocharts.formatter.SimpleLineChartValueFormatter; import lecho.lib.hellocharts.listener.ColumnChartOnValueSelectListener; @@ -81,6 +82,7 @@ public class GraphFragment extends Fragment implements FragmentUpdateListener { private Calendar calLastSelected; private ArrayList scaleDataList; + private ArrayList pointIndexScaleDataList; public GraphFragment() { calYears = Calendar.getInstance(); @@ -174,54 +176,79 @@ public class GraphFragment extends Fragment implements FragmentUpdateListener { generateGraphs(); } + /** + * Add a point to a point value stack. + * + * Average y value of point if x value is already on the stack and option "averageData" is enabled. + * + * @param pointValues stack of point values + * @param value_x x value of the point + * @param value_y y value of the point + * @return true if a new point was added otherwise false if point was average added to an existing point + */ + private boolean addPointValue(Stack pointValues, float value_x, float value_y) { + if (prefs.getBoolean("averageData", true) && !pointValues.isEmpty() && pointValues.peek().getX() == value_x) { + pointValues.push(new PointValue(value_x, (pointValues.pop().getY() + value_y) / 2.0f)); + } else { + if (value_y != 0.0f) { // don't show zero values + pointValues.add(new PointValue(value_x, value_y)); + return true; + } + } + + return false; + } + private void generateLineData(int field) { SimpleDateFormat day_date = new SimpleDateFormat("D", Locale.getDefault()); if (field == Calendar.DAY_OF_MONTH) { day_date = new SimpleDateFormat("dd", Locale.getDefault()); + } else if (field == Calendar.MONTH) { + day_date = new SimpleDateFormat("MMM", Locale.getDefault()); } Calendar calDays = (Calendar)calLastSelected.clone(); - calDays.set(field, 1); + calDays.set(field, calDays.getActualMinimum(field)); int maxDays = calDays.getActualMaximum(field); List axisValues = new ArrayList(); - for (int i=0; i valuesWeight = new ArrayList(); - List valuesFat = new ArrayList(); - List valuesWater = new ArrayList(); - List valuesMuscle = new ArrayList(); - List valuesWaist = new ArrayList(); - List valuesHip = new ArrayList(); + Stack valuesWeight = new Stack(); + Stack valuesFat = new Stack(); + Stack valuesWater = new Stack(); + Stack valuesMuscle = new Stack(); + Stack valuesWaist = new Stack(); + Stack valuesHip = new Stack(); List lines = new ArrayList(); Calendar calDB = Calendar.getInstance(); + pointIndexScaleDataList = new ArrayList<>(); + for(ScaleData scaleEntry: scaleDataList) { calDB.setTime(scaleEntry.getDateTime()); - valuesWeight.add(new PointValue(calDB.get(field)-1, scaleEntry.getConvertedWeight(openScale.getSelectedScaleUser().scale_unit))); - if (scaleEntry.getFat() != 0.0f) - valuesFat.add(new PointValue(calDB.get(field)-1, scaleEntry.getFat())); - if (scaleEntry.getWater() != 0.0f) - valuesWater.add(new PointValue(calDB.get(field)-1, scaleEntry.getWater())); - if (scaleEntry.getMuscle() != 0.0f) - valuesMuscle.add(new PointValue(calDB.get(field)-1, scaleEntry.getMuscle())); - if (scaleEntry.getWaist() != 0.0f) - valuesWaist.add(new PointValue(calDB.get(field)-1, scaleEntry.getWaist())); - if (scaleEntry.getHip() != 0.0f) - valuesHip.add(new PointValue(calDB.get(field)-1, scaleEntry.getHip())); + if (addPointValue(valuesWeight, calDB.get(field), scaleEntry.getConvertedWeight(openScale.getSelectedScaleUser().scale_unit))) { + pointIndexScaleDataList.add(scaleEntry); // if new point was added, add this point to pointIndexScaleDataList to get the correct point index after selecting an point + } + + addPointValue(valuesFat, calDB.get(field), scaleEntry.getFat()); + addPointValue(valuesWater, calDB.get(field), scaleEntry.getWater()); + addPointValue(valuesMuscle, calDB.get(field), scaleEntry.getMuscle()); + addPointValue(valuesWaist, calDB.get(field), scaleEntry.getWaist()); + addPointValue(valuesHip, calDB.get(field), scaleEntry.getHip()); } @@ -375,7 +402,7 @@ public class GraphFragment extends Fragment implements FragmentUpdateListener { scaleDataList = openScale.getScaleDataOfYear(calYears.get(Calendar.YEAR)); - generateLineData(Calendar.DAY_OF_YEAR); + generateLineData(Calendar.MONTH); } } @@ -414,7 +441,7 @@ public class GraphFragment extends Fragment implements FragmentUpdateListener { private class chartBottomValueTouchListener implements LineChartOnValueSelectListener { @Override public void onValueSelected(int lineIndex, int pointIndex, PointValue pointValue) { - ScaleData scaleData = scaleDataList.get(pointIndex); + ScaleData scaleData = pointIndexScaleDataList.get(pointIndex); long id = scaleData.getId(); diff --git a/android_app/app/src/main/res/values-de/strings.xml b/android_app/app/src/main/res/values-de/strings.xml index da634061..edd24752 100644 --- a/android_app/app/src/main/res/values-de/strings.xml +++ b/android_app/app/src/main/res/values-de/strings.xml @@ -130,4 +130,5 @@ Gebe dein Gewicht in deiner Einheit an Gebe dein Gewicht in deiner Einheit an Fehler Anfangsgewicht ist erforderlich + Berechne Durchschnitt pro Tag/Monat \ No newline at end of file diff --git a/android_app/app/src/main/res/values/strings.xml b/android_app/app/src/main/res/values/strings.xml index a73186b5..4d63f1df 100644 --- a/android_app/app/src/main/res/values/strings.xml +++ b/android_app/app/src/main/res/values/strings.xml @@ -149,4 +149,5 @@ not found Ignore data that are out of range Initial weight + Calculate average per day/month diff --git a/android_app/app/src/main/res/xml/graph_preferences.xml b/android_app/app/src/main/res/xml/graph_preferences.xml index 046fecc7..68432cf8 100644 --- a/android_app/app/src/main/res/xml/graph_preferences.xml +++ b/android_app/app/src/main/res/xml/graph_preferences.xml @@ -3,4 +3,5 @@ + \ No newline at end of file