From 71ff2a7bada91bfc3ddaa0f3e84d641282b16769 Mon Sep 17 00:00:00 2001 From: OliE Date: Fri, 14 Aug 2015 18:33:30 +0200 Subject: [PATCH] - evaluates all body values - calculates the waist-to-height ratio - calculates the waist-hip ratio - fix some bugs --- .../openscale/core/EvaluationResult.java | 35 ++ .../openscale/core/EvaluationSheet.java | 313 ++++++++++++ .../openscale/core/LinearGaugeView.java | 220 ++++++++ .../com/health/openscale/core/OpenScale.java | 29 +- .../health/openscale/core/ScaleDatabase.java | 43 +- .../com/health/openscale/core/ScaleUser.java | 22 +- .../openscale/core/ScaleUserDatabase.java | 10 +- .../health/openscale/gui/GraphFragment.java | 4 +- .../health/openscale/gui/MainActivity.java | 5 - .../openscale/gui/OverviewFragment.java | 482 ++++++++++++------ .../openscale/gui/SettingsActivity.java | 2 + .../health/openscale/gui/TableFragment.java | 36 +- .../openscale/gui/UserSettingsActivity.java | 13 +- android_app/app/src/main/res/drawable/whr.png | Bin 0 -> 684 bytes .../app/src/main/res/drawable/whtr.png | Bin 0 -> 1919 bytes .../src/main/res/layout/fragment_overview.xml | 378 +++++++++++++- .../app/src/main/res/values-de/strings.xml | 5 +- .../app/src/main/res/values-ja/strings.xml | 3 + .../res/values/attrs_linear_gauge_view.xml | 4 + .../app/src/main/res/values/strings.xml | 3 + 20 files changed, 1394 insertions(+), 213 deletions(-) create mode 100644 android_app/app/src/main/java/com/health/openscale/core/EvaluationResult.java create mode 100644 android_app/app/src/main/java/com/health/openscale/core/EvaluationSheet.java create mode 100644 android_app/app/src/main/java/com/health/openscale/core/LinearGaugeView.java create mode 100644 android_app/app/src/main/res/drawable/whr.png create mode 100644 android_app/app/src/main/res/drawable/whtr.png create mode 100644 android_app/app/src/main/res/values/attrs_linear_gauge_view.xml diff --git a/android_app/app/src/main/java/com/health/openscale/core/EvaluationResult.java b/android_app/app/src/main/java/com/health/openscale/core/EvaluationResult.java new file mode 100644 index 000000000..f42aa041b --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/core/EvaluationResult.java @@ -0,0 +1,35 @@ +/* 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; + +public class EvaluationResult { + public static enum EVAL_STATE {LOW, NORMAL, HIGH, UNDEFINED}; + + public float value; + public float lowLimit; + public float highLimit; + public EVAL_STATE eval_state; + + public EvaluationResult(float value, float lowLimit, float highLimit, EVAL_STATE eval_state) + { + this.value = value; + this.lowLimit = lowLimit; + this.highLimit = highLimit; + this.eval_state = eval_state; + } + +} diff --git a/android_app/app/src/main/java/com/health/openscale/core/EvaluationSheet.java b/android_app/app/src/main/java/com/health/openscale/core/EvaluationSheet.java new file mode 100644 index 000000000..1adb5fd5f --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/core/EvaluationSheet.java @@ -0,0 +1,313 @@ +/* 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; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +public class EvaluationSheet { + + private ScaleUser evalUser; + private int userAge; + + private List fatEvaluateSheet_Man; + private List fatEvaluateSheet_Woman; + + private List waterEvaluateSheet_Man; + private List waterEvaluateSheet_Woman; + + private List muscleEvaluateSheet_Man; + private List muscleEvaluateSheet_Woman; + + private List bmiEvaluateSheet_Man; + private List bmiEvaluateSheet_Woman; + + private List waistEvaluateSheet_Man; + private List waistEvaluateSheet_Woman; + + private List whrtEvaluateSheet; + + private List whrEvaluateSheet_Man; + private List whrEvaluateSheet_Woman; + + private class sheetEntry { + public sheetEntry(int lowAge, int maxAge, float lowLimit, float highLimit) + { + this.lowAge = lowAge; + this.maxAge = maxAge; + this.lowLimit = lowLimit; + this.highLimit = highLimit; + } + + public int lowAge; + public int maxAge; + public float lowLimit; + public float highLimit; + } + + + public EvaluationSheet(ScaleUser user) { + evalUser = user; + userAge = getAge(evalUser.birthday); + + fatEvaluateSheet_Man = new ArrayList<>(); + fatEvaluateSheet_Woman = new ArrayList<>(); + + waterEvaluateSheet_Man = new ArrayList<>(); + waterEvaluateSheet_Woman = new ArrayList<>(); + + muscleEvaluateSheet_Man = new ArrayList<>(); + muscleEvaluateSheet_Woman = new ArrayList<>(); + + bmiEvaluateSheet_Man = new ArrayList<>(); + bmiEvaluateSheet_Woman = new ArrayList<>(); + + waistEvaluateSheet_Man = new ArrayList<>(); + waistEvaluateSheet_Woman = new ArrayList<>(); + + whrtEvaluateSheet = new ArrayList<>(); + + whrEvaluateSheet_Man = new ArrayList<>(); + whrEvaluateSheet_Woman = new ArrayList<>(); + + initEvaluationSheets(); + } + + private void initEvaluationSheets() + { + fatEvaluateSheet_Man.add(new sheetEntry(10, 14, 11, 16)); + fatEvaluateSheet_Man.add(new sheetEntry(15, 19, 12, 17)); + fatEvaluateSheet_Man.add(new sheetEntry(20, 29, 13, 18)); + fatEvaluateSheet_Man.add(new sheetEntry(30, 39, 14, 19)); + fatEvaluateSheet_Man.add(new sheetEntry(40, 49, 15, 20)); + fatEvaluateSheet_Man.add(new sheetEntry(50, 59, 16, 21)); + fatEvaluateSheet_Man.add(new sheetEntry(60, 69, 17, 22)); + fatEvaluateSheet_Man.add(new sheetEntry(70, 1000, 18, 23)); + + + fatEvaluateSheet_Woman.add(new sheetEntry(10, 14, 16, 21)); + fatEvaluateSheet_Woman.add(new sheetEntry(15, 19, 17, 22)); + fatEvaluateSheet_Woman.add(new sheetEntry(20, 29, 18, 23)); + fatEvaluateSheet_Woman.add(new sheetEntry(30, 39, 19, 24)); + fatEvaluateSheet_Woman.add(new sheetEntry(40, 49, 20, 25)); + fatEvaluateSheet_Woman.add(new sheetEntry(50, 59, 21, 26)); + fatEvaluateSheet_Woman.add(new sheetEntry(60, 69, 22, 27)); + fatEvaluateSheet_Woman.add(new sheetEntry(70, 1000, 23, 28)); + + waterEvaluateSheet_Man.add(new sheetEntry(10, 1000, 50, 65)); + + waterEvaluateSheet_Woman.add(new sheetEntry(10, 1000, 45, 60)); + + muscleEvaluateSheet_Man.add(new sheetEntry(10, 14, 44, 57)); + muscleEvaluateSheet_Man.add(new sheetEntry(15, 19, 43, 56)); + muscleEvaluateSheet_Man.add(new sheetEntry(20, 29, 42, 54)); + muscleEvaluateSheet_Man.add(new sheetEntry(30, 39, 41, 52)); + muscleEvaluateSheet_Man.add(new sheetEntry(40, 49, 40, 50)); + muscleEvaluateSheet_Man.add(new sheetEntry(50, 59, 39, 48)); + muscleEvaluateSheet_Man.add(new sheetEntry(60, 69, 38, 47)); + muscleEvaluateSheet_Man.add(new sheetEntry(70, 1000, 37, 46)); + + + muscleEvaluateSheet_Woman.add(new sheetEntry(10, 14, 36, 43)); + muscleEvaluateSheet_Woman.add(new sheetEntry(15, 19, 35, 41)); + muscleEvaluateSheet_Woman.add(new sheetEntry(20, 29, 34, 39)); + muscleEvaluateSheet_Woman.add(new sheetEntry(30, 39, 33, 38)); + muscleEvaluateSheet_Woman.add(new sheetEntry(40, 49, 31, 36)); + muscleEvaluateSheet_Woman.add(new sheetEntry(50, 59, 29, 34)); + muscleEvaluateSheet_Woman.add(new sheetEntry(60, 69, 28, 33)); + muscleEvaluateSheet_Woman.add(new sheetEntry(70, 1000, 27, 32)); + + + bmiEvaluateSheet_Man.add(new sheetEntry(16, 24, 20, 25)); + bmiEvaluateSheet_Man.add(new sheetEntry(25, 34, 21, 26)); + bmiEvaluateSheet_Man.add(new sheetEntry(35, 44, 22, 27)); + bmiEvaluateSheet_Man.add(new sheetEntry(45, 54, 23, 28)); + bmiEvaluateSheet_Man.add(new sheetEntry(55, 64, 24, 29)); + bmiEvaluateSheet_Man.add(new sheetEntry(65, 90, 25, 30)); + + + bmiEvaluateSheet_Woman.add(new sheetEntry(16, 24, 19, 24)); + bmiEvaluateSheet_Woman.add(new sheetEntry(25, 34, 20, 25)); + bmiEvaluateSheet_Woman.add(new sheetEntry(35, 44, 21, 26)); + bmiEvaluateSheet_Woman.add(new sheetEntry(45, 54, 22, 27)); + bmiEvaluateSheet_Woman.add(new sheetEntry(55, 64, 23, 28)); + bmiEvaluateSheet_Woman.add(new sheetEntry(65, 90, 24, 29)); + + waistEvaluateSheet_Man.add(new sheetEntry(18, 90, -1, 94)); + waistEvaluateSheet_Woman.add(new sheetEntry(18, 90, -1, 80)); + + whrtEvaluateSheet.add(new sheetEntry(15, 40, 0.4f, 0.5f)); + whrtEvaluateSheet.add(new sheetEntry(41, 42, 0.4f, 0.51f)); + whrtEvaluateSheet.add(new sheetEntry(43, 44, 0.4f, 0.53f)); + whrtEvaluateSheet.add(new sheetEntry(45, 46, 0.4f, 0.55f)); + whrtEvaluateSheet.add(new sheetEntry(47, 48, 0.4f, 0.57f)); + whrtEvaluateSheet.add(new sheetEntry(49, 50, 0.4f, 0.59f)); + whrtEvaluateSheet.add(new sheetEntry(51, 90, 0.4f, 0.6f)); + + whrEvaluateSheet_Man.add(new sheetEntry(18, 90, 0.8f, 0.9f)); + whrEvaluateSheet_Woman.add(new sheetEntry(18, 90, 0.7f, 0.8f)); + } + + + public EvaluationResult evaluateWeight(float weight) { + float body_height_squared = (evalUser.body_height / 100.0f) * (evalUser.body_height / 100.0f); + float lowLimit = 0.0f; + float highLimit = 0.0f; + + if (evalUser.isMale()) { + lowLimit = body_height_squared * 20.0f; + highLimit = body_height_squared * 25.0f; + } else { + lowLimit = body_height_squared * 19.0f; + highLimit = body_height_squared * 24.0f; + } + + if (weight < lowLimit) { // low + return new EvaluationResult(weight, Math.round(lowLimit), Math.round(highLimit), EvaluationResult.EVAL_STATE.LOW); + } else if (weight >= lowLimit && weight <= highLimit) { // normal + return new EvaluationResult(weight, Math.round(lowLimit), Math.round(highLimit), EvaluationResult.EVAL_STATE.NORMAL); + } else if (weight > highLimit) { //high + return new EvaluationResult(weight, Math.round(lowLimit), Math.round(highLimit), EvaluationResult.EVAL_STATE.HIGH); + } + + return new EvaluationResult(0, -1, -1, EvaluationResult.EVAL_STATE.UNDEFINED); + } + + + public EvaluationResult evaluateBodyFat(float fat) { + List bodyEvaluateSheet; + + if (evalUser.isMale()) { + bodyEvaluateSheet = fatEvaluateSheet_Man; + } else { + bodyEvaluateSheet = fatEvaluateSheet_Woman; + } + + return evaluateSheet(fat, bodyEvaluateSheet); + } + + public EvaluationResult evaluateBodyWater(float water) { + List bodyEvaluateSheet; + + if (evalUser.isMale()) { + bodyEvaluateSheet = waterEvaluateSheet_Man; + } else { + bodyEvaluateSheet = waterEvaluateSheet_Woman; + } + + return evaluateSheet(water, bodyEvaluateSheet); + } + + public EvaluationResult evaluateBodyMuscle(float muscle) { + List bodyEvaluateSheet; + + if (evalUser.isMale()) { + bodyEvaluateSheet = muscleEvaluateSheet_Man; + } else { + bodyEvaluateSheet = muscleEvaluateSheet_Woman; + } + + return evaluateSheet(muscle, bodyEvaluateSheet); + } + + public EvaluationResult evaluateBMI(float bmi) { + List bodyEvaluateSheet; + + if (evalUser.isMale()) { + bodyEvaluateSheet = bmiEvaluateSheet_Man; + } else { + bodyEvaluateSheet = bmiEvaluateSheet_Woman; + } + + return evaluateSheet(bmi, bodyEvaluateSheet); + } + + public EvaluationResult evaluateWaist(float waist) { + List bodyEvaluateSheet; + + if (evalUser.isMale()) { + bodyEvaluateSheet = waistEvaluateSheet_Man; + } else { + bodyEvaluateSheet = waistEvaluateSheet_Woman; + } + + return evaluateSheet(waist, bodyEvaluateSheet); + } + + public EvaluationResult evaluateWHtR(float whrt) { + return evaluateSheet(whrt, whrtEvaluateSheet); + } + + public EvaluationResult evaluateWHR(float whr) { + List bodyEvaluateSheet; + + if (evalUser.isMale()) { + bodyEvaluateSheet = whrEvaluateSheet_Man; + } else { + bodyEvaluateSheet = whrEvaluateSheet_Woman; + } + + return evaluateSheet(whr, bodyEvaluateSheet); + } + + private EvaluationResult evaluateSheet(float value, List sheet) { + for (int i=0; i < sheet.size(); i++) { + sheetEntry curEntry = sheet.get(i); + + if (curEntry.lowAge <= userAge && curEntry.maxAge >= userAge) { + if (value < curEntry.lowLimit) { // low + return new EvaluationResult(value, curEntry.lowLimit, curEntry.highLimit, EvaluationResult.EVAL_STATE.LOW); + } else if (value >= curEntry.lowLimit && value <= curEntry.highLimit) { // normal + return new EvaluationResult(value, curEntry.lowLimit, curEntry.highLimit, EvaluationResult.EVAL_STATE.NORMAL); + } else if (value > curEntry.highLimit) { //high + return new EvaluationResult(value, curEntry.lowLimit, curEntry.highLimit, EvaluationResult.EVAL_STATE.HIGH); + } + } + } + + return new EvaluationResult(0, -1, -1, EvaluationResult.EVAL_STATE.UNDEFINED); + } + + private int getAge(Date dateOfBirth) { + + Calendar today = Calendar.getInstance(); + Calendar birthDate = Calendar.getInstance(); + + int age = 0; + + birthDate.setTime(dateOfBirth); + if (birthDate.after(today)) { + throw new IllegalArgumentException("Can't be born in the future"); + } + + age = today.get(Calendar.YEAR) - birthDate.get(Calendar.YEAR); + + // If birth date is greater than todays date (after 2 days adjustment of leap year) then decrement age one year + if ( (birthDate.get(Calendar.DAY_OF_YEAR) - today.get(Calendar.DAY_OF_YEAR) > 3) || + (birthDate.get(Calendar.MONTH) > today.get(Calendar.MONTH ))){ + age--; + + // If birth date and todays date are of same month and birth day of month is greater than todays day of month then decrement age + }else if ((birthDate.get(Calendar.MONTH) == today.get(Calendar.MONTH )) && + (birthDate.get(Calendar.DAY_OF_MONTH) > today.get(Calendar.DAY_OF_MONTH ))){ + age--; + } + + return age; + } +} diff --git a/android_app/app/src/main/java/com/health/openscale/core/LinearGaugeView.java b/android_app/app/src/main/java/com/health/openscale/core/LinearGaugeView.java new file mode 100644 index 000000000..84f626876 --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/core/LinearGaugeView.java @@ -0,0 +1,220 @@ +/* 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; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Path; +import android.util.AttributeSet; +import android.view.View; + +import com.health.openscale.R; + + +public class LinearGaugeView extends View { + + public static final int COLOR_BLUE = Color.parseColor("#33B5E5"); + public static final int COLOR_VIOLET = Color.parseColor("#AA66CC"); + public static final int COLOR_GREEN = Color.parseColor("#99CC00"); + public static final int COLOR_ORANGE = Color.parseColor("#FFBB33"); + public static final int COLOR_RED = Color.parseColor("#FF4444"); + + private final float barHeight = 10; + private final float limitLineHeight = 20; + private final float lineThickness = 5.0f; + private final float textOffset = 10.0f; + + private float firstPercent; + private float firstPos; + private float secondPercent; + private float secondPos; + private float valuePercent; + private float valuePos; + + private Paint rectPaintLow; + private Paint rectPaintNormal; + private Paint rectPaintHigh; + private Paint textPaint; + private Paint indicatorPaint; + private Paint infoTextPaint; + + private float value; + private int minValue; + private int maxValue; + private float firstLimit; + private float secondLimit; + + public LinearGaugeView(Context context) { + super(context); + init(); + } + + public LinearGaugeView(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + public LinearGaugeView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(); + } + + private void init() { + rectPaintLow = new Paint(Paint.ANTI_ALIAS_FLAG); + rectPaintLow.setColor(COLOR_BLUE); + + rectPaintNormal = new Paint(Paint.ANTI_ALIAS_FLAG); + rectPaintNormal.setColor(COLOR_GREEN); + + rectPaintHigh = new Paint(Paint.ANTI_ALIAS_FLAG); + rectPaintHigh.setColor(COLOR_RED); + + textPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + textPaint.setColor(Color.GRAY); + textPaint.setTextSize(20); + + indicatorPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + indicatorPaint.setColor(Color.BLACK); + indicatorPaint.setTextSize(20); + + infoTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + infoTextPaint.setColor(Color.GRAY); + infoTextPaint.setTextSize(30); + infoTextPaint.setTextAlign(Paint.Align.CENTER); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + if (firstLimit < 0 && secondLimit < 0) { + float textY=getHeight() / 2.0f; + float textX=getWidth() / 2.0f; + canvas.drawText(getResources().getString(R.string.info_no_evaluation_available),textX,textY,infoTextPaint); + return; + } + + firstPercent = (firstLimit / (float)maxValue) * 100.0f; + firstPos = (getWidth() / 100.0f) * firstPercent; + + secondPercent = (secondLimit / (float)maxValue) * 100.0f; + secondPos = (getWidth() / 100.0f) * secondPercent; + + valuePercent = (value / (float)maxValue) * 100.0f; + valuePos = (getWidth() / 100.0f) * valuePercent; + + // Bar + if (firstLimit > 0) { + canvas.drawRect(0, (getHeight() / 2.0f) - (barHeight / 2.0f), firstPos, (getHeight() / 2.0f) + (barHeight / 2.0f), rectPaintLow); + } else { + canvas.drawRect(0, (getHeight() / 2.0f) - (barHeight / 2.0f), firstPos, (getHeight() / 2.0f) + (barHeight / 2.0f), rectPaintNormal); + } + canvas.drawRect(firstPos, (getHeight() / 2.0f) - (barHeight / 2.0f), secondPos , (getHeight() / 2.0f) + (barHeight / 2.0f), rectPaintNormal); + canvas.drawRect(secondPos,(getHeight() / 2.0f) - (barHeight / 2.0f), getWidth() , (getHeight() / 2.0f) + (barHeight / 2.0f), rectPaintHigh); + + // Limit Lines + canvas.drawRect(0, (getHeight() / 2.0f) - (limitLineHeight / 2.0f), 0+lineThickness, (getHeight() / 2.0f) + (limitLineHeight / 2.0f), textPaint); + if (firstLimit > 0) { + canvas.drawRect(firstPos, (getHeight() / 2.0f) - (limitLineHeight / 2.0f), firstPos + lineThickness, (getHeight() / 2.0f) + (limitLineHeight / 2.0f), textPaint); + } + canvas.drawRect(secondPos, (getHeight() / 2.0f) - (limitLineHeight / 2.0f), secondPos+lineThickness, (getHeight() / 2.0f) + (limitLineHeight / 2.0f), textPaint); + canvas.drawRect(getWidth()-lineThickness, (getHeight() / 2.0f) - (limitLineHeight / 2.0f), getWidth(), (getHeight() / 2.0f) + (limitLineHeight / 2.0f), textPaint); + + // Text + canvas.drawText(Integer.toString(minValue), 0.0f, (getHeight() / 2.0f) - (barHeight / 2.0f) - textOffset, textPaint); + if (firstLimit > 0) { + canvas.drawText(Float.toString(firstLimit), firstPos - 5.0f, (getHeight() / 2.0f) - (barHeight / 2.0f) - textOffset, textPaint); + } + canvas.drawText(Float.toString(secondLimit), secondPos-5.0f, (getHeight() / 2.0f) - (barHeight / 2.0f) - textOffset, textPaint); + canvas.drawText(Float.toString(maxValue), getWidth()-40.0f, (getHeight() / 2.0f) - (barHeight / 2.0f)- textOffset, textPaint); + + // Indicator + Path path = new Path(); + path.setFillType(Path.FillType.EVEN_ODD); + path.moveTo(valuePos, (getHeight() / 2.0f) - 10.0f); + path.lineTo(valuePos + 10.0f, (getHeight() / 2.0f) + 20.0f); + path.lineTo(valuePos - 10.0f, (getHeight() / 2.0f) + 20.0f); + path.lineTo(valuePos, (getHeight() / 2.0f) - 10.0f); + path.close(); + + canvas.drawPath(path, indicatorPaint); + canvas.drawText(String.format("%.2f", value), valuePos-15.0f, (getHeight() / 2.0f) - (barHeight / 2.0f) - textOffset, indicatorPaint); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + + int desiredWidth = 100; + int desiredHeight = 100; + + int widthMode = MeasureSpec.getMode(widthMeasureSpec); + int widthSize = MeasureSpec.getSize(widthMeasureSpec); + int heightMode = MeasureSpec.getMode(heightMeasureSpec); + int heightSize = MeasureSpec.getSize(heightMeasureSpec); + + int width; + int height; + + //Measure Width + if (widthMode == MeasureSpec.EXACTLY) { + //Must be this size + width = widthSize; + } else if (widthMode == MeasureSpec.AT_MOST) { + //Can't be bigger than... + width = Math.min(desiredWidth, widthSize); + } else { + //Be whatever you want + width = desiredWidth; + } + + //Measure Height + if (heightMode == MeasureSpec.EXACTLY) { + //Must be this size + height = heightSize; + } else if (heightMode == MeasureSpec.AT_MOST) { + //Can't be bigger than... + height = Math.min(desiredHeight, heightSize); + } else { + //Be whatever you want + height = desiredHeight; + } + + //MUST CALL THIS + setMeasuredDimension(width, height); + } + + public void setMinMaxValue(int min, int max) { + minValue = min; + maxValue = max; + invalidate(); + requestLayout(); + } + + public void setLimits(float first, float second) { + firstLimit = first; + secondLimit = second; + invalidate(); + requestLayout(); + } + + public void setValue(float value) { + this.value = value; + invalidate(); + requestLayout(); + } +} \ No newline at end of file diff --git a/android_app/app/src/main/java/com/health/openscale/core/OpenScale.java b/android_app/app/src/main/java/com/health/openscale/core/OpenScale.java index b13116529..8811eda82 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/OpenScale.java +++ b/android_app/app/src/main/java/com/health/openscale/core/OpenScale.java @@ -23,6 +23,8 @@ import android.preference.PreferenceManager; import android.util.Log; +import com.health.openscale.gui.FragmentUpdateListener; + import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; @@ -49,11 +51,14 @@ public class OpenScale { private Context context; + private ArrayList fragmentList; + private OpenScale(Context con) { context = con; scaleDB = new ScaleDatabase(context); scaleUserDB = new ScaleUserDatabase(context); btCom = null; + fragmentList = new ArrayList<>(); updateScaleData(); } @@ -66,7 +71,7 @@ public static OpenScale getInstance(Context con) { return instance; } - public void addScaleUser(String name, String birthday, int body_height, int scale_unit, int gender, double goal_weight, String goal_date) + public void addScaleUser(String name, String birthday, int body_height, int scale_unit, int gender, float goal_weight, String goal_date) { ScaleUser scaleUser = new ScaleUser(); @@ -88,8 +93,6 @@ public void addScaleUser(String name, String birthday, int body_height, int scal public ArrayList getScaleUserList() { - updateScaleData(); - return scaleUserDB.getScaleUserList(); } @@ -117,7 +120,7 @@ public void deleteScaleUser(int id) scaleUserDB.deleteEntry(id); } - public void updateScaleUser(int id, String name, String birthday, int body_height, int scale_unit, int gender, double goal_weight, String goal_date) + public void updateScaleUser(int id, String name, String birthday, int body_height, int scale_unit, int gender, float goal_weight, String goal_date) { ScaleUser scaleUser = new ScaleUser(); @@ -312,11 +315,10 @@ public void startBluetoothServer(String deviceName) { } public void stopBluetoothServer() { - Log.d("OpenScale", "Bluetooth Server stopped!"); - if (btCom != null) { btCom.cancel(); - } + Log.d("OpenScale", "Bluetooth Server stopped!"); + } } private final Handler btHandler = new Handler() { @@ -411,11 +413,22 @@ public void parseBtString(String btString) { } } - private void updateScaleData() + public void registerFragment(FragmentUpdateListener fragment) { + fragmentList.add(fragment); + fragment.updateOnView(scaleDataList); + } + + public void updateScaleData() { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); int selectedUserId = prefs.getInt("selectedUserId", -1); scaleDataList = scaleDB.getScaleDataList(selectedUserId); + + for(FragmentUpdateListener fragment : fragmentList) { + if (fragment != null) { + fragment.updateOnView(scaleDataList); + } + } } } diff --git a/android_app/app/src/main/java/com/health/openscale/core/ScaleDatabase.java b/android_app/app/src/main/java/com/health/openscale/core/ScaleDatabase.java index c02ba89e6..fe6beea8c 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/ScaleDatabase.java +++ b/android_app/app/src/main/java/com/health/openscale/core/ScaleDatabase.java @@ -77,6 +77,9 @@ public class ScaleDatabase extends SQLiteOpenHelper { COLUMN_NAME_COMMENT }; + private final SQLiteDatabase dbWrite = getWritableDatabase(); + private final SQLiteDatabase dbRead = getReadableDatabase(); + private SimpleDateFormat formatDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.US); public ScaleDatabase(Context context) { @@ -101,9 +104,7 @@ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } public void clearScaleData(int userId) { - SQLiteDatabase db = getWritableDatabase(); - - db.delete(TABLE_NAME, COLUMN_NAME_USER_ID + "=" + Integer.toString(userId), null); + dbWrite.delete(TABLE_NAME, COLUMN_NAME_USER_ID + "=" + Integer.toString(userId), null); } public boolean insertEntry(ScaleData scaleData) { @@ -138,12 +139,12 @@ public boolean insertEntry(ScaleData scaleData) { } } + cursorScaleDB.close(); + return true; } public void updateEntry(long id, ScaleData scaleData) { - SQLiteDatabase db = getWritableDatabase(); - ContentValues values = new ContentValues(); values.put(COLUMN_NAME_DATE_TIME, formatDateTime.format(scaleData.date_time)); values.put(COLUMN_NAME_WEIGHT, scaleData.weight); @@ -154,14 +155,12 @@ public void updateEntry(long id, ScaleData scaleData) { values.put(COLUMN_NAME_HIP, scaleData.hip); values.put(COLUMN_NAME_COMMENT, scaleData.comment); - db.update(TABLE_NAME, values, COLUMN_NAME_ID + "=" + id, null); + dbWrite.update(TABLE_NAME, values, COLUMN_NAME_ID + "=" + id, null); } public ScaleData getDataEntry(long id) { - SQLiteDatabase db = getReadableDatabase();; - - Cursor cursorScaleDB = db.query( + Cursor cursorScaleDB = dbRead.query( TABLE_NAME, // The table to query projection, // The columns to return COLUMN_NAME_ID + "=?", // The columns for the WHERE clause @@ -173,20 +172,20 @@ public ScaleData getDataEntry(long id) cursorScaleDB.moveToFirst(); - return readAtCursor(cursorScaleDB); + ScaleData scaleData = readAtCursor(cursorScaleDB); + + cursorScaleDB.close(); + + return scaleData; } public void deleteEntry(long id) { - SQLiteDatabase db = getWritableDatabase(); - - db.delete(TABLE_NAME, COLUMN_NAME_ID + "= ?", new String[] {String.valueOf(id)}); + dbWrite.delete(TABLE_NAME, COLUMN_NAME_ID + "= ?", new String[] {String.valueOf(id)}); } public int[] getCountsOfAllMonth(int userId, int year) { int [] numOfMonth = new int[12]; - SQLiteDatabase db = getReadableDatabase(); - Calendar start_cal = Calendar.getInstance(); Calendar end_cal = Calendar.getInstance(); @@ -195,7 +194,7 @@ public int[] getCountsOfAllMonth(int userId, int year) { end_cal.set(year, i, 1, 0, 0, 0); end_cal.add(Calendar.MONTH, 1); - Cursor cursorScaleDB = db.query( + Cursor cursorScaleDB = dbRead.query( TABLE_NAME, // The table to query new String[]{"count(*)"}, // The columns to return COLUMN_NAME_DATE_TIME + " >= ? AND " + COLUMN_NAME_DATE_TIME + " < ? AND " + COLUMN_NAME_USER_ID + "=?", // The columns for the WHERE clause @@ -208,13 +207,14 @@ public int[] getCountsOfAllMonth(int userId, int year) { cursorScaleDB.moveToFirst(); numOfMonth[i] = cursorScaleDB.getInt(0); + + cursorScaleDB.close(); } return numOfMonth; } public ArrayList getScaleDataOfMonth(int userId, int year, int month) { - SQLiteDatabase db = getReadableDatabase(); ArrayList scaleDataList = new ArrayList(); String sortOrder = COLUMN_NAME_DATE_TIME + " DESC"; @@ -226,7 +226,7 @@ public ArrayList getScaleDataOfMonth(int userId, int year, int month) end_cal.set(year, month, 1, 0, 0, 0); end_cal.add(Calendar.MONTH, 1); - Cursor cursorScaleDB = db.query( + Cursor cursorScaleDB = dbRead.query( TABLE_NAME, // The table to query projection, // The columns to return COLUMN_NAME_DATE_TIME + " >= ? AND " + COLUMN_NAME_DATE_TIME + " < ? AND " + COLUMN_NAME_USER_ID + "=?", // The columns for the WHERE clause @@ -244,16 +244,17 @@ public ArrayList getScaleDataOfMonth(int userId, int year, int month) cursorScaleDB.moveToNext(); } + cursorScaleDB.close(); + return scaleDataList; } public ArrayList getScaleDataList(int userId) { - SQLiteDatabase db = getReadableDatabase(); ArrayList scaleDataList = new ArrayList(); String sortOrder = COLUMN_NAME_DATE_TIME + " DESC"; - Cursor cursorScaleDB = db.query( + Cursor cursorScaleDB = dbRead.query( TABLE_NAME, // The table to query projection, // The columns to return COLUMN_NAME_USER_ID + "=?", // The columns for the WHERE clause @@ -270,6 +271,8 @@ public ArrayList getScaleDataList(int userId) { cursorScaleDB.moveToNext(); } + + cursorScaleDB.close(); return scaleDataList; } diff --git a/android_app/app/src/main/java/com/health/openscale/core/ScaleUser.java b/android_app/app/src/main/java/com/health/openscale/core/ScaleUser.java index b480aea77..9c7545cca 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/ScaleUser.java +++ b/android_app/app/src/main/java/com/health/openscale/core/ScaleUser.java @@ -27,7 +27,7 @@ public class ScaleUser { public int body_height; public int scale_unit; public int gender; - public double goal_weight; + public float goal_weight; public Date goal_date; public ScaleUser() { @@ -35,8 +35,8 @@ public ScaleUser() { user_name = new String(); birthday = new Date(); body_height = -1; - scale_unit = -1; - gender = -1; + scale_unit = 0; + gender = 0; goal_weight = -1; goal_date = new Date(); } @@ -49,8 +49,20 @@ public boolean isMale() return false; } - public double getBMI(double weight) { - return weight / ((body_height / 100.0)*(body_height / 100.0)); + public float getBMI(float weight) { + return weight / ((body_height / 100.0f)*(body_height / 100.0f)); + } + + public float getWHtR(float waist) { + return waist / (float)body_height; + } + + public float getWHR(float waist, float hip) { + if (hip == 0) { + return 0; + } + + return waist / hip; } @Override diff --git a/android_app/app/src/main/java/com/health/openscale/core/ScaleUserDatabase.java b/android_app/app/src/main/java/com/health/openscale/core/ScaleUserDatabase.java index 62f965d73..a35c6c1aa 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/ScaleUserDatabase.java +++ b/android_app/app/src/main/java/com/health/openscale/core/ScaleUserDatabase.java @@ -158,7 +158,11 @@ public ScaleUser getScaleUser(int id) cursorScaleDB.moveToFirst(); - return readAtCursor(cursorScaleDB); + ScaleUser scaleUser = readAtCursor(cursorScaleDB); + + cursorScaleDB.close(); + + return scaleUser; } public ArrayList getScaleUserList() { @@ -184,6 +188,8 @@ public ArrayList getScaleUserList() { cursorScaleDB.moveToNext(); } + + cursorScaleDB.close(); return scaleUserDBEntries; } @@ -204,7 +210,7 @@ private ScaleUser readAtCursor (Cursor cur) { scaleUser.birthday = formatDateTime.parse(birthday); scaleUser.goal_date = formatDateTime.parse(goal_date); - scaleUser.goal_weight = Math.round(goal_weight * 100.0) / 100.0; + scaleUser.goal_weight = Math.round(goal_weight * 100.0f) / 100.0f; } catch (ParseException ex) { Log.e("ScaleDatabase", "Can't parse the date time string: " + ex.getMessage()); } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/GraphFragment.java b/android_app/app/src/main/java/com/health/openscale/gui/GraphFragment.java index b4fb94b86..4ee0b82e2 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/GraphFragment.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/GraphFragment.java @@ -104,10 +104,12 @@ public void onClick(View view) { updateOnView(null); } }); - openScale = OpenScale.getInstance(graphView.getContext()); prefs = PreferenceManager.getDefaultSharedPreferences(graphView.getContext()); + openScale = OpenScale.getInstance(graphView.getContext()); + openScale.registerFragment(this); + return graphView; } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/MainActivity.java b/android_app/app/src/main/java/com/health/openscale/gui/MainActivity.java index 18cb14f54..f346e6606 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/MainActivity.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/MainActivity.java @@ -89,11 +89,6 @@ protected void onCreate(Bundle savedInstanceState) { @Override public void onPageSelected(int position) { actionBar.setSelectedNavigationItem(position); - - FragmentUpdateListener fragment = (FragmentUpdateListener) mSectionsPagerAdapter.instantiateItem(mViewPager, position); - if (fragment != null) { - fragment.updateOnView(OpenScale.getInstance(mViewPager.getContext()).getScaleDataList()); - } } }); diff --git a/android_app/app/src/main/java/com/health/openscale/gui/OverviewFragment.java b/android_app/app/src/main/java/com/health/openscale/gui/OverviewFragment.java index 402207b56..c6538036a 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/OverviewFragment.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/OverviewFragment.java @@ -31,12 +31,17 @@ import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; +import android.widget.ImageView; import android.widget.Spinner; +import android.widget.TableLayout; import android.widget.TableRow; import android.widget.TextView; import android.widget.Toast; import com.health.openscale.R; +import com.health.openscale.core.EvaluationResult; +import com.health.openscale.core.EvaluationSheet; +import com.health.openscale.core.LinearGaugeView; import com.health.openscale.core.OpenScale; import com.health.openscale.core.ScaleData; import com.health.openscale.core.ScaleUser; @@ -45,6 +50,7 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.List; +import java.util.ListIterator; import java.util.concurrent.TimeUnit; import lecho.lib.hellocharts.formatter.SimpleLineChartValueFormatter; @@ -61,8 +67,8 @@ import lecho.lib.hellocharts.view.LineChartView; import lecho.lib.hellocharts.view.PieChartView; -public class OverviewFragment extends Fragment implements FragmentUpdateListener { - private View overviewView; +public class OverviewFragment extends Fragment implements FragmentUpdateListener { + private View overviewView; private TextView txtTitleUser; private TextView txtTitleLastMeasurement; @@ -75,7 +81,9 @@ public class OverviewFragment extends Fragment implements FragmentUpdateListener private TextView txtMuscleLast; private TextView txtFatLast; private TextView txtWaistLast; + private TextView txtWHtRLast; private TextView txtHipLast; + private TextView txtWHRLast; private TextView txtGoalWeight; private TextView txtGoalDiff; @@ -90,7 +98,9 @@ public class OverviewFragment extends Fragment implements FragmentUpdateListener private TextView txtLabelMuscle; private TextView txtLabelWater; private TextView txtLabelWaist; + private TextView txtLabelWHtR; private TextView txtLabelHip; + private TextView txtLabelWHR; private TextView txtLabelGoalWeight; private TextView txtLabelGoalDiff; @@ -99,27 +109,43 @@ public class OverviewFragment extends Fragment implements FragmentUpdateListener private TextView txtLabelAvgWeek; private TextView txtLabelAvgMonth; - private PieChartView pieChartLast; + private PieChartView pieChartLast; private LineChartView lineChartLast; private Spinner spinUser; - private enum lines {WEIGHT, FAT, WATER, MUSCLE, WAIST, HIP} - private ArrayList activeLines; + private LinearGaugeView linearGaugeWeight; + private LinearGaugeView linearGaugeBMI; + private LinearGaugeView linearGaugeFat; + private LinearGaugeView linearGaugeMuscle; + private LinearGaugeView linearGaugeWater; + private LinearGaugeView linearGaugeWaist; + private LinearGaugeView linearGaugeWHtR; + private LinearGaugeView linearGaugeHip; + private LinearGaugeView linearGaugeWHR; private SharedPreferences prefs; private ScaleData lastScaleData; + private ScaleData userSelectedData; private ScaleUser currentScaleUser; private List scaleDataLastDays; + private ArrayAdapter spinUserAdapter; + private Context context; @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) - { - overviewView = inflater.inflate(R.layout.fragment_overview, container, false); + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + // retain this fragment otherwise the app crashed in landscape mode for small devices (see "Handling Runtime Changes") + setRetainInstance(true); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + overviewView = inflater.inflate(R.layout.fragment_overview, container, false); context = overviewView.getContext(); @@ -134,7 +160,9 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa txtMuscleLast = (TextView) overviewView.findViewById(R.id.txtMuscleLast); txtFatLast = (TextView) overviewView.findViewById(R.id.txtFatLast); txtWaistLast = (TextView) overviewView.findViewById(R.id.txtWaistLast); + txtWHtRLast = (TextView) overviewView.findViewById(R.id.txtWHtRLast); txtHipLast = (TextView) overviewView.findViewById(R.id.txtHipLast); + txtWHRLast = (TextView) overviewView.findViewById(R.id.txtWHRLast); txtGoalWeight = (TextView) overviewView.findViewById(R.id.txtGoalWeight); txtGoalDiff = (TextView) overviewView.findViewById(R.id.txtGoalDiff); @@ -149,8 +177,9 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa txtLabelMuscle = (TextView) overviewView.findViewById(R.id.txtLabelMuscle); txtLabelWater = (TextView) overviewView.findViewById(R.id.txtLabelWater); txtLabelWaist = (TextView) overviewView.findViewById(R.id.txtLabelWaist); + txtLabelWHtR = (TextView) overviewView.findViewById(R.id.txtLabelWHtR); txtLabelHip = (TextView) overviewView.findViewById(R.id.txtLabelHip); - + txtLabelWHR = (TextView) overviewView.findViewById(R.id.txtLabelWHR); txtLabelGoalWeight = (TextView) overviewView.findViewById(R.id.txtLabelGoalWeight); txtLabelGoalDiff = (TextView) overviewView.findViewById(R.id.txtLabelGoalDiff); @@ -164,94 +193,232 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa spinUser = (Spinner) overviewView.findViewById(R.id.spinUser); + linearGaugeWeight = (LinearGaugeView) overviewView.findViewById(R.id.linearGaugeWeight); + linearGaugeBMI = (LinearGaugeView) overviewView.findViewById(R.id.linearGaugeBMI); + linearGaugeFat = (LinearGaugeView) overviewView.findViewById(R.id.linearGaugeFat); + linearGaugeMuscle = (LinearGaugeView) overviewView.findViewById(R.id.linearGaugeMuscle); + linearGaugeWater = (LinearGaugeView) overviewView.findViewById(R.id.linearGaugeWater); + linearGaugeWaist = (LinearGaugeView) overviewView.findViewById(R.id.linearGaugeWaist); + linearGaugeWHtR = (LinearGaugeView) overviewView.findViewById(R.id.linearGaugeWHtR); + linearGaugeHip = (LinearGaugeView) overviewView.findViewById(R.id.linearGaugeHip); + linearGaugeWHR = (LinearGaugeView) overviewView.findViewById(R.id.linearGaugeWHR); + lineChartLast.setOnValueTouchListener(new LineChartTouchListener()); pieChartLast.setOnValueTouchListener(new PieChartLastTouchListener()); pieChartLast.setChartRotationEnabled(false); - overviewView.findViewById(R.id.btnInsertData).setOnClickListener(new View.OnClickListener() { + overviewView.findViewById(R.id.btnInsertData).setOnClickListener(new View.OnClickListener() { public void onClick(View view) { - btnOnClickInsertData(); + btnOnClickInsertData(); } }); + overviewView.findViewById(R.id.tableRowWeight).setOnClickListener(new onClickListenerEvaluation()); + overviewView.findViewById(R.id.tableRowBMI).setOnClickListener(new onClickListenerEvaluation()); + overviewView.findViewById(R.id.tableRowFat).setOnClickListener(new onClickListenerEvaluation()); + overviewView.findViewById(R.id.tableRowMuscle).setOnClickListener(new onClickListenerEvaluation()); + overviewView.findViewById(R.id.tableRowWater).setOnClickListener(new onClickListenerEvaluation()); + overviewView.findViewById(R.id.tableRowWaist).setOnClickListener(new onClickListenerEvaluation()); + overviewView.findViewById(R.id.tableRowWHtR).setOnClickListener(new onClickListenerEvaluation()); + overviewView.findViewById(R.id.tableRowHip).setOnClickListener(new onClickListenerEvaluation()); + overviewView.findViewById(R.id.tableRowWHR).setOnClickListener(new onClickListenerEvaluation()); + + userSelectedData = null; + + spinUserAdapter = new ArrayAdapter<>(overviewView.getContext(), R.layout.support_simple_spinner_dropdown_item, new ArrayList()); + spinUser.setAdapter(spinUserAdapter); + + // Set item select listener after spinner is created because otherwise item listener fires a lot!?!? + spinUser.post(new Runnable() { + public void run() { + spinUser.setOnItemSelectedListener(new spinUserSelectionListener()); + updateUserSelection(); + } + }); + + OpenScale.getInstance(overviewView.getContext()).registerFragment(this); + + return overviewView; + } + + @Override + public void updateOnView(ArrayList scaleDataList) { + if (scaleDataList.isEmpty()) { + lastScaleData = new ScaleData(); + } else if (userSelectedData != null) { + lastScaleData = userSelectedData; + } + else { + lastScaleData = scaleDataList.get(0); + } + + prefs = PreferenceManager.getDefaultSharedPreferences(overviewView.getContext()); - currentScaleUser = OpenScale.getInstance(overviewView.getContext()).getSelectedScaleUser(); - updateOnView(OpenScale.getInstance(overviewView.getContext()).getScaleDataList()); + txtTitleUser.setText(getResources().getString(R.string.label_title_user).toUpperCase()); + txtTitleLastMeasurement.setText(getResources().getString(R.string.label_title_last_measurement).toUpperCase()); + txtTitleGoal.setText(getResources().getString(R.string.label_title_goal).toUpperCase()); + txtTitleStatistics.setText(getResources().getString(R.string.label_title_statistics).toUpperCase()); + updateUserSelection(); + updateVisibleRows(); + updateLastPieChart(); + updateLastLineChart(scaleDataList); + updateLastMeasurement(); + updateGoal(scaleDataList); + updateStatistics(scaleDataList); + updateEvaluation(); + } + + private void updateUserSelection() { + + currentScaleUser = OpenScale.getInstance(overviewView.getContext()).getSelectedScaleUser(); + + spinUserAdapter.clear(); + ArrayList scaleUserList = OpenScale.getInstance(overviewView.getContext()).getScaleUserList(); + + int posUser = 0; + int pos = 0; + + for(ScaleUser scaleUser :scaleUserList) { + spinUserAdapter.add(scaleUser.user_name); + + if (scaleUser.id == currentScaleUser.id) { + posUser = pos; + } + + pos++; + } + + spinUser.setSelection(posUser, true); + } + + private void updateVisibleRows() { if(!prefs.getBoolean("fatEnable", true)) { TableRow row = (TableRow)overviewView.findViewById(R.id.tableRowFat); row.setVisibility(View.GONE); + } else { + TableRow row = (TableRow)overviewView.findViewById(R.id.tableRowFat); + row.setVisibility(View.VISIBLE); } if(!prefs.getBoolean("muscleEnable", true)) { TableRow row = (TableRow)overviewView.findViewById(R.id.tableRowMuscle); row.setVisibility(View.GONE); + } else { + TableRow row = (TableRow)overviewView.findViewById(R.id.tableRowMuscle); + row.setVisibility(View.VISIBLE); } if(!prefs.getBoolean("waterEnable", true)) { TableRow row = (TableRow)overviewView.findViewById(R.id.tableRowWater); row.setVisibility(View.GONE); + } else { + TableRow row = (TableRow)overviewView.findViewById(R.id.tableRowWater); + row.setVisibility(View.VISIBLE); } if(!prefs.getBoolean("waistEnable", true)) { TableRow row = (TableRow)overviewView.findViewById(R.id.tableRowWaist); row.setVisibility(View.GONE); + + row = (TableRow)overviewView.findViewById(R.id.tableRowWHtR); + row.setVisibility(View.GONE); + } else { + TableRow row = (TableRow)overviewView.findViewById(R.id.tableRowWaist); + row.setVisibility(View.VISIBLE); + + row = (TableRow)overviewView.findViewById(R.id.tableRowWHtR); + row.setVisibility(View.VISIBLE); } if(!prefs.getBoolean("hipEnable", true)) { TableRow row = (TableRow)overviewView.findViewById(R.id.tableRowHip); row.setVisibility(View.GONE); + } else { + TableRow row = (TableRow)overviewView.findViewById(R.id.tableRowHip); + row.setVisibility(View.VISIBLE); } - spinUser.setOnItemSelectedListener(new spinUserSelectionListener()); - - ArrayList userItems = new ArrayList<>(); - - ArrayList scaleUserList = OpenScale.getInstance(overviewView.getContext()).getScaleUserList(); - - int posUser = 0; - int pos = 0; - - for (ScaleUser scaleUser : scaleUserList) { - userItems.add(scaleUser.user_name); - - if (scaleUser.id == currentScaleUser.id) { - posUser = pos; - } - - pos++; + if(!prefs.getBoolean("hipEnable", true) || !prefs.getBoolean("waistEnable", true)) { + TableRow row = (TableRow)overviewView.findViewById(R.id.tableRowWHR); + row.setVisibility(View.GONE); + } else { + TableRow row = (TableRow)overviewView.findViewById(R.id.tableRowWHR); + row.setVisibility(View.VISIBLE); } + } - ArrayAdapter spinAdapter = new ArrayAdapter<>(overviewView.getContext(), R.layout.support_simple_spinner_dropdown_item, userItems); - - spinUser.setAdapter(spinAdapter); - spinUser.setSelection(posUser); + private void updateEvaluation() { + linearGaugeWeight.setMinMaxValue(30, 300); + linearGaugeBMI.setMinMaxValue(10, 50); + linearGaugeFat.setMinMaxValue(10, 40); + linearGaugeMuscle.setMinMaxValue(10, 80); + linearGaugeWater.setMinMaxValue(30, 80); + linearGaugeWaist.setMinMaxValue(30, 200); + linearGaugeWHtR.setMinMaxValue(0, 1); + linearGaugeHip.setMinMaxValue(30, 200); + linearGaugeWHR.setMinMaxValue(0, 1); + + EvaluationSheet evalSheet = new EvaluationSheet(currentScaleUser); + + EvaluationResult sheetWeight = evalSheet.evaluateWeight(lastScaleData.weight); + EvaluationResult sheetBMI = evalSheet.evaluateBMI(currentScaleUser.getBMI(lastScaleData.weight)); + EvaluationResult sheetFat = evalSheet.evaluateBodyFat(lastScaleData.fat); + EvaluationResult sheetMuscle = evalSheet.evaluateBodyMuscle(lastScaleData.muscle); + EvaluationResult sheetWater = evalSheet.evaluateBodyWater(lastScaleData.water); + EvaluationResult sheetWaist = evalSheet.evaluateWaist(lastScaleData.waist); + EvaluationResult sheetWHtR = evalSheet.evaluateWHtR(currentScaleUser.getWHtR(lastScaleData.waist)); + EvaluationResult sheetWHR = evalSheet.evaluateWHR(currentScaleUser.getWHR(lastScaleData.waist, lastScaleData.hip)); + + updateIndicator((ImageView)overviewView.findViewById(R.id.indicatorWeight), sheetWeight.eval_state); + updateIndicator((ImageView)overviewView.findViewById(R.id.indicatorBMI), sheetBMI.eval_state); + updateIndicator((ImageView)overviewView.findViewById(R.id.indicatorFat), sheetFat.eval_state); + updateIndicator((ImageView)overviewView.findViewById(R.id.indicatorMuscle), sheetMuscle.eval_state); + updateIndicator((ImageView)overviewView.findViewById(R.id.indicatorWater), sheetWater.eval_state); + updateIndicator((ImageView) overviewView.findViewById(R.id.indicatorWaist), sheetWaist.eval_state); + updateIndicator((ImageView)overviewView.findViewById(R.id.indicatorWHtR), sheetWHtR.eval_state); + updateIndicator((ImageView)overviewView.findViewById(R.id.indicatorHip), EvaluationResult.EVAL_STATE.UNDEFINED); + updateIndicator((ImageView)overviewView.findViewById(R.id.indicatorWHR), sheetWHR.eval_state); + + linearGaugeWeight.setLimits(sheetWeight.lowLimit, sheetWeight.highLimit); + linearGaugeBMI.setLimits(sheetBMI.lowLimit, sheetBMI.highLimit); + linearGaugeFat.setLimits(sheetFat.lowLimit, sheetFat.highLimit); + linearGaugeMuscle.setLimits(sheetMuscle.lowLimit, sheetMuscle.highLimit); + linearGaugeWater.setLimits(sheetWater.lowLimit, sheetWater.highLimit); + linearGaugeWaist.setLimits(sheetWaist.lowLimit, sheetWaist.highLimit); + linearGaugeWHtR.setLimits(sheetWHtR.lowLimit, sheetWHtR.highLimit); + linearGaugeHip.setLimits(-1f, -1f); + linearGaugeWHR.setLimits(sheetWHR.lowLimit, sheetWHR.highLimit); + + linearGaugeWeight.setValue(lastScaleData.weight); + linearGaugeBMI.setValue(currentScaleUser.getBMI(lastScaleData.weight)); + linearGaugeFat.setValue(lastScaleData.fat); + linearGaugeMuscle.setValue(lastScaleData.muscle); + linearGaugeWater.setValue(lastScaleData.water); + linearGaugeWaist.setValue(lastScaleData.waist); + linearGaugeWHtR.setValue(currentScaleUser.getWHtR(lastScaleData.waist)); + linearGaugeHip.setValue(lastScaleData.hip); + linearGaugeWHR.setValue(currentScaleUser.getWHR(lastScaleData.waist, lastScaleData.hip)); + } - return overviewView; - } - - @Override - public void updateOnView(ArrayList scaleDataList) - { - if (scaleDataList.isEmpty()) { - lastScaleData = null; - return; + private void updateIndicator(ImageView view, EvaluationResult.EVAL_STATE state) { + switch(state) + { + case LOW: + view.setBackgroundColor(ChartUtils.COLOR_BLUE); + break; + case NORMAL: + view.setBackgroundColor(ChartUtils.COLOR_GREEN); + break; + case HIGH: + view.setBackgroundColor(ChartUtils.COLOR_RED); + break; + case UNDEFINED: + view.setBackgroundColor(Color.GRAY); + break; } - - lastScaleData = scaleDataList.get(0); - - txtTitleUser.setText(getResources().getString(R.string.label_title_user).toUpperCase()); - txtTitleLastMeasurement.setText(getResources().getString(R.string.label_title_last_measurement).toUpperCase()); - txtTitleGoal.setText(getResources().getString(R.string.label_title_goal).toUpperCase()); - txtTitleStatistics.setText(getResources().getString(R.string.label_title_statistics).toUpperCase()); - - updateLastPieChart(); - updateLastLineChart(scaleDataList); - updateLastMeasurement(); - updateGoal(scaleDataList); - updateStatistics(scaleDataList); } private void updateLastMeasurement() { @@ -261,7 +428,9 @@ private void updateLastMeasurement() { txtWaterLast.setText(lastScaleData.water + " %"); txtMuscleLast.setText(lastScaleData.muscle + " %"); txtWaistLast.setText(lastScaleData.waist + " cm"); + txtWHtRLast.setText(String.format("%.2f", currentScaleUser.getWHtR(lastScaleData.waist))); txtHipLast.setText(lastScaleData.hip + " cm"); + txtWHRLast.setText(String.format("%.2f", currentScaleUser.getWHR(lastScaleData.waist, lastScaleData.hip))); } private void updateGoal(ArrayList scaleDataList) { @@ -281,54 +450,76 @@ private void updateGoal(ArrayList scaleDataList) { txtLabelGoalDiff.setText(Html.fromHtml(getResources().getString(R.string.label_weight_difference) + "
BMI " + String.format("%.1f", currentScaleUser.getBMI(lastScaleData.weight) - currentScaleUser.getBMI(currentScaleUser.goal_weight)) + " ")); txtLabelDayLeft.setText(Html.fromHtml(getResources().getString(R.string.label_days_left) + "
" + getResources().getString(R.string.label_goal_date_is) + " " + DateFormat.getDateInstance(DateFormat.LONG).format(currentScaleUser.goal_date) + " ")); // currentScaleUser.goal_date - if (scaleDataList.size() >= 2) { - ScaleData diffScaleData = scaleDataList.get(1); - - double diffWeight = lastScaleData.weight - diffScaleData.weight; - double diffBMI = currentScaleUser.getBMI(lastScaleData.weight) - currentScaleUser.getBMI(diffScaleData.weight); - double diffFat = lastScaleData.fat - diffScaleData.fat; - double diffMuscle = lastScaleData.muscle - diffScaleData.muscle; - double diffWater = lastScaleData.water - diffScaleData.water; - double diffWaist = lastScaleData.waist - diffScaleData.waist; - double diffHip = lastScaleData.hip - diffScaleData.hip; - - - if (diffWeight > 0.0) - txtLabelWeight.setText(Html.fromHtml(getResources().getString(R.string.label_weight) + "
" + String.format("%.1f ", diffWeight) + ScaleUser.UNIT_STRING[currentScaleUser.scale_unit] + "")); - else - txtLabelWeight.setText(Html.fromHtml(getResources().getString(R.string.label_weight) + "
" + String.format("%.1f ", diffWeight) + ScaleUser.UNIT_STRING[currentScaleUser.scale_unit] + "")); - - - if (diffBMI > 0.0) - txtLabelBMI.setText(Html.fromHtml(getResources().getString(R.string.label_bmi) + "
" + String.format("%.1f", diffBMI) + "")); - else - txtLabelBMI.setText(Html.fromHtml(getResources().getString(R.string.label_bmi) + "
" + String.format("%.1f", diffBMI) + "")); - - if (diffFat > 0.0) - txtLabelFat.setText(Html.fromHtml(getResources().getString(R.string.label_fat) + "
" + String.format("%.1f", diffFat) + "%")); - else - txtLabelFat.setText(Html.fromHtml(getResources().getString(R.string.label_fat) + "
" + String.format("%.1f", diffFat) + "%")); - - if (diffMuscle > 0.0) - txtLabelMuscle.setText(Html.fromHtml(getResources().getString(R.string.label_muscle) + "
" + String.format("%.1f", diffMuscle) + "%")); - else - txtLabelMuscle.setText(Html.fromHtml(getResources().getString(R.string.label_muscle) + "
" + String.format("%.1f", diffMuscle) + "%")); - - if (diffWater > 0.0) - txtLabelWater.setText(Html.fromHtml(getResources().getString(R.string.label_water) + "
" + String.format("%.1f", diffWater) + "%")); - else - txtLabelWater.setText(Html.fromHtml(getResources().getString(R.string.label_water) + "
" + String.format("%.1f", diffWater) + "%")); + ListIterator scaleDataIterator = scaleDataList.listIterator(); + + while(scaleDataIterator.hasNext()) { + ScaleData scaleData = scaleDataIterator.next(); + + if (scaleData.id == lastScaleData.id) { + if (scaleDataIterator.hasNext()) { + ScaleData diffScaleData = scaleDataIterator.next(); + + double diffWeight = lastScaleData.weight - diffScaleData.weight; + double diffBMI = currentScaleUser.getBMI(lastScaleData.weight) - currentScaleUser.getBMI(diffScaleData.weight); + double diffFat = lastScaleData.fat - diffScaleData.fat; + double diffMuscle = lastScaleData.muscle - diffScaleData.muscle; + double diffWater = lastScaleData.water - diffScaleData.water; + double diffWaist = lastScaleData.waist - diffScaleData.waist; + double diffWHtR = currentScaleUser.getWHtR(lastScaleData.waist) - currentScaleUser.getWHtR(diffScaleData.waist); + double diffHip = lastScaleData.hip - diffScaleData.hip; + double diffWHR = currentScaleUser.getWHR(lastScaleData.waist, lastScaleData.hip) - currentScaleUser.getWHR(diffScaleData.waist, diffScaleData.hip); + + + if (diffWeight > 0.0) + txtLabelWeight.setText(Html.fromHtml(getResources().getString(R.string.label_weight) + "
" + String.format("%.1f ", diffWeight) + ScaleUser.UNIT_STRING[currentScaleUser.scale_unit] + "")); + else + txtLabelWeight.setText(Html.fromHtml(getResources().getString(R.string.label_weight) + "
" + String.format("%.1f ", diffWeight) + ScaleUser.UNIT_STRING[currentScaleUser.scale_unit] + "")); + + + if (diffBMI > 0.0) + txtLabelBMI.setText(Html.fromHtml(getResources().getString(R.string.label_bmi) + "
" + String.format("%.1f", diffBMI) + "")); + else + txtLabelBMI.setText(Html.fromHtml(getResources().getString(R.string.label_bmi) + "
" + String.format("%.1f", diffBMI) + "")); + + if (diffFat > 0.0) + txtLabelFat.setText(Html.fromHtml(getResources().getString(R.string.label_fat) + "
" + String.format("%.1f", diffFat) + "%")); + else + txtLabelFat.setText(Html.fromHtml(getResources().getString(R.string.label_fat) + "
" + String.format("%.1f", diffFat) + "%")); + + if (diffMuscle > 0.0) + txtLabelMuscle.setText(Html.fromHtml(getResources().getString(R.string.label_muscle) + "
" + String.format("%.1f", diffMuscle) + "%")); + else + txtLabelMuscle.setText(Html.fromHtml(getResources().getString(R.string.label_muscle) + "
" + String.format("%.1f", diffMuscle) + "%")); + + if (diffWater > 0.0) + txtLabelWater.setText(Html.fromHtml(getResources().getString(R.string.label_water) + "
" + String.format("%.1f", diffWater) + "%")); + else + txtLabelWater.setText(Html.fromHtml(getResources().getString(R.string.label_water) + "
" + String.format("%.1f", diffWater) + "%")); + + if (diffWaist > 0.0) + txtLabelWaist.setText(Html.fromHtml(getResources().getString(R.string.label_waist) + "
" + String.format("%.1f", diffWaist) + "cm")); + else + txtLabelWaist.setText(Html.fromHtml(getResources().getString(R.string.label_waist) + "
" + String.format("%.1f", diffWaist) + "cm")); + + if (diffWHtR > 0.0) + txtLabelWHtR.setText(Html.fromHtml(getResources().getString(R.string.label_whtr) + "
" + String.format("%.2f", diffWHtR) + "")); + else + txtLabelWHtR.setText(Html.fromHtml(getResources().getString(R.string.label_whtr) + "
" + String.format("%.2f", diffWHtR) + "")); + + if (diffHip > 0.0) + txtLabelHip.setText(Html.fromHtml(getResources().getString(R.string.label_hip) + "
" + String.format("%.1f", diffHip) + "cm")); + else + txtLabelHip.setText(Html.fromHtml(getResources().getString(R.string.label_hip) + "
" + String.format("%.1f", diffHip) + "cm")); + + if (diffWHR > 0.0) + txtLabelWHR.setText(Html.fromHtml(getResources().getString(R.string.label_whr) + "
" + String.format("%.2f", diffWHR) + "")); + else + txtLabelWHR.setText(Html.fromHtml(getResources().getString(R.string.label_whr) + "
" + String.format("%.2f", diffWHR) + "")); + } + } + } - if (diffWaist > 0.0) - txtLabelWaist.setText(Html.fromHtml(getResources().getString(R.string.label_waist) + "
" + String.format("%.1f", diffWaist) + "cm")); - else - txtLabelWaist.setText(Html.fromHtml(getResources().getString(R.string.label_waist) + "
" + String.format("%.1f", diffWaist) + "cm")); - if (diffHip > 0.0) - txtLabelHip.setText(Html.fromHtml(getResources().getString(R.string.label_hip) + "
" + String.format("%.1f", diffHip) + "cm")); - else - txtLabelHip.setText(Html.fromHtml(getResources().getString(R.string.label_hip) + "
" + String.format("%.1f", diffHip) + "cm")); - } } private void updateStatistics(ArrayList scaleDataList) { @@ -349,7 +540,9 @@ private void updateStatistics(ArrayList scaleDataList) { float weekAvgWater = 0; float weekAvgMuscle = 0; float weekAvgWaist = 0; + float weekAvgWHtR = 0; float weekAvgHip = 0; + float weekAvgWHR = 0; int monthSize = 0; float monthAvgWeight = 0; @@ -358,8 +551,9 @@ private void updateStatistics(ArrayList scaleDataList) { float monthAvgWater = 0; float monthAvgMuscle = 0; float monthAvgWaist = 0; + float monthAvgWHtR = 0; float monthAvgHip = 0; - + float monthAvgWHR = 0; for (ScaleData scaleData : scaleDataList) { @@ -375,6 +569,8 @@ private void updateStatistics(ArrayList scaleDataList) { weekAvgMuscle += scaleData.muscle; weekAvgWaist += scaleData.waist; weekAvgHip += scaleData.hip; + weekAvgWHtR += currentScaleUser.getWHtR(scaleData.waist); + weekAvgWHR += currentScaleUser.getWHR(scaleData.waist, scaleData.hip); } if (monthPastDate.before(histDate)) { @@ -387,6 +583,8 @@ private void updateStatistics(ArrayList scaleDataList) { monthAvgMuscle += scaleData.muscle; monthAvgWaist += scaleData.waist; monthAvgHip += scaleData.hip; + monthAvgWHtR += currentScaleUser.getWHtR(scaleData.waist); + monthAvgWHR += currentScaleUser.getWHR(scaleData.waist, scaleData.hip); } else { break; } @@ -398,7 +596,9 @@ private void updateStatistics(ArrayList scaleDataList) { weekAvgWater /= weekSize; weekAvgMuscle /= weekSize; weekAvgWaist /= weekSize; + weekAvgWHtR /= weekSize; weekAvgHip /= weekSize; + weekAvgWHR /= weekSize; monthAvgWeight /= monthSize; monthAvgBMI /= monthSize; @@ -406,7 +606,9 @@ private void updateStatistics(ArrayList scaleDataList) { monthAvgWater /= monthSize; monthAvgMuscle /= monthSize; monthAvgWaist /= monthSize; + monthAvgWHtR /= monthSize; monthAvgHip /= monthSize; + monthAvgWHR /= monthSize; String info_week = new String(); String info_month = new String(); @@ -443,6 +645,10 @@ private void updateStatistics(ArrayList scaleDataList) { info_week += String.format("Ø-"+getResources().getString(R.string.label_waist)+": %.1fcm
", weekAvgWaist); info_month += String.format("Ø-"+getResources().getString(R.string.label_waist)+": %.1fcm
", monthAvgWaist); lines++; + + info_week += String.format("Ø-"+getResources().getString(R.string.label_whtr)+": %.2f
", weekAvgWHtR); + info_month += String.format("Ø-"+getResources().getString(R.string.label_whtr)+": %.2f
", monthAvgWHtR); + lines++; } if(prefs.getBoolean("hipEnable", true)) { @@ -451,6 +657,12 @@ private void updateStatistics(ArrayList scaleDataList) { lines++; } + if(prefs.getBoolean("hipEnable", true) && prefs.getBoolean("waistEnable", true)) { + info_week += String.format("Ø-"+getResources().getString(R.string.label_whr)+": %.2f
", weekAvgWHR); + info_month += String.format("Ø-"+getResources().getString(R.string.label_whr)+": %.2f
", monthAvgWHR); + lines++; + } + txtLabelAvgWeek.setLines(lines); txtLabelAvgMonth.setLines(lines); @@ -481,7 +693,7 @@ private void updateLastLineChart(ArrayList scaleDataList) { Calendar histDate = Calendar.getInstance(); Calendar lastDate = Calendar.getInstance(); - lastDate.setTime(scaleDataList.get(0).date_time); + lastDate.setTime(lastScaleData.date_time); scaleDataLastDays = new ArrayList(); @@ -533,37 +745,28 @@ private void updateLastLineChart(ArrayList scaleDataList) { setHasLabels(prefs.getBoolean("labelsEnable", true)). setFormatter(new SimpleLineChartValueFormatter(1)); - activeLines = new ArrayList(); - if(prefs.getBoolean("weightEnable", true)) { lines.add(lineWeight); - activeLines.add(OverviewFragment.lines.WEIGHT); } if(prefs.getBoolean("fatEnable", true)) { lines.add(lineFat); - activeLines.add(OverviewFragment.lines.FAT); } if(prefs.getBoolean("waterEnable", true)) { lines.add(lineWater); - activeLines.add(OverviewFragment.lines.WATER); } if(prefs.getBoolean("muscleEnable", true)) { lines.add(lineMuscle); - activeLines.add(OverviewFragment.lines.MUSCLE); } if(prefs.getBoolean("waistEnable", true)) { lines.add(lineWaist); - activeLines.add(OverviewFragment.lines.WAIST); - } if(prefs.getBoolean("hipEnable", true)) { lines.add(lineHip); - activeLines.add(OverviewFragment.lines.HIP); } LineChartData lineData = new LineChartData(lines); @@ -672,12 +875,6 @@ public void onValueDeselected() { } } - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) - { - updateOnView(OpenScale.getInstance(overviewView.getContext()).getScaleDataList()); - } - @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); @@ -694,33 +891,9 @@ public void setUserVisibleHint(boolean isVisibleToUser) { private class LineChartTouchListener implements LineChartOnValueSelectListener { @Override public void onValueSelected(int lineIndex, int pointIndex, PointValue pointValue) { - ScaleData scaleData = scaleDataLastDays.get(pointIndex); - lines selectedLine = activeLines.get(lineIndex); + userSelectedData = scaleDataLastDays.get(pointIndex); - String date_time = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.SHORT).format(scaleData.date_time); - - switch (selectedLine) { - case WEIGHT: - Toast.makeText(getActivity(), getResources().getString(R.string.info_your_weight) + " " + scaleData.weight + ScaleUser.UNIT_STRING[OpenScale.getInstance(overviewView.getContext()).getSelectedScaleUser().scale_unit] + " " + getResources().getString(R.string.info_on_date) + " " + date_time, Toast.LENGTH_SHORT).show(); - break; - case FAT: - Toast.makeText(getActivity(), getResources().getString(R.string.info_your_fat) + " " + scaleData.fat + "% " + getResources().getString(R.string.info_on_date) + " " + date_time, Toast.LENGTH_SHORT).show(); - break; - case WATER: - Toast.makeText(getActivity(), getResources().getString(R.string.info_your_water) + " " + scaleData.water + "% " + getResources().getString(R.string.info_on_date) + " " + date_time, Toast.LENGTH_SHORT).show(); - break; - case MUSCLE: - Toast.makeText(getActivity(), getResources().getString(R.string.info_your_muscle) + " " + scaleData.muscle + "% " + getResources().getString(R.string.info_on_date) + " " + date_time, Toast.LENGTH_SHORT).show(); - break; - case WAIST: - Toast.makeText(getActivity(), getResources().getString(R.string.info_your_waist) + " " + scaleData.waist + "cm " + getResources().getString(R.string.info_on_date) + " " + date_time, Toast.LENGTH_SHORT).show(); - break; - case HIP: - Toast.makeText(getActivity(), getResources().getString(R.string.info_your_hip) + " " + scaleData.hip + "cm " + getResources().getString(R.string.info_on_date) + " " + date_time, Toast.LENGTH_SHORT).show(); - break; - default: - break; - } + updateOnView( OpenScale.getInstance(overviewView.getContext()).getScaleDataList()); } @Override @@ -742,6 +915,7 @@ public void onItemSelected(AdapterView parent, View view, int position, long SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); prefs.edit().putInt("selectedUserId", scaleUser.id).commit(); + OpenScale.getInstance(overviewView.getContext()).updateScaleData(); } } @@ -750,4 +924,22 @@ public void onNothingSelected(AdapterView parent) { } } + + private class onClickListenerEvaluation implements View.OnClickListener { + @Override + public void onClick(View v) { + TableRow row = (TableRow)v; + + TableLayout tableLayout = (TableLayout)row.getParent(); + int index = tableLayout.indexOfChild(row); + + TableRow rowEvaluation = (TableRow)tableLayout.getChildAt(index+1); + + if (rowEvaluation.getVisibility() == View.VISIBLE) { + rowEvaluation.setVisibility(View.GONE); + } else { + rowEvaluation.setVisibility(View.VISIBLE); + } + } + } } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/SettingsActivity.java b/android_app/app/src/main/java/com/health/openscale/gui/SettingsActivity.java index 07e8ff298..f82b5337b 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/SettingsActivity.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/SettingsActivity.java @@ -119,6 +119,8 @@ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, Strin } else { OpenScale.getInstance(getApplicationContext()).stopBluetoothServer(); } + + OpenScale.getInstance(getApplicationContext()).updateScaleData(); } private void initSummary(Preference p) { diff --git a/android_app/app/src/main/java/com/health/openscale/gui/TableFragment.java b/android_app/app/src/main/java/com/health/openscale/gui/TableFragment.java index 01a99122a..30efd84ec 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/TableFragment.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/TableFragment.java @@ -96,42 +96,60 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa btnDeleteAll.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 11); } + OpenScale.getInstance(tableView.getContext()).registerFragment(this); + + return tableView; + } + + @Override + public void updateOnView(ArrayList scaleDataList) + { prefs = PreferenceManager.getDefaultSharedPreferences(tableView.getContext()); if(!prefs.getBoolean("fatEnable", true)) { TextView txtFatTableHeader = (TextView)tableView.findViewById(R.id.txtFatTableHeader); txtFatTableHeader.setVisibility(View.GONE); + } else { + TextView txtFatTableHeader = (TextView)tableView.findViewById(R.id.txtFatTableHeader); + txtFatTableHeader.setVisibility(View.VISIBLE); } if(!prefs.getBoolean("muscleEnable", true)) { TextView txtMuscleTableHeader = (TextView)tableView.findViewById(R.id.txtMuscleTableHeader); txtMuscleTableHeader.setVisibility(View.GONE); + } else { + TextView txtMuscleTableHeader = (TextView)tableView.findViewById(R.id.txtMuscleTableHeader); + txtMuscleTableHeader.setVisibility(View.VISIBLE); } if(!prefs.getBoolean("waterEnable", true)) { TextView txtWaterTableHeader = (TextView)tableView.findViewById(R.id.txtWaterTableHeader); txtWaterTableHeader.setVisibility(View.GONE); + } else { + TextView txtWaterTableHeader = (TextView)tableView.findViewById(R.id.txtWaterTableHeader); + txtWaterTableHeader.setVisibility(View.VISIBLE); } if(!prefs.getBoolean("waistEnable", true)) { TextView txtWaistTableHeader = (TextView)tableView.findViewById(R.id.txtWaistTableHeader); txtWaistTableHeader.setVisibility(View.GONE); + } else { + TextView txtWaistTableHeader = (TextView)tableView.findViewById(R.id.txtWaistTableHeader); + txtWaistTableHeader.setVisibility(View.VISIBLE); } if(!prefs.getBoolean("hipEnable", true)) { TextView txtHipTableHeader = (TextView)tableView.findViewById(R.id.txtHipTableHeader); txtHipTableHeader.setVisibility(View.GONE); + } else { + TextView txtHipTableHeader = (TextView)tableView.findViewById(R.id.txtHipTableHeader); + txtHipTableHeader.setVisibility(View.VISIBLE); } - return tableView; - } - - @Override - public void updateOnView(ArrayList scaleDataList) - { tableDataView.setColumnStretchable(1, true); tableDataView.setColumnStretchable(2, true); tableDataView.setColumnStretchable(3, true); + if(prefs.getBoolean("fatEnable", true)) { tableDataView.setColumnStretchable(4, true); } @@ -149,9 +167,9 @@ public void updateOnView(ArrayList scaleDataList) } tableDataView.setColumnStretchable(9, true); - TableRow headerRow = (TableRow) tableView.findViewById(R.id.tableHeader); - tableDataView.removeAllViews(); - tableDataView.addView(headerRow); + TableRow headerRow = (TableRow) tableView.findViewById(R.id.tableHeader); + tableDataView.removeAllViews(); + tableDataView.addView(headerRow); for(ScaleData scaleData: scaleDataList) { diff --git a/android_app/app/src/main/java/com/health/openscale/gui/UserSettingsActivity.java b/android_app/app/src/main/java/com/health/openscale/gui/UserSettingsActivity.java index 117539188..99fce8a53 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/UserSettingsActivity.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/UserSettingsActivity.java @@ -52,8 +52,6 @@ public class UserSettingsActivity extends Activity { private RadioGroup radioScaleUnit; private RadioGroup radioGender; - private Button btnBirthdaySet; - private Button btnGoalDateSet; private Button btnOk; private Button btnCancel; private Button btnDelete; @@ -85,7 +83,6 @@ protected void onCreate(Bundle savedInstanceState) { btnCancel.setOnClickListener(new onClickListenerCancel()); btnDelete.setOnClickListener(new onClickListenerDelete()); - txtBirthday.setText(dateFormat.format(new Date())); txtGoalDate.setText(dateFormat.format(new Date())); @@ -94,7 +91,7 @@ protected void onCreate(Bundle savedInstanceState) { public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { Calendar cal = Calendar.getInstance(); - DatePickerDialog datePicker = new DatePickerDialog(context, goalDatePickerListener, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)); + DatePickerDialog datePicker = new DatePickerDialog(context, datePickerListener, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)); datePicker.show(); } } @@ -211,8 +208,8 @@ public void onClick(DialogInterface dialog, int id) { int userId = getIntent().getExtras().getInt("id"); OpenScale openScale = OpenScale.getInstance(context); - openScale.deleteScaleUser(userId); openScale.clearScaleData(userId); + openScale.deleteScaleUser(userId); ArrayList scaleUser = openScale.getScaleUserList(); @@ -225,6 +222,8 @@ public void onClick(DialogInterface dialog, int id) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); prefs.edit().putInt("selectedUserId", lastUserId).commit(); + openScale.updateScaleData(); + Intent returnIntent = new Intent(); setResult(RESULT_OK, returnIntent); @@ -253,7 +252,7 @@ public void onClick(View v) { int body_height = Integer.valueOf(txtBodyHeight.getText().toString()); int checkedRadioButtonId = radioScaleUnit.getCheckedRadioButtonId(); int checkedGenderId = radioGender.getCheckedRadioButtonId(); - double goal_weight = Double.valueOf(txtGoalWeight.getText().toString()); + float goal_weight = Float.valueOf(txtGoalWeight.getText().toString()); int scale_unit = -1; @@ -299,6 +298,8 @@ public void onClick(View v) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); prefs.edit().putInt("selectedUserId", id).commit(); + openScale.updateScaleData(); + Intent returnIntent = new Intent(); setResult(RESULT_OK, returnIntent); diff --git a/android_app/app/src/main/res/drawable/whr.png b/android_app/app/src/main/res/drawable/whr.png new file mode 100644 index 0000000000000000000000000000000000000000..e4790449a39e53fd92b6714b320e8d3ed8016217 GIT binary patch literal 684 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!n2Vh}LpV4%Za?&Y0OWEOctjR6 zFtAjEFyj{9;~_vn$r9IylHmNblJdl&REF~Ma=pyF?Be9af>gcyqV(DCY@~pSRtNZm zxc>kDAIKaMVBcGQF`z>&N`m}?8JJl(IJtNwBxU6l)iktq_4Ex4O>NzRL&72=qoQNd zN=nNs8#=nDFIlm9+x{odU%Yz#=Iy(mzyDP4GID2NVAS_?aSVw#{Pz6KutNqStq*xM z6qwd>X?zZtsp*w^;f`8V9SukK zL~hwv@uAUqB8$n*QeUA9yBTeT67DffW_gmkfBR<@23`4#i&YDD?|<@JZ!5dk;h!}T zi?*J>mY%R!{p!B@q=j>TegC?u>Bef#!o6Jwe&5xSSiet{WxM$@$AqjC+;RN|44DVt z`noViKD@=v4&d{-!|16F+A>;&3+_*O1^&r^M?;{Zr_3!c4j`1XPkU;uEX-h zjJz2R%u+v?6AqlNnmeD7QN!YS0dvl|#FomRjTQu>{EAi^QGb>iKMHhn7 NiKnZd%Q~loCIBUZ*I@tv literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable/whtr.png b/android_app/app/src/main/res/drawable/whtr.png new file mode 100644 index 0000000000000000000000000000000000000000..db60728b983145b0d6294842c6b1c2377b573bf9 GIT binary patch literal 1919 zcmV-_2Y~pAP);-AQ{<9y8)FQ{DludjnG(j5X!(ONDN)na*epU5HkZ)YYEs($J^nb)Pp^01%Xu$* zG1D`1=6(0P&+|Rc^L_U`=klJP5fRdgF{T$#37iCU1l9p7L}XKH(AE|aNnC(Z;4WY{ zAimNFJOY#@#Ow=<0mcEx0w#@biDO9-d8B zQWb-B7tj=g@oc*x0O$$qNasbV<;zvm_;8Xo@zP*%)IE1qLU;I2brFMcc8GlmOQ^7H4xx3Y;M+Y+@xT0jpB9 z5oBXh;IxP&C13?MaV3#u0d*@AVgRg7VG}PYhQa%A9|fL?z*(OF=TBh2HXjDn@eaUJ z2d8VJoW@Ro;^qLwa#g#S2Y8(C2s{An32?Rm%mg|+;M}kJQNhn?so+J#&bQNwF{T1I z12`GzgiUzMMC9uP7-s=5VAld(*$Uh&BCn)&(53w>1mxy~F(tq;*rBcyHsO6CB2Ed{ z7}F2iH8)7YfD#d4j5!!MUmcAbK?L{)SOV0AIcAJGfaqayn}`$w>`H-Yz@5NBTHOFV z2|Oesdt&@kFWvimHSTkFe|Z;QLd5p}dI#IzfTw_t9$N#{MA$3=N^?nq+Stn}1NWB2 z9?Zv6*jIb(Z*)1GeN4{3>kD=mgZI z#3*1BT?gEjzMxL-60D*&p~Y2fW7=>olUfK_f6KH32|5@KX*Bk5as=a=;SoF7!af zyoBIkxd2Rb2|kK|n{#lsTCuug$MQS~5a11upT_~yflslC_FiDHYw&>tVE6o7CMZ#* z0qCW8FXb5g`XX*#C5Ql*Nk&|mtXOB}82nE_cg4K|I~Vv>|GTzo`CaSQ0@o!b06R|q zkkQc<*fGD1;13>Y%UJbsTmqXLk`i!zMkn{6eGqss$KY#H=96vc>@k)A?1E=gMn@l2 ztN{dnH%wD@07okBiz)0ExDs$pMn^XSU9gKMmn}2ba+~@$A_K<7kpy7p*WYDyv^Yzf zlw<0fEdOaree&Y{?BoJa6Yz);1#KL@-SA#)x|u{$?m zhVzMD!8HQC6>NTvZ-16z9!s(hvQd5x2_oRin71&H=sx|P0-c&;@by49#a)~u?ize6 zM1YSY3|?2Iw<2_=sm{zC9lcaBC+3J*EK~giY!6W^0E1NN`3S)2sxv!6XJY~f-&VXs zurs^73D^$wDH2cud`qw_6p>oJ|06^Ppr2lALY}V#K98{X$`0Try|2PfeDapAz|-D} zu{3At51_*HZxXdLv{M~5z!Sb_Ujn^w-&mQV?TvKQ&r(Kvhrx@miLM@41RU?{Cvko8 zb#&Vr7=&F=U4oro9PQ{(Ep|jI2R5_<0rfyPw>@$0q~tM=0ju5JY!7p6v*k0Z4}Q840F`aLx$x^0N7>lNbKC=D6Mln4N|Vx zpv1S%5hF^1FuJ=E@Oz2|yXkegqyF`Jy#>3hF3JMnqZIA?Wi>F@^LGK5?3x40N#4KK zsBIT)zy38w|1Y42+6=}ns>bWzQIj>-Qma^Fuw)Nuwjq*|fcN!zIWW)nY>Ee?)B&d? zpzTg%|DGWF#t-!4Cp{z;Bn1)KB_g}9YX`5)(1bW#M4D753a0>IjJezxGePSIvNu0u z5d)myugrshIJpv7VvI==#0c!<3+yzy+4+E!@{PZuH3{f#k)i^w)$GWIJ|*rA8r zT7skz*oNL5fH?U?|8 z(LkLs=A4#lpuH0S&fwq=?1hlmSZ7ur{3frcbB%0k+y#Ki*?= zHvc_`yfiMZq`w#FiQVSzjeQ&QM5M{5W3a2XO6<|Kg`T%x)ail!B!2|(88BA@&i5N* z#$tDse+FI>kuCb;igU4tC0`YhI-gC2`dACR6NKxPe*g_2;Ss04lK%hz002ovPDHLk FV1mE^XYBw0 literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/layout/fragment_overview.xml b/android_app/app/src/main/res/layout/fragment_overview.xml index 1ec1cb908..539d2a614 100644 --- a/android_app/app/src/main/res/layout/fragment_overview.xml +++ b/android_app/app/src/main/res/layout/fragment_overview.xml @@ -30,7 +30,7 @@ @@ -74,7 +74,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -375,7 +731,7 @@ Daten
ist ausgeschaltet ist eingeschaltet - Bauchumfang + Taillenumfang Hüftumfang Dein Hüftumfang war Dein Bauchumfang war + Kann den Wert nicht evaluieren + Taille-zu-Größe Verhältnis + Taille-Hüft Verhältnis \ No newline at end of file diff --git a/android_app/app/src/main/res/values-ja/strings.xml b/android_app/app/src/main/res/values-ja/strings.xml index fbffe9536..ac322c6ad 100644 --- a/android_app/app/src/main/res/values-ja/strings.xml +++ b/android_app/app/src/main/res/values-ja/strings.xml @@ -93,4 +93,7 @@ 腰囲 あなたは胴囲が あなたは腰囲が + 値を評価することはできません + 腰と高さの比 + ウエストヒップ比 \ No newline at end of file diff --git a/android_app/app/src/main/res/values/attrs_linear_gauge_view.xml b/android_app/app/src/main/res/values/attrs_linear_gauge_view.xml new file mode 100644 index 000000000..82cad96fc --- /dev/null +++ b/android_app/app/src/main/res/values/attrs_linear_gauge_view.xml @@ -0,0 +1,4 @@ + + + + diff --git a/android_app/app/src/main/res/values/strings.xml b/android_app/app/src/main/res/values/strings.xml index 326b45a1d..95246a1ea 100644 --- a/android_app/app/src/main/res/values/strings.xml +++ b/android_app/app/src/main/res/values/strings.xml @@ -27,6 +27,8 @@ Waist circumference Hip circumference Comment + Waist-to-height ratio + Waist-hip ratio days measures @@ -91,6 +93,7 @@ Bluetooth connection not established Enter your name No user exist! Please create a new user in the settings + Can\'t evaluate the value Do you really want to delete all database entries? Do you really want to delete the user?