aboutsummaryrefslogtreecommitdiffstats
path: root/main/src
diff options
context:
space:
mode:
Diffstat (limited to 'main/src')
-rw-r--r--main/src/cgeo/geocaching/connector/ConnectorFactory.java11
-rw-r--r--main/src/cgeo/geocaching/connector/oc/OCApiConnector.java35
-rw-r--r--main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java10
-rw-r--r--main/src/cgeo/geocaching/connector/oc/OCConnector.java1
-rw-r--r--main/src/cgeo/geocaching/connector/oc/OkapiClient.java106
-rw-r--r--main/src/cgeo/geocaching/connector/oc/OkapiLoggingManager.java5
6 files changed, 138 insertions, 30 deletions
diff --git a/main/src/cgeo/geocaching/connector/ConnectorFactory.java b/main/src/cgeo/geocaching/connector/ConnectorFactory.java
index 50f56af..f63e390 100644
--- a/main/src/cgeo/geocaching/connector/ConnectorFactory.java
+++ b/main/src/cgeo/geocaching/connector/ConnectorFactory.java
@@ -8,6 +8,7 @@ import cgeo.geocaching.connector.capability.ISearchByCenter;
import cgeo.geocaching.connector.capability.ISearchByViewPort;
import cgeo.geocaching.connector.gc.GCConnector;
import cgeo.geocaching.connector.oc.OCApiConnector;
+import cgeo.geocaching.connector.oc.OCApiConnector.ApiSupport;
import cgeo.geocaching.connector.oc.OCApiLiveConnector;
import cgeo.geocaching.connector.oc.OCConnector;
import cgeo.geocaching.connector.ox.OXConnector;
@@ -22,16 +23,16 @@ public final class ConnectorFactory {
private static final UnknownConnector UNKNOWN_CONNECTOR = new UnknownConnector();
private static final IConnector[] connectors = new IConnector[] {
GCConnector.getInstance(),
- new OCApiLiveConnector("Opencaching.de", "www.opencaching.de", "OC", R.string.oc_de_okapi_consumer_key, R.string.oc_de_okapi_consumer_secret),
+ new OCApiLiveConnector("Opencaching.de", "www.opencaching.de", "OC", R.string.oc_de_okapi_consumer_key, R.string.oc_de_okapi_consumer_secret, ApiSupport.current),
new OCConnector("OpenCaching.CZ", "www.opencaching.cz", "OZ"),
- new OCApiConnector("OpenCaching.CO.UK", "www.opencaching.org.uk", "OK", "arU4okouc4GEjMniE2fq"),
+ new OCApiConnector("OpenCaching.CO.UK", "www.opencaching.org.uk", "OK", "arU4okouc4GEjMniE2fq", ApiSupport.oldapi),
new OCConnector("OpenCaching.ES", "www.opencachingspain.es", "OC"),
new OCConnector("OpenCaching.IT", "www.opencaching.it", "OC"),
new OCConnector("OpenCaching.JP", "www.opencaching.jp", "OJ"),
new OCConnector("OpenCaching.NO/SE", "www.opencaching.se", "OS"),
- new OCApiConnector("OpenCaching.NL", "www.opencaching.nl", "OB", "PdzU8jzIlcfMADXaYN8j"),
- new OCApiConnector("OpenCaching.PL", "www.opencaching.pl", "OP", "GkxM47WkUkLQXXsZ9qSh"),
- new OCApiConnector("OpenCaching.US", "www.opencaching.us", "OU", "pTsYAYSXFcfcRQnYE6uA"),
+ new OCApiConnector("OpenCaching.NL", "www.opencaching.nl", "OB", "PdzU8jzIlcfMADXaYN8j", ApiSupport.current),
+ new OCApiConnector("OpenCaching.PL", "www.opencaching.pl", "OP", "GkxM47WkUkLQXXsZ9qSh", ApiSupport.current),
+ new OCApiConnector("OpenCaching.US", "www.opencaching.us", "OU", "pTsYAYSXFcfcRQnYE6uA", ApiSupport.oldapi),
new OXConnector(),
new GeocachingAustraliaConnector(),
new GeopeitusConnector(),
diff --git a/main/src/cgeo/geocaching/connector/oc/OCApiConnector.java b/main/src/cgeo/geocaching/connector/oc/OCApiConnector.java
index 3780c4d..4f365ec 100644
--- a/main/src/cgeo/geocaching/connector/oc/OCApiConnector.java
+++ b/main/src/cgeo/geocaching/connector/oc/OCApiConnector.java
@@ -7,13 +7,31 @@ import cgeo.geocaching.network.Parameters;
import cgeo.geocaching.utils.CancellableHandler;
import cgeo.geocaching.utils.CryptUtils;
+import org.apache.commons.lang3.StringUtils;
+
public class OCApiConnector extends OCConnector implements ISearchByGeocode {
+ // Levels of Okapi we support
+ // oldapi is around rev 500
+ // current is from rev 798 onwards
+ public enum ApiSupport {
+ oldapi,
+ current
+ }
+
+ // Levels of OAuth-Authentication we support
+ public enum OAuthLevel {
+ Level1,
+ Level3
+ }
+
private final String cK;
+ private final ApiSupport apiSupport;
- public OCApiConnector(String name, String host, String prefix, String cK) {
+ public OCApiConnector(String name, String host, String prefix, String cK, ApiSupport apiSupport) {
super(name, host, prefix);
this.cK = cK;
+ this.apiSupport = apiSupport;
}
public void addAuthentication(final Parameters params) {
@@ -41,7 +59,22 @@ public class OCApiConnector extends OCConnector implements ISearchByGeocode {
return true;
}
+ @SuppressWarnings("static-method")
+ public OAuthLevel getSupportedAuthLevel() {
+ return OAuthLevel.Level1;
+ }
+
public String getCK() {
return CryptUtils.rot13(cK);
}
+
+ @SuppressWarnings("static-method")
+ public String getCS() {
+ return StringUtils.EMPTY;
+ }
+
+ public ApiSupport getApiSupport() {
+ return apiSupport;
+ }
+
}
diff --git a/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java b/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java
index 4e57831..929e3b8 100644
--- a/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java
+++ b/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java
@@ -17,8 +17,8 @@ public class OCApiLiveConnector extends OCApiConnector implements ISearchByCente
private String cS;
- public OCApiLiveConnector(String name, String host, String prefix, int cKResId, int cSResId) {
- super(name, host, prefix, CryptUtils.rot13(cgeoapplication.getInstance().getResources().getString(cKResId)));
+ public OCApiLiveConnector(String name, String host, String prefix, int cKResId, int cSResId, ApiSupport apiSupport) {
+ super(name, host, prefix, CryptUtils.rot13(cgeoapplication.getInstance().getResources().getString(cKResId)), apiSupport);
cS = CryptUtils.rot13(cgeoapplication.getInstance().getResources().getString(cSResId));
}
@@ -34,6 +34,12 @@ public class OCApiLiveConnector extends OCApiConnector implements ISearchByCente
return new SearchResult(OkapiClient.getCachesAround(center, this));
}
+ @Override
+ public OAuthLevel getSupportedAuthLevel() {
+ return OAuthLevel.Level3;
+ }
+
+ @Override
public String getCS() {
return CryptUtils.rot13(cS);
}
diff --git a/main/src/cgeo/geocaching/connector/oc/OCConnector.java b/main/src/cgeo/geocaching/connector/oc/OCConnector.java
index 62dfb4c..a26a3c1 100644
--- a/main/src/cgeo/geocaching/connector/oc/OCConnector.java
+++ b/main/src/cgeo/geocaching/connector/oc/OCConnector.java
@@ -62,5 +62,4 @@ public class OCConnector extends AbstractConnector {
public CacheRealm getCacheRealm() {
return CacheRealm.OC;
}
-
}
diff --git a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java
index d8d92e1..bf35574 100644
--- a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java
+++ b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java
@@ -12,6 +12,8 @@ import cgeo.geocaching.connector.ConnectorFactory;
import cgeo.geocaching.connector.IConnector;
import cgeo.geocaching.connector.LogResult;
import cgeo.geocaching.connector.gc.GCConnector;
+import cgeo.geocaching.connector.oc.OCApiConnector.ApiSupport;
+import cgeo.geocaching.connector.oc.OCApiConnector.OAuthLevel;
import cgeo.geocaching.enumerations.CacheAttribute;
import cgeo.geocaching.enumerations.CacheSize;
import cgeo.geocaching.enumerations.CacheType;
@@ -99,8 +101,14 @@ final public class OkapiClient {
private static final String SERVICE_CACHE = "/okapi/services/caches/geocache";
- private static final String SERVICE_CACHE_CORE_FIELDS = "code|name|location|type|status|difficulty|terrain|size|is_found";
- private static final String SERVICE_CACHE_FIELDS = SERVICE_CACHE_CORE_FIELDS + "|owner|founds|notfounds|rating|rating_votes|recommendations|description|hint|images|latest_logs|date_hidden|attribution_note|alt_wpts|is_watched|attrnames|gc_code";
+ // the several realms of possible field s for cache retrieval:
+ // Core: for livemap requests (L3 - only with level 3 auth)
+ // Additional: additional fields for full cache (L3 - only for level 3 auth, current - only for connectors with current api)
+ private static final String SERVICE_CACHE_CORE_FIELDS = "code|name|location|type|status|difficulty|terrain|size";
+ private static final String SERVICE_CACHE_CORE_L3_FIELDS = "is_found";
+ private static final String SERVICE_CACHE_ADDITIONAL_FIELDS = "owner|founds|notfounds|rating|rating_votes|recommendations|description|hint|images|latest_logs|date_hidden|alt_wpts|attrnames";
+ private static final String SERVICE_CACHE_ADDITIONAL_CURRENT_FIELDS = "gc_code|attribution_note";
+ private static final String SERVICE_CACHE_ADDITIONAL_L3_FIELDS = "is_watched";
private static final String SERVICE_SEARCH_AND_RETRIEVE = "/okapi/services/caches/shortcuts/search_and_retrieve";
@@ -113,8 +121,18 @@ final public class OkapiClient {
private static final String SERVICE_SUBMIT_LOG = "/okapi/services/logs/submit";
public static Geocache getCache(final String geoCode) {
- final Parameters params = new Parameters("cache_code", geoCode, "fields", SERVICE_CACHE_FIELDS, "attribution_append", "none");
- final JSONObject data = request(ConnectorFactory.getConnector(geoCode), SERVICE_CACHE, params);
+ final Parameters params = new Parameters("cache_code", geoCode);
+ IConnector connector = ConnectorFactory.getConnector(geoCode);
+ if (!(connector instanceof OCApiConnector)) {
+ return null;
+ }
+
+ OCApiConnector ocapiConn = (OCApiConnector) connector;
+
+ params.add("fields", getFullFields(ocapiConn));
+ params.add("attribution_append", "none");
+
+ final JSONObject data = request(ocapiConn, SERVICE_CACHE, params);
if (data == null) {
return null;
@@ -123,18 +141,24 @@ final public class OkapiClient {
return parseCache(data);
}
- public static List<Geocache> getCachesAround(final Geopoint center, IConnector connector) {
+ // Assumes level 3 OAuth
+ public static List<Geocache> getCachesAround(final Geopoint center, OCApiConnector connector) {
String centerString = GeopointFormatter.format(GeopointFormatter.Format.LAT_DECDEGREE_RAW, center) + "|" + GeopointFormatter.format(GeopointFormatter.Format.LON_DECDEGREE_RAW, center);
final Parameters params = new Parameters("search_method", METHOD_SEARCH_NEAREST);
final Map<String, String> valueMap = new LinkedHashMap<String, String>();
valueMap.put("center", centerString);
valueMap.put("limit", "20");
+ if (connector.getSupportedAuthLevel() != OAuthLevel.Level3) {
+ Log.e("Calling OkapiClient.getCachesAround with wrong connector");
+ return Collections.emptyList();
+ }
+
addFilterParams(valueMap);
params.add("search_params", new JSONObject(valueMap).toString());
- addRetrieveParams(params);
+ addRetrieveParams(params, connector);
final JSONObject data = request(connector, SERVICE_SEARCH_AND_RETRIEVE, params);
@@ -145,7 +169,8 @@ final public class OkapiClient {
return parseCaches(data);
}
- public static List<Geocache> getCachesBBox(final Viewport viewport, IConnector connector) {
+ // Assumes level 3 OAuth
+ public static List<Geocache> getCachesBBox(final Viewport viewport, OCApiConnector connector) {
if (viewport.getLatitudeSpan() == 0 || viewport.getLongitudeSpan() == 0) {
return Collections.emptyList();
@@ -159,11 +184,16 @@ final public class OkapiClient {
final Map<String, String> valueMap = new LinkedHashMap<String, String>();
valueMap.put("bbox", bboxString);
+ if (connector.getSupportedAuthLevel() != OAuthLevel.Level3) {
+ Log.e("Calling OkapiClient.getCachesBBox with wrong connector");
+ return Collections.emptyList();
+ }
+
addFilterParams(valueMap);
params.add("search_params", new JSONObject(valueMap).toString());
- addRetrieveParams(params);
+ addRetrieveParams(params, connector);
final JSONObject data = request(connector, SERVICE_SEARCH_AND_RETRIEVE, params);
@@ -174,7 +204,7 @@ final public class OkapiClient {
return parseCaches(data);
}
- public static boolean setWatchState(final Geocache cache, final boolean watched, IConnector connector) {
+ public static boolean setWatchState(final Geocache cache, final boolean watched, OCApiConnector connector) {
final Parameters params = new Parameters("cache_code", cache.getGeocode());
params.add("watched", watched ? "true" : "false");
@@ -189,7 +219,7 @@ final public class OkapiClient {
return true;
}
- public static LogResult postLog(final Geocache cache, LogType logType, Calendar date, String log, IConnector connector) {
+ public static LogResult postLog(final Geocache cache, LogType logType, Calendar date, String log, OCApiConnector connector) {
final Parameters params = new Parameters("cache_code", cache.getGeocode());
params.add("logtype", logType.oc_type);
params.add("comment", log);
@@ -317,7 +347,9 @@ final public class OkapiClient {
//TODO: Store license per cache
//cache.setLicense(response.getString("attribution_note"));
cache.setWaypoints(parseWaypoints(response.getJSONArray(CACHE_WPTS)), false);
- cache.setOnWatchlist(response.getBoolean(CACHE_IS_WATCHED));
+ if (!response.isNull(CACHE_IS_WATCHED)) {
+ cache.setOnWatchlist(response.getBoolean(CACHE_IS_WATCHED));
+ }
cache.setDetailedUpdatedNow();
// save full detailed caches
@@ -343,7 +375,9 @@ final public class OkapiClient {
cache.setDifficulty((float) response.getDouble(CACHE_DIFFICULTY));
cache.setTerrain((float) response.getDouble(CACHE_TERRAIN));
- cache.setFound(response.getBoolean(CACHE_IS_FOUND));
+ if (!response.isNull(CACHE_IS_FOUND)) {
+ cache.setFound(response.getBoolean(CACHE_IS_FOUND));
+ }
}
private static String absoluteUrl(String url, String geocode) {
@@ -545,11 +579,42 @@ final public class OkapiClient {
return CacheType.UNKNOWN;
}
- private static JSONObject request(final IConnector connector, final String service, final Parameters params) {
+ private static String getCoreFields(OCApiConnector connector) {
if (connector == null) {
- return null;
+ Log.e("OkapiClient.getCoreFields called with invalid connector");
+ return StringUtils.EMPTY;
}
- if (!(connector instanceof OCApiConnector)) {
+
+ if (connector.getSupportedAuthLevel() == OAuthLevel.Level3) {
+ return SERVICE_CACHE_CORE_FIELDS + "|" + SERVICE_CACHE_CORE_L3_FIELDS;
+ }
+
+ return SERVICE_CACHE_CORE_FIELDS;
+ }
+
+ private static String getFullFields(OCApiConnector connector) {
+ if (connector == null) {
+ Log.e("OkapiClient.getFullFields called with invalid connector");
+ return StringUtils.EMPTY;
+ }
+
+ StringBuilder res = new StringBuilder(500);
+
+ res.append(SERVICE_CACHE_CORE_FIELDS);
+ res.append("|").append(SERVICE_CACHE_ADDITIONAL_FIELDS);
+ if (connector.getSupportedAuthLevel() == OAuthLevel.Level3) {
+ res.append("|").append(SERVICE_CACHE_CORE_L3_FIELDS);
+ res.append("|").append(SERVICE_CACHE_ADDITIONAL_L3_FIELDS);
+ }
+ if (connector.getApiSupport() == ApiSupport.current) {
+ res.append("|").append(SERVICE_CACHE_ADDITIONAL_CURRENT_FIELDS);
+ }
+
+ return res.toString();
+ }
+
+ private static JSONObject request(final OCApiConnector connector, final String service, final Parameters params) {
+ if (connector == null) {
return null;
}
@@ -560,7 +625,11 @@ final public class OkapiClient {
params.add("langpref", getPreferredLanguage());
- OAuth.signOAuth(host, service, "GET", false, params, Settings.getOCDETokenPublic(), Settings.getOCDETokenSecret(), ((OCApiLiveConnector) connector).getCK(), ((OCApiLiveConnector) connector).getCS());
+ if (connector.getSupportedAuthLevel() == OAuthLevel.Level3) {
+ OAuth.signOAuth(host, service, "GET", false, params, Settings.getOCDETokenPublic(), Settings.getOCDETokenSecret(), connector.getCK(), connector.getCS());
+ } else {
+ connector.addAuthentication(params);
+ }
final String uri = "http://" + host + service;
return Network.requestJSON(uri, params);
@@ -574,6 +643,7 @@ final public class OkapiClient {
return "en";
}
+ // assumes level 3 oauth
private static void addFilterParams(final Map<String, String> valueMap) {
if (!Settings.isExcludeDisabledCaches()) {
valueMap.put("status", "Available|Temporarily unavailable");
@@ -587,9 +657,9 @@ final public class OkapiClient {
}
}
- private static void addRetrieveParams(final Parameters params) {
+ private static void addRetrieveParams(final Parameters params, OCApiConnector connector) {
params.add("retr_method", METHOD_RETRIEVE_CACHES);
- params.add("retr_params", "{\"fields\": \"" + SERVICE_CACHE_CORE_FIELDS + "\"}");
+ params.add("retr_params", "{\"fields\": \"" + getCoreFields(connector) + "\"}");
params.add("wrap", "true");
}
diff --git a/main/src/cgeo/geocaching/connector/oc/OkapiLoggingManager.java b/main/src/cgeo/geocaching/connector/oc/OkapiLoggingManager.java
index 24c6b79..c5d6990 100644
--- a/main/src/cgeo/geocaching/connector/oc/OkapiLoggingManager.java
+++ b/main/src/cgeo/geocaching/connector/oc/OkapiLoggingManager.java
@@ -3,7 +3,6 @@ package cgeo.geocaching.connector.oc;
import cgeo.geocaching.Geocache;
import cgeo.geocaching.TrackableLog;
import cgeo.geocaching.VisitCacheActivity;
-import cgeo.geocaching.connector.IConnector;
import cgeo.geocaching.connector.ILoggingManager;
import cgeo.geocaching.connector.ImageResult;
import cgeo.geocaching.connector.LogResult;
@@ -20,14 +19,14 @@ import java.util.List;
public class OkapiLoggingManager implements ILoggingManager {
- private final IConnector connector;
+ private final OCApiConnector connector;
private final Geocache cache;
private VisitCacheActivity activity;
private final static List<LogType> standardLogTypes = Arrays.asList(LogType.FOUND_IT, LogType.DIDNT_FIND_IT, LogType.NOTE, LogType.NEEDS_MAINTENANCE);
private final static List<LogType> eventLogTypes = Arrays.asList(LogType.WILL_ATTEND, LogType.ATTENDED, LogType.NOTE);
- public OkapiLoggingManager(Activity activity, IConnector connector, Geocache cache) {
+ public OkapiLoggingManager(Activity activity, OCApiConnector connector, Geocache cache) {
this.connector = connector;
this.cache = cache;
this.activity = (VisitCacheActivity) activity;