From b43c1099038ddc20ce26f1dcf35eac24fdb0dc05 Mon Sep 17 00:00:00 2001 From: a0z Date: Sat, 24 Aug 2024 17:44:18 +0200 Subject: [PATCH] Stress fragment redesign --- .../activities/charts/SleepChartFragment.java | 2 +- .../charts/StressChartFragment.java | 93 ++++++++- .../res/layout-land/fragment_sleepchart.xml | 69 ------- .../res/layout-land/fragment_stresschart.xml | 32 ---- .../main/res/layout/fragment_stresschart.xml | 181 +++++++++++++++++- app/src/main/res/values/strings.xml | 1 + 6 files changed, 262 insertions(+), 116 deletions(-) delete mode 100644 app/src/main/res/layout-land/fragment_sleepchart.xml delete mode 100644 app/src/main/res/layout-land/fragment_stresschart.xml 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 11aa3f9cf..2c25240ea 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 @@ -150,7 +150,7 @@ public class SleepChartFragment extends AbstractActivityChartFragment 0) { - mStressLevelsPieChart.setCenterText(requireContext().getString(R.string.average, String.valueOf(stressData.getAverage()))); + + Date date = new Date((long) this.getTSEnd() * 1000); + String formattedDate = new SimpleDateFormat("E, MMM dd").format(date); + stressDate.setText(formattedDate); + + Map stressZoneTimes = stressData.getStressZoneTimes(); + Integer relaxedTime = stressZoneTimes.get(StressType.RELAXED); + if (0 < relaxedTime) { + stressChartRelaxedTime.setText(DateTimeUtils.formatDurationHoursMinutes(relaxedTime, TimeUnit.SECONDS)); } else { - mStressLevelsPieChart.setCenterText(requireContext().getString(R.string.no_data)); + stressChartRelaxedTime.setText(R.string.stats_empty_value); + } + Integer mildTime = stressZoneTimes.get(StressType.MILD); + if (mildTime > 0) { + stressChartMildTime.setText(DateTimeUtils.formatDurationHoursMinutes(mildTime, TimeUnit.SECONDS)); + } else { + stressChartMildTime.setText(R.string.stats_empty_value); + } + Integer moderateTime = stressZoneTimes.get(StressType.MODERATE); + if (moderateTime > 0) { + stressChartModerateTime.setText(DateTimeUtils.formatDurationHoursMinutes(moderateTime, TimeUnit.SECONDS)); + } else { + stressChartModerateTime.setText(R.string.stats_empty_value); + } + Integer highTime = stressZoneTimes.get(StressType.HIGH); + if (highTime > 0) { + stressChartHighTime.setText(DateTimeUtils.formatDurationHoursMinutes(highTime, TimeUnit.SECONDS)); + } else { + stressChartHighTime.setText(R.string.stats_empty_value); + } + + if (stressData.getAverage() > 0) { + int noc = String.valueOf(stressData.getAverage()).length(); + SpannableString pieChartCenterText = new SpannableString(stressData.getAverage() + "\n" + requireContext().getString(R.string.stress_average)); + pieChartCenterText.setSpan(new RelativeSizeSpan(1.75f), 0, noc, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + pieChartCenterText.setSpan(new RelativeSizeSpan(0.72f), noc, pieChartCenterText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + mStressLevelsPieChart.setCenterText(pieChartCenterText); + } else { + SpannableString pieChartCenterText = new SpannableString("-\n" + requireContext().getString(R.string.stress_average)); + pieChartCenterText.setSpan(new RelativeSizeSpan(1.25f), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + pieChartCenterText.setSpan(new RelativeSizeSpan(0.72f), 2, pieChartCenterText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + mStressLevelsPieChart.setCenterText(pieChartCenterText); } mStressLevelsPieChart.setData(pieData); @@ -147,8 +198,19 @@ public class StressChartFragment extends AbstractChartFragment= Build.VERSION_CODES.M) { + rootView.setOnScrollChangeListener((v, scrollX, scrollY, oldScrollX, oldScrollY) -> { + getChartsHost().enableSwipeRefresh(scrollY == 0); + }); + } + mStressChart = rootView.findViewById(R.id.stress_line_chart); mStressLevelsPieChart = rootView.findViewById(R.id.stress_pie_chart); + stressChartRelaxedTime = rootView.findViewById(R.id.stress_chart_relaxed_time); + stressChartMildTime = rootView.findViewById(R.id.stress_chart_mild_time); + stressChartModerateTime = rootView.findViewById(R.id.stress_chart_moderate_time); + stressChartHighTime = rootView.findViewById(R.id.stress_chart_high_time); + stressDate = rootView.findViewById(R.id.stress_date); setupLineChart(); setupPieChart(); @@ -165,6 +227,12 @@ public class StressChartFragment extends AbstractChartFragment lineDataSets = new ArrayList<>(); final List pieEntries = new ArrayList<>(); final List pieColors = new ArrayList<>(); + final Map stressZoneTimes = new HashMap<>(); for (final StressType stressType : StressType.values()) { final List stressEntries = lineEntriesPerLevel.get(stressType); lineDataSets.add(createDataSet(stressType, stressEntries)); final Integer stressTime = accumulator.get(stressType); + stressZoneTimes.put(stressType, stressTime); if (stressType != StressType.UNKNOWN && stressTime != null && stressTime != 0) { pieEntries.add(new PieEntry(stressTime, stressType.getLabel(requireContext()))); pieColors.add(stressType.getColor(requireContext())); } } + if (pieEntries.isEmpty()) { + pieEntries.add(new PieEntry(1)); + pieColors.add(getResources().getColor(R.color.gauge_line_color)); + } + final PieDataSet pieDataSet = new PieDataSet(pieEntries, ""); pieDataSet.setValueFormatter(new ValueFormatter() { @Override @@ -404,12 +479,14 @@ public class StressChartFragment extends AbstractChartFragment chartsData = new DefaultChartsData<>(lineData, xValueFormatter); - return new StressChartsData(pieData, chartsData, Math.round((float) averageSum / averageNumSamples)); + return new StressChartsData(pieData, chartsData, Math.round((float) averageSum / averageNumSamples), stressZoneTimes); } } @@ -417,11 +494,17 @@ public class StressChartFragment extends AbstractChartFragment chartsData; private final int average; + private Map stressZoneTimes; - public StressChartsData(final PieData pieData, final DefaultChartsData chartsData, final int average) { + public StressChartsData(final PieData pieData, final DefaultChartsData chartsData, final int average, Map stressZoneTimes) { this.pieData = pieData; this.chartsData = chartsData; this.average = average; + this.stressZoneTimes = stressZoneTimes; + } + + public Map getStressZoneTimes() { + return stressZoneTimes; } public PieData getPieData() { diff --git a/app/src/main/res/layout-land/fragment_sleepchart.xml b/app/src/main/res/layout-land/fragment_sleepchart.xml deleted file mode 100644 index 3526c632d..000000000 --- a/app/src/main/res/layout-land/fragment_sleepchart.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout-land/fragment_stresschart.xml b/app/src/main/res/layout-land/fragment_stresschart.xml deleted file mode 100644 index 0358198bb..000000000 --- a/app/src/main/res/layout-land/fragment_stresschart.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_stresschart.xml b/app/src/main/res/layout/fragment_stresschart.xml index c04373f5d..10285d742 100644 --- a/app/src/main/res/layout/fragment_stresschart.xml +++ b/app/src/main/res/layout/fragment_stresschart.xml @@ -1,25 +1,188 @@ - - + android:layout_height="match_parent"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7b70c3a6e..ef552543b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -954,6 +954,7 @@ Lack of steps: %1$d Overstep: %1$d Average: %1$s + Average Truncate fetch operation timestamps Truncate the fetch operation timestamps to minutes. Disable this setting to keep the timestamps in seconds, if you face issues while fetching very short workouts. Do not ACK activity data transfer