aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main/src/cgeo/geocaching/SearchActivity.java9
-rw-r--r--main/src/cgeo/geocaching/connector/AbstractConnector.java16
-rw-r--r--main/src/cgeo/geocaching/connector/ConnectorFactory.java10
-rw-r--r--main/src/cgeo/geocaching/connector/GeocachingAustraliaConnector.java7
-rw-r--r--main/src/cgeo/geocaching/connector/GeopeitusConnector.java7
-rw-r--r--main/src/cgeo/geocaching/connector/IConnector.java10
-rw-r--r--main/src/cgeo/geocaching/connector/UnknownConnector.java5
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCConnector.java5
-rw-r--r--main/src/cgeo/geocaching/connector/oc/OCConnector.java8
-rw-r--r--main/src/cgeo/geocaching/connector/ox/OXConnector.java7
-rw-r--r--tests/src/cgeo/geocaching/connector/ConnectorFactoryTest.java6
-rw-r--r--tests/src/cgeo/geocaching/connector/gc/GCConnectorTest.java5
12 files changed, 88 insertions, 7 deletions
diff --git a/main/src/cgeo/geocaching/SearchActivity.java b/main/src/cgeo/geocaching/SearchActivity.java
index 5f2bddc..6194013 100644
--- a/main/src/cgeo/geocaching/SearchActivity.java
+++ b/main/src/cgeo/geocaching/SearchActivity.java
@@ -98,9 +98,14 @@ public class SearchActivity extends AbstractActivity {
* @return true if a search was performed, else false
*/
private boolean instantSearch(final String query, final boolean keywordSearch) {
+ // first check if this was a scanned URL
+ String geocode = ConnectorFactory.getGeocodeFromURL(query);
+
+ // otherwise see if this is a pure geocode
+ if (StringUtils.isEmpty(geocode)) {
+ geocode = StringUtils.trim(query);
+ }
- // Check if any connector can handle the query as a geocode
- final String geocode = StringUtils.trim(query);
final IConnector connector = ConnectorFactory.getConnector(geocode);
if (connector instanceof ISearchByGeocode) {
final Intent cachesIntent = new Intent(this, CacheDetailActivity.class);
diff --git a/main/src/cgeo/geocaching/connector/AbstractConnector.java b/main/src/cgeo/geocaching/connector/AbstractConnector.java
index aa75f3b..112d6cf 100644
--- a/main/src/cgeo/geocaching/connector/AbstractConnector.java
+++ b/main/src/cgeo/geocaching/connector/AbstractConnector.java
@@ -4,6 +4,8 @@ import cgeo.geocaching.SearchResult;
import cgeo.geocaching.cgCache;
import cgeo.geocaching.geopoint.Viewport;
+import org.apache.commons.lang3.StringUtils;
+
public abstract class AbstractConnector implements IConnector {
@Override
@@ -65,4 +67,18 @@ public abstract class AbstractConnector implements IConnector {
public String[] getTokens() {
return null;
}
+
+ @Override
+ public String getGeocodeFromUrl(final String url) {
+ final String urlPrefix = getCacheUrlPrefix();
+ if (StringUtils.startsWith(url, urlPrefix)) {
+ String geocode = url.substring(urlPrefix.length());
+ if (canHandle(geocode)) {
+ return geocode;
+ }
+ }
+ return null;
+ }
+
+ abstract protected String getCacheUrlPrefix();
}
diff --git a/main/src/cgeo/geocaching/connector/ConnectorFactory.java b/main/src/cgeo/geocaching/connector/ConnectorFactory.java
index b9b8263..bc4dcc0 100644
--- a/main/src/cgeo/geocaching/connector/ConnectorFactory.java
+++ b/main/src/cgeo/geocaching/connector/ConnectorFactory.java
@@ -81,4 +81,14 @@ public final class ConnectorFactory {
return GCConnector.getInstance().searchByViewport(viewport, tokens);
}
+ public static String getGeocodeFromURL(final String url) {
+ for (IConnector connector : connectors) {
+ String geocode = connector.getGeocodeFromUrl(url);
+ if (StringUtils.isNotBlank(geocode)) {
+ return geocode;
+ }
+ }
+ return null;
+ }
+
}
diff --git a/main/src/cgeo/geocaching/connector/GeocachingAustraliaConnector.java b/main/src/cgeo/geocaching/connector/GeocachingAustraliaConnector.java
index 771f5d2..30d1a4b 100644
--- a/main/src/cgeo/geocaching/connector/GeocachingAustraliaConnector.java
+++ b/main/src/cgeo/geocaching/connector/GeocachingAustraliaConnector.java
@@ -13,7 +13,7 @@ public class GeocachingAustraliaConnector extends AbstractConnector {
@Override
public String getCacheUrl(final cgCache cache) {
- return "http://" + getHost() + "/cache/" + cache.getGeocode();
+ return getCacheUrlPrefix() + cache.getGeocode();
}
@Override
@@ -25,4 +25,9 @@ public class GeocachingAustraliaConnector extends AbstractConnector {
public boolean canHandle(final String geocode) {
return (StringUtils.startsWithIgnoreCase(geocode, "GA") || StringUtils.startsWithIgnoreCase(geocode, "TP")) && isNumericId(geocode.substring(2));
}
+
+ @Override
+ protected String getCacheUrlPrefix() {
+ return "http://" + getHost() + "/cache/";
+ }
}
diff --git a/main/src/cgeo/geocaching/connector/GeopeitusConnector.java b/main/src/cgeo/geocaching/connector/GeopeitusConnector.java
index fa19d80..6ef91db 100644
--- a/main/src/cgeo/geocaching/connector/GeopeitusConnector.java
+++ b/main/src/cgeo/geocaching/connector/GeopeitusConnector.java
@@ -13,7 +13,7 @@ public class GeopeitusConnector extends AbstractConnector {
@Override
public String getCacheUrl(final cgCache cache) {
- return "http://" + getHost() + "/aare/" + StringUtils.stripStart(cache.getGeocode().substring(2), "0");
+ return getCacheUrlPrefix() + StringUtils.stripStart(cache.getGeocode().substring(2), "0");
}
@Override
@@ -25,4 +25,9 @@ public class GeopeitusConnector extends AbstractConnector {
public boolean canHandle(String geocode) {
return StringUtils.startsWith(geocode, "GE") && isNumericId(geocode.substring(2));
}
+
+ @Override
+ protected String getCacheUrlPrefix() {
+ return "http://" + getHost() + "/aare/";
+ }
}
diff --git a/main/src/cgeo/geocaching/connector/IConnector.java b/main/src/cgeo/geocaching/connector/IConnector.java
index 9111955..d6ac2ff 100644
--- a/main/src/cgeo/geocaching/connector/IConnector.java
+++ b/main/src/cgeo/geocaching/connector/IConnector.java
@@ -37,7 +37,7 @@ public interface IConnector {
/**
* enable/disable favorite points controls in cache details
- *
+ *
* @return
*/
public boolean supportsFavoritePoints();
@@ -104,4 +104,12 @@ public interface IConnector {
*/
public String[] getTokens();
+ /**
+ * extract a geocode from the given URL, if this connector can handle that URL somehow
+ *
+ * @param url
+ * @return
+ */
+ public String getGeocodeFromUrl(final String url);
+
}
diff --git a/main/src/cgeo/geocaching/connector/UnknownConnector.java b/main/src/cgeo/geocaching/connector/UnknownConnector.java
index 5e8d3f3..991d31c 100644
--- a/main/src/cgeo/geocaching/connector/UnknownConnector.java
+++ b/main/src/cgeo/geocaching/connector/UnknownConnector.java
@@ -25,4 +25,9 @@ public class UnknownConnector extends AbstractConnector {
public boolean canHandle(final String geocode) {
return StringUtils.isNotBlank(geocode);
}
+
+ @Override
+ protected String getCacheUrlPrefix() {
+ return null;
+ }
}
diff --git a/main/src/cgeo/geocaching/connector/gc/GCConnector.java b/main/src/cgeo/geocaching/connector/gc/GCConnector.java
index 5607d97..197d4e6 100644
--- a/main/src/cgeo/geocaching/connector/gc/GCConnector.java
+++ b/main/src/cgeo/geocaching/connector/gc/GCConnector.java
@@ -20,6 +20,7 @@ import java.util.regex.Pattern;
public class GCConnector extends AbstractConnector implements ISearchByGeocode, ISearchByCenter {
+ private static final String HTTP_COORD_INFO = "http://coord.info/";
private static GCConnector instance;
private static final Pattern gpxZipFilePattern = Pattern.compile("\\d{7,}(_.+)?\\.zip", Pattern.CASE_INSENSITIVE);
@@ -168,4 +169,8 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode,
return true;
}
+ @Override
+ protected String getCacheUrlPrefix() {
+ return HTTP_COORD_INFO;
+ }
}
diff --git a/main/src/cgeo/geocaching/connector/oc/OCConnector.java b/main/src/cgeo/geocaching/connector/oc/OCConnector.java
index 34bf019..c098d12 100644
--- a/main/src/cgeo/geocaching/connector/oc/OCConnector.java
+++ b/main/src/cgeo/geocaching/connector/oc/OCConnector.java
@@ -33,7 +33,7 @@ public class OCConnector extends AbstractConnector {
@Override
public String getCacheUrl(cgCache cache) {
- return "http://" + host + "/viewcache.php?wp=" + cache.getGeocode();
+ return getCacheUrlPrefix() + cache.getGeocode();
}
@Override
@@ -45,4 +45,10 @@ public class OCConnector extends AbstractConnector {
public boolean isZippedGPXFile(String fileName) {
return gpxZipFilePattern.matcher(fileName).matches();
}
+
+ @Override
+ protected String getCacheUrlPrefix() {
+ return "http://" + host + "/viewcache.php?wp=";
+ }
+
}
diff --git a/main/src/cgeo/geocaching/connector/ox/OXConnector.java b/main/src/cgeo/geocaching/connector/ox/OXConnector.java
index 38bb496..98b1656 100644
--- a/main/src/cgeo/geocaching/connector/ox/OXConnector.java
+++ b/main/src/cgeo/geocaching/connector/ox/OXConnector.java
@@ -27,7 +27,7 @@ public class OXConnector extends AbstractConnector implements ISearchByCenter, I
@Override
public String getCacheUrl(cgCache cache) {
- return "http://www.opencaching.com/#!geocache/" + cache.getGeocode();
+ return getCacheUrlPrefix() + cache.getGeocode();
}
@Override
@@ -64,4 +64,9 @@ public class OXConnector extends AbstractConnector implements ISearchByCenter, I
}
return new SearchResult(caches);
}
+
+ @Override
+ protected String getCacheUrlPrefix() {
+ return "http://www.opencaching.com/#!geocache/";
+ }
}
diff --git a/tests/src/cgeo/geocaching/connector/ConnectorFactoryTest.java b/tests/src/cgeo/geocaching/connector/ConnectorFactoryTest.java
index 2bbe0d0..e8abb91 100644
--- a/tests/src/cgeo/geocaching/connector/ConnectorFactoryTest.java
+++ b/tests/src/cgeo/geocaching/connector/ConnectorFactoryTest.java
@@ -59,4 +59,10 @@ public class ConnectorFactoryTest extends AbstractResourceInstrumentationTestCas
assertTrue(ConnectorFactory.getConnector(" OZ 12345 ") instanceof UnknownConnector);
}
+ public static void testGetGeocodeFromUrl() {
+ assertEquals("GC34PLO", ConnectorFactory.getGeocodeFromURL("http://coord.info/GC34PLO"));
+ assertEquals("OX1234", ConnectorFactory.getGeocodeFromURL("http://www.opencaching.com/#!geocache/OX1234"));
+ // make sure that a mixture of different connector and geocode is recognized as invalid
+ assertNull(ConnectorFactory.getGeocodeFromURL("http://www.opencaching.com/#!geocache/" + "GC12345"));
+ }
}
diff --git a/tests/src/cgeo/geocaching/connector/gc/GCConnectorTest.java b/tests/src/cgeo/geocaching/connector/gc/GCConnectorTest.java
index ca1c058..ea46bbe 100644
--- a/tests/src/cgeo/geocaching/connector/gc/GCConnectorTest.java
+++ b/tests/src/cgeo/geocaching/connector/gc/GCConnectorTest.java
@@ -72,5 +72,10 @@ public class GCConnectorTest extends AbstractResourceInstrumentationTestCase {
assertEquals(x, tile.getX());
assertEquals(y, tile.getY());
}
+
+ public static void testGetGeocodeFromUrl() {
+ assertNull(GCConnector.getInstance().getGeocodeFromUrl("some string"));
+ assertEquals("GC12ABC", GCConnector.getInstance().getGeocodeFromUrl("http://coord.info/GC12ABC"));
+ }
}