diff --git a/src/main/java/de/dennisguse/opentracks/data/CustomSQLiteOpenHelper.java b/src/main/java/de/dennisguse/opentracks/data/CustomSQLiteOpenHelper.java index 3985c1293..9a257a3ad 100644 --- a/src/main/java/de/dennisguse/opentracks/data/CustomSQLiteOpenHelper.java +++ b/src/main/java/de/dennisguse/opentracks/data/CustomSQLiteOpenHelper.java @@ -29,7 +29,7 @@ class CustomSQLiteOpenHelper extends SQLiteOpenHelper { private static final String TAG = CustomSQLiteOpenHelper.class.getSimpleName(); - private static final int DATABASE_VERSION = 42; + private static final int DATABASE_VERSION = 43; private final Context context; @@ -86,6 +86,7 @@ class CustomSQLiteOpenHelper extends SQLiteOpenHelper { case 40 -> upgradeFrom39to40(db); case 41 -> upgradeFrom40to41(db); case 42 -> upgradeFrom41to42(db); + case 43 -> upgradeFrom42to43(db); default -> throw new RuntimeException("Not implemented: upgrade to " + toVersion); } } @@ -115,6 +116,7 @@ class CustomSQLiteOpenHelper extends SQLiteOpenHelper { case 39 -> downgradeFrom40to39(db); case 40 -> downgradeFrom41to40(db); case 41 -> downgradeFrom42to41(db); + case 42 -> downgradeFrom43to42(db); default -> throw new RuntimeException("Not implemented: downgrade to " + toVersion); } } @@ -794,4 +796,18 @@ class CustomSQLiteOpenHelper extends SQLiteOpenHelper { db.setTransactionSuccessful(); db.endTransaction(); } + + private void upgradeFrom42to43(SQLiteDatabase db) { + db.beginTransaction(); + + db.execSQL("UPDATE trackpoints SET heartrate = null WHERE heartrate = 0.0"); + + + db.setTransactionSuccessful(); + db.endTransaction(); + } + + private void downgradeFrom43to42(SQLiteDatabase db) { + // Downgrade not possible: invalid data replaced with null. + } } diff --git a/src/main/java/de/dennisguse/opentracks/data/models/HeartRate.java b/src/main/java/de/dennisguse/opentracks/data/models/HeartRate.java index a2b748fab..78eeec25b 100644 --- a/src/main/java/de/dennisguse/opentracks/data/models/HeartRate.java +++ b/src/main/java/de/dennisguse/opentracks/data/models/HeartRate.java @@ -12,7 +12,10 @@ public record HeartRate(float value) { @Nullable public static HeartRate ofOrNull(Float value) { if (value == null) return null; - return new HeartRate(value); + HeartRate rate = of(value); + if (rate.isValid()) return rate; + + return null; } public float getBPM() { diff --git a/src/main/java/de/dennisguse/opentracks/data/models/TrackPoint.java b/src/main/java/de/dennisguse/opentracks/data/models/TrackPoint.java index 2744be7a6..b44008dec 100644 --- a/src/main/java/de/dennisguse/opentracks/data/models/TrackPoint.java +++ b/src/main/java/de/dennisguse/opentracks/data/models/TrackPoint.java @@ -119,6 +119,19 @@ public record TrackPoint( ); } + public TrackPoint removeHeartRate() { + return new TrackPoint( + id, + type, + position, + sensorDistance, + null, + cadence, + power, + altitudeGainLoss + ); + } + public TrackPoint with(Position newPosition) { return new TrackPoint( id, diff --git a/src/main/java/de/dennisguse/opentracks/io/file/importer/GPXTrackImporter.java b/src/main/java/de/dennisguse/opentracks/io/file/importer/GPXTrackImporter.java index 0c4f82465..bb4422408 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/importer/GPXTrackImporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/importer/GPXTrackImporter.java @@ -356,7 +356,7 @@ public class GPXTrackImporter extends DefaultHandler implements XMLImporter.Trac HeartRate parsedHeartRate = null; if (heartrate != null) { try { - parsedHeartRate = HeartRate.of(Float.parseFloat(heartrate)); + parsedHeartRate = HeartRate.ofOrNull(Float.parseFloat(heartrate)); } catch (NumberFormatException e) { throw new ParsingException(createErrorMessage(String.format(Locale.US, "Unable to parse heart rate: %s", heartrate)), e); } diff --git a/src/main/java/de/dennisguse/opentracks/io/file/importer/TrackImporter.java b/src/main/java/de/dennisguse/opentracks/io/file/importer/TrackImporter.java index e46f5f21c..735b45e5e 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/importer/TrackImporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/importer/TrackImporter.java @@ -190,6 +190,15 @@ public class TrackImporter { } trackPoints.set(i, newCurrent); } + + } + + for (int i = 0; i < trackPoints.size(); i++) { + TrackPoint current = trackPoints.get(i); + if (!current.heartRate().isValid()) { + current = current.removeHeartRate(); + trackPoints.set(i, current); + } } } diff --git a/src/main/java/de/dennisguse/opentracks/sensors/driver/HeartRateBluetooth.java b/src/main/java/de/dennisguse/opentracks/sensors/driver/HeartRateBluetooth.java index 15df1f19b..2c7b20b10 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/driver/HeartRateBluetooth.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/driver/HeartRateBluetooth.java @@ -1,6 +1,7 @@ package de.dennisguse.opentracks.sensors.driver; import android.bluetooth.BluetoothGattCharacteristic; +import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; @@ -13,6 +14,8 @@ import de.dennisguse.opentracks.sensors.ServiceMeasurementUUID; public class HeartRateBluetooth implements BluetoothDriver.BluetoothParser { + private static final String TAG = BluetoothHandlerManagerHeartRate.class.getSimpleName(); + public static final ServiceMeasurementUUID HEARTRATE = new ServiceMeasurementUUID( new UUID(0x180D00001000L, 0x800000805f9b34fbL), new UUID(0x2A3700001000L, 0x800000805f9b34fbL) @@ -35,7 +38,16 @@ public class HeartRateBluetooth implements BluetoothDriver.BluetoothParser { @Override protected void computeValue(Raw current) { - if (current.value().isValid()) { - this.output = current.value(); - } + this.output = current.value(); } }