From 403224de885de9c62ea8b81031f11cc7e2270fde Mon Sep 17 00:00:00 2001 From: Erik Johansson Date: Wed, 7 Mar 2018 20:41:00 +0100 Subject: [PATCH] Move conversion to/from absolute/relative weight to base class --- .../gui/views/FatMeasurementView.java | 23 +++----- .../gui/views/FloatMeasurementView.java | 58 ++++++++++++++++++- .../gui/views/MuscleMeasurementView.java | 23 +++----- .../gui/views/WaterMeasurementView.java | 23 +++----- 4 files changed, 79 insertions(+), 48 deletions(-) diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/FatMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/FatMeasurementView.java index a7eca547..3e1d933b 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/FatMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/FatMeasurementView.java @@ -47,21 +47,18 @@ public class FatMeasurementView extends FloatMeasurementView { } @Override - protected float getMeasurementValue(ScaleMeasurement measurement) { - if (percentageEnable) { - return measurement.getFat(); - } + protected boolean shouldConvertPercentageToAbsoluteWeight() { + return !percentageEnable; + } - return measurement.getConvertedWeight(getScaleUser().getScaleUnit()) / 100.0f * measurement.getFat(); + @Override + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getFat(); } @Override protected void setMeasurementValue(float value, ScaleMeasurement measurement) { - if (percentageEnable) { - measurement.setFat(value); - } else { - measurement.setFat(100.0f / measurement.getConvertedWeight(getScaleUser().getScaleUnit()) * value); - } + measurement.setFat(value); } @Override @@ -75,11 +72,7 @@ public class FatMeasurementView extends FloatMeasurementView { @Override protected float getMaxValue() { - if (percentageEnable) { - return 80; - } - - return 300; + return maybeConvertPercentageToAbsolute(80); } @Override diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/FloatMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/FloatMeasurementView.java index ade46da1..faa4fd8b 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/FloatMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/FloatMeasurementView.java @@ -54,6 +54,7 @@ public abstract class FloatMeasurementView extends MeasurementView { private Date dateTime; private float value = NO_VALUE; private float previousValue = NO_VALUE; + private float userConvertedWeight; private EvaluationResult evaluationResult; private String nameText; @@ -227,6 +228,38 @@ public abstract class FloatMeasurementView extends MeasurementView { return isEstimationEnabled() && getMeasurementMode() == MeasurementViewMode.ADD; } + protected boolean shouldConvertPercentageToAbsoluteWeight() { + return false; + } + + private float makeAbsoluteWeight(float percentage) { + return userConvertedWeight / 100.0f * percentage; + } + + private float makeRelativeWeight(float absolute) { + return 100.0f / userConvertedWeight * absolute; + } + + protected float maybeConvertPercentageToAbsolute(float value) { + if (shouldConvertPercentageToAbsoluteWeight()) { + return makeAbsoluteWeight(value); + } + + return value; + } + + private void updateUserConvertedWeight(ScaleMeasurement measurement) { + if (shouldConvertPercentageToAbsoluteWeight()) { + // Make sure weight is never 0 to avoid division by 0 + userConvertedWeight = Math.max(1.0f, + measurement.getConvertedWeight(getScaleUser().getScaleUnit())); + } + else { + // Only valid when shouldConvertPercentageToAbsoluteWeight() returns true + userConvertedWeight = -1.0f; + } + } + @Override public void loadFrom(ScaleMeasurement measurement, ScaleMeasurement previousMeasurement) { dateTime = measurement.getDateTime(); @@ -235,9 +268,21 @@ public abstract class FloatMeasurementView extends MeasurementView { float newPreviousValue = NO_VALUE; if (!useAutoValue()) { - newValue = clampValue(getMeasurementValue(measurement)); + updateUserConvertedWeight(measurement); + + newValue = getMeasurementValue(measurement); + newValue = maybeConvertPercentageToAbsolute(newValue); + newValue = clampValue(newValue); + if (previousMeasurement != null) { - newPreviousValue = clampValue(getMeasurementValue(previousMeasurement)); + float saveUserConvertedWeight = userConvertedWeight; + updateUserConvertedWeight(previousMeasurement); + + newPreviousValue = getMeasurementValue(previousMeasurement); + newPreviousValue = maybeConvertPercentageToAbsolute(newPreviousValue); + newPreviousValue = clampValue(newPreviousValue); + + userConvertedWeight = saveUserConvertedWeight; } } @@ -247,7 +292,14 @@ public abstract class FloatMeasurementView extends MeasurementView { @Override public void saveTo(ScaleMeasurement measurement) { if (!useAutoValue()) { - setMeasurementValue(value, measurement); + if (shouldConvertPercentageToAbsoluteWeight()) { + // Make sure to use the current weight to get a correct percentage + updateUserConvertedWeight(measurement); + setMeasurementValue(makeRelativeWeight(value), measurement); + } + else { + setMeasurementValue(value, measurement); + } } } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/MuscleMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/MuscleMeasurementView.java index 286b60de..b18f47fa 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/MuscleMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/MuscleMeasurementView.java @@ -45,21 +45,18 @@ public class MuscleMeasurementView extends FloatMeasurementView { } @Override - protected float getMeasurementValue(ScaleMeasurement measurement) { - if (percentageEnable) { - return measurement.getMuscle(); - } + protected boolean shouldConvertPercentageToAbsoluteWeight() { + return !percentageEnable; + } - return measurement.getConvertedWeight(getScaleUser().getScaleUnit()) / 100.0f * measurement.getMuscle(); + @Override + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getMuscle(); } @Override protected void setMeasurementValue(float value, ScaleMeasurement measurement) { - if (percentageEnable) { - measurement.setMuscle(value); - } else { - measurement.setMuscle(100.0f / measurement.getConvertedWeight(getScaleUser().getScaleUnit()) * value); - } + measurement.setMuscle(value); } @Override @@ -73,11 +70,7 @@ public class MuscleMeasurementView extends FloatMeasurementView { @Override protected float getMaxValue() { - if (percentageEnable) { - return 80; - } - - return 300; + return maybeConvertPercentageToAbsolute(80); } @Override diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/WaterMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/WaterMeasurementView.java index 57f0d5a9..53f419f7 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/WaterMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/WaterMeasurementView.java @@ -47,21 +47,18 @@ public class WaterMeasurementView extends FloatMeasurementView { } @Override - protected float getMeasurementValue(ScaleMeasurement measurement) { - if (percentageEnable) { - return measurement.getWater(); - } + protected boolean shouldConvertPercentageToAbsoluteWeight() { + return !percentageEnable; + } - return measurement.getConvertedWeight(getScaleUser().getScaleUnit()) / 100.0f * measurement.getWater(); + @Override + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getWater(); } @Override protected void setMeasurementValue(float value, ScaleMeasurement measurement) { - if (percentageEnable) { - measurement.setWater(value); - } else { - measurement.setWater(100.0f / measurement.getConvertedWeight(getScaleUser().getScaleUnit()) * value); - } + measurement.setWater(value); } @Override @@ -75,11 +72,7 @@ public class WaterMeasurementView extends FloatMeasurementView { @Override protected float getMaxValue() { - if (percentageEnable) { - return 80; - } - - return 300; + return maybeConvertPercentageToAbsolute(80); } @Override