mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-08-25 16:50:44 +02:00
Calculation and display of weekly balance by steps and time of sleep.
This commit is contained in:
parent
bf80474b71
commit
4592d35cc6
@ -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<BarData> 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<BarEntry> entries = new ArrayList<>();
|
||||
ArrayList<String> labels = new ArrayList<String>();
|
||||
|
||||
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();
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -4,18 +4,28 @@
|
||||
tools:context="nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsActivity$PlaceholderFragment"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="40"
|
||||
android:orientation="vertical">
|
||||
<TextView
|
||||
android:id="@+id/balance"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
<com.github.mikephil.charting.charts.PieChart
|
||||
android:id="@+id/todaystepschart"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_weight="40">
|
||||
</com.github.mikephil.charting.charts.PieChart>
|
||||
android:layout_weight="40" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<com.github.mikephil.charting.charts.BarChart
|
||||
android:id="@+id/weekstepschart"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
|
||||
android:layout_weight="20" />
|
||||
|
||||
<!--<TextView-->
|
||||
|
@ -5,17 +5,21 @@
|
||||
tools:context="nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsActivity$PlaceholderFragment"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/balance"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
<com.github.mikephil.charting.charts.PieChart
|
||||
android:id="@+id/todaystepschart"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_weight="20"></com.github.mikephil.charting.charts.PieChart>
|
||||
android:layout_weight="20" />
|
||||
|
||||
<com.github.mikephil.charting.charts.BarChart
|
||||
android:id="@+id/weekstepschart"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
|
||||
android:layout_weight="20" />
|
||||
|
||||
</LinearLayout>
|
||||
|
@ -253,6 +253,8 @@
|
||||
<string name="weeksleepchart_today_sleep_description">Сон сегодня, цель: %1$s</string>
|
||||
<string name="weekstepschart_steps_a_week">Шагов в неделю</string>
|
||||
<string name="activity_sleepchart_activity_and_sleep">Ваши активность и сон</string>
|
||||
<string name="lack_of_sleep">Недосып: %1$s</string>
|
||||
<string name="overslept">Пересып: %1$s</string>
|
||||
<string name="updating_firmware">Обновление прошивки…</string>
|
||||
<string name="fwapp_install_device_not_ready">Файл не может быть установлен, устройство не готово.</string>
|
||||
<string name="installhandler_firmware_name">%1$s: %2$s %3$s</string>
|
||||
@ -273,6 +275,8 @@
|
||||
<string name="distance">Расстояние</string>
|
||||
<string name="liveactivity_live_activity">Жизненная активность</string>
|
||||
<string name="weeksteps_today_steps_description">Шагов сегодня, цель: %1$s</string>
|
||||
<string name="lack_of_step">Недопройдено %1$d шагов.</string>
|
||||
<string name="overstep">Пройдено на %1$d шагов больше.</string>
|
||||
<string name="pref_title_dont_ack_transfer">Не подтверждать передачу данных об активности</string>
|
||||
<string name="pref_summary_dont_ack_transfers">Если данные об активности не будут переданы на устройство, оно не будет очищено. Полезно, если GB используется с другими приложениями.</string>
|
||||
<string name="pref_summary_keep_data_on_device">Хранить данные о деятельности на Mi Band, даже после синхронизации. Полезно, если Mi Band используется совместно с другими приложениями.</string>
|
||||
@ -600,6 +604,7 @@
|
||||
<string name="share_log">Поделиться лог-файлом</string>
|
||||
<string name="share_log_warning">Файлы журнала Gadgetbridge могут содержать личную информацию, например уникальные идентификаторы: (устройство, MAC-адрес), предпочтения в музыке и т.д. Рассмотрите возможность редактирования файла и удаления этой информации перед отправкой файла общедоступное место.</string>
|
||||
<string name="warning">Внимание!</string>
|
||||
<string name="no_data">Нет данных</string>
|
||||
|
||||
<string name="pref_title_notifications_timeout">Минимальный интервал между уведомлениями</string>
|
||||
<string name="no_limit">Без ограничений</string>
|
||||
|
@ -356,6 +356,8 @@
|
||||
<string name="weeksleepchart_today_sleep_description">Sleep today, target: %1$s</string>
|
||||
<string name="weekstepschart_steps_a_week">Steps per week</string>
|
||||
<string name="activity_sleepchart_activity_and_sleep">Your activity and sleep</string>
|
||||
<string name="lack_of_sleep">Lack of sleep: %1$s</string>
|
||||
<string name="overslept">Overslept: %1$s</string>
|
||||
<string name="updating_firmware">Flashing firmware…</string>
|
||||
<string name="fwapp_install_device_not_ready">File cannot be installed, device not ready.</string>
|
||||
<string name="installhandler_firmware_name">%1$s: %2$s %3$s</string>
|
||||
@ -390,6 +392,8 @@
|
||||
|
||||
<string name="liveactivity_live_activity">Live activity</string>
|
||||
<string name="weeksteps_today_steps_description">Steps today, target: %1$s</string>
|
||||
<string name="lack_of_step">Lack of step: %1$d</string>
|
||||
<string name="overstep">Overstep: %1$d</string>
|
||||
<string name="pref_title_dont_ack_transfer">Do not ACK activity data transfer</string>
|
||||
<string name="pref_summary_dont_ack_transfers">If the activity data are not acked to the band, they will not be cleared. Useful if GB is used together with other apps.</string>
|
||||
<string name="pref_summary_keep_data_on_device">Will keep activity data on the Mi Band even after synchronization. Useful if GB is used together with other apps.</string>
|
||||
@ -652,6 +656,7 @@
|
||||
<string name="share_log">Share log</string>
|
||||
<string name="share_log_warning">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.</string>
|
||||
<string name="warning">Warning!</string>
|
||||
<string name="no_data">No data</string>
|
||||
|
||||
<!-- LED Color -->
|
||||
<string name="preferences_led_color">LED Color</string>
|
||||
|
Loading…
Reference in New Issue
Block a user