diff --git a/src/androidTest/java/de/dennisguse/opentracks/content/provider/CustomContentProviderTest.java b/src/androidTest/java/de/dennisguse/opentracks/content/provider/CustomContentProviderTest.java index 0d1dfdcbd..b17dc4638 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/content/provider/CustomContentProviderTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/content/provider/CustomContentProviderTest.java @@ -16,6 +16,7 @@ package de.dennisguse.opentracks.content.provider; +import android.content.ContentUris; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; @@ -76,8 +77,13 @@ public class CustomContentProviderTest { @Test public void testGetType() { Assert.assertEquals(TracksColumns.CONTENT_TYPE, customContentProvider.getType(TracksColumns.CONTENT_URI)); - Assert.assertEquals(TrackPointsColumns.CONTENT_TYPE, customContentProvider.getType(TrackPointsColumns.CONTENT_URI)); + Assert.assertEquals(TracksColumns.CONTENT_ITEMTYPE, customContentProvider.getType(ContentUris.appendId(TracksColumns.CONTENT_URI.buildUpon(), 1).build())); + + Assert.assertEquals(TrackPointsColumns.CONTENT_TYPE, customContentProvider.getType(TrackPointsColumns.CONTENT_URI_BY_ID)); + Assert.assertEquals(TrackPointsColumns.CONTENT_ITEMTYPE, customContentProvider.getType(ContentUris.appendId(TrackPointsColumns.CONTENT_URI_BY_TRACKID.buildUpon(), 1).build())); + Assert.assertEquals(WaypointsColumns.CONTENT_TYPE, customContentProvider.getType(WaypointsColumns.CONTENT_URI)); + Assert.assertEquals(WaypointsColumns.CONTENT_ITEMTYPE, customContentProvider.getType(ContentUris.appendId(WaypointsColumns.CONTENT_URI.buildUpon(), 1).build())); } /** diff --git a/src/androidTest/java/de/dennisguse/opentracks/content/provider/CustomContentProviderUtilsTest.java b/src/androidTest/java/de/dennisguse/opentracks/content/provider/CustomContentProviderUtilsTest.java index 3a50906f0..a79f334f9 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/content/provider/CustomContentProviderUtilsTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/content/provider/CustomContentProviderUtilsTest.java @@ -230,7 +230,7 @@ public class CustomContentProviderUtilsTest { ContentResolver contentResolver = context.getContentResolver(); Cursor tracksCursor = contentResolver.query(TracksColumns.CONTENT_URI, null, null, null, TracksColumns._ID); Assert.assertEquals(1, tracksCursor.getCount()); - Cursor tracksPointsCursor = contentResolver.query(TrackPointsColumns.CONTENT_URI, null, null, null, TrackPointsColumns._ID); + Cursor tracksPointsCursor = contentResolver.query(TrackPointsColumns.CONTENT_URI_BY_ID, null, null, null, TrackPointsColumns._ID); Assert.assertEquals(10, tracksPointsCursor.getCount()); Cursor waypointCursor = contentResolver.query(WaypointsColumns.CONTENT_URI, null, null, null, WaypointsColumns._ID); Assert.assertEquals(1, waypointCursor.getCount()); @@ -239,7 +239,7 @@ public class CustomContentProviderUtilsTest { // Check whether all have been deleted. tracksCursor = contentResolver.query(TracksColumns.CONTENT_URI, null, null, null, TracksColumns._ID); Assert.assertEquals(0, tracksCursor.getCount()); - tracksPointsCursor = contentResolver.query(TrackPointsColumns.CONTENT_URI, null, null, null, TrackPointsColumns._ID); + tracksPointsCursor = contentResolver.query(TrackPointsColumns.CONTENT_URI_BY_ID, null, null, null, TrackPointsColumns._ID); Assert.assertEquals(0, tracksPointsCursor.getCount()); waypointCursor = contentResolver.query(WaypointsColumns.CONTENT_URI, null, null, null, WaypointsColumns._ID); Assert.assertEquals(0, waypointCursor.getCount()); @@ -265,7 +265,7 @@ public class CustomContentProviderUtilsTest { ContentResolver contentResolver = context.getContentResolver(); Cursor tracksCursor = contentResolver.query(TracksColumns.CONTENT_URI, null, null, null, TracksColumns._ID); Assert.assertEquals(3, tracksCursor.getCount()); - Cursor tracksPointsCursor = contentResolver.query(TrackPointsColumns.CONTENT_URI, null, null, null, TrackPointsColumns._ID); + Cursor tracksPointsCursor = contentResolver.query(TrackPointsColumns.CONTENT_URI_BY_ID, null, null, null, TrackPointsColumns._ID); Assert.assertEquals(20, tracksPointsCursor.getCount()); Cursor waypointCursor = contentResolver.query(WaypointsColumns.CONTENT_URI, null, null, null, WaypointsColumns._ID); Assert.assertEquals(1, waypointCursor.getCount()); @@ -274,7 +274,7 @@ public class CustomContentProviderUtilsTest { // Check whether all data of a track has been deleted. tracksCursor = contentResolver.query(TracksColumns.CONTENT_URI, null, null, null, TracksColumns._ID); Assert.assertEquals(2, tracksCursor.getCount()); - tracksPointsCursor = contentResolver.query(TrackPointsColumns.CONTENT_URI, null, null, null, TrackPointsColumns._ID); + tracksPointsCursor = contentResolver.query(TrackPointsColumns.CONTENT_URI_BY_ID, null, null, null, TrackPointsColumns._ID); Assert.assertEquals(20, tracksPointsCursor.getCount()); waypointCursor = contentResolver.query(WaypointsColumns.CONTENT_URI, null, null, null, WaypointsColumns._ID); Assert.assertEquals(0, waypointCursor.getCount()); diff --git a/src/main/java/de/dennisguse/opentracks/content/DataSourceManager.java b/src/main/java/de/dennisguse/opentracks/content/DataSourceManager.java index 810bf10e8..c15985cff 100644 --- a/src/main/java/de/dennisguse/opentracks/content/DataSourceManager.java +++ b/src/main/java/de/dennisguse/opentracks/content/DataSourceManager.java @@ -111,8 +111,7 @@ class DataSourceManager { dataSource.registerContentObserver(WaypointsColumns.CONTENT_URI, waypointsTableObserver); break; case SAMPLED_IN_TRACK_POINTS_TABLE: - dataSource.registerContentObserver( - TrackPointsColumns.CONTENT_URI, trackPointsTableObserver); + dataSource.registerContentObserver(TrackPointsColumns.CONTENT_URI_BY_ID, trackPointsTableObserver); break; case SAMPLED_OUT_TRACK_POINTS_TABLE: // Do nothing. SAMPLED_OUT_POINT_UPDATES is mapped to POINT_UPDATES. diff --git a/src/main/java/de/dennisguse/opentracks/content/data/TrackPointsColumns.java b/src/main/java/de/dennisguse/opentracks/content/data/TrackPointsColumns.java index 52a543a95..3c39a2b4f 100644 --- a/src/main/java/de/dennisguse/opentracks/content/data/TrackPointsColumns.java +++ b/src/main/java/de/dennisguse/opentracks/content/data/TrackPointsColumns.java @@ -29,7 +29,8 @@ import de.dennisguse.opentracks.content.provider.ContentProviderUtils; public interface TrackPointsColumns extends BaseColumns { String TABLE_NAME = "trackpoints"; - Uri CONTENT_URI = Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/" + TABLE_NAME); + Uri CONTENT_URI_BY_ID = Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/" + TABLE_NAME); + Uri CONTENT_URI_BY_TRACKID = Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/" + TABLE_NAME + "/trackid"); String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.de.dennisguse.trackpoint"; String CONTENT_ITEMTYPE = "vnd.android.cursor.item/vnd.de.dennisguse.trackpoint"; String DEFAULT_SORT_ORDER = "_id"; diff --git a/src/main/java/de/dennisguse/opentracks/content/provider/ContentProviderUtils.java b/src/main/java/de/dennisguse/opentracks/content/provider/ContentProviderUtils.java index 7edc4d1af..a5e4f1a5a 100644 --- a/src/main/java/de/dennisguse/opentracks/content/provider/ContentProviderUtils.java +++ b/src/main/java/de/dennisguse/opentracks/content/provider/ContentProviderUtils.java @@ -181,7 +181,7 @@ public class ContentProviderUtils { * Deletes all tracks (including waypoints and track points). */ public void deleteAllTracks(Context context) { - contentResolver.delete(TrackPointsColumns.CONTENT_URI, null, null); + contentResolver.delete(TrackPointsColumns.CONTENT_URI_BY_ID, null, null); contentResolver.delete(WaypointsColumns.CONTENT_URI, null, null); // Delete tracks last since it triggers a database vaccum call contentResolver.delete(TracksColumns.CONTENT_URI, null, null); @@ -212,7 +212,7 @@ public class ContentProviderUtils { private void deleteTrackPointsAndWaypoints(Context context, long trackId) { String where = TrackPointsColumns.TRACKID + "=?"; String[] selectionArgs = new String[]{Long.toString(trackId)}; - contentResolver.delete(TrackPointsColumns.CONTENT_URI, where, selectionArgs); + contentResolver.delete(TrackPointsColumns.CONTENT_URI_BY_ID, where, selectionArgs); contentResolver.delete(WaypointsColumns.CONTENT_URI, WaypointsColumns.TRACKID + "=?", new String[]{Long.toString(trackId)}); @@ -659,7 +659,7 @@ public class ContentProviderUtils { for (int i = 0; i < length; i++) { values[i] = createContentValues(locations[i], trackId); } - return contentResolver.bulkInsert(TrackPointsColumns.CONTENT_URI, values); + return contentResolver.bulkInsert(TrackPointsColumns.CONTENT_URI_BY_ID, values); } /** @@ -846,7 +846,7 @@ public class ContentProviderUtils { * @return the content provider URI of the inserted track point */ public Uri insertTrackPoint(Location location, long trackId) { - return contentResolver.insert(TrackPointsColumns.CONTENT_URI, createContentValues(location, trackId)); + return contentResolver.insert(TrackPointsColumns.CONTENT_URI_BY_ID, createContentValues(location, trackId)); } /** @@ -926,7 +926,7 @@ public class ContentProviderUtils { * @param sortOrder the sort order */ private Cursor getTrackPointCursor(String[] projection, String selection, String[] selectionArgs, String sortOrder) { - return contentResolver.query(TrackPointsColumns.CONTENT_URI, projection, selection, selectionArgs, sortOrder); + return contentResolver.query(TrackPointsColumns.CONTENT_URI_BY_ID, projection, selection, selectionArgs, sortOrder); } int getDefaultCursorBatchSize() { diff --git a/src/main/java/de/dennisguse/opentracks/content/provider/CustomContentProvider.java b/src/main/java/de/dennisguse/opentracks/content/provider/CustomContentProvider.java index eb71ae41d..198fa1f1a 100644 --- a/src/main/java/de/dennisguse/opentracks/content/provider/CustomContentProvider.java +++ b/src/main/java/de/dennisguse/opentracks/content/provider/CustomContentProvider.java @@ -59,13 +59,15 @@ public abstract class CustomContentProvider extends ContentProvider { public CustomContentProvider() { uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); - uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, TrackPointsColumns.TABLE_NAME, UrlType.TRACKPOINTS.ordinal()); - uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, TrackPointsColumns.TABLE_NAME + "/#", UrlType.TRACKPOINTS_BY_ID.ordinal()); - uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, TrackPointsColumns.TABLE_NAME + "/#", UrlType.TRACKPOINTS_BY_TRACKID.ordinal()); - uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, TracksColumns.TABLE_NAME, UrlType.TRACKS.ordinal()); - uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, TracksColumns.TABLE_NAME + "/#", UrlType.TRACKS_BY_ID.ordinal()); - uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, WaypointsColumns.TABLE_NAME, UrlType.WAYPOINTS.ordinal()); - uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, WaypointsColumns.TABLE_NAME + "/#", UrlType.WAYPOINTS_BY_ID.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_TRACKID.getPath() + "/#", UrlType.TRACKPOINTS_BY_TRACKID.ordinal()); + + uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, TracksColumns.CONTENT_URI.getPath(), UrlType.TRACKS.ordinal()); + uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, TracksColumns.CONTENT_URI.getPath() + "/#", UrlType.TRACKS_BY_ID.ordinal()); + + uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, WaypointsColumns.CONTENT_URI.getPath(), UrlType.WAYPOINTS.ordinal()); + uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, WaypointsColumns.CONTENT_URI.getPath() + "/#", UrlType.WAYPOINTS_BY_ID.ordinal()); } @Override @@ -200,11 +202,12 @@ public abstract class CustomContentProvider extends ContentProvider { break; case TRACKPOINTS_BY_ID: queryBuilder.setTables(TrackPointsColumns.TABLE_NAME); - queryBuilder.appendWhere(TrackPointsColumns._ID + "=" + url.getPathSegments().get(1)); + + queryBuilder.appendWhere(TrackPointsColumns._ID + "=" + ContentUris.parseId(url)); break; case TRACKPOINTS_BY_TRACKID: queryBuilder.setTables(TrackPointsColumns.TABLE_NAME); - queryBuilder.appendWhere(TrackPointsColumns.TRACKID + "=" + url.getPathSegments().get(1)); + queryBuilder.appendWhere(TrackPointsColumns.TRACKID + "=" + ContentUris.parseId(url)); break; case TRACKS: queryBuilder.setTables(TracksColumns.TABLE_NAME); @@ -212,7 +215,7 @@ public abstract class CustomContentProvider extends ContentProvider { break; case TRACKS_BY_ID: queryBuilder.setTables(TracksColumns.TABLE_NAME); - queryBuilder.appendWhere(TracksColumns._ID + "=" + url.getPathSegments().get(1)); + queryBuilder.appendWhere(TracksColumns._ID + "=" + ContentUris.parseId(url)); break; case WAYPOINTS: queryBuilder.setTables(WaypointsColumns.TABLE_NAME); @@ -220,7 +223,7 @@ public abstract class CustomContentProvider extends ContentProvider { break; case WAYPOINTS_BY_ID: queryBuilder.setTables(WaypointsColumns.TABLE_NAME); - queryBuilder.appendWhere(WaypointsColumns._ID + "=" + url.getPathSegments().get(1)); + queryBuilder.appendWhere(WaypointsColumns._ID + "=" + ContentUris.parseId(url)); break; default: throw new IllegalArgumentException("Unknown url " + url); @@ -242,7 +245,7 @@ public abstract class CustomContentProvider extends ContentProvider { break; case TRACKPOINTS_BY_ID: table = TrackPointsColumns.TABLE_NAME; - whereClause = TrackPointsColumns._ID + "=" + url.getPathSegments().get(1); + whereClause = TrackPointsColumns._ID + "=" + ContentUris.parseId(url); if (!TextUtils.isEmpty(where)) { whereClause += " AND (" + where + ")"; } @@ -253,7 +256,7 @@ public abstract class CustomContentProvider extends ContentProvider { break; case TRACKS_BY_ID: table = TracksColumns.TABLE_NAME; - whereClause = TracksColumns._ID + "=" + url.getPathSegments().get(1); + whereClause = TracksColumns._ID + "=" + ContentUris.parseId(url); if (!TextUtils.isEmpty(where)) { whereClause += " AND (" + where + ")"; } @@ -264,7 +267,7 @@ public abstract class CustomContentProvider extends ContentProvider { break; case WAYPOINTS_BY_ID: table = WaypointsColumns.TABLE_NAME; - whereClause = WaypointsColumns._ID + "=" + url.getPathSegments().get(1); + whereClause = WaypointsColumns._ID + "=" + ContentUris.parseId(url); if (!TextUtils.isEmpty(where)) { whereClause += " AND (" + where + ")"; } @@ -289,8 +292,15 @@ public abstract class CustomContentProvider extends ContentProvider { * * @param url the url */ + @NonNull private UrlType getUrlType(Uri url) { - return UrlType.values()[uriMatcher.match(url)]; + UrlType[] urlTypes = UrlType.values(); + int matchIndex = uriMatcher.match(url); + if (0 <= matchIndex && matchIndex < urlTypes.length) { + return urlTypes[matchIndex]; + } + + throw new IllegalArgumentException("Unknown URL " + url); } /** @@ -328,7 +338,7 @@ public abstract class CustomContentProvider extends ContentProvider { } long rowId = db.insert(TrackPointsColumns.TABLE_NAME, TrackPointsColumns._ID, values); if (rowId >= 0) { - return ContentUris.appendId(TrackPointsColumns.CONTENT_URI.buildUpon(), rowId).build(); + return ContentUris.appendId(TrackPointsColumns.CONTENT_URI_BY_ID.buildUpon(), rowId).build(); } throw new SQLiteException("Failed to insert a track point " + url); } diff --git a/src/main/java/de/dennisguse/opentracks/util/IntentDashboardUtils.java b/src/main/java/de/dennisguse/opentracks/util/IntentDashboardUtils.java index 647b61a93..ef247cef9 100644 --- a/src/main/java/de/dennisguse/opentracks/util/IntentDashboardUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/IntentDashboardUtils.java @@ -28,7 +28,7 @@ public class IntentDashboardUtils { ArrayList uris = new ArrayList<>(); uris.add(0, ContentUris.withAppendedId(TracksColumns.CONTENT_URI, trackId)); - uris.add(1, ContentUris.withAppendedId(TrackPointsColumns.CONTENT_URI, trackId)); + uris.add(1, ContentUris.withAppendedId(TrackPointsColumns.CONTENT_URI_BY_TRACKID, trackId)); Intent intent = new Intent(ACTION_DASHBOARD); intent.putParcelableArrayListExtra(ACTION_DASHBOARD_PAYLOAD, uris);