1
0
mirror of https://github.com/oliexdev/openScale.git synced 2025-08-21 07:51:46 +02:00

Merge pull request #217 from erijo/issue-216

Issue 216
This commit is contained in:
OliE
2018-03-10 11:25:23 +01:00
committed by GitHub
5 changed files with 101 additions and 49 deletions

View File

@@ -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()));

View File

@@ -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

View File

@@ -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);
}
}
}

View File

@@ -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

View File

@@ -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