From fb1a79c945a5640e3d700078279b219eafc86537 Mon Sep 17 00:00:00 2001 From: OliE Date: Sat, 8 Apr 2017 18:13:58 +0200 Subject: [PATCH] - refactored measurments views - replace table header text with icons - refactored data entry activity. It has three mode (VIEW, EDIT, ADD) - add license notes - add dynamically date, time and comment fields --- android_app/app/src/main/AndroidManifest.xml | 2 +- .../openscale/core/alarm/AlarmEntry.java | 15 + .../core/alarm/AlarmEntryReader.java | 15 + .../openscale/core/alarm/AlarmHandler.java | 15 + .../core/evaluation/EvaluationResult.java | 7 + .../core/evaluation/EvaluationSheet.java | 4 - .../gui/activities/DataEntryActivity.java | 286 ++++++++---------- .../gui/fragments/TableFragment.java | 70 ++--- .../gui/views/BMIMeasurementView.java | 25 +- .../gui/views/CommentMeasurementView.java | 84 +++++ .../gui/views/DateMeasurementView.java | 91 ++++++ .../gui/views/FatMeasurementView.java | 20 +- .../gui/views/HipMeasurementView.java | 22 +- .../openscale/gui/views/LinearGaugeView.java | 3 + .../openscale/gui/views/MeasurementView.java | 177 ++++++++--- .../gui/views/MuscleMeasurementView.java | 20 +- .../gui/views/TimeMeasurementView.java | 91 ++++++ .../gui/views/WHRMeasurementView.java | 25 +- .../gui/views/WHtRMeasurementView.java | 24 +- .../gui/views/WaistMeasurementView.java | 20 +- .../gui/views/WaterMeasurementView.java | 21 +- .../gui/views/WeightMeasurementView.java | 24 +- .../main/res/layout-large/fragment_table.xml | 119 ++++---- .../main/res/layout/activity_dataentry.xml | 240 +++++---------- .../src/main/res/layout/fragment_table.xml | 81 +++-- .../app/src/main/res/values/strings.xml | 1 + 26 files changed, 959 insertions(+), 543 deletions(-) create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/views/CommentMeasurementView.java create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/views/DateMeasurementView.java create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/views/TimeMeasurementView.java diff --git a/android_app/app/src/main/AndroidManifest.xml b/android_app/app/src/main/AndroidManifest.xml index d053ba54..c63c7166 100644 --- a/android_app/app/src/main/AndroidManifest.xml +++ b/android_app/app/src/main/AndroidManifest.xml @@ -25,7 +25,7 @@ - + diff --git a/android_app/app/src/main/java/com/health/openscale/core/alarm/AlarmEntry.java b/android_app/app/src/main/java/com/health/openscale/core/alarm/AlarmEntry.java index 7656936f..ad613648 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/alarm/AlarmEntry.java +++ b/android_app/app/src/main/java/com/health/openscale/core/alarm/AlarmEntry.java @@ -1,3 +1,18 @@ +/* Copyright (C) 2014 olie.xdev +* +* 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.core.alarm; import android.support.annotation.NonNull; diff --git a/android_app/app/src/main/java/com/health/openscale/core/alarm/AlarmEntryReader.java b/android_app/app/src/main/java/com/health/openscale/core/alarm/AlarmEntryReader.java index 8a0197c7..68ffaff5 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/alarm/AlarmEntryReader.java +++ b/android_app/app/src/main/java/com/health/openscale/core/alarm/AlarmEntryReader.java @@ -1,3 +1,18 @@ +/* Copyright (C) 2014 olie.xdev +* +* 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.core.alarm; import android.content.Context; diff --git a/android_app/app/src/main/java/com/health/openscale/core/alarm/AlarmHandler.java b/android_app/app/src/main/java/com/health/openscale/core/alarm/AlarmHandler.java index 94c78f30..53d61b87 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/alarm/AlarmHandler.java +++ b/android_app/app/src/main/java/com/health/openscale/core/alarm/AlarmHandler.java @@ -1,3 +1,18 @@ +/* Copyright (C) 2014 olie.xdev +* +* 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.core.alarm; import android.app.AlarmManager; diff --git a/android_app/app/src/main/java/com/health/openscale/core/evaluation/EvaluationResult.java b/android_app/app/src/main/java/com/health/openscale/core/evaluation/EvaluationResult.java index 1c85a020..17c93082 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/evaluation/EvaluationResult.java +++ b/android_app/app/src/main/java/com/health/openscale/core/evaluation/EvaluationResult.java @@ -24,6 +24,13 @@ public class EvaluationResult { public float highLimit; public EVAL_STATE eval_state; + public EvaluationResult() { + this.value = -1.0f; + this.lowLimit = -1.0f; + this.highLimit = -1.0f; + this.eval_state = EVAL_STATE.UNDEFINED; + } + public EvaluationResult(float value, float lowLimit, float highLimit, EVAL_STATE eval_state) { this.value = value; diff --git a/android_app/app/src/main/java/com/health/openscale/core/evaluation/EvaluationSheet.java b/android_app/app/src/main/java/com/health/openscale/core/evaluation/EvaluationSheet.java index 1f66ff1c..e452a88f 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/evaluation/EvaluationSheet.java +++ b/android_app/app/src/main/java/com/health/openscale/core/evaluation/EvaluationSheet.java @@ -269,10 +269,6 @@ public class EvaluationSheet { return evaluateSheet(whr, bodyEvaluateSheet); } - public EvaluationResult evaluateHip(float hip) { - return evaluateSheet(hip, new ArrayList()); - } - private EvaluationResult evaluateSheet(float value, List sheet) { for (int i=0; i < sheet.size(); i++) { sheetEntry curEntry = sheet.get(i); 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 f5781315..9ebbc7e9 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 @@ -17,8 +17,6 @@ package com.health.openscale.gui.activities; import android.app.Activity; import android.app.AlertDialog; -import android.app.DatePickerDialog; -import android.app.TimePickerDialog; import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; @@ -27,28 +25,29 @@ import android.preference.PreferenceManager; import android.view.View; import android.view.Window; import android.widget.Button; -import android.widget.DatePicker; -import android.widget.EditText; +import android.widget.CompoundButton; +import android.widget.ImageView; +import android.widget.Switch; import android.widget.TableLayout; import android.widget.TextView; -import android.widget.TimePicker; import android.widget.Toast; import com.health.openscale.R; import com.health.openscale.core.OpenScale; import com.health.openscale.core.datatypes.ScaleData; +import com.health.openscale.gui.views.CommentMeasurementView; +import com.health.openscale.gui.views.DateMeasurementView; import com.health.openscale.gui.views.FatMeasurementView; import com.health.openscale.gui.views.HipMeasurementView; import com.health.openscale.gui.views.MeasurementView; import com.health.openscale.gui.views.MuscleMeasurementView; +import com.health.openscale.gui.views.TimeMeasurementView; import com.health.openscale.gui.views.WaistMeasurementView; import com.health.openscale.gui.views.WaterMeasurementView; import com.health.openscale.gui.views.WeightMeasurementView; import java.text.DateFormat; -import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.ListIterator; @@ -66,21 +65,18 @@ public class DataEntryActivity extends Activity { private FatMeasurementView fatMeasurement; private WaistMeasurementView waistMeasurement; private HipMeasurementView hipMeasurement; - - private EditText txtDate; - private EditText txtTime; - private EditText txtComment; + private CommentMeasurementView commentMeasurement; + private DateMeasurementView dateMeasurement; + private TimeMeasurementView timeMeasurement; private TextView txtDataNr; private Button btnAdd; private Button btnOk; private Button btnCancel; - private Button btnDelete; private Button btnLeft; private Button btnRight; - - private SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy"); - private SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm"); + private ImageView imageViewDelete; + private Switch switchEditMode; private long id; @@ -104,6 +100,9 @@ public class DataEntryActivity extends Activity { fatMeasurement = new FatMeasurementView(context); waistMeasurement = new WaistMeasurementView(context); hipMeasurement = new HipMeasurementView(context); + commentMeasurement = new CommentMeasurementView(context); + dateMeasurement = new DateMeasurementView(context); + timeMeasurement = new TimeMeasurementView(context); dataEntryMeasurements = new ArrayList<>(); dataEntryMeasurements.add(weightMeasurement); @@ -112,35 +111,33 @@ public class DataEntryActivity extends Activity { dataEntryMeasurements.add(fatMeasurement); dataEntryMeasurements.add(waistMeasurement); dataEntryMeasurements.add(hipMeasurement); + dataEntryMeasurements.add(commentMeasurement); + dataEntryMeasurements.add(dateMeasurement); + dataEntryMeasurements.add(timeMeasurement); Collections.reverse(dataEntryMeasurements); for (MeasurementView measuremt : dataEntryMeasurements) { tableLayoutDataEntry.addView(measuremt, 0); - measuremt.setEditMode(true); } txtDataNr = (TextView) findViewById(R.id.txtDataNr); - txtDate = (EditText) findViewById(R.id.txtDate); - txtTime = (EditText) findViewById(R.id.txtTime); - txtComment = (EditText) findViewById(R.id.txtComment); btnAdd = (Button) findViewById(R.id.btnAdd); btnOk = (Button) findViewById(R.id.btnOk); btnCancel = (Button) findViewById(R.id.btnCancel); - btnDelete = (Button) findViewById(R.id.btnDelete); btnLeft = (Button) findViewById(R.id.btnLeft); btnRight = (Button) findViewById(R.id.btnRight); + imageViewDelete = (ImageView) findViewById(R.id.imgViewDelete); + switchEditMode = (Switch) findViewById(R.id.switchEditMode); btnAdd.setOnClickListener(new onClickListenerAdd()); btnOk.setOnClickListener(new onClickListenerOk()); btnCancel.setOnClickListener(new onClickListenerCancel()); - btnDelete.setOnClickListener(new onClickListenerDelete()); + imageViewDelete.setOnClickListener(new onClickListenerDelete()); btnLeft.setOnClickListener(new onClickListenerLeft()); btnRight.setOnClickListener(new onClickListenerRight()); - - txtDate.setOnFocusChangeListener(new onFocusChangeDate()); - txtTime.setOnFocusChangeListener(new onFocusChangeTime()); + switchEditMode.setOnCheckedChangeListener(new onCheckedChangeEditMode()); updateOnView(); } @@ -154,100 +151,110 @@ public class DataEntryActivity extends Activity { measuremt.updatePreferences(prefs); } - if (getIntent().getExtras().getInt("mode") == EDIT_DATA_REQUEST) { - editMode(); - } - else - { - addMode(); - } - } - - private void editMode() - { - btnOk.setVisibility(View.VISIBLE); - btnAdd.setVisibility(View.GONE); - btnDelete.setVisibility(View.VISIBLE); - btnLeft.setVisibility(View.VISIBLE); - btnRight.setVisibility(View.VISIBLE); - txtDataNr.setVisibility(View.VISIBLE); - id = getIntent().getExtras().getLong("id"); - OpenScale openScale = OpenScale.getInstance(context); + if (id > 0) { + if (switchEditMode.isChecked()) { + setViewMode(MeasurementView.MeasurementViewMode.EDIT); + } else { + setViewMode(MeasurementView.MeasurementViewMode.VIEW); + } + OpenScale openScale = OpenScale.getInstance(context); - ScaleData editScaleData = openScale.getScaleData(id); + ScaleData selectedScaleData = openScale.getScaleData(id); - txtDataNr.setText(DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.SHORT).format(editScaleData.date_time)); + txtDataNr.setText(DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.SHORT).format(selectedScaleData.date_time)); - for (MeasurementView measuremt : dataEntryMeasurements) { - measuremt.updateValue(editScaleData); + ArrayList scaleDataList = OpenScale.getInstance(context).getScaleDataList(); + ListIterator scaleDataIterator = scaleDataList.listIterator(); + + ScaleData lastData = new ScaleData(); + + while(scaleDataIterator.hasNext()) { + ScaleData scaleData = scaleDataIterator.next(); + + if (scaleData.id == id) { + if (scaleDataIterator.hasNext()) { + lastData = scaleDataIterator.next(); + } + } + } + + // show selected scale data + for (MeasurementView measuremt : dataEntryMeasurements) { + measuremt.updateValue(selectedScaleData); + measuremt.updateDiff(selectedScaleData, lastData); + } + + return; } - txtDate.setText(dateFormat.format(editScaleData.date_time)); - txtTime.setText(timeFormat.format(editScaleData.date_time)); - } - - private void addMode() - { - btnOk.setVisibility(View.GONE); - btnAdd.setVisibility(View.VISIBLE); - btnDelete.setVisibility(View.GONE); - btnLeft.setVisibility(View.GONE); - btnRight.setVisibility(View.GONE); - txtDataNr.setVisibility(View.GONE); if (!OpenScale.getInstance(this).getScaleDataList().isEmpty()) { + setViewMode(MeasurementView.MeasurementViewMode.ADD); ScaleData lastScaleData = OpenScale.getInstance(this).getScaleDataList().get(0); // show as default last scale data for (MeasurementView measuremt : dataEntryMeasurements) { + lastScaleData.date_time = new Date(); + lastScaleData.comment = ""; measuremt.updateValue(lastScaleData); } } else { + setViewMode(MeasurementView.MeasurementViewMode.ADD); // show default values for (MeasurementView measuremt : dataEntryMeasurements) { measuremt.updateValue(new ScaleData()); } } - - txtDate.setText(dateFormat.format(new Date())); - txtTime.setText(timeFormat.format(new Date())); } - private boolean validateAllInput() - { - boolean isValidate = true; + private void setViewMode(MeasurementView.MeasurementViewMode viewMode) + { + switch (viewMode) { + case VIEW: + case EDIT: + btnOk.setVisibility(View.VISIBLE); + btnAdd.setVisibility(View.GONE); + imageViewDelete.setVisibility(View.VISIBLE); + btnLeft.setVisibility(View.VISIBLE); + btnRight.setVisibility(View.VISIBLE); + txtDataNr.setVisibility(View.VISIBLE); + switchEditMode.setVisibility(View.VISIBLE); + dateMeasurement.setVisibility(View.VISIBLE); + timeMeasurement.setVisibility(View.VISIBLE); + break; + case ADD: + btnOk.setVisibility(View.GONE); + btnAdd.setVisibility(View.VISIBLE); + imageViewDelete.setVisibility(View.GONE); + btnLeft.setVisibility(View.GONE); + btnRight.setVisibility(View.GONE); + txtDataNr.setVisibility(View.GONE); + switchEditMode.setVisibility(View.GONE); + dateMeasurement.setVisibility(View.GONE); + timeMeasurement.setVisibility(View.GONE); + break; + } for (MeasurementView measuremt : dataEntryMeasurements) { - if (!measuremt.validateInput()) { - isValidate = false; - } + measuremt.setEditMode(viewMode); } - - return isValidate; - } + } private void saveScaleData() { - if (validateAllInput()) { - String comment = txtComment.getText().toString(); + OpenScale openScale = OpenScale.getInstance(context); - String date = txtDate.getText().toString(); - String time = txtTime.getText().toString(); - - OpenScale openScale = OpenScale.getInstance(context); - - openScale.updateScaleData(id, - date + " " + time, - weightMeasurement.getValue(), - fatMeasurement.getValue(), - waterMeasurement.getValue(), - muscleMeasurement.getValue(), - waistMeasurement.getValue(), - hipMeasurement.getValue(), - comment); - } + openScale.updateScaleData(id, + dateMeasurement.getValueAsString() + " " + timeMeasurement.getValueAsString(), + weightMeasurement.getValue(), + fatMeasurement.getValue(), + waterMeasurement.getValue(), + muscleMeasurement.getValue(), + waistMeasurement.getValue(), + hipMeasurement.getValue(), + commentMeasurement.getValueAsString()); } private boolean moveLeft() { @@ -302,57 +309,35 @@ public class DataEntryActivity extends Activity { return false; } - private DatePickerDialog.OnDateSetListener datePickerListener = new DatePickerDialog.OnDateSetListener() { - @Override - public void onDateSet(DatePicker view, int selectedYear, int selectedMonth, int selectedDay) { - // txtDate.setText(String.format("%02d.%02d.%04d", selectedDay, selectedMonth+1, selectedYear)); - } - }; - - private TimePickerDialog.OnTimeSetListener timePickerListener = new TimePickerDialog.OnTimeSetListener() { - @Override - public void onTimeSet(TimePicker view, int hourOfDay, int minute) { - // txtTime.setText(String.format("%02d:%02d", hourOfDay, minute)); - } - }; - private class onClickListenerAdd implements View.OnClickListener { @Override public void onClick(View v) { - if (validateAllInput()) - { - OpenScale openScale = OpenScale.getInstance(context); + OpenScale openScale = OpenScale.getInstance(context); - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - int selectedUserId = prefs.getInt("selectedUserId", -1); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + int selectedUserId = prefs.getInt("selectedUserId", -1); - if (selectedUserId == -1) { - AlertDialog.Builder infoDialog = new AlertDialog.Builder(context); + if (selectedUserId == -1) { + AlertDialog.Builder infoDialog = new AlertDialog.Builder(context); - infoDialog.setMessage(getResources().getString(R.string.info_no_selected_user)); + infoDialog.setMessage(getResources().getString(R.string.info_no_selected_user)); - infoDialog.setPositiveButton(getResources().getString(R.string.label_ok), null); + infoDialog.setPositiveButton(getResources().getString(R.string.label_ok), null); - infoDialog.show(); - } else { - String comment = txtComment.getText().toString(); + infoDialog.show(); + } else { + openScale.addScaleData(selectedUserId, + dateMeasurement.getValueAsString() + " " + timeMeasurement.getValueAsString(), + weightMeasurement.getValue(), + fatMeasurement.getValue(), + waterMeasurement.getValue(), + muscleMeasurement.getValue(), + waistMeasurement.getValue(), + hipMeasurement.getValue(), + commentMeasurement.getValueAsString()); - String date = txtDate.getText().toString(); - String time = txtTime.getText().toString(); - - openScale.addScaleData(selectedUserId, - date + " " + time, - weightMeasurement.getValue(), - fatMeasurement.getValue(), - waterMeasurement.getValue(), - muscleMeasurement.getValue(), - waistMeasurement.getValue(), - hipMeasurement.getValue(), - comment); - - finish(); - } + finish(); } } } @@ -360,10 +345,8 @@ public class DataEntryActivity extends Activity { private class onClickListenerOk implements View.OnClickListener { @Override public void onClick(View v) { - if (validateAllInput()) { - saveScaleData(); - finish(); - } + saveScaleData(); + finish(); } } @@ -431,38 +414,13 @@ public class DataEntryActivity extends Activity { } } - private class onFocusChangeDate implements View.OnFocusChangeListener { + private class onCheckedChangeEditMode implements CompoundButton.OnCheckedChangeListener { @Override - public void onFocusChange(View v, boolean hasFocus) { - if (hasFocus) { - Calendar cal = Calendar.getInstance(); - - if (getIntent().getExtras().getInt("mode") == EDIT_DATA_REQUEST) { - OpenScale openScale = OpenScale.getInstance(context); - ScaleData editScaleData = openScale.getScaleData(id); - cal.setTime(editScaleData.date_time); - } - - DatePickerDialog datePicker = new DatePickerDialog(context, datePickerListener, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)); - datePicker.show(); - } - } - } - - private class onFocusChangeTime implements View.OnFocusChangeListener { - @Override - public void onFocusChange(View v, boolean hasFocus) { - if (hasFocus) { - Calendar cal = Calendar.getInstance(); - - if (getIntent().getExtras().getInt("mode") == EDIT_DATA_REQUEST) { - OpenScale openScale = OpenScale.getInstance(context); - ScaleData editScaleData = openScale.getScaleData(id); - cal.setTime(editScaleData.date_time); - } - - TimePickerDialog timePicker = new TimePickerDialog(context, timePickerListener, cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), true); - timePicker.show(); + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked) { + setViewMode(MeasurementView.MeasurementViewMode.EDIT); + } else { + setViewMode(MeasurementView.MeasurementViewMode.VIEW); } } } 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 ea15e77b..69fc8f95 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 @@ -22,18 +22,17 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ActivityInfo; import android.content.res.Configuration; -import android.graphics.Color; import android.os.Bundle; import android.os.Environment; import android.preference.PreferenceManager; import android.support.v4.app.Fragment; +import android.support.v4.content.ContextCompat; import android.util.TypedValue; -import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Button; import android.widget.EditText; +import android.widget.ImageView; import android.widget.TableLayout; import android.widget.TableRow; import android.widget.TableRow.LayoutParams; @@ -72,31 +71,6 @@ public class TableFragment extends Fragment implements FragmentUpdateListener { tableView.findViewById(R.id.btnDeleteAll).setOnClickListener(new onClickListenerDeleteAll()); - if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) != Configuration.SCREENLAYOUT_SIZE_XLARGE && - (getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) != Configuration.SCREENLAYOUT_SIZE_LARGE) - { - TextView txtDateTableHeader = (TextView)tableView.findViewById(R.id.txtDateTableHeader); - txtDateTableHeader.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 11); - TextView txtTimeTableHeader = (TextView)tableView.findViewById(R.id.txtTimeTableHeader); - txtTimeTableHeader.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 11); - TextView txtWeightTableHeader = (TextView)tableView.findViewById(R.id.txtWeightTableHeader); - txtWeightTableHeader.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 11); - TextView txtFatTableHeader = (TextView)tableView.findViewById(R.id.txtFatTableHeader); - txtFatTableHeader.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 11); - TextView txtWaterTableHeader = (TextView)tableView.findViewById(R.id.txtWaterTableHeader); - txtWaterTableHeader.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 11); - TextView txtMuscleTableHeader = (TextView)tableView.findViewById(R.id.txtMuscleTableHeader); - txtMuscleTableHeader.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 11); - TextView txtWaistTableHeader = (TextView)tableView.findViewById(R.id.txtWaistTableHeader); - txtWaistTableHeader.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 11); - TextView txtHipTableHeader = (TextView)tableView.findViewById(R.id.txtHipTableHeader); - txtHipTableHeader.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 11); - TextView txtCommentTableHeader = (TextView)tableView.findViewById(R.id.txtCommentTableHeader); - txtCommentTableHeader.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 11); - Button btnDeleteAll = (Button)tableView.findViewById(R.id.btnDeleteAll); - btnDeleteAll.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 11); - } - OpenScale.getInstance(tableView.getContext()).registerFragment(this); return tableView; @@ -108,42 +82,42 @@ public class TableFragment extends Fragment implements FragmentUpdateListener { prefs = PreferenceManager.getDefaultSharedPreferences(tableView.getContext()); if(!prefs.getBoolean("fatEnable", true)) { - TextView txtFatTableHeader = (TextView)tableView.findViewById(R.id.txtFatTableHeader); + ImageView txtFatTableHeader = (ImageView)tableView.findViewById(R.id.txtFatTableHeader); txtFatTableHeader.setVisibility(View.GONE); } else { - TextView txtFatTableHeader = (TextView)tableView.findViewById(R.id.txtFatTableHeader); + ImageView txtFatTableHeader = (ImageView)tableView.findViewById(R.id.txtFatTableHeader); txtFatTableHeader.setVisibility(View.VISIBLE); } if(!prefs.getBoolean("muscleEnable", true)) { - TextView txtMuscleTableHeader = (TextView)tableView.findViewById(R.id.txtMuscleTableHeader); + ImageView txtMuscleTableHeader = (ImageView)tableView.findViewById(R.id.txtMuscleTableHeader); txtMuscleTableHeader.setVisibility(View.GONE); } else { - TextView txtMuscleTableHeader = (TextView)tableView.findViewById(R.id.txtMuscleTableHeader); + ImageView txtMuscleTableHeader = (ImageView)tableView.findViewById(R.id.txtMuscleTableHeader); txtMuscleTableHeader.setVisibility(View.VISIBLE); } if(!prefs.getBoolean("waterEnable", true)) { - TextView txtWaterTableHeader = (TextView)tableView.findViewById(R.id.txtWaterTableHeader); + ImageView txtWaterTableHeader = (ImageView)tableView.findViewById(R.id.txtWaterTableHeader); txtWaterTableHeader.setVisibility(View.GONE); } else { - TextView txtWaterTableHeader = (TextView)tableView.findViewById(R.id.txtWaterTableHeader); + ImageView txtWaterTableHeader = (ImageView)tableView.findViewById(R.id.txtWaterTableHeader); txtWaterTableHeader.setVisibility(View.VISIBLE); } if(!prefs.getBoolean("waistEnable", true)) { - TextView txtWaistTableHeader = (TextView)tableView.findViewById(R.id.txtWaistTableHeader); + ImageView txtWaistTableHeader = (ImageView)tableView.findViewById(R.id.txtWaistTableHeader); txtWaistTableHeader.setVisibility(View.GONE); } else { - TextView txtWaistTableHeader = (TextView)tableView.findViewById(R.id.txtWaistTableHeader); + ImageView txtWaistTableHeader = (ImageView)tableView.findViewById(R.id.txtWaistTableHeader); txtWaistTableHeader.setVisibility(View.VISIBLE); } if(!prefs.getBoolean("hipEnable", true)) { - TextView txtHipTableHeader = (TextView)tableView.findViewById(R.id.txtHipTableHeader); + ImageView txtHipTableHeader = (ImageView)tableView.findViewById(R.id.txtHipTableHeader); txtHipTableHeader.setVisibility(View.GONE); } else { - TextView txtHipTableHeader = (TextView)tableView.findViewById(R.id.txtHipTableHeader); + ImageView txtHipTableHeader = (ImageView)tableView.findViewById(R.id.txtHipTableHeader); txtHipTableHeader.setVisibility(View.VISIBLE); } @@ -247,17 +221,11 @@ public class TableFragment extends Fragment implements FragmentUpdateListener { commentView.setPadding(0, 5, 5, 5); dataRow.addView(commentView); - Button deleteButton = new Button(tableView.getContext()); - deleteButton.setText("X"); - deleteButton.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 10); - deleteButton.setTextColor(Color.WHITE); - deleteButton.setBackgroundResource(R.drawable.flat_selector); - deleteButton.setGravity(Gravity.CENTER); - deleteButton.setPadding(0, 0, 0, 0); - deleteButton.setMinimumHeight(35); - deleteButton.setHeight(35); - deleteButton.setOnClickListener(new onClickListenerDelete()); - dataRow.addView(deleteButton); + ImageView deleteImageView = new ImageView(tableView.getContext()); + dataRow.addView(deleteImageView); + deleteImageView.setImageDrawable(ContextCompat.getDrawable(tableView.getContext(), R.drawable.delete)); + deleteImageView.getLayoutParams().height = pxImageDp(20); + deleteImageView.setOnClickListener(new onClickListenerDelete()); dataRow.setOnClickListener(new onClickListenerRow()); @@ -279,6 +247,10 @@ public class TableFragment extends Fragment implements FragmentUpdateListener { } } + private int pxImageDp(float dp) { + return (int)(dp * getResources().getDisplayMetrics().density + 0.5f); + } + private class onClickListenerRow implements View.OnClickListener { @Override 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 9b6c4c28..ad524c44 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 @@ -1,3 +1,18 @@ +/* Copyright (C) 2014 olie.xdev +* +* 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; @@ -16,6 +31,11 @@ public class BMIMeasurementView extends MeasurementView { super(context, context.getResources().getString(R.string.label_bmi), ContextCompat.getDrawable(context, R.drawable.bmi)); } + @Override + public boolean isEditable() { + return false; + } + @Override public void updateValue(ScaleData updateData) { ScaleCalculator updateCalculator = new ScaleCalculator(updateData); @@ -49,11 +69,6 @@ public class BMIMeasurementView extends MeasurementView { return 50; } - @Override - int getInputType() { - return 0; - } - @Override public void updatePreferences(SharedPreferences preferences) { setVisible(preferences.getBoolean("weightEnable", true)); 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 new file mode 100644 index 00000000..78787051 --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/CommentMeasurementView.java @@ -0,0 +1,84 @@ +/* Copyright (C) 2014 olie.xdev +* +* 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.content.SharedPreferences; +import android.support.v4.content.ContextCompat; +import android.text.InputType; +import android.widget.EditText; + +import com.health.openscale.R; +import com.health.openscale.core.datatypes.ScaleData; +import com.health.openscale.core.evaluation.EvaluationResult; +import com.health.openscale.core.evaluation.EvaluationSheet; + +public class CommentMeasurementView extends MeasurementView { + + public CommentMeasurementView(Context context) { + super(context, context.getResources().getString(R.string.label_comment), ContextCompat.getDrawable(context, R.drawable.comment)); + } + + @Override + public boolean validateInput(EditText view) { + return true; + } + + protected int getInputType() { + 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(ScaleData updateData) { + setValueOnView(updateData.comment); + } + + @Override + public void updateDiff(ScaleData updateData, ScaleData lastData) { + + } + + @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 getMinValue() { + return 0; + } + + @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 new file mode 100644 index 00000000..68159f2a --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/DateMeasurementView.java @@ -0,0 +1,91 @@ +/* Copyright (C) 2014 olie.xdev +* +* 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.app.AlertDialog; +import android.app.DatePickerDialog; +import android.content.Context; +import android.content.SharedPreferences; +import android.support.v4.content.ContextCompat; +import android.widget.DatePicker; + +import com.health.openscale.R; +import com.health.openscale.core.datatypes.ScaleData; +import com.health.openscale.core.evaluation.EvaluationResult; +import com.health.openscale.core.evaluation.EvaluationSheet; + +import java.text.SimpleDateFormat; +import java.util.Calendar; + +public class DateMeasurementView extends MeasurementView { + private SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy"); + + public DateMeasurementView(Context context) { + super(context, context.getResources().getString(R.string.label_date), ContextCompat.getDrawable(context, R.drawable.lastmonth)); + } + + private DatePickerDialog.OnDateSetListener datePickerListener = new DatePickerDialog.OnDateSetListener() { + @Override + public void onDateSet(DatePicker view, int selectedYear, int selectedMonth, int selectedDay) { + setValueOnView(String.format("%02d.%02d.%04d", selectedDay, selectedMonth+1, selectedYear)); + } + }; + + @Override + protected AlertDialog getInputDialog() { + Calendar cal = Calendar.getInstance(); + + DatePickerDialog datePicker = new DatePickerDialog(getContext(), datePickerListener, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)); + + return datePicker; + } + + @Override + public void updateValue(ScaleData updateData) { + setValueOnView(dateFormat.format(updateData.date_time)); + } + + @Override + public void updateDiff(ScaleData updateData, ScaleData lastData) { + + } + + @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 getMinValue() { + return 0; + } + + @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 58208ce8..c1033c17 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 @@ -1,9 +1,23 @@ +/* Copyright (C) 2014 olie.xdev +* +* 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.content.SharedPreferences; import android.support.v4.content.ContextCompat; -import android.text.InputType; import com.health.openscale.R; import com.health.openscale.core.datatypes.ScaleData; @@ -51,8 +65,4 @@ public class FatMeasurementView extends MeasurementView { return 40; } - @Override - int getInputType() { - return InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED; - } } 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 5ebfade4..ddabd96c 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 @@ -1,9 +1,23 @@ +/* Copyright (C) 2014 olie.xdev +* +* 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.content.SharedPreferences; import android.support.v4.content.ContextCompat; -import android.text.InputType; import com.health.openscale.R; import com.health.openscale.core.datatypes.ScaleData; @@ -38,7 +52,7 @@ public class HipMeasurementView extends MeasurementView { @Override public EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { - return evalSheet.evaluateHip(value); + return null; } @Override @@ -51,8 +65,4 @@ public class HipMeasurementView extends MeasurementView { return 200; } - @Override - int getInputType() { - return InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED; - } } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/LinearGaugeView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/LinearGaugeView.java index e56f6d5c..21587b82 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/LinearGaugeView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/LinearGaugeView.java @@ -96,6 +96,9 @@ public class LinearGaugeView extends View { infoTextPaint.setColor(Color.GRAY); infoTextPaint.setTextSize(30); infoTextPaint.setTextAlign(Paint.Align.CENTER); + + firstLimit = -1.0f; + secondLimit = -1.0f; } @Override 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 d2880b99..ea6bb081 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 @@ -1,12 +1,32 @@ +/* Copyright (C) 2014 olie.xdev +* +* 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.app.AlertDialog; import android.content.Context; +import android.content.DialogInterface; 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.text.InputType; import android.util.TypedValue; import android.view.View; +import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.Space; @@ -15,15 +35,19 @@ import android.widget.TableRow; import android.widget.TextView; import com.health.openscale.R; -import com.health.openscale.core.evaluation.EvaluationResult; -import com.health.openscale.core.evaluation.EvaluationSheet; import com.health.openscale.core.OpenScale; import com.health.openscale.core.datatypes.ScaleData; import com.health.openscale.core.datatypes.ScaleUser; +import com.health.openscale.core.evaluation.EvaluationResult; +import com.health.openscale.core.evaluation.EvaluationSheet; import lecho.lib.hellocharts.util.ChartUtils; +import static com.health.openscale.gui.views.MeasurementView.MeasurementViewMode.ADD; +import static com.health.openscale.gui.views.MeasurementView.MeasurementViewMode.EDIT; + public abstract class MeasurementView extends TableLayout { + public enum MeasurementViewMode {VIEW, EDIT, ADD}; private static String SYMBOL_UP = "↗"; private static String SYMBOL_DOWN = "↘"; @@ -31,6 +55,7 @@ public abstract class MeasurementView extends TableLayout { private ImageView iconView; private TextView nameView; private TextView valueView; + private ImageView editModeView; private ImageView indicatorView; private TableRow evaluatorRow; @@ -38,14 +63,17 @@ public abstract class MeasurementView extends TableLayout { private String nameText; - private boolean editMode; + private String value; + + private MeasurementViewMode measurementMode; public MeasurementView(Context context, String text, Drawable icon) { super(context); initView(context); - editMode = false; + measurementMode = MeasurementViewMode.VIEW; nameText = text; + value = new String(); nameView.setText(text); iconView.setImageDrawable(icon); } @@ -56,16 +84,17 @@ public abstract class MeasurementView extends TableLayout { iconView = new ImageView(context); nameView = new TextView(context); valueView = new TextView(context); + editModeView = new ImageView(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(editModeView); measurementRow.addView(indicatorView); addView(measurementRow); @@ -83,6 +112,11 @@ public abstract class MeasurementView extends TableLayout { valueView.setTextColor(Color.BLACK); valueView.setLayoutParams(new TableRow.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT, 0.01f)); + editModeView.getLayoutParams().height = pxImageDp(20); + editModeView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); + editModeView.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.edit)); + editModeView.setVisibility(View.GONE); + indicatorView.setLayoutParams(new TableRow.LayoutParams(0, LayoutParams.MATCH_PARENT, 0.01f)); indicatorView.setBackgroundColor(Color.GRAY); @@ -107,38 +141,55 @@ public abstract class MeasurementView extends TableLayout { public abstract float getMinValue(); public abstract float getMaxValue(); - abstract int getInputType(); - public float getValue() { - if (valueView.getText().length() == 0) { + if (value.length() == 0) { return -1; } - return Float.valueOf(valueView.getText().toString()); + return Float.valueOf(value); } - public void setEditMode(boolean mode) { - editMode = mode; + public String getValueAsString() { + return value; + } - if (editMode) { - valueView = new EditText(getContext()); - valueView.setInputType(getInputType()); - valueView.setHint(getContext().getResources().getString(R.string.info_enter_value_unit) + " " + getUnit()); - measurementRow.addView(valueView); - indicatorView.setVisibility(View.GONE); + protected boolean isEditable() { + return true; + } + + public void setEditMode(MeasurementViewMode mode) { + measurementMode = mode; + + switch (mode) { + case VIEW: + indicatorView.setVisibility(View.VISIBLE); + editModeView.setVisibility(View.GONE); + break; + case EDIT: + case ADD: + if (isEditable()) { + editModeView.setVisibility(View.VISIBLE); + } + indicatorView.setVisibility(View.GONE); + evaluatorRow.setVisibility(View.GONE); + break; } } - protected boolean isEditModeOn() { - return editMode; + protected MeasurementViewMode getMeasurementMode() { + return measurementMode; } - protected void setValueOnView(float value) { - if (isEditModeOn()) { - valueView.setText(String.valueOf(value)); - } else { - valueView.setText(String.format("%.2f ", value) + getUnit()); - evaluate(value); + protected void setValueOnView(Object objValue) { + value = String.valueOf(objValue); + + try{ + Float floatValue = Float.parseFloat(value); + evaluate(floatValue); + valueView.setText(String.format("%.2f ", floatValue) + getUnit()); + } catch (NumberFormatException e) { + + valueView.setText(value); } } @@ -177,19 +228,17 @@ public abstract class MeasurementView extends TableLayout { return (int)(dp * getResources().getDisplayMetrics().density + 0.5f); } - public boolean validateInput() { - if (measurementRow.getVisibility() == View.VISIBLE) { - if (valueView.getText().toString().length() == 0) { - valueView.setError(getResources().getString(R.string.error_value_required)); - return false; - } + protected boolean validateInput(EditText view) { + if (view.getText().toString().length() == 0) { + view.setError(getResources().getString(R.string.error_value_required)); + return false; + } - float value = Float.valueOf(valueView.getText().toString()); + float floatValue = Float.valueOf(view.getText().toString()); - if (!(value >= 0 && value <= getMaxValue())) { - valueView.setError(getResources().getString(R.string.error_value_range)); - return false; - } + if (!(floatValue >= 0 && floatValue <= getMaxValue())) { + view.setError(getResources().getString(R.string.error_value_range)); + return false; } return true; @@ -199,6 +248,10 @@ public abstract class MeasurementView extends TableLayout { EvaluationSheet evalSheet = new EvaluationSheet(getScaleUser()); EvaluationResult evalResult = evaluateSheet(evalSheet, value); + if (evalResult == null) { + evalResult = new EvaluationResult(); + } + evaluatorView.setMinMaxValue(getMinValue(), getMaxValue()); evaluatorView.setLimits(evalResult.lowLimit, evalResult.highLimit); evaluatorView.setValue(value); @@ -226,10 +279,60 @@ public abstract class MeasurementView extends TableLayout { return openScale.getSelectedScaleUser(); } + protected int getInputType() { + return InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED; + } + + protected String getHintText() { + return getResources().getString(R.string.info_enter_value_unit) + " " + getUnit(); + } + + protected AlertDialog getInputDialog() { + final AlertDialog floatDialog; + AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); + builder.setTitle(nameView.getText()); + builder.setIcon(iconView.getDrawable()); + + final EditText input = new EditText(getContext()); + + input.setInputType(getInputType()); + input.setHint(getHintText()); + builder.setView(input); + + builder.setPositiveButton(getResources().getString(R.string.label_ok), null); + builder.setNegativeButton(getResources().getString(R.string.label_cancel), null); + + floatDialog = builder.create(); + + floatDialog.setOnShowListener(new DialogInterface.OnShowListener() { + + @Override + public void onShow(DialogInterface dialog) { + + Button b = floatDialog.getButton(AlertDialog.BUTTON_POSITIVE); + b.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View view) { + if (validateInput(input)) { + setValueOnView(input.getText().toString()); + floatDialog.dismiss(); + } + } + }); + } + }); + + return floatDialog; + } + private class onClickListenerEvaluation implements View.OnClickListener { @Override public void onClick(View v) { - if (isEditModeOn()) { + if (getMeasurementMode() == EDIT || getMeasurementMode() == ADD) { + if (isEditable()) { + getInputDialog().show(); + } return; } 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 7defcd48..89b54cb5 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 @@ -1,9 +1,23 @@ +/* Copyright (C) 2014 olie.xdev +* +* 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.content.SharedPreferences; import android.support.v4.content.ContextCompat; -import android.text.InputType; import com.health.openscale.R; import com.health.openscale.core.datatypes.ScaleData; @@ -51,8 +65,4 @@ public class MuscleMeasurementView extends MeasurementView { return 80; } - @Override - int getInputType() { - return InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED; - } } 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 new file mode 100644 index 00000000..bc68d2c0 --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/TimeMeasurementView.java @@ -0,0 +1,91 @@ +/* Copyright (C) 2014 olie.xdev +* +* 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.app.AlertDialog; +import android.app.TimePickerDialog; +import android.content.Context; +import android.content.SharedPreferences; +import android.support.v4.content.ContextCompat; +import android.widget.TimePicker; + +import com.health.openscale.R; +import com.health.openscale.core.datatypes.ScaleData; +import com.health.openscale.core.evaluation.EvaluationResult; +import com.health.openscale.core.evaluation.EvaluationSheet; + +import java.text.SimpleDateFormat; +import java.util.Calendar; + +public class TimeMeasurementView extends MeasurementView { + private SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm"); + + public TimeMeasurementView(Context context) { + super(context, context.getResources().getString(R.string.label_time), ContextCompat.getDrawable(context, R.drawable.daysleft)); + } + + private TimePickerDialog.OnTimeSetListener timePickerListener = new TimePickerDialog.OnTimeSetListener() { + @Override + public void onTimeSet(TimePicker view, int hourOfDay, int minute) { + setValueOnView(String.format("%02d:%02d", hourOfDay, minute)); + } + }; + + @Override + protected AlertDialog getInputDialog() { + Calendar cal = Calendar.getInstance(); + + TimePickerDialog timePicker = new TimePickerDialog(getContext(), timePickerListener, cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), true); + + return timePicker; + } + + @Override + public void updateValue(ScaleData updateData) { + setValueOnView(timeFormat.format(updateData.date_time)); + } + + @Override + public void updateDiff(ScaleData updateData, ScaleData lastData) { + + } + + @Override + public void updatePreferences(SharedPreferences preferences) { + + } + + @Override + public String getUnit() { + return ""; + } + + @Override + public EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { + return null; + } + + @Override + public float getMinValue() { + return 0; + } + + @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 dd8911f2..00b6ce78 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 @@ -1,3 +1,18 @@ +/* Copyright (C) 2014 olie.xdev +* +* 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; @@ -16,6 +31,11 @@ public class WHRMeasurementView extends MeasurementView { super(context, context.getResources().getString(R.string.label_whr), ContextCompat.getDrawable(context, R.drawable.whr)); } + @Override + public boolean isEditable() { + return false; + } + @Override public void updateValue(ScaleData updateData) { ScaleCalculator updateCalculator = new ScaleCalculator(updateData); @@ -54,9 +74,4 @@ public class WHRMeasurementView extends MeasurementView { return 1.5f; } - @Override - int getInputType() { - return 0; - } - } 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 5cdb8941..d56c493f 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 @@ -1,3 +1,18 @@ +/* Copyright (C) 2014 olie.xdev +* +* 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; @@ -16,6 +31,11 @@ public class WHtRMeasurementView extends MeasurementView { super(context, context.getResources().getString(R.string.label_whtr), ContextCompat.getDrawable(context, R.drawable.whtr)); } + @Override + public boolean isEditable() { + return false; + } + @Override public void updateValue(ScaleData updateData) { ScaleCalculator updateCalculator = new ScaleCalculator(updateData); @@ -54,8 +74,4 @@ public class WHtRMeasurementView extends MeasurementView { return 1; } - @Override - int getInputType() { - return 0; - } } 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 0f9043dd..ab2a0507 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 @@ -1,9 +1,23 @@ +/* Copyright (C) 2014 olie.xdev +* +* 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.content.SharedPreferences; import android.support.v4.content.ContextCompat; -import android.text.InputType; import com.health.openscale.R; import com.health.openscale.core.datatypes.ScaleData; @@ -51,8 +65,4 @@ public class WaistMeasurementView extends MeasurementView { return 200; } - @Override - int getInputType() { - return InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED; - } } 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 1fbf801e..738fb383 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 @@ -1,9 +1,23 @@ +/* Copyright (C) 2014 olie.xdev +* +* 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.content.SharedPreferences; import android.support.v4.content.ContextCompat; -import android.text.InputType; import com.health.openscale.R; import com.health.openscale.core.datatypes.ScaleData; @@ -50,9 +64,4 @@ public class WaterMeasurementView extends MeasurementView { public float getMaxValue() { return 80; } - - @Override - int getInputType() { - return InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED; - } } 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 5461a81f..5aad9a01 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 @@ -1,9 +1,23 @@ +/* Copyright (C) 2014 olie.xdev +* +* 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.content.SharedPreferences; import android.support.v4.content.ContextCompat; -import android.text.InputType; import com.health.openscale.R; import com.health.openscale.core.datatypes.ScaleData; @@ -20,6 +34,10 @@ public class WeightMeasurementView extends MeasurementView { @Override public void updateValue(ScaleData updateData) { setValueOnView(updateData.weight); + + if (getMeasurementMode() == MeasurementViewMode.ADD) { + getInputDialog().show(); + } } @Override @@ -52,8 +70,4 @@ public class WeightMeasurementView extends MeasurementView { return 300; } - @Override - int getInputType() { - return InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED; - } } diff --git a/android_app/app/src/main/res/layout-large/fragment_table.xml b/android_app/app/src/main/res/layout-large/fragment_table.xml index a0814733..c599e36c 100644 --- a/android_app/app/src/main/res/layout-large/fragment_table.xml +++ b/android_app/app/src/main/res/layout-large/fragment_table.xml @@ -2,8 +2,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" - android:padding="10dp" - tools:context="com.health.openscale.MainActivity$PlaceholderFragment"> + android:padding="10dp"> - + android:textStyle="bold" /> - + android:textStyle="bold" /> - + android:textStyle="bold" /> - + android:textStyle="bold" /> - + android:textStyle="bold" /> - + android:textStyle="bold" /> - + android:textStyle="bold" /> - + android:textStyle="bold" /> - + android:textStyle="bold" />