From 4592d35cc672e6b157676aa78285c40cce3f665f Mon Sep 17 00:00:00 2001 From: Pavel Elagin Date: Thu, 6 Sep 2018 16:07:48 +0300 Subject: [PATCH] Calculation and display of weekly balance by steps and time of sleep. --- .../charts/AbstractWeekChartFragment.java | 18 +++++++++---- .../charts/WeekSleepChartFragment.java | 25 ++++++++++++++++++- .../charts/WeekStepsChartFragment.java | 15 +++++++++++ .../layout-land/fragment_weeksteps_chart.xml | 24 ++++++++++++------ .../res/layout/fragment_weeksteps_chart.xml | 8 ++++-- app/src/main/res/values-ru/strings.xml | 5 ++++ app/src/main/res/values/strings.xml | 5 ++++ 7 files changed, 85 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java index 4fb76c56e..1fc3dce75 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java @@ -23,6 +23,7 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.TextView; import com.github.mikephil.charting.charts.BarChart; import com.github.mikephil.charting.charts.PieChart; @@ -56,12 +57,15 @@ import nodomain.freeyourgadget.gadgetbridge.util.LimitedQueue; public abstract class AbstractWeekChartFragment extends AbstractChartFragment { protected static final Logger LOG = LoggerFactory.getLogger(AbstractWeekChartFragment.class); + protected final int TOTAL_DAYS = 7; private Locale mLocale; - private int mTargetValue = 0; + protected int mTargetValue = 0; + protected long mBalance = 0; private PieChart mTodayPieChart; private BarChart mWeekChart; + private TextView mBalanceView; private int mOffsetHours = getOffsetHours(); @@ -93,15 +97,16 @@ public abstract class AbstractWeekChartFragment extends AbstractChartFragment { protected void renderCharts() { mWeekChart.invalidate(); mTodayPieChart.invalidate(); + mBalanceView.setText(getBalance()); } private DefaultChartsData refreshWeekBeforeData(DBHandler db, BarChart barChart, Calendar day, GBDevice device) { day = (Calendar) day.clone(); // do not modify the caller's argument - day.add(Calendar.DATE, -7); + day.add(Calendar.DATE, -TOTAL_DAYS); List entries = new ArrayList<>(); ArrayList labels = new ArrayList(); - for (int counter = 0; counter < 7; counter++) { + for (int counter = 0; counter < TOTAL_DAYS; counter++) { ActivityAmounts amounts = getActivityAmountsForDay(db, day, device); entries.add(new BarEntry(counter, getTotalsForActivityAmounts(amounts))); @@ -177,8 +182,9 @@ public abstract class AbstractWeekChartFragment extends AbstractChartFragment { mTargetValue = goal; } - mTodayPieChart = (PieChart) rootView.findViewById(R.id.todaystepschart); - mWeekChart = (BarChart) rootView.findViewById(R.id.weekstepschart); + mTodayPieChart = rootView.findViewById(R.id.todaystepschart); + mWeekChart = rootView.findViewById(R.id.weekstepschart); + mBalanceView = rootView.findViewById(R.id.balance); setupWeekChart(); setupTodayPieChart(); @@ -324,4 +330,6 @@ public abstract class AbstractWeekChartFragment extends AbstractChartFragment { abstract int[] getColors(); abstract String getPieDescription(int targetValue); + + abstract String getBalance(); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java index a3c44c250..b30952dc4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java @@ -58,6 +58,20 @@ public class WeekSleepChartFragment extends AbstractWeekChartFragment { return -12; } + @Override + String getBalance() { + final long balance = this.mBalance; + this.mBalance = 0; + if (balance > 0) { + final long totalBalance = balance - (mTargetValue * TOTAL_DAYS); + if (totalBalance > 0) + return getString(R.string.overslept, getHM((int) totalBalance)); + else + return getString(R.string.lack_of_sleep, getHM((int) Math.abs(totalBalance))); + } else + return getString(R.string.no_data); + } + @Override float[] getTotalsForActivityAmounts(ActivityAmounts activityAmounts) { long totalSecondsDeepSleep = 0; @@ -69,7 +83,10 @@ public class WeekSleepChartFragment extends AbstractWeekChartFragment { totalSecondsLightSleep += amount.getTotalSeconds(); } } - return new float[]{(int) (totalSecondsDeepSleep / 60), (int) (totalSecondsLightSleep / 60)}; + int totalMinutesDeepSleep = (int) (totalSecondsDeepSleep / 60); + int totalMinutesLightSleep = (int) (totalSecondsLightSleep / 60); + mBalance = mBalance + totalMinutesDeepSleep + totalMinutesLightSleep; + return new float[]{totalMinutesDeepSleep, totalMinutesLightSleep}; } @Override @@ -136,4 +153,10 @@ public class WeekSleepChartFragment extends AbstractWeekChartFragment { chart.getLegend().setWordWrapEnabled(true); chart.getLegend().setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER); } + + private String getHM(int value) { + int hours = value / 60; + int minutes = value % 60; + return String.format("%d:%02d", hours, minutes); + } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekStepsChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekStepsChartFragment.java index 32be63c45..905e31f50 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekStepsChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekStepsChartFragment.java @@ -54,6 +54,7 @@ public class WeekStepsChartFragment extends AbstractWeekChartFragment { for (ActivityAmount amount : activityAmounts.getAmounts()) { totalSteps += amount.getTotalSteps(); amount.getTotalSteps(); + mBalance = mBalance + totalSteps; } return new float[]{totalSteps}; } @@ -93,4 +94,18 @@ public class WeekStepsChartFragment extends AbstractWeekChartFragment { // no legend here, it is all about the steps here chart.getLegend().setEnabled(false); } + + @Override + String getBalance() { + final long balance = this.mBalance; + this.mBalance = 0; + if (balance > 0) { + final long totalBalance = balance - (mTargetValue * TOTAL_DAYS); + if (totalBalance > 0) + return getString(R.string.overstep, (int) Math.abs(totalBalance)); + else + return getString(R.string.lack_of_step, (int) Math.abs(totalBalance)); + } else + return getString(R.string.no_data); + } } diff --git a/app/src/main/res/layout-land/fragment_weeksteps_chart.xml b/app/src/main/res/layout-land/fragment_weeksteps_chart.xml index ddd9355df..246a55b69 100644 --- a/app/src/main/res/layout-land/fragment_weeksteps_chart.xml +++ b/app/src/main/res/layout-land/fragment_weeksteps_chart.xml @@ -4,18 +4,28 @@ tools:context="nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsActivity$PlaceholderFragment" android:orientation="horizontal"> - - + + + + + + diff --git a/app/src/main/res/layout/fragment_weeksteps_chart.xml b/app/src/main/res/layout/fragment_weeksteps_chart.xml index 260b249cd..b51b1428a 100644 --- a/app/src/main/res/layout/fragment_weeksteps_chart.xml +++ b/app/src/main/res/layout/fragment_weeksteps_chart.xml @@ -5,17 +5,21 @@ tools:context="nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsActivity$PlaceholderFragment" android:orientation="vertical"> + + + android:layout_weight="20" /> diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 24b8aec5a..9d4b628fb 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -253,6 +253,8 @@ Сон сегодня, цель: %1$s Шагов в неделю Ваши активность и сон + Недосып: %1$s + Пересып: %1$s Обновление прошивки… Файл не может быть установлен, устройство не готово. %1$s: %2$s %3$s @@ -273,6 +275,8 @@ Расстояние Жизненная активность Шагов сегодня, цель: %1$s + Недопройдено %1$d шагов. + Пройдено на %1$d шагов больше. Не подтверждать передачу данных об активности Если данные об активности не будут переданы на устройство, оно не будет очищено. Полезно, если GB используется с другими приложениями. Хранить данные о деятельности на Mi Band, даже после синхронизации. Полезно, если Mi Band используется совместно с другими приложениями. @@ -600,6 +604,7 @@ Поделиться лог-файлом Файлы журнала Gadgetbridge могут содержать личную информацию, например уникальные идентификаторы: (устройство, MAC-адрес), предпочтения в музыке и т.д. Рассмотрите возможность редактирования файла и удаления этой информации перед отправкой файла общедоступное место. Внимание! + Нет данных Минимальный интервал между уведомлениями Без ограничений diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 63db94ef8..d4e5f6135 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -356,6 +356,8 @@ Sleep today, target: %1$s Steps per week Your activity and sleep + Lack of sleep: %1$s + Overslept: %1$s Flashing firmware… File cannot be installed, device not ready. %1$s: %2$s %3$s @@ -390,6 +392,8 @@ Live activity Steps today, target: %1$s + Lack of step: %1$d + Overstep: %1$d Do not ACK activity data transfer If the activity data are not acked to the band, they will not be cleared. Useful if GB is used together with other apps. Will keep activity data on the Mi Band even after synchronization. Useful if GB is used together with other apps. @@ -652,6 +656,7 @@ Share log Please keep in mind Gadgetbridge log files may contain lots of personal information, including but not limited to health data, unique identifiers (such as a device MAC address), music preferences, etc. Consider editing the file and removing this information before sending the file to a public issue report. Warning! + No data LED Color