diff --git a/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java b/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java index 24c85075..4a3b5bc3 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java @@ -65,22 +65,6 @@ public class DataEntryActivity extends Activity { private ArrayList dataEntryMeasurements; private TableLayout tableLayoutDataEntry; - private WeightMeasurementView weightMeasurement; - private BMIMeasurementView bmiMeasurementView; - private WaterMeasurementView waterMeasurement; - private MuscleMeasurementView muscleMeasurement; - private LBWMeasurementView lbwMeasurement; - private FatMeasurementView fatMeasurement; - private WaistMeasurementView waistMeasurement; - private WHtRMeasurementView wHtRMeasurementView; - private HipMeasurementView hipMeasurement; - private WHRMeasurementView whrMeasurementView; - private BMRMeasurementView bmrMeasurementView; - private BoneMeasurementView boneMeasurementView; - private CommentMeasurementView commentMeasurement; - private DateMeasurementView dateMeasurement; - private TimeMeasurementView timeMeasurement; - private TextView txtDataNr; private Button btnAdd; private Button btnOk; @@ -91,7 +75,9 @@ public class DataEntryActivity extends Activity { private FloatingActionButton switchEditMode; private FloatingActionButton expandButton; - private int id; + private ScaleMeasurement scaleMeasurement; + private ScaleMeasurement previousMeasurement; + private boolean isDirty; private Context context; @@ -105,41 +91,27 @@ public class DataEntryActivity extends Activity { tableLayoutDataEntry = (TableLayout) findViewById(R.id.tableLayoutDataEntry); - weightMeasurement = new WeightMeasurementView(context); - bmiMeasurementView = new BMIMeasurementView(context); - waterMeasurement = new WaterMeasurementView(context); - muscleMeasurement = new MuscleMeasurementView(context); - lbwMeasurement = new LBWMeasurementView(context); - fatMeasurement = new FatMeasurementView(context); - boneMeasurementView = new BoneMeasurementView(context); - waistMeasurement = new WaistMeasurementView(context); - wHtRMeasurementView = new WHtRMeasurementView(context); - hipMeasurement = new HipMeasurementView(context); - whrMeasurementView = new WHRMeasurementView(context); - bmrMeasurementView = new BMRMeasurementView(context); - commentMeasurement = new CommentMeasurementView(context); - dateMeasurement = new DateMeasurementView(context); - timeMeasurement = new TimeMeasurementView(context); - dataEntryMeasurements = new ArrayList<>(); - dataEntryMeasurements.add(weightMeasurement); - dataEntryMeasurements.add(bmiMeasurementView); - dataEntryMeasurements.add(waterMeasurement); - dataEntryMeasurements.add(muscleMeasurement); - dataEntryMeasurements.add(lbwMeasurement); - dataEntryMeasurements.add(fatMeasurement); - dataEntryMeasurements.add(boneMeasurementView); - dataEntryMeasurements.add(waistMeasurement); - dataEntryMeasurements.add(wHtRMeasurementView); - dataEntryMeasurements.add(hipMeasurement); - dataEntryMeasurements.add(whrMeasurementView); - dataEntryMeasurements.add(bmrMeasurementView); - dataEntryMeasurements.add(commentMeasurement); - dataEntryMeasurements.add(dateMeasurement); - dataEntryMeasurements.add(timeMeasurement); + dataEntryMeasurements.add(new WeightMeasurementView(context)); + dataEntryMeasurements.add(new BMIMeasurementView(context)); + dataEntryMeasurements.add(new WaterMeasurementView(context)); + dataEntryMeasurements.add(new MuscleMeasurementView(context)); + dataEntryMeasurements.add(new LBWMeasurementView(context)); + dataEntryMeasurements.add(new FatMeasurementView(context)); + dataEntryMeasurements.add(new BoneMeasurementView(context)); + dataEntryMeasurements.add(new WaistMeasurementView(context)); + dataEntryMeasurements.add(new WHtRMeasurementView(context)); + dataEntryMeasurements.add(new HipMeasurementView(context)); + dataEntryMeasurements.add(new WHRMeasurementView(context)); + dataEntryMeasurements.add(new BMRMeasurementView(context)); + dataEntryMeasurements.add(new CommentMeasurementView(context)); + dataEntryMeasurements.add(new DateMeasurementView(context)); + dataEntryMeasurements.add(new TimeMeasurementView(context)); + onMeasurementViewUpdateListener updateListener = new onMeasurementViewUpdateListener(); for (MeasurementView measurement : dataEntryMeasurements) { tableLayoutDataEntry.addView(measurement); + measurement.setOnUpdateListener(updateListener); } txtDataNr = (TextView) findViewById(R.id.txtDataNr); @@ -165,22 +137,28 @@ public class DataEntryActivity extends Activity { updateOnView(); } - private void updateOnView() { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); for (MeasurementView measurement : dataEntryMeasurements) { - measurement.setOnUpdateListener(null); measurement.updatePreferences(prefs); } + int id = 0; if (getIntent().hasExtra("id")) { id = getIntent().getExtras().getInt("id"); } - ScaleMeasurement scaleMeasurement; + if (scaleMeasurement == null || scaleMeasurement.getId() != id) { + isDirty = false; + } + + scaleMeasurement = null; + previousMeasurement = null; + OpenScale openScale = OpenScale.getInstance(context); + boolean doExpand = false; if (id > 0) { // keep edit mode state if we are moving to left or right @@ -192,27 +170,17 @@ public class DataEntryActivity extends Activity { switchEditMode.setBackgroundTintList(ColorStateList.valueOf(Color.parseColor("#D3D3D3"))); } - final boolean doExpand = prefs.getBoolean(String.valueOf(expandButton.getId()), false); + doExpand = prefs.getBoolean(String.valueOf(expandButton.getId()), false); if (doExpand) { expandButton.setBackgroundTintList(ColorStateList.valueOf(ChartUtils.COLOR_ORANGE)); } else { expandButton.setBackgroundTintList(ColorStateList.valueOf(Color.parseColor("#D3D3D3"))); } + // Show selected scale data ScaleMeasurement[] tupleScaleData = openScale.getTupleScaleData(id); - ScaleMeasurement prevScaleMeasurement = tupleScaleData[0]; - scaleMeasurement = tupleScaleData[1]; - - if (prevScaleMeasurement == null) { - prevScaleMeasurement = new ScaleMeasurement(); - } - - // show selected scale data - for (MeasurementView measurement : dataEntryMeasurements) { - measurement.updateValue(scaleMeasurement); - measurement.updateDiff(scaleMeasurement, prevScaleMeasurement); - measurement.setExpand(doExpand); - } + previousMeasurement = tupleScaleData[0]; + scaleMeasurement = tupleScaleData[1].clone(); } else { setViewMode(MeasurementView.MeasurementViewMode.ADD); @@ -223,27 +191,26 @@ public class DataEntryActivity extends Activity { } else { // Show the last scale data as default - scaleMeasurement = openScale.getScaleMeasurementList().get(0); + scaleMeasurement = openScale.getScaleMeasurementList().get(0).clone(); + scaleMeasurement.setId(0); scaleMeasurement.setDateTime(new Date()); scaleMeasurement.setComment(""); } + } - for (MeasurementView measurement : dataEntryMeasurements) { - measurement.updateValue(scaleMeasurement); - } + for (MeasurementView measurement : dataEntryMeasurements) { + measurement.loadFrom(scaleMeasurement, previousMeasurement); + measurement.setExpand(doExpand); } txtDataNr.setText(DateFormat.getDateTimeInstance( DateFormat.LONG, DateFormat.SHORT).format(scaleMeasurement.getDateTime())); - - onMeasurementViewUpdateListener updateListener = new onMeasurementViewUpdateListener(); - for (MeasurementView measurement : dataEntryMeasurements) { - measurement.setOnUpdateListener(updateListener); - } } private void setViewMode(MeasurementView.MeasurementViewMode viewMode) { + int dateTimeVisibility = View.VISIBLE; + switch (viewMode) { case VIEW: btnOk.setVisibility(View.VISIBLE); @@ -253,8 +220,7 @@ public class DataEntryActivity extends Activity { btnRight.setVisibility(View.VISIBLE); expandButton.setVisibility(View.VISIBLE); switchEditMode.setVisibility(View.VISIBLE); - dateMeasurement.setVisibility(View.GONE); - timeMeasurement.setVisibility(View.GONE); + dateTimeVisibility = View.GONE; break; case EDIT: btnOk.setVisibility(View.VISIBLE); @@ -264,8 +230,6 @@ public class DataEntryActivity extends Activity { btnRight.setVisibility(View.VISIBLE); expandButton.setVisibility(View.VISIBLE); switchEditMode.setVisibility(View.VISIBLE); - dateMeasurement.setVisibility(View.VISIBLE); - timeMeasurement.setVisibility(View.VISIBLE); break; case ADD: btnOk.setVisibility(View.GONE); @@ -275,63 +239,29 @@ public class DataEntryActivity extends Activity { btnRight.setVisibility(View.GONE); expandButton.setVisibility(View.GONE); switchEditMode.setVisibility(View.GONE); - dateMeasurement.setVisibility(View.VISIBLE); - timeMeasurement.setVisibility(View.VISIBLE); break; } for (MeasurementView measurement : dataEntryMeasurements) { + if (measurement instanceof DateMeasurementView || measurement instanceof TimeMeasurementView) { + measurement.setVisibility(dateTimeVisibility); + } measurement.setEditMode(viewMode); } } - private ScaleMeasurement createScaleDataFromMeasurement() { - OpenScale openScale = OpenScale.getInstance(getApplicationContext()); - ScaleUser user = openScale.getSelectedScaleUser(); - - Calendar time = Calendar.getInstance(); - time.setTime(timeMeasurement.getDateTime()); - - Calendar cal = Calendar.getInstance(); - cal.setTime(dateMeasurement.getDateTime()); - cal.set(Calendar.HOUR_OF_DAY, time.get(Calendar.HOUR_OF_DAY)); - cal.set(Calendar.MINUTE, time.get(Calendar.MINUTE)); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - - ScaleMeasurement scaleMeasurement = new ScaleMeasurement(); - - scaleMeasurement.setUserId(user.getId()); - scaleMeasurement.setDateTime(cal.getTime()); - scaleMeasurement.setConvertedWeight(weightMeasurement.getValue(), user.getScaleUnit()); - scaleMeasurement.setFat(fatMeasurement.getValue()); - scaleMeasurement.setWater(waterMeasurement.getValue()); - scaleMeasurement.setMuscle(muscleMeasurement.getValue()); - scaleMeasurement.setLbw(lbwMeasurement.getValue()); - scaleMeasurement.setWaist(waistMeasurement.getValue()); - scaleMeasurement.setHip(hipMeasurement.getValue()); - scaleMeasurement.setBone(boneMeasurementView.getValue()); - scaleMeasurement.setComment(commentMeasurement.getValueAsString()); - - return scaleMeasurement; - } - private void saveScaleData() { - ScaleMeasurement scaleMeasurement = createScaleDataFromMeasurement(); - - scaleMeasurement.setId(id); - - OpenScale openScale = OpenScale.getInstance(getApplicationContext()); - openScale.updateScaleData(scaleMeasurement); + if (isDirty) { + OpenScale openScale = OpenScale.getInstance(getApplicationContext()); + openScale.updateScaleData(scaleMeasurement); + isDirty = false; + } } private boolean moveLeft() { - ScaleMeasurement[] tupleScaleData = OpenScale.getInstance(getApplicationContext()).getTupleScaleData(id); - ScaleMeasurement prevScaleMeasurement = tupleScaleData[0]; - - if (prevScaleMeasurement != null) { + if (previousMeasurement != null) { saveScaleData(); - getIntent().putExtra("id", prevScaleMeasurement.getId()); + getIntent().putExtra("id", previousMeasurement.getId()); updateOnView(); return true; } @@ -339,9 +269,9 @@ public class DataEntryActivity extends Activity { return false; } - private boolean moveRight() - { - ScaleMeasurement[] tupleScaleData = OpenScale.getInstance(getApplicationContext()).getTupleScaleData(id); + private boolean moveRight() { + ScaleMeasurement[] tupleScaleData = OpenScale.getInstance(getApplicationContext()) + .getTupleScaleData(scaleMeasurement.getId()); ScaleMeasurement nextScaleMeasurement = tupleScaleData[2]; if (nextScaleMeasurement != null) { @@ -357,23 +287,12 @@ public class DataEntryActivity extends Activity { private class onMeasurementViewUpdateListener implements MeasurementViewUpdateListener { @Override public void onMeasurementViewUpdate(MeasurementView view) { - ArrayList viewsToUpdate = new ArrayList<>(); - if (view == weightMeasurement) { - viewsToUpdate.add(bmiMeasurementView); - viewsToUpdate.add(bmrMeasurementView); - } else if (view == waistMeasurement) { - viewsToUpdate.add(wHtRMeasurementView); - viewsToUpdate.add(whrMeasurementView); - } else if (view == hipMeasurement) { - viewsToUpdate.add(whrMeasurementView); - } else if (view == dateMeasurement) { - viewsToUpdate.add(bmrMeasurementView); - } + view.saveTo(scaleMeasurement); + isDirty = true; - if (!viewsToUpdate.isEmpty()) { - ScaleMeasurement scaleMeasurement = createScaleDataFromMeasurement(); - for (MeasurementView measurement : viewsToUpdate) { - measurement.updateValue(scaleMeasurement); + for (MeasurementView measurement : dataEntryMeasurements) { + if (measurement != view) { + measurement.loadFrom(scaleMeasurement, previousMeasurement); } } } @@ -394,7 +313,9 @@ public class DataEntryActivity extends Activity { infoDialog.show(); } else { - ScaleMeasurement scaleMeasurement = createScaleDataFromMeasurement(); + for (MeasurementView measurement : dataEntryMeasurements) { + measurement.saveTo(scaleMeasurement); + } OpenScale openScale = OpenScale.getInstance(getApplicationContext()); openScale.addScaleData(scaleMeasurement); @@ -463,7 +384,7 @@ public class DataEntryActivity extends Activity { } void deleteMeasurement() { - int delId = id; + int delId = scaleMeasurement.getId(); boolean hasNext = moveLeft(); diff --git a/android_app/app/src/main/java/com/health/openscale/gui/fragments/OverviewFragment.java b/android_app/app/src/main/java/com/health/openscale/gui/fragments/OverviewFragment.java index 3a78ab42..f470acd3 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/fragments/OverviewFragment.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/fragments/OverviewFragment.java @@ -179,8 +179,7 @@ public class OverviewFragment extends Fragment implements FragmentUpdateListener lastScaleMeasurement = new ScaleMeasurement(); } else if (userSelectedData != null) { lastScaleMeasurement = userSelectedData; - } - else { + } else { lastScaleMeasurement = scaleMeasurementList.get(0); } @@ -197,14 +196,9 @@ public class OverviewFragment extends Fragment implements FragmentUpdateListener ScaleMeasurement[] tupleScaleData = OpenScale.getInstance(context).getTupleScaleData(lastScaleMeasurement.getId()); ScaleMeasurement prevScaleMeasurement = tupleScaleData[0]; - if (prevScaleMeasurement == null) { - prevScaleMeasurement = new ScaleMeasurement(); - } - for (MeasurementView measurement : overviewMeasurements) { measurement.updatePreferences(prefs); - measurement.updateValue(lastScaleMeasurement); - measurement.updateDiff(lastScaleMeasurement, prevScaleMeasurement); + measurement.loadFrom(lastScaleMeasurement, prevScaleMeasurement); } } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/fragments/TableFragment.java b/android_app/app/src/main/java/com/health/openscale/gui/fragments/TableFragment.java index 18ee4e95..62018925 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/fragments/TableFragment.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/fragments/TableFragment.java @@ -201,31 +201,24 @@ public class TableFragment extends Fragment implements FragmentUpdateListener { int displayCount = 0; - for (int i = (maxSize * selectedSubpageNr); i< scaleMeasurementList.size(); i++) { + for (int i = (maxSize * selectedSubpageNr); i < scaleMeasurementList.size(); i++) { ScaleMeasurement scaleMeasurement = scaleMeasurementList.get(i); - ScaleMeasurement prevScaleMeasurement; - - if (i >= scaleMeasurementList.size()-1) { - prevScaleMeasurement = new ScaleMeasurement(); - } else { - prevScaleMeasurement = scaleMeasurementList.get(i+1); + ScaleMeasurement prevScaleMeasurement = null; + if (i < scaleMeasurementList.size() - 1) { + prevScaleMeasurement = scaleMeasurementList.get(i + 1); } - HashMap dataRow = new HashMap<>(); int columnNr = 0; - dataRow.put(columnNr, Long.toString(scaleMeasurement.getId())); + dataRow.put(columnNr++, Long.toString(scaleMeasurement.getId())); - for (int j=0; j< measurementsList.size(); j++) { - MeasurementView measurement = measurementsList.get(j); - measurement.updateValue(scaleMeasurement); - measurement.updateDiff(scaleMeasurement, prevScaleMeasurement); + for (MeasurementView measurement : measurementsList) { + measurement.loadFrom(scaleMeasurement, prevScaleMeasurement); if (measurement.isVisible()) { - columnNr++; - dataRow.put(columnNr, measurement.getValueAsString() + "
" + measurement.getDiffValue()); + dataRow.put(columnNr++, measurement.getValueAsString() + "
" + measurement.getDiffValue()); } } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/BMIMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/BMIMeasurementView.java index e3967c26..a0dd9f6e 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/BMIMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/BMIMeasurementView.java @@ -24,44 +24,44 @@ import com.health.openscale.core.datatypes.ScaleMeasurement; import com.health.openscale.core.evaluation.EvaluationResult; import com.health.openscale.core.evaluation.EvaluationSheet; -public class BMIMeasurementView extends MeasurementView { +public class BMIMeasurementView extends FloatMeasurementView { public BMIMeasurementView(Context context) { super(context, context.getResources().getString(R.string.label_bmi), ContextCompat.getDrawable(context, R.drawable.ic_bmi)); } + @Override + public void updatePreferences(SharedPreferences preferences) { + setVisible(preferences.getBoolean("weightEnable", true)); + } + @Override public boolean isEditable() { return false; } @Override - public void updateValue(ScaleMeasurement newMeasurement) { - setValueOnView(newMeasurement.getDateTime(), newMeasurement.getBMI(getScaleUser().getBodyHeight())); + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getBMI(getScaleUser().getBodyHeight()); } @Override - public void updateDiff(ScaleMeasurement newMeasurement, ScaleMeasurement lastMeasurement) { - setDiffOnView(newMeasurement.getBMI(getScaleUser().getBodyHeight()), lastMeasurement.getBMI(getScaleUser().getBodyHeight())); + protected void setMeasurementValue(float value, ScaleMeasurement measurement) { + // Empty } @Override - public String getUnit() { + protected String getUnit() { return ""; } @Override - public EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { - return evalSheet.evaluateBMI(value); - } - - @Override - public float getMaxValue() { + protected float getMaxValue() { return 50; } @Override - public void updatePreferences(SharedPreferences preferences) { - setVisible(preferences.getBoolean("weightEnable", true)); + protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { + return evalSheet.evaluateBMI(value); } } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/BMRMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/BMRMeasurementView.java index da9873d4..e577609a 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/BMRMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/BMRMeasurementView.java @@ -24,44 +24,51 @@ import com.health.openscale.core.datatypes.ScaleMeasurement; import com.health.openscale.core.evaluation.EvaluationResult; import com.health.openscale.core.evaluation.EvaluationSheet; -public class BMRMeasurementView extends MeasurementView { +import java.util.Locale; + +public class BMRMeasurementView extends FloatMeasurementView { public BMRMeasurementView(Context context) { super(context, context.getResources().getString(R.string.label_bmr), ContextCompat.getDrawable(context, R.drawable.ic_bmr)); } + @Override + public void updatePreferences(SharedPreferences preferences) { + setVisible(preferences.getBoolean("weightEnable", true)); + } + @Override public boolean isEditable() { return false; } @Override - public void updateValue(ScaleMeasurement newMeasurement) { - setValueOnView(newMeasurement.getDateTime(), newMeasurement.getBMR(getScaleUser())); + protected String formatValue(float value) { + return String.format(Locale.getDefault(), "%d", Math.round(value)); } @Override - public void updateDiff(ScaleMeasurement newMeasurement, ScaleMeasurement lastMeasurement) { - setDiffOnView(newMeasurement.getBMR(getScaleUser()), lastMeasurement.getBMR(getScaleUser())); + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getBMR(getScaleUser()); } @Override - public String getUnit() { + protected void setMeasurementValue(float value, ScaleMeasurement measurement) { + // Empty + } + + @Override + protected String getUnit() { return "kCal"; } @Override - public EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { - return null; - } - - @Override - public float getMaxValue() { + protected float getMaxValue() { return 5000; } @Override - public void updatePreferences(SharedPreferences preferences) { - setVisible(preferences.getBoolean("weightEnable", true)); + protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { + return null; } } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/BoneMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/BoneMeasurementView.java index 6df615c4..bd778b18 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/BoneMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/BoneMeasurementView.java @@ -24,39 +24,39 @@ import com.health.openscale.core.datatypes.ScaleMeasurement; import com.health.openscale.core.evaluation.EvaluationResult; import com.health.openscale.core.evaluation.EvaluationSheet; -public class BoneMeasurementView extends MeasurementView { +public class BoneMeasurementView extends FloatMeasurementView { public BoneMeasurementView(Context context) { super(context, context.getResources().getString(R.string.label_bone), ContextCompat.getDrawable(context, R.drawable.ic_bone)); } - @Override - public void updateValue(ScaleMeasurement newMeasurement) { - setValueOnView(newMeasurement.getDateTime(), newMeasurement.getBone()); - } - - @Override - public void updateDiff(ScaleMeasurement newMeasurement, ScaleMeasurement lastMeasurement) { - setDiffOnView(newMeasurement.getBone(), lastMeasurement.getBone()); - } - - @Override - public String getUnit() { - return "kg"; - } - @Override public void updatePreferences(SharedPreferences preferences) { setVisible(preferences.getBoolean("boneEnable", false)); } @Override - public EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { - return null; + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getBone(); } @Override - public float getMaxValue() { + protected void setMeasurementValue(float value, ScaleMeasurement measurement) { + measurement.setBone(value); + } + + @Override + protected String getUnit() { + return "kg"; + } + + @Override + protected float getMaxValue() { return 50; } + + @Override + protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { + return null; + } } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/CommentMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/CommentMeasurementView.java index 0609aa0a..c08e8ecc 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/CommentMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/CommentMeasurementView.java @@ -23,57 +23,56 @@ import android.widget.EditText; import com.health.openscale.R; import com.health.openscale.core.datatypes.ScaleMeasurement; -import com.health.openscale.core.evaluation.EvaluationResult; -import com.health.openscale.core.evaluation.EvaluationSheet; public class CommentMeasurementView extends MeasurementView { + private String comment; public CommentMeasurementView(Context context) { super(context, context.getResources().getString(R.string.label_comment), ContextCompat.getDrawable(context, R.drawable.ic_comment)); } + private void setValue(String newComment, boolean callListener) { + if (!newComment.equals(comment)) { + comment = newComment; + setValueView(comment, callListener); + } + } + @Override - public boolean validateInput(EditText view) { + public void loadFrom(ScaleMeasurement measurement, ScaleMeasurement previousMeasurement) { + setValue(measurement.getComment(), false); + } + + @Override + public void saveTo(ScaleMeasurement measurement) { + measurement.setComment(comment); + } + + @Override + public void updatePreferences(SharedPreferences preferences) { + // Empty + } + + @Override + public String getValueAsString() { + return comment; + } + + @Override + protected boolean validateAndSetInput(EditText view) { + setValue(view.getText().toString(), true); return true; } + @Override protected int getInputType() { - return InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE | InputType.TYPE_TEXT_FLAG_MULTI_LINE; + return InputType.TYPE_CLASS_TEXT + | InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE + | InputType.TYPE_TEXT_FLAG_MULTI_LINE; } @Override protected String getHintText() { return getResources().getString(R.string.info_enter_comment); } - - @Override - public void updateValue(ScaleMeasurement newMeasurement) { - setValueOnView(newMeasurement.getDateTime(), newMeasurement.getComment()); - } - - @Override - public void updateDiff(ScaleMeasurement newMeasurement, ScaleMeasurement lastMeasurement) { - - } - - @Override - public void updatePreferences(SharedPreferences preferences) { - - } - - @Override - public String getUnit() { - return null; - } - - @Override - public EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { - return null; - } - - @Override - public float getMaxValue() { - return 0; - } - } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/DateMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/DateMeasurementView.java index a9418b05..a17e7c83 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/DateMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/DateMeasurementView.java @@ -21,73 +21,91 @@ import android.content.Context; import android.content.SharedPreferences; import android.support.v4.content.ContextCompat; import android.widget.DatePicker; +import android.widget.EditText; import com.health.openscale.R; import com.health.openscale.core.datatypes.ScaleMeasurement; -import com.health.openscale.core.evaluation.EvaluationResult; -import com.health.openscale.core.evaluation.EvaluationSheet; import java.text.DateFormat; import java.util.Calendar; import java.util.Date; public class DateMeasurementView extends MeasurementView { - private DateFormat dateFormat = DateFormat.getDateInstance(); + private static DateFormat dateFormat = DateFormat.getDateInstance(); + private Date date; public DateMeasurementView(Context context) { super(context, context.getResources().getString(R.string.label_date), ContextCompat.getDrawable(context, R.drawable.ic_lastmonth)); } + private void setValue(Date newDate, boolean callListener) { + if (!newDate.equals(date)) { + date = newDate; + setValueView(dateFormat.format(date), callListener); + } + } + + @Override + public void loadFrom(ScaleMeasurement measurement, ScaleMeasurement previousMeasurement) { + setValue(measurement.getDateTime(), false); + } + + @Override + public void saveTo(ScaleMeasurement measurement) { + Calendar target = Calendar.getInstance(); + target.setTime(measurement.getDateTime()); + + Calendar source = Calendar.getInstance(); + source.setTime(date); + + target.set(source.get(Calendar.YEAR), source.get(Calendar.MONTH), + source.get(Calendar.DAY_OF_MONTH)); + + measurement.setDateTime(target.getTime()); + } + + @Override + public void updatePreferences(SharedPreferences preferences) { + // Empty + } + + @Override + public String getValueAsString() { + return dateFormat.format(date); + } + + @Override + protected boolean validateAndSetInput(EditText view) { + return false; + } + + @Override + protected int getInputType() { + return 0; + } + + @Override + protected String getHintText() { + return null; + } + private DatePickerDialog.OnDateSetListener datePickerListener = new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int selectedYear, int selectedMonth, int selectedDay) { Calendar cal = Calendar.getInstance(); + cal.setTime(date); cal.set(selectedYear, selectedMonth, selectedDay); - Date date = cal.getTime(); - setValueOnView(date, dateFormat.format(date)); + setValue(cal.getTime(), true); } }; @Override protected AlertDialog getInputDialog() { Calendar cal = Calendar.getInstance(); - cal.setTime(getDateTime()); + cal.setTime(date); - DatePickerDialog datePicker = new DatePickerDialog( + return new DatePickerDialog( getContext(), datePickerListener, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)); - - return datePicker; } - - @Override - public void updateValue(ScaleMeasurement newMeasurement) { - setValueOnView(newMeasurement.getDateTime(), dateFormat.format(newMeasurement.getDateTime())); - } - - @Override - public void updateDiff(ScaleMeasurement newMeasurement, ScaleMeasurement lastMeasurement) { - - } - - @Override - public void updatePreferences(SharedPreferences preferences) { - - } - - @Override - public String getUnit() { - return null; - } - - @Override - public EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { - return null; - } - - @Override - public float getMaxValue() { - return 0; - } - } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/FatMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/FatMeasurementView.java index 98cbedb9..a7d6b242 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/FatMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/FatMeasurementView.java @@ -24,7 +24,7 @@ import com.health.openscale.core.datatypes.ScaleMeasurement; import com.health.openscale.core.evaluation.EvaluationResult; import com.health.openscale.core.evaluation.EvaluationSheet; -public class FatMeasurementView extends MeasurementView { +public class FatMeasurementView extends FloatMeasurementView { private boolean estimateFatEnable; @@ -32,33 +32,6 @@ public class FatMeasurementView extends MeasurementView { super(context, context.getResources().getString(R.string.label_fat), ContextCompat.getDrawable(context, R.drawable.ic_fat)); } - @Override - public boolean isEditable() { - if (estimateFatEnable && getMeasurementMode() == MeasurementViewMode.ADD) { - return false; - } - return true; - } - - @Override - public void updateValue(ScaleMeasurement newMeasurement) { - if (estimateFatEnable && getMeasurementMode() == MeasurementViewMode.ADD) { - setValueOnView(newMeasurement.getDateTime(), (getContext().getString(R.string.label_automatic))); - } else { - setValueOnView(newMeasurement.getDateTime(), newMeasurement.getFat()); - } - } - - @Override - public void updateDiff(ScaleMeasurement newMeasurement, ScaleMeasurement lastMeasurement) { - setDiffOnView(newMeasurement.getFat(), lastMeasurement.getFat()); - } - - @Override - public String getUnit() { - return "%"; - } - @Override public void updatePreferences(SharedPreferences preferences) { setVisible(preferences.getBoolean("fatEnable", true)); @@ -66,13 +39,32 @@ public class FatMeasurementView extends MeasurementView { } @Override - public EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { - return evalSheet.evaluateBodyFat(value); + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getFat(); } @Override - public float getMaxValue() { + protected void setMeasurementValue(float value, ScaleMeasurement measurement) { + measurement.setFat(value); + } + + @Override + protected String getUnit() { + return "%"; + } + + @Override + protected float getMaxValue() { return 80; } + @Override + protected boolean isEstimationEnabled() { + return estimateFatEnable; + } + + @Override + protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { + return evalSheet.evaluateBodyFat(value); + } } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/FloatMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/FloatMeasurementView.java new file mode 100644 index 00000000..2008d9d3 --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/FloatMeasurementView.java @@ -0,0 +1,372 @@ +/* Copyright (C) 2018 Erik Johansson +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see +*/ + +package com.health.openscale.gui.views; + +import android.content.Context; +import android.graphics.Color; +import android.graphics.drawable.Drawable; +import android.os.Handler; +import android.text.Html; +import android.text.InputType; +import android.view.MotionEvent; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.TableRow; + +import com.health.openscale.R; +import com.health.openscale.core.datatypes.ScaleMeasurement; +import com.health.openscale.core.evaluation.EvaluationResult; +import com.health.openscale.core.evaluation.EvaluationSheet; + +import java.util.Date; +import java.util.Locale; + +public abstract class FloatMeasurementView extends MeasurementView { + private static String SYMBOL_UP = "➚"; + private static String SYMBOL_NEUTRAL = "➙"; + private static String SYMBOL_DOWN = "➘"; + + private static float NO_VALUE = -1.0f; + private static float AUTO_VALUE = -2.0f; + + Date dateTime; + float value = NO_VALUE; + float previousValue = NO_VALUE; + EvaluationResult evaluationResult; + + private String nameText; + + private Button incButton; + private Button decButton; + + public FloatMeasurementView(Context context, String text, Drawable icon) { + super(context, text, icon); + initView(context); + + nameText = text; + } + + private void initView(Context context) { + incButton = new Button(context); + decButton = new Button(context); + + LinearLayout incDecLayout = getIncDecLayout(); + incDecLayout.addView(incButton); + incDecLayout.addView(decButton); + + incButton.setText("+"); + incButton.setBackgroundColor(Color.TRANSPARENT); + incButton.setPadding(0,0,0,0); + incButton.setLayoutParams(new TableRow.LayoutParams(LayoutParams.MATCH_PARENT, 0, 0.50f)); + incButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + incValue(); + } + }); + incButton.setOnTouchListener(new RepeatListener(400, 100, new OnClickListener() { + @Override + public void onClick(View view) { + incValue(); + } + })); + incButton.setVisibility(View.GONE); + + decButton.setText("-"); + decButton.setBackgroundColor(Color.TRANSPARENT); + decButton.setPadding(0,0,0,0); + decButton.setLayoutParams(new TableRow.LayoutParams(LayoutParams.MATCH_PARENT, 0, 0.50f)); + decButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + decValue(); + } + }); + + decButton.setOnTouchListener(new RepeatListener(400, 100, new OnClickListener() { + @Override + public void onClick(View view) { + decValue(); + } + })); + decButton.setVisibility(View.GONE); + } + + private float clampValue(float value) { + return Math.max(0.0f, Math.min(getMaxValue(), value)); + } + + private void setValue(float newValue, float newPreviousValue, boolean callListener) { + final String unit = getUnit(); + final String suffix = unit.isEmpty() ? "" : " " + unit; + + final boolean valueChanged = newValue != value; + final boolean previousValueChanged = newPreviousValue != previousValue; + + if (valueChanged) { + value = newValue; + evaluationResult = null; + + if (value == AUTO_VALUE) { + setValueView(getContext().getString(R.string.label_automatic), false); + } + else { + setValueView(formatValue(value) + suffix, callListener); + + if (getMeasurementMode() != MeasurementViewMode.ADD) { + EvaluationSheet evalSheet = new EvaluationSheet(getScaleUser(), dateTime); + evaluationResult = evaluateSheet(evalSheet, value); + } + } + setEvaluationView(evaluationResult); + } + + if (valueChanged || previousValueChanged) { + previousValue = newPreviousValue; + if (previousValue >= 0.0f) { + final float diff = value - previousValue; + + String symbol; + + if (diff > 0.0) { + symbol = SYMBOL_UP; + } else if (diff < 0.0) { + symbol = SYMBOL_DOWN; + } else { + symbol = SYMBOL_NEUTRAL; + } + + setNameView(Html.fromHtml( + String.format( + "%s
%s%s%s", + nameText, symbol, formatValue(diff), suffix))); + } else { + setNameView(nameText); + } + } + } + + private void incValue() { + setValue(clampValue(value + 0.1f), previousValue, true); + } + private void decValue() { + setValue(clampValue(value - 0.1f), previousValue, true); + } + + protected String formatValue(float value) { + return String.format(Locale.getDefault(), "%.2f", value); + } + + protected abstract float getMeasurementValue(ScaleMeasurement measurement); + protected abstract void setMeasurementValue(float value, ScaleMeasurement measurement); + + protected abstract String getUnit(); + protected abstract float getMaxValue(); + + protected boolean isEstimationEnabled() { + return false; + } + + protected abstract EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value); + + private boolean useAutoValue() { + return isEstimationEnabled() && getMeasurementMode() == MeasurementViewMode.ADD; + } + + @Override + public void loadFrom(ScaleMeasurement measurement, ScaleMeasurement previousMeasurement) { + dateTime = measurement.getDateTime(); + + float newValue = AUTO_VALUE; + float newPreviousValue = NO_VALUE; + + if (!useAutoValue()) { + newValue = clampValue(getMeasurementValue(measurement)); + if (previousMeasurement != null) { + newPreviousValue = clampValue(getMeasurementValue(previousMeasurement)); + } + } + + setValue(newValue, newPreviousValue, false); + } + + @Override + public void saveTo(ScaleMeasurement measurement) { + if (!useAutoValue()) { + setMeasurementValue(value, measurement); + } + } + + @Override + public String getValueAsString() { + if (useAutoValue()) { + return getContext().getString(R.string.label_automatic); + } + return formatValue(value); + } + + @Override + public String getDiffValue() { + if (previousValue < 0.0f) { + return ""; + } + + String symbol; + String color; + + final float diff = value - previousValue; + if (diff > 0.0f) { + symbol = SYMBOL_UP; + color = "green"; + } else if (diff < 0.0f) { + symbol = SYMBOL_DOWN; + color = "red"; + } else { + symbol = SYMBOL_NEUTRAL; + color = "grey"; + } + return String.format( + "%s%s", + color, symbol, formatValue(diff)); + } + + @Override + protected boolean isEditable() { + if (useAutoValue()) { + return false; + } + return true; + } + + @Override + public void setEditMode(MeasurementViewMode mode) { + super.setEditMode(mode); + + if (mode == MeasurementViewMode.VIEW || !isEditable()) { + incButton.setVisibility(View.GONE); + decButton.setVisibility(View.GONE); + } + else { + incButton.setVisibility(View.VISIBLE); + decButton.setVisibility(View.VISIBLE); + } + } + + @Override + public void setExpand(boolean state) { + final boolean show = state && isVisible() && evaluationResult != null; + showEvaluatorRow(show); + } + + @Override + protected boolean validateAndSetInput(EditText view) { + final String text = view.getText().toString(); + + if (text.isEmpty()) { + view.setError(getResources().getString(R.string.error_value_required)); + return false; + } + + float newValue; + try { + newValue = Float.valueOf(text.replace(',', '.')); + } + catch (NumberFormatException ex) { + newValue = -1; + } + + if (newValue < 0 || newValue > getMaxValue()) { + view.setError(getResources().getString(R.string.error_value_range)); + return false; + } + + setValue(newValue, previousValue, true); + return true; + } + + @Override + protected int getInputType() { + return InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL; + } + + @Override + protected String getHintText() { + return getResources().getString(R.string.info_enter_value_unit) + " " + getUnit(); + } + + private class RepeatListener implements OnTouchListener { + private Handler handler = new Handler(); + + private int initialInterval; + private final int normalInterval; + private final OnClickListener clickListener; + + private Runnable handlerRunnable = new Runnable() { + @Override + public void run() { + handler.postDelayed(this, normalInterval); + clickListener.onClick(downView); + } + }; + + private View downView; + + /** + * RepeatListener cyclically runs a clickListener, emulating keyboard-like behaviour. First + * click is fired immediately, next one after the initialInterval, and subsequent ones after the normalInterval. + * + * @param initialInterval The interval after first click event + * @param normalInterval The interval after second and subsequent click events + * @param clickListener The OnClickListener, that will be called periodically + */ + public RepeatListener(int initialInterval, int normalInterval, + OnClickListener clickListener) { + if (clickListener == null) { + throw new IllegalArgumentException("null runnable"); + } + if (initialInterval < 0 || normalInterval < 0) { + throw new IllegalArgumentException("negative interval"); + } + + this.initialInterval = initialInterval; + this.normalInterval = normalInterval; + this.clickListener = clickListener; + } + + public boolean onTouch(View view, MotionEvent motionEvent) { + switch (motionEvent.getAction()) { + case MotionEvent.ACTION_DOWN: + handler.removeCallbacks(handlerRunnable); + handler.postDelayed(handlerRunnable, initialInterval); + downView = view; + downView.setPressed(true); + clickListener.onClick(view); + return true; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + handler.removeCallbacks(handlerRunnable); + downView.setPressed(false); + downView = null; + return true; + } + + return false; + } + } +} diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/HipMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/HipMeasurementView.java index 559ed895..3a845577 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/HipMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/HipMeasurementView.java @@ -24,40 +24,39 @@ import com.health.openscale.core.datatypes.ScaleMeasurement; import com.health.openscale.core.evaluation.EvaluationResult; import com.health.openscale.core.evaluation.EvaluationSheet; -public class HipMeasurementView extends MeasurementView { +public class HipMeasurementView extends FloatMeasurementView { public HipMeasurementView(Context context) { super(context, context.getResources().getString(R.string.label_hip), ContextCompat.getDrawable(context, R.drawable.ic_hip)); } - @Override - public void updateValue(ScaleMeasurement newMeasurement) { - setValueOnView(newMeasurement.getDateTime(), newMeasurement.getHip()); - } - - @Override - public void updateDiff(ScaleMeasurement newMeasurement, ScaleMeasurement lastMeasurement) { - setDiffOnView(newMeasurement.getHip(), lastMeasurement.getHip()); - } - - @Override - public String getUnit() { - return "cm"; - } - @Override public void updatePreferences(SharedPreferences preferences) { setVisible(preferences.getBoolean("hipEnable", false)); } @Override - public EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { - return null; + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getHip(); } @Override - public float getMaxValue() { + protected void setMeasurementValue(float value, ScaleMeasurement measurement) { + measurement.setHip(value); + } + + @Override + protected String getUnit() { + return "cm"; + } + + @Override + protected float getMaxValue() { return 200; } + @Override + protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { + return null; + } } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/LBWMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/LBWMeasurementView.java index 9eabcc32..82690873 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/LBWMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/LBWMeasurementView.java @@ -24,7 +24,7 @@ import com.health.openscale.core.datatypes.ScaleMeasurement; import com.health.openscale.core.evaluation.EvaluationResult; import com.health.openscale.core.evaluation.EvaluationSheet; -public class LBWMeasurementView extends MeasurementView { +public class LBWMeasurementView extends FloatMeasurementView { private boolean estimateLBWEnable; @@ -32,33 +32,6 @@ public class LBWMeasurementView extends MeasurementView { super(context, context.getResources().getString(R.string.label_lbw), ContextCompat.getDrawable(context, R.drawable.ic_lbw)); } - @Override - public boolean isEditable() { - if (estimateLBWEnable && getMeasurementMode() == MeasurementViewMode.ADD) { - return false; - } - return true; - } - - @Override - public void updateValue(ScaleMeasurement newMeasurement) { - if (estimateLBWEnable && getMeasurementMode() == MeasurementViewMode.ADD) { - setValueOnView(newMeasurement.getDateTime(), (getContext().getString(R.string.label_automatic))); - } else { - setValueOnView(newMeasurement.getDateTime(), newMeasurement.getLbw()); - } - } - - @Override - public void updateDiff(ScaleMeasurement newMeasurement, ScaleMeasurement lastMeasurement) { - setDiffOnView(newMeasurement.getLbw(), lastMeasurement.getLbw()); - } - - @Override - public String getUnit() { - return "kg"; - } - @Override public void updatePreferences(SharedPreferences preferences) { setVisible(preferences.getBoolean("lbwEnable", false)); @@ -66,13 +39,32 @@ public class LBWMeasurementView extends MeasurementView { } @Override - public EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { - return null; + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getLbw(); } @Override - public float getMaxValue() { + protected void setMeasurementValue(float value, ScaleMeasurement measurement) { + measurement.setLbw(value); + } + + @Override + protected String getUnit() { + return "kg"; + } + + @Override + protected float getMaxValue() { return 300; } + @Override + protected boolean isEstimationEnabled() { + return estimateLBWEnable; + } + + @Override + protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { + return null; + } } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementView.java index eef4846d..baf608a7 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementView.java @@ -21,13 +21,9 @@ import android.content.DialogInterface; import android.content.SharedPreferences; import android.graphics.Color; import android.graphics.drawable.Drawable; -import android.os.Handler; import android.support.v4.content.ContextCompat; -import android.text.Html; -import android.text.InputType; import android.util.TypedValue; import android.view.Gravity; -import android.view.MotionEvent; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.Button; @@ -44,9 +40,6 @@ import com.health.openscale.core.OpenScale; import com.health.openscale.core.datatypes.ScaleMeasurement; import com.health.openscale.core.datatypes.ScaleUser; import com.health.openscale.core.evaluation.EvaluationResult; -import com.health.openscale.core.evaluation.EvaluationSheet; - -import java.util.Date; import lecho.lib.hellocharts.util.ChartUtils; @@ -56,42 +49,25 @@ import static com.health.openscale.gui.views.MeasurementView.MeasurementViewMode public abstract class MeasurementView extends TableLayout { public enum MeasurementViewMode {VIEW, EDIT, ADD}; - private static String SYMBOL_UP = "➚"; - private static String SYMBOL_NEUTRAL = "➙"; - private static String SYMBOL_DOWN = "➘"; private TableRow measurementRow; private ImageView iconView; private TextView nameView; private TextView valueView; - private LinearLayout incdecLayout; - private Button incView; - private Button decView; + private LinearLayout incDecLayout; private ImageView editModeView; private ImageView indicatorView; private TableRow evaluatorRow; private LinearGaugeView evaluatorView; - private String nameText; - - private Date dateTime; - private String value; - private float previousValue; - private String diffValue; - private MeasurementViewUpdateListener updateListener = null; - private MeasurementViewMode measurementMode; + private MeasurementViewMode measurementMode = VIEW; public MeasurementView(Context context, String text, Drawable icon) { super(context); initView(context); - measurementMode = VIEW; - nameText = text; - dateTime = new Date(); - value = new String(); - diffValue = new String(); nameView.setText(text); iconView.setImageDrawable(icon); } @@ -102,22 +78,20 @@ public abstract class MeasurementView extends TableLayout { iconView = new ImageView(context); nameView = new TextView(context); valueView = new TextView(context); - incView = new Button(context); - decView = new Button(context); editModeView = new ImageView(context); indicatorView = new ImageView(context); evaluatorRow = new TableRow(context); evaluatorView = new LinearGaugeView(context); - incdecLayout = new LinearLayout(context); + incDecLayout = new LinearLayout(context); measurementRow.setLayoutParams(new TableRow.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT, 1.0f)); measurementRow.setGravity(Gravity.CENTER); measurementRow.addView(iconView); measurementRow.addView(nameView); measurementRow.addView(valueView); - measurementRow.addView(incdecLayout); + measurementRow.addView(incDecLayout); measurementRow.addView(editModeView); measurementRow.addView(indicatorView); @@ -138,49 +112,10 @@ public abstract class MeasurementView extends TableLayout { valueView.setPadding(0,0,20,0); valueView.setLayoutParams(new TableRow.LayoutParams(0, LayoutParams.MATCH_PARENT, 0.29f)); - incdecLayout.setOrientation(VERTICAL); - incdecLayout.addView(incView); - incdecLayout.addView(decView); - incdecLayout.setVisibility(View.GONE); - incdecLayout.setPadding(0,0,0,0); - incdecLayout.setLayoutParams(new TableRow.LayoutParams(0, LayoutParams.MATCH_PARENT, 0.05f)); - - incView.setText("+"); - incView.setBackgroundColor(Color.TRANSPARENT); - incView.setPadding(0,0,0,0); - incView.setLayoutParams(new TableRow.LayoutParams(LayoutParams.MATCH_PARENT, 0, 0.50f)); - incView.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - incValue(); - } - }); - incView.setOnTouchListener(new RepeatListener(400, 100, new OnClickListener() { - @Override - public void onClick(View view) { - incValue(); - } - })); - incView.setVisibility(View.GONE); - - decView.setText("-"); - decView.setBackgroundColor(Color.TRANSPARENT); - decView.setPadding(0,0,0,0); - decView.setLayoutParams(new TableRow.LayoutParams(LayoutParams.MATCH_PARENT, 0, 0.50f)); - decView.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - decValue(); - } - }); - - decView.setOnTouchListener(new RepeatListener(400, 100, new OnClickListener() { - @Override - public void onClick(View view) { - decValue(); - } - })); - decView.setVisibility(View.GONE); + incDecLayout.setOrientation(VERTICAL); + incDecLayout.setVisibility(View.GONE); + incDecLayout.setPadding(0,0,0,0); + incDecLayout.setLayoutParams(new TableRow.LayoutParams(0, LayoutParams.MATCH_PARENT, 0.05f)); editModeView.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_editable)); editModeView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); @@ -204,48 +139,23 @@ public abstract class MeasurementView extends TableLayout { evaluatorRow.setOnClickListener(onClickListener); } + protected LinearLayout getIncDecLayout() { + return incDecLayout; + } + public void setOnUpdateListener(MeasurementViewUpdateListener listener) { updateListener = listener; } - public abstract void updateValue(ScaleMeasurement newMeasurement); - public abstract void updateDiff(ScaleMeasurement newMeasurement, ScaleMeasurement lastMeasurement); + public abstract void loadFrom(ScaleMeasurement measurement, ScaleMeasurement previousMeasurement); + public abstract void saveTo(ScaleMeasurement measurement); + public abstract void updatePreferences(SharedPreferences preferences); - public abstract String getUnit(); - public abstract EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value); - public abstract float getMaxValue(); - - public float getValue() { - if (value.length() == 0) { - return -1; - } - try { - return Float.valueOf(value); - } catch (NumberFormatException e) { - return -1; - } - } - - public void incValue() { - float incValue = Math.min(getMaxValue(), getValue() + 0.1f); - setValueOnView(dateTime, incValue); - } - - public void decValue() { - float decValue = Math.max(0.0f, getValue() - 0.1f); - setValueOnView(dateTime, decValue); - } - - public String getValueAsString() { - return value; - } + public abstract String getValueAsString(); + public String getDiffValue() { return ""; } public Drawable getIcon() { return iconView.getDrawable(); } - public String getDiffValue() { return diffValue; } - - public Date getDateTime() { return dateTime; } - protected boolean isEditable() { return true; } @@ -257,30 +167,20 @@ public abstract class MeasurementView extends TableLayout { case VIEW: indicatorView.setVisibility(View.VISIBLE); editModeView.setVisibility(View.GONE); - incdecLayout.setVisibility(View.GONE); - incView.setVisibility(View.GONE); - decView.setVisibility(View.GONE); + incDecLayout.setVisibility(View.GONE); break; case EDIT: case ADD: + indicatorView.setVisibility(View.GONE); editModeView.setVisibility(View.VISIBLE); - incView.setVisibility(View.VISIBLE); - decView.setVisibility(View.VISIBLE); - incdecLayout.setVisibility(View.VISIBLE); + incDecLayout.setVisibility(View.VISIBLE); if (!isEditable()) { - editModeView.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.ic_noteeditable)); - incView.setVisibility(View.GONE); - decView.setVisibility(View.GONE); + editModeView.setImageDrawable(ContextCompat.getDrawable(getContext(), + R.drawable.ic_noteeditable)); } - if (getUnit() == null) { - incView.setVisibility(View.GONE); - decView.setVisibility(View.GONE); - } - - indicatorView.setVisibility(View.GONE); - evaluatorRow.setVisibility(View.GONE); + showEvaluatorRow(false); break; } } @@ -289,66 +189,28 @@ public abstract class MeasurementView extends TableLayout { return measurementMode; } - protected void setValueOnView(Date objTimeDate, Object objValue) { - dateTime = objTimeDate; - value = String.valueOf(objValue); - - try { - Float floatValue = Float.parseFloat(value); - if (measurementMode == VIEW || measurementMode == EDIT) { - evaluate(floatValue); - } - valueView.setText(String.format("%.2f ", floatValue) + getUnit()); - value = String.valueOf(Math.round(floatValue*100.0f)/100.0f); - // Only update diff value if setDiffOnView has been called previously - if (!diffValue.isEmpty()) { - setDiffOnView(floatValue, previousValue); - } - } catch (NumberFormatException e) { - valueView.setText(value); - } - if (updateListener != null) { + protected void setValueView(String text, boolean callListener) { + valueView.setText(text); + if (callListener && updateListener != null) { updateListener.onMeasurementViewUpdate(this); } } - protected void setDiffOnView(float value, float prevValue) { - previousValue = prevValue; - float diff = value - prevValue; + protected void setNameView(CharSequence text) { + nameView.setText(text); + } - String symbol; - String symbol_color; - - if (diff > 0.0) { - symbol = SYMBOL_UP; - symbol_color = "" + SYMBOL_UP + ""; - } else if (diff < 0.0) { - symbol = SYMBOL_DOWN; - symbol_color = "" + SYMBOL_DOWN + ""; - } else { - symbol = SYMBOL_NEUTRAL; - symbol_color = "" + SYMBOL_NEUTRAL + ""; + protected void showEvaluatorRow(boolean show) { + if (show) { + evaluatorRow.setVisibility(View.VISIBLE); + } + else { + evaluatorRow.setVisibility(View.GONE); } - diffValue = symbol_color + "" + String.format("%.2f", diff) + ""; - - nameView.setText( - Html.fromHtml( - nameText + - "
" + - symbol + - " " + - String.format("%.2f ", diff) + getUnit() + - "" - ) - ); } public void setExpand(boolean state) { - if (state && isVisible() && evaluateSheet(new EvaluationSheet(getScaleUser(), dateTime), 0.0f) != null) { - evaluatorRow.setVisibility(View.VISIBLE); - } else { - evaluatorRow.setVisibility(View.GONE); - } + showEvaluatorRow(false); } protected void setVisible(boolean isVisible) { @@ -367,35 +229,17 @@ public abstract class MeasurementView extends TableLayout { return true; } - protected boolean validateInput(EditText view) { - if (view.getText().toString().length() == 0) { - view.setError(getResources().getString(R.string.error_value_required)); - return false; - } - - float floatValue = Float.valueOf(view.getText().toString()); - - if (!(floatValue >= 0 && floatValue <= getMaxValue())) { - view.setError(getResources().getString(R.string.error_value_range)); - return false; - } - - return true; - } - - private void evaluate(float value) { - EvaluationSheet evalSheet = new EvaluationSheet(getScaleUser(), dateTime); - EvaluationResult evalResult = evaluateSheet(evalSheet, value); - + protected void setEvaluationView(EvaluationResult evalResult) { if (evalResult == null) { - evalResult = new EvaluationResult(); + evaluatorView.setLimits(-1.0f, -1.0f); + indicatorView.setBackgroundColor(Color.GRAY); + return; } evaluatorView.setLimits(evalResult.lowLimit, evalResult.highLimit); - evaluatorView.setValue(value); + evaluatorView.setValue(evalResult.value); - switch (evalResult.eval_state) - { + switch (evalResult.eval_state) { case LOW: indicatorView.setBackgroundColor(ChartUtils.COLOR_BLUE); break; @@ -417,16 +261,11 @@ public abstract class MeasurementView extends TableLayout { return openScale.getSelectedScaleUser(); } - protected int getInputType() { - return InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED | InputType.TYPE_NUMBER_FLAG_DECIMAL; - } - - protected String getHintText() { - return getResources().getString(R.string.info_enter_value_unit) + " " + getUnit(); - } + protected abstract boolean validateAndSetInput(EditText view); + protected abstract int getInputType(); + protected abstract String getHintText(); protected AlertDialog getInputDialog() { - final AlertDialog floatDialog; AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); builder.setTitle(nameView.getText()); builder.setIcon(iconView.getDrawable()); @@ -435,14 +274,14 @@ public abstract class MeasurementView extends TableLayout { input.setInputType(getInputType()); input.setHint(getHintText()); - input.setText(value); + input.setText(getValueAsString()); input.setSelectAllOnFocus(true); builder.setView(input); builder.setPositiveButton(getResources().getString(R.string.label_ok), null); builder.setNegativeButton(getResources().getString(R.string.label_cancel), null); - floatDialog = builder.create(); + final AlertDialog floatDialog = builder.create(); floatDialog.setOnShowListener(new DialogInterface.OnShowListener() { @@ -454,8 +293,7 @@ public abstract class MeasurementView extends TableLayout { @Override public void onClick(View view) { - if (validateInput(input)) { - setValueOnView(dateTime, input.getText().toString()); + if (validateAndSetInput(input)) { InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(input.getWindowToken(), 0); floatDialog.dismiss(); @@ -494,65 +332,5 @@ public abstract class MeasurementView extends TableLayout { setExpand(evaluatorRow.getVisibility() != View.VISIBLE); } } - - private class RepeatListener implements OnTouchListener { - - private Handler handler = new Handler(); - - private int initialInterval; - private final int normalInterval; - private final OnClickListener clickListener; - - private Runnable handlerRunnable = new Runnable() { - @Override - public void run() { - handler.postDelayed(this, normalInterval); - clickListener.onClick(downView); - } - }; - - private View downView; - - /** - * RepeatListener cyclically runs a clickListener, emulating keyboard-like behaviour. First - * click is fired immediately, next one after the initialInterval, and subsequent ones after the normalInterval. - * - * @param initialInterval The interval after first click event - * @param normalInterval The interval after second and subsequent click events - * @param clickListener The OnClickListener, that will be called periodically - */ - public RepeatListener(int initialInterval, int normalInterval, - OnClickListener clickListener) { - if (clickListener == null) - throw new IllegalArgumentException("null runnable"); - if (initialInterval < 0 || normalInterval < 0) - throw new IllegalArgumentException("negative interval"); - - this.initialInterval = initialInterval; - this.normalInterval = normalInterval; - this.clickListener = clickListener; - } - - public boolean onTouch(View view, MotionEvent motionEvent) { - switch (motionEvent.getAction()) { - case MotionEvent.ACTION_DOWN: - handler.removeCallbacks(handlerRunnable); - handler.postDelayed(handlerRunnable, initialInterval); - downView = view; - downView.setPressed(true); - clickListener.onClick(view); - return true; - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_CANCEL: - handler.removeCallbacks(handlerRunnable); - downView.setPressed(false); - downView = null; - return true; - } - - return false; - } - - } } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/MuscleMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/MuscleMeasurementView.java index 25fcb9f4..8751ffc9 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/MuscleMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/MuscleMeasurementView.java @@ -24,45 +24,39 @@ import com.health.openscale.core.datatypes.ScaleMeasurement; import com.health.openscale.core.evaluation.EvaluationResult; import com.health.openscale.core.evaluation.EvaluationSheet; -public class MuscleMeasurementView extends MeasurementView { +public class MuscleMeasurementView extends FloatMeasurementView { public MuscleMeasurementView(Context context) { super(context, context.getResources().getString(R.string.label_muscle), ContextCompat.getDrawable(context, R.drawable.ic_muscle)); } - @Override - public boolean isEditable() { - return true; - } - - @Override - public void updateValue(ScaleMeasurement newMeasurement) { - setValueOnView(newMeasurement.getDateTime(), newMeasurement.getMuscle()); - } - - @Override - public void updateDiff(ScaleMeasurement newMeasurement, ScaleMeasurement lastMeasurement) { - setDiffOnView(newMeasurement.getMuscle(), lastMeasurement.getMuscle()); - } - - @Override - public String getUnit() { - return "%"; - } - @Override public void updatePreferences(SharedPreferences preferences) { setVisible(preferences.getBoolean("muscleEnable", true)); } @Override - public EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { - return evalSheet.evaluateBodyMuscle(value); + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getMuscle(); } @Override - public float getMaxValue() { + protected void setMeasurementValue(float value, ScaleMeasurement measurement) { + measurement.setMuscle(value); + } + + @Override + protected String getUnit() { + return "%"; + } + + @Override + protected float getMaxValue() { return 80; } + @Override + protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { + return evalSheet.evaluateBodyMuscle(value); + } } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/TimeMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/TimeMeasurementView.java index 654e8681..7a3fa3ba 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/TimeMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/TimeMeasurementView.java @@ -20,12 +20,11 @@ import android.app.TimePickerDialog; import android.content.Context; import android.content.SharedPreferences; import android.support.v4.content.ContextCompat; +import android.widget.EditText; import android.widget.TimePicker; import com.health.openscale.R; import com.health.openscale.core.datatypes.ScaleMeasurement; -import com.health.openscale.core.evaluation.EvaluationResult; -import com.health.openscale.core.evaluation.EvaluationSheet; import java.text.DateFormat; import java.util.Calendar; @@ -33,65 +32,89 @@ import java.util.Date; public class TimeMeasurementView extends MeasurementView { private DateFormat timeFormat; + private Date time; public TimeMeasurementView(Context context) { super(context, context.getResources().getString(R.string.label_time), ContextCompat.getDrawable(context, R.drawable.ic_daysleft)); timeFormat = android.text.format.DateFormat.getTimeFormat(context); } + private void setValue(Date newTime, boolean callListener) { + if (!newTime.equals(time)) { + time = newTime; + setValueView(timeFormat.format(time), callListener); + } + } + + @Override + public void loadFrom(ScaleMeasurement measurement, ScaleMeasurement previousMeasurement) { + setValue(measurement.getDateTime(), false); + } + + @Override + public void saveTo(ScaleMeasurement measurement) { + Calendar target = Calendar.getInstance(); + target.setTime(measurement.getDateTime()); + + Calendar source = Calendar.getInstance(); + source.setTime(time); + + target.set(Calendar.HOUR, source.get(Calendar.HOUR)); + target.set(Calendar.MINUTE, source.get(Calendar.MINUTE)); + target.set(Calendar.SECOND, 0); + target.set(Calendar.MILLISECOND, 0); + + measurement.setDateTime(target.getTime()); + } + + @Override + public void updatePreferences(SharedPreferences preferences) { + // Empty + } + + @Override + public String getValueAsString() { + return timeFormat.format(time); + } + + @Override + protected boolean validateAndSetInput(EditText view) { + return false; + } + + @Override + protected int getInputType() { + return 0; + } + + @Override + protected String getHintText() { + return null; + } + private TimePickerDialog.OnTimeSetListener timePickerListener = new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { Calendar cal = Calendar.getInstance(); + cal.setTime(time); + cal.set(Calendar.HOUR_OF_DAY, hourOfDay); cal.set(Calendar.MINUTE, minute); cal.set(Calendar.SECOND, 0); - Date date = cal.getTime(); - setValueOnView(date, timeFormat.format(date)); + cal.set(Calendar.MILLISECOND, 0); + + setValue(cal.getTime(), true); } }; @Override protected AlertDialog getInputDialog() { Calendar cal = Calendar.getInstance(); - cal.setTime(getDateTime()); + cal.setTime(time); - TimePickerDialog timePicker = new TimePickerDialog( + return new TimePickerDialog( getContext(), timePickerListener, cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), android.text.format.DateFormat.is24HourFormat(getContext())); - - return timePicker; } - - @Override - public void updateValue(ScaleMeasurement newMeasurement) { - setValueOnView(newMeasurement.getDateTime(), timeFormat.format(newMeasurement.getDateTime())); - } - - @Override - public void updateDiff(ScaleMeasurement newMeasurement, ScaleMeasurement lastMeasurement) { - - } - - @Override - public void updatePreferences(SharedPreferences preferences) { - - } - - @Override - public String getUnit() { - return null; - } - - @Override - public EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { - return null; - } - - @Override - public float getMaxValue() { - return 0; - } - } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/WHRMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/WHRMeasurementView.java index aa91354e..6b5bd79a 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/WHRMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/WHRMeasurementView.java @@ -24,45 +24,45 @@ import com.health.openscale.core.datatypes.ScaleMeasurement; import com.health.openscale.core.evaluation.EvaluationResult; import com.health.openscale.core.evaluation.EvaluationSheet; -public class WHRMeasurementView extends MeasurementView { +public class WHRMeasurementView extends FloatMeasurementView { public WHRMeasurementView(Context context) { super(context, context.getResources().getString(R.string.label_whr), ContextCompat.getDrawable(context, R.drawable.ic_whr)); } + @Override + public void updatePreferences(SharedPreferences preferences) { + setVisible(preferences.getBoolean("hipEnable", false) + && preferences.getBoolean("waistEnable", false)); + } + @Override public boolean isEditable() { return false; } @Override - public void updateValue(ScaleMeasurement newMeasurement) { - setValueOnView(newMeasurement.getDateTime(), newMeasurement.getWHR()); + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getWHR(); } @Override - public void updateDiff(ScaleMeasurement newMeasurement, ScaleMeasurement lastMeasurement) { - setDiffOnView(newMeasurement.getWHR(), lastMeasurement.getWHR()); + protected void setMeasurementValue(float value, ScaleMeasurement measurement) { + // Empty } @Override - public String getUnit() { + protected String getUnit() { return ""; } @Override - public void updatePreferences(SharedPreferences preferences) { - setVisible(preferences.getBoolean("hipEnable", false) && preferences.getBoolean("waistEnable", false)); - } - - @Override - public EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { - return evalSheet.evaluateWHR(value); - } - - @Override - public float getMaxValue() { + protected float getMaxValue() { return 1.5f; } + @Override + protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { + return evalSheet.evaluateWHR(value); + } } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/WHtRMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/WHtRMeasurementView.java index 2ad4f199..4abc247c 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/WHtRMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/WHtRMeasurementView.java @@ -24,45 +24,44 @@ import com.health.openscale.core.datatypes.ScaleMeasurement; import com.health.openscale.core.evaluation.EvaluationResult; import com.health.openscale.core.evaluation.EvaluationSheet; -public class WHtRMeasurementView extends MeasurementView { +public class WHtRMeasurementView extends FloatMeasurementView { public WHtRMeasurementView(Context context) { super(context, context.getResources().getString(R.string.label_whtr), ContextCompat.getDrawable(context, R.drawable.ic_whtr)); } - @Override - public boolean isEditable() { - return false; - } - - @Override - public void updateValue(ScaleMeasurement newMeasurement) { - setValueOnView(newMeasurement.getDateTime(), newMeasurement.getWHtR(getScaleUser().getBodyHeight())); - } - - @Override - public void updateDiff(ScaleMeasurement newMeasurement, ScaleMeasurement lastMeasurement) { - setDiffOnView(newMeasurement.getWHtR(getScaleUser().getBodyHeight()), lastMeasurement.getWHtR(getScaleUser().getBodyHeight())); - } - - @Override - public String getUnit() { - return ""; - } - @Override public void updatePreferences(SharedPreferences preferences) { setVisible(preferences.getBoolean("waistEnable", false)); } @Override - public EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { - return evalSheet.evaluateWHtR(value); + public boolean isEditable() { + return false; } @Override - public float getMaxValue() { + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getWHtR(getScaleUser().getBodyHeight()); + } + + @Override + protected void setMeasurementValue(float value, ScaleMeasurement measurement) { + // Empty + } + + @Override + protected String getUnit() { + return ""; + } + + @Override + protected float getMaxValue() { return 1; } + @Override + protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { + return evalSheet.evaluateWHtR(value); + } } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/WaistMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/WaistMeasurementView.java index 512b166c..5558fbee 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/WaistMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/WaistMeasurementView.java @@ -24,40 +24,39 @@ import com.health.openscale.core.datatypes.ScaleMeasurement; import com.health.openscale.core.evaluation.EvaluationResult; import com.health.openscale.core.evaluation.EvaluationSheet; -public class WaistMeasurementView extends MeasurementView { +public class WaistMeasurementView extends FloatMeasurementView { public WaistMeasurementView(Context context) { super(context, context.getResources().getString(R.string.label_waist), ContextCompat.getDrawable(context, R.drawable.ic_waist)); } - @Override - public void updateValue(ScaleMeasurement newMeasurement) { - setValueOnView(newMeasurement.getDateTime(), newMeasurement.getWaist()); - } - - @Override - public void updateDiff(ScaleMeasurement newMeasurement, ScaleMeasurement lastMeasurement) { - setDiffOnView(newMeasurement.getWaist(), lastMeasurement.getWaist()); - } - - @Override - public String getUnit() { - return "cm"; - } - @Override public void updatePreferences(SharedPreferences preferences) { setVisible(preferences.getBoolean("waistEnable", false)); } @Override - public EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { - return evalSheet.evaluateWaist(value); + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getWaist(); } @Override - public float getMaxValue() { + protected void setMeasurementValue(float value, ScaleMeasurement measurement) { + measurement.setWaist(value); + } + + @Override + protected String getUnit() { + return "cm"; + } + + @Override + protected float getMaxValue() { return 200; } + @Override + protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { + return evalSheet.evaluateWaist(value); + } } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/WaterMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/WaterMeasurementView.java index 72c71e17..b901f5db 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/WaterMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/WaterMeasurementView.java @@ -24,7 +24,7 @@ import com.health.openscale.core.datatypes.ScaleMeasurement; import com.health.openscale.core.evaluation.EvaluationResult; import com.health.openscale.core.evaluation.EvaluationSheet; -public class WaterMeasurementView extends MeasurementView { +public class WaterMeasurementView extends FloatMeasurementView { private boolean estimateWaterEnable; @@ -32,33 +32,6 @@ public class WaterMeasurementView extends MeasurementView { super(context, context.getResources().getString(R.string.label_water), ContextCompat.getDrawable(context, R.drawable.ic_water)); } - @Override - public boolean isEditable() { - if (estimateWaterEnable && getMeasurementMode() == MeasurementViewMode.ADD) { - return false; - } - return true; - } - - @Override - public void updateValue(ScaleMeasurement newMeasurement) { - if (estimateWaterEnable && getMeasurementMode() == MeasurementViewMode.ADD) { - setValueOnView(newMeasurement.getDateTime(), (getContext().getString(R.string.label_automatic))); - } else { - setValueOnView(newMeasurement.getDateTime(), newMeasurement.getWater()); - } - } - - @Override - public void updateDiff(ScaleMeasurement newMeasurement, ScaleMeasurement lastMeasurement) { - setDiffOnView(newMeasurement.getWater(), lastMeasurement.getWater()); - } - - @Override - public String getUnit() { - return "%"; - } - @Override public void updatePreferences(SharedPreferences preferences) { setVisible(preferences.getBoolean("waterEnable", true)); @@ -66,12 +39,32 @@ public class WaterMeasurementView extends MeasurementView { } @Override - public EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { - return evalSheet.evaluateBodyWater(value); + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getWater(); } @Override - public float getMaxValue() { + protected void setMeasurementValue(float value, ScaleMeasurement measurement) { + measurement.setWater(value); + } + + @Override + protected String getUnit() { + return "%"; + } + + @Override + protected float getMaxValue() { return 80; } + + @Override + protected boolean isEstimationEnabled() { + return estimateWaterEnable; + } + + @Override + protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { + return evalSheet.evaluateBodyWater(value); + } } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/WeightMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/WeightMeasurementView.java index d6b1d9d3..18b1bd49 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/WeightMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/WeightMeasurementView.java @@ -25,40 +25,39 @@ import com.health.openscale.core.datatypes.ScaleUser; import com.health.openscale.core.evaluation.EvaluationResult; import com.health.openscale.core.evaluation.EvaluationSheet; -public class WeightMeasurementView extends MeasurementView { +public class WeightMeasurementView extends FloatMeasurementView { public WeightMeasurementView(Context context) { super(context, context.getResources().getString(R.string.label_weight), ContextCompat.getDrawable(context, R.drawable.ic_weight)); } - @Override - public void updateValue(ScaleMeasurement newMeasurement) { - setValueOnView(newMeasurement.getDateTime(), newMeasurement.getConvertedWeight(getScaleUser().getScaleUnit())); - } - - @Override - public void updateDiff(ScaleMeasurement newMeasurement, ScaleMeasurement lastMeasurement) { - setDiffOnView(newMeasurement.getConvertedWeight(getScaleUser().getScaleUnit()), lastMeasurement.getConvertedWeight(getScaleUser().getScaleUnit())); - } - - @Override - public String getUnit() { - return ScaleUser.UNIT_STRING[getScaleUser().getScaleUnit()]; - } - @Override public void updatePreferences(SharedPreferences preferences) { setVisible(preferences.getBoolean("weightEnable", true)); } @Override - public EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { - return evalSheet.evaluateWeight(value); + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getConvertedWeight(getScaleUser().getScaleUnit()); } @Override - public float getMaxValue() { + protected void setMeasurementValue(float value, ScaleMeasurement measurement) { + measurement.setConvertedWeight(value, getScaleUser().getScaleUnit()); + } + + @Override + protected String getUnit() { + return ScaleUser.UNIT_STRING[getScaleUser().getScaleUnit()]; + } + + @Override + protected float getMaxValue() { return 300; } + @Override + protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { + return evalSheet.evaluateWeight(value); + } }