Skip to content
This repository was archived by the owner on Aug 24, 2025. It is now read-only.

Commit 1719d21

Browse files
committed
Bugfix: export now really includes sensor data (as double) and import is done as float.
1 parent 75ef8d9 commit 1719d21

4 files changed

Lines changed: 57 additions & 38 deletions

File tree

src/main/java/de/dennisguse/opentracks/io/file/exporter/KmlTrackWriter.java

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,10 @@ public class KmlTrackWriter implements TrackWriter {
4949
private static final String END_STYLE = "end";
5050
private static final String TRACK_STYLE = "track";
5151
private static final String SCHEMA_ID = "schema";
52-
private static final String CADENCE = "cadence";
53-
private static final String HEART_RATE = "heart_rate";
54-
private static final String POWER = "power";
52+
53+
private static final String SENSOR_TYPE_CADENCE = "cadence";
54+
private static final String SENSOR_TYPE_HEART_RATE = "heart_rate";
55+
private static final String SENSOR_TYPE_POWER = "power";
5556

5657
private static final String WAYPOINT_ICON = "http://maps.google.com/mapfiles/kml/pushpin/blue-pushpin.png";
5758
private static final String STATISTICS_ICON = "http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png";
@@ -129,9 +130,9 @@ public void writeHeader(Track[] tracks) {
129130
printWriter.println("<Schema id=\"" + SCHEMA_ID + "\">");
130131

131132
if (exportSensorData) {
132-
writeSensorStyle(POWER, context.getString(R.string.description_sensor_power));
133-
writeSensorStyle(CADENCE, context.getString(R.string.description_sensor_cadence));
134-
writeSensorStyle(HEART_RATE, context.getString(R.string.description_sensor_heart_rate));
133+
writeSensorStyle(SENSOR_TYPE_POWER, context.getString(R.string.description_sensor_power));
134+
writeSensorStyle(SENSOR_TYPE_CADENCE, context.getString(R.string.description_sensor_cadence));
135+
writeSensorStyle(SENSOR_TYPE_HEART_RATE, context.getString(R.string.description_sensor_heart_rate));
135136
}
136137
printWriter.println("</Schema>");
137138
}
@@ -245,13 +246,13 @@ public void writeCloseSegment() {
245246
printWriter.println("<SchemaData schemaUrl=\"#" + SCHEMA_ID + "\">");
246247
if (exportSensorData) {
247248
if (powerList.size() > 0) {
248-
writeSensorData(powerList, POWER);
249+
writeSensorData(powerList, SENSOR_TYPE_POWER);
249250
}
250251
if (cadenceList.size() > 0) {
251-
writeSensorData(cadenceList, CADENCE);
252+
writeSensorData(cadenceList, SENSOR_TYPE_CADENCE);
252253
}
253254
if (heartRateList.size() > 0) {
254-
writeSensorData(heartRateList, HEART_RATE);
255+
writeSensorData(heartRateList, SENSOR_TYPE_HEART_RATE);
255256
}
256257
}
257258
printWriter.println("</SchemaData>");
@@ -460,11 +461,11 @@ private void writePlacemarkerStyle(String name, String url, int x, int y) {
460461
* Writes a sensor style.
461462
*
462463
* @param name the name of the sesnor
463-
* @param displayName the sensor display name
464+
* @param sensorType the sensor display name
464465
*/
465-
private void writeSensorStyle(String name, String displayName) {
466-
printWriter.println("<gx:SimpleArrayField name=\"" + name + "\" type=\"int\">");
467-
printWriter.println("<displayName>" + StringUtils.formatCData(displayName) + "</displayName>");
466+
private void writeSensorStyle(String name, String sensorType) {
467+
printWriter.println("<gx:SimpleArrayField name=\"" + name + "\" type=\"float\">");
468+
printWriter.println("<displayName>" + StringUtils.formatCData(sensorType) + "</displayName>");
468469
printWriter.println("</gx:SimpleArrayField>");
469470
}
470471
}

src/main/java/de/dennisguse/opentracks/io/file/importer/AbstractFileTrackImporter.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -384,8 +384,7 @@ protected void insertTrackPoint(Location location) {
384384
* @param message the message
385385
*/
386386
protected String createErrorMessage(String message) {
387-
return String.format(Locale.US, "Parsing error at line: %d column: %d. %s",
388-
locator.getLineNumber(), locator.getColumnNumber(), message);
387+
return String.format(Locale.US, "Parsing error at line: %d column: %d. %s", locator.getLineNumber(), locator.getColumnNumber(), message);
389388
}
390389

391390
/**

src/main/java/de/dennisguse/opentracks/io/file/importer/KmlFileTrackImporter.java

Lines changed: 41 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import android.content.Context;
2020
import android.location.Location;
2121
import android.net.Uri;
22+
import android.util.Log;
2223

2324
import androidx.annotation.VisibleForTesting;
2425

@@ -39,6 +40,8 @@
3940
*/
4041
public class KmlFileTrackImporter extends AbstractFileTrackImporter {
4142

43+
private static final String TAG = KmlFileTrackImporter.class.getSimpleName();
44+
4245
private static final String CADENCE = "cadence";
4346
private static final String HEART_RATE = "heart_rate";
4447
private static final String POWER = "power";
@@ -65,11 +68,11 @@ public class KmlFileTrackImporter extends AbstractFileTrackImporter {
6568
private static final String ATTRIBUTE_NAME = "name";
6669

6770
private boolean trackStarted = false;
68-
private String sensorName;
71+
private String sensorType;
6972
private ArrayList<Location> locationList;
70-
private ArrayList<Integer> cadenceList;
71-
private ArrayList<Integer> heartRateList;
72-
private ArrayList<Integer> powerList;
73+
private ArrayList<Float> cadenceList;
74+
private ArrayList<Float> heartRateList;
75+
private ArrayList<Float> powerList;
7376

7477
/**
7578
* Constructor.
@@ -229,20 +232,30 @@ protected void onTrackSegmentStart() {
229232
*/
230233
private void onTrackSegmentEnd() {
231234
// Close a track segment by inserting the segment locations
232-
boolean hasHeartRate = heartRateList.size() == locationList.size();
233-
boolean hasCadence = cadenceList.size() == locationList.size();
234-
boolean hasPower = powerList.size() == locationList.size();
235-
236235
for (int i = 0; i < locationList.size(); i++) {
237236
Location location = locationList.get(i);
238237

239-
if (!hasPower && !hasCadence && !hasHeartRate) {
238+
boolean hasSensorData = false;
239+
float heartrate = SensorDataSet.DATA_UNAVAILABLE;
240+
float cadence = SensorDataSet.DATA_UNAVAILABLE;
241+
float power = SensorDataSet.DATA_UNAVAILABLE;
242+
243+
if (i < heartRateList.size()) {
244+
heartrate = heartRateList.get(i);
245+
hasSensorData = true;
246+
}
247+
if (i < cadenceList.size()) {
248+
cadence = cadenceList.get(i);
249+
hasSensorData = true;
250+
}
251+
if (i < powerList.size()) {
252+
power = powerList.get(i);
253+
hasSensorData = true;
254+
}
255+
256+
if (!hasSensorData) {
240257
insertTrackPoint(location);
241258
} else {
242-
float heartrate = hasHeartRate ? heartRateList.get(i) : SensorDataSet.DATA_UNAVAILABLE;
243-
float cadence = hasHeartRate ? cadenceList.get(i) : SensorDataSet.DATA_UNAVAILABLE;
244-
float power = hasHeartRate ? powerList.get(i) : SensorDataSet.DATA_UNAVAILABLE;
245-
246259
SensorDataSetLocation sensorDataSetLocation = new SensorDataSetLocation(location, new SensorDataSet(heartrate, cadence, power, SensorDataSet.DATA_UNAVAILABLE, location.getTime()));
247260
insertTrackPoint(sensorDataSetLocation);
248261
}
@@ -277,7 +290,7 @@ private void onTrackPointEnd() throws SAXException {
277290
* On sensor data start. gx:SimpleArrayData start tag.
278291
*/
279292
private void onSensorDataStart(Attributes attributes) {
280-
sensorName = attributes.getValue(ATTRIBUTE_NAME);
293+
sensorType = attributes.getValue(ATTRIBUTE_NAME);
281294
}
282295

283296
/**
@@ -291,18 +304,24 @@ private void onSensorValueEnd() throws SAXException {
291304
if (content.equals("")) {
292305
return;
293306
}
294-
int value;
307+
float value;
295308
try {
296-
value = Integer.parseInt(content);
309+
value = Float.valueOf(content);
297310
} catch (NumberFormatException e) {
298311
throw new SAXException(createErrorMessage("Unable to parse gx:value:" + content), e);
299312
}
300-
if (POWER.equals(sensorName)) {
301-
powerList.add(value);
302-
} else if (HEART_RATE.equals(sensorName)) {
303-
heartRateList.add(value);
304-
} else if (CADENCE.equals(sensorName)) {
305-
cadenceList.add(value);
313+
switch (sensorType) {
314+
case POWER:
315+
powerList.add(value);
316+
break;
317+
case HEART_RATE:
318+
heartRateList.add(value);
319+
break;
320+
case CADENCE:
321+
cadenceList.add(value);
322+
break;
323+
default:
324+
Log.w(TAG, "Data from sensor " + sensorType + " is not (yet) supported.");
306325
}
307326
}
308327
}

src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -853,7 +853,7 @@ private void onLocationChangedAsync(Location location) {
853853
*/
854854
private void insertLocation(Track track, Location location, Location lastValidTrackPoint) {
855855
if (location == null) {
856-
Log.w(TAG, "Ignore insertLocation. loation is null.");
856+
Log.w(TAG, "Ignore insertLocation. location is null.");
857857
return;
858858
}
859859
// Do not insert if inserted already

0 commit comments

Comments
 (0)