aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/cgCache.java
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/cgeo/geocaching/cgCache.java')
-rw-r--r--main/src/cgeo/geocaching/cgCache.java271
1 files changed, 208 insertions, 63 deletions
diff --git a/main/src/cgeo/geocaching/cgCache.java b/main/src/cgeo/geocaching/cgCache.java
index beffa85..f95fb2c 100644
--- a/main/src/cgeo/geocaching/cgCache.java
+++ b/main/src/cgeo/geocaching/cgCache.java
@@ -9,12 +9,14 @@ import cgeo.geocaching.connector.gc.GCConnector;
import cgeo.geocaching.connector.gc.Tile;
import cgeo.geocaching.enumerations.CacheSize;
import cgeo.geocaching.enumerations.CacheType;
+import cgeo.geocaching.enumerations.LoadFlags;
import cgeo.geocaching.enumerations.LoadFlags.RemoveFlag;
+import cgeo.geocaching.enumerations.LoadFlags.SaveFlag;
import cgeo.geocaching.enumerations.LogType;
import cgeo.geocaching.enumerations.WaypointType;
import cgeo.geocaching.geopoint.Geopoint;
-import cgeo.geocaching.geopoint.GeopointFormatter;
import cgeo.geocaching.geopoint.GeopointParser;
+import cgeo.geocaching.network.HtmlImage;
import cgeo.geocaching.utils.CancellableHandler;
import cgeo.geocaching.utils.Log;
import cgeo.geocaching.utils.LogTemplateProvider;
@@ -27,6 +29,8 @@ import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Handler;
+import android.os.Message;
+import android.text.Html;
import android.text.Spannable;
import java.util.ArrayList;
@@ -88,7 +92,7 @@ public class cgCache implements ICache, IWaypoint {
private List<String> attributes = null;
private List<cgWaypoint> waypoints = null;
private ArrayList<cgImage> spoilers = null;
- private List<cgLog> logs = null;
+ private List<LogEntry> logs = null;
private List<cgTrackable> inventory = null;
private Map<LogType, Integer> logCounts = new HashMap<LogType, Integer>();
private boolean logOffline = false;
@@ -100,7 +104,7 @@ public class cgCache implements ICache, IWaypoint {
private String nameForSorting;
private final EnumSet<StorageLocation> storageLocation = EnumSet.of(StorageLocation.HEAP);
private boolean finalDefined = false;
- private int zoomlevel = Tile.ZOOMLEVEL_MAX;
+ private int zoomlevel = Tile.ZOOMLEVEL_MAX + 1;
private static final Pattern NUMBER_PATTERN = Pattern.compile("\\d+");
@@ -298,18 +302,10 @@ public class cgCache implements ICache, IWaypoint {
* @param other
* @return true if both caches have the same content
*/
- public boolean isEqualTo(cgCache other) {
- if (other == null) {
- return false;
- }
-
- if (
- // updated
- // detailedUpdate
- // visitedDate
- detailed == other.detailed &&
- geocode.equalsIgnoreCase(other.geocode) &&
- name.equalsIgnoreCase(other.name) &&
+ private boolean isEqualTo(final cgCache other) {
+ return detailed == other.detailed &&
+ StringUtils.equalsIgnoreCase(geocode, other.geocode) &&
+ StringUtils.equalsIgnoreCase(name, other.name) &&
cacheType == other.cacheType &&
size == other.size &&
found == other.found &&
@@ -317,25 +313,25 @@ public class cgCache implements ICache, IWaypoint {
premiumMembersOnly == other.premiumMembersOnly &&
difficulty == other.difficulty &&
terrain == other.terrain &&
- (coords != null ? coords.isEqualTo(other.coords) : coords == other.coords) &&
+ (coords != null ? coords.equals(other.coords) : null == other.coords) &&
reliableLatLon == other.reliableLatLon &&
disabled == other.disabled &&
archived == other.archived &&
listId == other.listId &&
- owner.equalsIgnoreCase(other.owner) &&
- ownerReal.equalsIgnoreCase(other.ownerReal) &&
- (description != null ? description.equalsIgnoreCase(other.description) : null == other.description) &&
- (personalNote != null ? personalNote.equalsIgnoreCase(other.personalNote) : null == other.personalNote) &&
- shortdesc.equalsIgnoreCase(other.shortdesc) &&
- latlon.equalsIgnoreCase(other.latlon) &&
- location.equalsIgnoreCase(other.location) &&
+ StringUtils.equalsIgnoreCase(owner, other.owner) &&
+ StringUtils.equalsIgnoreCase(ownerReal, other.ownerReal) &&
+ StringUtils.equalsIgnoreCase(description, other.description) &&
+ StringUtils.equalsIgnoreCase(personalNote, other.personalNote) &&
+ StringUtils.equalsIgnoreCase(shortdesc, other.shortdesc) &&
+ StringUtils.equalsIgnoreCase(latlon, other.latlon) &&
+ StringUtils.equalsIgnoreCase(location, other.location) &&
favorite == other.favorite &&
favoritePoints == other.favoritePoints &&
onWatchlist == other.onWatchlist &&
- (hidden != null ? hidden.compareTo(other.hidden) == 0 : hidden == other.hidden) &&
- guid.equalsIgnoreCase(other.guid) &&
- hint.equalsIgnoreCase(other.hint) &&
- cacheId.equalsIgnoreCase(other.cacheId) &&
+ (hidden != null ? hidden.equals(other.hidden) : null == other.hidden) &&
+ StringUtils.equalsIgnoreCase(guid, other.guid) &&
+ StringUtils.equalsIgnoreCase(hint, other.hint) &&
+ StringUtils.equalsIgnoreCase(cacheId, other.cacheId) &&
(direction != null ? direction.equals(other.direction) : null == other.direction) &&
(distance != null ? distance.equals(other.distance) : null == other.distance) &&
(elevation != null ? elevation.equals(other.elevation) : null == other.elevation) &&
@@ -351,10 +347,7 @@ public class cgCache implements ICache, IWaypoint {
inventory == other.inventory &&
logCounts == other.logCounts &&
logOffline == other.logOffline &&
- finalDefined == other.finalDefined) {
- return true;
- }
- return false;
+ finalDefined == other.finalDefined;
}
public boolean hasTrackables() {
@@ -393,7 +386,7 @@ public class cgCache implements ICache, IWaypoint {
*
* @return true: page contains guid of cache, false: otherwise
*/
- boolean isGuidContainedInPage(final String page) {
+ public boolean isGuidContainedInPage(final String page) {
if (StringUtils.isBlank(page)) {
return false;
}
@@ -404,17 +397,16 @@ public class cgCache implements ICache, IWaypoint {
Pattern patternOk = Pattern.compile(guid, Pattern.CASE_INSENSITIVE);
Matcher matcherOk = patternOk.matcher(page);
if (matcherOk.find()) {
- Log.i(Settings.tag, "cgCache.isGuidContainedInPage: guid '" + guid + "' found");
+ Log.i("cgCache.isGuidContainedInPage: guid '" + guid + "' found");
return true;
} else {
- Log.i(Settings.tag, "cgCache.isGuidContainedInPage: guid '" + guid + "' not found");
+ Log.i("cgCache.isGuidContainedInPage: guid '" + guid + "' not found");
return false;
}
}
public boolean isEventCache() {
- return CacheType.EVENT == cacheType || CacheType.MEGA_EVENT == cacheType
- || CacheType.CITO == cacheType || CacheType.LOSTANDFOUND == cacheType;
+ return cacheType.isEvent();
}
public boolean logVisit(IAbstractActivity fromActivity) {
@@ -534,16 +526,6 @@ public class cgCache implements ICache, IWaypoint {
}
@Override
- public String getLatitude() {
- return coords != null ? coords.format(GeopointFormatter.Format.LAT_DECMINUTE) : null;
- }
-
- @Override
- public String getLongitude() {
- return coords != null ? coords.format(GeopointFormatter.Format.LON_DECMINUTE) : null;
- }
-
- @Override
public String getOwner() {
return owner;
}
@@ -956,7 +938,7 @@ public class cgCache implements ICache, IWaypoint {
return false;
}
- public List<cgLog> getLogs() {
+ public List<LogEntry> getLogs() {
return getLogs(true);
}
@@ -965,15 +947,15 @@ public class cgCache implements ICache, IWaypoint {
* true for all logs, false for friend logs only
* @return the logs with all entries or just the entries of the friends, never <code>null</code>
*/
- public List<cgLog> getLogs(boolean allLogs) {
+ public List<LogEntry> getLogs(boolean allLogs) {
if (logs == null) {
return Collections.emptyList();
}
if (allLogs) {
return logs;
}
- ArrayList<cgLog> friendLogs = new ArrayList<cgLog>();
- for (cgLog log : logs) {
+ ArrayList<LogEntry> friendLogs = new ArrayList<LogEntry>();
+ for (LogEntry log : logs) {
if (log.friend) {
friendLogs.add(log);
}
@@ -985,7 +967,7 @@ public class cgCache implements ICache, IWaypoint {
* @param logs
* the log entries
*/
- public void setLogs(List<cgLog> logs) {
+ public void setLogs(List<LogEntry> logs) {
this.logs = logs;
}
@@ -1361,7 +1343,7 @@ public class cgCache implements ICache, IWaypoint {
matcher = coordPattern.matcher(note);
}
} catch (Exception e) {
- Log.e(Settings.tag, "cgCache.parseWaypointsFromNote: " + e.toString());
+ Log.e("cgCache.parseWaypointsFromNote: " + e.toString());
}
}
@@ -1376,16 +1358,16 @@ public class cgCache implements ICache, IWaypoint {
return attributes != null && attributes.size() > 0;
}
- public void prependLog(final cgLog log) {
+ public void prependLog(final LogEntry log) {
if (logs == null) {
- logs = new ArrayList<cgLog>();
+ logs = new ArrayList<LogEntry>();
}
logs.add(0, log);
}
- public void appendLog(final cgLog log) {
+ public void appendLog(final LogEntry log) {
if (logs == null) {
- logs = new ArrayList<cgLog>();
+ logs = new ArrayList<LogEntry>();
}
logs.add(log);
}
@@ -1414,17 +1396,13 @@ public class cgCache implements ICache, IWaypoint {
if (!(obj instanceof cgCache)) {
return false;
}
- // just compare the geocode even if that is not what "equals" normaly does
- return geocode != null ? geocode.compareTo(((cgCache) obj).geocode) == 0 : false;
+ // just compare the geocode even if that is not what "equals" normally does
+ return StringUtils.isNotBlank(geocode) ? geocode.equals(((cgCache) obj).geocode) : false;
}
public void store(Activity activity, CancellableHandler handler) {
final int listId = Math.max(getListId(), StoredList.STANDARD_LIST_ID);
- cgBase.storeCache(activity, this, null, listId, false, handler);
- }
-
- public int getZoomlevel() {
- return this.zoomlevel;
+ storeCache(activity, this, null, listId, false, handler);
}
public void setZoomlevel(int zoomlevel) {
@@ -1445,4 +1423,171 @@ public class cgCache implements ICache, IWaypoint {
public String getCoordType() {
return "cache";
}
+
+ public void drop(Handler handler) {
+ try {
+ cgeoapplication.getInstance().markDropped(getGeocode());
+ cgeoapplication.getInstance().removeCache(getGeocode(), EnumSet.of(RemoveFlag.REMOVE_CACHE));
+
+ handler.sendMessage(Message.obtain());
+ } catch (Exception e) {
+ Log.e("cache.drop: ", e);
+ }
+ }
+
+ public void checkFields() {
+ if (StringUtils.isBlank(getGeocode())) {
+ Log.e("cgBase.loadLogsFromDetails: geo code not parsed correctly");
+ }
+ if (StringUtils.isBlank(getName())) {
+ Log.e("name not parsed correctly");
+ }
+ if (StringUtils.isBlank(getGuid())) {
+ Log.e("guid not parsed correctly");
+ }
+ if (getTerrain() == 0.0) {
+ Log.e("terrain not parsed correctly");
+ }
+ if (getDifficulty() == 0.0) {
+ Log.e("difficulty not parsed correctly");
+ }
+ if (StringUtils.isBlank(getOwner())) {
+ Log.e("owner not parsed correctly");
+ }
+ if (StringUtils.isBlank(getOwnerReal())) {
+ Log.e("owner real not parsed correctly");
+ }
+ if (getHiddenDate() == null) {
+ Log.e("hidden not parsed correctly");
+ }
+ if (getFavoritePoints() < 0) {
+ Log.e("favoriteCount not parsed correctly");
+ }
+ if (getSize() == null) {
+ Log.e("size not parsed correctly");
+ }
+ if (getType() == null || getType() == CacheType.UNKNOWN) {
+ Log.e("type not parsed correctly");
+ }
+ if (getCoords() == null) {
+ Log.e("coordinates not parsed correctly");
+ }
+ if (StringUtils.isBlank(getLocation())) {
+ Log.e("location not parsed correctly");
+ }
+ }
+
+ public void refresh(Activity activity, int newListId, CancellableHandler handler) {
+ cgeoapplication.getInstance().removeCache(geocode, EnumSet.of(RemoveFlag.REMOVE_CACHE));
+ storeCache(activity, null, geocode, newListId, true, handler);
+ }
+
+ public static void storeCache(Activity activity, cgCache origCache, String geocode, int listId, boolean forceRedownload, CancellableHandler handler) {
+ try {
+ cgCache cache;
+ // get cache details, they may not yet be complete
+ if (origCache != null) {
+ // only reload the cache if it was already stored or doesn't have full details (by checking the description)
+ if (origCache.getListId() >= StoredList.STANDARD_LIST_ID || StringUtils.isBlank(origCache.getDescription())) {
+ final SearchResult search = searchByGeocode(origCache.getGeocode(), null, listId, false, handler);
+ cache = search.getFirstCacheFromResult(LoadFlags.LOAD_CACHE_OR_DB);
+ } else {
+ cache = origCache;
+ }
+ } else if (StringUtils.isNotBlank(geocode)) {
+ final SearchResult search = searchByGeocode(geocode, null, listId, forceRedownload, handler);
+ cache = search.getFirstCacheFromResult(LoadFlags.LOAD_CACHE_OR_DB);
+ } else {
+ cache = null;
+ }
+
+ if (cache == null) {
+ if (handler != null) {
+ handler.sendMessage(Message.obtain());
+ }
+
+ return;
+ }
+
+ if (CancellableHandler.isCancelled(handler)) {
+ return;
+ }
+
+ final HtmlImage imgGetter = new HtmlImage(activity, cache.getGeocode(), false, listId, true);
+
+ // store images from description
+ if (StringUtils.isNotBlank(cache.getDescription())) {
+ Html.fromHtml(cache.getDescription(), imgGetter, null);
+ }
+
+ if (CancellableHandler.isCancelled(handler)) {
+ return;
+ }
+
+ // store spoilers
+ if (CollectionUtils.isNotEmpty(cache.getSpoilers())) {
+ for (cgImage oneSpoiler : cache.getSpoilers()) {
+ imgGetter.getDrawable(oneSpoiler.getUrl());
+ }
+ }
+
+ if (CancellableHandler.isCancelled(handler)) {
+ return;
+ }
+
+ // store images from logs
+ if (Settings.isStoreLogImages()) {
+ for (LogEntry log : cache.getLogs(true)) {
+ if (log.hasLogImages()) {
+ for (cgImage oneLogImg : log.getLogImages()) {
+ imgGetter.getDrawable(oneLogImg.getUrl());
+ }
+ }
+ }
+ }
+
+ if (CancellableHandler.isCancelled(handler)) {
+ return;
+ }
+
+ // store map previews
+ StaticMapsProvider.downloadMaps(cache, activity);
+
+ if (CancellableHandler.isCancelled(handler)) {
+ return;
+ }
+
+ cache.setListId(listId);
+ cgeoapplication.getInstance().saveCache(cache, EnumSet.of(SaveFlag.SAVE_DB));
+
+ if (handler != null) {
+ handler.sendMessage(Message.obtain());
+ }
+ } catch (Exception e) {
+ Log.e("cgBase.storeCache");
+ }
+ }
+
+ public static SearchResult searchByGeocode(final String geocode, final String guid, final int listId, final boolean forceReload, final CancellableHandler handler) {
+ if (StringUtils.isBlank(geocode) && StringUtils.isBlank(guid)) {
+ Log.e("cgeoBase.searchByGeocode: No geocode nor guid given");
+ return null;
+ }
+
+ cgeoapplication app = cgeoapplication.getInstance();
+ if (!forceReload && listId == StoredList.TEMPORARY_LIST_ID && (app.isOffline(geocode, guid) || app.isThere(geocode, guid, true, true))) {
+ final SearchResult search = new SearchResult();
+ final String realGeocode = StringUtils.isNotBlank(geocode) ? geocode : app.getGeocode(guid);
+ search.addGeocode(realGeocode);
+ return search;
+ }
+
+ // if we have no geocode, we can't dynamically select the handler, but must explicitly use GC
+ if (geocode == null && guid != null) {
+ return GCConnector.getInstance().searchByGeocode(null, guid, app, handler);
+ }
+
+ return ConnectorFactory.getConnector(geocode).searchByGeocode(geocode, guid, app, handler);
+ }
+
}