Sensor: add temperature.

Fixes #2241.
This commit is contained in:
Dennis Guse
2026-01-04 09:56:44 +01:00
parent 738201c1c2
commit 54844b9a9a
36 changed files with 435 additions and 44 deletions
@@ -132,6 +132,7 @@ public class TestDataUtil {
),
null,
HeartRate.of(100f + i % 80),
null,
Cadence.of(300f + i),
Power.of(400f + i),
altitudeGainLoss
@@ -39,6 +39,7 @@ public class TestSensorDataUtil {
),
null,
HeartRate.ofOrNull(hr),
null,
cadence != null ? Cadence.of(cadence) : null,
power != null ? Power.of(power) : null,
new AltitudeGainLoss(3, 3)
@@ -812,6 +812,7 @@ public class CustomContentProviderUtilsTest {
TestDataUtil.createTrackPoint(5).position(),
null,
HeartRate.of(1),
null,
Cadence.of(2),
Power.of(3),
null
@@ -896,6 +897,7 @@ public class CustomContentProviderUtilsTest {
null,
null,
null,
null,
null
);
@@ -58,6 +58,7 @@ public class TrackPointTest {
null,
null,
null,
null,
null
);
@@ -105,6 +106,7 @@ public class TrackPointTest {
null,
null,
null,
null,
null);
// tp2 has sensor distance
@@ -129,6 +131,7 @@ public class TrackPointTest {
null,
null,
null,
null,
null
);
@@ -148,6 +151,7 @@ public class TrackPointTest {
null,
null,
null,
null,
null);
// tp1 and tp2 have sensor distance
@@ -60,6 +60,7 @@ import de.dennisguse.opentracks.data.models.Position;
import de.dennisguse.opentracks.data.models.Power;
import de.dennisguse.opentracks.data.models.Speed;
import de.dennisguse.opentracks.data.models.Statistics;
import de.dennisguse.opentracks.data.models.Temperature;
import de.dennisguse.opentracks.data.models.Track;
import de.dennisguse.opentracks.data.models.TrackBuilder;
import de.dennisguse.opentracks.data.models.TrackPoint;
@@ -72,6 +73,7 @@ import de.dennisguse.opentracks.sensors.sensorData.AggregatorCyclingCadence;
import de.dennisguse.opentracks.sensors.sensorData.AggregatorCyclingDistanceSpeed;
import de.dennisguse.opentracks.sensors.sensorData.AggregatorCyclingPower;
import de.dennisguse.opentracks.sensors.sensorData.AggregatorHeartRate;
import de.dennisguse.opentracks.sensors.sensorData.AggregatorTemperature;
import de.dennisguse.opentracks.sensors.sensorData.Raw;
import de.dennisguse.opentracks.sensors.sensorData.SensorDataAggregator;
import de.dennisguse.opentracks.services.TrackRecordingService;
@@ -173,14 +175,14 @@ public class ExportImportTest {
// A sensor-only TrackPoint
trackPointCreator.setClock("2020-02-02T02:02:04Z");
mockSensorData(trackPointCreator, 15f, sensorDistance, 66f, 3f, 50f, 1f);
mockSensorData(trackPointCreator, 15f, sensorDistance, 66f, 3f, 50f, 1f, 27);
trackPointCreator.setClock("2020-02-02T02:02:14Z"); //ignored
mockSensorData(trackPointCreator, 15f, null, 67f, 3f, 50f, null);
mockSensorData(trackPointCreator, 15f, null, 67f, 3f, 50f, null, 28);
trackPointCreator.setClock("2020-02-02T02:02:15Z");
mockSensorData(trackPointCreator, null, null, 68f, 3f, 50f, null);
mockSensorData(trackPointCreator, null, null, 68f, 3f, 50f, null, 29);
trackPointCreator.setClock("2020-02-02T02:02:16Z");
mockSensorData(trackPointCreator, 5f, Distance.of(2), 69f, 3f, 50f, null); // Distance will be added to next TrackPoint
mockSensorData(trackPointCreator, 5f, Distance.of(2), 69f, 3f, 50f, null, 30); //Distance will be added to next TrackPoint
sendLocation(trackPointCreator, "2020-02-02T02:02:17Z", 3.1234567, 14.0014567, 10, 13, 15, 1020.25, 0f);
contentProviderUtils.insertMarker(
@@ -248,6 +250,7 @@ public class ExportImportTest {
null,
null,
null,
null,
new AltitudeGainLoss(1, 1)
),
new TrackPoint(
@@ -261,6 +264,7 @@ public class ExportImportTest {
Speed.of(15)),
Distance.of(10),
HeartRate.of(66),
Temperature.of(27),
Cadence.of(3),
Power.of(50),
new AltitudeGainLoss(1, 1)
@@ -271,6 +275,7 @@ public class ExportImportTest {
Position.of(Instant.parse("2020-02-02T02:02:15Z")),
null,
HeartRate.of(68),
Temperature.of(29),
Cadence.of(3),
Power.of(50),
null
@@ -286,6 +291,7 @@ public class ExportImportTest {
Speed.of(5)),
Distance.of(2),
HeartRate.of(69),
Temperature.of(30),
Cadence.of(3),
Power.of(50),
new AltitudeGainLoss(0, 0)
@@ -305,6 +311,7 @@ public class ExportImportTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0)
),
new TrackPoint(
@@ -319,6 +326,7 @@ public class ExportImportTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0)
),
new TrackPoint(
@@ -329,6 +337,7 @@ public class ExportImportTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0)
),
new TrackPoint(
@@ -343,6 +352,7 @@ public class ExportImportTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0)),
new TrackPoint(TrackPoint.Type.SEGMENT_END_MANUAL, Instant.parse("2020-02-02T02:04:00Z"))
), actual);
@@ -365,7 +375,7 @@ public class ExportImportTest {
//TODO Does not test marker images
@LargeTest
@Test
public void kmz_with_trackdetail_and_sensordata() throws TimeoutException, IOException {
public void kmz_with_trackdetail_and_sensordata() throws IOException {
// given
Track track = contentProviderUtils.getTrack(trackId);
@@ -417,7 +427,7 @@ public class ExportImportTest {
@LargeTest
@Test(expected = ImportAlreadyExistsException.class)
public void kml_with_trackdetail_and_sensordata_duplicate_trackUUID() throws TimeoutException, IOException {
public void kml_with_trackdetail_and_sensordata_duplicate_trackUUID() throws IOException {
// given
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();
editor.putBoolean(context.getString(R.string.import_prevent_reimport_key), true);
@@ -487,6 +497,7 @@ public class ExportImportTest {
null,
null,
null,
null,
new AltitudeGainLoss(1, 1)
),
new TrackPoint(
@@ -500,6 +511,7 @@ public class ExportImportTest {
Speed.of(5)),
Distance.of(12),
HeartRate.of(69),
Temperature.of(30),
Cadence.of(3),
Power.of(50),
new AltitudeGainLoss(1, 1)
@@ -517,6 +529,7 @@ public class ExportImportTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0)
),
new TrackPoint(
@@ -532,6 +545,7 @@ public class ExportImportTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0)
),
new TrackPoint(
@@ -547,6 +561,7 @@ public class ExportImportTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0)
)
), actual);
@@ -575,7 +590,7 @@ public class ExportImportTest {
@LargeTest
@Test(expected = ImportAlreadyExistsException.class)
public void gpx_duplicate_trackUUID() throws TimeoutException, IOException {
public void gpx_duplicate_trackUUID() throws IOException {
// given
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();
editor.putBoolean(context.getString(R.string.import_prevent_reimport_key), true);
@@ -601,7 +616,7 @@ public class ExportImportTest {
@LargeTest
@Test
public void csv_export_only() throws TimeoutException, IOException {
public void csv_export_only() throws IOException {
// given
Track track = contentProviderUtils.getTrack(trackId);
@@ -645,7 +660,7 @@ public class ExportImportTest {
}
}
private void mockSensorData(TrackPointCreator trackPointCreator, Float speed, Distance distance, float heartRate, float cadence, Float power, Float altitudeGain) {
private void mockSensorData(TrackPointCreator trackPointCreator, Float speed, Distance distance, float heartRate, float cadence, Float power, Float altitudeGain, float temperature) {
SensorDataAggregator sensorDataAggregator = trackPointCreator.getSensorManager().sensorDataAggregator;
AggregatorCyclingPower cyclingPower = new AggregatorCyclingPower("", "");
@@ -691,6 +706,19 @@ public class ExportImportTest {
mockAltitudeChange(trackPointCreator, altitudeGain);
sensorDataAggregator.add(new AggregatorTemperature("", "'") {
@NonNull
@Override
public Temperature getAggregatedValue(Instant now) {
return Temperature.of(temperature);
}
@Override
public boolean hasReceivedData() {
return true;
}
});
trackPointCreator.onChange();
}
@@ -210,6 +210,7 @@ public class GPXTrackImporterTest {
null,
null,
null,
null,
new AltitudeGainLoss(1, 1)
),
new TrackPoint(
@@ -223,6 +224,7 @@ public class GPXTrackImporterTest {
Speed.of(5)),
Distance.of(12),
HeartRate.of(69),
null,
Cadence.of(3),
Power.of(50),
new AltitudeGainLoss(1, 1)
@@ -240,6 +242,7 @@ public class GPXTrackImporterTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0)
),
new TrackPoint(
@@ -255,6 +258,7 @@ public class GPXTrackImporterTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0)
),
new TrackPoint(
@@ -270,6 +274,7 @@ public class GPXTrackImporterTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0)
)
), actual);
@@ -52,6 +52,8 @@ public class TrackPointAssert {
Assert.assertEquals("heartRate", expected.heartRate(), actual.heartRate());
Assert.assertEquals("temperature", expected.temperature(), actual.temperature());
Assert.assertEquals("power", expected.power(), actual.power());
Assert.assertEquals("cadence", expected.cadence(), actual.cadence());
@@ -135,6 +135,7 @@ public class TrackRecordingServiceRecordingTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0))
), TestDataUtil.getTrackPoints(contentProviderUtils, trackId));
}
@@ -217,6 +218,7 @@ public class TrackRecordingServiceRecordingTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0))
), TestDataUtil.getTrackPoints(contentProviderUtils, trackId));
@@ -239,6 +241,7 @@ public class TrackRecordingServiceRecordingTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0)
),
new TrackPoint(TrackPoint.Type.SEGMENT_START_MANUAL, Instant.parse(resumeTime))
@@ -280,6 +283,7 @@ public class TrackRecordingServiceRecordingTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0))
), trackPoints);
}
@@ -316,6 +320,7 @@ public class TrackRecordingServiceRecordingTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0)
),
new TrackPoint(TrackPoint.Type.SEGMENT_START_MANUAL, Instant.parse(resumeTime))
@@ -360,6 +365,7 @@ public class TrackRecordingServiceRecordingTest {
HeartRate.of(7),
null,
null,
null,
new AltitudeGainLoss(0, 0)
),
new TrackPoint(
@@ -370,6 +376,7 @@ public class TrackRecordingServiceRecordingTest {
HeartRate.of(7),
null,
null,
null,
new AltitudeGainLoss(0, 0)
)
), TestDataUtil.getTrackPoints(contentProviderUtils, trackId));
@@ -434,6 +441,7 @@ public class TrackRecordingServiceRecordingTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0)
),
new TrackPoint(
@@ -449,6 +457,7 @@ public class TrackRecordingServiceRecordingTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0)
),
new TrackPoint(
@@ -464,6 +473,7 @@ public class TrackRecordingServiceRecordingTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0)
),
new TrackPoint(
@@ -474,6 +484,7 @@ public class TrackRecordingServiceRecordingTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0)
)
), TestDataUtil.getTrackPoints(contentProviderUtils, trackId));
@@ -535,6 +546,7 @@ public class TrackRecordingServiceRecordingTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0)
),
new TrackPoint(
@@ -550,6 +562,7 @@ public class TrackRecordingServiceRecordingTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0)
),
new TrackPoint(
@@ -565,6 +578,7 @@ public class TrackRecordingServiceRecordingTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0)
)
), TestDataUtil.getTrackPoints(contentProviderUtils, trackId));
@@ -614,6 +628,7 @@ public class TrackRecordingServiceRecordingTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0)
),
new TrackPoint(
@@ -629,6 +644,7 @@ public class TrackRecordingServiceRecordingTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0)),
new TrackPoint(
null,
@@ -638,6 +654,7 @@ public class TrackRecordingServiceRecordingTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0))
), TestDataUtil.getTrackPoints(contentProviderUtils, trackId));
}
@@ -689,6 +706,7 @@ public class TrackRecordingServiceRecordingTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0))
), TestDataUtil.getTrackPoints(contentProviderUtils, trackId));
}
@@ -745,6 +763,7 @@ public class TrackRecordingServiceRecordingTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0)
),
new TrackPoint(
@@ -760,6 +779,7 @@ public class TrackRecordingServiceRecordingTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0)
),
new TrackPoint(
@@ -770,6 +790,7 @@ public class TrackRecordingServiceRecordingTest {
null,
null,
null,
null,
new AltitudeGainLoss(0, 0))
), TestDataUtil.getTrackPoints(contentProviderUtils, trackId));
}
@@ -852,6 +873,7 @@ public class TrackRecordingServiceRecordingTest {
Speed.of(5)),
Distance.of(2),
null,
null,
Cadence.of(2),
null,
null
@@ -867,6 +889,7 @@ public class TrackRecordingServiceRecordingTest {
Speed.of(5)),
Distance.ZERO,
null,
null,
Cadence.of(2),
null,
null
@@ -882,6 +905,7 @@ public class TrackRecordingServiceRecordingTest {
Speed.of(5)),
Distance.of(10),
null,
null,
Cadence.of(3),
null,
null
@@ -897,6 +921,7 @@ public class TrackRecordingServiceRecordingTest {
Speed.of(5)),
Distance.of(4.0),
null,
null,
Cadence.of(5),
null,
null
@@ -912,6 +937,7 @@ public class TrackRecordingServiceRecordingTest {
Speed.of(5)),
Distance.ZERO,
null,
null,
Cadence.of(5),
null,
null
@@ -927,6 +953,7 @@ public class TrackRecordingServiceRecordingTest {
Speed.ZERO), //Sensor data is now outdated, but we do not fall back to GPS.
Distance.ZERO,
null,
null,
Cadence.of(0), //TODO This could be null, right?
null,
null
@@ -89,7 +89,7 @@ public class VoiceAnnouncementUtilsTest {
null,
null,
new SensorData<>(HeartRate.of(60), "unused"),
null,
null, null,
null,
null
);
@@ -129,7 +129,7 @@ public class VoiceAnnouncementUtilsTest {
null,
null,
new SensorData<>(HeartRate.of(60), "unused"),
null,
null, null,
null,
null
);
@@ -169,7 +169,7 @@ public class VoiceAnnouncementUtilsTest {
null,
null,
new SensorData<>(HeartRate.of(60), "unused"),
null,
null, null,
null,
null
);
@@ -209,7 +209,7 @@ public class VoiceAnnouncementUtilsTest {
null,
null,
new SensorData<>(HeartRate.of(60), "unused"),
null,
null, null,
null,
null
);
@@ -231,7 +231,7 @@ public class VoiceAnnouncementUtilsTest {
null,
null,
new SensorData<>(HeartRate.of(60), "unused"),
null,
null, null,
null,
null
);
@@ -271,7 +271,7 @@ public class VoiceAnnouncementUtilsTest {
null,
null,
new SensorData<>(HeartRate.of(60), "unused"),
null,
null, null,
null,
null
);
@@ -293,7 +293,7 @@ public class VoiceAnnouncementUtilsTest {
null,
null,
new SensorData<>(HeartRate.of(60), "unused"),
null,
null, null,
null,
null
);
@@ -333,7 +333,7 @@ public class VoiceAnnouncementUtilsTest {
null,
null,
new SensorData<>(HeartRate.of(60), "unused"),
null,
null, null,
null,
null
);
@@ -373,7 +373,7 @@ public class VoiceAnnouncementUtilsTest {
null,
null,
new SensorData<>(HeartRate.of(60), "unused"),
null,
null, null,
null,
null
);
@@ -413,7 +413,7 @@ public class VoiceAnnouncementUtilsTest {
null,
null,
new SensorData<>(HeartRate.of(60), "unused"),
null,
null, null,
null,
null
);
@@ -453,7 +453,7 @@ public class VoiceAnnouncementUtilsTest {
null,
null,
new SensorData<>(HeartRate.of(60), "unused"),
null,
null, null,
null,
null
);
@@ -475,7 +475,7 @@ public class VoiceAnnouncementUtilsTest {
null,
null,
new SensorData<>(HeartRate.of(60), "unused"),
null,
null, null,
null,
null
);
@@ -515,7 +515,7 @@ public class VoiceAnnouncementUtilsTest {
null,
null,
new SensorData<>(HeartRate.of(60), "unused"),
null,
null, null,
null,
null
);
@@ -537,7 +537,7 @@ public class VoiceAnnouncementUtilsTest {
null,
null,
new SensorData<>(HeartRate.of(60), "unused"),
null,
null, null,
null,
null
);
@@ -564,7 +564,7 @@ public class VoiceAnnouncementUtilsTest {
null,
null,
new SensorData<>(HeartRate.of(60), "unused"),
null,
null, null,
null,
null
);
@@ -597,7 +597,7 @@ public class VoiceAnnouncementUtilsTest {
null,
null,
new SensorData<>(HeartRate.of(60), "unused"),
null,
null, null,
null,
null
);
@@ -112,6 +112,7 @@ public class TrackStatisticsUpdaterTest {
null,
null,
null,
null,
null);
// when
@@ -191,6 +192,7 @@ public class TrackStatisticsUpdaterTest {
HeartRate.of(50),
null,
null,
null,
null
),
new TrackPoint(
@@ -201,6 +203,7 @@ public class TrackStatisticsUpdaterTest {
HeartRate.of(50),
null,
null,
null,
null
),
createTrackPoint(0, 1, Altitude.WGS84.of(0), Instant.ofEpochSecond(50)),
@@ -228,6 +231,7 @@ public class TrackStatisticsUpdaterTest {
null,
null,
null,
null,
null
),
new TrackPoint(
@@ -238,6 +242,7 @@ public class TrackStatisticsUpdaterTest {
HeartRate.of(50),
null,
null,
null,
null
),
new TrackPoint(
@@ -248,6 +253,7 @@ public class TrackStatisticsUpdaterTest {
HeartRate.of(50),
null,
null,
null,
null
),
createTrackPoint(0, 0, Altitude.WGS84.of(0), Instant.ofEpochSecond(50), null, Distance.of(10)),
@@ -287,6 +293,7 @@ public class TrackStatisticsUpdaterTest {
null,
null,
null,
null,
null
)
);
@@ -306,6 +313,7 @@ public class TrackStatisticsUpdaterTest {
null,
null,
null,
null,
null
)
);
@@ -325,6 +333,7 @@ public class TrackStatisticsUpdaterTest {
null,
null,
null,
null,
null
)
);
@@ -407,6 +416,7 @@ public class TrackStatisticsUpdaterTest {
null,
null,
null,
null,
null
);
}