From a3eb1070686fe3a377ab50c4a9bb1c91bd62c279 Mon Sep 17 00:00:00 2001 From: Peter Storch Date: Sun, 1 Dec 2019 16:59:48 +0100 Subject: [PATCH] integrate dashboard plugin mechanism To be able to integrate the OSMDashboard https://github.com/OpenTracksApp/OSMDashboard, which addresses #79. Also other Dashboards will be possible. --- .../content/ContentProviderUtils.java | 2 +- .../content/CustomContentProvider.java | 18 +++++-- .../content/ShareContentProvider.java | 2 +- .../content/data/TrackPointsColumns.java | 2 +- .../content/data/TracksColumns.java | 2 +- .../content/data/WaypointsColumns.java | 2 +- .../opentracks/util/IntentDashboardUtils.java | 54 +++++++++++++++++++ .../opentracks/util/IntentUtils.java | 13 ++++- 8 files changed, 84 insertions(+), 11 deletions(-) create mode 100644 src/main/java/de/dennisguse/opentracks/util/IntentDashboardUtils.java diff --git a/src/main/java/de/dennisguse/opentracks/content/ContentProviderUtils.java b/src/main/java/de/dennisguse/opentracks/content/ContentProviderUtils.java index 7bd8ed2be..15c8ebd80 100644 --- a/src/main/java/de/dennisguse/opentracks/content/ContentProviderUtils.java +++ b/src/main/java/de/dennisguse/opentracks/content/ContentProviderUtils.java @@ -1086,4 +1086,4 @@ public class ContentProviderUtils { sensorPowerIndex = cursor.getColumnIndexOrThrow(TrackPointsColumns.SENSOR_POWER); } } -} \ No newline at end of file +} diff --git a/src/main/java/de/dennisguse/opentracks/content/CustomContentProvider.java b/src/main/java/de/dennisguse/opentracks/content/CustomContentProvider.java index ae2d92846..301ad9a41 100644 --- a/src/main/java/de/dennisguse/opentracks/content/CustomContentProvider.java +++ b/src/main/java/de/dennisguse/opentracks/content/CustomContentProvider.java @@ -61,6 +61,7 @@ public abstract class CustomContentProvider extends ContentProvider { 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()); @@ -134,6 +135,8 @@ public abstract class CustomContentProvider extends ContentProvider { return TrackPointsColumns.CONTENT_TYPE; case TRACKPOINTS_BY_ID: return TrackPointsColumns.CONTENT_ITEMTYPE; + case TRACKPOINTS_BY_TRACKID: + return TrackPointsColumns.CONTENT_ITEMTYPE; case TRACKS: return TracksColumns.CONTENT_TYPE; case TRACKS_BY_ID: @@ -198,7 +201,11 @@ public abstract class CustomContentProvider extends ContentProvider { break; case TRACKPOINTS_BY_ID: queryBuilder.setTables(TrackPointsColumns.TABLE_NAME); - queryBuilder.appendWhere("_id=" + url.getPathSegments().get(1)); + queryBuilder.appendWhere(TrackPointsColumns._ID + "=" + url.getPathSegments().get(1)); + break; + case TRACKPOINTS_BY_TRACKID: + queryBuilder.setTables(TrackPointsColumns.TABLE_NAME); + queryBuilder.appendWhere(TrackPointsColumns.TRACKID + "=" + url.getPathSegments().get(1)); break; case TRACKS: queryBuilder.setTables(TracksColumns.TABLE_NAME); @@ -206,7 +213,7 @@ public abstract class CustomContentProvider extends ContentProvider { break; case TRACKS_BY_ID: queryBuilder.setTables(TracksColumns.TABLE_NAME); - queryBuilder.appendWhere("_id=" + url.getPathSegments().get(1)); + queryBuilder.appendWhere(TracksColumns._ID + "=" + url.getPathSegments().get(1)); break; case WAYPOINTS: queryBuilder.setTables(WaypointsColumns.TABLE_NAME); @@ -214,7 +221,7 @@ public abstract class CustomContentProvider extends ContentProvider { break; case WAYPOINTS_BY_ID: queryBuilder.setTables(WaypointsColumns.TABLE_NAME); - queryBuilder.appendWhere("_id=" + url.getPathSegments().get(1)); + queryBuilder.appendWhere(WaypointsColumns._ID + "=" + url.getPathSegments().get(1)); break; default: throw new IllegalArgumentException("Unknown url " + url); @@ -226,6 +233,7 @@ public abstract class CustomContentProvider extends ContentProvider { @Override public int update(@NonNull Uri url, ContentValues values, String where, String[] selectionArgs) { + // TODO Use SQLiteQueryBuilder String table; String whereClause; switch (getUrlType(url)) { @@ -367,7 +375,9 @@ public abstract class CustomContentProvider extends ContentProvider { enum UrlType { TRACKPOINTS, TRACKPOINTS_BY_ID, - TRACKS, TRACKS_BY_ID, + TRACKPOINTS_BY_TRACKID, + TRACKS, + TRACKS_BY_ID, WAYPOINTS, WAYPOINTS_BY_ID } diff --git a/src/main/java/de/dennisguse/opentracks/content/ShareContentProvider.java b/src/main/java/de/dennisguse/opentracks/content/ShareContentProvider.java index 7dbbf71d4..1c105fae6 100644 --- a/src/main/java/de/dennisguse/opentracks/content/ShareContentProvider.java +++ b/src/main/java/de/dennisguse/opentracks/content/ShareContentProvider.java @@ -81,7 +81,7 @@ public class ShareContentProvider extends CustomContentProvider implements ICont } builder.deleteCharAt(builder.lastIndexOf(TRACKID_DELIMITER)); - Uri uri = Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/" + TracksColumns.TABLE_NAME + "/" + trackFileFormat.getName() + "/" + builder + "." + trackFileFormat.getExtension()); + Uri uri = Uri.parse(TracksColumns.CONTENT_URI + "/" + trackFileFormat.getName() + "/" + builder + "." + trackFileFormat.getExtension()); String mime = getTypeMime(uri); Log.d(TAG, "Created uri " + uri.toString() + " with MIME " + mime); 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 9c16ce02f..3557f01c6 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,7 @@ import de.dennisguse.opentracks.content.ContentProviderUtils; public interface TrackPointsColumns extends BaseColumns { String TABLE_NAME = "trackpoints"; - Uri CONTENT_URI = Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/trackpoints"); + Uri CONTENT_URI = Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/" + TABLE_NAME); 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/data/TracksColumns.java b/src/main/java/de/dennisguse/opentracks/content/data/TracksColumns.java index 98f4194cc..e5022e635 100644 --- a/src/main/java/de/dennisguse/opentracks/content/data/TracksColumns.java +++ b/src/main/java/de/dennisguse/opentracks/content/data/TracksColumns.java @@ -29,7 +29,7 @@ import de.dennisguse.opentracks.content.ContentProviderUtils; public interface TracksColumns extends BaseColumns { String TABLE_NAME = "tracks"; - Uri CONTENT_URI = Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/tracks"); + Uri CONTENT_URI = Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/" + TABLE_NAME); String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.de.dennisguse.track"; String CONTENT_ITEMTYPE = "vnd.android.cursor.item/vnd.de.dennisguse.track"; String DEFAULT_SORT_ORDER = "_id"; diff --git a/src/main/java/de/dennisguse/opentracks/content/data/WaypointsColumns.java b/src/main/java/de/dennisguse/opentracks/content/data/WaypointsColumns.java index df7dbe6c5..a5b7019f6 100644 --- a/src/main/java/de/dennisguse/opentracks/content/data/WaypointsColumns.java +++ b/src/main/java/de/dennisguse/opentracks/content/data/WaypointsColumns.java @@ -29,7 +29,7 @@ import de.dennisguse.opentracks.content.ContentProviderUtils; public interface WaypointsColumns extends BaseColumns { String TABLE_NAME = "waypoints"; - Uri CONTENT_URI = Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/waypoints"); + Uri CONTENT_URI = Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/" + TABLE_NAME); String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.de.dennisguse.waypoint"; String CONTENT_ITEMTYPE = "vnd.android.cursor.item/vnd.de.dennisguse.waypoint"; String DEFAULT_SORT_ORDER = "_id"; diff --git a/src/main/java/de/dennisguse/opentracks/util/IntentDashboardUtils.java b/src/main/java/de/dennisguse/opentracks/util/IntentDashboardUtils.java new file mode 100644 index 000000000..4c6bacd06 --- /dev/null +++ b/src/main/java/de/dennisguse/opentracks/util/IntentDashboardUtils.java @@ -0,0 +1,54 @@ +package de.dennisguse.opentracks.util; + +import android.content.ClipData; +import android.content.ContentUris; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.net.Uri; + +import java.util.ArrayList; +import java.util.List; + +import de.dennisguse.opentracks.content.data.TrackPointsColumns; +import de.dennisguse.opentracks.content.data.TracksColumns; + +/** + * Create an {@link Intent} to request showing a Dashboard. + * The receiving {@link android.app.Activity} gets temporary access to the {@link TracksColumns} and the {@link TrackPointsColumns} (incl. update). + */ +public class IntentDashboardUtils { + + public static final String ACTION_DASHBOARD = "Intent.OpenTracks-Dashboard"; + + public static final String ACTION_DASHBOARD_PAYLOAD = ACTION_DASHBOARD + ".Payload"; + + private IntentDashboardUtils() { + } + + public static boolean startDashboardPlugin(Context context, long trackId) { + ArrayList uris = new ArrayList<>(); + + uris.add(0, ContentUris.withAppendedId(TracksColumns.CONTENT_URI, trackId)); + uris.add(1, ContentUris.withAppendedId(TrackPointsColumns.CONTENT_URI, trackId)); + + Intent intent = new Intent(ACTION_DASHBOARD); + intent.putParcelableArrayListExtra(ACTION_DASHBOARD_PAYLOAD, uris); + + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + ClipData clipData = ClipData.newRawUri(null, uris.get(0)); + clipData.addItem(new ClipData.Item(uris.get(1))); + intent.setClipData(clipData); + + List resolveInfos = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); + if (resolveInfos.size() > 0) { + context.startActivity(intent); + return true; + } + + return false; + } +} diff --git a/src/main/java/de/dennisguse/opentracks/util/IntentUtils.java b/src/main/java/de/dennisguse/opentracks/util/IntentUtils.java index 71c42155a..d3ead691a 100644 --- a/src/main/java/de/dennisguse/opentracks/util/IntentUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/IntentUtils.java @@ -37,6 +37,7 @@ import de.dennisguse.opentracks.content.ContentProviderUtils; import de.dennisguse.opentracks.content.DescriptionGenerator; import de.dennisguse.opentracks.content.ShareContentProvider; import de.dennisguse.opentracks.content.data.Track; +import de.dennisguse.opentracks.content.data.TrackPointsColumns; import de.dennisguse.opentracks.content.data.Waypoint; import de.dennisguse.opentracks.io.file.TrackFileFormat; @@ -126,6 +127,8 @@ public class IntentUtils { } } + + /** * Send intent to show tracks on a map (needs an another app). * @@ -137,10 +140,16 @@ public class IntentUtils { return; } + if (IntentDashboardUtils.startDashboardPlugin(context, trackIds[0])) { + return; + } + + Intent intent = new Intent(android.content.Intent.ACTION_VIEW); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.putExtra(TrackPointsColumns.TRACKID, trackIds[0]); Pair uriAndMime = ShareContentProvider.createURI(trackIds, TrackFileFormat.KMZ_WITH_TRACKDETAIL); - Intent intent = new Intent(); - intent.setAction(android.content.Intent.ACTION_VIEW); intent.setDataAndType(uriAndMime.first, uriAndMime.second); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); try { context.startActivity(intent);