diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java b/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java index 637b21e06..f924f57d3 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java @@ -192,7 +192,7 @@ public class TrackListActivity extends AbstractSendToGoogleActivity @Override public void run() { ApiAdapterFactory.getApiAdapter().invalidMenu(TrackListActivity.this); - sectionResourceCursorAdapter.notifyDataSetChanged(); + getSupportLoaderManager().restartLoader(0, null, loaderCallbacks); boolean isRecording = recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT; trackController.update(isRecording, recordingTrackPaused); @@ -273,6 +273,25 @@ public class TrackListActivity extends AbstractSendToGoogleActivity } }; + private final LoaderCallbacks loaderCallbacks = new LoaderCallbacks() { + @Override + public Loader onCreateLoader(int arg0, Bundle arg1) { + return new CursorLoader(TrackListActivity.this, TracksColumns.CONTENT_URI, PROJECTION, null, + null, + "IFNULL(" + TracksColumns.SHAREDWITHME + ",0) ASC, " + TracksColumns.STARTTIME + " DESC"); + } + + @Override + public void onLoadFinished(Loader loader, Cursor cursor) { + sectionResourceCursorAdapter.swapCursor(cursor); + } + + @Override + public void onLoaderReset(Loader loader) { + sectionResourceCursorAdapter.swapCursor(null); + } + }; + // The following are set in onCreate private MyTracksProviderUtils myTracksProviderUtils; private SharedPreferences sharedPreferences; @@ -371,24 +390,7 @@ public class TrackListActivity extends AbstractSendToGoogleActivity ApiAdapterFactory.getApiAdapter() .configureListViewContextualMenu(this, listView, contextualActionModeCallback); - getSupportLoaderManager().initLoader(0, null, new LoaderCallbacks() { - @Override - public Loader onCreateLoader(int arg0, Bundle arg1) { - return new CursorLoader(TrackListActivity.this, TracksColumns.CONTENT_URI, PROJECTION, null, - null, "IFNULL(" + TracksColumns.SHAREDWITHME + ",0) ASC, " + TracksColumns.STARTTIME - + " DESC"); - } - - @Override - public void onLoadFinished(Loader loader, Cursor cursor) { - sectionResourceCursorAdapter.swapCursor(cursor); - } - - @Override - public void onLoaderReset(Loader loader) { - sectionResourceCursorAdapter.swapCursor(null); - } - }); + getSupportLoaderManager().initLoader(0, null, loaderCallbacks); showStartupDialogs(); } @@ -414,7 +416,7 @@ public class TrackListActivity extends AbstractSendToGoogleActivity // Update UI ApiAdapterFactory.getApiAdapter().invalidMenu(this); - sectionResourceCursorAdapter.notifyDataSetChanged(); + getSupportLoaderManager().restartLoader(0, null, loaderCallbacks); boolean isRecording = recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT; trackController.onResume(isRecording, recordingTrackPaused); } diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/file/AbstractImporter.java b/MyTracks/src/com/google/android/apps/mytracks/io/file/AbstractImporter.java index 2f6e832bd..86901a1d3 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/file/AbstractImporter.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/file/AbstractImporter.java @@ -96,8 +96,6 @@ abstract class AbstractImporter extends DefaultHandler { int numBufferedLocations = 0; } - protected static final String DEFAULT_ALTITUDE = "0"; - // The maximum number of buffered locations for bulk-insertion private static final int MAX_BUFFERED_LOCATIONS = 512; @@ -465,24 +463,29 @@ abstract class AbstractImporter extends DefaultHandler { * Creates a location. */ private Location createLocation() throws SAXException { - if (latitude == null || longitude == null || altitude == null) { + if (latitude == null || longitude == null) { return null; } - double longitudeValue; double latitudeValue; - double altitudeValue; - + double longitudeValue; try { - longitudeValue = Double.parseDouble(longitude); latitudeValue = Double.parseDouble(latitude); - altitudeValue = Double.parseDouble(altitude); + longitudeValue = Double.parseDouble(longitude); } catch (NumberFormatException e) { - throw new SAXException(createErrorMessage(String.format( - "Unable to parse longitude latitude altitude: %s %s %s", longitude, latitude, altitude)), - e); + throw new SAXException(createErrorMessage( + String.format("Unable to parse latitude longitude: %s %s", latitude, longitude)), e); } + Double altitudeValue = null; + if (altitude != null) { + try { + altitudeValue = Double.parseDouble(altitude); + } catch (NumberFormatException e) { + throw new SAXException( + createErrorMessage(String.format("Unable to parse altitude: %s", altitude)), e); + } + } + long timeValue; - if (time == null) { timeValue = trackData.importTime; } else { @@ -505,11 +508,15 @@ abstract class AbstractImporter extends DefaultHandler { * @param timeValue the time value */ private Location createLocation( - double latitudeValue, double longitudeValue, double altitudeValue, long timeValue) { + double latitudeValue, double longitudeValue, Double altitudeValue, long timeValue) { Location location = new Location(LocationManager.GPS_PROVIDER); location.setLatitude(latitudeValue); location.setLongitude(longitudeValue); - location.setAltitude(altitudeValue); + if (altitudeValue != null) { + location.setAltitude(altitudeValue); + } else { + location.removeAltitude(); + } location.setTime(timeValue); location.removeAccuracy(); location.removeBearing(); diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/file/CsvTrackWriter.java b/MyTracks/src/com/google/android/apps/mytracks/io/file/CsvTrackWriter.java index 5f44604ed..7a95a7aaa 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/file/CsvTrackWriter.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/file/CsvTrackWriter.java @@ -123,10 +123,10 @@ public class CsvTrackWriter implements TrackFormatWriter { waypoint.getDescription(), Double.toString(location.getLatitude()), Double.toString(location.getLongitude()), - Double.toString(location.getAltitude()), - Double.toString(location.getBearing()), - SHORT_FORMAT.format(location.getAccuracy()), - SHORT_FORMAT.format(location.getSpeed()), + getAltitude(location), + getBearing(location), + getAccuracy(location), + getSpeed(location), StringUtils.formatDateTimeIso8601(location.getTime())); } @@ -196,16 +196,32 @@ public class CsvTrackWriter implements TrackFormatWriter { Integer.toString(pointIndex), Double.toString(location.getLatitude()), Double.toString(location.getLongitude()), - Double.toString(location.getAltitude()), - Double.toString(location.getBearing()), - SHORT_FORMAT.format(location.getAccuracy()), - SHORT_FORMAT.format(location.getSpeed()), + getAltitude(location), + getBearing(location), + getAccuracy(location), + getSpeed(location), StringUtils.formatDateTimeIso8601(location.getTime()), power, cadence, heartRate); } - + + private String getAltitude(Location location) { + return location.hasAltitude() ? Double.toString(location.getAltitude()) : null; + } + + private String getBearing(Location location) { + return location.hasBearing() ? Double.toString(location.getBearing()) : null; + } + + private String getAccuracy(Location location) { + return location.hasAccuracy() ? SHORT_FORMAT.format(location.getAccuracy()) : null; + } + + private String getSpeed(Location location) { + return location.hasSpeed() ? SHORT_FORMAT.format(location.getSpeed()) : null; + } + /** * Writes a single line of a CSV file. * diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/file/GpxImporter.java b/MyTracks/src/com/google/android/apps/mytracks/io/file/GpxImporter.java index 3f6acc670..d4b97697b 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/file/GpxImporter.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/file/GpxImporter.java @@ -47,7 +47,7 @@ public class GpxImporter extends AbstractImporter { private static final String ATTRIBUTE_LAT = "lat"; private static final String ATTRIBUTE_LON = "lon"; - + /** * Constructor. * @@ -133,7 +133,7 @@ public class GpxImporter extends AbstractImporter { private void onTrackPointStart(Attributes attributes) { latitude = attributes.getValue(ATTRIBUTE_LAT); longitude = attributes.getValue(ATTRIBUTE_LON); - altitude = DEFAULT_ALTITUDE; + altitude = null; time = null; } @@ -159,7 +159,7 @@ public class GpxImporter extends AbstractImporter { category = null; latitude = attributes.getValue(ATTRIBUTE_LAT); longitude = attributes.getValue(ATTRIBUTE_LON); - altitude = DEFAULT_ALTITUDE; + altitude = null; time = null; waypointType = null; } diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/file/GpxTrackWriter.java b/MyTracks/src/com/google/android/apps/mytracks/io/file/GpxTrackWriter.java index 7161f77e2..75d45dad5 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/file/GpxTrackWriter.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/file/GpxTrackWriter.java @@ -138,7 +138,9 @@ public class GpxTrackWriter implements TrackFormatWriter { public void writeLocation(Location location) { if (printWriter != null) { printWriter.println(""); - printWriter.println("" + ELEVATION_FORMAT.format(location.getAltitude()) + ""); + if (location.hasAltitude()) { + printWriter.println("" + ELEVATION_FORMAT.format(location.getAltitude()) + ""); + } printWriter.println( ""); printWriter.println(""); @@ -161,7 +163,9 @@ public class GpxTrackWriter implements TrackFormatWriter { Location location = waypoint.getLocation(); if (location != null) { printWriter.println(""); - printWriter.println("" + ELEVATION_FORMAT.format(location.getAltitude()) + ""); + if (location.hasAltitude()) { + printWriter.println("" + ELEVATION_FORMAT.format(location.getAltitude()) + ""); + } printWriter.println( ""); printWriter.println("" + StringUtils.formatCData(waypoint.getName()) + ""); diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/file/KmlImporter.java b/MyTracks/src/com/google/android/apps/mytracks/io/file/KmlImporter.java index 59dd5b2e4..a15c8800e 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/file/KmlImporter.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/file/KmlImporter.java @@ -148,7 +148,7 @@ public class KmlImporter extends AbstractImporter { category = null; latitude = null; longitude = null; - altitude = DEFAULT_ALTITUDE; + altitude = null; time = null; waypointType = null; } @@ -181,9 +181,7 @@ public class KmlImporter extends AbstractImporter { } longitude = parts[0]; latitude = parts[1]; - if (parts.length == 3) { - altitude = parts[2]; - } + altitude = parts.length == 3 ? parts[2] : null; } } @@ -240,12 +238,13 @@ public class KmlImporter extends AbstractImporter { return; } String parts[] = content.trim().split(" "); - if (parts.length != 3) { + if (parts.length != 2 && parts.length != 3) { return; } longitude = parts[0]; latitude = parts[1]; - altitude = parts[2]; + altitude = parts.length == 3 ? parts[2] : null; + Location location = getTrackPoint(); if (location == null) { return; diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/file/KmlTrackWriter.java b/MyTracks/src/com/google/android/apps/mytracks/io/file/KmlTrackWriter.java index 7c7f275e1..a7640edbe 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/file/KmlTrackWriter.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/file/KmlTrackWriter.java @@ -229,8 +229,7 @@ public class KmlTrackWriter implements TrackFormatWriter { if (printWriter != null) { printWriter.println( "" + StringUtils.formatDateTimeIso8601(location.getTime()) + ""); - printWriter.println("" + location.getLongitude() + " " + location.getLatitude() - + " " + location.getAltitude() + ""); + printWriter.println("" + getCoordinates(location, " ") + ""); if (location instanceof MyTracksLocation) { SensorDataSet sensorDataSet = ((MyTracksLocation) location).getSensorDataSet(); int power = -1; @@ -302,12 +301,20 @@ public class KmlTrackWriter implements TrackFormatWriter { printWriter.println("#" + styleName + ""); writeCategory(category); printWriter.println(""); - printWriter.println("" + location.getLongitude() + "," + location.getLatitude() - + "," + location.getAltitude() + ""); + printWriter.println("" + getCoordinates(location, ",") + ""); printWriter.println(""); printWriter.println(""); } } + + private String getCoordinates(Location location, String separator) { + StringBuffer buffer = new StringBuffer(); + buffer.append(location.getLongitude() + separator + location.getLatitude()); + if (location.hasAltitude()) { + buffer.append(separator + location.getAltitude()); + } + return buffer.toString(); + } /** * Writes the category. diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/file/TcxTrackWriter.java b/MyTracks/src/com/google/android/apps/mytracks/io/file/TcxTrackWriter.java index 27dfa8b60..827b2a3b1 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/file/TcxTrackWriter.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/file/TcxTrackWriter.java @@ -204,7 +204,9 @@ public class TcxTrackWriter implements TrackFormatWriter { printWriter.println("" + location.getLatitude() + ""); printWriter.println("" + location.getLongitude() + ""); printWriter.println(""); - printWriter.println("" + location.getAltitude() + ""); + if (location.hasAltitude()) { + printWriter.println("" + location.getAltitude() + ""); + } if (location instanceof MyTracksLocation) { SensorDataSet sensorDataSet = ((MyTracksLocation) location).getSensorDataSet();