forked from upstream-mirrors/OpenTracks
Compare commits
1 Commits
main
...
dashboard#2265
| Author | SHA1 | Date | |
|---|---|---|---|
| b83f57bd20 |
@@ -1,15 +1,16 @@
|
|||||||
package de.dennisguse.opentracks.publicapi;
|
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.ContentResolver;
|
||||||
import android.content.Context;
|
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Ignore;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
@@ -18,17 +19,13 @@ import de.dennisguse.opentracks.data.ContentProviderUtils;
|
|||||||
@RunWith(AndroidJUnit4.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class DataProviderTest {
|
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
|
@Test
|
||||||
public void supportsVersion2() {
|
public void supportsVersion2_tracks() {
|
||||||
ContentResolver resolver = context.getContentResolver();
|
// given
|
||||||
|
Uri uri = Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/dashboard/tracks/1");
|
||||||
//Tracks
|
String[] expectedTracksColumns = new String[]{
|
||||||
try (Cursor cursor = resolver.query(
|
|
||||||
Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/tracks"),
|
|
||||||
new String[]{
|
|
||||||
"_id",
|
"_id",
|
||||||
"name",
|
"name",
|
||||||
"description",
|
"description",
|
||||||
@@ -46,38 +43,59 @@ public class DataProviderTest {
|
|||||||
"maxelevation",
|
"maxelevation",
|
||||||
"elevationgain",
|
"elevationgain",
|
||||||
"elevationloss"
|
"elevationloss"
|
||||||
},
|
};
|
||||||
|
|
||||||
|
// when
|
||||||
|
try (Cursor cursor = resolver.query(
|
||||||
|
uri,
|
||||||
|
expectedTracksColumns,
|
||||||
null,
|
null,
|
||||||
null,
|
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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//TrackPoints
|
@Test
|
||||||
try (Cursor cursor = resolver.query(
|
public void supportsVersion2_trackpoints() {
|
||||||
Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/trackpoints"),
|
// given
|
||||||
new String[]{
|
Uri uri = Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/dashboard/trackpoints/1");
|
||||||
|
String[] expectedTrackpointsColumns = {
|
||||||
"_id",
|
"_id",
|
||||||
"trackid",
|
"trackid",
|
||||||
"latitude",
|
"latitude",
|
||||||
"longitude",
|
"longitude",
|
||||||
"time",
|
"time",
|
||||||
"type",
|
"type",
|
||||||
"latitude",
|
|
||||||
"speed"
|
"speed"
|
||||||
},
|
};
|
||||||
|
|
||||||
|
// when
|
||||||
|
try (Cursor cursor = resolver.query(
|
||||||
|
uri,
|
||||||
|
expectedTrackpointsColumns,
|
||||||
null,
|
null,
|
||||||
null,
|
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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Markers
|
@Test
|
||||||
try (Cursor cursor = resolver.query(
|
public void supportsVersion2_markers() {
|
||||||
Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/markers"),
|
// given
|
||||||
new String[]{
|
Uri uri = Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/dashboard/markers/1");
|
||||||
|
String[] expectedMarkersColumns = {
|
||||||
"_id",
|
"_id",
|
||||||
"name",
|
"name",
|
||||||
"description",
|
"description",
|
||||||
@@ -85,24 +103,31 @@ public class DataProviderTest {
|
|||||||
"trackid",
|
"trackid",
|
||||||
"longitude",
|
"longitude",
|
||||||
"latitude",
|
"latitude",
|
||||||
"photoUrl"
|
"photoUrl",
|
||||||
},
|
"icon"
|
||||||
|
};
|
||||||
|
|
||||||
|
// when
|
||||||
|
try (Cursor cursor = resolver.query(
|
||||||
|
uri,
|
||||||
|
expectedMarkersColumns,
|
||||||
null,
|
null,
|
||||||
null,
|
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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void supportsVersion3() {
|
public void supportsVersion3_tracks() {
|
||||||
ContentResolver resolver = context.getContentResolver();
|
// given
|
||||||
|
Uri uri = Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/dashboard/tracks/1");
|
||||||
//Tracks
|
String[] expectedTracksColumns = {
|
||||||
try (Cursor cursor = resolver.query(
|
|
||||||
Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/tracks"),
|
|
||||||
new String[]{
|
|
||||||
"_id",
|
"_id",
|
||||||
"name",
|
"name",
|
||||||
"description",
|
"description",
|
||||||
@@ -118,52 +143,82 @@ public class DataProviderTest {
|
|||||||
"altitude_max",
|
"altitude_max",
|
||||||
"altitude_gain",
|
"altitude_gain",
|
||||||
"altitude_loss"
|
"altitude_loss"
|
||||||
},
|
};
|
||||||
|
|
||||||
|
// when
|
||||||
|
try (Cursor cursor = resolver.query(
|
||||||
|
uri,
|
||||||
|
expectedTracksColumns,
|
||||||
null,
|
null,
|
||||||
null,
|
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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//TrackPoints
|
@Test
|
||||||
try (Cursor cursor = resolver.query(
|
public void supportsVersion3_trackpoints() {
|
||||||
Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/trackpoints"),
|
//given
|
||||||
new String[]{
|
Uri uri = Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/dashboard/trackpoints/1");
|
||||||
|
String[] expectedTrackpointsColumns = {
|
||||||
"_id",
|
"_id",
|
||||||
"trackid",
|
"trackid",
|
||||||
"latitude",
|
"latitude",
|
||||||
"longitude",
|
"longitude",
|
||||||
"time",
|
"time",
|
||||||
"type",
|
"type",
|
||||||
"latitude",
|
|
||||||
"speed"
|
"speed"
|
||||||
},
|
};
|
||||||
|
|
||||||
|
// when
|
||||||
|
try (Cursor cursor = resolver.query(
|
||||||
|
uri,
|
||||||
|
expectedTrackpointsColumns,
|
||||||
null,
|
null,
|
||||||
null,
|
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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Markers
|
@Test
|
||||||
try (Cursor cursor = resolver.query(
|
public void supportsVersion3_markers() {
|
||||||
Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/markers"),
|
// given
|
||||||
new String[]{
|
Uri uri = Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/dashboard/markers/1");
|
||||||
|
String[] expectedMarkersColumns = {
|
||||||
"_id",
|
"_id",
|
||||||
"name",
|
"name",
|
||||||
"description",
|
"description",
|
||||||
"marker_type_localized",
|
"marker_type_localized",
|
||||||
"trackid",
|
"trackid",
|
||||||
"longitude",
|
|
||||||
"latitude",
|
"latitude",
|
||||||
|
"longitude",
|
||||||
"photoUrl"
|
"photoUrl"
|
||||||
},
|
};
|
||||||
|
|
||||||
|
// when
|
||||||
|
try (Cursor cursor = resolver.query(
|
||||||
|
uri,
|
||||||
|
expectedMarkersColumns,
|
||||||
null,
|
null,
|
||||||
null,
|
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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,9 +69,11 @@ public class ContentProviderUtils {
|
|||||||
|
|
||||||
private static final String TAG = ContentProviderUtils.class.getSimpleName();
|
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.
|
// The authority (the first part of the URI) for the app's content provider.
|
||||||
static final String AUTHORITY_PACKAGE = BuildConfig.APPLICATION_ID + ".content";
|
static final String AUTHORITY_PACKAGE = BuildConfig.APPLICATION_ID + ".content";
|
||||||
|
|
||||||
|
//TODO Move to CustomContentProvider
|
||||||
// The base URI for the app's content provider.
|
// The base URI for the app's content provider.
|
||||||
public static final String CONTENT_BASE_URI = "content://" + AUTHORITY_PACKAGE;
|
public static final String CONTENT_BASE_URI = "content://" + AUTHORITY_PACKAGE;
|
||||||
|
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ import de.dennisguse.opentracks.data.models.TrackPoint;
|
|||||||
import de.dennisguse.opentracks.data.tables.MarkerColumns;
|
import de.dennisguse.opentracks.data.tables.MarkerColumns;
|
||||||
import de.dennisguse.opentracks.data.tables.TrackPointsColumns;
|
import de.dennisguse.opentracks.data.tables.TrackPointsColumns;
|
||||||
import de.dennisguse.opentracks.data.tables.TracksColumns;
|
import de.dennisguse.opentracks.data.tables.TracksColumns;
|
||||||
|
import de.dennisguse.opentracks.publicapi.DataProvider;
|
||||||
import de.dennisguse.opentracks.settings.PreferencesUtils;
|
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 + ")";
|
"AND t." + TrackPointsColumns.TYPE + " NOT IN (" + TrackPoint.Type.SEGMENT_START_MANUAL.type_db + ")";
|
||||||
|
|
||||||
public CustomContentProvider() {
|
public CustomContentProvider() {
|
||||||
//TODO Add tests for used URIs (incl. Dashboard API)
|
|
||||||
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
|
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.ordinal());
|
||||||
uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, TrackPointsColumns.CONTENT_URI_BY_ID.getPath() + "/#", UrlType.TRACKPOINTS_BY_ID.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.ordinal());
|
||||||
uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, MarkerColumns.CONTENT_URI.getPath() + "/#", UrlType.MARKERS_BY_ID.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, 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
|
@Override
|
||||||
@@ -170,12 +174,21 @@ public class CustomContentProvider extends ContentProvider {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getType(@NonNull Uri url) {
|
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)) {
|
return switch (getUrlType(url)) {
|
||||||
case TRACKPOINTS -> TrackPointsColumns.CONTENT_TYPE;
|
case TRACKPOINTS -> TrackPointsColumns.CONTENT_TYPE;
|
||||||
case TRACKPOINTS_BY_TRACKID -> TrackPointsColumns.CONTENT_ITEMTYPE;
|
case TRACKPOINTS_BY_TRACKID -> TrackPointsColumns.CONTENT_ITEMTYPE;
|
||||||
case TRACKS -> TracksColumns.CONTENT_TYPE;
|
case TRACKS -> TracksColumns.CONTENT_TYPE;
|
||||||
case MARKERS -> MarkerColumns.CONTENT_TYPE;
|
case MARKERS -> MarkerColumns.CONTENT_TYPE;
|
||||||
case MARKERS_BY_TRACKID -> MarkerColumns.CONTENT_ITEMTYPE;
|
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);
|
default -> throw new IllegalArgumentException("Unknown URL " + url);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -225,6 +238,7 @@ public class CustomContentProvider extends ContentProvider {
|
|||||||
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
|
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
|
||||||
String sortOrder = null;
|
String sortOrder = null;
|
||||||
String groupBy = null;
|
String groupBy = null;
|
||||||
|
//TODO queryBuilder.setStrict(true);
|
||||||
//TODO queryBuilder.appendWhere() should use selectionArgs?
|
//TODO queryBuilder.appendWhere() should use selectionArgs?
|
||||||
switch (getUrlType(url)) {
|
switch (getUrlType(url)) {
|
||||||
case TRACKPOINTS -> {
|
case TRACKPOINTS -> {
|
||||||
@@ -239,6 +253,11 @@ public class CustomContentProvider extends ContentProvider {
|
|||||||
queryBuilder.setTables(TrackPointsColumns.TABLE_NAME);
|
queryBuilder.setTables(TrackPointsColumns.TABLE_NAME);
|
||||||
queryBuilder.appendWhere(TrackPointsColumns.TRACKID + " IN (" + TextUtils.join(SQL_LIST_DELIMITER, ContentProviderUtils.parseTrackIdsFromUri(url)) + ")");
|
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 -> {
|
case TRACKS -> {
|
||||||
if (projection != null && Arrays.asList(projection).contains(TracksColumns.MARKER_COUNT)) {
|
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)");
|
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.setTables(TracksColumns.TABLE_NAME);
|
||||||
queryBuilder.appendWhere(TracksColumns._ID + " IN (" + TextUtils.join(SQL_LIST_DELIMITER, ContentProviderUtils.parseTrackIdsFromUri(url)) + ")");
|
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 -> {
|
case TRACKS_SENSOR_STATS -> {
|
||||||
//TODO Replace with SQLQueryBuilder?
|
//TODO Replace with SQLQueryBuilder?
|
||||||
long trackId = ContentUris.parseId(url);
|
long trackId = ContentUris.parseId(url);
|
||||||
@@ -281,6 +305,11 @@ public class CustomContentProvider extends ContentProvider {
|
|||||||
queryBuilder.setTables(MarkerColumns.TABLE_NAME);
|
queryBuilder.setTables(MarkerColumns.TABLE_NAME);
|
||||||
queryBuilder.appendWhere(MarkerColumns.TRACKID + " IN (" + TextUtils.join(SQL_LIST_DELIMITER, ContentProviderUtils.parseTrackIdsFromUri(url)) + ")");
|
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);
|
default -> throw new IllegalArgumentException("Unknown url " + url);
|
||||||
}
|
}
|
||||||
Cursor cursor = queryBuilder.query(db, projection, selection, selectionArgs, groupBy, null, sortOrder);
|
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);
|
throw new SQLException("Failed to insert a marker " + url);
|
||||||
}
|
}
|
||||||
|
|
||||||
private enum UrlType {
|
//TODO Add ContentType as attribute
|
||||||
|
public enum UrlType {
|
||||||
TRACKPOINTS,
|
TRACKPOINTS,
|
||||||
TRACKPOINTS_BY_ID,
|
TRACKPOINTS_BY_ID,
|
||||||
|
//TODO Check if still used
|
||||||
TRACKPOINTS_BY_TRACKID,
|
TRACKPOINTS_BY_TRACKID,
|
||||||
TRACKS,
|
TRACKS,
|
||||||
TRACKS_BY_ID,
|
TRACKS_BY_ID,
|
||||||
@@ -382,6 +413,36 @@ public class CustomContentProvider extends ContentProvider {
|
|||||||
TRACKS_AGGREGATED_STATISTICS,
|
TRACKS_AGGREGATED_STATISTICS,
|
||||||
MARKERS,
|
MARKERS,
|
||||||
MARKERS_BY_ID,
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,9 +11,11 @@ import android.widget.Toast;
|
|||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import de.dennisguse.opentracks.R;
|
import de.dennisguse.opentracks.R;
|
||||||
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
import de.dennisguse.opentracks.data.ContentProviderUtils;
|
||||||
|
import de.dennisguse.opentracks.data.CustomContentProvider;
|
||||||
import de.dennisguse.opentracks.data.models.Track;
|
import de.dennisguse.opentracks.data.models.Track;
|
||||||
import de.dennisguse.opentracks.data.tables.MarkerColumns;
|
import de.dennisguse.opentracks.data.tables.MarkerColumns;
|
||||||
import de.dennisguse.opentracks.data.tables.TrackPointsColumns;
|
import de.dennisguse.opentracks.data.tables.TrackPointsColumns;
|
||||||
@@ -33,7 +35,7 @@ public class DataProvider {
|
|||||||
private static final String ACTION_DASHBOARD_PAYLOAD = ACTION_DASHBOARD + ".Payload";
|
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";
|
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 2: replaced pause/resume trackpoints for track segmentation (lat=100 / lat=200) by TrackPoint.Type.
|
||||||
* version 3: renamed track database columns.
|
* 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_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";
|
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 TRACK_URI_INDEX = 0;
|
||||||
private static final int TRACKPOINTS_URI_INDEX = 1;
|
private static final int TRACKPOINTS_URI_INDEX = 1;
|
||||||
private static final int MARKERS_URI_INDEX = 2;
|
private static final int MARKERS_URI_INDEX = 2;
|
||||||
private static final int NONE_SELECTED = -1;
|
|
||||||
|
public static final Map<String, String> 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<String, String> 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<String, String> 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() {
|
private DataProvider() {
|
||||||
}
|
}
|
||||||
@@ -87,9 +160,9 @@ public class DataProvider {
|
|||||||
String trackIdList = ContentProviderUtils.formatIdListForUri(trackIds);
|
String trackIdList = ContentProviderUtils.formatIdListForUri(trackIds);
|
||||||
|
|
||||||
ArrayList<Uri> uris = new ArrayList<>();
|
ArrayList<Uri> uris = new ArrayList<>();
|
||||||
uris.add(TRACK_URI_INDEX, Uri.withAppendedPath(TracksColumns.CONTENT_URI, trackIdList));
|
uris.add(TRACK_URI_INDEX, Uri.withAppendedPath(CustomContentProvider.UrlType.DASHBOARD_TRACKS_BY_IDS.getUri(), trackIdList));
|
||||||
uris.add(TRACKPOINTS_URI_INDEX, Uri.withAppendedPath(TrackPointsColumns.CONTENT_URI_BY_TRACKID, trackIdList));
|
uris.add(TRACKPOINTS_URI_INDEX, Uri.withAppendedPath(CustomContentProvider.UrlType.DASHBOARD_TRACKPOINTS_BY_TRACKIDS.getUri(), trackIdList));
|
||||||
uris.add(MARKERS_URI_INDEX, Uri.withAppendedPath(MarkerColumns.CONTENT_URI_BY_TRACKID, trackIdList));
|
uris.add(MARKERS_URI_INDEX, Uri.withAppendedPath(CustomContentProvider.UrlType.DASHBOARD_MARKERS_BY_TRACKIDS.getUri(), trackIdList));
|
||||||
|
|
||||||
Intent intent = new Intent(ACTION_DASHBOARD);
|
Intent intent = new Intent(ACTION_DASHBOARD);
|
||||||
intent.putExtra(EXTRAS_PROTOCOL_VERSION, CURRENT_VERSION);
|
intent.putExtra(EXTRAS_PROTOCOL_VERSION, CURRENT_VERSION);
|
||||||
|
|||||||
Reference in New Issue
Block a user