From 24bfec4c77627623c801d6abaa623895d9efa0cd Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Fri, 21 Feb 2025 22:50:24 +0100 Subject: [PATCH 1/3] Cleanup: Marker stores URI to photo (instead of String). --- .../opentracks/content/data/TestDataUtil.java | 3 +- .../data/CustomContentProviderUtilsTest.java | 34 ------------------- .../io/file/importer/ExportImportTest.java | 7 ++-- .../opentracks/data/ContentProviderUtils.java | 8 +++-- .../opentracks/data/models/Marker.java | 16 +++------ .../io/file/exporter/KMLTrackExporter.java | 2 +- .../io/file/exporter/KmzTrackExporter.java | 2 +- .../io/file/importer/GpxTrackImporter.java | 3 +- .../io/file/importer/KmlTrackImporter.java | 5 +-- .../io/file/importer/KmzTrackImporter.java | 2 +- .../io/file/importer/TrackImporter.java | 7 ++-- .../opentracks/share/ShareUtils.java | 6 ++-- .../ui/markers/MarkerDetailFragment.java | 2 +- .../ui/markers/MarkerEditActivity.java | 2 +- .../ui/markers/MarkerEditViewModel.java | 18 +++++----- .../ui/markers/MarkerListAdapter.java | 2 +- .../dennisguse/opentracks/util/FileUtils.java | 4 +++ 17 files changed, 45 insertions(+), 78 deletions(-) diff --git a/src/androidTest/java/de/dennisguse/opentracks/content/data/TestDataUtil.java b/src/androidTest/java/de/dennisguse/opentracks/content/data/TestDataUtil.java index afd3ebc765..fcad0e4b1d 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/content/data/TestDataUtil.java +++ b/src/androidTest/java/de/dennisguse/opentracks/content/data/TestDataUtil.java @@ -145,14 +145,13 @@ public static Marker createMarkerWithPhoto(Context context, Track.Id trackId, Tr File dstFile = new File(MarkerUtils.getImageUrl(context, trackId)); dstFile.createNewFile(); Uri photoUri = FileUtils.getUriForFile(context, dstFile); - String photoUrl = photoUri.toString(); //TODO Use TrackStatisticsUpdater TrackStatistics stats = new TrackStatistics(); stats.setTotalDistance(Distance.of(0)); stats.setTotalTime(Duration.ofMillis(0)); - return new Marker("Marker name", "Marker description", "Marker category", "", trackId, trackPoint, photoUrl); + return new Marker("Marker name", "Marker description", "Marker category", "", trackId, trackPoint, photoUri); } public static List getTrackPoints(ContentProviderUtils contentProviderUtils, Track.Id trackId) { diff --git a/src/androidTest/java/de/dennisguse/opentracks/data/CustomContentProviderUtilsTest.java b/src/androidTest/java/de/dennisguse/opentracks/data/CustomContentProviderUtilsTest.java index 6f1cdeea94..b5bfe6ba37 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/data/CustomContentProviderUtilsTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/data/CustomContentProviderUtilsTest.java @@ -429,40 +429,6 @@ public void testCreateContentValues_marker() { assertEquals(TEST_DESC, contentValues.get(MarkerColumns.DESCRIPTION)); } - /** - * Tests the method {@link ContentProviderUtils#createMarker(Cursor)}. - */ - @Test - public void testCreateMarker() { - int startColumnIndex = 1; - int columnIndex = startColumnIndex; - when(cursorMock.getColumnIndexOrThrow(MarkerColumns._ID)).thenReturn(columnIndex++); - when(cursorMock.getColumnIndexOrThrow(MarkerColumns.NAME)).thenReturn(columnIndex++); - when(cursorMock.getColumnIndexOrThrow(MarkerColumns.TRACKID)).thenReturn(columnIndex++); - columnIndex = startColumnIndex; - // Id - when(cursorMock.isNull(columnIndex++)).thenReturn(false); - // Name - when(cursorMock.isNull(columnIndex++)).thenReturn(false); - // trackIdIndex - when(cursorMock.isNull(columnIndex++)).thenReturn(false); - long id = System.currentTimeMillis(); - columnIndex = startColumnIndex; - // Id - when(cursorMock.getLong(columnIndex++)).thenReturn(id); - // Name - String name = NAME_PREFIX + id; - when(cursorMock.getString(columnIndex++)).thenReturn(name); - // trackIdIndex - long trackId = 11L; - when(cursorMock.getLong(columnIndex++)).thenReturn(trackId); - - Marker marker = contentProviderUtils.createMarker(cursorMock); - assertEquals(id, marker.getId().id()); - assertEquals(name, marker.getName()); - assertEquals(trackId, marker.getTrackId().id()); - } - /** * Tests the method * {@link ContentProviderUtils#deleteMarker(Context, Marker.Id)} diff --git a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java index 1e7106e02a..9fc14a90d3 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java @@ -1,6 +1,7 @@ package de.dennisguse.opentracks.io.file.importer; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; @@ -139,7 +140,7 @@ public void setUp() throws TimeoutException { Distance sensorDistance = Distance.of(10); // recording distance interval sendLocation(trackPointCreator, "2020-02-02T02:02:03Z", 3, 14, 10, 13, 15, 10, 1f); - contentProviderUtils.insertMarker(new Marker("Marker 1", "Marker 1 desc", "Marker 1 category", null, trackId, service.getLastStoredTrackPointWithLocation(), "")); + contentProviderUtils.insertMarker(new Marker("Marker 1", "Marker 1 desc", "Marker 1 category", null, trackId, service.getLastStoredTrackPointWithLocation(), null)); // A sensor-only TrackPoint trackPointCreator.setClock("2020-02-02T02:02:04Z"); @@ -154,7 +155,7 @@ public void setUp() throws TimeoutException { mockSensorData(trackPointCreator, 5f, Distance.of(2), 69f, 3f, 50f, null); // Distance will be added to next TrackPoint sendLocation(trackPointCreator, "2020-02-02T02:02:17Z", 3, 14.001, 10, 13, 15, 10, 0f); - contentProviderUtils.insertMarker(new Marker("Marker 2", "Marker 2 desc", "Marker 2 category", null, trackId, service.getLastStoredTrackPointWithLocation(), "")); + contentProviderUtils.insertMarker(new Marker("Marker 2", "Marker 2 desc", "Marker 2 category", null, trackId, service.getLastStoredTrackPointWithLocation(), null)); trackPointCreator.setClock("2020-02-02T02:02:18Z"); trackPointCreator.getSensorManager().sensorDataSet = new SensorDataSet(trackPointCreator); @@ -537,7 +538,7 @@ private void assertMarkers() { assertEquals(marker.getDescription(), importMarker.getDescription()); // assertEquals(marker.getIcon(), importMarker.getIcon()); // TODO for KML assertEquals(marker.getName(), importMarker.getName()); - assertEquals("", importMarker.getPhotoUrl()); + assertFalse(importMarker.hasPhoto()); assertEquals(marker.getLocation().getLatitude(), importMarker.getLocation().getLatitude(), 0.001); assertEquals(marker.getLocation().getLongitude(), importMarker.getLocation().getLongitude(), 0.001); diff --git a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java index d609454a5f..3644760fee 100644 --- a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java +++ b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java @@ -418,7 +418,7 @@ public Marker createMarker(Cursor cursor) { marker.setIcon(cursor.getString(iconIndex)); } if (!cursor.isNull(photoUrlIndex)) { - marker.setPhotoUrl(cursor.getString(photoUrlIndex)); + marker.setPhotoUrl(Uri.parse(cursor.getString(photoUrlIndex))); } return marker; } @@ -496,7 +496,7 @@ public Marker.Id insertMarker(@NonNull Marker marker) { private void deleteMarkerPhoto(Context context, Marker marker) { if (marker != null && marker.hasPhoto()) { - Uri uri = marker.getPhotoURI(); + Uri uri = marker.getPhotoUrl(); File file = MarkerUtils.buildInternalPhotoFile(context, marker.getTrackId(), uri); if (file.exists()) { File parent = file.getParentFile(); @@ -545,7 +545,9 @@ ContentValues createContentValues(@NonNull Marker marker) { values.put(MarkerColumns.BEARING, marker.getBearing()); } - values.put(MarkerColumns.PHOTOURL, marker.getPhotoUrl()); + if (marker.hasPhoto()) { + values.put(MarkerColumns.PHOTOURL, marker.getPhotoUrl().toString()); + } return values; } diff --git a/src/main/java/de/dennisguse/opentracks/data/models/Marker.java b/src/main/java/de/dennisguse/opentracks/data/models/Marker.java index 7c328077cf..4917c8204c 100644 --- a/src/main/java/de/dennisguse/opentracks/data/models/Marker.java +++ b/src/main/java/de/dennisguse/opentracks/data/models/Marker.java @@ -24,7 +24,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import java.time.Duration; import java.time.Instant; /** @@ -51,8 +50,7 @@ public final class Marker { private Altitude altitude; private Float bearing; - @Deprecated //TODO Make an URI instead of String - private String photoUrl = ""; + private Uri photoUrl = null; public Marker(@Nullable Track.Id trackId, Instant time) { this.trackId = trackId; @@ -71,7 +69,7 @@ public Marker(@Nullable Track.Id trackId, @NonNull TrackPoint trackPoint) { } @Deprecated - public Marker(String name, String description, String category, String icon, @NonNull Track.Id trackId, @NonNull TrackPoint trackPoint, String photoUrl) { + public Marker(String name, String description, String category, String icon, @NonNull Track.Id trackId, @NonNull TrackPoint trackPoint, Uri photoUrl) { this(trackId, trackPoint); this.name = name; this.description = description; @@ -222,20 +220,16 @@ public void setBearing(float bearing) { this.bearing = bearing; } - public String getPhotoUrl() { + public Uri getPhotoUrl() { return photoUrl; } - public void setPhotoUrl(String photoUrl) { + public void setPhotoUrl(Uri photoUrl) { this.photoUrl = photoUrl; } - public Uri getPhotoURI() { - return Uri.parse(photoUrl); - } - public boolean hasPhoto() { - return photoUrl != null && !photoUrl.isEmpty(); + return photoUrl != null; } public record Id(long id) implements Parcelable { 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 833e9592d1..96e95dffae 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 @@ -270,7 +270,7 @@ private void writeBeginMarkers(Track track) { } private void writeMarker(Marker marker, ZoneOffset zoneOffset) { - boolean existsPhoto = MarkerUtils.buildInternalPhotoFile(context, marker.getTrackId(), marker.getPhotoURI()) != null; + boolean existsPhoto = MarkerUtils.buildInternalPhotoFile(context, marker.getTrackId(), marker.getPhotoUrl()) != null; if (marker.hasPhoto() && exportPhotos && existsPhoto) { float heading = getHeading(marker.getTrackId(), marker.getLocation()); writePhotoOverlay(marker, heading, zoneOffset); diff --git a/src/main/java/de/dennisguse/opentracks/io/file/exporter/KmzTrackExporter.java b/src/main/java/de/dennisguse/opentracks/io/file/exporter/KmzTrackExporter.java index a13efaa3b2..43b1162efa 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/exporter/KmzTrackExporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/exporter/KmzTrackExporter.java @@ -97,7 +97,7 @@ private void addImages(Context context, List tracks, ZipOutputStream zipO } Marker marker = contentProviderUtils.createMarker(cursor); if (marker.hasPhoto()) { - Uri uriPhoto = marker.getPhotoURI(); + Uri uriPhoto = marker.getPhotoUrl(); boolean existsPhoto = MarkerUtils.buildInternalPhotoFile(context, track.getId(), uriPhoto) != null; if (existsPhoto) { addImage(context, zipOutputStream, uriPhoto, marker); 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 91b8f6d33a..5f980fea3b 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 @@ -17,6 +17,7 @@ package de.dennisguse.opentracks.io.file.importer; import android.content.Context; +import android.net.Uri; import android.util.Log; import org.xml.sax.Attributes; @@ -109,7 +110,7 @@ public class GpxTrackImporter extends DefaultHandler implements XMLImporter.Trac private String cadence; private String power; private String markerType; - private String photoUrl; + private Uri photoUrl; private String uuid; private String gain; private String loss; diff --git a/src/main/java/de/dennisguse/opentracks/io/file/importer/KmlTrackImporter.java b/src/main/java/de/dennisguse/opentracks/io/file/importer/KmlTrackImporter.java index 31895ffbf0..a1e710ea86 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/importer/KmlTrackImporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/importer/KmlTrackImporter.java @@ -18,6 +18,7 @@ import android.content.Context; import android.location.Location; +import android.net.Uri; import android.util.Log; import org.xml.sax.Attributes; @@ -121,7 +122,7 @@ public class KmlTrackImporter extends DefaultHandler implements XMLImporter.Trac private String longitude; private String altitude; private String markerType; - private String photoUrl; + private Uri photoUrl; private String uuid; private final TrackImporter trackImporter; @@ -223,7 +224,7 @@ public void endElement(String uri, String localName, String tag) throws SAXExcep } case TAG_HREF -> { if (content != null) { - photoUrl = content.trim(); + photoUrl = Uri.parse(content.trim()); } } } diff --git a/src/main/java/de/dennisguse/opentracks/io/file/importer/KmzTrackImporter.java b/src/main/java/de/dennisguse/opentracks/io/file/importer/KmzTrackImporter.java index 00eff7b9ed..88c24f5743 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/importer/KmzTrackImporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/importer/KmzTrackImporter.java @@ -191,7 +191,7 @@ private void deleteOrphanImages(Track.Id trackId) { List photosName = new ArrayList<>(); for (Marker marker : markers) { if (marker.hasPhoto()) { - String photoUrl = Uri.decode(marker.getPhotoUrl()); + String photoUrl = Uri.decode(marker.getPhotoUrl().toString()); //TODO Why Uri.decode()? photosName.add(photoUrl.substring(photoUrl.lastIndexOf(File.separatorChar) + 1)); } } 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 e2fd7f10ec..d5df4ff69e 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 @@ -233,12 +233,11 @@ private void updateMarkers(Track.Id trackId) { * * @param externalPhotoUrl the file name */ - private String getInternalPhotoUrl(@NonNull Track.Id trackId, @NonNull String externalPhotoUrl) { - String importFileName = KmzTrackImporter.importNameForFilename(externalPhotoUrl); + private Uri getInternalPhotoUrl(@NonNull Track.Id trackId, @NonNull Uri externalPhotoUrl) { + String importFileName = KmzTrackImporter.importNameForFilename(externalPhotoUrl.toString()); File file = MarkerUtils.buildInternalPhotoFile(context, trackId, Uri.parse(importFileName)); if (file != null) { - Uri photoUri = FileUtils.getUriForFile(context, file); - return "" + photoUri; + return FileUtils.getUriForFile(context, file); } return null; diff --git a/src/main/java/de/dennisguse/opentracks/share/ShareUtils.java b/src/main/java/de/dennisguse/opentracks/share/ShareUtils.java index 7a87241aa0..df803a18e6 100644 --- a/src/main/java/de/dennisguse/opentracks/share/ShareUtils.java +++ b/src/main/java/de/dennisguse/opentracks/share/ShareUtils.java @@ -93,14 +93,14 @@ public static Intent newShareFileIntent(Context context, Marker.Id... markerIds) Log.e(TAG, "MarkerId " + markerId.id() + " could not be resolved."); continue; } - if (marker.getPhotoURI() == null) { + if (marker.getPhotoUrl() == null) { Log.e(TAG, "MarkerId " + markerId.id() + " has no picture."); continue; } - mime = context.getContentResolver().getType(marker.getPhotoURI()); + mime = context.getContentResolver().getType(marker.getPhotoUrl()); - uris.add(marker.getPhotoURI()); + uris.add(marker.getPhotoUrl()); } if (uris.isEmpty()) { diff --git a/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerDetailFragment.java b/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerDetailFragment.java index 9467aa9d52..a350d4af65 100644 --- a/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerDetailFragment.java +++ b/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerDetailFragment.java @@ -235,7 +235,7 @@ private void updateUi() { boolean hasPhoto = marker.hasPhoto(); if (hasPhoto) { handler.removeCallbacks(hideText); - viewBinding.markerDetailMarkerPhoto.setImageURI(marker.getPhotoURI()); + viewBinding.markerDetailMarkerPhoto.setImageURI(marker.getPhotoUrl()); handler.postDelayed(hideText, HIDE_TEXT_DELAY.toMillis()); } else { viewBinding.markerDetailMarkerPhoto.setImageResource(MarkerUtils.ICON_ID); diff --git a/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerEditActivity.java b/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerEditActivity.java index 40a2729821..7b544490ae 100644 --- a/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerEditActivity.java +++ b/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerEditActivity.java @@ -183,7 +183,7 @@ private void loadMarkerData(Marker data) { viewBinding.markerEditMarkerType.setText(marker.getCategory()); viewBinding.markerEditDescription.setText(marker.getDescription()); if (marker.hasPhoto()) { - setMarkerImageView(marker.getPhotoURI()); + setMarkerImageView(marker.getPhotoUrl()); } else { viewBinding.markerEditPhoto.setImageDrawable(null); } diff --git a/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerEditViewModel.java b/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerEditViewModel.java index 3bf9b2b040..5d2c8529da 100644 --- a/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerEditViewModel.java +++ b/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerEditViewModel.java @@ -41,7 +41,7 @@ public LiveData getMarkerData(@NonNull Marker.Id markerId) { Marker marker = new ContentProviderUtils(getApplication()).getMarker(markerId); if (marker.hasPhoto()) { - photoOriginalUri = marker.getPhotoURI(); + photoOriginalUri = marker.getPhotoUrl(); } markerData.postValue(marker); @@ -71,15 +71,15 @@ private void deletePhoto(@Nullable Uri photoUri) { private void deletePhoto(Marker marker) { if (marker.hasPhoto()) { - deletePhoto(marker.getPhotoURI()); + deletePhoto(marker.getPhotoUrl()); } } public void onPhotoDelete(String name, String category, String description) { Marker marker = getMarker(); if (marker.hasPhoto()) { - if (!marker.getPhotoURI().equals(photoOriginalUri)) { - deletePhoto(marker.getPhotoURI()); + if (!marker.getPhotoUrl().equals(photoOriginalUri)) { + deletePhoto(marker.getPhotoUrl()); } marker.setPhotoUrl(null); marker.setName(name); @@ -91,7 +91,7 @@ public void onPhotoDelete(String name, String category, String description) { public void onNewCameraPhoto(@NonNull Uri photoUri, String name, String category, String description) { Marker marker = getMarker(); - marker.setPhotoUrl(photoUri.toString()); + marker.setPhotoUrl(photoUri); marker.setName(name); marker.setCategory(category); marker.setDescription(description); @@ -107,7 +107,7 @@ public void onNewGalleryPhoto(@NonNull Uri srcUri, String name, String category, FileUtils.copy(srcFd, dstFile); Uri photoUri = FileUtils.getUriForFile(getApplication(), dstFile); - marker.setPhotoUrl(photoUri.toString()); + marker.setPhotoUrl(photoUri); marker.setName(name); marker.setCategory(category); marker.setDescription(description); @@ -130,7 +130,7 @@ public void onDone(String name, String category, String description) { new ContentProviderUtils(getApplication()).updateMarker(getApplication(), marker); } - if (photoOriginalUri != null && (!marker.hasPhoto() || !photoOriginalUri.equals(marker.getPhotoURI()))) { + if (photoOriginalUri != null && (!marker.hasPhoto() || !photoOriginalUri.equals(marker.getPhotoUrl()))) { deletePhoto(photoOriginalUri); } } @@ -143,7 +143,7 @@ public LiveData createNewMarker(Track.Id trackId, TrackPoint trackPoint) String name = getApplication().getString(R.string.marker_name_format, nextMarkerNumber + 1); String icon = getApplication().getString(R.string.marker_icon_url); - Marker marker = new Marker(name, "", "", icon, trackId, trackPoint, ""); + Marker marker = new Marker(name, "", "", icon, trackId, trackPoint, null); if (markerData == null) { markerData = new MutableLiveData<>(); @@ -158,7 +158,7 @@ public void onCancel(boolean isNewMarker) { // it's new marker -> clean all photos. deletePhoto(marker); deletePhoto(photoOriginalUri); - } else if (photoOriginalUri == null || (marker.hasPhoto() && !marker.getPhotoURI().equals(photoOriginalUri))) { + } else if (photoOriginalUri == null || (marker.hasPhoto() && !marker.getPhotoUrl().equals(photoOriginalUri))) { // it's an edit marker -> delete photo if it was empty or it was changed (leaving the original in that case). deletePhoto(marker); } diff --git a/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerListAdapter.java b/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerListAdapter.java index a88292b01c..9a5aeb2487 100644 --- a/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerListAdapter.java +++ b/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerListAdapter.java @@ -190,7 +190,7 @@ public void bind(Marker marker) { viewBinding.markerListItemPhoto.setLayoutParams(params); viewBinding.markerListItemTextGradient.setLayoutParams(params); - asyncLoadPhoto(viewBinding.markerListItemPhoto, marker.getPhotoURI(), marker.getId()); + asyncLoadPhoto(viewBinding.markerListItemPhoto, marker.getPhotoUrl(), marker.getId()); } viewBinding.markerListItemName.setText(marker.getName()); diff --git a/src/main/java/de/dennisguse/opentracks/util/FileUtils.java b/src/main/java/de/dennisguse/opentracks/util/FileUtils.java index d27ca84818..b6e39e285c 100644 --- a/src/main/java/de/dennisguse/opentracks/util/FileUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/FileUtils.java @@ -109,6 +109,10 @@ public static String getExtension(DocumentFile file) { return getExtension(file.getName()); } + public static String getExtension(Uri uri) { + return getExtension(uri.toString()); + } + /** * Builds a filename with the given base and the given extension, possibly adding a suffix to ensure the file doesn't exist. * From 9434f7e87764da8414bf3dea08d53f71b174394c Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Fri, 21 Feb 2025 23:14:26 +0100 Subject: [PATCH 2/3] Position: use for Marker. --- .../io/file/importer/ExportImportTest.java | 6 +-- .../opentracks/data/ContentProviderUtils.java | 10 ++--- .../opentracks/data/models/Marker.java | 5 +-- .../opentracks/data/models/TrackPoint.java | 7 ++++ .../io/file/exporter/KMLTrackExporter.java | 38 +++++++++---------- 5 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java index 9fc14a90d3..bbfe92a79e 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java @@ -540,9 +540,9 @@ private void assertMarkers() { assertEquals(marker.getName(), importMarker.getName()); assertFalse(importMarker.hasPhoto()); - assertEquals(marker.getLocation().getLatitude(), importMarker.getLocation().getLatitude(), 0.001); - assertEquals(marker.getLocation().getLongitude(), importMarker.getLocation().getLongitude(), 0.001); - assertEquals(marker.getLocation().getAltitude(), importMarker.getLocation().getAltitude(), 0.1); + assertEquals(marker.getPosition().latitude(), importMarker.getPosition().latitude(), 0.001); + assertEquals(marker.getPosition().longitude(), importMarker.getPosition().longitude(), 0.001); + assertEquals(marker.getPosition().altitude().toM(), importMarker.getPosition().altitude().toM(), 0.1); } } diff --git a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java index 3644760fee..b9921ebbc4 100644 --- a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java +++ b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java @@ -21,7 +21,6 @@ import android.content.ContentValues; import android.content.Context; import android.database.Cursor; -import android.location.Location; import android.net.Uri; import android.text.TextUtils; @@ -46,6 +45,7 @@ import de.dennisguse.opentracks.data.models.Distance; import de.dennisguse.opentracks.data.models.HeartRate; import de.dennisguse.opentracks.data.models.Marker; +import de.dennisguse.opentracks.data.models.Position; import de.dennisguse.opentracks.data.models.Power; import de.dennisguse.opentracks.data.models.Speed; import de.dennisguse.opentracks.data.models.Track; @@ -692,15 +692,11 @@ public TrackPoint.Id getLastTrackPointId(@NonNull Track.Id trackId) { /** * Gets the trackPoint id for a location. - * - * @param trackId the track id - * @param location the location - * @return trackPoint id if the location is in the track. -1L otherwise. */ @Deprecated - public TrackPoint.Id getTrackPointId(Track.Id trackId, Location location) { + public TrackPoint.Id getTrackPointId(Track.Id trackId, Position position) { String selection = TrackPointsColumns._ID + "=(SELECT MAX(" + TrackPointsColumns._ID + ") FROM " + TrackPointsColumns.TABLE_NAME + " WHERE " + TrackPointsColumns.TRACKID + "=? AND " + TrackPointsColumns.TIME + "=?)"; - String[] selectionArgs = new String[]{Long.toString(trackId.id()), Long.toString(location.getTime())}; + String[] selectionArgs = new String[]{Long.toString(trackId.id()), Long.toString(position.time().toEpochMilli())}; try (Cursor cursor = getTrackPointCursor(new String[]{TrackPointsColumns._ID}, selection, selectionArgs, TrackPointsColumns._ID)) { if (cursor != null && cursor.moveToFirst()) { return new TrackPoint.Id(cursor.getLong(cursor.getColumnIndexOrThrow(TrackPointsColumns._ID))); diff --git a/src/main/java/de/dennisguse/opentracks/data/models/Marker.java b/src/main/java/de/dennisguse/opentracks/data/models/Marker.java index 4917c8204c..b4b4f68eb7 100644 --- a/src/main/java/de/dennisguse/opentracks/data/models/Marker.java +++ b/src/main/java/de/dennisguse/opentracks/data/models/Marker.java @@ -148,7 +148,7 @@ public boolean hasLocation() { return latitude != null || longitude != null; } - public Location getLocation() { + public Position getPosition() { Location location = new Location(""); location.setTime(time.toEpochMilli()); if (hasLocation()) { @@ -164,8 +164,7 @@ public Location getLocation() { if (hasAltitude()) { location.setAltitude(altitude.toM()); } - - return location; + return Position.of(location); } public double getLatitude() { 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 e49e417156..961594214d 100644 --- a/src/main/java/de/dennisguse/opentracks/data/models/TrackPoint.java +++ b/src/main/java/de/dennisguse/opentracks/data/models/TrackPoint.java @@ -353,6 +353,13 @@ public boolean fulfillsAccuracy(Distance thresholdHorizontalAccuracy) { return hasHorizontalAccuracy() && horizontalAccuracy.lessThan(thresholdHorizontalAccuracy); } + public Optional bearingTo(@NonNull Position dest) { + if (!dest.hasLocation() || !hasLocation()) { + return Optional.empty(); + } + return bearingTo(dest.toLocation()); + } + public Optional bearingTo(@NonNull TrackPoint dest) { if (!dest.hasLocation() || !hasLocation()) { return Optional.empty(); 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 96e95dffae..2518add4c1 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 @@ -18,10 +18,10 @@ import android.content.Context; import android.database.Cursor; -import android.location.Location; import android.util.Log; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import java.io.OutputStream; @@ -40,6 +40,7 @@ import de.dennisguse.opentracks.data.TrackPointIterator; import de.dennisguse.opentracks.data.models.ActivityType; import de.dennisguse.opentracks.data.models.Marker; +import de.dennisguse.opentracks.data.models.Position; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.data.models.TrackPoint; import de.dennisguse.opentracks.ui.markers.MarkerUtils; @@ -272,10 +273,10 @@ private void writeBeginMarkers(Track track) { private void writeMarker(Marker marker, ZoneOffset zoneOffset) { boolean existsPhoto = MarkerUtils.buildInternalPhotoFile(context, marker.getTrackId(), marker.getPhotoUrl()) != null; if (marker.hasPhoto() && exportPhotos && existsPhoto) { - float heading = getHeading(marker.getTrackId(), marker.getLocation()); + float heading = getHeading(marker.getTrackId(), marker.getPosition()); writePhotoOverlay(marker, heading, zoneOffset); } else { - writePlacemark(marker.getName(), marker.getCategory(), marker.getDescription(), marker.getLocation(), marker.getTime(), zoneOffset); + writePlacemark(marker.getName(), marker.getCategory(), marker.getDescription(), marker.getPosition(), marker.getTime(), zoneOffset); } } @@ -374,7 +375,7 @@ void writeTrackPoint(ZoneOffset zoneOffset, TrackPoint trackPoint) { trackpointTypeList.add(trackPoint.getType()); if (trackPoint.hasLocation()) { - printWriter.println("" + getCoordinates(trackPoint.getLocation(), " ") + ""); + printWriter.println("" + getCoordinates(trackPoint.getPosition(), " ") + ""); } else { printWriter.println(""); } @@ -412,8 +413,8 @@ private void writeTrackPointType(List list) { printWriter.println(""); } - private void writePlacemark(String name, String activityType, String description, Location location, Instant time, ZoneOffset zoneOffset) { - if (location != null) { + private void writePlacemark(String name, String activityType, String description, @Nullable Position position, Instant time, ZoneOffset zoneOffset) { + if (position != null) { printWriter.println(""); printWriter.println("" + StringUtils.formatCData(name) + ""); printWriter.println("" + StringUtils.formatCData(description) + ""); @@ -421,7 +422,7 @@ private void writePlacemark(String name, String activityType, String description printWriter.println("#" + KMLTrackExporter.MARKER_STYLE + ""); writeTypeLocalized(activityType); printWriter.println(""); - printWriter.println("" + getCoordinates(location, ",") + ""); + printWriter.println("" + getCoordinates(position, ",") + ""); printWriter.println(""); printWriter.println(""); } @@ -454,7 +455,7 @@ private void writePhotoOverlay(Marker marker, float heading, ZoneOffset zoneOffs printWriter.print("45"); printWriter.println(""); printWriter.println(""); - printWriter.println("" + getCoordinates(marker.getLocation(), ",") + ""); + printWriter.println("" + getCoordinates(marker.getPosition(), ",") + ""); printWriter.println(""); printWriter.println(""); } @@ -469,30 +470,27 @@ private String getTime(ZoneOffset zoneOffset, Instant instant) { /** * TODO: check if this is a useful feature (likely not). * Gets the heading to a location. - * - * @param trackId the track id containing the location - * @param location the location */ - private float getHeading(Track.Id trackId, Location location) { - TrackPoint.Id trackPointId = contentProviderUtils.getTrackPointId(trackId, location); + private float getHeading(Track.Id trackId, Position position) { + TrackPoint.Id trackPointId = contentProviderUtils.getTrackPointId(trackId, position); if (trackPointId == null) { - return location.getBearing(); + return position.bearing(); } TrackPoint viewLocation = contentProviderUtils.getLastValidTrackPoint(trackId); if (viewLocation != null) { - Optional bearing = viewLocation.bearingTo(location); + Optional bearing = viewLocation.bearingTo(position); if (bearing.isPresent()) { return bearing.get(); } } - return location.getBearing(); + return position.bearing(); } - private static String getCoordinates(Location location, String separator) { - String result = location.getLongitude() + separator + location.getLatitude(); - if (location.hasAltitude()) { - result += separator + location.getAltitude(); + private static String getCoordinates(Position position, String separator) { + String result = position.longitude() + separator + position.latitude(); + if (position.hasAltitude()) { + result += separator + position.altitude().toM(); } return result; } From e1b5e9f322309f7536cdf93db073b65e19ae82eb Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Fri, 21 Feb 2025 23:40:22 +0100 Subject: [PATCH 3/3] Marker uses Position. --- .../opentracks/content/data/TestDataUtil.java | 8 +- .../io/file/importer/ExportImportTest.java | 4 +- .../opentracks/data/ContentProviderUtils.java | 36 +++++-- .../opentracks/data/models/Marker.java | 101 ++++-------------- .../ui/markers/MarkerEditViewModel.java | 2 +- 5 files changed, 57 insertions(+), 94 deletions(-) diff --git a/src/androidTest/java/de/dennisguse/opentracks/content/data/TestDataUtil.java b/src/androidTest/java/de/dennisguse/opentracks/content/data/TestDataUtil.java index fcad0e4b1d..e8231a479f 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/content/data/TestDataUtil.java +++ b/src/androidTest/java/de/dennisguse/opentracks/content/data/TestDataUtil.java @@ -88,9 +88,9 @@ public static TrackData createTestingTrack(Track.Id trackId) { stats.setTotalDistance(Distance.of(0)); stats.setTotalTime(Duration.ofMillis(0)); List markers = List.of( - new Marker("Marker 1", "Marker description 1", "Marker category 3", "", trackId, trackPoints.get(1), null), - new Marker("Marker 2", "Marker description 2", "Marker category 3", "", trackId, trackPoints.get(4), null), - new Marker("Marker 3", "Marker description 3", "Marker category 3", "", trackId, trackPoints.get(5), null) + new Marker(trackId, trackPoints.get(1), "Marker 1", "Marker description 1", "Marker category 3", "", null), + new Marker(trackId, trackPoints.get(4), "Marker 2", "Marker description 2", "Marker category 3", "", null), + new Marker(trackId, trackPoints.get(5), "Marker 3", "Marker description 3", "Marker category 3", "", null) ); return new TrackData(track, trackPoints, markers); @@ -151,7 +151,7 @@ public static Marker createMarkerWithPhoto(Context context, Track.Id trackId, Tr stats.setTotalDistance(Distance.of(0)); stats.setTotalTime(Duration.ofMillis(0)); - return new Marker("Marker name", "Marker description", "Marker category", "", trackId, trackPoint, photoUri); + return new Marker(trackId, trackPoint, "Marker name", "Marker description", "Marker category", "", photoUri); } public static List getTrackPoints(ContentProviderUtils contentProviderUtils, Track.Id trackId) { diff --git a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java index bbfe92a79e..04df869990 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java @@ -140,7 +140,7 @@ public void setUp() throws TimeoutException { Distance sensorDistance = Distance.of(10); // recording distance interval sendLocation(trackPointCreator, "2020-02-02T02:02:03Z", 3, 14, 10, 13, 15, 10, 1f); - contentProviderUtils.insertMarker(new Marker("Marker 1", "Marker 1 desc", "Marker 1 category", null, trackId, service.getLastStoredTrackPointWithLocation(), null)); + contentProviderUtils.insertMarker(new Marker(trackId, service.getLastStoredTrackPointWithLocation(), "Marker 1", "Marker 1 desc", "Marker 1 category", null, null)); // A sensor-only TrackPoint trackPointCreator.setClock("2020-02-02T02:02:04Z"); @@ -155,7 +155,7 @@ public void setUp() throws TimeoutException { mockSensorData(trackPointCreator, 5f, Distance.of(2), 69f, 3f, 50f, null); // Distance will be added to next TrackPoint sendLocation(trackPointCreator, "2020-02-02T02:02:17Z", 3, 14.001, 10, 13, 15, 10, 0f); - contentProviderUtils.insertMarker(new Marker("Marker 2", "Marker 2 desc", "Marker 2 category", null, trackId, service.getLastStoredTrackPointWithLocation(), null)); + contentProviderUtils.insertMarker(new Marker(trackId, service.getLastStoredTrackPointWithLocation(), "Marker 2", "Marker 2 desc", "Marker 2 category", null, null)); trackPointCreator.setClock("2020-02-02T02:02:18Z"); trackPointCreator.getSensorManager().sensorDataSet = new SensorDataSet(trackPointCreator); diff --git a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java index b9921ebbc4..c7b4cac771 100644 --- a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java +++ b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java @@ -385,23 +385,39 @@ public Marker createMarker(Cursor cursor) { int bearingIndex = cursor.getColumnIndexOrThrow(MarkerColumns.BEARING); int photoUrlIndex = cursor.getColumnIndexOrThrow(MarkerColumns.PHOTOURL); - Track.Id trackId = new Track.Id(cursor.getLong(trackIdIndex)); - Marker marker = new Marker(trackId, Instant.ofEpochMilli(cursor.getLong(timeIndex))); + Double latitude = null; + Double longitude = null; + Altitude.WGS84 altitude = null; + Distance horizontalAccuracy = null; + Float bearing = null; if (!cursor.isNull(longitudeIndex) && !cursor.isNull(latitudeIndex)) { - marker.setLongitude(((double) cursor.getInt(longitudeIndex)) / 1E6); - marker.setLatitude(((double) cursor.getInt(latitudeIndex)) / 1E6); + latitude = (((double) cursor.getInt(latitudeIndex)) / 1E6); + longitude = (((double) cursor.getInt(longitudeIndex)) / 1E6); } if (!cursor.isNull(altitudeIndex)) { - marker.setAltitude(Altitude.WGS84.of(cursor.getFloat(altitudeIndex))); + altitude = Altitude.WGS84.of(cursor.getFloat(altitudeIndex)); } if (!cursor.isNull(accuracyIndex)) { - marker.setAccuracy(Distance.of(cursor.getFloat(accuracyIndex))); + horizontalAccuracy = Distance.of(cursor.getFloat(accuracyIndex)); } if (!cursor.isNull(bearingIndex)) { - marker.setBearing(cursor.getFloat(bearingIndex)); + bearing = cursor.getFloat(bearingIndex); } + Position position = new Position( + Instant.ofEpochMilli(cursor.getLong(timeIndex)), + latitude, + longitude, + horizontalAccuracy, + altitude, + null, + bearing, + null); + + Track.Id trackId = new Track.Id(cursor.getLong(trackIdIndex)); + Marker marker = new Marker(trackId, position); + if (!cursor.isNull(idIndex)) { marker.setId(new Marker.Id(cursor.getLong(idIndex))); } @@ -420,6 +436,8 @@ public Marker createMarker(Cursor cursor) { if (!cursor.isNull(photoUrlIndex)) { marker.setPhotoUrl(Uri.parse(cursor.getString(photoUrlIndex))); } + + return marker; } @@ -532,8 +550,8 @@ ContentValues createContentValues(@NonNull Marker marker) { values.put(MarkerColumns.CATEGORY, marker.getCategory()); values.put(MarkerColumns.ICON, marker.getIcon()); values.put(MarkerColumns.TRACKID, marker.getTrackId().id()); - values.put(MarkerColumns.LONGITUDE, (int) (marker.getLongitude() * 1E6)); - values.put(MarkerColumns.LATITUDE, (int) (marker.getLatitude() * 1E6)); + values.put(MarkerColumns.LONGITUDE, (int) (marker.getPosition().longitude() * 1E6)); + values.put(MarkerColumns.LATITUDE, (int) (marker.getPosition().latitude() * 1E6)); values.put(MarkerColumns.TIME, marker.getTime().toEpochMilli()); if (marker.hasAltitude()) { values.put(MarkerColumns.ALTITUDE, marker.getAltitude().toM()); diff --git a/src/main/java/de/dennisguse/opentracks/data/models/Marker.java b/src/main/java/de/dennisguse/opentracks/data/models/Marker.java index b4b4f68eb7..e7e630a100 100644 --- a/src/main/java/de/dennisguse/opentracks/data/models/Marker.java +++ b/src/main/java/de/dennisguse/opentracks/data/models/Marker.java @@ -16,7 +16,6 @@ package de.dennisguse.opentracks.data.models; -import android.location.Location; import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; @@ -25,9 +24,10 @@ import androidx.annotation.Nullable; import java.time.Instant; +import java.util.Objects; /** - * NOTE: A marker is indirectly (via it's location) assigned to one {@link TrackPoint} with trackPoint.hasLocation() == true. + * NOTE: A marker is indirectly (via it's location) assigned to one {@link TrackPoint} via trackPoint.time. * * @author Leif Hendrik Wilden * @author Rodrigo Damazio @@ -42,34 +42,27 @@ public final class Marker { private String icon = ""; private Track.Id trackId; - private final Instant time; - private Double latitude; - private Double longitude; - @Deprecated //Not needed - private Distance accuracy; - private Altitude altitude; - private Float bearing; + //Some data might not be used. + private final Position position; private Uri photoUrl = null; - public Marker(@Nullable Track.Id trackId, Instant time) { - this.trackId = trackId; - this.time = time; - } - public Marker(@Nullable Track.Id trackId, @NonNull TrackPoint trackPoint) { this.trackId = trackId; - this.time = trackPoint.getTime(); - if (!trackPoint.hasLocation()) throw new RuntimeException("Marker requires a trackpoint with a location."); - setTrackPoint(trackPoint); + this.position = trackPoint.getPosition(); } - @Deprecated - public Marker(String name, String description, String category, String icon, @NonNull Track.Id trackId, @NonNull TrackPoint trackPoint, Uri photoUrl) { + public Marker(@Nullable Track.Id trackId, @NonNull Position position) { + this.trackId = trackId; + Objects.requireNonNull(position); + this.position = position; + } + + public Marker(@Nullable Track.Id trackId, @NonNull TrackPoint trackPoint, String name, String description, String category, String icon, Uri photoUrl) { this(trackId, trackPoint); this.name = name; this.description = description; @@ -78,17 +71,8 @@ public Marker(String name, String description, String category, String icon, @No this.photoUrl = photoUrl; } - //TODO Is somehow part of the initialization process. Can we at least limit visibility? - public void setTrackPoint(TrackPoint trackPoint) { - this.latitude = trackPoint.getLatitude(); - this.longitude = trackPoint.getLongitude(); - if (trackPoint.hasHorizontalAccuracy()) this.accuracy = trackPoint.getHorizontalAccuracy(); - if (trackPoint.hasAltitude()) this.altitude = trackPoint.getAltitude(); - if (trackPoint.hasBearing()) this.bearing = trackPoint.getBearing(); - } - /** - * May be null if the it was not loaded from the database. + * May be null if the Marker was not loaded from the database. */ @Nullable public Id getId() { @@ -100,7 +84,7 @@ public void setId(Id id) { } public Instant getTime() { - return time; + return position.time(); } public String getName() { @@ -144,79 +128,40 @@ public void setTrackId(@NonNull Track.Id trackId) { this.trackId = trackId; } - public boolean hasLocation() { - return latitude != null || longitude != null; - } - public Position getPosition() { - Location location = new Location(""); - location.setTime(time.toEpochMilli()); - if (hasLocation()) { - location.setLatitude(latitude); - location.setLongitude(longitude); - } - if (hasBearing()) { - location.setBearing(bearing); - } - if (hasAccuracy()) { - location.setAccuracy((float) accuracy.toM()); - } - if (hasAltitude()) { - location.setAltitude(altitude.toM()); - } - return Position.of(location); + return position; } public double getLatitude() { - return latitude; - } - - public void setLatitude(double latitude) { - this.latitude = latitude; + return position.latitude(); } public double getLongitude() { - return longitude; - } - - public void setLongitude(double longitude) { - this.longitude = longitude; + return position.longitude(); } public boolean hasAccuracy() { - return accuracy != null; + return position.hasHorizontalAccuracy(); } public Distance getAccuracy() { - return accuracy; - } - - public void setAccuracy(Distance accuracy) { - this.accuracy = accuracy; + return position.horizontalAccuracy(); } public boolean hasAltitude() { - return altitude != null; + return position.hasAltitude(); } public Altitude getAltitude() { - return altitude; - } - - public void setAltitude(Altitude altitude) { - this.altitude = altitude; + return position.altitude(); } public boolean hasBearing() { - return bearing != null; + return position.hasBearing(); } public Float getBearing() { - return bearing; - } - - public void setBearing(float bearing) { - this.bearing = bearing; + return position.bearing(); } public Uri getPhotoUrl() { diff --git a/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerEditViewModel.java b/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerEditViewModel.java index 5d2c8529da..fa2f4685c9 100644 --- a/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerEditViewModel.java +++ b/src/main/java/de/dennisguse/opentracks/ui/markers/MarkerEditViewModel.java @@ -143,7 +143,7 @@ public LiveData createNewMarker(Track.Id trackId, TrackPoint trackPoint) String name = getApplication().getString(R.string.marker_name_format, nextMarkerNumber + 1); String icon = getApplication().getString(R.string.marker_icon_url); - Marker marker = new Marker(name, "", "", icon, trackId, trackPoint, null); + Marker marker = new Marker(trackId, trackPoint, name, "", "", icon, null); if (markerData == null) { markerData = new MutableLiveData<>();