diff options
| author | rsudev <rasch@munin-soft.de> | 2013-07-06 15:08:08 +0200 |
|---|---|---|
| committer | rsudev <rasch@munin-soft.de> | 2013-07-06 15:08:08 +0200 |
| commit | 7595b69b01a2e43befb2565a23a9b3f6c8736160 (patch) | |
| tree | d26e3fcdb1c218eaf232dfdc215f227680c38ae6 /main | |
| parent | 06e089bd300a3967f1c50d6509bdc8a0b792bdad (diff) | |
| download | cgeo-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.java | 22 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/cgData.java | 33 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/connector/ConnectorFactory.java | 5 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/connector/gc/GCMap.java | 7 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/connector/gc/Tile.java | 5 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/loaders/CoordsGeocacheListLoader.java | 5 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/maps/CGeoMap.java | 12 |
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; |
