diff options
Diffstat (limited to 'main/src')
| -rw-r--r-- | main/src/cgeo/geocaching/SearchResult.java | 45 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/connector/ConnectorFactory.java | 28 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/maps/CGeoMap.java | 2 |
3 files changed, 34 insertions, 41 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); |
