From 48b94f771db1868a400624fde24e323ae0970f32 Mon Sep 17 00:00:00 2001 From: OliE Date: Sat, 8 Apr 2017 19:12:57 +0200 Subject: [PATCH] - add statistics fragment --- .../health/openscale/gui/MainActivity.java | 34 +- .../gui/fragments/OverviewFragment.java | 275 +-------------- .../gui/fragments/StatisticsFragment.java | 318 ++++++++++++++++++ .../res/layout-large/fragment_overview.xml | 244 -------------- .../src/main/res/layout/fragment_graph.xml | 3 +- .../src/main/res/layout/fragment_overview.xml | 254 -------------- .../main/res/layout/fragment_statistics.xml | 269 +++++++++++++++ .../app/src/main/res/values-de/strings.xml | 3 +- .../app/src/main/res/values-fr/strings.xml | 3 +- .../app/src/main/res/values-ja/strings.xml | 3 +- .../app/src/main/res/values/strings.xml | 3 +- 11 files changed, 633 insertions(+), 776 deletions(-) create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/fragments/StatisticsFragment.java create mode 100644 android_app/app/src/main/res/layout/fragment_statistics.xml 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 cf4ed885..ce6c5cdf 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 @@ -46,6 +46,7 @@ import com.health.openscale.gui.activities.SettingsActivity; import com.health.openscale.gui.activities.UserSettingsActivity; import com.health.openscale.gui.fragments.GraphFragment; import com.health.openscale.gui.fragments.OverviewFragment; +import com.health.openscale.gui.fragments.StatisticsFragment; import com.health.openscale.gui.fragments.TableFragment; import java.util.Locale; @@ -282,6 +283,7 @@ public class MainActivity extends ActionBarActivity implements private OverviewFragment overviewFrag; private GraphFragment graphFrag; private TableFragment tableFrag; + private StatisticsFragment statisticsFrag; public SectionsPagerAdapter(FragmentManager fm) { super(fm); @@ -289,6 +291,7 @@ public class MainActivity extends ActionBarActivity implements overviewFrag = new OverviewFragment(); graphFrag = new GraphFragment(); tableFrag = new TableFragment(); + statisticsFrag = new StatisticsFragment(); } @Override @@ -298,12 +301,14 @@ public class MainActivity extends ActionBarActivity implements // below). switch (position) { - case 0: - return overviewFrag; - case 1: - return graphFrag; - case 2: - return tableFrag; + case 0: + return overviewFrag; + case 1: + return graphFrag; + case 2: + return tableFrag; + case 3: + return statisticsFrag; } return null; @@ -311,19 +316,21 @@ public class MainActivity extends ActionBarActivity implements @Override public int getCount() { - return 3; + return 4; } @Override public CharSequence getPageTitle(int position) { Locale l = Locale.getDefault(); switch (position) { - case 0: - return getString(R.string.title_overview).toUpperCase(l); - case 1: - return getString(R.string.title_graph).toUpperCase(l); - case 2: - return getString(R.string.title_frag).toUpperCase(l); + case 0: + return getString(R.string.title_overview).toUpperCase(l); + case 1: + return getString(R.string.title_graph).toUpperCase(l); + case 2: + return getString(R.string.title_table).toUpperCase(l); + case 3: + return getString(R.string.title_statistics).toUpperCase(l); } return null; } @@ -340,6 +347,7 @@ public class MainActivity extends ActionBarActivity implements tableFrag = new TableFragment(); graphFrag = new GraphFragment(); overviewFrag = new OverviewFragment(); + statisticsFrag = new StatisticsFragment(); } } } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/fragments/OverviewFragment.java b/android_app/app/src/main/java/com/health/openscale/gui/fragments/OverviewFragment.java index 5f0dca6e..0f8cbf0f 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/fragments/OverviewFragment.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/fragments/OverviewFragment.java @@ -23,7 +23,6 @@ import android.graphics.Color; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v4.app.Fragment; -import android.text.Html; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -36,7 +35,6 @@ import android.widget.Toast; import com.health.openscale.R; import com.health.openscale.core.OpenScale; -import com.health.openscale.core.datatypes.ScaleCalculator; import com.health.openscale.core.datatypes.ScaleData; import com.health.openscale.core.datatypes.ScaleUser; import com.health.openscale.gui.activities.DataEntryActivity; @@ -78,27 +76,11 @@ public class OverviewFragment extends Fragment implements FragmentUpdateListener private TextView txtTitleUser; private TextView txtTitleLastMeasurement; - private TextView txtTitleGoal; - private TextView txtTitleStatistics; private TableLayout tableOverviewLayout; private ArrayList overviewMeasurements; - private TextView txtGoalWeight; - private TextView txtGoalDiff; - private TextView txtGoalDayLeft; - - private TextView txtAvgWeek; - private TextView txtAvgMonth; - - private TextView txtLabelGoalWeight; - private TextView txtLabelGoalDiff; - private TextView txtLabelDayLeft; - - private TextView txtLabelAvgWeek; - private TextView txtLabelAvgMonth; - private PieChartView pieChartLast; private LineChartView lineChartLast; @@ -131,8 +113,6 @@ public class OverviewFragment extends Fragment implements FragmentUpdateListener txtTitleUser = (TextView) overviewView.findViewById(R.id.txtTitleUser); txtTitleLastMeasurement = (TextView) overviewView.findViewById(R.id.txtTitleLastMeasurment); - txtTitleGoal = (TextView) overviewView.findViewById(R.id.txtTitleGoal); - txtTitleStatistics = (TextView) overviewView.findViewById(R.id.txtTitleStatistics); tableOverviewLayout = (TableLayout)overviewView.findViewById(R.id.tableLayoutMeasurements); @@ -152,20 +132,6 @@ public class OverviewFragment extends Fragment implements FragmentUpdateListener tableOverviewLayout.addView(measuremt); } - txtGoalWeight = (TextView) overviewView.findViewById(R.id.txtGoalWeight); - txtGoalDiff = (TextView) overviewView.findViewById(R.id.txtGoalDiff); - txtGoalDayLeft = (TextView) overviewView.findViewById(R.id.txtGoalDayLeft); - - txtAvgWeek = (TextView) overviewView.findViewById(R.id.txtAvgWeek); - txtAvgMonth = (TextView) overviewView.findViewById(R.id.txtAvgMonth); - - txtLabelGoalWeight = (TextView) overviewView.findViewById(R.id.txtLabelGoalWeight); - txtLabelGoalDiff = (TextView) overviewView.findViewById(R.id.txtLabelGoalDiff); - txtLabelDayLeft = (TextView) overviewView.findViewById(R.id.txtLabelDayLeft); - - txtLabelAvgWeek = (TextView) overviewView.findViewById(R.id.txtLabelAvgWeek); - txtLabelAvgMonth = (TextView) overviewView.findViewById(R.id.txtLabelAvgMonth); - pieChartLast = (PieChartView) overviewView.findViewById(R.id.pieChartLast); lineChartLast = (LineChartView) overviewView.findViewById(R.id.lineChartLast); @@ -216,14 +182,26 @@ public class OverviewFragment extends Fragment implements FragmentUpdateListener 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(); updateLastPieChart(); updateLastLineChart(scaleDataList); - updateGoal(scaleDataList); - updateStatistics(scaleDataList); + + ListIterator scaleDataIterator = scaleDataList.listIterator(); + + while(scaleDataIterator.hasNext()) { + ScaleData scaleData = scaleDataIterator.next(); + + if (scaleData.id == lastScaleData.id) { + if (scaleDataIterator.hasNext()) { + ScaleData diffScaleData = scaleDataIterator.next(); + + for (MeasurementView measuremt : overviewMeasurements) { + measuremt.updateDiff(lastScaleData, diffScaleData); + } + } + } + } for (MeasurementView measuremt : overviewMeasurements) { measuremt.updatePreferences(prefs); @@ -256,227 +234,6 @@ public class OverviewFragment extends Fragment implements FragmentUpdateListener spinUser.setSelection(posUser, true); } - private void updateGoal(ArrayList scaleDataList) { - txtGoalWeight.setText(currentScaleUser.goal_weight + " " + ScaleUser.UNIT_STRING[currentScaleUser.scale_unit]); - - double weight_diff = currentScaleUser.goal_weight - lastScaleData.weight; - txtGoalDiff.setText(String.format("%.1f " + ScaleUser.UNIT_STRING[currentScaleUser.scale_unit], weight_diff)); - - Calendar goalDate = Calendar.getInstance(); - Calendar curDate = Calendar.getInstance(); - goalDate.setTime(currentScaleUser.goal_date); - - long days = daysBetween(curDate, goalDate); - txtGoalDayLeft.setText(days + " " + getResources().getString(R.string.label_days)); - - ScaleCalculator currentCalculator = new ScaleCalculator(lastScaleData); - - ScaleData goalData = new ScaleData(); - goalData.weight = currentScaleUser.goal_weight; - ScaleCalculator goalCalculator = new ScaleCalculator(goalData); - - txtLabelGoalWeight.setText( - Html.fromHtml( - getResources().getString(R.string.label_goal_weight) + - "
" + - getResources().getString(R.string.label_bmi) + - ": " + - String.format("%.1f", goalCalculator.getBMI(currentScaleUser.body_height)) + - " " - ) - ); - txtLabelGoalDiff.setText( - Html.fromHtml( - getResources().getString(R.string.label_weight_difference) + - "
" + - getResources().getString(R.string.label_bmi) + - ": " + - String.format("%.1f", currentCalculator.getBMI(currentScaleUser.body_height) - goalCalculator.getBMI(currentScaleUser.body_height)) + - " " - ) - ); - 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 - - ListIterator scaleDataIterator = scaleDataList.listIterator(); - - while(scaleDataIterator.hasNext()) { - ScaleData scaleData = scaleDataIterator.next(); - - if (scaleData.id == lastScaleData.id) { - if (scaleDataIterator.hasNext()) { - ScaleData diffScaleData = scaleDataIterator.next(); - - for (MeasurementView measuremt : overviewMeasurements) { - measuremt.updateDiff(lastScaleData, diffScaleData); - } - } - } - } - - - } - - private void updateStatistics(ArrayList scaleDataList) { - Calendar histDate = Calendar.getInstance(); - Calendar weekPastDate = Calendar.getInstance(); - Calendar monthPastDate = Calendar.getInstance(); - - weekPastDate.setTime(lastScaleData.date_time); - weekPastDate.add(Calendar.DATE, -7); - - monthPastDate.setTime(lastScaleData.date_time); - monthPastDate.add(Calendar.DATE, -30); - - int weekSize = 0; - float weekAvgWeight = 0; - float weekAvgBMI = 0; - float weekAvgFat = 0; - float weekAvgWater = 0; - float weekAvgMuscle = 0; - float weekAvgWaist = 0; - float weekAvgWHtR = 0; - float weekAvgHip = 0; - float weekAvgWHR = 0; - - int monthSize = 0; - float monthAvgWeight = 0; - float monthAvgBMI = 0; - float monthAvgFat = 0; - float monthAvgWater = 0; - float monthAvgMuscle = 0; - float monthAvgWaist = 0; - float monthAvgWHtR = 0; - float monthAvgHip = 0; - float monthAvgWHR = 0; - - for (ScaleData scaleData : scaleDataList) - { - histDate.setTime(scaleData.date_time); - - ScaleCalculator calculator = new ScaleCalculator(scaleData); - - if (weekPastDate.before(histDate)) { - weekSize++; - - weekAvgWeight += scaleData.weight; - weekAvgBMI += calculator.getBMI(currentScaleUser.body_height); - weekAvgFat += scaleData.fat; - weekAvgWater += scaleData.water; - weekAvgMuscle += scaleData.muscle; - weekAvgWaist += scaleData.waist; - weekAvgHip += scaleData.hip; - weekAvgWHtR += calculator.getWHtR(currentScaleUser.body_height); - weekAvgWHR += calculator.getWHR(); - } - - if (monthPastDate.before(histDate)) { - monthSize++; - - monthAvgWeight += scaleData.weight; - monthAvgBMI += calculator.getBMI(currentScaleUser.body_height); - monthAvgFat += scaleData.fat; - monthAvgWater += scaleData.water; - monthAvgMuscle += scaleData.muscle; - monthAvgWaist += scaleData.waist; - monthAvgHip += scaleData.hip; - monthAvgWHtR += calculator.getWHtR(currentScaleUser.body_height); - monthAvgWHR += calculator.getWHR(); - } else { - break; - } - } - - weekAvgWeight /= weekSize; - weekAvgBMI /= weekSize; - weekAvgFat /= weekSize; - weekAvgWater /= weekSize; - weekAvgMuscle /= weekSize; - weekAvgWaist /= weekSize; - weekAvgWHtR /= weekSize; - weekAvgHip /= weekSize; - weekAvgWHR /= weekSize; - - monthAvgWeight /= monthSize; - monthAvgBMI /= monthSize; - monthAvgFat /= monthSize; - monthAvgWater /= monthSize; - monthAvgMuscle /= monthSize; - monthAvgWaist /= monthSize; - monthAvgWHtR /= monthSize; - monthAvgHip /= monthSize; - monthAvgWHR /= monthSize; - - String info_week = new String(); - String info_month = new String(); - - int lines = 1; - - info_week += String.format("Ø-"+getResources().getString(R.string.label_weight)+": %.1f" + ScaleUser.UNIT_STRING[currentScaleUser.scale_unit] + "
", weekAvgWeight); - info_month += String.format("Ø-"+getResources().getString(R.string.label_weight)+": %.1f" + ScaleUser.UNIT_STRING[currentScaleUser.scale_unit] + "
", monthAvgWeight); - lines++; - - info_week += String.format("Ø-"+getResources().getString(R.string.label_bmi)+": %.1f
", weekAvgBMI); - info_month += String.format("Ø-"+getResources().getString(R.string.label_bmi)+": %.1f
", monthAvgBMI); - lines++; - - if(prefs.getBoolean("fatEnable", true)) { - info_week += String.format("Ø-"+getResources().getString(R.string.label_fat)+": %.1f%%
", weekAvgFat); - info_month += String.format("Ø-"+getResources().getString(R.string.label_fat)+": %.1f%%
", monthAvgFat); - lines++; - } - - if(prefs.getBoolean("muscleEnable", true)) { - info_week += String.format("Ø-"+getResources().getString(R.string.label_muscle)+": %.1f%%
", weekAvgMuscle); - info_month += String.format("Ø-"+getResources().getString(R.string.label_muscle)+": %.1f%%
", monthAvgMuscle); - lines++; - } - - if(prefs.getBoolean("waterEnable", true)) { - info_week += String.format("Ø-"+getResources().getString(R.string.label_water)+": %.1f%%
", weekAvgWater); - info_month += String.format("Ø-"+getResources().getString(R.string.label_water)+": %.1f%%
", monthAvgWater); - lines++; - } - - if(prefs.getBoolean("waistEnable", false)) { - 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", false)) { - info_week += String.format("Ø-"+getResources().getString(R.string.label_hip)+": %.1fcm
", weekAvgHip); - info_month += String.format("Ø-"+getResources().getString(R.string.label_hip)+": %.1fcm
",monthAvgHip); - lines++; - } - - if(prefs.getBoolean("hipEnable", false) && prefs.getBoolean("waistEnable", false)) { - 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); - - txtLabelAvgWeek.setText(Html.fromHtml(getResources().getString(R.string.label_last_week) + "
" + info_week + "")); - txtLabelAvgMonth.setText(Html.fromHtml(getResources().getString(R.string.label_last_month) + "
" + info_month + "")); - - txtAvgWeek.setText(weekSize + " " + getResources().getString(R.string.label_measures)); - txtAvgMonth.setText(monthSize + " " + getResources().getString(R.string.label_measures)); - } private void updateLastLineChart(ArrayList scaleDataList) { List axisValues = new ArrayList(); diff --git a/android_app/app/src/main/java/com/health/openscale/gui/fragments/StatisticsFragment.java b/android_app/app/src/main/java/com/health/openscale/gui/fragments/StatisticsFragment.java new file mode 100644 index 00000000..0e67fb8a --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/fragments/StatisticsFragment.java @@ -0,0 +1,318 @@ +/* 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.fragments; + +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.support.v4.app.Fragment; +import android.text.Html; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.health.openscale.R; +import com.health.openscale.core.OpenScale; +import com.health.openscale.core.datatypes.ScaleCalculator; +import com.health.openscale.core.datatypes.ScaleData; +import com.health.openscale.core.datatypes.ScaleUser; + +import java.text.DateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.concurrent.TimeUnit; + +public class StatisticsFragment extends Fragment implements FragmentUpdateListener { + + private View statisticsView; + + private TextView txtTitleGoal; + private TextView txtTitleStatistics; + + private TextView txtGoalWeight; + private TextView txtGoalDiff; + private TextView txtGoalDayLeft; + + private TextView txtAvgWeek; + private TextView txtAvgMonth; + + private TextView txtLabelGoalWeight; + private TextView txtLabelGoalDiff; + private TextView txtLabelDayLeft; + + private TextView txtLabelAvgWeek; + private TextView txtLabelAvgMonth; + + private SharedPreferences prefs; + private ScaleUser currentScaleUser; + private ScaleData lastScaleData; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + statisticsView = inflater.inflate(R.layout.fragment_statistics, container, false); + + txtTitleGoal = (TextView) statisticsView.findViewById(R.id.txtTitleGoal); + txtTitleStatistics = (TextView) statisticsView.findViewById(R.id.txtTitleStatistics); + + txtGoalWeight = (TextView) statisticsView.findViewById(R.id.txtGoalWeight); + txtGoalDiff = (TextView) statisticsView.findViewById(R.id.txtGoalDiff); + txtGoalDayLeft = (TextView) statisticsView.findViewById(R.id.txtGoalDayLeft); + + txtAvgWeek = (TextView) statisticsView.findViewById(R.id.txtAvgWeek); + txtAvgMonth = (TextView) statisticsView.findViewById(R.id.txtAvgMonth); + + txtLabelGoalWeight = (TextView) statisticsView.findViewById(R.id.txtLabelGoalWeight); + txtLabelGoalDiff = (TextView) statisticsView.findViewById(R.id.txtLabelGoalDiff); + txtLabelDayLeft = (TextView) statisticsView.findViewById(R.id.txtLabelDayLeft); + + txtLabelAvgWeek = (TextView) statisticsView.findViewById(R.id.txtLabelAvgWeek); + txtLabelAvgMonth = (TextView) statisticsView.findViewById(R.id.txtLabelAvgMonth); + + OpenScale.getInstance(statisticsView.getContext()).registerFragment(this); + + return statisticsView; + } + + @Override + public void updateOnView(ArrayList scaleDataList) { + if (scaleDataList.isEmpty()) { + lastScaleData = new ScaleData(); + } else { + lastScaleData = scaleDataList.get(0); + } + + txtTitleGoal.setText(getResources().getString(R.string.label_title_goal).toUpperCase()); + txtTitleStatistics.setText(getResources().getString(R.string.label_title_statistics).toUpperCase()); + + prefs = PreferenceManager.getDefaultSharedPreferences(statisticsView.getContext()); + currentScaleUser = OpenScale.getInstance(statisticsView.getContext()).getSelectedScaleUser(); + + updateStatistics(scaleDataList); + updateGoal(scaleDataList); + } + + private void updateGoal(ArrayList scaleDataList) { + txtGoalWeight.setText(currentScaleUser.goal_weight + " " + ScaleUser.UNIT_STRING[currentScaleUser.scale_unit]); + + double weight_diff = currentScaleUser.goal_weight - lastScaleData.weight; + txtGoalDiff.setText(String.format("%.1f " + ScaleUser.UNIT_STRING[currentScaleUser.scale_unit], weight_diff)); + + Calendar goalDate = Calendar.getInstance(); + Calendar curDate = Calendar.getInstance(); + goalDate.setTime(currentScaleUser.goal_date); + + long days = daysBetween(curDate, goalDate); + txtGoalDayLeft.setText(days + " " + getResources().getString(R.string.label_days)); + + ScaleCalculator currentCalculator = new ScaleCalculator(lastScaleData); + + ScaleData goalData = new ScaleData(); + goalData.weight = currentScaleUser.goal_weight; + ScaleCalculator goalCalculator = new ScaleCalculator(goalData); + + txtLabelGoalWeight.setText( + Html.fromHtml( + getResources().getString(R.string.label_goal_weight) + + "
" + + getResources().getString(R.string.label_bmi) + + ": " + + String.format("%.1f", goalCalculator.getBMI(currentScaleUser.body_height)) + + " " + ) + ); + txtLabelGoalDiff.setText( + Html.fromHtml( + getResources().getString(R.string.label_weight_difference) + + "
" + + getResources().getString(R.string.label_bmi) + + ": " + + String.format("%.1f", currentCalculator.getBMI(currentScaleUser.body_height) - goalCalculator.getBMI(currentScaleUser.body_height)) + + " " + ) + ); + 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 + } + + private void updateStatistics(ArrayList scaleDataList) { + Calendar histDate = Calendar.getInstance(); + Calendar weekPastDate = Calendar.getInstance(); + Calendar monthPastDate = Calendar.getInstance(); + + weekPastDate.setTime(lastScaleData.date_time); + weekPastDate.add(Calendar.DATE, -7); + + monthPastDate.setTime(lastScaleData.date_time); + monthPastDate.add(Calendar.DATE, -30); + + int weekSize = 0; + float weekAvgWeight = 0; + float weekAvgBMI = 0; + float weekAvgFat = 0; + float weekAvgWater = 0; + float weekAvgMuscle = 0; + float weekAvgWaist = 0; + float weekAvgWHtR = 0; + float weekAvgHip = 0; + float weekAvgWHR = 0; + + int monthSize = 0; + float monthAvgWeight = 0; + float monthAvgBMI = 0; + float monthAvgFat = 0; + float monthAvgWater = 0; + float monthAvgMuscle = 0; + float monthAvgWaist = 0; + float monthAvgWHtR = 0; + float monthAvgHip = 0; + float monthAvgWHR = 0; + + for (ScaleData scaleData : scaleDataList) + { + histDate.setTime(scaleData.date_time); + + ScaleCalculator calculator = new ScaleCalculator(scaleData); + + if (weekPastDate.before(histDate)) { + weekSize++; + + weekAvgWeight += scaleData.weight; + weekAvgBMI += calculator.getBMI(currentScaleUser.body_height); + weekAvgFat += scaleData.fat; + weekAvgWater += scaleData.water; + weekAvgMuscle += scaleData.muscle; + weekAvgWaist += scaleData.waist; + weekAvgHip += scaleData.hip; + weekAvgWHtR += calculator.getWHtR(currentScaleUser.body_height); + weekAvgWHR += calculator.getWHR(); + } + + if (monthPastDate.before(histDate)) { + monthSize++; + + monthAvgWeight += scaleData.weight; + monthAvgBMI += calculator.getBMI(currentScaleUser.body_height); + monthAvgFat += scaleData.fat; + monthAvgWater += scaleData.water; + monthAvgMuscle += scaleData.muscle; + monthAvgWaist += scaleData.waist; + monthAvgHip += scaleData.hip; + monthAvgWHtR += calculator.getWHtR(currentScaleUser.body_height); + monthAvgWHR += calculator.getWHR(); + } else { + break; + } + } + + weekAvgWeight /= weekSize; + weekAvgBMI /= weekSize; + weekAvgFat /= weekSize; + weekAvgWater /= weekSize; + weekAvgMuscle /= weekSize; + weekAvgWaist /= weekSize; + weekAvgWHtR /= weekSize; + weekAvgHip /= weekSize; + weekAvgWHR /= weekSize; + + monthAvgWeight /= monthSize; + monthAvgBMI /= monthSize; + monthAvgFat /= monthSize; + monthAvgWater /= monthSize; + monthAvgMuscle /= monthSize; + monthAvgWaist /= monthSize; + monthAvgWHtR /= monthSize; + monthAvgHip /= monthSize; + monthAvgWHR /= monthSize; + + String info_week = new String(); + String info_month = new String(); + + int lines = 1; + + info_week += String.format("Ø-"+getResources().getString(R.string.label_weight)+": %.1f" + ScaleUser.UNIT_STRING[currentScaleUser.scale_unit] + "
", weekAvgWeight); + info_month += String.format("Ø-"+getResources().getString(R.string.label_weight)+": %.1f" + ScaleUser.UNIT_STRING[currentScaleUser.scale_unit] + "
", monthAvgWeight); + lines++; + + info_week += String.format("Ø-"+getResources().getString(R.string.label_bmi)+": %.1f
", weekAvgBMI); + info_month += String.format("Ø-"+getResources().getString(R.string.label_bmi)+": %.1f
", monthAvgBMI); + lines++; + + if(prefs.getBoolean("fatEnable", true)) { + info_week += String.format("Ø-"+getResources().getString(R.string.label_fat)+": %.1f%%
", weekAvgFat); + info_month += String.format("Ø-"+getResources().getString(R.string.label_fat)+": %.1f%%
", monthAvgFat); + lines++; + } + + if(prefs.getBoolean("muscleEnable", true)) { + info_week += String.format("Ø-"+getResources().getString(R.string.label_muscle)+": %.1f%%
", weekAvgMuscle); + info_month += String.format("Ø-"+getResources().getString(R.string.label_muscle)+": %.1f%%
", monthAvgMuscle); + lines++; + } + + if(prefs.getBoolean("waterEnable", true)) { + info_week += String.format("Ø-"+getResources().getString(R.string.label_water)+": %.1f%%
", weekAvgWater); + info_month += String.format("Ø-"+getResources().getString(R.string.label_water)+": %.1f%%
", monthAvgWater); + lines++; + } + + if(prefs.getBoolean("waistEnable", false)) { + 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", false)) { + info_week += String.format("Ø-"+getResources().getString(R.string.label_hip)+": %.1fcm
", weekAvgHip); + info_month += String.format("Ø-"+getResources().getString(R.string.label_hip)+": %.1fcm
",monthAvgHip); + lines++; + } + + if(prefs.getBoolean("hipEnable", false) && prefs.getBoolean("waistEnable", false)) { + 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); + + txtLabelAvgWeek.setText(Html.fromHtml(getResources().getString(R.string.label_last_week) + "
" + info_week + "")); + txtLabelAvgMonth.setText(Html.fromHtml(getResources().getString(R.string.label_last_month) + "
" + info_month + "")); + + txtAvgWeek.setText(weekSize + " " + getResources().getString(R.string.label_measures)); + txtAvgMonth.setText(monthSize + " " + getResources().getString(R.string.label_measures)); + } + + private long daysBetween(Calendar startDate, Calendar endDate) { + long end = endDate.getTimeInMillis(); + long start = startDate.getTimeInMillis(); + return TimeUnit.MILLISECONDS.toDays(Math.abs(end - start)); + } +} diff --git a/android_app/app/src/main/res/layout-large/fragment_overview.xml b/android_app/app/src/main/res/layout-large/fragment_overview.xml index f147421d..781186ac 100644 --- a/android_app/app/src/main/res/layout-large/fragment_overview.xml +++ b/android_app/app/src/main/res/layout-large/fragment_overview.xml @@ -90,250 +90,6 @@ android:id="@+id/tableLayoutMeasurements"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android_app/app/src/main/res/layout/fragment_graph.xml b/android_app/app/src/main/res/layout/fragment_graph.xml index d2b902fc..2f081452 100644 --- a/android_app/app/src/main/res/layout/fragment_graph.xml +++ b/android_app/app/src/main/res/layout/fragment_graph.xml @@ -2,8 +2,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:padding="5dp" - tools:context="com.health.openscale.MainActivity$PlaceholderFragment" > + android:padding="5dp" > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android_app/app/src/main/res/layout/fragment_statistics.xml b/android_app/app/src/main/res/layout/fragment_statistics.xml new file mode 100644 index 00000000..ef4ade76 --- /dev/null +++ b/android_app/app/src/main/res/layout/fragment_statistics.xml @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android_app/app/src/main/res/values-de/strings.xml b/android_app/app/src/main/res/values-de/strings.xml index a89ac6b6..bbed3df6 100644 --- a/android_app/app/src/main/res/values-de/strings.xml +++ b/android_app/app/src/main/res/values-de/strings.xml @@ -73,7 +73,7 @@ Ja Wollen Sie wirklich den Benutzer löschen? Wollen Sie wirklich alle Datenbankeinträge löschen? - Tabelle + Tabelle Diagramm Übersicht Benutzer @@ -117,4 +117,5 @@ Fehler beim Wertebereich Wert ist erforderlich Bearbeiten + Statistiken \ No newline at end of file diff --git a/android_app/app/src/main/res/values-fr/strings.xml b/android_app/app/src/main/res/values-fr/strings.xml index f4a709a3..706358ff 100644 --- a/android_app/app/src/main/res/values-fr/strings.xml +++ b/android_app/app/src/main/res/values-fr/strings.xml @@ -4,7 +4,7 @@ openScale Vue d\'ensemble Diagramme - Tableau + Tableau Utilisateurs Données Mesures @@ -136,4 +136,5 @@ Samedi Dimanche Modifier + Statistiques 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 0c7c8ab2..29c6095c 100644 --- a/android_app/app/src/main/res/values-ja/strings.xml +++ b/android_app/app/src/main/res/values-ja/strings.xml @@ -2,7 +2,7 @@ openScale ユーザー - 早見表 + 早見表 図表 概説 はい @@ -117,4 +117,5 @@ 値が必要です エラー値の範囲 編集 + 統計 \ No newline at end of file diff --git a/android_app/app/src/main/res/values/strings.xml b/android_app/app/src/main/res/values/strings.xml index 0e94665c..d5db89ef 100644 --- a/android_app/app/src/main/res/values/strings.xml +++ b/android_app/app/src/main/res/values/strings.xml @@ -4,7 +4,8 @@ openScale Overview Chart - Table + Table + Statistics Users Data Measurements