Cleanup: in TrackImporter create Track object when all data got loaded.

This commit is contained in:
Dennis Guse
2025-11-24 21:55:45 +01:00
parent a6d4a05839
commit 1672ba99ad
4 changed files with 37 additions and 27 deletions
@@ -60,11 +60,6 @@ public class Track {
this(ZoneOffset.UTC, statistics);
}
@Deprecated //TODO Remove
public Track(@NonNull ZoneOffset zoneOffset) {
this(zoneOffset, Statistics.DEFAULT);
}
public Track(@NonNull ZoneOffset zoneOffset, @NonNull Statistics trackStatistics) {
this.zoneOffset = zoneOffset;
this.trackStatistics = trackStatistics;
@@ -167,7 +167,7 @@ public class GPXTrackImporter extends DefaultHandler implements XMLImporter.Trac
// Backward compatibility: up v4.9.1 as <type> contained localized content.
activityTypeLocalized = activityType;
}
trackImporter.setTrack(context, name, uuid, description, activityTypeLocalized, activityType, zoneOffset);
trackImporter.setTrackData(context, name, uuid, description, activityTypeLocalized, activityType, zoneOffset);
zoneOffset = null;
}
case TAG_TRACK_SEGMENT -> onTrackSegmentEnd();
@@ -170,7 +170,7 @@ public class KMLTrackImporter extends DefaultHandler implements XMLImporter.Trac
onMarkerEnd();
case TAG_COORDINATES -> onMarkerLocationEnd();
case TAG_MULTI_TRACK, TAG_KML22_MULTI_TRACK -> {
trackImporter.setTrack(context, name, uuid, description, activityTypeLocalized, activityType, zoneOffset);
trackImporter.setTrackData(context, name, uuid, description, activityTypeLocalized, activityType, zoneOffset);
zoneOffset = null;
}
case TAG_TRACK, TAG_KML22_TRACK -> onTrackSegmentEnd();
@@ -15,6 +15,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import de.dennisguse.opentracks.R;
@@ -54,7 +55,7 @@ public class TrackImporter {
private final List<Track.Id> trackIds = new ArrayList<>();
// Current track
private Track track;
private TrackData trackData;
private final List<TrackPoint> trackPoints = new LinkedList<>();
private final List<Marker> markers = new LinkedList<>();
@@ -66,11 +67,11 @@ public class TrackImporter {
}
void newTrack() {
if (track != null) {
if (trackData != null) {
finishTrack();
}
track = null;
trackData = null;
trackPoints.clear();
markers.clear();
}
@@ -87,33 +88,32 @@ public class TrackImporter {
this.markers.addAll(markers);
}
void setTrack(Context context, String name, String uuid, String description, String activityTypeLocalized, String activityTypeId, @Nullable ZoneOffset zoneOffset) {
track = new Track(zoneOffset != null ? zoneOffset : ZoneOffset.UTC);
track.setName(name != null ? name : "");
void setTrackData(Context context, String name, String uuid, String description, String activityTypeLocalized, String activityTypeId, @Nullable ZoneOffset zoneOffset) {
trackData = new TrackData();
trackData.name = Objects.requireNonNullElse(name, ""); //TODO This should be handled by Track.
trackData.zoneOffset = Objects.requireNonNullElse(zoneOffset, ZoneOffset.UTC);
try {
track.setUuid(UUID.fromString(uuid));
trackData.uuid = UUID.fromString(uuid);
} catch (IllegalArgumentException | NullPointerException e) {
Log.w(TAG, "could not parse Track UUID, generating a new one.");
track.setUuid(UUID.randomUUID());
trackData.uuid = UUID.randomUUID();
}
track.setDescription(description != null ? description : "");
trackData.description = Objects.requireNonNullElse(description, ""); //TODO This should be handled by Track.
trackData.activityTypeLocalized = activityTypeLocalized;
if (activityTypeLocalized != null) {
track.setActivityTypeLocalized(activityTypeLocalized);
}
ActivityType activityType;
if (activityTypeId == null) {
activityType = ActivityType.findByLocalizedString(context, activityTypeLocalized);
trackData.activityType = ActivityType.findByLocalizedString(context, activityTypeLocalized);
} else {
activityType = ActivityType.findBy(activityTypeId);
trackData.activityType = ActivityType.findBy(activityTypeId);
}
track.setActivityType(activityType);
}
void finish() {
if (track != null) {
if (trackData != null) {
finishTrack();
}
}
@@ -124,13 +124,13 @@ public class TrackImporter {
}
// Store Track
if (contentProviderUtils.getTrack(track.getUuid()) != null) {
if (contentProviderUtils.getTrack(trackData.uuid) != null) {
if (preventReimport) {
throw new ImportAlreadyExistsException(context.getString(R.string.import_prevent_reimport));
}
//TODO This is a workaround until we have proper UI.
track.setUuid(UUID.randomUUID());
trackData.uuid = UUID.randomUUID();
}
trackPoints.sort((o1, o2) -> {
@@ -146,7 +146,12 @@ public class TrackImporter {
adjustTrackPoints();
TrackStatisticsUpdater updater = new TrackStatisticsUpdater(trackPoints);
track.setStatistics(updater.getTrackStatistics());
Track track = new Track(trackData.zoneOffset, updater.getTrackStatistics());
track.setName(trackData.name);
track.setUuid(trackData.uuid);
track.setDescription(trackData.description);
track.setActivityType(trackData.activityType);
track.setActivityTypeLocalized(trackData.activityTypeLocalized);
Track.Id trackId = contentProviderUtils.insertTrack(track);
@@ -249,4 +254,14 @@ public class TrackImporter {
contentProviderUtils.deleteTracks(context, trackIds);
}
private class TrackData {
private String name;
private UUID uuid;
private String description;
private String activityTypeLocalized;
private ActivityType activityType;
private ZoneOffset zoneOffset;
}
}