diff options
5 files changed, 40 insertions, 47 deletions
diff --git a/main/src/cgeo/geocaching/SearchResult.java b/main/src/cgeo/geocaching/SearchResult.java index 12a2522..a673785 100644 --- a/main/src/cgeo/geocaching/SearchResult.java +++ b/main/src/cgeo/geocaching/SearchResult.java @@ -1,5 +1,6 @@ package cgeo.geocaching; +import android.os.Build; import cgeo.geocaching.connector.IConnector; import cgeo.geocaching.connector.gc.GCLogin; import cgeo.geocaching.enumerations.CacheType; @@ -303,23 +304,35 @@ public class SearchResult implements Parcelable { public static <C extends IConnector> SearchResult parallelCombineActive(final Collection<C> connectors, final Func1<C, SearchResult> func) { - return Observable.from(connectors).parallel(new Func1<Observable<C>, Observable<SearchResult>>() { - @Override - public Observable<SearchResult> call(final Observable<C> cObservable) { - return cObservable.flatMap(new Func1<C, Observable<? extends SearchResult>>() { - @Override - public Observable<? extends SearchResult> call(final C c) { - return c.isActive() ? Observable.from(func.call(c)) : Observable.<SearchResult>empty(); - } - }); - } - }, Schedulers.io()).reduce(new SearchResult(), new Func2<SearchResult, SearchResult, SearchResult>() { - @Override - public SearchResult call(final SearchResult searchResult, final SearchResult searchResult2) { - searchResult.addSearchResult(searchResult2); - return searchResult; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { + return Observable.from(connectors).parallel(new Func1<Observable<C>, Observable<SearchResult>>() { + @Override + public Observable<SearchResult> call(final Observable<C> cObservable) { + return cObservable.flatMap(new Func1<C, Observable<? extends SearchResult>>() { + @Override + public Observable<? extends SearchResult> call(final C c) { + return c.isActive() ? Observable.from(func.call(c)) : Observable.<SearchResult>empty(); + } + }); + } + }, Schedulers.io()).reduce(new SearchResult(), new Func2<SearchResult, SearchResult, SearchResult>() { + @Override + public SearchResult call(final SearchResult searchResult, final SearchResult searchResult2) { + searchResult.addSearchResult(searchResult2); + return searchResult; + } + }).toBlockingObservable().first(); + } else { + // Use a slower, sequential version for Android < 2.3, where parallel() does not work correctly + // because of missing Java method (here, Dequeue#offerLast). + final SearchResult result = new SearchResult(); + for (final C connector : connectors) { + if (connector.isActive()) { + result.addSearchResult(func.call(connector)); + } } - }).toBlockingObservable().first(); + return result; + } } } diff --git a/main/src/cgeo/geocaching/connector/ConnectorFactory.java b/main/src/cgeo/geocaching/connector/ConnectorFactory.java index 18344f5..35eae81 100644 --- a/main/src/cgeo/geocaching/connector/ConnectorFactory.java +++ b/main/src/cgeo/geocaching/connector/ConnectorFactory.java @@ -28,10 +28,7 @@ import org.apache.commons.lang3.StringUtils; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import rx.Observable; -import rx.schedulers.Schedulers; import rx.functions.Func1; -import rx.functions.Func2; import java.util.ArrayList; import java.util.Arrays; @@ -181,28 +178,11 @@ public final class ConnectorFactory { } /** @see ISearchByViewPort#searchByViewport */ - public static Observable<SearchResult> searchByViewport(final @NonNull Viewport viewport, final MapTokens tokens) { - return Observable.from(searchByViewPortConns).filter(new Func1<ISearchByViewPort, Boolean>() { + public static SearchResult searchByViewport(final @NonNull Viewport viewport, final MapTokens tokens) { + return SearchResult.parallelCombineActive(searchByViewPortConns, new Func1<ISearchByViewPort, SearchResult>() { @Override - public Boolean call(final ISearchByViewPort connector) { - return connector.isActive(); - } - }).parallel(new Func1<Observable<ISearchByViewPort>, Observable<SearchResult>>() { - @Override - public Observable<SearchResult> call(final Observable<ISearchByViewPort> connector) { - return connector.map(new Func1<ISearchByViewPort, SearchResult>() { - @Override - public SearchResult call(final ISearchByViewPort connector) { - return connector.searchByViewport(viewport, tokens); - } - }); - } - }, Schedulers.io()).reduce(new SearchResult(), new Func2<SearchResult, SearchResult, SearchResult>() { - - @Override - public SearchResult call(final SearchResult result, final SearchResult searchResult) { - result.addSearchResult(searchResult); - return result; + public SearchResult call(ISearchByViewPort connector) { + return connector.searchByViewport(viewport, tokens); } }); } diff --git a/main/src/cgeo/geocaching/maps/CGeoMap.java b/main/src/cgeo/geocaching/maps/CGeoMap.java index 962f5e5..b0124eb 100644 --- a/main/src/cgeo/geocaching/maps/CGeoMap.java +++ b/main/src/cgeo/geocaching/maps/CGeoMap.java @@ -1141,7 +1141,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto } } } - final SearchResult searchResult = ConnectorFactory.searchByViewport(viewport.resize(0.8), tokens).toBlockingObservable().single(); + final SearchResult searchResult = ConnectorFactory.searchByViewport(viewport.resize(0.8), tokens); downloaded = true; Set<Geocache> result = searchResult.getCachesFromSearchResult(LoadFlags.LOAD_CACHE_OR_DB); diff --git a/tests/src/cgeo/geocaching/CgeoApplicationTest.java b/tests/src/cgeo/geocaching/CgeoApplicationTest.java index e834c68..2ebc1f4 100644 --- a/tests/src/cgeo/geocaching/CgeoApplicationTest.java +++ b/tests/src/cgeo/geocaching/CgeoApplicationTest.java @@ -307,7 +307,7 @@ public class CgeoApplicationTest extends CGeoTestCase { // check coords for DETAILED Settings.setLiveMapStrategy(Strategy.DETAILED); - SearchResult search = ConnectorFactory.searchByViewport(viewport, tokens).toBlockingObservable().single(); + SearchResult search = ConnectorFactory.searchByViewport(viewport, tokens); assertNotNull(search); assertTrue(search.getGeocodes().contains(mockedCache.getGeocode())); Geocache parsedCache = DataStore.loadCache(mockedCache.getGeocode(), LoadFlags.LOAD_CACHE_OR_DB); @@ -319,7 +319,7 @@ public class CgeoApplicationTest extends CGeoTestCase { Settings.setLiveMapStrategy(Strategy.FAST); Tile.cache.removeFromTileCache(mockedCache); - search = ConnectorFactory.searchByViewport(viewport, tokens).toBlockingObservable().single(); + search = ConnectorFactory.searchByViewport(viewport, tokens); assertNotNull(search); assertTrue(search.getGeocodes().contains(mockedCache.getGeocode())); parsedCache = DataStore.loadCache(mockedCache.getGeocode(), LoadFlags.LOAD_CACHE_OR_DB); @@ -358,7 +358,7 @@ public class CgeoApplicationTest extends CGeoTestCase { Settings.setCacheType(CacheType.ALL); Viewport viewport = new Viewport(cache, 0.003, 0.003); - SearchResult search = ConnectorFactory.searchByViewport(viewport, INVALID_TOKEN).toBlockingObservable().single(); + SearchResult search = ConnectorFactory.searchByViewport(viewport, INVALID_TOKEN); assertNotNull(search); assertTrue(search.getGeocodes().contains(cache.getGeocode())); @@ -375,7 +375,7 @@ public class CgeoApplicationTest extends CGeoTestCase { deleteCacheFromDBAndLogout(cache.getGeocode()); viewport = new Viewport(cache, 0.003, 0.003); - search = ConnectorFactory.searchByViewport(viewport, INVALID_TOKEN).toBlockingObservable().single(); + search = ConnectorFactory.searchByViewport(viewport, INVALID_TOKEN); assertNotNull(search); // In the meantime, premium-member caches are also shown on map when not logged in diff --git a/tests/src/cgeo/geocaching/connector/gc/GCConnectorTest.java b/tests/src/cgeo/geocaching/connector/gc/GCConnectorTest.java index 47c3f6f..4a81231 100644 --- a/tests/src/cgeo/geocaching/connector/gc/GCConnectorTest.java +++ b/tests/src/cgeo/geocaching/connector/gc/GCConnectorTest.java @@ -26,7 +26,7 @@ public class GCConnectorTest extends AbstractResourceInstrumentationTestCase { { final Viewport viewport = new Viewport(new Geopoint("N 52° 25.369 E 9° 35.499"), new Geopoint("N 52° 25.600 E 9° 36.200")); - final SearchResult searchResult = ConnectorFactory.searchByViewport(viewport, tokens).toBlockingObservable().single(); + final SearchResult searchResult = ConnectorFactory.searchByViewport(viewport, tokens); assertNotNull(searchResult); assertFalse(searchResult.isEmpty()); assertTrue(searchResult.getGeocodes().contains("GC4ER5H")); @@ -35,7 +35,7 @@ public class GCConnectorTest extends AbstractResourceInstrumentationTestCase { { final Viewport viewport = new Viewport(new Geopoint("N 52° 24.000 E 9° 34.500"), new Geopoint("N 52° 26.000 E 9° 38.500")); - final SearchResult searchResult = ConnectorFactory.searchByViewport(viewport, tokens).toBlockingObservable().single(); + final SearchResult searchResult = ConnectorFactory.searchByViewport(viewport, tokens); assertNotNull(searchResult); assertTrue(searchResult.getGeocodes().contains("GC4ER5H")); } |
