diff options
| author | blafoo <github@blafoo.de> | 2012-03-16 21:41:18 +0100 |
|---|---|---|
| committer | blafoo <github@blafoo.de> | 2012-03-16 21:41:18 +0100 |
| commit | eabb3e3c6166d30d3f4f73cdee0f201129bd8e83 (patch) | |
| tree | 4d4bede91b8e478e6330f78b6ae803f2aca9dbfb | |
| parent | 5178ecea17bf273faabb02a056d995ce882fcc37 (diff) | |
| download | cgeo-eabb3e3c6166d30d3f4f73cdee0f201129bd8e83.zip cgeo-eabb3e3c6166d30d3f4f73cdee0f201129bd8e83.tar.gz cgeo-eabb3e3c6166d30d3f4f73cdee0f201129bd8e83.tar.bz2 | |
Request further details when tapping on a cache in Live Map. Fixes #1256
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); + + } } |
