diff options
author | Bananeweizen <bananeweizen@gmx.de> | 2013-06-23 10:42:15 +0200 |
---|---|---|
committer | Bananeweizen <bananeweizen@gmx.de> | 2013-06-23 10:42:15 +0200 |
commit | e733eb45200b16ed4b59b87c113a3044c52316ca (patch) | |
tree | 18a8eb060cb12b0b18eacf9cfd102ca63655f9d9 | |
parent | d2e4b2723f08afaff855d690be1fc79eb4630371 (diff) | |
download | cgeo-e733eb45200b16ed4b59b87c113a3044c52316ca.zip cgeo-e733eb45200b16ed4b59b87c113a3044c52316ca.tar.gz cgeo-e733eb45200b16ed4b59b87c113a3044c52316ca.tar.bz2 |
fix #2907: opening TB from cache inventory broken
4 files changed, 48 insertions, 21 deletions
diff --git a/main/src/cgeo/geocaching/TrackableActivity.java b/main/src/cgeo/geocaching/TrackableActivity.java index 9963d45..d1f323c 100644 --- a/main/src/cgeo/geocaching/TrackableActivity.java +++ b/main/src/cgeo/geocaching/TrackableActivity.java @@ -7,6 +7,7 @@ import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.activity.AbstractViewPagerActivity; import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.connector.trackable.TrackableConnector; +import cgeo.geocaching.connector.trackable.TravelBugConnector; import cgeo.geocaching.enumerations.LogType; import cgeo.geocaching.geopoint.Units; import cgeo.geocaching.network.HtmlImage; @@ -231,19 +232,25 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi @Override public void run() { - trackable = cgData.loadTrackable(geocode); - - if (trackable == null || trackable.isLoggable()) { - // iterate over the connectors as some codes may be handled by multiple connectors - for (final TrackableConnector trackableConnector : ConnectorFactory.getTrackableConnectors()) { - if (trackableConnector.canHandleTrackable(geocode)) { - trackable = trackableConnector.searchTrackable(geocode, guid, id); - if (trackable != null) { - break; + if (StringUtils.isNotEmpty(geocode)) { + trackable = cgData.loadTrackable(geocode); + + if (trackable == null || trackable.isLoggable()) { + // iterate over the connectors as some codes may be handled by multiple connectors + for (final TrackableConnector trackableConnector : ConnectorFactory.getTrackableConnectors()) { + if (trackableConnector.canHandleTrackable(geocode)) { + trackable = trackableConnector.searchTrackable(geocode, guid, id); + if (trackable != null) { + break; + } } } } } + // fall back to GC search by GUID + if (trackable == null) { + trackable = TravelBugConnector.getInstance().searchTrackable(geocode, guid, id); + } handler.sendMessage(Message.obtain()); } } diff --git a/main/src/cgeo/geocaching/connector/ConnectorFactory.java b/main/src/cgeo/geocaching/connector/ConnectorFactory.java index 2cf2588..a2b0192 100644 --- a/main/src/cgeo/geocaching/connector/ConnectorFactory.java +++ b/main/src/cgeo/geocaching/connector/ConnectorFactory.java @@ -47,7 +47,7 @@ public final class ConnectorFactory { public static final UnknownTrackableConnector UNKNOWN_TRACKABLE_CONNECTOR = new UnknownTrackableConnector(); private static final TrackableConnector[] TRACKABLE_CONNECTORS = new TrackableConnector[] { new GeokretyConnector(), // GK must be first, as it overlaps with the secret codes of travel bugs - new TravelBugConnector(), + TravelBugConnector.getInstance(), UNKNOWN_TRACKABLE_CONNECTOR // must be last }; diff --git a/main/src/cgeo/geocaching/connector/trackable/TravelBugConnector.java b/main/src/cgeo/geocaching/connector/trackable/TravelBugConnector.java index 9cae016..0dac6cc 100644 --- a/main/src/cgeo/geocaching/connector/trackable/TravelBugConnector.java +++ b/main/src/cgeo/geocaching/connector/trackable/TravelBugConnector.java @@ -31,4 +31,20 @@ public class TravelBugConnector extends AbstractTrackableConnector { public Trackable searchTrackable(String geocode, String guid, String id) { return GCParser.searchTrackable(geocode, guid, id); } + + /** + * initialization on demand holder pattern + */ + private static class Holder { + private static final TravelBugConnector INSTANCE = new TravelBugConnector(); + } + + private TravelBugConnector() { + // singleton + } + + public static TravelBugConnector getInstance() { + return Holder.INSTANCE; + } + }
\ No newline at end of file diff --git a/tests/src/cgeo/geocaching/connector/trackable/TravelBugConnectorTest.java b/tests/src/cgeo/geocaching/connector/trackable/TravelBugConnectorTest.java index 855b93c..ef2821d 100644 --- a/tests/src/cgeo/geocaching/connector/trackable/TravelBugConnectorTest.java +++ b/tests/src/cgeo/geocaching/connector/trackable/TravelBugConnectorTest.java @@ -7,31 +7,35 @@ import junit.framework.TestCase; public class TravelBugConnectorTest extends TestCase { public static void testCanHandleTrackable() { - assertTrue(new TravelBugConnector().canHandleTrackable("TB1234")); - assertTrue(new TravelBugConnector().canHandleTrackable("TB1")); - assertTrue(new TravelBugConnector().canHandleTrackable("TB123F")); - assertTrue(new TravelBugConnector().canHandleTrackable("TB123Z")); - assertTrue(new TravelBugConnector().canHandleTrackable("TB4JD36")); // existing TB, 5 specific characters - assertTrue(new TravelBugConnector().canHandleTrackable("GK1234")); // valid secret code, even though this might be a geokrety - assertTrue(new TravelBugConnector().canHandleTrackable("GST9HV")); // existing secret code - assertFalse(new TravelBugConnector().canHandleTrackable("UNKNOWN")); + assertTrue(getConnector().canHandleTrackable("TB1234")); + assertTrue(getConnector().canHandleTrackable("TB1")); + assertTrue(getConnector().canHandleTrackable("TB123F")); + assertTrue(getConnector().canHandleTrackable("TB123Z")); + assertTrue(getConnector().canHandleTrackable("TB4JD36")); // existing TB, 5 specific characters + assertTrue(getConnector().canHandleTrackable("GK1234")); // valid secret code, even though this might be a geokrety + assertTrue(getConnector().canHandleTrackable("GST9HV")); // existing secret code + assertFalse(getConnector().canHandleTrackable("UNKNOWN")); } public static void testGetUrl() { final Trackable trackable = new Trackable(); trackable.setGeocode("TB2345"); - assertEquals("http://www.geocaching.com//track/details.aspx?tracker=TB2345", new TravelBugConnector().getUrl(trackable)); + assertEquals("http://www.geocaching.com//track/details.aspx?tracker=TB2345", getConnector().getUrl(trackable)); } public static void testOnlineSearchBySecretCode() { - Trackable trackable = new TravelBugConnector().searchTrackable("GST9HV", null, null); + Trackable trackable = getConnector().searchTrackable("GST9HV", null, null); assertNotNull(trackable); assertEquals("Deutschland", trackable.getName()); } public static void testOnlineSearchByPublicCode() { - Trackable trackable = new TravelBugConnector().searchTrackable("TB4JD36", null, null); + Trackable trackable = getConnector().searchTrackable("TB4JD36", null, null); assertNotNull(trackable); assertEquals("Mein Kilometerzähler", trackable.getName()); } + + private static TravelBugConnector getConnector() { + return TravelBugConnector.getInstance(); + } } |