aboutsummaryrefslogtreecommitdiffstats
path: root/main/src
diff options
context:
space:
mode:
Diffstat (limited to 'main/src')
-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
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 */