diff options
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")); + } } |
