aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
authorrsudev <rasch@munin-soft.de>2013-07-06 15:08:08 +0200
committerrsudev <rasch@munin-soft.de>2013-07-06 15:08:08 +0200
commit7595b69b01a2e43befb2565a23a9b3f6c8736160 (patch)
treed26e3fcdb1c218eaf232dfdc215f227680c38ae6 /main
parent06e089bd300a3967f1c50d6509bdc8a0b792bdad (diff)
downloadcgeo-7595b69b01a2e43befb2565a23a9b3f6c8736160.zip
cgeo-7595b69b01a2e43befb2565a23a9b3f6c8736160.tar.gz
cgeo-7595b69b01a2e43befb2565a23a9b3f6c8736160.tar.bz2
Fixes #2826, Found caches shown on live map
Implemented detection and filtering for vanishing caches Added testcases for new functionality
Diffstat (limited to 'main')
-rw-r--r--main/src/cgeo/geocaching/SearchResult.java22
-rw-r--r--main/src/cgeo/geocaching/cgData.java33
-rw-r--r--main/src/cgeo/geocaching/connector/ConnectorFactory.java5
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCMap.java7
-rw-r--r--main/src/cgeo/geocaching/connector/gc/Tile.java5
-rw-r--r--main/src/cgeo/geocaching/loaders/CoordsGeocacheListLoader.java5
-rw-r--r--main/src/cgeo/geocaching/maps/CGeoMap.java12
7 files changed, 77 insertions, 12 deletions
diff --git a/main/src/cgeo/geocaching/SearchResult.java b/main/src/cgeo/geocaching/SearchResult.java
index 94ce28d..5053a85 100644
--- a/main/src/cgeo/geocaching/SearchResult.java
+++ b/main/src/cgeo/geocaching/SearchResult.java
@@ -24,6 +24,7 @@ import java.util.Set;
public class SearchResult implements Parcelable {
final private Set<String> geocodes;
+ final private Set<String> filteredGeocodes;
private StatusCode error = null;
private String url = "";
public String[] viewstates = null;
@@ -55,6 +56,7 @@ public class SearchResult implements Parcelable {
*/
public SearchResult(final SearchResult searchResult) {
geocodes = new HashSet<String>(searchResult.geocodes);
+ filteredGeocodes = new HashSet<String>(searchResult.filteredGeocodes);
error = searchResult.error;
url = searchResult.url;
viewstates = searchResult.viewstates;
@@ -70,6 +72,7 @@ public class SearchResult implements Parcelable {
public SearchResult(final Collection<String> geocodes, final int total) {
this.geocodes = new HashSet<String>(geocodes.size());
this.geocodes.addAll(geocodes);
+ this.filteredGeocodes = new HashSet<String>();
this.setTotal(total);
}
@@ -86,6 +89,9 @@ public class SearchResult implements Parcelable {
final ArrayList<String> list = new ArrayList<String>();
in.readStringList(list);
geocodes = new HashSet<String>(list);
+ final ArrayList<String> filteredList = new ArrayList<String>();
+ in.readStringList(filteredList);
+ filteredGeocodes = new HashSet<String>(filteredList);
error = (StatusCode) in.readSerializable();
url = in.readString();
final int length = in.readInt();
@@ -121,6 +127,7 @@ public class SearchResult implements Parcelable {
@Override
public void writeToParcel(final Parcel out, final int flags) {
out.writeStringArray(geocodes.toArray(new String[geocodes.size()]));
+ out.writeStringArray(filteredGeocodes.toArray(new String[filteredGeocodes.size()]));
out.writeSerializable(error);
out.writeString(url);
if (viewstates == null) {
@@ -252,4 +259,19 @@ public class SearchResult implements Parcelable {
return false;
}
+ public void addFilteredGeocodes(Set<String> cachedMissingFromSearch) {
+ filteredGeocodes.addAll(cachedMissingFromSearch);
+ }
+
+ public Set<String> getFilteredGeocodes() {
+ return Collections.unmodifiableSet(filteredGeocodes);
+ }
+
+ public void addSearchResult(SearchResult other) {
+ if (other != null) {
+ addGeocodes(other.geocodes);
+ addFilteredGeocodes(other.filteredGeocodes);
+ }
+ }
+
}
diff --git a/main/src/cgeo/geocaching/cgData.java b/main/src/cgeo/geocaching/cgData.java
index 6f535dc..adb3612 100644
--- a/main/src/cgeo/geocaching/cgData.java
+++ b/main/src/cgeo/geocaching/cgData.java
@@ -1,5 +1,7 @@
package cgeo.geocaching;
+import cgeo.geocaching.connector.IConnector;
+import cgeo.geocaching.connector.gc.Tile;
import cgeo.geocaching.enumerations.CacheSize;
import cgeo.geocaching.enumerations.CacheType;
import cgeo.geocaching.enumerations.LoadFlags;
@@ -2975,4 +2977,35 @@ public class cgData {
return false;
}
+ public static Set<String> getCachedMissingFromSearch(SearchResult searchResult, Set<Tile> tiles, IConnector connector) {
+
+ // get cached cgeocaches
+ final Set<String> cachedGeocodes = new HashSet<String>();
+ for (Tile tile : tiles) {
+ cachedGeocodes.addAll(cacheCache.getInViewport(tile.getViewport(), CacheType.ALL));
+ }
+ // remove found in search result
+ cachedGeocodes.removeAll(searchResult.getGeocodes());
+
+ // check remaining against viewports
+ Set<String> missingFromSearch = new HashSet<String>();
+ for (String geocode : cachedGeocodes) {
+ if (connector.canHandle(geocode)) {
+ Geocache geocache = cacheCache.getCacheFromCache(geocode);
+ boolean bFound = false;
+ for (Tile tile : tiles) {
+ if (tile.containsPoint(geocache)) {
+ bFound = true;
+ break;
+ }
+ }
+ if (bFound) {
+ missingFromSearch.add(geocode);
+ }
+ }
+ }
+
+ return missingFromSearch;
+ }
+
}
diff --git a/main/src/cgeo/geocaching/connector/ConnectorFactory.java b/main/src/cgeo/geocaching/connector/ConnectorFactory.java
index c5a083c..eb09978 100644
--- a/main/src/cgeo/geocaching/connector/ConnectorFactory.java
+++ b/main/src/cgeo/geocaching/connector/ConnectorFactory.java
@@ -147,10 +147,7 @@ public final class ConnectorFactory {
final SearchResult result = new SearchResult();
for (final ISearchByViewPort vpconn : searchByViewPortConns) {
if (vpconn.isActivated()) {
- final SearchResult temp = vpconn.searchByViewport(viewport, tokens);
- if (temp != null) {
- result.addGeocodes(temp.getGeocodes());
- }
+ result.addSearchResult(vpconn.searchByViewport(viewport, tokens));
}
}
return result;
diff --git a/main/src/cgeo/geocaching/connector/gc/GCMap.java b/main/src/cgeo/geocaching/connector/gc/GCMap.java
index 643caf5..13b663b 100644
--- a/main/src/cgeo/geocaching/connector/gc/GCMap.java
+++ b/main/src/cgeo/geocaching/connector/gc/GCMap.java
@@ -337,7 +337,7 @@ public class GCMap {
Log.e("GCMap.searchByViewport: No cache parsed for viewport " + viewport);
}
else {
- searchResult.addGeocodes(search.getGeocodes());
+ searchResult.addSearchResult(search);
}
Tile.Cache.add(tile);
}
@@ -349,6 +349,11 @@ public class GCMap {
}
}
+
+ // Check for vanished found caches
+ if (tiles.iterator().next().getZoomlevel() >= Tile.ZOOMLEVEL_MIN_PERSONALIZED) {
+ searchResult.addFilteredGeocodes(cgData.getCachedMissingFromSearch(searchResult, tiles, GCConnector.getInstance()));
+ }
}
if (strategy.flags.contains(StrategyFlag.SEARCH_NEARBY)) {
diff --git a/main/src/cgeo/geocaching/connector/gc/Tile.java b/main/src/cgeo/geocaching/connector/gc/Tile.java
index dd7f352..ec90036 100644
--- a/main/src/cgeo/geocaching/connector/gc/Tile.java
+++ b/main/src/cgeo/geocaching/connector/gc/Tile.java
@@ -37,6 +37,7 @@ public class Tile {
public static final int TILE_SIZE = 256;
public static final int ZOOMLEVEL_MAX = 18;
public static final int ZOOMLEVEL_MIN = 0;
+ public static final int ZOOMLEVEL_MIN_PERSONALIZED = 12;
static final int[] NUMBER_OF_TILES = new int[ZOOMLEVEL_MAX - ZOOMLEVEL_MIN + 1];
static final int[] NUMBER_OF_PIXELS = new int[ZOOMLEVEL_MAX - ZOOMLEVEL_MIN + 1];
@@ -252,6 +253,10 @@ public class Tile {
return viewPort.contains(point);
}
+ public Viewport getViewport() {
+ return viewPort;
+ }
+
/**
* Calculate needed tiles for the given viewport to cover it with
* max 2x2 tiles
diff --git a/main/src/cgeo/geocaching/loaders/CoordsGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/CoordsGeocacheListLoader.java
index 09ea459..928aaea 100644
--- a/main/src/cgeo/geocaching/loaders/CoordsGeocacheListLoader.java
+++ b/main/src/cgeo/geocaching/loaders/CoordsGeocacheListLoader.java
@@ -27,10 +27,7 @@ public class CoordsGeocacheListLoader extends AbstractSearchLoader {
for (ISearchByCenter centerConn : ConnectorFactory.getSearchByCenterConnectors()) {
if (centerConn.isActivated()) {
- SearchResult temp = centerConn.searchByCenter(coords);
- if (temp != null) {
- search.addGeocodes(temp.getGeocodes());
- }
+ search.addSearchResult(centerConn.searchByCenter(coords));
}
}
diff --git a/main/src/cgeo/geocaching/maps/CGeoMap.java b/main/src/cgeo/geocaching/maps/CGeoMap.java
index c876192..a2b70c7 100644
--- a/main/src/cgeo/geocaching/maps/CGeoMap.java
+++ b/main/src/cgeo/geocaching/maps/CGeoMap.java
@@ -17,6 +17,7 @@ import cgeo.geocaching.connector.gc.Login;
import cgeo.geocaching.enumerations.CacheType;
import cgeo.geocaching.enumerations.LiveMapStrategy.Strategy;
import cgeo.geocaching.enumerations.LoadFlags;
+import cgeo.geocaching.enumerations.LoadFlags.RemoveFlag;
import cgeo.geocaching.enumerations.StatusCode;
import cgeo.geocaching.enumerations.WaypointType;
import cgeo.geocaching.geopoint.Geopoint;
@@ -70,6 +71,7 @@ import android.widget.ViewSwitcher.ViewFactory;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.EnumSet;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -1082,8 +1084,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
}
// live mode search result
if (isLiveEnabled) {
- SearchResult liveResult = new SearchResult(cgData.loadCachedInViewport(viewport, Settings.getCacheType()));
- searchResult.addGeocodes(liveResult.getGeocodes());
+ searchResult.addSearchResult(cgData.loadCachedInViewport(viewport, Settings.getCacheType()));
}
downloaded = true;
@@ -1179,7 +1180,12 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto
Set<Geocache> result = searchResult.getCachesFromSearchResult(LoadFlags.LOAD_CACHE_OR_DB);
CGeoMap.filter(result);
// update the caches
- // new collection type needs to remove first
+ // first remove filtered out
+ final Set<String> filteredCodes = searchResult.getFilteredGeocodes();
+ Log.d("Filtering out " + filteredCodes.size() + " caches: " + filteredCodes.toString());
+ caches.removeAll(cgData.loadCaches(filteredCodes, LoadFlags.LOAD_CACHE_ONLY));
+ cgData.removeCaches(filteredCodes, EnumSet.of(RemoveFlag.REMOVE_CACHE));
+ // new collection type needs to remove first to refresh
caches.removeAll(result);
caches.addAll(result);
lastSearchResult = searchResult;