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.