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