From 354ab792858aa1332c9193ccde4daefaa5acf628 Mon Sep 17 00:00:00 2001 From: Pavel Elagin Date: Thu, 16 Aug 2018 17:59:56 +0300 Subject: [PATCH] Display start and end sleep. #164 --- .../activities/charts/ActivityAnalysis.java | 4 +- .../activities/charts/SleepChartFragment.java | 45 ++++++++++++++++++- .../gadgetbridge/model/ActivityAmount.java | 21 +++++++++ .../gadgetbridge/util/DateTimeUtils.java | 5 +++ .../res/layout-land/fragment_sleepchart.xml | 35 ++++++++++----- .../main/res/layout/fragment_sleepchart.xml | 11 +++-- app/src/main/res/values-ru/strings.xml | 4 +- app/src/main/res/values/strings.xml | 2 + 8 files changed, 109 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivityAnalysis.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivityAnalysis.java index ea53a18b2..93983f994 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivityAnalysis.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivityAnalysis.java @@ -19,7 +19,6 @@ package nodomain.freeyourgadget.gadgetbridge.activities.charts; import java.util.HashMap; import java.util.List; -import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -95,6 +94,9 @@ class ActivityAnalysis { } } + amount.setStartDate(sample.getTimestamp()); + amount.setEndDate(sample.getTimestamp()); + previousAmount = amount; previousSample = sample; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/SleepChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/SleepChartFragment.java index 51672e5d8..359fd3894 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/SleepChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/SleepChartFragment.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.animation.Easing; import com.github.mikephil.charting.charts.Chart; @@ -43,6 +44,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; +import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; @@ -62,6 +64,7 @@ public class SleepChartFragment extends AbstractChartFragment { private LineChart mActivityChart; private PieChart mSleepAmountChart; + private TextView mSleepchartInfo; private int mSmartAlarmFrom = -1; private int mSmartAlarmTo = -1; @@ -86,9 +89,25 @@ public class SleepChartFragment extends AbstractChartFragment { List colors = new ArrayList<>(); // int index = 0; long totalSeconds = 0; + + Date startSleep = null; + Date endSleep = null; + for (ActivityAmount amount : amounts.getAmounts()) { if ((amount.getActivityKind() & ActivityKind.TYPE_SLEEP) != 0) { long value = amount.getTotalSeconds(); + if(startSleep == null){ + startSleep = amount.getStartDate(); + } else { + if(startSleep.after(amount.getStartDate())) + startSleep = amount.getStartDate(); + } + if(endSleep == null){ + endSleep = amount.getEndDate(); + } else { + if(endSleep.before(amount.getEndDate())) + endSleep = amount.getEndDate(); + } totalSeconds += value; // entries.add(new PieEntry(value, index++)); entries.add(new PieEntry(value, amount.getName(getActivity()))); @@ -112,7 +131,7 @@ public class SleepChartFragment extends AbstractChartFragment { data.setDataSet(set); //setupLegend(pieChart); - return new MySleepChartsData(totalSleep, data); + return new MySleepChartsData(totalSleep, data, startSleep, endSleep); } @Override @@ -124,6 +143,15 @@ public class SleepChartFragment extends AbstractChartFragment { mActivityChart.setData(null); // workaround for https://github.com/PhilJay/MPAndroidChart/issues/2317 mActivityChart.getXAxis().setValueFormatter(mcd.getChartsData().getXValueFormatter()); mActivityChart.setData(mcd.getChartsData().getData()); + + if (mcd.getPieData().getStartSleep() != null && mcd.getPieData().getEndSleep() != null) { + mSleepchartInfo.setText(getContext().getString( + R.string.you_slept, + DateTimeUtils.timeToString(mcd.getPieData().getStartSleep()), + DateTimeUtils.timeToString(mcd.getPieData().getEndSleep()))); + } else { + mSleepchartInfo.setText(getContext().getString(R.string.you_did_not_sleep)); + } } @Override @@ -138,6 +166,7 @@ public class SleepChartFragment extends AbstractChartFragment { mActivityChart = (LineChart) rootView.findViewById(R.id.sleepchart); mSleepAmountChart = (PieChart) rootView.findViewById(R.id.sleepchart_pie_light_deep); + mSleepchartInfo = (TextView) rootView.findViewById(R.id.sleepchart_info); setupActivityChart(); setupSleepAmountChart(); @@ -246,10 +275,14 @@ public class SleepChartFragment extends AbstractChartFragment { private static class MySleepChartsData extends ChartsData { private String totalSleep; private final PieData pieData; + private Date startSleep; + private Date endSleep; - public MySleepChartsData(String totalSleep, PieData pieData) { + public MySleepChartsData(String totalSleep, PieData pieData, Date startSleep, Date endSleep) { this.totalSleep = totalSleep; this.pieData = pieData; + this.startSleep = startSleep; + this.endSleep = endSleep; } public PieData getPieData() { @@ -259,6 +292,14 @@ public class SleepChartFragment extends AbstractChartFragment { public CharSequence getTotalSleep() { return totalSleep; } + + public Date getStartSleep() { + return startSleep; + } + + public Date getEndSleep() { + return endSleep; + } } private static class MyChartsData extends ChartsData { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivityAmount.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivityAmount.java index 4c60a316f..5c37bba1d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivityAmount.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivityAmount.java @@ -18,6 +18,8 @@ package nodomain.freeyourgadget.gadgetbridge.model; import android.content.Context; +import java.util.Date; + import nodomain.freeyourgadget.gadgetbridge.R; public class ActivityAmount { @@ -25,6 +27,8 @@ public class ActivityAmount { private short percent; private long totalSeconds; private long totalSteps; + private Date startDate = null; + private Date endDate = null; public ActivityAmount(int activityKind) { this.activityKind = activityKind; @@ -67,4 +71,21 @@ public class ActivityAmount { } return context.getString(R.string.abstract_chart_fragment_kind_activity); } + + public Date getStartDate() { + return startDate; + } + + public void setStartDate(int seconds) { + if(startDate == null) + this.startDate = new Date((long)seconds * 1000); + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(int seconds) { + this.endDate = new Date((long)seconds * 1000); + } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/DateTimeUtils.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/DateTimeUtils.java index 2977a56fa..58e3a943e 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/DateTimeUtils.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/DateTimeUtils.java @@ -36,6 +36,7 @@ import nodomain.freeyourgadget.gadgetbridge.GBApplication; public class DateTimeUtils { private static SimpleDateFormat DAY_STORAGE_FORMAT = new SimpleDateFormat("yyyy-MM-dd", Locale.US); + private static SimpleDateFormat HOURS_MINUTES_FORMAT = new SimpleDateFormat("HH:mm", Locale.US); public static SimpleDateFormat ISO_8601_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.US){ //see https://github.com/Freeyourgadget/Gadgetbridge/issues/1076#issuecomment-383834116 and https://stackoverflow.com/a/30221245 @@ -131,6 +132,10 @@ public class DateTimeUtils { return DAY_STORAGE_FORMAT.parse(day); } + public static String timeToString(Date date) { + return HOURS_MINUTES_FORMAT.format(date); + } + public static Date todayUTC() { Calendar cal = getCalendarUTC(); return cal.getTime(); diff --git a/app/src/main/res/layout-land/fragment_sleepchart.xml b/app/src/main/res/layout-land/fragment_sleepchart.xml index 97b877baf..48d0bfd7d 100644 --- a/app/src/main/res/layout-land/fragment_sleepchart.xml +++ b/app/src/main/res/layout-land/fragment_sleepchart.xml @@ -1,22 +1,35 @@ + android:orientation="vertical"> - - + android:layout_weight="90" /> - + + + + + - android:layout_weight="20" /> diff --git a/app/src/main/res/layout/fragment_sleepchart.xml b/app/src/main/res/layout/fragment_sleepchart.xml index 04a7068cb..5608f1de2 100644 --- a/app/src/main/res/layout/fragment_sleepchart.xml +++ b/app/src/main/res/layout/fragment_sleepchart.xml @@ -5,17 +5,22 @@ tools:context="nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsActivity$PlaceholderFragment" android:orientation="vertical"> + + + android:layout_weight="2" /> + android:layout_weight="2" /> diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index aeef39e0c..ff5f03b86 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -287,6 +287,8 @@ Быстрый сон Глубокий сон Не носилось + Вы спали с %1$s до %2$s + Вы не спали Не подключен. Все будильники отключены Хранить данные об активности на устройстве @@ -586,4 +588,4 @@ Калибровка Watch 9 Разблокировать экран устройства Смахните вверх, чтобы разблокировать экран устройства - + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f45956fac..0076c91b7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -386,6 +386,8 @@ Light sleep Deep sleep Not worn + You slept from %1$s to %2$s + You did not sleep Not connected. All alarms disabled Keep activity data on device