/*
* Copyright 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.android.apps.mytracks.io;
import com.google.android.apps.mytracks.content.Track;
import com.google.android.apps.mytracks.content.Waypoint;
import com.google.android.apps.mytracks.io.TrackWriterFactory.TrackFileFormat;
import com.google.android.apps.mytracks.util.StringUtils;
import android.location.Location;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.text.DecimalFormat;
import java.util.Date;
import java.util.TimeZone;
/**
* Log of one track.
*
* @author Sandor Dornbush
*/
public class GpxTrackWriter implements TrackFormatWriter {
private static final int LATLONG_FORMAT = Location.FORMAT_DEGREES;
private static final DecimalFormat ELEVATION_FORMATTER =
new DecimalFormat("#.#");
private static final SimpleDateFormat TIMESTAMP_FORMATTER =
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
static {
TIMESTAMP_FORMATTER.setTimeZone(TimeZone.getTimeZone("UTC"));
}
private PrintWriter pw = null;
private Track track;
private String formatLocation(Location l) {
return "lat=\"" + Location.convert(l.getLatitude(), LATLONG_FORMAT)
+ "\" lon=\"" + Location.convert(l.getLongitude(), LATLONG_FORMAT) + "\"";
}
@Override
public void prepare(Track track, OutputStream out) {
this.track = track;
this.pw = new PrintWriter(out);
}
@Override
public String getExtension() {
return TrackFileFormat.GPX.getExtension();
}
@Override
public void writeHeader() {
if (pw != null) {
pw.format("\n",
Charset.defaultCharset().name());
pw.println("");
pw.println("");
// TODO: Author etc.
}
}
@Override
public void writeFooter() {
if (pw != null) {
pw.println("");
}
}
@Override
public void writeBeginTrack(Location firstPoint) {
if (pw != null) {
pw.println("");
pw.println("" + StringUtils.stringAsCData(track.getName())
+ "");
pw.println("" + StringUtils.stringAsCData(track.getDescription())
+ "");
pw.println("" + track.getId() + "");
pw.println("c0c0c0");
}
}
@Override
public void writeEndTrack(Location lastPoint) {
if (pw != null) {
pw.println("");
}
}
@Override
public void writeOpenSegment() {
pw.println("");
}
@Override
public void writeCloseSegment() {
pw.println("");
}
@Override
public void writeLocation(Location l) {
if (pw != null) {
pw.println("");
Date d = new Date(l.getTime());
pw.println("" + ELEVATION_FORMATTER.format(l.getAltitude()) + "");
pw.println("");
pw.println("");
}
}
@Override
public void close() {
if (pw != null) {
pw.close();
pw = null;
}
}
@Override
public void writeWaypoint(Waypoint waypoint) {
if (pw != null) {
Location l = waypoint.getLocation();
if (l != null) {
pw.println("");
pw.println("" + ELEVATION_FORMATTER.format(l.getAltitude()) + "");
pw.println("");
pw.println("" + StringUtils.stringAsCData(waypoint.getName())
+ "");
pw.println(""
+ StringUtils.stringAsCData(waypoint.getDescription()) + "");
pw.println("");
}
}
}
}