diff --git a/src/main/java/de/dennisguse/opentracks/TrackDetailActivity.java b/src/main/java/de/dennisguse/opentracks/TrackDetailActivity.java index 4121e2766..f041de8cc 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackDetailActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackDetailActivity.java @@ -298,7 +298,7 @@ public class TrackDetailActivity extends AbstractListActivity implements ChooseA shareMenuItem = menu.findItem(R.id.track_detail_share); ShareActionProvider shareActionProvider = (ShareActionProvider) shareMenuItem.getActionProvider(); - shareActionProvider.setShareIntent(IntentUtils.newShareFileIntent(this, trackId)); + shareActionProvider.setShareIntent(IntentUtils.newShareFileIntent(this, new long[]{trackId})); voiceFrequencyMenuItem = menu.findItem(R.id.track_detail_voice_frequency); splitFrequencyMenuItem = menu.findItem(R.id.track_detail_split_frequency); diff --git a/src/main/java/de/dennisguse/opentracks/TrackListActivity.java b/src/main/java/de/dennisguse/opentracks/TrackListActivity.java index b86d90280..ff3d1865d 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackListActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackListActivity.java @@ -110,17 +110,12 @@ public class TrackListActivity extends AbstractListActivity implements ConfirmDe private final ContextualActionModeCallback contextualActionModeCallback = new ContextualActionModeCallback() { @Override - public void onPrepare(Menu menu, int[] positions, long[] ids, boolean showSelectAll) { - boolean isRecording = recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT; - boolean isSingleSelection = ids.length == 1; + public void onPrepare(Menu menu, int[] positions, long[] trackIds, boolean showSelectAll) { + boolean isSingleSelection = trackIds.length == 1; - menu.findItem(R.id.list_context_menu_share).setVisible(!isRecording && isSingleSelection); - Intent shareIntent = null; - if (isSingleSelection) { - shareIntent = IntentUtils.newShareFileIntent(TrackListActivity.this, ids[0]); - } - ShareActionProvider shareActionProvider = (ShareActionProvider) menu.findItem(R.id.list_context_menu_share).getActionProvider(); - shareActionProvider.setShareIntent(shareIntent); + MenuItem shareMenuItem = menu.findItem(R.id.list_context_menu_share); + ShareActionProvider shareActionProvider = (ShareActionProvider) shareMenuItem.getActionProvider(); + shareActionProvider.setShareIntent(trackIds.length == 0 ? null : IntentUtils.newShareFileIntent(TrackListActivity.this, trackIds)); menu.findItem(R.id.list_context_menu_edit).setVisible(isSingleSelection); menu.findItem(R.id.list_context_menu_select_all).setVisible(showSelectAll); diff --git a/src/main/java/de/dennisguse/opentracks/content/ShareContentProvider.java b/src/main/java/de/dennisguse/opentracks/content/ShareContentProvider.java index 6453219b2..78431c045 100644 --- a/src/main/java/de/dennisguse/opentracks/content/ShareContentProvider.java +++ b/src/main/java/de/dennisguse/opentracks/content/ShareContentProvider.java @@ -11,7 +11,6 @@ import android.os.ParcelFileDescriptor; import android.provider.OpenableColumns; import android.util.Log; import android.util.Pair; -import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -45,28 +44,50 @@ public class ShareContentProvider extends CustomContentProvider implements ICont public static final String TAG = ShareContentProvider.class.getCanonicalName(); private static final int URI_KML = 1; + private static final int URI_KMZ = 2; + private static final int URI_GPX = 3; + private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); + private static final String TRACKID_DELIMITER = "_"; static { uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, TracksColumns.TABLE_NAME + "/kml/*", URI_KML); + uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, TracksColumns.TABLE_NAME + "/kmz/*", URI_KMZ); + uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, TracksColumns.TABLE_NAME + "/gpx/*", URI_GPX); } - public static Pair createURI(long[] trackIds) { + public static Pair createURI(long[] trackIds, @NonNull TrackFileFormat trackFileFormat) { if (trackIds.length == 0) { throw new UnsupportedOperationException(); } StringBuilder builder = new StringBuilder(); for (long trackId : trackIds) { - builder.append(trackId).append(","); + builder.append(trackId).append(TRACKID_DELIMITER); } - builder.deleteCharAt(builder.lastIndexOf(",")); + builder.deleteCharAt(builder.lastIndexOf(TRACKID_DELIMITER)); - Uri uri = Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/" + TracksColumns.TABLE_NAME + "/kml/" + builder + ".kml"); + Uri uri = Uri.parse(ContentProviderUtils.CONTENT_BASE_URI + "/" + TracksColumns.TABLE_NAME + "/" + trackFileFormat.getExtension() + "/" + builder + "." + trackFileFormat.getExtension()); String mime = getTypeMime(uri); return new Pair<>(uri, mime); } + private static long[] parseURI(Uri uri) { + String lastPathSegment = uri.getLastPathSegment(); + if (lastPathSegment == null) { + return new long[]{}; + } + + String fileExtension = "." + getTrackFileFormat(uri).getExtension(); + String[] lastPathSegmentSplit = lastPathSegment.replace(fileExtension, "").split(TRACKID_DELIMITER); + + long[] trackIds = new long[lastPathSegmentSplit.length]; + for (int i = 0; i < trackIds.length; i++) { + trackIds[i] = Long.valueOf(lastPathSegmentSplit[i]); + } + return trackIds; + } + /** * Do not allow to be exported via AndroidManifest. * Check that caller has permissions to access {@link CustomContentProvider}. @@ -85,20 +106,6 @@ public class ShareContentProvider extends CustomContentProvider implements ICont } } - private static long[] parseURI(Uri uri) { - String lastPathSegment = uri.getLastPathSegment(); - if (lastPathSegment == null) { - return new long[]{}; - } - - String[] lastPathSegmentSplit = lastPathSegment.replace(".kml", "").split(","); - long[] trackIds = new long[lastPathSegmentSplit.length]; - for (int i = 0; i < trackIds.length; i++) { - trackIds[i] = Long.valueOf(lastPathSegmentSplit[i]); - } - return trackIds; - } - @Override public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) { if (uriMatcher.match(uri) != URI_KML) { @@ -133,12 +140,18 @@ public class ShareContentProvider extends CustomContentProvider implements ICont @Nullable public static String getTypeMime(@NonNull Uri uri) { - switch (uriMatcher.match(uri)) { - case URI_KML: - return TrackFileFormat.KML.getMimeType(); - } + return getTrackFileFormat(uri).getMimeType(); + } - return null; + private static TrackFileFormat getTrackFileFormat(@NonNull Uri uri) { + switch (uriMatcher.match(uri)) { + case URI_KMZ: + return TrackFileFormat.KMZ; + case URI_GPX: + return TrackFileFormat.GPX; + default: //URI_KML + return TrackFileFormat.KML; + } } @Nullable @@ -172,8 +185,7 @@ public class ShareContentProvider extends CustomContentProvider implements ICont try (FileOutputStream fileOutputStream = new FileOutputStream(output.getFileDescriptor())) { fileTrackExporter.writeTrack(fileOutputStream); } catch (IOException e) { - Log.w(TAG, "Oops closing " + e); - Toast.makeText(getContext(), "", Toast.LENGTH_SHORT).show(); + Log.w(TAG, "there occurred an error while sharing a file: " + e); } } }; diff --git a/src/main/java/de/dennisguse/opentracks/util/IntentUtils.java b/src/main/java/de/dennisguse/opentracks/util/IntentUtils.java index 7f1841e1d..21469955d 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.DescriptionGeneratorImpl; import de.dennisguse.opentracks.content.ShareContentProvider; import de.dennisguse.opentracks.content.Track; import de.dennisguse.opentracks.content.Waypoint; +import de.dennisguse.opentracks.io.file.TrackFileFormat; /** * Utilities for creating intents. @@ -71,13 +72,15 @@ public class IntentUtils { * Creates an intent to share a track file with an app. * * @param context the context - * @param trackId the track id + * @param trackIds the track ids */ - public static Intent newShareFileIntent(Context context, long trackId) { - Track track = ContentProviderUtils.Factory.get(context).getTrack(trackId); - String trackDescription = track == null ? "" : new DescriptionGeneratorImpl(context).generateTrackDescription(track, false); - - Pair uriAndMime = ShareContentProvider.createURI(new long[]{trackId}); + public static Intent newShareFileIntent(Context context, long[] trackIds) { + String trackDescription = ""; + if (trackIds.length == 1) { + Track track = ContentProviderUtils.Factory.get(context).getTrack(trackIds[0]); + trackDescription = track == null ? "" : new DescriptionGeneratorImpl(context).generateTrackDescription(track, false); + } + Pair uriAndMime = ShareContentProvider.createURI(trackIds, TrackFileFormat.KML); return new Intent(Intent.ACTION_SEND) .putExtra(Intent.EXTRA_STREAM, uriAndMime.first) @@ -109,7 +112,7 @@ public class IntentUtils { return; } - Pair uriAndMime = ShareContentProvider.createURI(trackIds); + Pair uriAndMime = ShareContentProvider.createURI(trackIds, TrackFileFormat.KML); Intent intent = new Intent(); intent.setAction(android.content.Intent.ACTION_VIEW); intent.setDataAndType(uriAndMime.first, uriAndMime.second);