diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivityListingChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivityListingChartFragment.java index 87ece74df..26b3ccacb 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivityListingChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivityListingChartFragment.java @@ -59,6 +59,8 @@ public class ActivityListingChartFragment extends AbstractChartFragment { rootView = inflater.inflate(R.layout.fragment_steps_list, container, false); ListView stepsList = rootView.findViewById(R.id.itemListView); + View headerView = inflater.inflate(R.layout.heartrate_average_widget,null, false); + stepsList.addHeaderView(headerView); stepListAdapter = new ActivityListingAdapter(getContext()); stepsList.setAdapter(stepListAdapter); stepsDateView = rootView.findViewById(R.id.stepsDateView); 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 d345275b0..6d4601f4e 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 @@ -76,8 +76,12 @@ public class SleepChartFragment extends AbstractChartFragment { private TextView mSleepchartInfo; private TextView heartRateAverageLabel; private ImageView heartRateIcon; + private TextView intensityTotalLabel; + private ImageView intensityTotalIcon; private int heartRateMin = 0; private int heartRateMax = 0; + private float intensityTotal = 0; + private int mSmartAlarmFrom = -1; @@ -115,9 +119,8 @@ public class SleepChartFragment extends AbstractChartFragment { } DefaultChartsData chartsData = refresh(device, samples); Triple hrData = calculateHrData(samples); - //Pair intensityMinMax = calculateIntensityMinMax(samples); //so far unused - Pair intensityMinMax = Pair.create(0f, 0f); - return new MyChartsData(mySleepChartsData, chartsData, hrData.getLeft(), hrData.getMiddle(), hrData.getRight(), intensityMinMax.first, intensityMinMax.second); + Triple intensityData = calculateIntensityData(samples); + return new MyChartsData(mySleepChartsData, chartsData, hrData.getLeft(), hrData.getMiddle(), hrData.getRight(), intensityData.getLeft(), intensityData.getMiddle(), intensityData.getRight()); } @@ -199,6 +202,7 @@ public class SleepChartFragment extends AbstractChartFragment { mSleepchartInfo.setText(buildYouSleptText(pieData)); heartRateMin = mcd.getHeartRateAxisMin(); heartRateMax = mcd.getHeartRateAxisMax(); + intensityTotal = mcd.getIntensityTotal(); if (!CHARTS_SLEEP_RANGE_24H && supportsHeartrate(getChartsHost().getDevice()) @@ -212,8 +216,9 @@ public class SleepChartFragment extends AbstractChartFragment { hrAverage_line.setLineWidth(0.1f); mActivityChart.getAxisRight().removeAllLimitLines(); mActivityChart.getAxisRight().addLimitLine(hrAverage_line); - DecimalFormat df = new DecimalFormat("##.#"); + DecimalFormat df = new DecimalFormat("###.#"); heartRateAverageLabel.setText(df.format(mcd.getHeartRateAverage())); + intensityTotalLabel.setText(df.format(mcd.getIntensityTotal())); } } @@ -239,12 +244,20 @@ public class SleepChartFragment extends AbstractChartFragment { int min = Collections.min(heartRateValues); int max = Collections.max(heartRateValues); int count = heartRateValues.toArray().length; - float sum = calculateSum(heartRateValues); + float sum = calculateHRSum(heartRateValues); float average = sum / count; return Triple.of(average, min, max); } - private float calculateSum(List samples) { + private float calculateIntensitySum(List samples) { + float result = 0; + for (Float sample : samples) { + result += sample; + } + return result; + } + + private float calculateHRSum(List samples) { float result = 0; for (Integer sample : samples) { result += sample; @@ -252,19 +265,28 @@ public class SleepChartFragment extends AbstractChartFragment { return result; } - private Pair calculateIntensityMinMax(List samples) { + private Triple calculateIntensityData(List samples) { + if (samples.toArray().length < 1) { + return Triple.of(0f, 0f, 0f); + } + List allIntensities = new ArrayList<>(); for (ActivitySample s : samples) { if (s.getKind() == ActivityKind.TYPE_LIGHT_SLEEP || s.getKind() == ActivityKind.TYPE_DEEP_SLEEP) { - float HR = s.getIntensity(); - allIntensities.add(HR); + float intensity = s.getIntensity(); + allIntensities.add(intensity); } } + if (allIntensities.toArray().length < 1) { + return Triple.of(0f, 0f, 0f); + } Float min = Collections.min(allIntensities); Float max = Collections.max(allIntensities); - return Pair.create(min, max); + Float sum = calculateIntensitySum(allIntensities); + + return Triple.of(sum, min, max); } private String buildYouSleptText(MySleepChartsData pieData) { @@ -298,15 +320,26 @@ public class SleepChartFragment extends AbstractChartFragment { mSleepchartInfo = rootView.findViewById(R.id.sleepchart_info); heartRateIcon = rootView.findViewById(R.id.heartrate_widget_icon); heartRateAverageLabel = rootView.findViewById(R.id.heartrate_widget_label); + intensityTotalIcon = rootView.findViewById(R.id.intensity_widget_icon); + intensityTotalLabel = rootView.findViewById(R.id.intensity_widget_label); + + ConstraintLayout intensityTotalWidgetLayout = rootView.findViewById(R.id.intensity_widget_layout); ConstraintLayout heartRateWidgetLayout = rootView.findViewById(R.id.heartrate_widget_layout); - heartRateWidgetLayout.setOnClickListener(new View.OnClickListener() { + View.OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View v) { - String detailedDuration = String.format(getString(R.string.charts_min_max_heartrate_popup), heartRateMin, heartRateMax); + DecimalFormat df = new DecimalFormat("###.#"); + String detailedDuration = String.format(getString(R.string.charts_min_max_heartrate_popup), heartRateMin, heartRateMax, df.format(intensityTotal)); new ChartsActivity.ShowDurationDialog(detailedDuration, getContext()).show(); } - }); + }; + + heartRateWidgetLayout.setOnClickListener(listener); + intensityTotalWidgetLayout.setOnClickListener(listener); + intensityTotalIcon.setOnClickListener(listener); + intensityTotalLabel.setOnClickListener(listener); + setupActivityChart(); setupSleepAmountChart(); @@ -452,13 +485,17 @@ public class SleepChartFragment extends AbstractChartFragment { private int heartRateAxisMin; private float intensityAxisMax; private float intensityAxisMin; + private float intensityTotal; - public MyChartsData(MySleepChartsData pieData, DefaultChartsData chartsData, float heartRateAverage, int heartRateAxisMin, int heartRateAxisMax, float intensityAxisMin, float intensityAxisMax) { + public MyChartsData(MySleepChartsData pieData, DefaultChartsData chartsData, float heartRateAverage, int heartRateAxisMin, int heartRateAxisMax, float intensityTotal, float intensityAxisMin, float intensityAxisMax) { this.pieData = pieData; this.chartsData = chartsData; this.heartRateAverage = heartRateAverage; this.heartRateAxisMax = heartRateAxisMax; this.heartRateAxisMin = heartRateAxisMin; + this.intensityTotal = intensityTotal; + this.intensityAxisMin = intensityAxisMin; + this.intensityAxisMax = intensityAxisMax; } public MySleepChartsData getPieData() { @@ -486,5 +523,8 @@ public class SleepChartFragment extends AbstractChartFragment { public float getIntensityAxisMin() { return intensityAxisMin; } + + public float getIntensityTotal() { return intensityTotal;} + } } \ No newline at end of file diff --git a/app/src/main/res/layout-land/fragment_sleepchart.xml b/app/src/main/res/layout-land/fragment_sleepchart.xml index 2ed151416..320e160d1 100644 --- a/app/src/main/res/layout-land/fragment_sleepchart.xml +++ b/app/src/main/res/layout-land/fragment_sleepchart.xml @@ -5,15 +5,6 @@ android:orientation="vertical" tools:context="nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsActivity$PlaceholderFragment"> - --> + + + + diff --git a/app/src/main/res/layout/fragment_sleepchart.xml b/app/src/main/res/layout/fragment_sleepchart.xml index 39a5a894d..35823936e 100644 --- a/app/src/main/res/layout/fragment_sleepchart.xml +++ b/app/src/main/res/layout/fragment_sleepchart.xml @@ -5,14 +5,6 @@ android:orientation="vertical" tools:context="nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsActivity$PlaceholderFragment"> - - + + + diff --git a/app/src/main/res/layout/intensity_total_widget.xml b/app/src/main/res/layout/intensity_total_widget.xml new file mode 100644 index 000000000..9369d17ac --- /dev/null +++ b/app/src/main/res/layout/intensity_total_widget.xml @@ -0,0 +1,32 @@ + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 00eb21be1..91d96fc9a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -477,6 +477,7 @@ Distance Clock Heart rate + Movement intensity Battery No limit 5 seconds @@ -509,7 +510,7 @@ Not worn You slept from %1$s to %2$s You did not sleep - Lowest heart rate: %1$d \nHighest heart rate: %2$d + Lowest heart rate: %1$d \nHighest heart rate: %2$d \nMovement intensity: %3$s Not connected. All alarms disabled Keep activity data on device