aboutsummaryrefslogtreecommitdiffstats
path: root/main/src
diff options
context:
space:
mode:
authorSamuel Tardieu <sam@rfc1149.net>2014-02-28 22:16:38 +0100
committerSamuel Tardieu <sam@rfc1149.net>2014-02-28 22:16:38 +0100
commit3b84568a8c300c6993928c5e8dfe5d038f94ce10 (patch)
treed87ac3442462a15321fc3f6a49c3ff913d2d1b4a /main/src
parent2f8702fb5f2529a05ab239b480fbfd9afc0bed27 (diff)
parent8df3d95d50180e8130342684afadb5d8d95616ac (diff)
downloadcgeo-3b84568a8c300c6993928c5e8dfe5d038f94ce10.zip
cgeo-3b84568a8c300c6993928c5e8dfe5d038f94ce10.tar.gz
cgeo-3b84568a8c300c6993928c5e8dfe5d038f94ce10.tar.bz2
Merge branch 'release' into upstream
Diffstat (limited to 'main/src')
-rw-r--r--main/src/cgeo/geocaching/Geocache.java54
-rw-r--r--main/src/cgeo/geocaching/Waypoint.java62
-rw-r--r--main/src/cgeo/geocaching/geopoint/Geopoint.java4
-rw-r--r--main/src/cgeo/geocaching/geopoint/GeopointParser.java8
4 files changed, 74 insertions, 54 deletions
diff --git a/main/src/cgeo/geocaching/Geocache.java b/main/src/cgeo/geocaching/Geocache.java
index bac4600..79b4425 100644
--- a/main/src/cgeo/geocaching/Geocache.java
+++ b/main/src/cgeo/geocaching/Geocache.java
@@ -57,7 +57,6 @@ import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
-import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
@@ -1371,58 +1370,11 @@ public class Geocache implements ICache, IWaypoint {
* Detect coordinates in the personal note and convert them to user defined waypoints. Works by rule of thumb.
*/
public void parseWaypointsFromNote() {
- try {
- if (StringUtils.isBlank(getPersonalNote())) {
- return;
- }
- final Pattern coordPattern = Pattern.compile("\\b[nNsS]{1}\\s*\\d"); // begin of coordinates
- int count = 1;
- String note = getPersonalNote();
- MatcherWrapper matcher = new MatcherWrapper(coordPattern, note);
- while (matcher.find()) {
- try {
- final Geopoint point = new Geopoint(note.substring(matcher.start()));
- // Coords must have non zero latitude and longitude, at least one part shall have fractional degrees,
- // and there must exist no waypoint with the same coordinates already.
- if (point.getLatitudeE6() != 0 && point.getLongitudeE6() != 0 &&
- ((point.getLatitudeE6() % 1000) != 0 || (point.getLongitudeE6() % 1000) != 0) &&
- !hasIdenticalWaypoint(point)) {
- final String name = CgeoApplication.getInstance().getString(R.string.cache_personal_note) + " " + count;
- final String potentialWaypointType = note.substring(Math.max(0, matcher.start() - 15));
- final Waypoint waypoint = new Waypoint(name, parseWaypointType(potentialWaypointType), false);
- waypoint.setCoords(point);
- addOrChangeWaypoint(waypoint, false);
- count++;
- }
- } catch (final Geopoint.ParseException e) {
- // ignore
- }
-
- note = note.substring(matcher.start() + 1);
- matcher = new MatcherWrapper(coordPattern, note);
- }
- } catch (final Exception e) {
- Log.e("Geocache.parseWaypointsFromNote", e);
- }
- }
-
- /**
- * Detect waypoint types in the personal note text. It works by rule of thumb only.
- */
- private static WaypointType parseWaypointType(final String input) {
- final String lowerInput = StringUtils.substring(input, 0, 20).toLowerCase(Locale.getDefault());
- for (final WaypointType wpType : WaypointType.values()) {
- if (lowerInput.contains(wpType.getL10n().toLowerCase(Locale.getDefault()))) {
- return wpType;
- }
- if (lowerInput.contains(wpType.id)) {
- return wpType;
- }
- if (lowerInput.contains(wpType.name().toLowerCase(Locale.US))) {
- return wpType;
+ for (final Waypoint waypoint : Waypoint.parseWaypointsFromNote(StringUtils.defaultString(getPersonalNote()))) {
+ if (!hasIdenticalWaypoint(waypoint.getCoords())) {
+ addOrChangeWaypoint(waypoint, false);
}
}
- return WaypointType.WAYPOINT;
}
private boolean hasIdenticalWaypoint(final Geopoint point) {
diff --git a/main/src/cgeo/geocaching/Waypoint.java b/main/src/cgeo/geocaching/Waypoint.java
index 47977bc..efedff5 100644
--- a/main/src/cgeo/geocaching/Waypoint.java
+++ b/main/src/cgeo/geocaching/Waypoint.java
@@ -3,14 +3,19 @@ package cgeo.geocaching;
import cgeo.geocaching.enumerations.LoadFlags;
import cgeo.geocaching.enumerations.WaypointType;
import cgeo.geocaching.geopoint.Geopoint;
+import cgeo.geocaching.utils.MatcherWrapper;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.jdt.annotation.NonNull;
+import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
+import java.util.LinkedList;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
+import java.util.regex.Pattern;
public class Waypoint implements IWaypoint {
@@ -285,4 +290,61 @@ public class Waypoint implements IWaypoint {
return gpxId;
}
+
+ /**
+ * Detect coordinates in the personal note and convert them to user defined waypoints. Works by rule of thumb.
+ *
+ * @param initialNote Note content
+ * @return a collection of found waypoints
+ */
+ public static Collection<Waypoint> parseWaypointsFromNote(@NonNull final String initialNote) {
+ final List<Waypoint> waypoints = new LinkedList<Waypoint>();
+ final Pattern COORDPATTERN = Pattern.compile("\\b[nNsS]{1}\\s*\\d"); // begin of coordinates
+
+ String note = initialNote;
+ MatcherWrapper matcher = new MatcherWrapper(COORDPATTERN, note);
+ int count = 1;
+ while (matcher.find()) {
+ try {
+ final Geopoint point = new Geopoint(note.substring(matcher.start()));
+ // Coords must have non zero latitude and longitude and at least one part shall have fractional degrees.
+ if (point.getLatitudeE6() != 0 && point.getLongitudeE6() != 0 &&
+ ((point.getLatitudeE6() % 1000) != 0 || (point.getLongitudeE6() % 1000) != 0)) {
+ final String name = CgeoApplication.getInstance().getString(R.string.cache_personal_note) + " " + count;
+ final String potentialWaypointType = note.substring(Math.max(0, matcher.start() - 15));
+ final Waypoint waypoint = new Waypoint(name, parseWaypointType(potentialWaypointType), false);
+ waypoint.setCoords(point);
+ waypoints.add(waypoint);
+ count++;
+ }
+ } catch (final Geopoint.ParseException e) {
+ // ignore
+ }
+
+ note = note.substring(matcher.start() + 1);
+ matcher = new MatcherWrapper(COORDPATTERN, note);
+ }
+ return waypoints;
+ }
+
+ /**
+ * Detect waypoint types in the personal note text. It works by rule of thumb only.
+ */
+ private static WaypointType parseWaypointType(final String input) {
+ final String lowerInput = StringUtils.substring(input, 0, 20).toLowerCase(Locale.getDefault());
+ for (final WaypointType wpType : WaypointType.values()) {
+ if (lowerInput.contains(wpType.getL10n().toLowerCase(Locale.getDefault()))) {
+ return wpType;
+ }
+ if (lowerInput.contains(wpType.id)) {
+ return wpType;
+ }
+ if (lowerInput.contains(wpType.name().toLowerCase(Locale.US))) {
+ return wpType;
+ }
+ }
+ return WaypointType.WAYPOINT;
+ }
+
+
}
diff --git a/main/src/cgeo/geocaching/geopoint/Geopoint.java b/main/src/cgeo/geocaching/geopoint/Geopoint.java
index e91a93d..8fe75ef 100644
--- a/main/src/cgeo/geocaching/geopoint/Geopoint.java
+++ b/main/src/cgeo/geocaching/geopoint/Geopoint.java
@@ -55,8 +55,8 @@ public final class Geopoint implements ICoordinates, Parcelable {
*/
public Geopoint(final String text) {
final Geopoint parsed = GeopointParser.parse(text);
- this.latitude = parsed.latitude;
- this.longitude = parsed.longitude;
+ latitude = parsed.latitude;
+ longitude = parsed.longitude;
}
/**
diff --git a/main/src/cgeo/geocaching/geopoint/GeopointParser.java b/main/src/cgeo/geocaching/geopoint/GeopointParser.java
index 120e02e..2809598 100644
--- a/main/src/cgeo/geocaching/geopoint/GeopointParser.java
+++ b/main/src/cgeo/geocaching/geopoint/GeopointParser.java
@@ -57,7 +57,6 @@ class GeopointParser {
*/
public static Geopoint parse(final String text) {
final ResultWrapper latitudeWrapper = parseHelper(text, LatLon.LAT);
- final double lat = latitudeWrapper.result;
// cut away the latitude part when parsing the longitude
final ResultWrapper longitudeWrapper = parseHelper(text.substring(latitudeWrapper.matcherPos + latitudeWrapper.matcherLength), LatLon.LON);
@@ -65,7 +64,14 @@ class GeopointParser {
throw new Geopoint.ParseException("Distance between latitude and longitude text is to large.", LatLon.LON);
}
+ final double lat = latitudeWrapper.result;
final double lon = longitudeWrapper.result;
+ if (lat > 90 || lat < -90) {
+ throw new Geopoint.ParseException(text, LatLon.LAT);
+ }
+ if (lon > 180 || lon < -180) {
+ throw new Geopoint.ParseException(text, LatLon.LON);
+ }
return new Geopoint(lat, lon);
}