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 66278aa23..0888e9041 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 @@ -17,14 +17,17 @@ package com.google.android.apps.mytracks.io.file; import com.google.android.apps.mytracks.Constants; +import com.google.android.apps.mytracks.content.DescriptionGeneratorImpl; import com.google.android.apps.mytracks.content.MyTracksProviderUtils; import com.google.android.apps.mytracks.content.Track; import com.google.android.apps.mytracks.content.Waypoint; import com.google.android.apps.mytracks.content.Waypoint.WaypointType; import com.google.android.apps.mytracks.services.TrackRecordingService; +import com.google.android.apps.mytracks.stats.TripStatistics; import com.google.android.apps.mytracks.stats.TripStatisticsUpdater; import com.google.android.apps.mytracks.util.LocationUtils; import com.google.android.apps.mytracks.util.StringUtils; +import com.google.android.apps.mytracks.util.TrackIconUtils; import com.google.android.maps.mytracks.R; import android.content.Context; @@ -99,12 +102,14 @@ public class GpxImporter extends DefaultHandler { // GPX tags private static final String TAG_ALTITUDE = "ele"; private static final String TAG_DESCRIPTION = "desc"; + private static final String TAG_COMMENT = "cmt"; private static final String TAG_GPX = "gpx"; private static final String TAG_NAME = "name"; private static final String TAG_TIME = "time"; private static final String TAG_TRACK = "trk"; private static final String TAG_TRACK_POINT = "trkpt"; private static final String TAG_TRACK_SEGMENT = "trkseg"; + private static final String TAG_TYPE = "type"; private static final String TAG_WAYPOINT = "wpt"; // GPX attributes @@ -227,6 +232,8 @@ public class GpxImporter extends DefaultHandler { onNameElementEnd(); } else if (localName.equals(TAG_DESCRIPTION)) { onDescriptionElementEnd(); + } else if (localName.equals(TAG_TYPE)) { + onTypeElementEnd(); } else if (localName.equals(TAG_ALTITUDE)) { onAltitudeElementEnd(); } else if (localName.equals(TAG_TIME)) { @@ -247,6 +254,8 @@ public class GpxImporter extends DefaultHandler { } else { if (localName.equals(TAG_WAYPOINT)) { onWaypointElementEnd(); + } else if (localName.equals(TAG_COMMENT)) { + onCommentElementEnd(); } } @@ -425,6 +434,21 @@ public class GpxImporter extends DefaultHandler { } } + /** + * On type element end. + */ + private void onTypeElementEnd() { + if (content != null) { + String type = content.toString().trim(); + if (trackData != null && trackData.parsedDepth == 1) { + trackData.track.setCategory(type); + trackData.track.setIcon(TrackIconUtils.getIconValue(context, type)); + } else if (currentWaypoint != null) { + currentWaypoint.setCategory(type); + } + } + } + /** * On altitude element end. */ @@ -484,6 +508,21 @@ public class GpxImporter extends DefaultHandler { } } + /** + * On comment element end. + */ + private void onCommentElementEnd() { + if (content != null) { + String comment = content.toString().trim(); + if (currentWaypoint != null) { + WaypointType waypointType = WaypointType.STATISTICS.name().equals(comment) ? WaypointType.STATISTICS + : WaypointType.WAYPOINT; + currentWaypoint.setType(waypointType); + + } + } + } + /** * Parses a location. * @@ -603,14 +642,21 @@ public class GpxImporter extends DefaultHandler { * @param track the track */ private void insertFirstWaypoint(Track track) { + String name = context.getString(R.string.marker_split_name_format, 0); + String category = ""; + TripStatisticsUpdater updater = new TripStatisticsUpdater( + track.getTripStatistics().getStartTime()); + TripStatistics tripStatistics = updater.getTripStatistics(); + String description = new DescriptionGeneratorImpl(context).generateWaypointDescription( + tripStatistics); String icon = context.getString(R.string.marker_statistics_icon_url); - - // For track statistics, make it an impossible location + double length = 0.0; + long duration = 0L; Location waypointLocation = new Location(""); waypointLocation.setLatitude(100); waypointLocation.setLongitude(180); - Waypoint waypoint = new Waypoint("", "", "", icon, track.getId(), WaypointType.STATISTICS, 0, - 0, -1L, -1L, waypointLocation, null); + Waypoint waypoint = new Waypoint(name, description, category, icon, track.getId(), + WaypointType.STATISTICS, length, duration, -1L, -1L, waypointLocation, tripStatistics); myTracksProviderUtils.insertWaypoint(waypoint); } @@ -630,7 +676,9 @@ public class GpxImporter extends DefaultHandler { Waypoint waypoint = null; int trackPointPosition = -1; Location trackPoint = null; - TripStatisticsUpdater updater = new TripStatisticsUpdater( + TripStatisticsUpdater trackTripStatisticstrackUpdater = new TripStatisticsUpdater( + track.getTripStatistics().getStartTime()); + TripStatisticsUpdater markerTripStatisticsUpdater = new TripStatisticsUpdater( track.getTripStatistics().getStartTime()); while (true) { @@ -651,7 +699,8 @@ public class GpxImporter extends DefaultHandler { // No more track points. Ignore the rest of the waypoints. return; } - updater.addLocation(trackPoint, minRecordingDistance); + trackTripStatisticstrackUpdater.addLocation(trackPoint, minRecordingDistance); + markerTripStatisticsUpdater.addLocation(trackPoint, minRecordingDistance); } if (waypoint.getLocation().getTime() > trackPoint.getTime()) { trackPoint = null; @@ -661,13 +710,32 @@ public class GpxImporter extends DefaultHandler { // The waypoint location time matches the track point time if (trackPoint.getLatitude() == waypoint.getLocation().getLatitude() && trackPoint.getLongitude() == waypoint.getLocation().getLongitude()) { - waypoint.setDuration(updater.getTripStatistics().getTotalTime()); - waypoint.setIcon(context.getString(R.string.marker_waypoint_icon_url)); - waypoint.setLength(updater.getTripStatistics().getTotalDistance()); - waypoint.setLocation(trackPoint); - waypoint.setTrackId(track.getId()); - waypoint.setType(WaypointType.WAYPOINT); - myTracksProviderUtils.insertWaypoint(waypoint); + + // Get tripStatistics, description, and icon + TripStatistics tripStatistics; + String description; + String icon; + if (waypoint.getType() == WaypointType.STATISTICS) { + tripStatistics = markerTripStatisticsUpdater.getTripStatistics(); + markerTripStatisticsUpdater = new TripStatisticsUpdater(trackPoint.getTime()); + description = new DescriptionGeneratorImpl(context).generateWaypointDescription( + tripStatistics); + icon = context.getString(R.string.marker_statistics_icon_url); + } else { + tripStatistics = null; + description = waypoint.getDescription(); + icon = context.getString(R.string.marker_waypoint_icon_url); + } + + // Get length and duration + double length = trackTripStatisticstrackUpdater.getTripStatistics().getTotalDistance(); + long duration = trackTripStatisticstrackUpdater.getTripStatistics().getTotalTime(); + + // Insert waypoint + Waypoint newWaypoint = new Waypoint(waypoint.getName(), description, + waypoint.getCategory(), icon, track.getId(), waypoint.getType(), length, duration, + -1L, -1L, trackPoint, tripStatistics); + myTracksProviderUtils.insertWaypoint(newWaypoint); } waypoint = 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 99c43c412..673593786 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 @@ -115,6 +115,7 @@ public class GpxTrackWriter implements TrackFormatWriter { printWriter.println(""); printWriter.println("" + StringUtils.formatCData(track.getName()) + ""); printWriter.println("" + StringUtils.formatCData(track.getDescription()) + ""); + printWriter.println("" + StringUtils.formatCData(track.getCategory()) + ""); printWriter.println("c0c0c0"); } } @@ -167,8 +168,10 @@ public class GpxTrackWriter implements TrackFormatWriter { printWriter.println( ""); printWriter.println("" + StringUtils.formatCData(waypoint.getName()) + ""); + printWriter.println("" + StringUtils.formatCData(waypoint.getType().name()) + ""); printWriter.println( "" + StringUtils.formatCData(waypoint.getDescription()) + ""); + printWriter.println("" + StringUtils.formatCData(waypoint.getCategory()) + ""); printWriter.println(""); } } diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java b/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java index 1e79d0056..5b128ebed 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java +++ b/MyTracks/src/com/google/android/apps/mytracks/services/TrackRecordingService.java @@ -415,6 +415,8 @@ public class TrackRecordingService extends Service { WaypointType waypointType = waypointCreationRequest.getType(); boolean isStatistics = waypointType == WaypointType.STATISTICS; + + // Get name String name; if (waypointCreationRequest.getName() != null) { name = waypointCreationRequest.getName(); @@ -429,28 +431,33 @@ public class TrackRecordingService extends Service { nextWaypointNumber); } + // Get category + String category = waypointCreationRequest.getCategory() != null ? waypointCreationRequest + .getCategory() + : ""; + + // Get tripStatistics, description, and icon TripStatistics tripStatistics; String description; + String icon; if (isStatistics) { long now = System.currentTimeMillis(); markerTripStatisticsUpdater.updateTime(now); tripStatistics = markerTripStatisticsUpdater.getTripStatistics(); markerTripStatisticsUpdater = new TripStatisticsUpdater(now); description = new DescriptionGeneratorImpl(this).generateWaypointDescription(tripStatistics); + icon = getString(R.string.marker_statistics_icon_url); } else { tripStatistics = null; description = waypointCreationRequest.getDescription() != null ? waypointCreationRequest .getDescription() : ""; + icon = getString(R.string.marker_waypoint_icon_url); } - String category = waypointCreationRequest.getCategory() != null ? waypointCreationRequest - .getCategory() - : ""; - String icon = getString( - isStatistics ? R.string.marker_statistics_icon_url : R.string.marker_waypoint_icon_url); - long duration; + // Get length and duration double length; + long duration; Location location = getLastValidTrackPointInCurrentSegment(recordingTrackId); if (location != null && trackTripStatisticsUpdater != null) { TripStatistics stats = trackTripStatisticsUpdater.getTripStatistics(); @@ -464,9 +471,11 @@ public class TrackRecordingService extends Service { location = new Location(""); location.setLatitude(100); location.setLongitude(180); - length = 0; - duration = 0; + length = 0.0; + duration = 0L; } + + // Insert waypoint Waypoint waypoint = new Waypoint(name, description, category, icon, recordingTrackId, waypointType, length, duration, -1L, -1L, location, tripStatistics); Uri uri = myTracksProviderUtils.insertWaypoint(waypoint); diff --git a/MyTracksTest/.settings/org.eclipse.jdt.core.prefs b/MyTracksTest/.settings/org.eclipse.jdt.core.prefs index 85ecb6db7..4d786e9a3 100644 --- a/MyTracksTest/.settings/org.eclipse.jdt.core.prefs +++ b/MyTracksTest/.settings/org.eclipse.jdt.core.prefs @@ -1,4 +1,9 @@ eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.autoboxing=ignore org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning @@ -8,6 +13,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled org.eclipse.jdt.core.compiler.problem.discouragedReference=warning org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled org.eclipse.jdt.core.compiler.problem.fieldHiding=warning @@ -15,12 +21,15 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning org.eclipse.jdt.core.compiler.problem.forbiddenReference=error org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled @@ -29,21 +38,31 @@ org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warni org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore