aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBananeweizen <bananeweizen@gmx.de>2013-06-23 10:42:15 +0200
committerBananeweizen <bananeweizen@gmx.de>2013-06-23 10:42:15 +0200
commite733eb45200b16ed4b59b87c113a3044c52316ca (patch)
tree18a8eb060cb12b0b18eacf9cfd102ca63655f9d9
parentd2e4b2723f08afaff855d690be1fc79eb4630371 (diff)
downloadcgeo-e733eb45200b16ed4b59b87c113a3044c52316ca.zip
cgeo-e733eb45200b16ed4b59b87c113a3044c52316ca.tar.gz
cgeo-e733eb45200b16ed4b59b87c113a3044c52316ca.tar.bz2
fix #2907: opening TB from cache inventory broken
-rw-r--r--main/src/cgeo/geocaching/TrackableActivity.java25
-rw-r--r--main/src/cgeo/geocaching/connector/ConnectorFactory.java2
-rw-r--r--main/src/cgeo/geocaching/connector/trackable/TravelBugConnector.java16
-rw-r--r--tests/src/cgeo/geocaching/connector/trackable/TravelBugConnectorTest.java26
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();
+ }
}