1
0
mirror of https://github.com/oliexdev/openScale.git synced 2025-09-01 12:23:15 +02:00

Make it possible to show/input bone in %

Fixes #246.
This commit is contained in:
Erik Johansson
2018-04-19 22:34:31 +02:00
parent af79227891
commit 36adc936bb
6 changed files with 89 additions and 27 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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