Fix null race-condition for heart rate sensor data

The previous implementation was technically safe because the sensor
never had null values. Now that it can, the calls to getHeartRate
must be stored instead of repeated to avoid a race condition where the
sensor data become null between the null-check and the second call
This commit is contained in:
frazou
2025-11-22 15:44:52 +01:00
parent a3407ccbea
commit afd1232940
2 changed files with 10 additions and 7 deletions
@@ -161,8 +161,9 @@ public class SensorDataSet {
trackPoint.setPosition(gps.getAggregatedValue(trackPointCreator.createNow()));
}
if (getHeartRate() != null) {
trackPoint.setHeartRate(getHeartRate().first);
Pair<HeartRate, String> heartRate = getHeartRate();
if (heartRate != null) {
trackPoint.setHeartRate(heartRate.first);
}
if (getCadence() != null) {
@@ -6,6 +6,7 @@ import android.view.LayoutInflater;
import java.time.Instant;
import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.data.models.HeartRate;
import de.dennisguse.opentracks.data.models.HeartRateZones;
import de.dennisguse.opentracks.databinding.StatsSensorItemBinding;
import de.dennisguse.opentracks.sensors.sensorData.SensorDataSet;
@@ -36,9 +37,10 @@ public abstract class SensorStatisticsViewHolder extends StatisticViewHolder<Sta
String sensorName = getContext().getString(R.string.value_unknown);
Pair<String, String> valueAndUnit;
if (sensorDataSet != null && sensorDataSet.getHeartRate() != null) {
valueAndUnit = StringUtils.getHeartRateParts(getContext(), sensorDataSet.getHeartRate().first);
sensorName = sensorDataSet.getHeartRate().second;
Pair<HeartRate, String> heartRate;
if (sensorDataSet != null && (heartRate = sensorDataSet.getHeartRate()) != null) {
valueAndUnit = StringUtils.getHeartRateParts(getContext(), heartRate.first);
sensorName = heartRate.second;
} else {
valueAndUnit = StringUtils.getHeartRateParts(getContext(), null);
}
@@ -46,8 +48,8 @@ public abstract class SensorStatisticsViewHolder extends StatisticViewHolder<Sta
//TODO Loads preference every time
HeartRateZones zones = PreferencesUtils.getHeartRateZones();
int textColor;
if (sensorDataSet != null && sensorDataSet.getHeartRate() != null) {
textColor = zones.getTextColorForZone(getContext(), sensorDataSet.getHeartRate().first);
if (sensorDataSet != null && (heartRate = sensorDataSet.getHeartRate()) != null) {
textColor = zones.getTextColorForZone(getContext(), heartRate.first);
} else {
textColor = zones.getTextColorForZone(getContext(), null);
}