diff --git a/src/main/java/de/dennisguse/opentracks/io/file/exporter/CSVTrackExporter.java b/src/main/java/de/dennisguse/opentracks/io/file/exporter/CSVTrackExporter.java index 9d636ba2f..360e409f5 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/exporter/CSVTrackExporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/exporter/CSVTrackExporter.java @@ -153,24 +153,18 @@ public class CSVTrackExporter implements TrackExporter { } public void close() { - if (printWriter != null) { - printWriter.flush(); - printWriter = null; - } + printWriter.flush(); + printWriter = null; } public void writeHeader(List columns) { - if (printWriter != null) { - String columnNames = columns.stream().map(c -> c.columnName).reduce((s, s2) -> s + "," + s2).orElseThrow(() -> new RuntimeException("No columns defined")); - printWriter.println("#" + columnNames); - } + String columnNames = columns.stream().map(c -> c.columnName).reduce((s, s2) -> s + "," + s2).orElseThrow(() -> new RuntimeException("No columns defined")); + printWriter.println("#" + columnNames); } public void writeTrackPoint(List columns, TrackPoint trackPoint) { - if (printWriter != null) { - String columnNames = columns.stream().map(c -> c.extractor.apply(trackPoint)).reduce((s, s2) -> s + "," + s2).orElseThrow(() -> new RuntimeException("No columns defined")); - printWriter.println(columnNames); - } + String columnNames = columns.stream().map(c -> c.extractor.apply(trackPoint)).reduce((s, s2) -> s + "," + s2).orElseThrow(() -> new RuntimeException("No columns defined")); + printWriter.println(columnNames); } private static class Column { diff --git a/src/main/java/de/dennisguse/opentracks/io/file/exporter/GPXTrackExporter.java b/src/main/java/de/dennisguse/opentracks/io/file/exporter/GPXTrackExporter.java index 04fd0c977..e62750fa2 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/exporter/GPXTrackExporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/exporter/GPXTrackExporter.java @@ -199,42 +199,36 @@ public class GPXTrackExporter implements TrackExporter { } public void close() { - if (printWriter != null) { - printWriter.flush(); - printWriter = null; - } + printWriter.flush(); + printWriter = null; } public void writeHeader() { - if (printWriter != null) { - printWriter.println(""); - printWriter.println(""); - } + printWriter.println(""); + printWriter.println(""); } public void writeFooter() { - if (printWriter != null) { - printWriter.println(""); - } + printWriter.println(""); } private void writeMarkers(Track track) throws InterruptedException { @@ -254,49 +248,43 @@ public class GPXTrackExporter implements TrackExporter { } public void writeMarker(ZoneOffset zoneOffset, Marker marker) { - if (printWriter != null) { - printWriter.println(""); - if (marker.hasAltitude()) { - printWriter.println("" + ALTITUDE_FORMAT.format(marker.getAltitude().toM()) + ""); - } - printWriter.println(""); - printWriter.println("" + StringUtils.formatCData(marker.getName()) + ""); - printWriter.println("" + StringUtils.formatCData(marker.getDescription()) + ""); - printWriter.println("" + StringUtils.formatCData(marker.getCategory()) + ""); - printWriter.println(""); + printWriter.println(""); + if (marker.hasAltitude()) { + printWriter.println("" + ALTITUDE_FORMAT.format(marker.getAltitude().toM()) + ""); } + printWriter.println(""); + printWriter.println("" + StringUtils.formatCData(marker.getName()) + ""); + printWriter.println("" + StringUtils.formatCData(marker.getDescription()) + ""); + printWriter.println("" + StringUtils.formatCData(marker.getCategory()) + ""); + printWriter.println(""); } public void writeBeginTrack(Track track) { - if (printWriter != null) { - printWriter.println(""); - printWriter.println("" + StringUtils.formatCData(track.getName()) + ""); - printWriter.println("" + StringUtils.formatCData(track.getDescription()) + ""); - printWriter.println("" + StringUtils.formatCData(track.getActivityTypeLocalized()) + ""); + printWriter.println(""); + printWriter.println("" + StringUtils.formatCData(track.getName()) + ""); + printWriter.println("" + StringUtils.formatCData(track.getDescription()) + ""); + printWriter.println("" + StringUtils.formatCData(track.getActivityTypeLocalized()) + ""); - printWriter.println(""); - printWriter.println("c0c0c0"); - printWriter.println("" + track.getUuid() + ""); + printWriter.println(""); + printWriter.println("c0c0c0"); + printWriter.println("" + track.getUuid() + ""); - TrackStatistics trackStatistics = track.getTrackStatistics(); - printWriter.println(""); - printWriter.println("" + trackStatistics.getTotalDistance().toM() + ""); - printWriter.println("" + trackStatistics.getTotalTime().getSeconds() + ""); - printWriter.println("" + trackStatistics.getMovingTime().getSeconds() + ""); - printWriter.println("" + trackStatistics.getStoppedTime().getSeconds() + ""); - printWriter.println("" + trackStatistics.getMaxSpeed().toMPS() + ""); - printWriter.println("" + trackStatistics.getTotalAltitudeGain() + ""); - printWriter.println("" + trackStatistics.getTotalAltitudeLoss() + ""); - printWriter.println(""); + TrackStatistics trackStatistics = track.getTrackStatistics(); + printWriter.println(""); + printWriter.println("" + trackStatistics.getTotalDistance().toM() + ""); + printWriter.println("" + trackStatistics.getTotalTime().getSeconds() + ""); + printWriter.println("" + trackStatistics.getMovingTime().getSeconds() + ""); + printWriter.println("" + trackStatistics.getStoppedTime().getSeconds() + ""); + printWriter.println("" + trackStatistics.getMaxSpeed().toMPS() + ""); + printWriter.println("" + trackStatistics.getTotalAltitudeGain() + ""); + printWriter.println("" + trackStatistics.getTotalAltitudeLoss() + ""); + printWriter.println(""); - printWriter.println(""); - } + printWriter.println(""); } public void writeEndTrack() { - if (printWriter != null) { - printWriter.println(""); - } + printWriter.println(""); } public void writeOpenSegment() { @@ -310,67 +298,65 @@ public class GPXTrackExporter implements TrackExporter { public Distance writeTrackPoint(ZoneOffset zoneOffset, TrackPoint trackPoint, List sensorPoints, Distance trackDistance) { Distance cumulativeDistance = null; - if (printWriter != null) { + printWriter.println(""); - printWriter.println(""); - - if (trackPoint.hasAltitude()) { - printWriter.println("" + ALTITUDE_FORMAT.format(trackPoint.getAltitude().toM()) + ""); - } - - printWriter.println(""); - - { - String trackPointExtensionContent = ""; - - if (trackPoint.hasSpeed()) { - trackPointExtensionContent += "" + SPEED_FORMAT.format(trackPoint.getSpeed().toMPS()) + "\n"; - } - - if (trackPoint.hasHeartRate()) { - trackPointExtensionContent += "" + HEARTRATE_FORMAT.format(trackPoint.getHeartRate().getBPM()) + "\n"; - } - - if (trackPoint.hasCadence()) { - trackPointExtensionContent += "" + CADENCE_FORMAT.format(trackPoint.getCadence().getRPM()) + "\n"; - } - - if (trackPoint.hasPower()) { - trackPointExtensionContent += "" + POWER_FORMAT.format(trackPoint.getPower().getW()) + "\n"; - } - - Double cumulativeGain = cumulateSensorData(trackPoint, sensorPoints, (tp) -> tp.hasAltitudeGain() ? (double) tp.getAltitudeGain() : null); - if (cumulativeGain != null) { - trackPointExtensionContent += ("" + ALTITUDE_FORMAT.format(cumulativeGain) + "\n"); - } - - Double cumulativeLoss = cumulateSensorData(trackPoint, sensorPoints, (tp) -> tp.hasAltitudeLoss() ? (double) tp.getAltitudeLoss() : null); - if (cumulativeLoss != null) { - trackPointExtensionContent += ("" + ALTITUDE_FORMAT.format(cumulativeLoss) + "\n"); - } - - if (trackPoint.hasHorizontalAccuracy()) { - trackPointExtensionContent += ("" + DISTANCE_FORMAT.format(trackPoint.getHorizontalAccuracy().toM()) + ""); - } - if (trackPoint.hasVerticalAccuracy()) { - trackPointExtensionContent += ("" + DISTANCE_FORMAT.format(trackPoint.getVerticalAccuracy().toM()) + ""); - } - - cumulativeDistance = Distance.ofOrNull(cumulateSensorData(trackPoint, sensorPoints, (tp) -> tp.hasSensorDistance() ? tp.getSensorDistance().toM() : null)); - if (cumulativeDistance != null) { - trackPointExtensionContent += ("" + DISTANCE_FORMAT.format(cumulativeDistance.toM()) + "\n"); - trackPointExtensionContent += ("" + DISTANCE_FORMAT.format(trackDistance.plus(cumulativeDistance).toM()) + "\n"); - } - - if (!trackPointExtensionContent.isEmpty()) { - printWriter.println(""); - printWriter.print(trackPointExtensionContent); - printWriter.println(""); - } - } - - printWriter.println(""); + if (trackPoint.hasAltitude()) { + printWriter.println("" + ALTITUDE_FORMAT.format(trackPoint.getAltitude().toM()) + ""); } + + printWriter.println(""); + + { + String trackPointExtensionContent = ""; + + if (trackPoint.hasSpeed()) { + trackPointExtensionContent += "" + SPEED_FORMAT.format(trackPoint.getSpeed().toMPS()) + "\n"; + } + + if (trackPoint.hasHeartRate()) { + trackPointExtensionContent += "" + HEARTRATE_FORMAT.format(trackPoint.getHeartRate().getBPM()) + "\n"; + } + + if (trackPoint.hasCadence()) { + trackPointExtensionContent += "" + CADENCE_FORMAT.format(trackPoint.getCadence().getRPM()) + "\n"; + } + + if (trackPoint.hasPower()) { + trackPointExtensionContent += "" + POWER_FORMAT.format(trackPoint.getPower().getW()) + "\n"; + } + + Double cumulativeGain = cumulateSensorData(trackPoint, sensorPoints, (tp) -> tp.hasAltitudeGain() ? (double) tp.getAltitudeGain() : null); + if (cumulativeGain != null) { + trackPointExtensionContent += ("" + ALTITUDE_FORMAT.format(cumulativeGain) + "\n"); + } + + Double cumulativeLoss = cumulateSensorData(trackPoint, sensorPoints, (tp) -> tp.hasAltitudeLoss() ? (double) tp.getAltitudeLoss() : null); + if (cumulativeLoss != null) { + trackPointExtensionContent += ("" + ALTITUDE_FORMAT.format(cumulativeLoss) + "\n"); + } + + if (trackPoint.hasHorizontalAccuracy()) { + trackPointExtensionContent += ("" + DISTANCE_FORMAT.format(trackPoint.getHorizontalAccuracy().toM()) + ""); + } + if (trackPoint.hasVerticalAccuracy()) { + trackPointExtensionContent += ("" + DISTANCE_FORMAT.format(trackPoint.getVerticalAccuracy().toM()) + ""); + } + + cumulativeDistance = Distance.ofOrNull(cumulateSensorData(trackPoint, sensorPoints, (tp) -> tp.hasSensorDistance() ? tp.getSensorDistance().toM() : null)); + if (cumulativeDistance != null) { + trackPointExtensionContent += ("" + DISTANCE_FORMAT.format(cumulativeDistance.toM()) + "\n"); + trackPointExtensionContent += ("" + DISTANCE_FORMAT.format(trackDistance.plus(cumulativeDistance).toM()) + "\n"); + } + + if (!trackPointExtensionContent.isEmpty()) { + printWriter.println(""); + printWriter.print(trackPointExtensionContent); + printWriter.println(""); + } + } + + printWriter.println(""); + if (cumulativeDistance != null) { return cumulativeDistance; } diff --git a/src/main/java/de/dennisguse/opentracks/io/file/exporter/KMLTrackExporter.java b/src/main/java/de/dennisguse/opentracks/io/file/exporter/KMLTrackExporter.java index c38f21e31..0e999856b 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/exporter/KMLTrackExporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/exporter/KMLTrackExporter.java @@ -212,196 +212,170 @@ public class KMLTrackExporter implements TrackExporter { @VisibleForTesting void close() { - if (printWriter != null) { - printWriter.flush(); - printWriter = null; - } + printWriter.flush(); + printWriter = null; } private void writeHeader(List tracks) { - if (printWriter != null) { - printWriter.println( - """ - - """); - printWriter.println( - """ - - """); //TODO ADD xsi:schemaLocation for atom - printWriter.println(""); - printWriter.println("1"); - printWriter.println("1"); + printWriter.println( + """ + + """); + printWriter.println( + """ + + """); //TODO ADD xsi:schemaLocation for atom + printWriter.println(""); + printWriter.println("1"); + printWriter.println("1"); - Track track = tracks.get(0); - printWriter.println("" + StringUtils.formatCData(track.getName()) + ""); - printWriter.println("" + StringUtils.formatCData(context.getString(R.string.app_name)) + ""); + Track track = tracks.get(0); + printWriter.println("" + StringUtils.formatCData(track.getName()) + ""); + printWriter.println("" + StringUtils.formatCData(context.getString(R.string.app_name)) + ""); - writeTrackStyle(); - writePlacemarkerStyle(); - printWriter.println(""); + writeTrackStyle(); + writePlacemarkerStyle(); + printWriter.println(""); - writeSimpleArrayStyle(EXTENDED_DATA_TYPE_SPEED, context.getString(R.string.description_speed_ms)); - writeSimpleArrayStyle(EXTENDED_DATA_TYPE_POWER, context.getString(R.string.description_sensor_power)); - writeSimpleArrayStyle(EXTENDED_DATA_TYPE_CADENCE, context.getString(R.string.description_sensor_cadence)); - writeSimpleArrayStyle(EXTENDED_DATA_TYPE_HEART_RATE, context.getString(R.string.description_sensor_heart_rate)); + writeSimpleArrayStyle(EXTENDED_DATA_TYPE_SPEED, context.getString(R.string.description_speed_ms)); + writeSimpleArrayStyle(EXTENDED_DATA_TYPE_POWER, context.getString(R.string.description_sensor_power)); + writeSimpleArrayStyle(EXTENDED_DATA_TYPE_CADENCE, context.getString(R.string.description_sensor_cadence)); + writeSimpleArrayStyle(EXTENDED_DATA_TYPE_HEART_RATE, context.getString(R.string.description_sensor_heart_rate)); - printWriter.println(""); - } + printWriter.println(""); } private void writeFooter() { - if (printWriter != null) { - printWriter.println(""); - printWriter.println(""); - } + printWriter.println(""); + printWriter.println(""); } private void writeBeginMarkers(Track track) { - if (printWriter != null) { - printWriter.println(""); - printWriter.println("" + StringUtils.formatCData(context.getString(R.string.track_markers, track.getName())) + ""); - printWriter.println("1"); - } + printWriter.println(""); + printWriter.println("" + StringUtils.formatCData(context.getString(R.string.track_markers, track.getName())) + ""); + printWriter.println("1"); } private void writeMarker(Marker marker, ZoneOffset zoneOffset) { - if (printWriter != null) { - boolean existsPhoto = MarkerUtils.buildInternalPhotoFile(context, marker.getTrackId(), marker.getPhotoURI()) != null; - if (marker.hasPhoto() && exportPhotos && existsPhoto) { - float heading = getHeading(marker.getTrackId(), marker.getLocation()); - writePhotoOverlay(marker, heading, zoneOffset); - } else { - writePlacemark(marker.getName(), marker.getCategory(), marker.getDescription(), marker.getLocation(), zoneOffset); - } + boolean existsPhoto = MarkerUtils.buildInternalPhotoFile(context, marker.getTrackId(), marker.getPhotoURI()) != null; + if (marker.hasPhoto() && exportPhotos && existsPhoto) { + float heading = getHeading(marker.getTrackId(), marker.getLocation()); + writePhotoOverlay(marker, heading, zoneOffset); + } else { + writePlacemark(marker.getName(), marker.getCategory(), marker.getDescription(), marker.getLocation(), zoneOffset); } } private void writeEndMarkers() { - if (printWriter != null) { - printWriter.println(""); - } + printWriter.println(""); } private void writeMultiTrackBegin() { - if (printWriter != null) { - printWriter.println(""); - printWriter.println("" + context.getString(R.string.generic_tracks) + ""); - printWriter.println("1"); - } + printWriter.println(""); + printWriter.println("" + context.getString(R.string.generic_tracks) + ""); + printWriter.println("1"); } private void writeMultiTrackEnd() { - if (printWriter != null) { - printWriter.println(""); - } + printWriter.println(""); } private void writeBeginTrack(Track track) { - if (printWriter != null) { - printWriter.println(""); + printWriter.println(""); - printWriter.println("" + StringUtils.formatCData(track.getName()) + ""); - printWriter.println("" + StringUtils.formatCData(track.getDescription()) + ""); - printWriter.println("" + StringUtils.formatCData(track.getActivityType().getIconId()) + ""); - printWriter.println("" + track.getUuid() + ""); + printWriter.println("" + StringUtils.formatCData(track.getName()) + ""); + printWriter.println("" + StringUtils.formatCData(track.getDescription()) + ""); + printWriter.println("" + StringUtils.formatCData(track.getActivityType().getIconId()) + ""); + printWriter.println("" + track.getUuid() + ""); - printWriter.println("#" + TRACK_STYLE + ""); - writeActivityType(track.getActivityTypeLocalized()); - printWriter.println(""); - printWriter.println("absolute"); - printWriter.println("1"); - } + printWriter.println("#" + TRACK_STYLE + ""); + writeActivityType(track.getActivityTypeLocalized()); + printWriter.println(""); + printWriter.println("absolute"); + printWriter.println("1"); } private void writeEndTrack() { - if (printWriter != null) { - printWriter.println(""); - printWriter.println(""); - } + printWriter.println(""); + printWriter.println(""); } @VisibleForTesting void writeOpenSegment() { - if (printWriter != null) { - printWriter.println(""); - speedList.clear(); - distanceList.clear(); - powerList.clear(); - cadenceList.clear(); - heartRateList.clear(); - altitudeGainList.clear(); - altitudeLossList.clear(); - accuracyHorizontal.clear(); - accuracyVertical.clear(); - } + printWriter.println(""); + speedList.clear(); + distanceList.clear(); + powerList.clear(); + cadenceList.clear(); + heartRateList.clear(); + altitudeGainList.clear(); + altitudeLossList.clear(); + accuracyHorizontal.clear(); + accuracyVertical.clear(); } @VisibleForTesting void writeCloseSegment() { - if (printWriter != null) { - printWriter.println(""); - printWriter.println(""); - if (speedList.stream().anyMatch(Objects::nonNull)) { - writeSimpleArrayData(speedList, EXTENDED_DATA_TYPE_SPEED); - } - if (distanceList.stream().anyMatch(Objects::nonNull)) { - writeSimpleArrayData(distanceList, EXTENDED_DATA_TYPE_DISTANCE); - } - if (powerList.stream().anyMatch(Objects::nonNull)) { - writeSimpleArrayData(powerList, EXTENDED_DATA_TYPE_POWER); - } - if (cadenceList.stream().anyMatch(Objects::nonNull)) { - writeSimpleArrayData(cadenceList, EXTENDED_DATA_TYPE_CADENCE); - } - if (heartRateList.stream().anyMatch(Objects::nonNull)) { - writeSimpleArrayData(heartRateList, EXTENDED_DATA_TYPE_HEART_RATE); - } - if (altitudeGainList.stream().anyMatch(Objects::nonNull)) { - writeSimpleArrayData(altitudeGainList, EXTENDED_DATA_TYPE_ALTITUDE_GAIN); - } - if (altitudeLossList.stream().anyMatch(Objects::nonNull)) { - writeSimpleArrayData(altitudeLossList, EXTENDED_DATA_TYPE_ALTITUDE_LOSS); - } - if (accuracyHorizontal.stream().anyMatch(Objects::nonNull)) { - writeSimpleArrayData(accuracyHorizontal, EXTENDED_DATA_TYPE_ACCURACY_HORIZONTAL); - } - if (accuracyVertical.stream().anyMatch(Objects::nonNull)) { - writeSimpleArrayData(accuracyVertical, EXTENDED_DATA_TYPE_ACCURACY_VERTICAL); - } - printWriter.println(""); - printWriter.println(""); - printWriter.println(""); + printWriter.println(""); + printWriter.println(""); + if (speedList.stream().anyMatch(Objects::nonNull)) { + writeSimpleArrayData(speedList, EXTENDED_DATA_TYPE_SPEED); } + if (distanceList.stream().anyMatch(Objects::nonNull)) { + writeSimpleArrayData(distanceList, EXTENDED_DATA_TYPE_DISTANCE); + } + if (powerList.stream().anyMatch(Objects::nonNull)) { + writeSimpleArrayData(powerList, EXTENDED_DATA_TYPE_POWER); + } + if (cadenceList.stream().anyMatch(Objects::nonNull)) { + writeSimpleArrayData(cadenceList, EXTENDED_DATA_TYPE_CADENCE); + } + if (heartRateList.stream().anyMatch(Objects::nonNull)) { + writeSimpleArrayData(heartRateList, EXTENDED_DATA_TYPE_HEART_RATE); + } + if (altitudeGainList.stream().anyMatch(Objects::nonNull)) { + writeSimpleArrayData(altitudeGainList, EXTENDED_DATA_TYPE_ALTITUDE_GAIN); + } + if (altitudeLossList.stream().anyMatch(Objects::nonNull)) { + writeSimpleArrayData(altitudeLossList, EXTENDED_DATA_TYPE_ALTITUDE_LOSS); + } + if (accuracyHorizontal.stream().anyMatch(Objects::nonNull)) { + writeSimpleArrayData(accuracyHorizontal, EXTENDED_DATA_TYPE_ACCURACY_HORIZONTAL); + } + if (accuracyVertical.stream().anyMatch(Objects::nonNull)) { + writeSimpleArrayData(accuracyVertical, EXTENDED_DATA_TYPE_ACCURACY_VERTICAL); + } + printWriter.println(""); + printWriter.println(""); + printWriter.println(""); } @VisibleForTesting void writeTrackPoint(ZoneOffset zoneOffset, TrackPoint trackPoint) { - if (printWriter != null) { - printWriter.println("" + getTime(zoneOffset, trackPoint.getLocation()) + ""); + printWriter.println("" + getTime(zoneOffset, trackPoint.getLocation()) + ""); - if (trackPoint.hasLocation()) { - printWriter.println("" + getCoordinates(trackPoint.getLocation(), " ") + ""); - } else { - printWriter.println(""); - } - speedList.add(trackPoint.hasSpeed() ? (float) trackPoint.getSpeed().toMPS() : null); - - distanceList.add(trackPoint.hasSensorDistance() ? (float) trackPoint.getSensorDistance().toM() : null); - heartRateList.add(trackPoint.hasHeartRate() ? trackPoint.getHeartRate().getBPM() : null); - cadenceList.add(trackPoint.hasCadence() ? trackPoint.getCadence().getRPM() : null); - powerList.add(trackPoint.hasPower() ? trackPoint.getPower().getW() : null); - - altitudeGainList.add(trackPoint.hasAltitudeGain() ? trackPoint.getAltitudeGain() : null); - altitudeLossList.add(trackPoint.hasAltitudeLoss() ? trackPoint.getAltitudeLoss() : null); - accuracyHorizontal.add(trackPoint.hasHorizontalAccuracy() ? (float) trackPoint.getHorizontalAccuracy().toM() : null); - accuracyVertical.add(trackPoint.hasVerticalAccuracy() ? (float) trackPoint.getVerticalAccuracy().toM() : null); + if (trackPoint.hasLocation()) { + printWriter.println("" + getCoordinates(trackPoint.getLocation(), " ") + ""); + } else { + printWriter.println(""); } + speedList.add(trackPoint.hasSpeed() ? (float) trackPoint.getSpeed().toMPS() : null); + + distanceList.add(trackPoint.hasSensorDistance() ? (float) trackPoint.getSensorDistance().toM() : null); + heartRateList.add(trackPoint.hasHeartRate() ? trackPoint.getHeartRate().getBPM() : null); + cadenceList.add(trackPoint.hasCadence() ? trackPoint.getCadence().getRPM() : null); + powerList.add(trackPoint.hasPower() ? trackPoint.getPower().getW() : null); + + altitudeGainList.add(trackPoint.hasAltitudeGain() ? trackPoint.getAltitudeGain() : null); + altitudeLossList.add(trackPoint.hasAltitudeLoss() ? trackPoint.getAltitudeLoss() : null); + accuracyHorizontal.add(trackPoint.hasHorizontalAccuracy() ? (float) trackPoint.getHorizontalAccuracy().toM() : null); + accuracyVertical.add(trackPoint.hasVerticalAccuracy() ? (float) trackPoint.getVerticalAccuracy().toM() : null); } /** diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java index d660c7c21..24d89f5b1 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java @@ -21,6 +21,7 @@ import de.dennisguse.opentracks.data.models.Marker; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.data.models.TrackPoint; import de.dennisguse.opentracks.sensors.sensorData.SensorDataSet; +import de.dennisguse.opentracks.services.handlers.AltitudeCorrectionManager; import de.dennisguse.opentracks.services.handlers.TrackPointCreator; import de.dennisguse.opentracks.settings.PreferencesUtils; import de.dennisguse.opentracks.stats.TrackStatistics; @@ -31,9 +32,13 @@ class TrackRecordingManager implements SharedPreferences.OnSharedPreferenceChang private static final String TAG = TrackRecordingManager.class.getSimpleName(); + private static final AltitudeCorrectionManager ALTITUDE_CORRECTION_MANAGER = new AltitudeCorrectionManager(); + private final ContentProviderUtils contentProviderUtils; private final Context context; + private final TrackPointCreator trackPointCreator; + private Distance recordingDistanceInterval; private Distance maxRecordingDistance; @@ -47,8 +52,9 @@ class TrackRecordingManager implements SharedPreferences.OnSharedPreferenceChang private TrackPoint lastStoredTrackPoint; private TrackPoint lastStoredTrackPointWithLocation; - TrackRecordingManager(Context context) { + TrackRecordingManager(Context context, TrackPointCreator trackPointCreator) { this.context = context; + this.trackPointCreator = trackPointCreator; contentProviderUtils = new ContentProviderUtils(context); } @@ -60,7 +66,7 @@ class TrackRecordingManager implements SharedPreferences.OnSharedPreferenceChang PreferencesUtils.unregisterOnSharedPreferenceChangeListener(this); } - Track.Id startNewTrack(TrackPointCreator trackPointCreator) { + Track.Id startNewTrack() { TrackPoint segmentStartTrackPoint = trackPointCreator.createSegmentStartManual(); // Create new track ZoneOffset zoneOffset = ZoneOffset.systemDefault().getRules().getOffset(segmentStartTrackPoint.getTime()); @@ -86,7 +92,7 @@ class TrackRecordingManager implements SharedPreferences.OnSharedPreferenceChang /** * @return if the recording could be started. */ - boolean resumeExistingTrack(@NonNull Track.Id resumeTrackId, @NonNull TrackPointCreator trackPointCreator) { + boolean resumeExistingTrack(@NonNull Track.Id resumeTrackId) { trackId = resumeTrackId; Track track = contentProviderUtils.getTrack(trackId); if (track == null) { @@ -102,7 +108,7 @@ class TrackRecordingManager implements SharedPreferences.OnSharedPreferenceChang return true; } - void end(TrackPointCreator trackPointCreator) { + void end() { TrackPoint segmentEnd = trackPointCreator.createSegmentEnd(); insertTrackPoint(segmentEnd, true); @@ -112,15 +118,14 @@ class TrackRecordingManager implements SharedPreferences.OnSharedPreferenceChang reset(); } - Pair> getDataForUI(TrackPointCreator trackPointCreator) { - if (trackPointCreator == null) { - return null; - } + Pair> getDataForUI() { TrackStatisticsUpdater tmpTrackStatisticsUpdater = new TrackStatisticsUpdater(trackStatisticsUpdater); Pair current = trackPointCreator.createCurrentTrackPoint(lastTrackPointUIWithSpeed, lastTrackPointUIWithAltitude, lastStoredTrackPointWithLocation); tmpTrackStatisticsUpdater.addTrackPoint(current.first); + ALTITUDE_CORRECTION_MANAGER.correctAltitude(context, current.first); + Track track = contentProviderUtils.getTrack(trackId); //Get copy if (track == null) { Log.w(TAG, "Requesting data if not recording is taking place, should not be done."); diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java index 978d1a409..ac450063e 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java @@ -38,7 +38,6 @@ import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.data.models.TrackPoint; import de.dennisguse.opentracks.sensors.sensorData.SensorDataSet; import de.dennisguse.opentracks.services.announcement.VoiceAnnouncementManager; -import de.dennisguse.opentracks.services.handlers.AltitudeCorrectionManager; import de.dennisguse.opentracks.services.handlers.GpsStatusValue; import de.dennisguse.opentracks.services.handlers.TrackPointCreator; import de.dennisguse.opentracks.util.SystemUtils; @@ -71,13 +70,7 @@ public class TrackRecordingService extends Service implements TrackPointCreator. public void run() { updateRecordingDataWhileRecording(); - Handler localHandler = TrackRecordingService.this.handler; - if (localHandler == null) { - // when this happens, no recording is running and we should not send any notifications. - //TODO This implementation is not a good idea; rather solve the issue for this properly - return; - } - localHandler.postDelayed(this, RECORDING_DATA_UPDATE_INTERVAL.toMillis()); + TrackRecordingService.this.handler.postDelayed(this, RECORDING_DATA_UPDATE_INTERVAL.toMillis()); } }; @@ -97,8 +90,6 @@ public class TrackRecordingService extends Service implements TrackPointCreator. private VoiceAnnouncementManager voiceAnnouncementManager; private TrackRecordingServiceNotificationManager notificationManager; - private AltitudeCorrectionManager egm2008CorrectionManager; - @Override public void onCreate() { super.onCreate(); @@ -110,10 +101,9 @@ public class TrackRecordingService extends Service implements TrackPointCreator. gpsStatusObservable = new MutableLiveData<>(STATUS_GPS_DEFAULT); recordingDataObservable = new MutableLiveData<>(NOT_RECORDING); - egm2008CorrectionManager = new AltitudeCorrectionManager(); - trackRecordingManager = new TrackRecordingManager(this); - trackRecordingManager.start(); trackPointCreator = new TrackPointCreator(this, this, handler); + trackRecordingManager = new TrackRecordingManager(this, trackPointCreator); + trackRecordingManager.start(); voiceAnnouncementManager = new VoiceAnnouncementManager(this); notificationManager = new TrackRecordingServiceNotificationManager(this); @@ -136,12 +126,8 @@ public class TrackRecordingService extends Service implements TrackPointCreator. notificationManager.stop(); notificationManager = null; - egm2008CorrectionManager = null; - try { - voiceAnnouncementManager.stop(); - } finally { - voiceAnnouncementManager = null; - } + voiceAnnouncementManager.stop(); + voiceAnnouncementManager = null; // This should be the next to last operation wakeLock = SystemUtils.releaseWakeLock(wakeLock); @@ -171,7 +157,7 @@ public class TrackRecordingService extends Service implements TrackPointCreator. } // Set recording status - Track.Id trackId = trackRecordingManager.startNewTrack(trackPointCreator); + Track.Id trackId = trackRecordingManager.startNewTrack(); updateRecordingStatus(RecordingStatus.record(trackId)); startRecording(); @@ -179,7 +165,7 @@ public class TrackRecordingService extends Service implements TrackPointCreator. } public void resumeTrack(Track.Id trackId) { - if (!trackRecordingManager.resumeExistingTrack(trackId, trackPointCreator)) { + if (!trackRecordingManager.resumeExistingTrack(trackId)) { Log.w(TAG, "Cannot resume a non-existing track."); return; } @@ -223,7 +209,7 @@ public class TrackRecordingService extends Service implements TrackPointCreator. // Set recording status updateRecordingStatus(STATUS_DEFAULT); - trackRecordingManager.end(trackPointCreator); + trackRecordingManager.end(); endRecording(); stopSelf(); @@ -272,13 +258,8 @@ public class TrackRecordingService extends Service implements TrackPointCreator. @Override public void newGpsStatus(GpsStatusValue gpsStatusValue) { - - //TODO This check should not be necessary, but prevents a crash; somehow the shutdown is not working correctly as we should not receive a notification then. - // It is likely a race condition as the LocationManager provides location updates without using the Handler. - if (gpsStatusObservable != null) { - notificationManager.updateContent(getString(gpsStatusValue.message)); - gpsStatusObservable.postValue(gpsStatusValue); - } + notificationManager.updateContent(getString(gpsStatusValue.message)); + gpsStatusObservable.postValue(gpsStatusValue); } public Marker.Id insertMarker(String name, String category, String description, String photoUrl) { @@ -316,26 +297,11 @@ public class TrackRecordingService extends Service implements TrackPointCreator. } // Compute temporary track statistics using sensorData and update time. + Pair> data = trackRecordingManager.getDataForUI(); - TrackPointCreator localTrackPointCreator = this.trackPointCreator; - VoiceAnnouncementManager localVoiceAnnouncementManager = this.voiceAnnouncementManager; - if (localTrackPointCreator == null || localVoiceAnnouncementManager == null) { - // when this happens, no recording is running and we should not send any notifications. - //TODO This implementation is not a good idea; rather solve the issue for this properly - return; - } + voiceAnnouncementManager.update(this, data.first); - Pair> data = trackRecordingManager.getDataForUI(trackPointCreator); - if (data == null) { - Log.w(TAG, "Requesting data if not recording is taking place, should not be done."); - return; - } - TrackPoint trackPoint = data.second.first; - egm2008CorrectionManager.correctAltitude(this, trackPoint); - - localVoiceAnnouncementManager.update(this, data.first); - - recordingDataObservable.postValue(new RecordingData(data.first, trackPoint, data.second.second)); + recordingDataObservable.postValue(new RecordingData(data.first, data.second.first, data.second.second)); } @VisibleForTesting