From 883b9ae7d2ae3bf801ca7fee2e735abfcdba8dd6 Mon Sep 17 00:00:00 2001 From: graue70 <23035329+graue70@users.noreply.github.com> Date: Mon, 19 Oct 2026 00:37:57 +0200 Subject: [PATCH] Share: use ACTION_SEND when sharing a single track so apps like Signal are offered as share target (#2405). --- .../opentracks/share/ShareUtilsTest.java | 64 +++++++++++++++++++ .../opentracks/share/ShareUtils.java | 9 +++ 2 files changed, 73 insertions(+) create mode 100644 src/androidTest/java/de/dennisguse/opentracks/share/ShareUtilsTest.java diff --git a/src/androidTest/java/de/dennisguse/opentracks/share/ShareUtilsTest.java b/src/androidTest/java/de/dennisguse/opentracks/share/ShareUtilsTest.java new file mode 100644 index 000000000..ac341c1e1 --- /dev/null +++ b/src/androidTest/java/de/dennisguse/opentracks/share/ShareUtilsTest.java @@ -0,0 +1,64 @@ +package de.dennisguse.opentracks.share; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; + +import androidx.test.core.app.ApplicationProvider; + +import org.junit.Before; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Objects; + +import de.dennisguse.opentracks.content.data.TestDataUtil; +import de.dennisguse.opentracks.data.ContentProviderUtils; +import de.dennisguse.opentracks.data.models.Track; + +public class ShareUtilsTest { + + private final Context context = ApplicationProvider.getApplicationContext(); + private ContentProviderUtils contentProviderUtils; + + @Before + public void setUp() { + contentProviderUtils = new ContentProviderUtils(context); + contentProviderUtils.deleteAllTracks(context); + } + + @Test + public void testSingleTrack() { + // given + Track.Id trackId = new Track.Id(System.currentTimeMillis()); + contentProviderUtils.insertTrack(TestDataUtil.createTrack(trackId)); + + // when + Intent intent = ShareUtils.newShareFileIntent(context, trackId); + + // then + assertEquals(Intent.ACTION_SEND, intent.getAction()); + assertTrue(intent.getParcelableExtra(Intent.EXTRA_STREAM) instanceof Uri); + } + + @Test + public void testMultipleTracks() { + // given + long random = System.currentTimeMillis(); + Track.Id trackId1 = new Track.Id(random); + Track.Id trackId2 = new Track.Id(random + 1); + contentProviderUtils.insertTrack(TestDataUtil.createTrack(trackId1)); + contentProviderUtils.insertTrack(TestDataUtil.createTrack(trackId2)); + + // when + Intent intent = ShareUtils.newShareFileIntent(context, trackId1, trackId2); + + // then + assertEquals(Intent.ACTION_SEND_MULTIPLE, intent.getAction()); + ArrayList uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); + assertEquals(2, Objects.requireNonNull(uris).size()); + } +} diff --git a/src/main/java/de/dennisguse/opentracks/share/ShareUtils.java b/src/main/java/de/dennisguse/opentracks/share/ShareUtils.java index 34ff99c88..9d0a6e893 100644 --- a/src/main/java/de/dennisguse/opentracks/share/ShareUtils.java +++ b/src/main/java/de/dennisguse/opentracks/share/ShareUtils.java @@ -62,6 +62,15 @@ public class ShareUtils { mime = uriAndMime.second; } + if (uris.size() == 1) { + return new Intent(Intent.ACTION_SEND) + .setType(mime) + .putExtra(Intent.EXTRA_STREAM, uris.get(0)) + .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + .putExtra(Intent.EXTRA_SUBJECT, context.getString(R.string.share_track_subject)) + .putExtra(Intent.EXTRA_TEXT, context.getString(R.string.share_track_share_file_body, trackDescription)); + } + return new Intent(Intent.ACTION_SEND_MULTIPLE) .setType(mime) .putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris)