1
0
mirror of https://github.com/oliexdev/openScale.git synced 2025-08-20 23:41:45 +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.MeasurementView;
import com.health.openscale.gui.views.MeasurementViewUpdateListener; import com.health.openscale.gui.views.MeasurementViewUpdateListener;
import com.health.openscale.gui.views.TimeMeasurementView; import com.health.openscale.gui.views.TimeMeasurementView;
import com.health.openscale.gui.views.WeightMeasurementView;
import java.text.DateFormat; import java.text.DateFormat;
import java.util.Date; import java.util.Date;
@@ -446,6 +447,17 @@ public class DataEntryActivity extends AppCompatActivity {
view.saveTo(scaleMeasurement); view.saveTo(scaleMeasurement);
isDirty = true; 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( txtDataNr.setText(DateFormat.getDateTimeInstance(
DateFormat.LONG, DateFormat.SHORT).format(scaleMeasurement.getDateTime())); DateFormat.LONG, DateFormat.SHORT).format(scaleMeasurement.getDateTime()));

View File

@@ -47,21 +47,18 @@ public class FatMeasurementView extends FloatMeasurementView {
} }
@Override @Override
protected float getMeasurementValue(ScaleMeasurement measurement) { protected boolean shouldConvertPercentageToAbsoluteWeight() {
if (percentageEnable) { return !percentageEnable;
return measurement.getFat(); }
}
return measurement.getConvertedWeight(getScaleUser().getScaleUnit()) / 100.0f * measurement.getFat(); @Override
protected float getMeasurementValue(ScaleMeasurement measurement) {
return measurement.getFat();
} }
@Override @Override
protected void setMeasurementValue(float value, ScaleMeasurement measurement) { protected void setMeasurementValue(float value, ScaleMeasurement measurement) {
if (percentageEnable) { measurement.setFat(value);
measurement.setFat(value);
} else {
measurement.setFat(100.0f / measurement.getConvertedWeight(getScaleUser().getScaleUnit()) * value);
}
} }
@Override @Override
@@ -75,11 +72,7 @@ public class FatMeasurementView extends FloatMeasurementView {
@Override @Override
protected float getMaxValue() { protected float getMaxValue() {
if (percentageEnable) { return maybeConvertPercentageToAbsolute(80);
return 80;
}
return 300;
} }
@Override @Override

View File

@@ -54,6 +54,7 @@ public abstract class FloatMeasurementView extends MeasurementView {
private Date dateTime; private Date dateTime;
private float value = NO_VALUE; private float value = NO_VALUE;
private float previousValue = NO_VALUE; private float previousValue = NO_VALUE;
private float userConvertedWeight;
private EvaluationResult evaluationResult; private EvaluationResult evaluationResult;
private String nameText; private String nameText;
@@ -134,7 +135,16 @@ public abstract class FloatMeasurementView extends MeasurementView {
if (getMeasurementMode() != MeasurementViewMode.ADD) { if (getMeasurementMode() != MeasurementViewMode.ADD) {
EvaluationSheet evalSheet = new EvaluationSheet(getScaleUser(), dateTime); 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); setEvaluationView(evaluationResult);
@@ -227,6 +237,38 @@ public abstract class FloatMeasurementView extends MeasurementView {
return isEstimationEnabled() && getMeasurementMode() == MeasurementViewMode.ADD; 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 @Override
public void loadFrom(ScaleMeasurement measurement, ScaleMeasurement previousMeasurement) { public void loadFrom(ScaleMeasurement measurement, ScaleMeasurement previousMeasurement) {
dateTime = measurement.getDateTime(); dateTime = measurement.getDateTime();
@@ -235,9 +277,21 @@ public abstract class FloatMeasurementView extends MeasurementView {
float newPreviousValue = NO_VALUE; float newPreviousValue = NO_VALUE;
if (!useAutoValue()) { if (!useAutoValue()) {
newValue = clampValue(getMeasurementValue(measurement)); updateUserConvertedWeight(measurement);
newValue = getMeasurementValue(measurement);
newValue = maybeConvertPercentageToAbsolute(newValue);
newValue = clampValue(newValue);
if (previousMeasurement != null) { 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 @Override
public void saveTo(ScaleMeasurement measurement) { public void saveTo(ScaleMeasurement measurement) {
if (!useAutoValue()) { 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 @Override
protected float getMeasurementValue(ScaleMeasurement measurement) { protected boolean shouldConvertPercentageToAbsoluteWeight() {
if (percentageEnable) { return !percentageEnable;
return measurement.getMuscle(); }
}
return measurement.getConvertedWeight(getScaleUser().getScaleUnit()) / 100.0f * measurement.getMuscle(); @Override
protected float getMeasurementValue(ScaleMeasurement measurement) {
return measurement.getMuscle();
} }
@Override @Override
protected void setMeasurementValue(float value, ScaleMeasurement measurement) { protected void setMeasurementValue(float value, ScaleMeasurement measurement) {
if (percentageEnable) { measurement.setMuscle(value);
measurement.setMuscle(value);
} else {
measurement.setMuscle(100.0f / measurement.getConvertedWeight(getScaleUser().getScaleUnit()) * value);
}
} }
@Override @Override
@@ -73,11 +70,7 @@ public class MuscleMeasurementView extends FloatMeasurementView {
@Override @Override
protected float getMaxValue() { protected float getMaxValue() {
if (percentageEnable) { return maybeConvertPercentageToAbsolute(80);
return 80;
}
return 300;
} }
@Override @Override

View File

@@ -47,21 +47,18 @@ public class WaterMeasurementView extends FloatMeasurementView {
} }
@Override @Override
protected float getMeasurementValue(ScaleMeasurement measurement) { protected boolean shouldConvertPercentageToAbsoluteWeight() {
if (percentageEnable) { return !percentageEnable;
return measurement.getWater(); }
}
return measurement.getConvertedWeight(getScaleUser().getScaleUnit()) / 100.0f * measurement.getWater(); @Override
protected float getMeasurementValue(ScaleMeasurement measurement) {
return measurement.getWater();
} }
@Override @Override
protected void setMeasurementValue(float value, ScaleMeasurement measurement) { protected void setMeasurementValue(float value, ScaleMeasurement measurement) {
if (percentageEnable) { measurement.setWater(value);
measurement.setWater(value);
} else {
measurement.setWater(100.0f / measurement.getConvertedWeight(getScaleUser().getScaleUnit()) * value);
}
} }
@Override @Override
@@ -75,11 +72,7 @@ public class WaterMeasurementView extends FloatMeasurementView {
@Override @Override
protected float getMaxValue() { protected float getMaxValue() {
if (percentageEnable) { return maybeConvertPercentageToAbsolute(80);
return 80;
}
return 300;
} }
@Override @Override