diff --git a/android_app/app/src/main/java/com/health/openscale/core/ScaleCalculator.java b/android_app/app/src/main/java/com/health/openscale/core/ScaleCalculator.java
index f509e7bc..ecd61f84 100644
--- a/android_app/app/src/main/java/com/health/openscale/core/ScaleCalculator.java
+++ b/android_app/app/src/main/java/com/health/openscale/core/ScaleCalculator.java
@@ -2,15 +2,14 @@ package com.health.openscale.core;
public class ScaleCalculator {
- public float weight;
- public float fat;
- public float water;
- public float muscle;
- public float waist;
- public float hip;
- public int body_height;
+ private float weight;
+ private float fat;
+ private float water;
+ private float muscle;
+ private float waist;
+ private float hip;
- public void setScaleData(ScaleData scaleData) {
+ public ScaleCalculator(ScaleData scaleData) {
weight = scaleData.weight;
fat = scaleData.fat;
water = scaleData.water;
@@ -19,11 +18,11 @@ public class ScaleCalculator {
hip = scaleData.hip;
}
- public float getBMI() {
+ public float getBMI(int body_height) {
return weight / ((body_height / 100.0f)*(body_height / 100.0f));
}
- public float getWHtR() {
+ public float getWHtR(int body_height) {
return waist / (float)body_height;
}
diff --git a/android_app/app/src/main/java/com/health/openscale/gui/Measurement.java b/android_app/app/src/main/java/com/health/openscale/gui/Measurement.java
deleted file mode 100644
index 747e68a3..00000000
--- a/android_app/app/src/main/java/com/health/openscale/gui/Measurement.java
+++ /dev/null
@@ -1,684 +0,0 @@
-package com.health.openscale.gui;
-
-import android.content.SharedPreferences;
-import android.graphics.Color;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.TableLayout;
-import android.widget.TableRow;
-import android.widget.TextView;
-
-import com.health.openscale.R;
-import com.health.openscale.core.EvaluationResult;
-import com.health.openscale.core.EvaluationSheet;
-import com.health.openscale.core.ScaleUser;
-
-import lecho.lib.hellocharts.util.ChartUtils;
-
-abstract class Measurement {
- private TextView txtLabel;
- private TextView txtView;
- private final String label;
- private LinearGaugeView linearGaugeView;
- private ImageView imageView;
- private TableRow tableRow;
-
- ScaleUser scaleUser;
-
- public Measurement(View overviewView) {
- txtLabel = (TextView) overviewView.findViewById(getTxtLabelId());
- txtView = (TextView) overviewView.findViewById(getTxtViewId());
- linearGaugeView = (LinearGaugeView) overviewView.findViewById(getLinearGaugeViewId());
- imageView = (ImageView)overviewView.findViewById(getImageViewId());
-
- label = overviewView.getResources().getString(getLabelId());
-
- tableRow = (TableRow)overviewView.findViewById(getTableRowId());
- tableRow.setOnClickListener(new onClickListenerEvaluation());
- }
-
- public void updateValue(float value) {
- setText(value);
- evaluate(value);
- }
-
- abstract int getTxtLabelId();
- abstract int getTxtViewId();
- abstract int getLabelId();
- abstract int getLinearGaugeViewId();
- abstract int getImageViewId();
- abstract int getTableRowId();
-
- abstract String getFormat();
-
- abstract EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value);
-
- abstract float getMinValue();
-
- abstract float getMaxValue();
-
- private void setText(float value) {
- txtView.setText(String.format(getFormat(), value));
- }
-
- private void evaluate(float value) {
- EvaluationSheet evalSheet = new EvaluationSheet(scaleUser);
- EvaluationResult evalResult = evaluateSheet(evalSheet, value);
-
- linearGaugeView.setMinMaxValue(getMinValue(), getMaxValue());
- linearGaugeView.setLimits(evalResult.lowLimit, evalResult.highLimit);
- linearGaugeView.setValue(value);
-
- switch(evalResult.eval_state)
- {
- case LOW:
- imageView.setBackgroundColor(ChartUtils.COLOR_BLUE);
- break;
- case NORMAL:
- imageView.setBackgroundColor(ChartUtils.COLOR_GREEN);
- break;
- case HIGH:
- imageView.setBackgroundColor(ChartUtils.COLOR_RED);
- break;
- case UNDEFINED:
- imageView.setBackgroundColor(Color.GRAY);
- break;
- }
- }
-
- public void setDiff(float value, float diffValue) {
- ScaleDiff.setDiff(
- txtLabel,
- value - diffValue,
- label,
- getFormat());
- }
-
- public void updateVisibleRow(SharedPreferences preferences){
- if(isPreferenceSet(preferences)) {
- tableRow.setVisibility(View.VISIBLE);
- } else {
- tableRow.setVisibility(View.GONE);
- }
- }
-
- abstract boolean isPreferenceSet(SharedPreferences preferences);
-
- private class onClickListenerEvaluation implements View.OnClickListener {
- @Override
- public void onClick(View v) {
- TableRow row = (TableRow)v;
-
- TableLayout tableLayout = (TableLayout)row.getParent();
- int index = tableLayout.indexOfChild(row);
-
- TableRow rowEvaluation = (TableRow)tableLayout.getChildAt(index+1);
-
- if (rowEvaluation.getVisibility() == View.VISIBLE) {
- rowEvaluation.setVisibility(View.GONE);
- } else {
- rowEvaluation.setVisibility(View.VISIBLE);
- }
- }
- }
-}
-
-class WeightMeasurement extends Measurement {
-
- public WeightMeasurement(View overviewView) {
- super(overviewView);
- }
-
- @Override
- int getTxtLabelId() {
- return R.id.txtLabelWeight;
- }
-
- @Override
- int getTxtViewId() {
- return R.id.txtWeightLast;
- }
-
- @Override
- int getLabelId() {
- return R.string.label_weight;
- }
-
- @Override
- int getLinearGaugeViewId() {
- return R.id.linearGaugeWeight;
- }
-
- @Override
- int getImageViewId() {
- return R.id.indicatorWeight;
- }
-
- @Override
- int getTableRowId() {
- return R.id.tableRowWeight;
- }
-
- @Override
- String getFormat() {
- return "%.1f " + ScaleUser.UNIT_STRING[scaleUser.scale_unit];
- }
-
- @Override
- boolean isPreferenceSet(SharedPreferences preferences) {
- return preferences.getBoolean("weightEnable", true);
- }
-
- @Override
- EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) {
- return evalSheet.evaluateWeight(value);
- }
-
- @Override
- float getMinValue() {
- return 30;
- }
-
- @Override
- float getMaxValue() {
- return 300;
- }
-}
-
-class BMIMeasurement extends Measurement {
-
- public BMIMeasurement(View overviewView) {
- super(overviewView);
- }
-
- @Override
- int getTxtLabelId() {
- return R.id.txtLabelBMI;
- }
-
- @Override
- int getTxtViewId() {
- return R.id.txtBMILast;
- }
-
- @Override
- int getLabelId() {
- return R.string.label_bmi;
- }
-
- @Override
- int getLinearGaugeViewId() {
- return R.id.linearGaugeBMI;
- }
-
- @Override
- int getImageViewId() {
- return R.id.indicatorBMI;
- }
-
- @Override
- int getTableRowId() {
- return R.id.tableRowBMI;
- }
-
- @Override
- String getFormat() {
- return "%.1f";
- }
-
- @Override
- boolean isPreferenceSet(SharedPreferences preferences) {
- // TODO implement
- return false;
- }
-
- @Override
- EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) {
- return evalSheet.evaluateBMI(value);
- }
-
- @Override
- float getMinValue() {
- return 10;
- }
-
- @Override
- float getMaxValue() {
- return 50;
- }
-}
-
-class WaterMeasurement extends Measurement {
-
- public WaterMeasurement(View overviewView) {
- super(overviewView);
- }
-
- @Override
- int getTxtLabelId() {
- return R.id.txtLabelWater;
- }
-
- @Override
- int getTxtViewId() {
- return R.id.txtWaterLast;
- }
-
- @Override
- int getLabelId() {
- return R.string.label_water;
- }
-
- @Override
- int getLinearGaugeViewId() {
- return R.id.linearGaugeWater;
- }
-
- @Override
- int getImageViewId() {
- return R.id.indicatorWater;
- }
-
- @Override
- int getTableRowId() {
- return R.id.tableRowWater;
- }
-
- @Override
- String getFormat() {
- return "%.1f %%";
- }
-
- @Override
- boolean isPreferenceSet(SharedPreferences preferences) {
- return preferences.getBoolean("waterEnable", true);
- }
-
- @Override
- EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) {
- return evalSheet.evaluateBodyWater(value);
- }
-
- @Override
- float getMinValue() {
- return 30;
- }
-
- @Override
- float getMaxValue() {
- return 80;
- }
-}
-
-class MuscleMeasurement extends Measurement {
-
- public MuscleMeasurement(View overviewView) {
- super(overviewView);
- }
-
- @Override
- int getTxtLabelId() {
- return R.id.txtLabelMuscle;
- }
-
- @Override
- int getTxtViewId() {
- return R.id.txtMuscleLast;
- }
-
- @Override
- int getLabelId() {
- return R.string.label_muscle;
- }
-
- @Override
- int getLinearGaugeViewId() {
- return R.id.linearGaugeMuscle;
- }
-
- @Override
- int getImageViewId() {
- return R.id.indicatorMuscle;
- }
-
- @Override
- int getTableRowId() {
- return R.id.tableRowMuscle;
- }
-
- @Override
- String getFormat() {
- return "%.1f %%";
- }
-
- @Override
- boolean isPreferenceSet(SharedPreferences preferences) {
- return preferences.getBoolean("muscleEnable", true);
- }
-
- @Override
- EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) {
- return evalSheet.evaluateBodyMuscle(value);
- }
-
- @Override
- float getMinValue() {
- return 10;
- }
-
- @Override
- float getMaxValue() {
- return 80;
- }
-}
-
-class FatMeasurement extends Measurement {
-
- public FatMeasurement(View overviewView) {
- super(overviewView);
- }
-
- @Override
- int getTxtLabelId() {
- return R.id.txtLabelFat;
- }
-
- @Override
- int getTxtViewId() {
- return R.id.txtFatLast;
- }
-
- @Override
- int getLabelId() {
- return R.string.label_fat;
- }
-
- @Override
- int getLinearGaugeViewId() {
- return R.id.linearGaugeFat;
- }
-
- @Override
- int getImageViewId() {
- return R.id.indicatorFat;
- }
-
- @Override
- int getTableRowId() {
- return R.id.tableRowFat;
- }
-
- @Override
- String getFormat() {
- return "%.1f %%";
- }
-
- @Override
- boolean isPreferenceSet(SharedPreferences preferences) {
- return preferences.getBoolean("fatEnable", true);
- }
-
- @Override
- EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) {
- return evalSheet.evaluateBodyFat(value);
- }
-
- @Override
- float getMinValue() {
- return 10;
- }
-
- @Override
- float getMaxValue() {
- return 40;
- }
-}
-
-class WaistMeasurement extends Measurement {
-
- public WaistMeasurement(View overviewView) {
- super(overviewView);
- }
-
- @Override
- int getTxtLabelId() {
- return R.id.txtLabelWaist;
- }
-
- @Override
- int getTxtViewId() {
- return R.id.txtWaistLast;
- }
-
- @Override
- int getLabelId() {
- return R.string.label_waist;
- }
-
- @Override
- int getLinearGaugeViewId() {
- return R.id.linearGaugeWaist;
- }
-
- @Override
- int getImageViewId() {
- return R.id.indicatorWaist;
- }
-
- @Override
- int getTableRowId() {
- return R.id.tableRowWaist;
- }
-
- @Override
- String getFormat() {
- return "%.1f cm";
- }
-
- @Override
- boolean isPreferenceSet(SharedPreferences preferences) {
- return preferences.getBoolean("waistEnable", true);
- }
-
- @Override
- EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) {
- return evalSheet.evaluateWaist(value);
- }
-
- @Override
- float getMinValue() {
- return 30;
- }
-
- @Override
- float getMaxValue() {
- return 200;
- }
-}
-
-class WHtRMeasurement extends Measurement {
-
- public WHtRMeasurement(View overviewView) {
- super(overviewView);
- }
-
- @Override
- int getTxtLabelId() {
- return R.id.txtLabelWHtR;
- }
-
- @Override
- int getTxtViewId() {
- return R.id.txtWHtRLast;
- }
-
- @Override
- int getLabelId() {
- return R.string.label_whtr;
- }
-
- @Override
- int getLinearGaugeViewId() {
- return R.id.linearGaugeWHtR;
- }
-
- @Override
- int getImageViewId() {
- return R.id.indicatorWHtR;
- }
-
- @Override
- int getTableRowId() {
- return R.id.tableRowWHtR;
- }
-
- @Override
- String getFormat() {
- return "%.2f";
- }
-
- @Override
- boolean isPreferenceSet(SharedPreferences preferences) {
- return preferences.getBoolean("waistEnable", true);
- }
-
- @Override
- EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) {
- return evalSheet.evaluateWHtR(value);
- }
-
- @Override
- float getMinValue() {
- return 0;
- }
-
- @Override
- float getMaxValue() {
- return 1;
- }
-}
-
-class HipMeasurement extends Measurement {
-
- public HipMeasurement(View overviewView) {
- super(overviewView);
- }
-
- @Override
- int getTxtLabelId() {
- return R.id.txtLabelHip;
- }
-
- @Override
- int getTxtViewId() {
- return R.id.txtHipLast;
- }
-
- @Override
- int getLabelId() {
- return R.string.label_hip;
- }
-
- @Override
- int getLinearGaugeViewId() {
- return R.id.linearGaugeHip;
- }
-
- @Override
- int getImageViewId() {
- return R.id.indicatorHip;
- }
-
- @Override
- int getTableRowId() {
- return R.id.tableRowHip;
- }
-
- @Override
- String getFormat() {
- return "%.1f cm";
- }
-
- @Override
- boolean isPreferenceSet(SharedPreferences preferences) {
- return preferences.getBoolean("hipEnable", true);
- }
-
- @Override
- EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) {
- return evalSheet.evaluateHip(value);
- }
-
- @Override
- float getMinValue() {
- return 30;
- }
-
- @Override
- float getMaxValue() {
- return 200;
- }
-}
-
-class WHRMeasurement extends Measurement {
-
- public WHRMeasurement(View overviewView) {
- super(overviewView);
- }
-
- @Override
- int getTxtLabelId() {
- return R.id.txtLabelWHR;
- }
-
- @Override
- int getTxtViewId() {
- return R.id.txtWHRLast;
- }
-
- @Override
- int getLabelId() {
- return R.string.label_whr;
- }
-
- @Override
- int getLinearGaugeViewId() {
- return R.id.linearGaugeWHR;
- }
-
- @Override
- int getImageViewId() {
- return R.id.indicatorWHR;
- }
-
- @Override
- int getTableRowId() {
- return R.id.tableRowWHR;
- }
-
- @Override
- String getFormat() {
- return "%.2f";
- }
-
- @Override
- boolean isPreferenceSet(SharedPreferences preferences) {
- return preferences.getBoolean("hipEnable", true) && preferences.getBoolean("waistEnable", true);
- }
-
- @Override
- EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) {
- return evalSheet.evaluateWHR(value);
- }
-
- @Override
- float getMinValue() {
- return 0.5f;
- }
-
- @Override
- float getMaxValue() {
- return 1.5f;
- }
-
-}
diff --git a/android_app/app/src/main/java/com/health/openscale/gui/MeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/MeasurementView.java
new file mode 100644
index 00000000..83a4b4be
--- /dev/null
+++ b/android_app/app/src/main/java/com/health/openscale/gui/MeasurementView.java
@@ -0,0 +1,571 @@
+package com.health.openscale.gui;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.graphics.Color;
+import android.graphics.drawable.Drawable;
+import android.support.v4.content.ContextCompat;
+import android.text.Html;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.Space;
+import android.widget.TableLayout;
+import android.widget.TableRow;
+import android.widget.TextView;
+
+import com.health.openscale.R;
+import com.health.openscale.core.EvaluationResult;
+import com.health.openscale.core.EvaluationSheet;
+import com.health.openscale.core.ScaleCalculator;
+import com.health.openscale.core.ScaleData;
+import com.health.openscale.core.ScaleUser;
+
+import lecho.lib.hellocharts.util.ChartUtils;
+
+abstract class MeasurementView extends TableLayout {
+ private static String SYMBOL_UP = "↗";
+ private static String SYMBOL_DOWN = "↘";
+
+ private TableRow measurementRow;
+ private ImageView iconView;
+ private TextView nameView;
+ private TextView valueView;
+ private ImageView indicatorView;
+
+ private TableRow evaluatorRow;
+ private LinearGaugeView evaluatorView;
+
+ private String nameText;
+
+ protected ScaleUser scaleUser;
+
+ public MeasurementView(Context context, String text, Drawable icon) {
+ super(context);
+ initView(context);
+
+ nameText = text;
+ nameView.setText(text);
+ iconView.setImageDrawable(icon);
+ }
+
+ private void initView(Context context) {
+ measurementRow = new TableRow(context);
+
+ iconView = new ImageView(context);
+ nameView = new TextView(context);
+ valueView = new TextView(context);
+ indicatorView = new ImageView(context);
+
+ evaluatorRow = new TableRow(context);
+ evaluatorView = new LinearGaugeView(context);
+
+
+ measurementRow.setLayoutParams(new TableRow.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT, 1.0f));
+ measurementRow.addView(iconView);
+ measurementRow.addView(nameView);
+ measurementRow.addView(valueView);
+ measurementRow.addView(indicatorView);
+
+ addView(measurementRow);
+ addView(evaluatorRow);
+
+ iconView.getLayoutParams().height = 80;
+ iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
+
+ nameView.setTextSize(20);
+ nameView.setTextColor(Color.BLACK);
+ nameView.setLines(2);
+ nameView.setLayoutParams(new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 0.92f));
+
+ valueView.setTextSize(20);
+ valueView.setTextColor(Color.BLACK);
+ valueView.setLayoutParams(new TableRow.LayoutParams(0, LayoutParams.MATCH_PARENT, 0.07f));
+
+ indicatorView.setLayoutParams(new TableRow.LayoutParams(0, LayoutParams.MATCH_PARENT, 0.01f));
+ indicatorView.setBackgroundColor(Color.GRAY);
+
+ evaluatorRow.setLayoutParams(new TableRow.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT, 1.0f));
+ evaluatorRow.addView(new Space(context));
+ evaluatorRow.addView(evaluatorView);
+ Space spaceAfterEvaluatorView = new Space(context);
+ evaluatorRow.addView(spaceAfterEvaluatorView);
+ evaluatorRow.setVisibility(View.GONE);
+
+ evaluatorView.setLayoutParams(new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 0.99f));
+ spaceAfterEvaluatorView.setLayoutParams(new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 0.01f));
+
+ measurementRow.setOnClickListener(new onClickListenerEvaluation());
+ }
+
+ abstract void updateValue(ScaleData updateData);
+ abstract void updateDiff(ScaleData updateData, ScaleData lastData);
+ abstract void updatePreferences(SharedPreferences preferences);
+ abstract String getFormat();
+ abstract EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value);
+ abstract float getMinValue();
+ abstract float getMaxValue();
+
+ protected void setValueOnView(float value) {
+ valueView.setText(String.format(getFormat(), value));
+ evaluate(value);
+ }
+
+ protected void setDiffOnView(float value, float lastValue) {
+ float diffValue = value - lastValue;
+
+ String symbol;
+
+ if (diffValue > 0.0) {
+ symbol = SYMBOL_UP;
+ } else {
+ symbol = SYMBOL_DOWN;
+ }
+
+ nameView.setText(
+ Html.fromHtml(
+ nameText +
+ "
" +
+ symbol +
+ " " +
+ String.format(getFormat(), diffValue) +
+ ""
+ )
+ );
+ }
+
+ protected void setVisible(boolean isVisible){
+ if(isVisible) {
+ measurementRow.setVisibility(View.VISIBLE);
+ } else {
+ measurementRow.setVisibility(View.GONE);
+ }
+ }
+
+ private void evaluate(float value) {
+ EvaluationSheet evalSheet = new EvaluationSheet(scaleUser);
+ EvaluationResult evalResult = evaluateSheet(evalSheet, value);
+
+ evaluatorView.setMinMaxValue(getMinValue(), getMaxValue());
+ evaluatorView.setLimits(evalResult.lowLimit, evalResult.highLimit);
+ evaluatorView.setValue(value);
+
+ switch(evalResult.eval_state)
+ {
+ case LOW:
+ indicatorView.setBackgroundColor(ChartUtils.COLOR_BLUE);
+ break;
+ case NORMAL:
+ indicatorView.setBackgroundColor(ChartUtils.COLOR_GREEN);
+ break;
+ case HIGH:
+ indicatorView.setBackgroundColor(ChartUtils.COLOR_RED);
+ break;
+ case UNDEFINED:
+ indicatorView.setBackgroundColor(Color.GRAY);
+ break;
+ }
+ }
+
+ public void updateScaleUser(ScaleUser user) {
+ scaleUser = user;
+ }
+
+ private class onClickListenerEvaluation implements View.OnClickListener {
+ @Override
+ public void onClick(View v) {
+ if (evaluatorRow.getVisibility() == View.VISIBLE) {
+ evaluatorRow.setVisibility(View.GONE);
+ } else {
+ evaluatorRow.setVisibility(View.VISIBLE);
+ }
+ }
+ }
+}
+
+class WeightMeasurementView extends MeasurementView {
+
+ public WeightMeasurementView(Context context) {
+ super(context, context.getResources().getString(R.string.label_weight), ContextCompat.getDrawable(context, R.drawable.weight));
+ }
+
+ @Override
+ void updateValue(ScaleData updateData) {
+ setValueOnView(updateData.weight);
+ }
+
+ @Override
+ void updateDiff(ScaleData updateData, ScaleData lastData) {
+ setDiffOnView(updateData.weight, lastData.weight);
+ }
+
+ @Override
+ String getFormat() {
+ return "%.1f " + ScaleUser.UNIT_STRING[scaleUser.scale_unit];
+ }
+
+ @Override
+ void updatePreferences(SharedPreferences preferences) {
+ setVisible(preferences.getBoolean("weightEnable", true));
+ }
+
+ @Override
+ EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) {
+ return evalSheet.evaluateWeight(value);
+ }
+
+ @Override
+ float getMinValue() {
+ return 30;
+ }
+
+ @Override
+ float getMaxValue() {
+ return 300;
+ }
+}
+
+class BMIMeasurementView extends MeasurementView {
+
+ public BMIMeasurementView(Context context) {
+ super(context, context.getResources().getString(R.string.label_bmi), ContextCompat.getDrawable(context, R.drawable.bmi));
+ }
+
+ @Override
+ void updateValue(ScaleData updateData) {
+ ScaleCalculator updateCalculator = new ScaleCalculator(updateData);
+ setValueOnView(updateCalculator.getBMI(scaleUser.body_height));
+ }
+
+ @Override
+ void updateDiff(ScaleData updateData, ScaleData lastData) {
+ ScaleCalculator updateCalculator = new ScaleCalculator(updateData);
+ ScaleCalculator lastCalculator = new ScaleCalculator(lastData);
+ setDiffOnView(updateCalculator.getBMI(scaleUser.body_height), lastCalculator.getBMI(scaleUser.body_height));
+ }
+
+ @Override
+ String getFormat() {
+ return "%.1f";
+ }
+
+ @Override
+ EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) {
+ return evalSheet.evaluateBMI(value);
+ }
+
+ @Override
+ float getMinValue() {
+ return 10;
+ }
+
+ @Override
+ float getMaxValue() {
+ return 50;
+ }
+
+ @Override
+ void updatePreferences(SharedPreferences preferences) {
+ setVisible(preferences.getBoolean("weightEnable", true));
+ }
+}
+
+class WaterMeasurementView extends MeasurementView {
+
+ public WaterMeasurementView(Context context) {
+ super(context, context.getResources().getString(R.string.label_water), ContextCompat.getDrawable(context, R.drawable.water));
+ }
+
+ @Override
+ void updateValue(ScaleData updateData) {
+ setValueOnView(updateData.water);
+ }
+
+ @Override
+ void updateDiff(ScaleData updateData, ScaleData lastData) {
+ setDiffOnView(updateData.water, lastData.water);
+ }
+
+ @Override
+ String getFormat() {
+ return "%.1f %%";
+ }
+
+ @Override
+ void updatePreferences(SharedPreferences preferences) {
+ setVisible(preferences.getBoolean("waterEnable", true));
+ }
+
+ @Override
+ EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) {
+ return evalSheet.evaluateBodyWater(value);
+ }
+
+ @Override
+ float getMinValue() {
+ return 30;
+ }
+
+ @Override
+ float getMaxValue() {
+ return 80;
+ }
+}
+
+class MuscleMeasurementView extends MeasurementView {
+
+ public MuscleMeasurementView(Context context) {
+ super(context, context.getResources().getString(R.string.label_muscle), ContextCompat.getDrawable(context, R.drawable.muscle));
+ }
+
+ @Override
+ void updateValue(ScaleData updateData) {
+ setValueOnView(updateData.muscle);
+ }
+
+ @Override
+ void updateDiff(ScaleData updateData, ScaleData lastData) {
+ setDiffOnView(updateData.muscle, lastData.muscle);
+ }
+
+ @Override
+ String getFormat() {
+ return "%.1f %%";
+ }
+
+ @Override
+ void updatePreferences(SharedPreferences preferences) {
+ setVisible(preferences.getBoolean("muscleEnable", true));
+ }
+
+ @Override
+ EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) {
+ return evalSheet.evaluateBodyMuscle(value);
+ }
+
+ @Override
+ float getMinValue() {
+ return 10;
+ }
+
+ @Override
+ float getMaxValue() {
+ return 80;
+ }
+}
+
+class FatMeasurementView extends MeasurementView {
+
+ public FatMeasurementView(Context context) {
+ super(context, context.getResources().getString(R.string.label_fat), ContextCompat.getDrawable(context, R.drawable.fat));
+ }
+
+ @Override
+ void updateValue(ScaleData updateData) {
+ setValueOnView(updateData.fat);
+ }
+
+ @Override
+ void updateDiff(ScaleData updateData, ScaleData lastData) {
+ setDiffOnView(updateData.fat, lastData.fat);
+ }
+
+ @Override
+ String getFormat() {
+ return "%.1f %%";
+ }
+
+ @Override
+ void updatePreferences(SharedPreferences preferences) {
+ setVisible(preferences.getBoolean("fatEnable", true));
+ }
+
+ @Override
+ EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) {
+ return evalSheet.evaluateBodyFat(value);
+ }
+
+ @Override
+ float getMinValue() {
+ return 10;
+ }
+
+ @Override
+ float getMaxValue() {
+ return 40;
+ }
+}
+
+class WaistMeasurementView extends MeasurementView {
+
+ public WaistMeasurementView(Context context) {
+ super(context, context.getResources().getString(R.string.label_waist), ContextCompat.getDrawable(context, R.drawable.waist));
+ }
+
+ @Override
+ void updateValue(ScaleData updateData) {
+ setValueOnView(updateData.waist);
+ }
+
+ @Override
+ void updateDiff(ScaleData updateData, ScaleData lastData) {
+ setDiffOnView(updateData.waist, lastData.waist);
+ }
+
+ @Override
+ String getFormat() {
+ return "%.1f cm";
+ }
+
+ @Override
+ void updatePreferences(SharedPreferences preferences) {
+ setVisible(preferences.getBoolean("waistEnable", true));
+ }
+
+ @Override
+ EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) {
+ return evalSheet.evaluateWaist(value);
+ }
+
+ @Override
+ float getMinValue() {
+ return 30;
+ }
+
+ @Override
+ float getMaxValue() {
+ return 200;
+ }
+}
+
+class WHtRMeasurementView extends MeasurementView {
+
+ public WHtRMeasurementView(Context context) {
+ super(context, context.getResources().getString(R.string.label_whtr), ContextCompat.getDrawable(context, R.drawable.whtr));
+ }
+
+ @Override
+ void updateValue(ScaleData updateData) {
+ ScaleCalculator updateCalculator = new ScaleCalculator(updateData);
+ setValueOnView(updateCalculator.getWHtR(scaleUser.body_height));
+ }
+
+ @Override
+ void updateDiff(ScaleData updateData, ScaleData lastData) {
+ ScaleCalculator updateCalculator = new ScaleCalculator(updateData);
+ ScaleCalculator lastCalculator = new ScaleCalculator(lastData);
+ setDiffOnView(updateCalculator.getWHtR(scaleUser.body_height), lastCalculator.getWHtR(scaleUser.body_height));
+ }
+
+ @Override
+ String getFormat() {
+ return "%.2f";
+ }
+
+ @Override
+ void updatePreferences(SharedPreferences preferences) {
+ setVisible(preferences.getBoolean("waistEnable", true));
+ }
+
+ @Override
+ EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) {
+ return evalSheet.evaluateWHtR(value);
+ }
+
+ @Override
+ float getMinValue() {
+ return 0;
+ }
+
+ @Override
+ float getMaxValue() {
+ return 1;
+ }
+}
+
+class HipMeasurementView extends MeasurementView {
+
+ public HipMeasurementView(Context context) {
+ super(context, context.getResources().getString(R.string.label_hip), ContextCompat.getDrawable(context, R.drawable.hip));
+ }
+
+ @Override
+ void updateValue(ScaleData updateData) {
+ setValueOnView(updateData.hip);
+ }
+
+ @Override
+ void updateDiff(ScaleData updateData, ScaleData lastData) {
+ setDiffOnView(updateData.hip, lastData.hip);
+ }
+
+ @Override
+ String getFormat() {
+ return "%.1f cm";
+ }
+
+ @Override
+ void updatePreferences(SharedPreferences preferences) {
+ setVisible(preferences.getBoolean("hipEnable", true));
+ }
+
+ @Override
+ EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) {
+ return evalSheet.evaluateHip(value);
+ }
+
+ @Override
+ float getMinValue() {
+ return 30;
+ }
+
+ @Override
+ float getMaxValue() {
+ return 200;
+ }
+}
+
+class WHRMeasurementView extends MeasurementView {
+
+ public WHRMeasurementView(Context context) {
+ super(context, context.getResources().getString(R.string.label_whr), ContextCompat.getDrawable(context, R.drawable.whr));
+ }
+
+ @Override
+ void updateValue(ScaleData updateData) {
+ ScaleCalculator updateCalculator = new ScaleCalculator(updateData);
+ setValueOnView(updateCalculator.getWHR());
+ }
+
+ @Override
+ void updateDiff(ScaleData updateData, ScaleData lastData) {
+ ScaleCalculator updateCalculator = new ScaleCalculator(updateData);
+ ScaleCalculator lastCalculator = new ScaleCalculator(lastData);
+ setDiffOnView(updateCalculator.getWHR(), lastCalculator.getWHR());
+ }
+
+ @Override
+ String getFormat() {
+ return "%.2f";
+ }
+
+ @Override
+ void updatePreferences(SharedPreferences preferences) {
+ setVisible(preferences.getBoolean("hipEnable", true) && preferences.getBoolean("waistEnable", true));
+ }
+
+ @Override
+ EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) {
+ return evalSheet.evaluateWHR(value);
+ }
+
+ @Override
+ float getMinValue() {
+ return 0.5f;
+ }
+
+ @Override
+ float getMaxValue() {
+ return 1.5f;
+ }
+
+}
diff --git a/android_app/app/src/main/java/com/health/openscale/gui/OverviewFragment.java b/android_app/app/src/main/java/com/health/openscale/gui/OverviewFragment.java
index fbbc9f8c..30529155 100644
--- a/android_app/app/src/main/java/com/health/openscale/gui/OverviewFragment.java
+++ b/android_app/app/src/main/java/com/health/openscale/gui/OverviewFragment.java
@@ -30,6 +30,7 @@ import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
+import android.widget.TableLayout;
import android.widget.TextView;
import android.widget.Toast;
@@ -69,15 +70,9 @@ public class OverviewFragment extends Fragment implements FragmentUpdateListener
private TextView txtTitleGoal;
private TextView txtTitleStatistics;
- private Measurement measurementWeightLast;
- private Measurement measurementBMILast;
- private Measurement measurementWaterLast;
- private Measurement measurementMuscleLast;
- private Measurement measurementFatLast;
- private Measurement measurementWaistLast;
- private Measurement measurementWHtRLast;
- private Measurement measurementHipLast;
- private Measurement measurementWHRLast;
+ private TableLayout tableOverviewLayout;
+
+ private ArrayList overviewMeasurements;
private TextView txtGoalWeight;
private TextView txtGoalDiff;
@@ -128,15 +123,23 @@ public class OverviewFragment extends Fragment implements FragmentUpdateListener
txtTitleGoal = (TextView) overviewView.findViewById(R.id.txtTitleGoal);
txtTitleStatistics = (TextView) overviewView.findViewById(R.id.txtTitleStatistics);
- measurementWeightLast = new WeightMeasurement(overviewView);
- measurementBMILast = new BMIMeasurement(overviewView);
- measurementWaterLast = new WaterMeasurement(overviewView);
- measurementMuscleLast = new MuscleMeasurement(overviewView);
- measurementFatLast = new FatMeasurement(overviewView);
- measurementWaistLast = new WaistMeasurement(overviewView);
- measurementWHtRLast = new WHtRMeasurement(overviewView);
- measurementHipLast = new HipMeasurement(overviewView);
- measurementWHRLast = new WHRMeasurement(overviewView);
+ tableOverviewLayout = (TableLayout)overviewView.findViewById(R.id.tableLayoutMeasurements);
+
+ overviewMeasurements = new ArrayList<>();
+
+ overviewMeasurements.add(new WeightMeasurementView(context));
+ overviewMeasurements.add(new BMIMeasurementView(context));
+ overviewMeasurements.add(new WaterMeasurementView(context));
+ overviewMeasurements.add(new MuscleMeasurementView(context));
+ overviewMeasurements.add(new FatMeasurementView(context));
+ overviewMeasurements.add(new WaistMeasurementView(context));
+ overviewMeasurements.add(new WHtRMeasurementView(context));
+ overviewMeasurements.add(new HipMeasurementView(context));
+ overviewMeasurements.add(new WHRMeasurementView(context));
+
+ for (MeasurementView measuremt : overviewMeasurements) {
+ tableOverviewLayout.addView(measuremt);
+ }
txtGoalWeight = (TextView) overviewView.findViewById(R.id.txtGoalWeight);
txtGoalDiff = (TextView) overviewView.findViewById(R.id.txtGoalDiff);
@@ -194,7 +197,7 @@ public class OverviewFragment extends Fragment implements FragmentUpdateListener
lastScaleData = userSelectedData;
}
else {
- lastScaleData = scaleDataList.get(0);
+ lastScaleData = scaleDataList.get(0);
}
@@ -206,12 +209,15 @@ public class OverviewFragment extends Fragment implements FragmentUpdateListener
txtTitleStatistics.setText(getResources().getString(R.string.label_title_statistics).toUpperCase());
updateUserSelection();
- updateVisibleRows();
updateLastPieChart();
updateLastLineChart(scaleDataList);
- updateLastValues();
updateGoal(scaleDataList);
updateStatistics(scaleDataList);
+
+ for (MeasurementView measuremt : overviewMeasurements) {
+ measuremt.updatePreferences(prefs);
+ measuremt.updateValue(lastScaleData);
+ }
}
private void updateUserSelection() {
@@ -220,15 +226,9 @@ public class OverviewFragment extends Fragment implements FragmentUpdateListener
userSelectedData = null;
- measurementWeightLast.scaleUser = currentScaleUser;
- measurementBMILast.scaleUser = currentScaleUser;
- measurementWaterLast.scaleUser = currentScaleUser;
- measurementMuscleLast.scaleUser = currentScaleUser;
- measurementFatLast.scaleUser = currentScaleUser;
- measurementWaistLast.scaleUser = currentScaleUser;
- measurementWHtRLast.scaleUser = currentScaleUser;
- measurementHipLast.scaleUser = currentScaleUser;
- measurementWHRLast.scaleUser = currentScaleUser;
+ for (MeasurementView measuremt : overviewMeasurements) {
+ measuremt.updateScaleUser(currentScaleUser);
+ }
spinUserAdapter.clear();
ArrayList scaleUserList = OpenScale.getInstance(overviewView.getContext()).getScaleUserList();
@@ -249,34 +249,6 @@ public class OverviewFragment extends Fragment implements FragmentUpdateListener
spinUser.setSelection(posUser, true);
}
- private void updateVisibleRows() {
- measurementWeightLast.updateVisibleRow(prefs);
- measurementBMILast.updateVisibleRow(prefs);
- measurementWaterLast.updateVisibleRow(prefs);
- measurementMuscleLast.updateVisibleRow(prefs);
- measurementHipLast.updateVisibleRow(prefs);
- measurementFatLast.updateVisibleRow(prefs);
- measurementWaistLast.updateVisibleRow(prefs);
- measurementWHRLast.updateVisibleRow(prefs);
- measurementWHtRLast.updateVisibleRow(prefs);
- }
-
- private void updateLastValues() {
- ScaleCalculator calculator = new ScaleCalculator();
- calculator.body_height = currentScaleUser.body_height;
- calculator.setScaleData(lastScaleData);
-
- measurementWeightLast.updateValue(lastScaleData.weight);
- measurementBMILast.updateValue(calculator.getBMI());
- measurementFatLast.updateValue(lastScaleData.fat);
- measurementWaterLast.updateValue(lastScaleData.water);
- measurementMuscleLast.updateValue(lastScaleData.muscle);
- measurementWaistLast.updateValue(lastScaleData.waist);
- measurementWHtRLast.updateValue(calculator.getWHtR());
- measurementHipLast.updateValue(lastScaleData.hip);
- measurementWHRLast.updateValue(calculator.getWHR());
- }
-
private void updateGoal(ArrayList scaleDataList) {
txtGoalWeight.setText(currentScaleUser.goal_weight + " " + ScaleUser.UNIT_STRING[currentScaleUser.scale_unit]);
@@ -290,19 +262,17 @@ public class OverviewFragment extends Fragment implements FragmentUpdateListener
long days = daysBetween(curDate, goalDate);
txtGoalDayLeft.setText(days + " " + getResources().getString(R.string.label_days));
- ScaleCalculator currentCalculator = new ScaleCalculator();
- currentCalculator.body_height = currentScaleUser.body_height;
- currentCalculator.weight = lastScaleData.weight;
+ ScaleCalculator currentCalculator = new ScaleCalculator(lastScaleData);
- ScaleCalculator goalCalculator = new ScaleCalculator();
- goalCalculator.body_height = currentScaleUser.body_height;
- goalCalculator.weight = currentScaleUser.goal_weight;
+ ScaleData goalData = new ScaleData();
+ goalData.weight = currentScaleUser.goal_weight;
+ ScaleCalculator goalCalculator = new ScaleCalculator(goalData);
txtLabelGoalWeight.setText(
Html.fromHtml(
getResources().getString(R.string.label_goal_weight) +
"
BMI " +
- String.format("%.1f", goalCalculator.getBMI()) +
+ String.format("%.1f", goalCalculator.getBMI(currentScaleUser.body_height)) +
" "
)
);
@@ -310,7 +280,7 @@ public class OverviewFragment extends Fragment implements FragmentUpdateListener
Html.fromHtml(
getResources().getString(R.string.label_weight_difference) +
"
BMI " +
- String.format("%.1f", currentCalculator.getBMI() - goalCalculator.getBMI()) +
+ String.format("%.1f", currentCalculator.getBMI(currentScaleUser.body_height) - goalCalculator.getBMI(currentScaleUser.body_height)) +
" "
)
);
@@ -334,23 +304,9 @@ public class OverviewFragment extends Fragment implements FragmentUpdateListener
if (scaleDataIterator.hasNext()) {
ScaleData diffScaleData = scaleDataIterator.next();
- ScaleCalculator lastScaleCalculator = new ScaleCalculator();
- lastScaleCalculator.body_height = currentScaleUser.body_height;
- lastScaleCalculator.setScaleData(lastScaleData);
-
- ScaleCalculator diffScaleCalculator = new ScaleCalculator();
- diffScaleCalculator.body_height = currentScaleUser.body_height;
- diffScaleCalculator.setScaleData(diffScaleData);
-
- measurementWeightLast.setDiff(lastScaleData.weight, diffScaleData.weight);
- measurementBMILast.setDiff(lastScaleCalculator.getBMI(), diffScaleCalculator.getBMI());
- measurementMuscleLast.setDiff(lastScaleData.muscle, diffScaleData.muscle);
- measurementFatLast.setDiff(lastScaleData.fat, diffScaleData.fat);
- measurementWaterLast.setDiff(lastScaleData.water, diffScaleData.water);
- measurementWaistLast.setDiff(lastScaleData.waist, diffScaleData.waist);
- measurementWHtRLast.setDiff(lastScaleCalculator.getWHtR(), diffScaleCalculator.getWHtR());
- measurementHipLast.setDiff(lastScaleData.hip, diffScaleData.hip);
- measurementWHRLast.setDiff(lastScaleCalculator.getWHR(), diffScaleCalculator.getWHR());
+ for (MeasurementView measuremt : overviewMeasurements) {
+ measuremt.updateDiff(lastScaleData, diffScaleData);
+ }
}
}
}
@@ -395,21 +351,19 @@ public class OverviewFragment extends Fragment implements FragmentUpdateListener
{
histDate.setTime(scaleData.date_time);
- ScaleCalculator calculator = new ScaleCalculator();
- calculator.body_height = currentScaleUser.body_height;
- calculator.setScaleData(scaleData);
+ ScaleCalculator calculator = new ScaleCalculator(scaleData);
if (weekPastDate.before(histDate)) {
weekSize++;
weekAvgWeight += scaleData.weight;
- weekAvgBMI += calculator.getBMI();
+ weekAvgBMI += calculator.getBMI(currentScaleUser.body_height);
weekAvgFat += scaleData.fat;
weekAvgWater += scaleData.water;
weekAvgMuscle += scaleData.muscle;
weekAvgWaist += scaleData.waist;
weekAvgHip += scaleData.hip;
- weekAvgWHtR += calculator.getWHtR();
+ weekAvgWHtR += calculator.getWHtR(currentScaleUser.body_height);
weekAvgWHR += calculator.getWHR();
}
@@ -417,13 +371,13 @@ public class OverviewFragment extends Fragment implements FragmentUpdateListener
monthSize++;
monthAvgWeight += scaleData.weight;
- monthAvgBMI += calculator.getBMI();
+ monthAvgBMI += calculator.getBMI(currentScaleUser.body_height);
monthAvgFat += scaleData.fat;
monthAvgWater += scaleData.water;
monthAvgMuscle += scaleData.muscle;
monthAvgWaist += scaleData.waist;
monthAvgHip += scaleData.hip;
- monthAvgWHtR += calculator.getWHtR();
+ monthAvgWHtR += calculator.getWHtR(currentScaleUser.body_height);
monthAvgWHR += calculator.getWHR();
} else {
break;
diff --git a/android_app/app/src/main/java/com/health/openscale/gui/ScaleDiff.java b/android_app/app/src/main/java/com/health/openscale/gui/ScaleDiff.java
deleted file mode 100644
index b9093a30..00000000
--- a/android_app/app/src/main/java/com/health/openscale/gui/ScaleDiff.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.health.openscale.gui;
-
-import android.text.Html;
-import android.widget.TextView;
-
-public class ScaleDiff {
- private static String SYMBOL_UP = "↗";
- private static String SYMBOL_DOWN = "↘";
-
- public static void setDiff(TextView txtLabel,
- double diff,
- String labelResource,
- String format) {
-
- String symbol;
-
- if (diff > 0.0) {
- symbol = SYMBOL_UP;
- } else {
- symbol = SYMBOL_DOWN;
- }
-
- txtLabel.setText(
- Html.fromHtml(
- labelResource +
- "
" +
- symbol +
- " " +
- String.format(format, diff) +
- ""
- )
- );
- }
-}
-
diff --git a/android_app/app/src/main/res/layout-large/fragment_overview.xml b/android_app/app/src/main/res/layout-large/fragment_overview.xml
index 9b279591..90ca9981 100644
--- a/android_app/app/src/main/res/layout-large/fragment_overview.xml
+++ b/android_app/app/src/main/res/layout-large/fragment_overview.xml
@@ -90,642 +90,6 @@
android:layout_weight="90"
android:stretchColumns="1"
android:id="@+id/tableLayoutMeasurements">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-