aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Tardieu <sam@rfc1149.net>2014-03-31 15:06:25 +0200
committerSamuel Tardieu <sam@rfc1149.net>2014-03-31 15:06:25 +0200
commit46675dfdcb4c7b511b4c35e4a2242e47d4678fd4 (patch)
tree4dbec27998729b792d90ac6b0ee49648f77ccf3a
parent4f8a1c6aeef324547ddd9e48ed726b57bfe8cf51 (diff)
downloadcgeo-46675dfdcb4c7b511b4c35e4a2242e47d4678fd4.zip
cgeo-46675dfdcb4c7b511b4c35e4a2242e47d4678fd4.tar.gz
cgeo-46675dfdcb4c7b511b4c35e4a2242e47d4678fd4.tar.bz2
fix #3707: missing method in Android < 2.3
-rw-r--r--main/src/cgeo/geocaching/SearchResult.java45
-rw-r--r--main/src/cgeo/geocaching/connector/ConnectorFactory.java28
-rw-r--r--main/src/cgeo/geocaching/maps/CGeoMap.java2
-rw-r--r--tests/src/cgeo/geocaching/CgeoApplicationTest.java8
-rw-r--r--tests/src/cgeo/geocaching/connector/gc/GCConnectorTest.java4
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"));
}