aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorblafoo <github@blafoo.de>2012-03-16 21:41:18 +0100
committerblafoo <github@blafoo.de>2012-03-16 21:41:18 +0100
commiteabb3e3c6166d30d3f4f73cdee0f201129bd8e83 (patch)
tree4d4bede91b8e478e6330f78b6ae803f2aca9dbfb
parent5178ecea17bf273faabb02a056d995ce882fcc37 (diff)
downloadcgeo-eabb3e3c6166d30d3f4f73cdee0f201129bd8e83.zip
cgeo-eabb3e3c6166d30d3f4f73cdee0f201129bd8e83.tar.gz
cgeo-eabb3e3c6166d30d3f4f73cdee0f201129bd8e83.tar.bz2
Request further details when tapping on a cache in Live Map. Fixes #1256
-rw-r--r--main/src/cgeo/geocaching/cgeopopup.java12
-rw-r--r--main/src/cgeo/geocaching/connector/AbstractConnector.java7
-rw-r--r--main/src/cgeo/geocaching/connector/ConnectorFactory.java9
-rw-r--r--main/src/cgeo/geocaching/connector/IConnector.java4
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCBase.java77
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCConnector.java6
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCConstants.java2
-rw-r--r--tests/src/cgeo/geocaching/cgBaseTest.java60
-rw-r--r--tests/src/cgeo/geocaching/cgeoApplicationTest.java2
-rw-r--r--tests/src/cgeo/geocaching/connector/gc/GCBaseTest.java26
10 files changed, 175 insertions, 30 deletions
diff --git a/main/src/cgeo/geocaching/cgeopopup.java b/main/src/cgeo/geocaching/cgeopopup.java
index 91546b8..afc7df6 100644
--- a/main/src/cgeo/geocaching/cgeopopup.java
+++ b/main/src/cgeo/geocaching/cgeopopup.java
@@ -2,7 +2,9 @@ package cgeo.geocaching;
import cgeo.geocaching.activity.AbstractActivity;
import cgeo.geocaching.apps.cache.navi.NavigationAppFactory;
+import cgeo.geocaching.connector.ConnectorFactory;
import cgeo.geocaching.enumerations.CacheSize;
+import cgeo.geocaching.enumerations.CacheType;
import cgeo.geocaching.enumerations.LoadFlags;
import cgeo.geocaching.enumerations.LogType;
import cgeo.geocaching.gcvote.GCVote;
@@ -32,6 +34,9 @@ import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
+import java.util.HashSet;
+import java.util.Set;
+
public class cgeopopup extends AbstractActivity {
private LayoutInflater inflater = null;
@@ -216,6 +221,13 @@ public class cgeopopup extends AbstractActivity {
return;
}
+ if ( CacheType.UNKNOWN == cache.getType() ) {
+ Set<String> geocodes = new HashSet<String>();
+ geocodes.add(geocode);
+ SearchResult search = ConnectorFactory.searchByGeocodes(geocodes);
+ cache = search.getFirstCacheFromResult(LoadFlags.LOAD_CACHE_ONLY);
+ }
+
try {
RelativeLayout itemLayout;
TextView itemName;
diff --git a/main/src/cgeo/geocaching/connector/AbstractConnector.java b/main/src/cgeo/geocaching/connector/AbstractConnector.java
index 32babe7..248ca23 100644
--- a/main/src/cgeo/geocaching/connector/AbstractConnector.java
+++ b/main/src/cgeo/geocaching/connector/AbstractConnector.java
@@ -7,6 +7,8 @@ import cgeo.geocaching.geopoint.Geopoint;
import cgeo.geocaching.geopoint.Viewport;
import cgeo.geocaching.utils.CancellableHandler;
+import java.util.Set;
+
public abstract class AbstractConnector implements IConnector {
@Override
@@ -54,6 +56,11 @@ public abstract class AbstractConnector implements IConnector {
return null;
}
+ @Override
+ public SearchResult searchByGeocodes(Set<String> geocodes) {
+ return null;
+ }
+
public SearchResult searchByViewport(Viewport viewport, String tokens[]) {
return null;
}
diff --git a/main/src/cgeo/geocaching/connector/ConnectorFactory.java b/main/src/cgeo/geocaching/connector/ConnectorFactory.java
index 12e19ce..8f95028 100644
--- a/main/src/cgeo/geocaching/connector/ConnectorFactory.java
+++ b/main/src/cgeo/geocaching/connector/ConnectorFactory.java
@@ -10,6 +10,8 @@ import cgeo.geocaching.geopoint.Viewport;
import org.apache.commons.lang3.StringUtils;
+import java.util.Set;
+
public final class ConnectorFactory {
private static final UnknownConnector UNKNOWN_CONNECTOR = new UnknownConnector();
private static final IConnector[] connectors = new IConnector[] {
@@ -81,4 +83,11 @@ public final class ConnectorFactory {
return GCConnector.getInstance().searchByViewport(viewport, tokens);
}
+ /** @see IConnector#searchByGeocodes */
+ public static SearchResult searchByGeocodes(final Set<String> geocodes) {
+ // We have only connector capable of doing a 'searchByViewport()'
+ // If there is a second connector the information has to be collected from all collectors
+ return GCConnector.getInstance().searchByGeocodes(geocodes);
+ }
+
}
diff --git a/main/src/cgeo/geocaching/connector/IConnector.java b/main/src/cgeo/geocaching/connector/IConnector.java
index 1b84ecd..28c21c8 100644
--- a/main/src/cgeo/geocaching/connector/IConnector.java
+++ b/main/src/cgeo/geocaching/connector/IConnector.java
@@ -7,6 +7,8 @@ import cgeo.geocaching.geopoint.Geopoint;
import cgeo.geocaching.geopoint.Viewport;
import cgeo.geocaching.utils.CancellableHandler;
+import java.util.Set;
+
public interface IConnector {
/**
* get name for display (currently only used in links)
@@ -78,6 +80,8 @@ public interface IConnector {
public SearchResult searchByGeocode(final String geocode, final String guid, final cgeoapplication app, final CancellableHandler handler);
+ public SearchResult searchByGeocodes(final Set<String> geocodes);
+
/**
* search caches by coordinate. must be implemented if {@link supportsCachesAround} returns <code>true</true>
*
diff --git a/main/src/cgeo/geocaching/connector/gc/GCBase.java b/main/src/cgeo/geocaching/connector/gc/GCBase.java
index 993e062..1af41c3 100644
--- a/main/src/cgeo/geocaching/connector/gc/GCBase.java
+++ b/main/src/cgeo/geocaching/connector/gc/GCBase.java
@@ -5,12 +5,15 @@ import cgeo.geocaching.Settings;
import cgeo.geocaching.cgBase;
import cgeo.geocaching.cgCache;
import cgeo.geocaching.cgeoapplication;
+import cgeo.geocaching.enumerations.CacheSize;
import cgeo.geocaching.enumerations.CacheType;
import cgeo.geocaching.enumerations.LiveMapStrategy.Strategy;
import cgeo.geocaching.enumerations.LiveMapStrategy.StrategyFlag;
+import cgeo.geocaching.enumerations.StatusCode;
import cgeo.geocaching.geopoint.Geopoint;
import cgeo.geocaching.geopoint.IConversion;
import cgeo.geocaching.geopoint.Viewport;
+import cgeo.geocaching.network.Login;
import cgeo.geocaching.network.Network;
import cgeo.geocaching.ui.Formatter;
import cgeo.geocaching.utils.BaseUtils;
@@ -26,6 +29,7 @@ import org.json.JSONObject;
import android.graphics.Bitmap;
import android.util.Log;
+import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@@ -92,7 +96,7 @@ public class GCBase {
* Strategy for data retrieval and parsing, @see Strategy
* @return
*/
- public static SearchResult searchByViewport(final Viewport viewport, final String[] tokens, Strategy strategy) {
+ private static SearchResult searchByViewport(final Viewport viewport, final String[] tokens, Strategy strategy) {
Log.d(Settings.tag, "GCBase.searchByViewport" + viewport.toString());
String referer = GCConstants.URL_LIVE_MAP;
@@ -389,4 +393,75 @@ public class GCBase {
return new String[] { userSession, sessionToken };
}
+ public static SearchResult searchByGeocodes(final Set<String> geocodes) {
+
+ SearchResult result = new SearchResult();
+
+ final String geocodeList = StringUtils.join(geocodes.toArray(), "|");
+
+ String referer = GCConstants.URL_LIVE_MAP_DETAILS;
+
+ StringBuilder url = new StringBuilder();
+ url.append("?i=").append(geocodeList).append("&_=").append(String.valueOf(System.currentTimeMillis()));
+ final String urlString = url.toString();
+
+ try {
+ String data = Tile.requestMapInfo(referer + urlString, referer);
+
+ // Example JSON information
+ // {"status":"success",
+ // "data":[{"name":"Mission: Impossible","gc":"GC1234","g":"34c2e609-5246-4f91-9029-d6c02b0f2a82","available":true,"archived":false,"subrOnly":false,"li":false,"fp":"5","difficulty":{"text":3.5,"value":"3_5"},"terrain":{"text":1.0,"value":"1"},"hidden":"7/23/2001","container":{"text":"Regular","value":"regular.gif"},"type":{"text":"Unknown Cache","value":8},"owner":{"text":"Ca$h_Cacher","value":"2db18e69-6877-402a-848d-6362621424f6"}},
+ // {"name":"HP: Hannover - Sahlkamp","gc":"GC2Q97X","g":"a09149ca-00e0-4aa2-b332-db2b4dfb18d2","available":true,"archived":false,"subrOnly":false,"li":false,"fp":"0","difficulty":{"text":1.0,"value":"1"},"terrain":{"text":1.5,"value":"1_5"},"hidden":"5/29/2011","container":{"text":"Small","value":"small.gif"},"type":{"text":"Traditional Cache","value":2},"owner":{"text":"GeoM@n","value":"1deaa69e-6bcc-421d-95a1-7d32b468cb82"}}]
+ // }
+
+ final JSONObject json = new JSONObject(data);
+ final String status = json.getString("status");
+ if (StringUtils.isBlank(status)) {
+
+ throw new JSONException("No status inside JSON");
+ }
+ if ("success".compareTo(status) != 0) {
+ throw new JSONException("Wrong status inside JSON");
+ }
+ final JSONArray dataArray = json.getJSONArray("data");
+ if (dataArray == null) {
+ throw new JSONException("No data inside JSON");
+ }
+
+ for (int j = 0; j < dataArray.length(); j++) {
+
+ cgCache cache = new cgCache();
+
+ JSONObject dataObject = dataArray.getJSONObject(j);
+ cache.setName(dataObject.getString("name"));
+ cache.setGeocode(dataObject.getString("gc"));
+ cache.setGuid(dataObject.getString("g")); // 34c2e609-5246-4f91-9029-d6c02b0f2a82"
+ cache.setDisabled(!dataObject.getBoolean("available"));
+ cache.setArchived(dataObject.getBoolean("archived"));
+ cache.setPremiumMembersOnly(dataObject.getBoolean("subrOnly"));
+ boolean li = dataObject.getBoolean("li"); // seems to be "false" always
+ cache.setFavoritePoints(Integer.parseInt(dataObject.getString("fp")));
+ JSONObject difficultyObj = dataObject.getJSONObject("difficulty");
+ cache.setDifficulty(Float.parseFloat(difficultyObj.getString("text"))); // 3.5
+ JSONObject terrainObj = dataObject.getJSONObject("terrain");
+ cache.setTerrain(Float.parseFloat(terrainObj.getString("text"))); // 1.5
+ cache.setHidden(Login.parseGcCustomDate(dataObject.getString("hidden"), "MM/dd/yyyy")); // 7/23/2001
+ JSONObject containerObj = dataObject.getJSONObject("container");
+ cache.setSize(CacheSize.getById(containerObj.getString("text"))); // Regular
+ JSONObject typeObj = dataObject.getJSONObject("type");
+ cache.setType(CacheType.getByPattern(typeObj.getString("text"))); // Traditional Cache
+ JSONObject ownerObj = dataObject.getJSONObject("owner");
+ cache.setOwner(ownerObj.getString("text"));
+
+ result.addCache(cache);
+
+ }
+ } catch (JSONException e) {
+ result.setError(StatusCode.UNKNOWN_ERROR);
+ } catch (ParseException e) {
+ result.setError(StatusCode.UNKNOWN_ERROR);
+ }
+ return result;
+ }
+
}
diff --git a/main/src/cgeo/geocaching/connector/gc/GCConnector.java b/main/src/cgeo/geocaching/connector/gc/GCConnector.java
index 4f319f3..1c57508 100644
--- a/main/src/cgeo/geocaching/connector/gc/GCConnector.java
+++ b/main/src/cgeo/geocaching/connector/gc/GCConnector.java
@@ -18,6 +18,7 @@ import org.apache.commons.lang3.StringUtils;
import android.util.Log;
+import java.util.Set;
import java.util.regex.Pattern;
public class GCConnector extends AbstractConnector {
@@ -138,6 +139,11 @@ public class GCConnector extends AbstractConnector {
}
@Override
+ public SearchResult searchByGeocodes(Set<String> geocodes) {
+ return GCBase.searchByGeocodes(geocodes);
+ }
+
+ @Override
public SearchResult searchByViewport(Viewport viewport, String[] tokens) {
return GCBase.searchByViewport(viewport, tokens);
}
diff --git a/main/src/cgeo/geocaching/connector/gc/GCConstants.java b/main/src/cgeo/geocaching/connector/gc/GCConstants.java
index cb4f896..dd4ac98 100644
--- a/main/src/cgeo/geocaching/connector/gc/GCConstants.java
+++ b/main/src/cgeo/geocaching/connector/gc/GCConstants.java
@@ -15,6 +15,8 @@ public final class GCConstants {
/** Live Map */
public final static String URL_LIVE_MAP = "http://www.geocaching.com/map/default.aspx";
+ /** Live Map pop-up */
+ public final static String URL_LIVE_MAP_DETAILS = "http://www.geocaching.com/map/map.details";
/** Caches in a tile */
public final static String URL_MAP_INFO = "http://www.geocaching.com/map/map.info";
/** Tile itself */
diff --git a/tests/src/cgeo/geocaching/cgBaseTest.java b/tests/src/cgeo/geocaching/cgBaseTest.java
index c89e41c..5bb7f8d 100644
--- a/tests/src/cgeo/geocaching/cgBaseTest.java
+++ b/tests/src/cgeo/geocaching/cgBaseTest.java
@@ -34,46 +34,50 @@ public class cgBaseTest extends AndroidTestCase {
assertEquals(125.663703918457, (new Geopoint(48.0, 2.0)).getElevation(), 0.1);
}
- public static void testCompareCaches(ICache expected, cgCache actual) {
+ public static void testCompareCaches(ICache expected, cgCache actual, boolean all) {
assertEquals(expected.getGeocode(), actual.getGeocode());
assertTrue(expected.getType() == actual.getType());
assertEquals(expected.getOwner(), actual.getOwner());
assertEquals(expected.getDifficulty(), actual.getDifficulty());
assertEquals(expected.getTerrain(), actual.getTerrain());
- assertEquals(expected.getLatitude(), actual.getLatitude());
- assertEquals(expected.getLongitude(), actual.getLongitude());
- assertTrue(actual.isReliableLatLon());
assertEquals(expected.isDisabled(), actual.isDisabled());
- assertEquals(expected.isOwn(), actual.isOwn());
assertEquals(expected.isArchived(), actual.isArchived());
- assertEquals(expected.isPremiumMembersOnly(), actual.isPremiumMembersOnly());
- assertEquals(expected.getOwnerReal(), actual.getOwnerReal());
assertEquals(expected.getSize(), actual.getSize());
- assertEquals(expected.getHint(), actual.getHint());
- assertTrue(actual.getDescription().startsWith(expected.getDescription()));
- assertEquals(expected.getShortDescription(), actual.getShortDescription());
assertEquals(expected.getName(), actual.getName());
- assertEquals(expected.getCacheId(), actual.getCacheId());
assertEquals(expected.getGuid(), actual.getGuid());
- assertEquals(expected.getLocation(), actual.getLocation());
- assertEquals(expected.getPersonalNote(), actual.getPersonalNote());
- assertEquals(expected.isFound(), actual.isFound());
- assertEquals(expected.isFavorite(), actual.isFavorite());
assertTrue(expected.getFavoritePoints() <= actual.getFavoritePoints());
- assertEquals(expected.isWatchlist(), actual.isWatchlist());
assertEquals(expected.getHiddenDate().toString(), actual.getHiddenDate().toString());
- for (String attribute : expected.getAttributes()) {
- assertTrue(actual.getAttributes().contains(attribute));
- }
- for (LogType logType : expected.getLogCounts().keySet()) {
- assertTrue(actual.getLogCounts().get(logType) >= expected.getLogCounts().get(logType));
- }
-
- // the inventory can differ to often, therefore we don't compare them
+ assertEquals(expected.isPremiumMembersOnly(), actual.isPremiumMembersOnly());
- int actualSpoilersSize = null != actual.getSpoilers() ? actual.getSpoilers().size() : 0;
- int expectedSpoilersSize = null != expected.getSpoilers() ? expected.getSpoilers().size() : 0;
- assertEquals(expectedSpoilersSize, actualSpoilersSize);
+ if (all) {
+ assertEquals(expected.getLatitude(), actual.getLatitude());
+ assertEquals(expected.getLongitude(), actual.getLongitude());
+ assertTrue(actual.isReliableLatLon());
+ assertEquals(expected.isOwn(), actual.isOwn());
+ assertEquals(expected.getOwnerReal(), actual.getOwnerReal());
+ assertEquals(expected.getHint(), actual.getHint());
+ assertTrue(actual.getDescription().startsWith(expected.getDescription()));
+ assertEquals(expected.getShortDescription(), actual.getShortDescription());
+ assertEquals(expected.getCacheId(), actual.getCacheId());
+ assertEquals(expected.getLocation(), actual.getLocation());
+ assertEquals(expected.getPersonalNote(), actual.getPersonalNote());
+ assertEquals(expected.isFound(), actual.isFound());
+ assertEquals(expected.isFavorite(), actual.isFavorite());
+ assertEquals(expected.isWatchlist(), actual.isWatchlist());
+
+ for (String attribute : expected.getAttributes()) {
+ assertTrue(actual.getAttributes().contains(attribute));
+ }
+ for (LogType logType : expected.getLogCounts().keySet()) {
+ assertTrue(actual.getLogCounts().get(logType) >= expected.getLogCounts().get(logType));
+ }
+
+ // the inventory can differ to often, therefore we don't compare them
+
+ int actualSpoilersSize = null != actual.getSpoilers() ? actual.getSpoilers().size() : 0;
+ int expectedSpoilersSize = null != expected.getSpoilers() ? expected.getSpoilers().size() : 0;
+ assertEquals(expectedSpoilersSize, actualSpoilersSize);
+ }
}
/**
@@ -89,7 +93,7 @@ public class cgBaseTest extends AndroidTestCase {
SearchResult searchResult = cgBase.parseCacheFromText(mockedCache.getData(), null);
cgCache parsedCache = searchResult.getFirstCacheFromResult(LoadFlags.LOAD_CACHE_OR_DB);
assertTrue(StringUtils.isNotBlank(mockedCache.getMockedDataUser()));
- cgBaseTest.testCompareCaches(mockedCache, parsedCache);
+ cgBaseTest.testCompareCaches(mockedCache, parsedCache, true);
}
Settings.setGcCustomDate(gcCustomDate);
}
diff --git a/tests/src/cgeo/geocaching/cgeoApplicationTest.java b/tests/src/cgeo/geocaching/cgeoApplicationTest.java
index 0bdd3f2..0b12aa6 100644
--- a/tests/src/cgeo/geocaching/cgeoApplicationTest.java
+++ b/tests/src/cgeo/geocaching/cgeoApplicationTest.java
@@ -316,7 +316,7 @@ public class cgeoApplicationTest extends ApplicationTestCase<cgeoapplication> {
mockedCache.setMockedDataUser(Settings.getUsername());
cgCache parsedCache = cgeoApplicationTest.testSearchByGeocode(mockedCache.getGeocode());
if (null != parsedCache) {
- cgBaseTest.testCompareCaches(mockedCache, parsedCache);
+ cgBaseTest.testCompareCaches(mockedCache, parsedCache, true);
}
}
}
diff --git a/tests/src/cgeo/geocaching/connector/gc/GCBaseTest.java b/tests/src/cgeo/geocaching/connector/gc/GCBaseTest.java
index 32ab1f2..666357f 100644
--- a/tests/src/cgeo/geocaching/connector/gc/GCBaseTest.java
+++ b/tests/src/cgeo/geocaching/connector/gc/GCBaseTest.java
@@ -1,8 +1,19 @@
package cgeo.geocaching.connector.gc;
+import cgeo.geocaching.SearchResult;
+import cgeo.geocaching.cgBaseTest;
+import cgeo.geocaching.cgCache;
+import cgeo.geocaching.enumerations.LoadFlags;
+import cgeo.geocaching.test.mock.GC2CJPF;
+import cgeo.geocaching.test.mock.MockedCache;
+
+import java.util.HashSet;
+import java.util.Set;
+
import junit.framework.TestCase;
public class GCBaseTest extends TestCase {
+
public static void testSplitJSONKey() {
assertKey("(1, 2)", 1, 2);
assertKey("(12, 34)", 12, 34);
@@ -15,4 +26,19 @@ public class GCBaseTest extends TestCase {
assertEquals(x, pos.getX());
assertEquals(y, pos.getY());
}
+
+ public static void testSearchByGeocodes() {
+
+ MockedCache mockedCache = new GC2CJPF();
+
+ Set<String> geocodes = new HashSet<String>();
+ geocodes.add("GC1RMM2");//mockedCache.getGeocode());
+ //geocodes.add("GC1234");
+
+ SearchResult result = GCBase.searchByGeocodes(geocodes);
+ cgCache parsedCache = result.getFirstCacheFromResult(LoadFlags.LOAD_CACHE_ONLY);
+
+ cgBaseTest.testCompareCaches(mockedCache, parsedCache, false);
+
+ }
}