aboutsummaryrefslogtreecommitdiffstats
path: root/main/src
diff options
context:
space:
mode:
Diffstat (limited to 'main/src')
-rw-r--r--main/src/cgeo/geocaching/SearchResult.java26
-rw-r--r--main/src/cgeo/geocaching/loaders/CoordsGeocacheListLoader.java18
-rw-r--r--main/src/cgeo/geocaching/loaders/FinderGeocacheListLoader.java17
-rw-r--r--main/src/cgeo/geocaching/loaders/KeywordGeocacheListLoader.java17
-rw-r--r--main/src/cgeo/geocaching/loaders/OwnerGeocacheListLoader.java15
5 files changed, 57 insertions, 36 deletions
diff --git a/main/src/cgeo/geocaching/SearchResult.java b/main/src/cgeo/geocaching/SearchResult.java
index 46ac38e..12a2522 100644
--- a/main/src/cgeo/geocaching/SearchResult.java
+++ b/main/src/cgeo/geocaching/SearchResult.java
@@ -1,5 +1,6 @@
package cgeo.geocaching;
+import cgeo.geocaching.connector.IConnector;
import cgeo.geocaching.connector.gc.GCLogin;
import cgeo.geocaching.enumerations.CacheType;
import cgeo.geocaching.enumerations.LoadFlags;
@@ -11,6 +12,10 @@ import cgeo.geocaching.gcvote.GCVote;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.jdt.annotation.Nullable;
+import rx.Observable;
+import rx.functions.Func1;
+import rx.functions.Func2;
+import rx.schedulers.Schedulers;
import android.os.Parcel;
import android.os.Parcelable;
@@ -296,4 +301,25 @@ 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;
+ }
+ }).toBlockingObservable().first();
+ }
+
}
diff --git a/main/src/cgeo/geocaching/loaders/CoordsGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/CoordsGeocacheListLoader.java
index 3874b47..c2d92bf 100644
--- a/main/src/cgeo/geocaching/loaders/CoordsGeocacheListLoader.java
+++ b/main/src/cgeo/geocaching/loaders/CoordsGeocacheListLoader.java
@@ -6,6 +6,7 @@ import cgeo.geocaching.connector.capability.ISearchByCenter;
import cgeo.geocaching.geopoint.Geopoint;
import org.eclipse.jdt.annotation.NonNull;
+import rx.functions.Func1;
import android.content.Context;
@@ -19,16 +20,13 @@ public class CoordsGeocacheListLoader extends AbstractSearchLoader {
@Override
public SearchResult runSearch() {
-
- SearchResult search = new SearchResult();
-
- for (ISearchByCenter centerConn : ConnectorFactory.getSearchByCenterConnectors()) {
- if (centerConn.isActive()) {
- search.addSearchResult(centerConn.searchByCenter(coords, this));
- }
- }
-
- return search;
+ return SearchResult.parallelCombineActive(ConnectorFactory.getSearchByCenterConnectors(),
+ new Func1<ISearchByCenter, SearchResult>() {
+ @Override
+ public SearchResult call(final ISearchByCenter connector) {
+ return connector.searchByCenter(coords, CoordsGeocacheListLoader.this);
+ }
+ });
}
}
diff --git a/main/src/cgeo/geocaching/loaders/FinderGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/FinderGeocacheListLoader.java
index 7edd436..378fa1b 100644
--- a/main/src/cgeo/geocaching/loaders/FinderGeocacheListLoader.java
+++ b/main/src/cgeo/geocaching/loaders/FinderGeocacheListLoader.java
@@ -5,6 +5,7 @@ import cgeo.geocaching.connector.ConnectorFactory;
import cgeo.geocaching.connector.capability.ISearchByFinder;
import org.eclipse.jdt.annotation.NonNull;
+import rx.functions.Func1;
import android.content.Context;
@@ -19,15 +20,13 @@ public class FinderGeocacheListLoader extends AbstractSearchLoader {
@Override
public SearchResult runSearch() {
- SearchResult searchResult = new SearchResult();
-
- for (ISearchByFinder connector : ConnectorFactory.getSearchByFinderConnectors()) {
- if (connector.isActive()) {
- searchResult.addSearchResult(connector.searchByFinder(username, this));
- }
- }
-
- return searchResult;
+ return SearchResult.parallelCombineActive(ConnectorFactory.getSearchByFinderConnectors(),
+ new Func1<ISearchByFinder, SearchResult>() {
+ @Override
+ public SearchResult call(final ISearchByFinder connector) {
+ return connector.searchByFinder(username, FinderGeocacheListLoader.this);
+ }
+ });
}
}
diff --git a/main/src/cgeo/geocaching/loaders/KeywordGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/KeywordGeocacheListLoader.java
index 9c16ee4..45b264f 100644
--- a/main/src/cgeo/geocaching/loaders/KeywordGeocacheListLoader.java
+++ b/main/src/cgeo/geocaching/loaders/KeywordGeocacheListLoader.java
@@ -5,6 +5,7 @@ import cgeo.geocaching.connector.ConnectorFactory;
import cgeo.geocaching.connector.capability.ISearchByKeyword;
import org.eclipse.jdt.annotation.NonNull;
+import rx.functions.Func1;
import android.content.Context;
@@ -19,15 +20,13 @@ public class KeywordGeocacheListLoader extends AbstractSearchLoader {
@Override
public SearchResult runSearch() {
- SearchResult searchResult = new SearchResult();
-
- for (ISearchByKeyword connector : ConnectorFactory.getSearchByKeywordConnectors()) {
- if (connector.isActive()) {
- searchResult.addSearchResult(connector.searchByKeyword(keyword, this));
- }
- }
-
- return searchResult;
+ return SearchResult.parallelCombineActive(ConnectorFactory.getSearchByKeywordConnectors(),
+ new Func1<ISearchByKeyword, SearchResult>() {
+ @Override
+ public SearchResult call(final ISearchByKeyword connector) {
+ return connector.searchByKeyword(keyword, KeywordGeocacheListLoader.this);
+ }
+ });
}
}
diff --git a/main/src/cgeo/geocaching/loaders/OwnerGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/OwnerGeocacheListLoader.java
index 4d530fb..70db74c 100644
--- a/main/src/cgeo/geocaching/loaders/OwnerGeocacheListLoader.java
+++ b/main/src/cgeo/geocaching/loaders/OwnerGeocacheListLoader.java
@@ -5,6 +5,7 @@ import cgeo.geocaching.connector.ConnectorFactory;
import cgeo.geocaching.connector.capability.ISearchByOwner;
import org.eclipse.jdt.annotation.NonNull;
+import rx.functions.Func1;
import android.content.Context;
@@ -19,15 +20,13 @@ public class OwnerGeocacheListLoader extends AbstractSearchLoader {
@Override
public SearchResult runSearch() {
- SearchResult searchResult = new SearchResult();
-
- for (ISearchByOwner connector : ConnectorFactory.getSearchByOwnerConnectors()) {
- if (connector.isActive()) {
- searchResult.addSearchResult(connector.searchByOwner(username, this));
+ return SearchResult.parallelCombineActive(ConnectorFactory.getSearchByOwnerConnectors(),
+ new Func1<ISearchByOwner, SearchResult>() {
+ @Override
+ public SearchResult call(final ISearchByOwner connector) {
+ return connector.searchByOwner(username, OwnerGeocacheListLoader.this);
}
- }
-
- return searchResult;
+ });
}
}