From b83f57bd20fc94f22b9e95687df63eaf3bfccb71 Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Sat, 7 Feb 2026 23:29:39 +0100 Subject: [PATCH] Dashboard API: provide version 2 again (required by OSMDashboard until v6.4.1). Part of #2265. --- .../publicapi/DataProviderTest.java | 287 +++++++++++------- .../opentracks/data/ContentProviderUtils.java | 2 + .../data/CustomContentProvider.java | 67 +++- .../opentracks/publicapi/DataProvider.java | 97 +++++- 4 files changed, 322 insertions(+), 131 deletions(-) diff --git a/src/androidTest/java/de/dennisguse/opentracks/publicapi/DataProviderTest.java b/src/androidTest/java/de/dennisguse/opentracks/publicapi/DataProviderTest.java index df514e074..bdba55cf3 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/publicapi/DataProviderTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/publicapi/DataProviderTest.java @@ -1,15 +1,16 @@ package de.dennisguse.opentracks.publicapi; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + import android.content.ContentResolver; -import android.content.Context; import android.database.Cursor; import android.net.Uri; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; -import org.junit.Assert; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -18,152 +19,206 @@ import de.dennisguse.opentracks.data.ContentProviderUtils; @RunWith(AndroidJUnit4.class) public class DataProviderTest { - private final Context context = ApplicationProvider.getApplicationContext(); + private final ContentResolver resolver = ApplicationProvider.getApplicationContext().getContentResolver(); - @Ignore(value = "Compatibility to v2 is not implemented.") //TODO @Test - public void supportsVersion2() { - ContentResolver resolver = context.getContentResolver(); + public void supportsVersion2_tracks() { + // given + Uri uri = Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/dashboard/tracks/1"); + String[] expectedTracksColumns = new String[]{ + "_id", + "name", + "description", + "category", + "activity_type_localized", + "starttime", + "stoptime", + "totaltime", + "movingtime", + "totaldistance", + "maxspeed", + "avgspeed", + "avgmovingspeed", + "minelevation", + "maxelevation", + "elevationgain", + "elevationloss" + }; - //Tracks + // when try (Cursor cursor = resolver.query( - Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/tracks"), - new String[]{ - "_id", - "name", - "description", - "category", - "activity_type_localized", - "starttime", - "stoptime", - "totaltime", - "movingtime", - "totaldistance", - "maxspeed", - "avgspeed", - "avgmovingspeed", - "minelevation", - "maxelevation", - "elevationgain", - "elevationloss" - }, + uri, + expectedTracksColumns, null, null, null )) { - Assert.assertNotNull(cursor); - } + // then + assertEquals("vnd.android.cursor.dir/vnd.de.dennisguse.track", resolver.getType(uri)); - //TrackPoints - try (Cursor cursor = resolver.query( - Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/trackpoints"), - new String[]{ - "_id", - "trackid", - "latitude", - "longitude", - "time", - "type", - "latitude", - "speed" - }, - null, - null, - null - )) { - Assert.assertNotNull(cursor); - } - - //Markers - try (Cursor cursor = resolver.query( - Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/markers"), - new String[]{ - "_id", - "name", - "description", - "category", - "trackid", - "longitude", - "latitude", - "photoUrl" - }, - null, - null, - null - )) { - Assert.assertNotNull(cursor); + assertNotNull(cursor); + assertArrayEquals(expectedTracksColumns, cursor.getColumnNames()); } } @Test - public void supportsVersion3() { - ContentResolver resolver = context.getContentResolver(); + public void supportsVersion2_trackpoints() { + // given + Uri uri = Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/dashboard/trackpoints/1"); + String[] expectedTrackpointsColumns = { + "_id", + "trackid", + "latitude", + "longitude", + "time", + "type", + "speed" + }; - //Tracks + // when try (Cursor cursor = resolver.query( - Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/tracks"), - new String[]{ - "_id", - "name", - "description", - "activity_type", - "activity_type_localized", - "time_start", - "time_stop", - "duration_total", - "duration_moving", - "distance", - "speed_max", - "altitude_min", - "altitude_max", - "altitude_gain", - "altitude_loss" - }, + uri, + expectedTrackpointsColumns, null, null, null )) { - Assert.assertNotNull(cursor); + // then + assertEquals("vnd.android.cursor.dir/vnd.de.dennisguse.trackpoint", resolver.getType(uri)); + + assertNotNull(cursor); + assertArrayEquals(expectedTrackpointsColumns, cursor.getColumnNames()); } + } - //TrackPoints + @Test + public void supportsVersion2_markers() { + // given + Uri uri = Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/dashboard/markers/1"); + String[] expectedMarkersColumns = { + "_id", + "name", + "description", + "category", + "trackid", + "longitude", + "latitude", + "photoUrl", + "icon" + }; + + // when try (Cursor cursor = resolver.query( - Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/trackpoints"), - new String[]{ - "_id", - "trackid", - "latitude", - "longitude", - "time", - "type", - "latitude", - "speed" - }, + uri, + expectedMarkersColumns, null, null, null )) { - Assert.assertNotNull(cursor); + // then + assertEquals("vnd.android.cursor.dir/vnd.de.dennisguse.waypoint", resolver.getType(uri)); + + assertNotNull(cursor); + assertArrayEquals(expectedMarkersColumns, cursor.getColumnNames()); } + } - //Markers + @Test + public void supportsVersion3_tracks() { + // given + Uri uri = Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/dashboard/tracks/1"); + String[] expectedTracksColumns = { + "_id", + "name", + "description", + "activity_type", + "activity_type_localized", + "time_start", + "time_stop", + "duration_total", + "duration_moving", + "distance", + "speed_max", + "altitude_min", + "altitude_max", + "altitude_gain", + "altitude_loss" + }; + + // when try (Cursor cursor = resolver.query( - Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/markers"), - new String[]{ - "_id", - "name", - "description", - "marker_type_localized", - "trackid", - "longitude", - "latitude", - "photoUrl" - }, + uri, + expectedTracksColumns, null, null, null )) { - Assert.assertNotNull(cursor); + // then + assertEquals("vnd.android.cursor.dir/vnd.de.dennisguse.track", resolver.getType(uri)); + + assertNotNull(cursor); + assertArrayEquals(expectedTracksColumns, cursor.getColumnNames()); + } + } + + @Test + public void supportsVersion3_trackpoints() { + //given + Uri uri = Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/dashboard/trackpoints/1"); + String[] expectedTrackpointsColumns = { + "_id", + "trackid", + "latitude", + "longitude", + "time", + "type", + "speed" + }; + + // when + try (Cursor cursor = resolver.query( + uri, + expectedTrackpointsColumns, + null, + null, + null + )) { + //then + assertEquals("vnd.android.cursor.dir/vnd.de.dennisguse.trackpoint", resolver.getType(uri)); + + assertNotNull(cursor); + assertArrayEquals(expectedTrackpointsColumns, cursor.getColumnNames()); + } + } + + @Test + public void supportsVersion3_markers() { + // given + Uri uri = Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/dashboard/markers/1"); + String[] expectedMarkersColumns = { + "_id", + "name", + "description", + "marker_type_localized", + "trackid", + "latitude", + "longitude", + "photoUrl" + }; + + // when + try (Cursor cursor = resolver.query( + uri, + expectedMarkersColumns, + null, + null, + null + )) { + // then + assertEquals("vnd.android.cursor.dir/vnd.de.dennisguse.waypoint", resolver.getType(uri)); + + assertNotNull(cursor); + assertArrayEquals(expectedMarkersColumns, cursor.getColumnNames()); } } } diff --git a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java index b7f040889..780adf8bd 100644 --- a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java +++ b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java @@ -69,9 +69,11 @@ public class ContentProviderUtils { private static final String TAG = ContentProviderUtils.class.getSimpleName(); + //TODO Move to CustomContentProvider // The authority (the first part of the URI) for the app's content provider. static final String AUTHORITY_PACKAGE = BuildConfig.APPLICATION_ID + ".content"; + //TODO Move to CustomContentProvider // The base URI for the app's content provider. public static final String CONTENT_BASE_URI = "content://" + AUTHORITY_PACKAGE; diff --git a/src/main/java/de/dennisguse/opentracks/data/CustomContentProvider.java b/src/main/java/de/dennisguse/opentracks/data/CustomContentProvider.java index 543ddf929..9570edbf8 100644 --- a/src/main/java/de/dennisguse/opentracks/data/CustomContentProvider.java +++ b/src/main/java/de/dennisguse/opentracks/data/CustomContentProvider.java @@ -38,6 +38,7 @@ import de.dennisguse.opentracks.data.models.TrackPoint; import de.dennisguse.opentracks.data.tables.MarkerColumns; import de.dennisguse.opentracks.data.tables.TrackPointsColumns; import de.dennisguse.opentracks.data.tables.TracksColumns; +import de.dennisguse.opentracks.publicapi.DataProvider; import de.dennisguse.opentracks.settings.PreferencesUtils; /** @@ -94,7 +95,6 @@ public class CustomContentProvider extends ContentProvider { "AND t." + TrackPointsColumns.TYPE + " NOT IN (" + TrackPoint.Type.SEGMENT_START_MANUAL.type_db + ")"; public CustomContentProvider() { - //TODO Add tests for used URIs (incl. Dashboard API) uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, TrackPointsColumns.CONTENT_URI_BY_ID.getPath(), UrlType.TRACKPOINTS.ordinal()); uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, TrackPointsColumns.CONTENT_URI_BY_ID.getPath() + "/#", UrlType.TRACKPOINTS_BY_ID.ordinal()); @@ -108,6 +108,10 @@ public class CustomContentProvider extends ContentProvider { uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, MarkerColumns.CONTENT_URI.getPath(), UrlType.MARKERS.ordinal()); uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, MarkerColumns.CONTENT_URI.getPath() + "/#", UrlType.MARKERS_BY_ID.ordinal()); uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, MarkerColumns.CONTENT_URI_BY_TRACKID.getPath() + "/*", UrlType.MARKERS_BY_TRACKID.ordinal()); + + uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, UrlType.DASHBOARD_TRACKS_BY_IDS.getPath() + "*", UrlType.DASHBOARD_TRACKS_BY_IDS.ordinal()); + uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, UrlType.DASHBOARD_TRACKPOINTS_BY_TRACKIDS.getPath() + "*", UrlType.DASHBOARD_TRACKPOINTS_BY_TRACKIDS.ordinal()); + uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, UrlType.DASHBOARD_MARKERS_BY_TRACKIDS.getPath() + "*", UrlType.DASHBOARD_MARKERS_BY_TRACKIDS.ordinal()); } @Override @@ -170,12 +174,21 @@ public class CustomContentProvider extends ContentProvider { @Override public String getType(@NonNull Uri url) { + String contentType = getUrlType(url).contentType; + if (contentType != null) { + return contentType; + } + + //TODO replace with getUrlType(url).getContentType() return switch (getUrlType(url)) { case TRACKPOINTS -> TrackPointsColumns.CONTENT_TYPE; case TRACKPOINTS_BY_TRACKID -> TrackPointsColumns.CONTENT_ITEMTYPE; case TRACKS -> TracksColumns.CONTENT_TYPE; case MARKERS -> MarkerColumns.CONTENT_TYPE; case MARKERS_BY_TRACKID -> MarkerColumns.CONTENT_ITEMTYPE; + case DASHBOARD_TRACKS_BY_IDS -> UrlType.DASHBOARD_TRACKS_BY_IDS.contentType; + case DASHBOARD_TRACKPOINTS_BY_TRACKIDS -> UrlType.DASHBOARD_TRACKPOINTS_BY_TRACKIDS.contentType; + case DASHBOARD_MARKERS_BY_TRACKIDS -> UrlType.DASHBOARD_MARKERS_BY_TRACKIDS.contentType; default -> throw new IllegalArgumentException("Unknown URL " + url); }; } @@ -225,6 +238,7 @@ public class CustomContentProvider extends ContentProvider { SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); String sortOrder = null; String groupBy = null; + //TODO queryBuilder.setStrict(true); //TODO queryBuilder.appendWhere() should use selectionArgs? switch (getUrlType(url)) { case TRACKPOINTS -> { @@ -239,6 +253,11 @@ public class CustomContentProvider extends ContentProvider { queryBuilder.setTables(TrackPointsColumns.TABLE_NAME); queryBuilder.appendWhere(TrackPointsColumns.TRACKID + " IN (" + TextUtils.join(SQL_LIST_DELIMITER, ContentProviderUtils.parseTrackIdsFromUri(url)) + ")"); } + case DASHBOARD_TRACKPOINTS_BY_TRACKIDS -> { + queryBuilder.setTables(TrackPointsColumns.TABLE_NAME); + queryBuilder.appendWhere(TrackPointsColumns.TRACKID + " IN (" + TextUtils.join(SQL_LIST_DELIMITER, ContentProviderUtils.parseTrackIdsFromUri(url)) + ")"); + queryBuilder.setProjectionMap(DataProvider.DATA_PROJECTIONMAP_TRACKPOINTS); + } case TRACKS -> { if (projection != null && Arrays.asList(projection).contains(TracksColumns.MARKER_COUNT)) { queryBuilder.setTables(TracksColumns.TABLE_NAME + " LEFT OUTER JOIN (SELECT " + MarkerColumns.TRACKID + " AS markerTrackId, COUNT(*) AS " + TracksColumns.MARKER_COUNT + " FROM " + MarkerColumns.TABLE_NAME + " GROUP BY " + MarkerColumns.TRACKID + ") ON (" + TracksColumns.TABLE_NAME + "." + TracksColumns._ID + "= markerTrackId)"); @@ -251,6 +270,11 @@ public class CustomContentProvider extends ContentProvider { queryBuilder.setTables(TracksColumns.TABLE_NAME); queryBuilder.appendWhere(TracksColumns._ID + " IN (" + TextUtils.join(SQL_LIST_DELIMITER, ContentProviderUtils.parseTrackIdsFromUri(url)) + ")"); } + case DASHBOARD_TRACKS_BY_IDS -> { + queryBuilder.setTables(TracksColumns.TABLE_NAME); + queryBuilder.appendWhere(TracksColumns._ID + " IN (" + TextUtils.join(SQL_LIST_DELIMITER, ContentProviderUtils.parseTrackIdsFromUri(url)) + ")"); + queryBuilder.setProjectionMap(DataProvider.DATA_PROJECTIONMAP_TRACKS); + } case TRACKS_SENSOR_STATS -> { //TODO Replace with SQLQueryBuilder? long trackId = ContentUris.parseId(url); @@ -281,6 +305,11 @@ public class CustomContentProvider extends ContentProvider { queryBuilder.setTables(MarkerColumns.TABLE_NAME); queryBuilder.appendWhere(MarkerColumns.TRACKID + " IN (" + TextUtils.join(SQL_LIST_DELIMITER, ContentProviderUtils.parseTrackIdsFromUri(url)) + ")"); } + case DASHBOARD_MARKERS_BY_TRACKIDS -> { + queryBuilder.setTables(MarkerColumns.TABLE_NAME); + queryBuilder.appendWhere(MarkerColumns.TRACKID + " IN (" + TextUtils.join(SQL_LIST_DELIMITER, ContentProviderUtils.parseTrackIdsFromUri(url)) + ")"); + queryBuilder.setProjectionMap(DataProvider.DATA_PROJECTIONMAP_MARKERS); + } default -> throw new IllegalArgumentException("Unknown url " + url); } Cursor cursor = queryBuilder.query(db, projection, selection, selectionArgs, groupBy, null, sortOrder); @@ -372,9 +401,11 @@ public class CustomContentProvider extends ContentProvider { throw new SQLException("Failed to insert a marker " + url); } - private enum UrlType { + //TODO Add ContentType as attribute + public enum UrlType { TRACKPOINTS, TRACKPOINTS_BY_ID, + //TODO Check if still used TRACKPOINTS_BY_TRACKID, TRACKS, TRACKS_BY_ID, @@ -382,6 +413,36 @@ public class CustomContentProvider extends ContentProvider { TRACKS_AGGREGATED_STATISTICS, MARKERS, MARKERS_BY_ID, - MARKERS_BY_TRACKID + @Deprecated //TODO Should not be used anymore + MARKERS_BY_TRACKID, + + DASHBOARD_TRACKS_BY_IDS(Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/dashboard/tracks/"), TracksColumns.CONTENT_TYPE), + DASHBOARD_TRACKPOINTS_BY_TRACKIDS(Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/dashboard/trackpoints/"), TrackPointsColumns.CONTENT_TYPE), + DASHBOARD_MARKERS_BY_TRACKIDS(Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/dashboard/markers/"), MarkerColumns.CONTENT_TYPE); + + private final Uri uri; + + private final String contentType; + + //TODO Add Uri as attribute: + //TODO Add ContentType as attribute: + @Deprecated() + UrlType() { + this.uri = null; + this.contentType = null; + } + + UrlType(Uri uri, String contentType) { + this.uri = uri; + this.contentType = contentType; + } + + public Uri getUri() { + return uri; + } + + String getPath() { + return uri.getPath(); + } } } diff --git a/src/main/java/de/dennisguse/opentracks/publicapi/DataProvider.java b/src/main/java/de/dennisguse/opentracks/publicapi/DataProvider.java index 8716a26ad..1003dcbd9 100644 --- a/src/main/java/de/dennisguse/opentracks/publicapi/DataProvider.java +++ b/src/main/java/de/dennisguse/opentracks/publicapi/DataProvider.java @@ -11,9 +11,11 @@ import android.widget.Toast; import androidx.annotation.Nullable; import java.util.ArrayList; +import java.util.Map; import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.data.ContentProviderUtils; +import de.dennisguse.opentracks.data.CustomContentProvider; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.data.tables.MarkerColumns; import de.dennisguse.opentracks.data.tables.TrackPointsColumns; @@ -33,7 +35,7 @@ public class DataProvider { private static final String ACTION_DASHBOARD_PAYLOAD = ACTION_DASHBOARD + ".Payload"; /** - * Assume "v1" if not present. + * Assume "1" if not present. */ private static final String EXTRAS_PROTOCOL_VERSION = "PROTOCOL_VERSION"; @@ -42,7 +44,7 @@ public class DataProvider { * version 2: replaced pause/resume trackpoints for track segmentation (lat=100 / lat=200) by TrackPoint.Type. * version 3: renamed track database columns. */ - private static final int CURRENT_VERSION = 3; + private static final int CURRENT_VERSION = 2; private static final String EXTRAS_OPENTRACKS_IS_RECORDING_THIS_TRACK = "EXTRAS_OPENTRACKS_IS_RECORDING_THIS_TRACK"; private static final String EXTRAS_SHOULD_KEEP_SCREEN_ON = "EXTRAS_SHOULD_KEEP_SCREEN_ON"; @@ -52,7 +54,78 @@ public class DataProvider { private static final int TRACK_URI_INDEX = 0; private static final int TRACKPOINTS_URI_INDEX = 1; private static final int MARKERS_URI_INDEX = 2; - private static final int NONE_SELECTED = -1; + + public static final Map DATA_PROJECTIONMAP_TRACKS = Map.ofEntries( + //V2 + Map.entry("_id", TracksColumns._ID), + Map.entry("name", TracksColumns.NAME), + Map.entry("description", TracksColumns.DESCRIPTION), + Map.entry("category", TracksColumns.ACTIVITY_TYPE + " AS category"), + Map.entry("activity_type_localized", TracksColumns.ACTIVITY_TYPE_LOCALIZED), + Map.entry("starttime", TracksColumns.STARTTIME + " AS starttime"), + Map.entry("stoptime", TracksColumns.STOPTIME + " AS stoptime"), + Map.entry("totaltime", TracksColumns.TOTALTIME + " AS totaltime"), + Map.entry("movingtime", TracksColumns.MOVINGTIME + " AS movingtime"), + Map.entry("totaldistance", TracksColumns.TOTALDISTANCE + " AS totaldistance"), + Map.entry("maxspeed", TracksColumns.MAXSPEED + " AS maxspeed"), + Map.entry("avgspeed", "null AS avgspeed"), + Map.entry("avgmovingspeed", "null AS avgmovingspeed"), + Map.entry("minelevation", TracksColumns.MIN_ALTITUDE + " AS minelevation"), + Map.entry("maxelevation", TracksColumns.MAX_ALTITUDE + " AS maxelevation"), + Map.entry("elevationgain", TracksColumns.ALTITUDE_GAIN + " AS elevationgain"), + Map.entry("elevationloss", TracksColumns.ALTITUDE_LOSS + " AS elevationloss"), + + //V3 +// Map.entry("_id", TracksColumns._ID), +// Map.entry("name",TracksColumns.NAME), +// Map.entry("description",TracksColumns.DESCRIPTION), + Map.entry("activity_type", TracksColumns.ACTIVITY_TYPE), +// Map.entry("activity_type_localized",TracksColumns.ACTIVITY_TYPE_LOCALIZED), + Map.entry("time_start", TracksColumns.STARTTIME), + Map.entry("time_stop", TracksColumns.STOPTIME), + Map.entry("duration_total", TracksColumns.TOTALTIME), + Map.entry("duration_moving", TracksColumns.MOVINGTIME), + Map.entry("distance", TracksColumns.TOTALDISTANCE), + Map.entry("speed_max", TracksColumns.MAXSPEED), + Map.entry("altitude_min", TracksColumns.MIN_ALTITUDE), + Map.entry("altitude_max", TracksColumns.MAX_ALTITUDE), + Map.entry("altitude_gain", TracksColumns.ALTITUDE_GAIN), + Map.entry("altitude_loss", TracksColumns.ALTITUDE_LOSS) + ); + + public static final Map DATA_PROJECTIONMAP_TRACKPOINTS = Map.ofEntries( + //V2 and V3 + Map.entry("_id", TrackPointsColumns._ID), + Map.entry("trackid", TrackPointsColumns.TRACKID), + Map.entry("latitude", TrackPointsColumns.LATITUDE), + Map.entry("longitude", TrackPointsColumns.LONGITUDE), + Map.entry("time", TrackPointsColumns.TIME), + Map.entry("type", TrackPointsColumns.TYPE), + Map.entry("speed", TrackPointsColumns.SPEED) + ); + public static final Map DATA_PROJECTIONMAP_MARKERS = Map.ofEntries( + //V2 + Map.entry("_id", MarkerColumns._ID), + Map.entry("trackid", MarkerColumns.TRACKID), + Map.entry("name", MarkerColumns.NAME), + Map.entry("description", MarkerColumns.DESCRIPTION), + Map.entry("category", MarkerColumns.TYPE_LOCALIZED + " AS category"), + Map.entry("latitude", MarkerColumns.LATITUDE), + Map.entry("longitude", MarkerColumns.LONGITUDE), + Map.entry("photoUrl", MarkerColumns.PHOTOURL), + Map.entry("icon", "null AS icon"), + + //V3 +// Map.entry("_id", MarkerColumns._ID), +// Map.entry("trackid",MarkerColumns.TRACKID), +// Map.entry("name",MarkerColumns.NAME), +// Map.entry("description",MarkerColumns.DESCRIPTION), + Map.entry("marker_type_localized", MarkerColumns.TYPE_LOCALIZED) +// Map.entry("latitude",MarkerColumns.LATITUDE), +// Map.entry("longitude",MarkerColumns.LONGITUDE), +// Map.entry("photoUrl",MarkerColumns.PHOTOURL) + ); + private DataProvider() { } @@ -60,9 +133,9 @@ public class DataProvider { /** * Send intent to show tracks on a map (needs an another app) as resource URIs. * - * @param context the context + * @param context the context * @param isRecording are we currently recording? - * @param trackIds the track ids + * @param trackIds the track ids */ public static void showTrackOnMap(Context context, boolean isRecording, Track.Id... trackIds) { startDashboard(context, isRecording, null, null, trackIds); @@ -73,11 +146,11 @@ public class DataProvider { * By providing a targetPackage and targetClass an explicit intent can be sent, * thus bypassing the need for the user to select an app. * - * @param context the context - * @param isRecording are we currently recording? + * @param context the context + * @param isRecording are we currently recording? * @param targetPackage the target package - * @param targetClass the target class - * @param trackIds the track ids + * @param targetClass the target class + * @param trackIds the track ids */ public static void startDashboard(Context context, boolean isRecording, @Nullable String targetPackage, @Nullable String targetClass, Track.Id... trackIds) { if (trackIds.length == 0) { @@ -87,9 +160,9 @@ public class DataProvider { String trackIdList = ContentProviderUtils.formatIdListForUri(trackIds); ArrayList uris = new ArrayList<>(); - uris.add(TRACK_URI_INDEX, Uri.withAppendedPath(TracksColumns.CONTENT_URI, trackIdList)); - uris.add(TRACKPOINTS_URI_INDEX, Uri.withAppendedPath(TrackPointsColumns.CONTENT_URI_BY_TRACKID, trackIdList)); - uris.add(MARKERS_URI_INDEX, Uri.withAppendedPath(MarkerColumns.CONTENT_URI_BY_TRACKID, trackIdList)); + uris.add(TRACK_URI_INDEX, Uri.withAppendedPath(CustomContentProvider.UrlType.DASHBOARD_TRACKS_BY_IDS.getUri(), trackIdList)); + uris.add(TRACKPOINTS_URI_INDEX, Uri.withAppendedPath(CustomContentProvider.UrlType.DASHBOARD_TRACKPOINTS_BY_TRACKIDS.getUri(), trackIdList)); + uris.add(MARKERS_URI_INDEX, Uri.withAppendedPath(CustomContentProvider.UrlType.DASHBOARD_MARKERS_BY_TRACKIDS.getUri(), trackIdList)); Intent intent = new Intent(ACTION_DASHBOARD); intent.putExtra(EXTRAS_PROTOCOL_VERSION, CURRENT_VERSION);