diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 692113fd6..157833e15 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -111,6 +111,13 @@ limitations under the License. + + + + + + + trackController.update(PreferencesUtils.isRecording(recordingTrackId), recordingTrackPaused)); if (!startGps) { @@ -479,7 +477,7 @@ public class TrackListActivity extends AbstractListActivity implements ConfirmDe Intent intent; switch (itemId) { case R.id.list_context_menu_show_on_map: - IntentUtils.showTrackOnMap(this, trackIds); + IntentUtils.showTrackOnMapDashboard(this, trackIds); return true; case R.id.list_context_menu_share: intent = IntentUtils.newShareFileIntent(this, trackIds); diff --git a/src/main/java/de/dennisguse/opentracks/TrackRecordedActivity.java b/src/main/java/de/dennisguse/opentracks/TrackRecordedActivity.java index 07983584a..dc5fc8af6 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackRecordedActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackRecordedActivity.java @@ -186,7 +186,7 @@ public class TrackRecordedActivity extends AbstractListActivity implements Choos startActivity(intent); return true; case R.id.track_detail_menu_show_on_map: - IntentUtils.showTrackOnMap(this, new long[]{trackId}); + IntentUtils.showTrackOnMapDashboard(this, new long[]{trackId}); return true; case R.id.track_detail_markers: intent = IntentUtils.newIntent(this, MarkerListActivity.class) diff --git a/src/main/java/de/dennisguse/opentracks/TrackRecordingActivity.java b/src/main/java/de/dennisguse/opentracks/TrackRecordingActivity.java index 08397b623..cb1fcc2dd 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackRecordingActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackRecordingActivity.java @@ -338,7 +338,7 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc startActivity(intent); return true; case R.id.track_detail_menu_show_on_map: - IntentUtils.showTrackOnMap(this, new long[]{trackId}); + IntentUtils.showTrackOnMapDashboard(this, new long[]{trackId}); return true; case R.id.track_detail_markers: intent = IntentUtils.newIntent(this, MarkerListActivity.class) 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 53a38bb1a..be49a725f 100644 --- a/src/main/java/de/dennisguse/opentracks/content/provider/ContentProviderUtils.java +++ b/src/main/java/de/dennisguse/opentracks/content/provider/ContentProviderUtils.java @@ -910,5 +910,4 @@ public class ContentProviderUtils { public static String[] parseTrackIdsFromUri(Uri url) { return TextUtils.split(url.getLastPathSegment(), ID_SEPARATOR); } - } diff --git a/src/main/java/de/dennisguse/opentracks/util/IntentDashboardUtils.java b/src/main/java/de/dennisguse/opentracks/util/IntentDashboardUtils.java index b55c8d099..3283db399 100644 --- a/src/main/java/de/dennisguse/opentracks/util/IntentDashboardUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/IntentDashboardUtils.java @@ -5,8 +5,11 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; +import androidx.annotation.NonNull; + import java.util.ArrayList; +import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.content.data.TrackPointsColumns; import de.dennisguse.opentracks.content.data.TracksColumns; import de.dennisguse.opentracks.content.provider.ContentProviderUtils; @@ -24,10 +27,13 @@ public class IntentDashboardUtils { private static final String EXTRAS_SHOULD_KEEP_SCREEN_ON = "EXTRAS_SHOULD_KEEP_SCREEN_ON"; private static final String EXTRAS_SHOW_WHEN_LOCKED = "EXTRAS_SHOULD_KEEP_SCREEN_ON"; + private static int TRACK_URI_INDEX = 0; + private static int TRACKPOINTS_URI_INDEX = 1; + private IntentDashboardUtils() { } - public static boolean startDashboard(Context context, long[] trackIds) { + public static void startDashboard(Context context, long[] trackIds) { ArrayList uris = new ArrayList<>(); String trackIdList = ContentProviderUtils.formatIdListForUri(trackIds); @@ -42,16 +48,23 @@ public class IntentDashboardUtils { intent.putExtra(EXTRAS_SHOW_WHEN_LOCKED, PreferencesUtils.shouldShowStatsOnLockscreen(context)); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - ClipData clipData = ClipData.newRawUri(null, uris.get(0)); - clipData.addItem(new ClipData.Item(uris.get(1))); + ClipData clipData = ClipData.newRawUri(null, uris.get(TRACK_URI_INDEX)); + clipData.addItem(new ClipData.Item(uris.get(TRACKPOINTS_URI_INDEX))); intent.setClipData(clipData); - if (intent.resolveActivity(context.getPackageManager()) != null) { - context.startActivity(Intent.createChooser(intent, null)); - return true; - } - - return false; + context.startActivity(Intent.createChooser(intent, context.getString(R.string.open_track_using_dashboard))); } + public static long[] extractTrackIdsFromIntent(@NonNull Intent intent) { + final ArrayList uris = intent.getParcelableArrayListExtra(ACTION_DASHBOARD_PAYLOAD); + final Uri tracksUri = uris.get(TRACK_URI_INDEX); + + String[] trackIdsString = ContentProviderUtils.parseTrackIdsFromUri(tracksUri); + long[] trackIds = new long[trackIdsString.length]; + for (int i = 0; i < trackIdsString.length; i++) { + trackIds[i] = Long.parseLong(trackIdsString[i]); + } + + return trackIds; + } } diff --git a/src/main/java/de/dennisguse/opentracks/util/IntentUtils.java b/src/main/java/de/dennisguse/opentracks/util/IntentUtils.java index a1b911bac..a687bf12f 100644 --- a/src/main/java/de/dennisguse/opentracks/util/IntentUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/IntentUtils.java @@ -16,15 +16,15 @@ package de.dennisguse.opentracks.util; -import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.net.Uri; +import android.os.Bundle; import android.provider.MediaStore; import android.util.Log; import android.util.Pair; -import android.widget.Toast; +import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.FileProvider; import java.io.File; @@ -52,6 +52,8 @@ public class IntentUtils { private static final String JPEG_EXTENSION = "jpeg"; + private static final TrackFileFormat SHOWONMAP_TRACKFILEFORMAT = TrackFileFormat.KMZ_WITH_TRACKDETAIL; + private IntentUtils() { } @@ -153,41 +155,45 @@ public class IntentUtils { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(uri)); - try { - context.startActivity(intent); - } catch (ActivityNotFoundException e) { - Toast.makeText(context, context.getString(R.string.app_not_installed_show_on_map), Toast.LENGTH_SHORT).show(); - } + + context.startActivity(Intent.createChooser(intent, null)); } /** - * Send intent to show tracks on a map (needs an another app). + * Send intent to show tracks on a map (needs an another app) as resource URIs. * * @param context the context * @param trackIds the track ids */ - public static void showTrackOnMap(Context context, long[] trackIds) { + public static void showTrackOnMapDashboard(Context context, long[] trackIds) { if (trackIds.length == 0) { return; } - if (IntentDashboardUtils.startDashboard(context, trackIds)) { + IntentDashboardUtils.startDashboard(context, trackIds); + } + + /** + * Send intent to show tracks on a map (needs an another app) as KMZ. + * + * @param context the context + * @param trackIds the track ids + */ + public static void showTrackOnMapKMZ(Context context, long[] trackIds) { + if (trackIds.length == 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, "SharingTrack", TrackFileFormat.KMZ_WITH_TRACKDETAIL); + Pair uriAndMime = ShareContentProvider.createURI(trackIds, "SharingTrack", SHOWONMAP_TRACKFILEFORMAT); intent.setDataAndType(uriAndMime.first, uriAndMime.second); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - if (intent.resolveActivity(context.getPackageManager()) != null) { - context.startActivity(intent); - } else { - Toast.makeText(context, context.getString(R.string.app_not_installed_show_on_map), Toast.LENGTH_SHORT).show(); - } + + context.startActivity(Intent.createChooser(intent, context.getString(R.string.open_track_as_trackfileformat, SHOWONMAP_TRACKFILEFORMAT.getExtension()))); } /** @@ -209,4 +215,19 @@ public class IntentUtils { .putExtra(MediaStore.EXTRA_OUTPUT, photoUri); return new Pair<>(intent, photoUri); } + + /** + * Used to convert showTrackOnMapDashboard-requests to showTrackOnMapKMZ. + */ + public static class ShowOnMapProxyActivity extends AppCompatActivity { + + protected void onCreate(final Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + long[] trackIds = IntentDashboardUtils.extractTrackIdsFromIntent(getIntent()); + + showTrackOnMapKMZ(this, trackIds); + + finish(); + } + } } diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index bf0814fc9..28acaafaf 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -95,6 +95,10 @@ limitations under the License. g) do whatever you think helps OpenTracks. + Open using OpenTracks-Dashboard + Open as file + Open as %1$s + airplane ATV