diff options
Diffstat (limited to 'main/src')
7 files changed, 116 insertions, 1 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 */ |
