From 36adc936bb756164e9523b8f9e748c3620136950 Mon Sep 17 00:00:00 2001 From: Erik Johansson Date: Thu, 19 Apr 2018 22:34:31 +0200 Subject: [PATCH] Make it possible to show/input bone in % Fixes #246. --- .../gui/views/BoneMeasurementView.java | 12 ++- .../gui/views/FatMeasurementView.java | 4 +- .../gui/views/FloatMeasurementView.java | 81 ++++++++++++++----- .../gui/views/MeasurementViewSettings.java | 11 ++- .../gui/views/MuscleMeasurementView.java | 4 +- .../gui/views/WaterMeasurementView.java | 4 +- 6 files changed, 89 insertions(+), 27 deletions(-) diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/BoneMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/BoneMeasurementView.java index 394d4e52..a2f70afd 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/BoneMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/BoneMeasurementView.java @@ -38,6 +38,11 @@ public class BoneMeasurementView extends FloatMeasurementView { return KEY; } + @Override + protected boolean supportsAbsoluteWeightToPercentageConversion() { + return true; + } + @Override protected float getMeasurementValue(ScaleMeasurement measurement) { return Converters.fromKilogram(measurement.getBone(), getScaleUser().getScaleUnit()); @@ -50,12 +55,17 @@ public class BoneMeasurementView extends FloatMeasurementView { @Override public String getUnit() { + if (shouldConvertAbsoluteWeightToPercentage()) { + return "%"; + } + return getScaleUser().getScaleUnit().toString(); } @Override protected float getMaxValue() { - return Converters.fromKilogram(50, getScaleUser().getScaleUnit()); + return maybeConvertAbsoluteWeightToPercentage( + Converters.fromKilogram(50, getScaleUser().getScaleUnit())); } @Override 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 7743a2c7..cf8f1c0a 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 @@ -40,7 +40,7 @@ public class FatMeasurementView extends FloatMeasurementView { } @Override - protected boolean canConvertPercentageToAbsoluteWeight() { + protected boolean supportsPercentageToAbsoluteWeightConversion() { return true; } @@ -65,7 +65,7 @@ public class FatMeasurementView extends FloatMeasurementView { @Override protected float getMaxValue() { - return maybeConvertPercentageToAbsolute(80); + return maybeConvertPercentageToAbsoluteWeight(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 5b3ca304..d700cb22 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 @@ -142,16 +142,15 @@ public abstract class FloatMeasurementView extends MeasurementView { setValueView(formatValue(value) + suffix, callListener); if (getMeasurementMode() != MeasurementViewMode.ADD) { + final float evalValue = maybeConvertValue(value); + EvaluationSheet evalSheet = new EvaluationSheet(getScaleUser(), dateTime); - float evalValue = value; - if (shouldConvertPercentageToAbsoluteWeight()) { - evalValue = makeRelativeWeight(value); - } evaluationResult = evaluateSheet(evalSheet, evalValue); - if (shouldConvertPercentageToAbsoluteWeight()) { + + if (evaluationResult != null) { evaluationResult.value = value; - evaluationResult.lowLimit = makeAbsoluteWeight(evaluationResult.lowLimit); - evaluationResult.highLimit = makeAbsoluteWeight(evaluationResult.highLimit); + evaluationResult.lowLimit = maybeConvertValue(evaluationResult.lowLimit); + evaluationResult.highLimit = maybeConvertValue(evaluationResult.highLimit); } } } @@ -246,12 +245,30 @@ public abstract class FloatMeasurementView extends MeasurementView { && getMeasurementMode() == MeasurementViewMode.ADD; } - protected boolean canConvertPercentageToAbsoluteWeight() { return false; } + // Only one of these can return true + protected boolean supportsAbsoluteWeightToPercentageConversion() { return false; } + protected boolean supportsPercentageToAbsoluteWeightConversion() { return false; } + + private boolean supportsConversion() { + return supportsAbsoluteWeightToPercentageConversion() + || supportsPercentageToAbsoluteWeightConversion(); + } + + protected boolean shouldConvertAbsoluteWeightToPercentage() { + return supportsAbsoluteWeightToPercentageConversion() + && getSettings().isPercentageEnabled(); + } + protected boolean shouldConvertPercentageToAbsoluteWeight() { - return canConvertPercentageToAbsoluteWeight() + return supportsPercentageToAbsoluteWeightConversion() && !getSettings().isPercentageEnabled(); } + private boolean shouldConvert() { + return shouldConvertAbsoluteWeightToPercentage() + || shouldConvertPercentageToAbsoluteWeight(); + } + private float makeAbsoluteWeight(float percentage) { return userConvertedWeight / 100.0f * percentage; } @@ -260,7 +277,26 @@ public abstract class FloatMeasurementView extends MeasurementView { return 100.0f / userConvertedWeight * absolute; } - protected float maybeConvertPercentageToAbsolute(float value) { + protected float maybeConvertAbsoluteWeightToPercentage(float value) { + if (shouldConvertAbsoluteWeightToPercentage()) { + return makeRelativeWeight(value); + } + + return value; + } + + protected float maybeConvertPercentageToAbsoluteWeight(float value) { + if (shouldConvertPercentageToAbsoluteWeight()) { + return makeAbsoluteWeight(value); + } + + return value; + } + + private float maybeConvertValue(float value) { + if (shouldConvertAbsoluteWeightToPercentage()) { + return makeRelativeWeight(value); + } if (shouldConvertPercentageToAbsoluteWeight()) { return makeAbsoluteWeight(value); } @@ -269,13 +305,13 @@ public abstract class FloatMeasurementView extends MeasurementView { } private void updateUserConvertedWeight(ScaleMeasurement measurement) { - if (shouldConvertPercentageToAbsoluteWeight()) { + if (shouldConvert()) { // 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 + // Only valid when a conversion is enabled userConvertedWeight = -1.0f; } } @@ -291,7 +327,7 @@ public abstract class FloatMeasurementView extends MeasurementView { updateUserConvertedWeight(measurement); newValue = getMeasurementValue(measurement); - newValue = maybeConvertPercentageToAbsolute(newValue); + newValue = maybeConvertValue(newValue); newValue = clampValue(newValue); if (previousMeasurement != null) { @@ -299,7 +335,7 @@ public abstract class FloatMeasurementView extends MeasurementView { updateUserConvertedWeight(previousMeasurement); newPreviousValue = getMeasurementValue(previousMeasurement); - newPreviousValue = maybeConvertPercentageToAbsolute(newPreviousValue); + newPreviousValue = maybeConvertValue(newPreviousValue); newPreviousValue = clampValue(newPreviousValue); userConvertedWeight = saveUserConvertedWeight; @@ -312,10 +348,17 @@ public abstract class FloatMeasurementView extends MeasurementView { @Override public void saveTo(ScaleMeasurement measurement) { if (!useAutoValue()) { - if (shouldConvertPercentageToAbsoluteWeight()) { - // Make sure to use the current weight to get a correct percentage + if (shouldConvert()) { + // Make sure to use the current weight to get a correct value updateUserConvertedWeight(measurement); - setMeasurementValue(makeRelativeWeight(value), measurement); + + // Need to convert back to original value before setting + if (shouldConvertPercentageToAbsoluteWeight()) { + setMeasurementValue(makeRelativeWeight(value), measurement); + } + else if (shouldConvertAbsoluteWeightToPercentage()){ + setMeasurementValue(makeAbsoluteWeight(value), measurement); + } } else { setMeasurementValue(value, measurement); @@ -430,7 +473,7 @@ public abstract class FloatMeasurementView extends MeasurementView { if (settings.isInOverviewGraph()) { summary += res.getString(R.string.label_overview_graph) + separator; } - if (canConvertPercentageToAbsoluteWeight() && settings.isPercentageEnabled()) { + if (supportsConversion() && settings.isPercentageEnabled()) { summary += res.getString(R.string.label_percent) + separator; } if (isEstimationSupported() && settings.isEstimationEnabled()) { @@ -458,7 +501,7 @@ public abstract class FloatMeasurementView extends MeasurementView { overview.setDefaultValue(settings.isInOverviewGraph()); screen.addPreference(overview); - if (canConvertPercentageToAbsoluteWeight()) { + if (supportsConversion()) { SwitchPreference percentage = new SwitchPreference(screen.getContext()); percentage.setKey(settings.getPercentageEnabledKey()); percentage.setTitle(R.string.label_measurement_in_percent); diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementViewSettings.java b/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementViewSettings.java index 2175ca3a..98d94dda 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementViewSettings.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementViewSettings.java @@ -130,7 +130,16 @@ public class MeasurementViewSettings { } public boolean isPercentageEnabled() { - return preferences.getBoolean(getPercentageEnabledKey(), true); + boolean defaultValue; + switch (key) { + case BoneMeasurementView.KEY: + defaultValue = false; + break; + default: + defaultValue = true; + break; + } + return preferences.getBoolean(getPercentageEnabledKey(), defaultValue); } public String getEstimationEnabledKey() { 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 4eb2d047..d525c132 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 @@ -38,7 +38,7 @@ public class MuscleMeasurementView extends FloatMeasurementView { } @Override - protected boolean canConvertPercentageToAbsoluteWeight() { + protected boolean supportsPercentageToAbsoluteWeightConversion() { return true; } @@ -63,7 +63,7 @@ public class MuscleMeasurementView extends FloatMeasurementView { @Override protected float getMaxValue() { - return maybeConvertPercentageToAbsolute(80); + return maybeConvertPercentageToAbsoluteWeight(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 8c7bd66b..c6904717 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 @@ -40,7 +40,7 @@ public class WaterMeasurementView extends FloatMeasurementView { } @Override - protected boolean canConvertPercentageToAbsoluteWeight() { + protected boolean supportsPercentageToAbsoluteWeightConversion() { return true; } @@ -65,7 +65,7 @@ public class WaterMeasurementView extends FloatMeasurementView { @Override protected float getMaxValue() { - return maybeConvertPercentageToAbsolute(80); + return maybeConvertPercentageToAbsoluteWeight(80); } @Override