From fa9cb3903c7b04279b3e37354668b2ff7e437e8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rom=C3=A1n?= Date: Tue, 14 Apr 2020 14:58:52 +0200 Subject: [PATCH] KMZ exporting: checks waypoints images exists before parse kml. --- .../io/file/exporter/KmlTrackWriter.java | 4 ++- .../io/file/exporter/KmzTrackExporter.java | 10 ++++--- .../importer/AbstractFileTrackImporter.java | 16 ++-------- .../dennisguse/opentracks/util/FileUtils.java | 30 +++++++++++++++++++ 4 files changed, 41 insertions(+), 19 deletions(-) diff --git a/src/main/java/de/dennisguse/opentracks/io/file/exporter/KmlTrackWriter.java b/src/main/java/de/dennisguse/opentracks/io/file/exporter/KmlTrackWriter.java index 393ab19ca..91f8b9c47 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/exporter/KmlTrackWriter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/exporter/KmlTrackWriter.java @@ -32,6 +32,7 @@ import de.dennisguse.opentracks.content.data.TrackPoint; import de.dennisguse.opentracks.content.data.Waypoint; import de.dennisguse.opentracks.content.provider.ContentProviderUtils; import de.dennisguse.opentracks.content.sensor.SensorDataSet; +import de.dennisguse.opentracks.util.FileUtils; import de.dennisguse.opentracks.util.StringUtils; /** @@ -162,7 +163,8 @@ public class KmlTrackWriter implements TrackWriter { @Override public void writeWaypoint(Waypoint waypoint) { if (printWriter != null && exportTrackDetail) { - if (waypoint.hasPhoto() && exportPhotos) { + boolean existsPhoto = FileUtils.getPhotoFileIfExists(context, waypoint.getTrackId(), waypoint.getPhotoURI()) != null; + if (waypoint.hasPhoto() && exportPhotos && existsPhoto) { float heading = getHeading(waypoint.getTrackId(), waypoint.getLocation()); writePhotoOverlay(waypoint.getName(), waypoint.getCategory(), waypoint.getDescription(), waypoint.getLocation(), waypoint.getPhotoUrl(), heading); } else { diff --git a/src/main/java/de/dennisguse/opentracks/io/file/exporter/KmzTrackExporter.java b/src/main/java/de/dennisguse/opentracks/io/file/exporter/KmzTrackExporter.java index ef24556dc..2f4ccab39 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/exporter/KmzTrackExporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/exporter/KmzTrackExporter.java @@ -112,7 +112,11 @@ public class KmzTrackExporter implements TrackExporter { } Waypoint waypoint = contentProviderUtils.createWaypoint(cursor); if (waypoint.hasPhoto()) { - addImage(context, zipOutputStream, waypoint.getPhotoUrl()); + Uri uriPhoto = waypoint.getPhotoURI(); + boolean existsPhoto = FileUtils.getPhotoFileIfExists(context, track.getId(), uriPhoto) != null; + if (existsPhoto) { + addImage(context, zipOutputStream, uriPhoto); + } } cursor.moveToNext(); @@ -122,9 +126,7 @@ public class KmzTrackExporter implements TrackExporter { } } - private void addImage(Context context, ZipOutputStream zipOutputStream, String photoUrl) throws IOException { - Uri uri = Uri.parse(photoUrl); - + private void addImage(Context context, ZipOutputStream zipOutputStream, Uri uri) throws IOException { try (InputStream inputStream = context.getContentResolver().openInputStream(uri)) { ZipEntry zipEntry = new ZipEntry(buildKmzImageFilePath(uri)); zipOutputStream.putNextEntry(zipEntry); diff --git a/src/main/java/de/dennisguse/opentracks/io/file/importer/AbstractFileTrackImporter.java b/src/main/java/de/dennisguse/opentracks/io/file/importer/AbstractFileTrackImporter.java index 49fb6379b..726a6ed00 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/importer/AbstractFileTrackImporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/importer/AbstractFileTrackImporter.java @@ -380,20 +380,8 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track return null; } - Uri externalPhotoUri = Uri.parse(externalPhotoUrl); - if (externalPhotoUri == null) { - Log.w(TAG, "Could not parse external photo url."); - return null; - } - String filename = externalPhotoUri.getLastPathSegment(); - if (filename == null) { - Log.w(TAG, "External photo contains no filename."); - return null; - } - - File dir = FileUtils.getPhotoDir(context, importTrackId); - File file = new File(dir, filename); - if (file.exists()) { + File file = FileUtils.getPhotoFileIfExists(context, importTrackId, Uri.parse(externalPhotoUrl)); + if (file != null) { Uri photoUri = FileUtils.getUriForFile(context, file); return "" + photoUri; } diff --git a/src/main/java/de/dennisguse/opentracks/util/FileUtils.java b/src/main/java/de/dennisguse/opentracks/util/FileUtils.java index 71368a196..9772bad29 100644 --- a/src/main/java/de/dennisguse/opentracks/util/FileUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/FileUtils.java @@ -250,4 +250,34 @@ public class FileUtils { public static Uri getUriForFile(Context context, File file) { return FileProvider.getUriForFile(context, FileUtils.FILEPROVIDER, file); } + + /** + * Checks that there is a file inside track photo directory whose name is the same that uri file. + * If there is a file inside photo directory whose name is the same that uri then returns File. Otherwise returns null. + * + * @param context the Context. + * @param trackId the id of the Track. + * @param uri the uri to check. + * @return File object or null. + */ + public static File getPhotoFileIfExists(Context context, long trackId, Uri uri) { + if (uri == null) { + Log.w(TAG, "URI object is null."); + return null; + } + + String filename = uri.getLastPathSegment(); + if (filename == null) { + Log.w(TAG, "External photo contains no filename."); + return null; + } + + File dir = FileUtils.getPhotoDir(context, trackId); + File file = new File(dir, filename); + if (!file.exists()) { + return null; + } + + return file; + } }