forked from upstream-mirrors/OpenTracks
Export to KML and KMZ as requested by user.
This commit is contained in:
@@ -4,13 +4,12 @@ import android.content.Context;
|
|||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
|
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
import de.dennisguse.opentracks.R;
|
||||||
import de.dennisguse.opentracks.io.file.exporter.GpxTrackWriter;
|
import de.dennisguse.opentracks.io.file.exporter.GpxTrackWriter;
|
||||||
import de.dennisguse.opentracks.io.file.exporter.KmlTrackWriter;
|
import de.dennisguse.opentracks.io.file.exporter.KmlTrackWriter;
|
||||||
import de.dennisguse.opentracks.io.file.exporter.KmzTrackExporter;
|
|
||||||
import de.dennisguse.opentracks.io.file.exporter.TrackWriter;
|
import de.dennisguse.opentracks.io.file.exporter.TrackWriter;
|
||||||
import de.dennisguse.opentracks.R;
|
|
||||||
|
|
||||||
import java.util.Locale;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Definition of all possible track formats.
|
* Definition of all possible track formats.
|
||||||
@@ -18,13 +17,19 @@ import java.util.Locale;
|
|||||||
public enum TrackFileFormat implements Parcelable {
|
public enum TrackFileFormat implements Parcelable {
|
||||||
KML {
|
KML {
|
||||||
@Override
|
@Override
|
||||||
public TrackWriter newTrackWriter(Context context, boolean multiple, boolean playTrack) {
|
public TrackWriter newTrackWriter(Context context, boolean multiple) {
|
||||||
return new KmlTrackWriter(context, multiple, playTrack);
|
return new KmlTrackWriter(context, multiple, false);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
KMZ {
|
||||||
|
@Override
|
||||||
|
public TrackWriter newTrackWriter(Context context, boolean multiple) {
|
||||||
|
return new KmlTrackWriter(context, multiple, true);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
GPX {
|
GPX {
|
||||||
@Override
|
@Override
|
||||||
public TrackWriter newTrackWriter(Context context, boolean multiple, boolean playTrack) {
|
public TrackWriter newTrackWriter(Context context, boolean multiple) {
|
||||||
return new GpxTrackWriter(context.getString(R.string.app_name));
|
return new GpxTrackWriter(context.getString(R.string.app_name));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -56,9 +61,8 @@ public enum TrackFileFormat implements Parcelable {
|
|||||||
*
|
*
|
||||||
* @param context the context
|
* @param context the context
|
||||||
* @param multiple true for writing multiple tracks
|
* @param multiple true for writing multiple tracks
|
||||||
* @param playTrack true to play track
|
|
||||||
*/
|
*/
|
||||||
public abstract TrackWriter newTrackWriter(Context context, boolean multiple, boolean playTrack);
|
public abstract TrackWriter newTrackWriter(Context context, boolean multiple);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the mime type for each format.
|
* Returns the mime type for each format.
|
||||||
|
|||||||
@@ -22,6 +22,12 @@ import android.net.Uri;
|
|||||||
|
|
||||||
import androidx.annotation.VisibleForTesting;
|
import androidx.annotation.VisibleForTesting;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import de.dennisguse.opentracks.R;
|
||||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||||
import de.dennisguse.opentracks.content.DescriptionGenerator;
|
import de.dennisguse.opentracks.content.DescriptionGenerator;
|
||||||
import de.dennisguse.opentracks.content.DescriptionGeneratorImpl;
|
import de.dennisguse.opentracks.content.DescriptionGeneratorImpl;
|
||||||
@@ -32,12 +38,6 @@ import de.dennisguse.opentracks.content.Waypoint.WaypointType;
|
|||||||
import de.dennisguse.opentracks.content.sensor.SensorDataSet;
|
import de.dennisguse.opentracks.content.sensor.SensorDataSet;
|
||||||
import de.dennisguse.opentracks.io.file.TrackFileFormat;
|
import de.dennisguse.opentracks.io.file.TrackFileFormat;
|
||||||
import de.dennisguse.opentracks.util.StringUtils;
|
import de.dennisguse.opentracks.util.StringUtils;
|
||||||
import de.dennisguse.opentracks.R;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.io.PrintWriter;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write track as KML to a file.
|
* Write track as KML to a file.
|
||||||
@@ -64,7 +64,7 @@ public class KmlTrackWriter implements TrackWriter {
|
|||||||
|
|
||||||
private final Context context;
|
private final Context context;
|
||||||
private final boolean multiple;
|
private final boolean multiple;
|
||||||
private final boolean playTrack;
|
private final boolean isKMZ;
|
||||||
private final DescriptionGenerator descriptionGenerator;
|
private final DescriptionGenerator descriptionGenerator;
|
||||||
private final ContentProviderUtils contentProviderUtils;
|
private final ContentProviderUtils contentProviderUtils;
|
||||||
|
|
||||||
@@ -76,15 +76,15 @@ public class KmlTrackWriter implements TrackWriter {
|
|||||||
private boolean hasCadence;
|
private boolean hasCadence;
|
||||||
private boolean hasHeartRate;
|
private boolean hasHeartRate;
|
||||||
|
|
||||||
public KmlTrackWriter(Context context, boolean multiple, boolean playTrack) {
|
public KmlTrackWriter(Context context, boolean multiple, boolean isKMZ) {
|
||||||
this(context, multiple, playTrack, new DescriptionGeneratorImpl(context));
|
this(context, multiple, isKMZ, new DescriptionGeneratorImpl(context));
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
KmlTrackWriter(Context context, boolean multiple, boolean playTrack, DescriptionGenerator descriptionGenerator) {
|
KmlTrackWriter(Context context, boolean multiple, boolean isKMZ, DescriptionGenerator descriptionGenerator) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
this.multiple = multiple;
|
this.multiple = multiple;
|
||||||
this.playTrack = playTrack;
|
this.isKMZ = isKMZ;
|
||||||
this.descriptionGenerator = descriptionGenerator;
|
this.descriptionGenerator = descriptionGenerator;
|
||||||
this.contentProviderUtils = ContentProviderUtils.Factory.get(context);
|
this.contentProviderUtils = ContentProviderUtils.Factory.get(context);
|
||||||
}
|
}
|
||||||
@@ -333,7 +333,8 @@ public class KmlTrackWriter implements TrackWriter {
|
|||||||
printWriter.println("<TimeStamp><when>" + StringUtils.formatDateTimeIso8601(location.getTime()) + "</when></TimeStamp>");
|
printWriter.println("<TimeStamp><when>" + StringUtils.formatDateTimeIso8601(location.getTime()) + "</when></TimeStamp>");
|
||||||
printWriter.println("<styleUrl>#" + styleName + "</styleUrl>");
|
printWriter.println("<styleUrl>#" + styleName + "</styleUrl>");
|
||||||
writeCategory(category);
|
writeCategory(category);
|
||||||
if (playTrack) {
|
|
||||||
|
if (isKMZ) {
|
||||||
printWriter.println("<Icon><href>" + Uri.decode(photoUrl) + "</href></Icon>");
|
printWriter.println("<Icon><href>" + Uri.decode(photoUrl) + "</href></Icon>");
|
||||||
} else {
|
} else {
|
||||||
Uri uri = Uri.parse(photoUrl);
|
Uri uri = Uri.parse(photoUrl);
|
||||||
|
|||||||
@@ -25,13 +25,13 @@ import android.content.Intent;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
import de.dennisguse.opentracks.R;
|
||||||
import de.dennisguse.opentracks.io.file.TrackFileFormat;
|
import de.dennisguse.opentracks.io.file.TrackFileFormat;
|
||||||
import de.dennisguse.opentracks.util.DialogUtils;
|
import de.dennisguse.opentracks.util.DialogUtils;
|
||||||
import de.dennisguse.opentracks.util.FileUtils;
|
import de.dennisguse.opentracks.util.FileUtils;
|
||||||
import de.dennisguse.opentracks.util.IntentUtils;
|
import de.dennisguse.opentracks.util.IntentUtils;
|
||||||
import de.dennisguse.opentracks.R;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An activity for saving tracks to the external storage. If saving a specific
|
* An activity for saving tracks to the external storage. If saving a specific
|
||||||
@@ -102,7 +102,7 @@ public class SaveActivity extends Activity {
|
|||||||
saveAsyncTask = (SaveAsyncTask) retained;
|
saveAsyncTask = (SaveAsyncTask) retained;
|
||||||
saveAsyncTask.setActivity(this);
|
saveAsyncTask.setActivity(this);
|
||||||
} else {
|
} else {
|
||||||
saveAsyncTask = new SaveAsyncTask(this, trackIds, trackFileFormat, playTrack, directory);
|
saveAsyncTask = new SaveAsyncTask(this, trackIds, trackFileFormat, directory);
|
||||||
saveAsyncTask.execute();
|
saveAsyncTask.execute();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,12 @@ import android.os.AsyncTask;
|
|||||||
import android.os.PowerManager.WakeLock;
|
import android.os.PowerManager.WakeLock;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import de.dennisguse.opentracks.R;
|
||||||
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
import de.dennisguse.opentracks.content.ContentProviderUtils;
|
||||||
import de.dennisguse.opentracks.content.Track;
|
import de.dennisguse.opentracks.content.Track;
|
||||||
import de.dennisguse.opentracks.content.TracksColumns;
|
import de.dennisguse.opentracks.content.TracksColumns;
|
||||||
@@ -29,12 +35,6 @@ import de.dennisguse.opentracks.io.file.TrackFileFormat;
|
|||||||
import de.dennisguse.opentracks.util.FileUtils;
|
import de.dennisguse.opentracks.util.FileUtils;
|
||||||
import de.dennisguse.opentracks.util.PreferencesUtils;
|
import de.dennisguse.opentracks.util.PreferencesUtils;
|
||||||
import de.dennisguse.opentracks.util.SystemUtils;
|
import de.dennisguse.opentracks.util.SystemUtils;
|
||||||
import de.dennisguse.opentracks.R;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Async Task to save tracks to the external storage.
|
* Async Task to save tracks to the external storage.
|
||||||
@@ -46,8 +46,6 @@ public class SaveAsyncTask extends AsyncTask<Void, Integer, Boolean> {
|
|||||||
private static final String TAG = SaveAsyncTask.class.getSimpleName();
|
private static final String TAG = SaveAsyncTask.class.getSimpleName();
|
||||||
private final long[] trackIds;
|
private final long[] trackIds;
|
||||||
private final TrackFileFormat trackFileFormat;
|
private final TrackFileFormat trackFileFormat;
|
||||||
@Deprecated //TODO Seems to be a left over from Google Earth integration and can be removed.
|
|
||||||
private final boolean playTrack;
|
|
||||||
private final File directory;
|
private final File directory;
|
||||||
private final Context context;
|
private final Context context;
|
||||||
private final ContentProviderUtils contentProviderUtils;
|
private final ContentProviderUtils contentProviderUtils;
|
||||||
@@ -73,14 +71,12 @@ public class SaveAsyncTask extends AsyncTask<Void, Integer, Boolean> {
|
|||||||
* @param trackIds the track ids to save. To save all, set to size 1 with
|
* @param trackIds the track ids to save. To save all, set to size 1 with
|
||||||
* trackIds[0] == -1L
|
* trackIds[0] == -1L
|
||||||
* @param trackFileFormat the track file format
|
* @param trackFileFormat the track file format
|
||||||
* @param playTrack true to play track
|
|
||||||
* @param directory the directory to write the file
|
* @param directory the directory to write the file
|
||||||
*/
|
*/
|
||||||
public SaveAsyncTask(SaveActivity saveActivity, long[] trackIds, TrackFileFormat trackFileFormat, boolean playTrack, File directory) {
|
public SaveAsyncTask(SaveActivity saveActivity, long[] trackIds, TrackFileFormat trackFileFormat, File directory) {
|
||||||
this.saveActivity = saveActivity;
|
this.saveActivity = saveActivity;
|
||||||
this.trackIds = trackIds;
|
this.trackIds = trackIds;
|
||||||
this.trackFileFormat = trackFileFormat;
|
this.trackFileFormat = trackFileFormat;
|
||||||
this.playTrack = playTrack;
|
|
||||||
this.directory = directory;
|
this.directory = directory;
|
||||||
context = saveActivity.getApplicationContext();
|
context = saveActivity.getApplicationContext();
|
||||||
contentProviderUtils = ContentProviderUtils.Factory.get(context);
|
contentProviderUtils = ContentProviderUtils.Factory.get(context);
|
||||||
@@ -180,10 +176,8 @@ public class SaveAsyncTask extends AsyncTask<Void, Integer, Boolean> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Track track = tracks[0];
|
Track track = tracks[0];
|
||||||
boolean useKmz = trackFileFormat == TrackFileFormat.KML && !playTrack;
|
|
||||||
String extension = useKmz ? KmzTrackExporter.KMZ_EXTENSION : trackFileFormat.getExtension();
|
|
||||||
FileTrackExporter fileTrackExporter = new FileTrackExporter(contentProviderUtils, tracks,
|
FileTrackExporter fileTrackExporter = new FileTrackExporter(contentProviderUtils, tracks,
|
||||||
trackFileFormat.newTrackWriter(context, tracks.length > 1, playTrack),
|
trackFileFormat.newTrackWriter(context, tracks.length > 1),
|
||||||
new TrackExporterListener() {
|
new TrackExporterListener() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -197,7 +191,8 @@ public class SaveAsyncTask extends AsyncTask<Void, Integer, Boolean> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
boolean useKmz = trackFileFormat == TrackFileFormat.KMZ;
|
||||||
|
String extension = useKmz ? KmzTrackExporter.KMZ_EXTENSION : trackFileFormat.getExtension();
|
||||||
TrackExporter trackExporter = useKmz ? new KmzTrackExporter(contentProviderUtils, fileTrackExporter, tracks) : fileTrackExporter;
|
TrackExporter trackExporter = useKmz ? new KmzTrackExporter(contentProviderUtils, fileTrackExporter, tracks) : fileTrackExporter;
|
||||||
|
|
||||||
String fileName = FileUtils.buildUniqueFileName(directory, track.getName(), extension);
|
String fileName = FileUtils.buildUniqueFileName(directory, track.getName(), extension);
|
||||||
|
|||||||
Reference in New Issue
Block a user