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 521f37b2..ddc775d1 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 @@ -43,6 +43,7 @@ import com.health.openscale.gui.views.DateMeasurementView; import com.health.openscale.gui.views.MeasurementView; import com.health.openscale.gui.views.MeasurementViewUpdateListener; import com.health.openscale.gui.views.TimeMeasurementView; +import com.health.openscale.gui.views.WeightMeasurementView; import java.text.DateFormat; import java.util.Date; @@ -446,6 +447,17 @@ public class DataEntryActivity extends AppCompatActivity { view.saveTo(scaleMeasurement); isDirty = true; + // When weight is updated we may need to re-save some values that are stored + // as percentages, but that the user may have set up to be shown as absolute. + // Otherwise that measurement (e.g. fat) may change when weight is updated. + if (view instanceof WeightMeasurementView) { + for (MeasurementView measurement : dataEntryMeasurements) { + if (measurement != view) { + measurement.saveTo(scaleMeasurement); + } + } + } + txtDataNr.setText(DateFormat.getDateTimeInstance( DateFormat.LONG, DateFormat.SHORT).format(scaleMeasurement.getDateTime())); 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..2c62eb0b 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; @@ -134,7 +135,16 @@ public abstract class FloatMeasurementView extends MeasurementView { if (getMeasurementMode() != MeasurementViewMode.ADD) { EvaluationSheet evalSheet = new EvaluationSheet(getScaleUser(), dateTime); - evaluationResult = evaluateSheet(evalSheet, value); + float evalValue = value; + if (shouldConvertPercentageToAbsoluteWeight()) { + evalValue = makeRelativeWeight(value); + } + evaluationResult = evaluateSheet(evalSheet, evalValue); + if (shouldConvertPercentageToAbsoluteWeight()) { + evaluationResult.value = value; + evaluationResult.lowLimit = makeAbsoluteWeight(evaluationResult.lowLimit); + evaluationResult.highLimit = makeAbsoluteWeight(evaluationResult.highLimit); + } } } setEvaluationView(evaluationResult); @@ -227,6 +237,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 +277,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 +301,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