From cf9b4322247e505bccc3b1d25a7ed290f22bf992 Mon Sep 17 00:00:00 2001 From: quaelnix <122357328+quaelnix@users.noreply.github.com> Date: Mon, 11 Sep 2023 15:35:38 +0200 Subject: [PATCH] Add max power stats --- .../opentracks/data/ContentProviderUtils.java | 2 + .../data/CustomContentProvider.java | 6 ++- .../data/tables/TrackPointsColumns.java | 1 + .../fragments/StatisticsRecordedFragment.java | 6 ++- .../opentracks/stats/SensorStatistics.java | 8 ++- src/main/res/layout/statistics_recorded.xml | 54 +++++++++++++++---- src/main/res/values/strings.xml | 1 + 7 files changed, 62 insertions(+), 16 deletions(-) diff --git a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java index 8d606e52d..4c2282502 100644 --- a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java +++ b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java @@ -869,12 +869,14 @@ public SensorStatistics getSensorStats(@NonNull Track.Id trackId) { final int AVG_HR_INDEX = cursor.getColumnIndexOrThrow(TrackPointsColumns.ALIAS_AVG_HR); final int MAX_CADENCE_INDEX = cursor.getColumnIndexOrThrow(TrackPointsColumns.ALIAS_MAX_CADENCE); final int AVG_CADENCE_INDEX = cursor.getColumnIndexOrThrow(TrackPointsColumns.ALIAS_AVG_CADENCE); + final int MAX_POWER_INDEX = cursor.getColumnIndexOrThrow(TrackPointsColumns.ALIAS_MAX_POWER); final int AVG_POWER_INDEX = cursor.getColumnIndexOrThrow(TrackPointsColumns.ALIAS_AVG_POWER); sensorStatistics = new SensorStatistics( !cursor.isNull(MAX_HR_INDEX) ? HeartRate.of(cursor.getFloat(MAX_HR_INDEX)) : null, !cursor.isNull(AVG_HR_INDEX) ? HeartRate.of(cursor.getFloat(AVG_HR_INDEX)) : null, !cursor.isNull(MAX_CADENCE_INDEX) ? Cadence.of(cursor.getFloat(MAX_CADENCE_INDEX)) : null, !cursor.isNull(AVG_CADENCE_INDEX) ? Cadence.of(cursor.getFloat(AVG_CADENCE_INDEX)) : null, + !cursor.isNull(MAX_POWER_INDEX) ? Power.of(cursor.getFloat(MAX_POWER_INDEX)) : null, !cursor.isNull(AVG_POWER_INDEX) ? Power.of(cursor.getFloat(AVG_POWER_INDEX)) : null ); } diff --git a/src/main/java/de/dennisguse/opentracks/data/CustomContentProvider.java b/src/main/java/de/dennisguse/opentracks/data/CustomContentProvider.java index 25df9426a..e0922f538 100644 --- a/src/main/java/de/dennisguse/opentracks/data/CustomContentProvider.java +++ b/src/main/java/de/dennisguse/opentracks/data/CustomContentProvider.java @@ -62,7 +62,7 @@ public class CustomContentProvider extends ContentProvider { /** * The string representing the query that compute sensor stats from trackpoints table. - * It computes the average for heart rate, cadence, and power (duration-based average) and the maximum for heart rate and cadence. + * It computes the average for heart rate, cadence and power (duration-based average) and the maximum for heart rate, cadence and power. * Finally, it ignores manual pause (SEGMENT_START_MANUAL). */ private final String SENSOR_STATS_QUERY = @@ -86,7 +86,9 @@ public class CustomContentProvider extends ContentProvider { "SUM(t." + TrackPointsColumns.SENSOR_POWER + " * (COALESCE(MAX(t." + TrackPointsColumns.TIME + ", (SELECT time_value FROM time_select)), t." + TrackPointsColumns.TIME + ") - t." + TrackPointsColumns.TIME + ")) " + "/ " + - "SUM(COALESCE(MAX(t." + TrackPointsColumns.TIME + ", (SELECT time_value FROM time_select)), t." + TrackPointsColumns.TIME + ") - t." + TrackPointsColumns.TIME + ") " + TrackPointsColumns.ALIAS_AVG_POWER + " " + + "SUM(COALESCE(MAX(t." + TrackPointsColumns.TIME + ", (SELECT time_value FROM time_select)), t." + TrackPointsColumns.TIME + ") - t." + TrackPointsColumns.TIME + ") " + TrackPointsColumns.ALIAS_AVG_POWER + ", " + + + "MAX(t." + TrackPointsColumns.SENSOR_POWER + ") " + TrackPointsColumns.ALIAS_MAX_POWER + " " + "FROM " + TrackPointsColumns.TABLE_NAME + " t " + "WHERE t." + TrackPointsColumns.TRACKID + " = ? " + diff --git a/src/main/java/de/dennisguse/opentracks/data/tables/TrackPointsColumns.java b/src/main/java/de/dennisguse/opentracks/data/tables/TrackPointsColumns.java index 5c5656c4f..931c9a43b 100644 --- a/src/main/java/de/dennisguse/opentracks/data/tables/TrackPointsColumns.java +++ b/src/main/java/de/dennisguse/opentracks/data/tables/TrackPointsColumns.java @@ -62,6 +62,7 @@ public interface TrackPointsColumns extends BaseColumns { String ALIAS_AVG_CADENCE = "avg_cadence"; String ALIAS_MAX_CADENCE = "max_cadence"; String ALIAS_AVG_POWER = "avg_power"; + String ALIAS_MAX_POWER = "max_power"; String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " diff --git a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java index a42cfdbcf..cf6b5bba0 100644 --- a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java +++ b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java @@ -270,10 +270,12 @@ private void updateSensorUI() { viewBinding.statsAvgCadenceValue.setText(avgRPM); } if (sensorStatistics.hasPower()) { - String W = String.valueOf(Math.round(sensorStatistics.getAvgPower().getW())); + String maxW = String.valueOf(Math.round(sensorStatistics.getMaxPower().getW())); + String avgW = String.valueOf(Math.round(sensorStatistics.getAvgPower().getW())); viewBinding.statsPowerGroup.setVisibility(View.VISIBLE); - viewBinding.statsPowerValue.setText(W); + viewBinding.statsMaxPowerValue.setText(maxW); + viewBinding.statsAvgPowerValue.setText(avgW); } } } diff --git a/src/main/java/de/dennisguse/opentracks/stats/SensorStatistics.java b/src/main/java/de/dennisguse/opentracks/stats/SensorStatistics.java index 4ca4ee320..cad709fda 100644 --- a/src/main/java/de/dennisguse/opentracks/stats/SensorStatistics.java +++ b/src/main/java/de/dennisguse/opentracks/stats/SensorStatistics.java @@ -9,13 +9,15 @@ public class SensorStatistics { private final HeartRate avgHr; private final Cadence maxCadence; private final Cadence avgCadence; + private final Power maxPower; private final Power avgPower; - public SensorStatistics(HeartRate maxHr, HeartRate avgHr, Cadence maxCadence, Cadence avgCadence, Power avgPower) { + public SensorStatistics(HeartRate maxHr, HeartRate avgHr, Cadence maxCadence, Cadence avgCadence, Power maxPower, Power avgPower) { this.maxHr = maxHr; this.avgHr = avgHr; this.maxCadence = maxCadence; this.avgCadence = avgCadence; + this.maxPower = maxPower; this.avgPower = avgPower; } @@ -47,6 +49,10 @@ public boolean hasPower() { return avgPower != null; } + public Power getMaxPower() { + return maxPower; + } + public Power getAvgPower() { return avgPower; } diff --git a/src/main/res/layout/statistics_recorded.xml b/src/main/res/layout/statistics_recorded.xml index dc382305e..4013cab2c 100644 --- a/src/main/res/layout/statistics_recorded.xml +++ b/src/main/res/layout/statistics_recorded.xml @@ -584,53 +584,85 @@ app:layout_constraintEnd_toStartOf="@id/guideline3" app:layout_constraintTop_toBottomOf="@id/stats_cadence_barrier" /> - + app:constraint_referenced_ids="stats_power_horizontal_line,stats_max_power_label,stats_max_power_value,stats_max_power_unit,stats_avg_power_label,stats_avg_power_value,stats_avg_power_unit" /> + + + + + + + app:constraint_referenced_ids="stats_max_power_value,stats_avg_power_value" /> %1$d bpm Power Avg Power + Max Power W Could not scan for Bluetooth devices (error %1$i). Please enable Bluetooth.