diff options
| -rw-r--r-- | main/res/values-de/strings.xml | 1 | ||||
| -rw-r--r-- | main/res/values/strings.xml | 1 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/connector/ec/ECApi.java | 46 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/connector/ec/ECConnector.java | 36 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/connector/ec/ECLoggingManager.java | 60 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/enumerations/StatusCode.java | 1 |
6 files changed, 144 insertions, 1 deletions
diff --git a/main/res/values-de/strings.xml b/main/res/values-de/strings.xml index dbd7184..78af574 100644 --- a/main/res/values-de/strings.xml +++ b/main/res/values-de/strings.xml @@ -180,6 +180,7 @@ <string name="err_log_load_data_still">c:geo lädt gerade die benötigten Daten. Bitte kurz warten.</string> <string name="err_log_failed_server">c:geo konnte Log nicht senden, weil der Server nicht antwortete.</string> <string name="err_log_post_failed">c:geo konnte Log nicht absenden.</string> + <string name="err_log_post_failed_ec">Es scheint dass Ihr Log nicht hochgeladen werden konnte. Bitte prüfen Sie es auf Extremcaching.com nach.</string> <string name="err_logimage_post_failed">Es scheint dass Ihr Logfoto nicht hochgeladen werden konnte. Bitte prüfen Sie es auf Geocaching.com nach.</string> <string name="err_search_address_forgot">c:geo hat die Adresse vergessen, die gesucht wurde.</string> <string name="err_parse_lat">c:geo konnte den Breitengrad nicht verarbeiten.</string> diff --git a/main/res/values/strings.xml b/main/res/values/strings.xml index 75537e3..5110a73 100644 --- a/main/res/values/strings.xml +++ b/main/res/values/strings.xml @@ -204,6 +204,7 @@ <string name="err_log_load_data_still">c:geo is still loading data required to post log. Please wait a little while longer.</string> <string name="err_log_failed_server">c:geo failed to post log because server is not responding.</string> <string name="err_log_post_failed">It seems that your log was not posted. Please check it on Geocaching.com.</string> + <string name="err_log_post_failed_ec">It seems that your log was not posted. Please check it on Extremcaching.com.</string> <string name="err_logimage_post_failed">It seems that your log image was not uploaded. Please check it on Geocaching.com.</string> <string name="err_search_address_forgot">c:geo forgot the address you tried to find.</string> <string name="err_parse_lat">c:geo can\'t parse latitude.</string> diff --git a/main/src/cgeo/geocaching/connector/ec/ECApi.java b/main/src/cgeo/geocaching/connector/ec/ECApi.java index 8c1a428..62571ae 100644 --- a/main/src/cgeo/geocaching/connector/ec/ECApi.java +++ b/main/src/cgeo/geocaching/connector/ec/ECApi.java @@ -2,8 +2,11 @@ package cgeo.geocaching.connector.ec; import cgeo.geocaching.DataStore; import cgeo.geocaching.Geocache; +import cgeo.geocaching.connector.LogResult; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.enumerations.LoadFlags.SaveFlag; +import cgeo.geocaching.enumerations.LogType; +import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.Viewport; import cgeo.geocaching.list.StoredList; @@ -15,19 +18,24 @@ import ch.boye.httpclientandroidlib.HttpResponse; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.FastDateFormat; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; +import java.util.Calendar; import java.util.Collection; import java.util.Collections; import java.util.EnumSet; import java.util.List; +import java.util.Locale; +import java.util.TimeZone; public class ECApi { private static final String API_URL = "http://extremcaching.com/exports/api.php"; + private static final FastDateFormat LOG_DATE_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss.SSSZ", TimeZone.getTimeZone("UTC"), Locale.US); public static String cleanCode(String geocode) { return geocode.replace("EC", ""); @@ -73,6 +81,40 @@ public class ECApi { return importCachesFromJSON(response); } + public static LogResult postLog(final Geocache cache, final LogType logType, final Calendar date, final String log) { + return postLog(cache, logType, date, log, false); + } + + public static LogResult postLog(final Geocache cache, final LogType logType, final Calendar date, final String log, boolean isRetry) { + final Parameters params = new Parameters("cache_id", cache.getGeocode()); + params.add("type", logType.type); + params.add("log", log); + params.add("date", LOG_DATE_FORMAT.format(date.getTime())); + + final String uri = "http://extremcaching.com/exports/log.php"; + final HttpResponse response = Network.postRequest(uri, params); + + if (response == null) { + return new LogResult(StatusCode.LOG_POST_ERROR_EC, ""); + } + if (!isRetry && response.getStatusLine().getStatusCode() == 403) { + if (ECLogin.login() == StatusCode.NO_ERROR) { + apiRequest(uri, params, true); + } + } + if (response.getStatusLine().getStatusCode() != 200) { + return new LogResult(StatusCode.LOG_POST_ERROR_EC, ""); + } + + final String data = Network.getResponseDataAlways(response); + if (data != null && !StringUtils.isBlank(data) && StringUtils.contains(data, "success")) { + final String uid = StringUtils.remove(data, "success:"); + return new LogResult(StatusCode.NO_ERROR, uid); + } + + return new LogResult(StatusCode.LOG_POST_ERROR_EC, ""); + } + private static HttpResponse apiRequest(final Parameters params) { return apiRequest(API_URL, params, false); @@ -89,7 +131,9 @@ public class ECApi { return null; } if (!isRetry && response.getStatusLine().getStatusCode() == 403) { - apiRequest(uri, params, true); + if (ECLogin.login() == StatusCode.NO_ERROR) { + apiRequest(uri, params, true); + } } if (response.getStatusLine().getStatusCode() != 200) { return null; diff --git a/main/src/cgeo/geocaching/connector/ec/ECConnector.java b/main/src/cgeo/geocaching/connector/ec/ECConnector.java index b14ee08..8c5f0a1 100644 --- a/main/src/cgeo/geocaching/connector/ec/ECConnector.java +++ b/main/src/cgeo/geocaching/connector/ec/ECConnector.java @@ -3,13 +3,16 @@ package cgeo.geocaching.connector.ec; import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.Geocache; import cgeo.geocaching.ICache; +import cgeo.geocaching.LogCacheActivity; import cgeo.geocaching.R; import cgeo.geocaching.SearchResult; import cgeo.geocaching.connector.AbstractConnector; +import cgeo.geocaching.connector.ILoggingManager; import cgeo.geocaching.connector.capability.ILogin; import cgeo.geocaching.connector.capability.ISearchByCenter; import cgeo.geocaching.connector.capability.ISearchByGeocode; import cgeo.geocaching.connector.capability.ISearchByViewPort; +import cgeo.geocaching.enumerations.LogType; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.Viewport; @@ -22,7 +25,9 @@ import org.apache.commons.lang3.StringUtils; import android.content.Context; import android.os.Handler; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; import java.util.regex.Pattern; public class ECConnector extends AbstractConnector implements ISearchByGeocode, ISearchByCenter, ISearchByViewPort, ILogin { @@ -186,4 +191,35 @@ public class ECConnector extends AbstractConnector implements ISearchByGeocode, return "© " + cache.getOwnerDisplayName() + ", <a href=\"" + getCacheUrl(cache) + "\">" + getName() + "</a>, CC BY-NC-ND 3.0, alle Logeinträge © jeweiliger Autor"; } + @Override + public boolean supportsLogging() { + return true; + } + + @Override + public boolean canLog(Geocache cache) { + return true; + } + + @Override + public ILoggingManager getLoggingManager(final LogCacheActivity activity, final Geocache cache) { + return new ECLoggingManager(activity, this, cache); + } + + @Override + public List<LogType> getPossibleLogTypes(Geocache geocache) { + final List<LogType> logTypes = new ArrayList<LogType>(); + if (geocache.isEventCache()) { + logTypes.add(LogType.WILL_ATTEND); + logTypes.add(LogType.ATTENDED); + } else { + logTypes.add(LogType.FOUND_IT); + } + if (!geocache.isEventCache()) { + logTypes.add(LogType.DIDNT_FIND_IT); + } + logTypes.add(LogType.NOTE); + return logTypes; + } + } diff --git a/main/src/cgeo/geocaching/connector/ec/ECLoggingManager.java b/main/src/cgeo/geocaching/connector/ec/ECLoggingManager.java new file mode 100644 index 0000000..716c0a3 --- /dev/null +++ b/main/src/cgeo/geocaching/connector/ec/ECLoggingManager.java @@ -0,0 +1,60 @@ +package cgeo.geocaching.connector.ec; + +import cgeo.geocaching.Geocache; +import cgeo.geocaching.LogCacheActivity; +import cgeo.geocaching.TrackableLog; +import cgeo.geocaching.connector.ILoggingManager; +import cgeo.geocaching.connector.ImageResult; +import cgeo.geocaching.connector.LogResult; +import cgeo.geocaching.enumerations.LogType; + +import android.net.Uri; + +import java.util.Calendar; +import java.util.Collections; +import java.util.List; + +public class ECLoggingManager implements ILoggingManager { + + private final ECConnector connector; + private final Geocache cache; + private LogCacheActivity activity; + + public ECLoggingManager(final LogCacheActivity activity, final ECConnector connector, final Geocache cache) { + this.connector = connector; + this.cache = cache; + this.activity = activity; + } + + @Override + public final void init() { + activity.onLoadFinished(); + } + + @Override + public final LogResult postLog(final Geocache cache, final LogType logType, final Calendar date, final String log, final String logPassword, final List<TrackableLog> trackableLogs) { + final LogResult result = ECApi.postLog(cache, logType, date, log); + return result; + } + + @Override + public final ImageResult postLogImage(final String logId, final String imageCaption, final String imageDescription, final Uri imageUri) { + return null; + } + + @Override + public final boolean hasLoaderError() { + return false; + } + + @Override + public final List<TrackableLog> getTrackables() { + return Collections.emptyList(); + } + + @Override + public List<LogType> getPossibleLogTypes() { + return connector.getPossibleLogTypes(cache); + } + +} diff --git a/main/src/cgeo/geocaching/enumerations/StatusCode.java b/main/src/cgeo/geocaching/enumerations/StatusCode.java index 8c1db47..e1a1aaa 100644 --- a/main/src/cgeo/geocaching/enumerations/StatusCode.java +++ b/main/src/cgeo/geocaching/enumerations/StatusCode.java @@ -22,6 +22,7 @@ public enum StatusCode { PREMIUM_ONLY(R.string.err_premium_only), MAINTENANCE(R.string.err_maintenance), LOG_POST_ERROR(R.string.err_log_post_failed), + LOG_POST_ERROR_EC(R.string.err_log_post_failed_ec), NO_LOG_TEXT(R.string.warn_log_text_fill), NO_DATA_FROM_SERVER(R.string.err_log_failed_server), NOT_LOGGED_IN(R.string.init_login_popup_failed), |
