aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/loaders
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/cgeo/geocaching/loaders')
-rw-r--r--main/src/cgeo/geocaching/loaders/AbstractSearchLoader.java35
-rw-r--r--main/src/cgeo/geocaching/loaders/AddressGeocacheListLoader.java2
-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/HistoryGeocacheListLoader.java2
-rw-r--r--main/src/cgeo/geocaching/loaders/KeywordGeocacheListLoader.java17
-rw-r--r--main/src/cgeo/geocaching/loaders/NextPageGeocacheListLoader.java2
-rw-r--r--main/src/cgeo/geocaching/loaders/OfflineGeocacheListLoader.java4
-rw-r--r--main/src/cgeo/geocaching/loaders/OwnerGeocacheListLoader.java15
-rw-r--r--main/src/cgeo/geocaching/loaders/RecaptchaReceiver.java2
10 files changed, 53 insertions, 61 deletions
diff --git a/main/src/cgeo/geocaching/loaders/AbstractSearchLoader.java b/main/src/cgeo/geocaching/loaders/AbstractSearchLoader.java
index 7524b76..b2cb0b2 100644
--- a/main/src/cgeo/geocaching/loaders/AbstractSearchLoader.java
+++ b/main/src/cgeo/geocaching/loaders/AbstractSearchLoader.java
@@ -2,6 +2,7 @@ package cgeo.geocaching.loaders;
import cgeo.geocaching.SearchResult;
import cgeo.geocaching.connector.gc.GCConstants;
+import cgeo.geocaching.connector.gc.RecaptchaHandler;
import cgeo.geocaching.network.Network;
import cgeo.geocaching.network.Parameters;
import cgeo.geocaching.utils.Log;
@@ -13,6 +14,8 @@ import android.content.Context;
import android.os.Handler;
import android.support.v4.content.AsyncTaskLoader;
+import java.util.concurrent.CountDownLatch;
+
public abstract class AbstractSearchLoader extends AsyncTaskLoader<SearchResult> implements RecaptchaReceiver {
public enum CacheListLoaderType {
@@ -28,6 +31,10 @@ public abstract class AbstractSearchLoader extends AsyncTaskLoader<SearchResult>
MAP,
REMOVE_FROM_HISTORY,
NEXT_PAGE;
+
+ public int getLoaderId() {
+ return ordinal();
+ }
}
private Handler recaptchaHandler = null;
@@ -36,6 +43,7 @@ public abstract class AbstractSearchLoader extends AsyncTaskLoader<SearchResult>
private String recaptchaText = null;
private SearchResult search;
private boolean loading;
+ private CountDownLatch latch = new CountDownLatch(1);
public AbstractSearchLoader(Context context) {
super(context);
@@ -72,23 +80,21 @@ public abstract class AbstractSearchLoader extends AsyncTaskLoader<SearchResult>
forceLoad();
}
- public void setRecaptchaHandler(Handler recaptchaHandlerIn) {
- recaptchaHandler = recaptchaHandlerIn;
+ public void setRecaptchaHandler(final Handler recaptchaHandler) {
+ this.recaptchaHandler = recaptchaHandler;
}
@Override
public void notifyNeed() {
if (recaptchaHandler != null) {
- recaptchaHandler.sendEmptyMessage(1);
+ recaptchaHandler.sendEmptyMessage(RecaptchaHandler.SHOW_CAPTCHA);
}
}
@Override
- public synchronized void waitForUser() {
+ public void waitForUser() {
try {
- while (getText() == null) {
- wait();
- }
+ latch.await();
} catch (InterruptedException e) {
Log.w("searchThread is not waiting for user…");
}
@@ -100,16 +106,11 @@ public abstract class AbstractSearchLoader extends AsyncTaskLoader<SearchResult>
}
@Override
- public String getKey() {
- return recaptchaKey;
- }
-
- @Override
public void fetchChallenge() {
recaptchaChallenge = null;
if (StringUtils.isNotEmpty(recaptchaKey)) {
- final Parameters params = new Parameters("k", getKey());
+ final Parameters params = new Parameters("k", recaptchaKey);
final String recaptchaJs = Network.getResponseData(Network.getRequest("http://www.google.com/recaptcha/api/challenge", params));
if (StringUtils.isNotBlank(recaptchaJs)) {
@@ -124,18 +125,16 @@ public abstract class AbstractSearchLoader extends AsyncTaskLoader<SearchResult>
}
@Override
- public synchronized void setText(String text) {
+ public void setText(String text) {
recaptchaText = text;
-
- notify();
+ latch.countDown();
}
@Override
- public synchronized String getText() {
+ public String getText() {
return recaptchaText;
}
-
@Override
public void reset() {
super.reset();
diff --git a/main/src/cgeo/geocaching/loaders/AddressGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/AddressGeocacheListLoader.java
index dd7c7a6..e1573c9 100644
--- a/main/src/cgeo/geocaching/loaders/AddressGeocacheListLoader.java
+++ b/main/src/cgeo/geocaching/loaders/AddressGeocacheListLoader.java
@@ -1,8 +1,8 @@
package cgeo.geocaching.loaders;
import cgeo.geocaching.SearchResult;
-import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.connector.gc.GCParser;
+import cgeo.geocaching.settings.Settings;
import android.content.Context;
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/HistoryGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/HistoryGeocacheListLoader.java
index 605f461..fdb35f2 100644
--- a/main/src/cgeo/geocaching/loaders/HistoryGeocacheListLoader.java
+++ b/main/src/cgeo/geocaching/loaders/HistoryGeocacheListLoader.java
@@ -2,9 +2,9 @@ package cgeo.geocaching.loaders;
import cgeo.geocaching.DataStore;
import cgeo.geocaching.SearchResult;
-import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.enumerations.CacheType;
import cgeo.geocaching.geopoint.Geopoint;
+import cgeo.geocaching.settings.Settings;
import android.content.Context;
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/NextPageGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/NextPageGeocacheListLoader.java
index 1104f83..05eac18 100644
--- a/main/src/cgeo/geocaching/loaders/NextPageGeocacheListLoader.java
+++ b/main/src/cgeo/geocaching/loaders/NextPageGeocacheListLoader.java
@@ -1,8 +1,8 @@
package cgeo.geocaching.loaders;
import cgeo.geocaching.SearchResult;
-import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.connector.gc.GCParser;
+import cgeo.geocaching.settings.Settings;
import android.content.Context;
diff --git a/main/src/cgeo/geocaching/loaders/OfflineGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/OfflineGeocacheListLoader.java
index 5088484..b80a1b8 100644
--- a/main/src/cgeo/geocaching/loaders/OfflineGeocacheListLoader.java
+++ b/main/src/cgeo/geocaching/loaders/OfflineGeocacheListLoader.java
@@ -1,9 +1,9 @@
package cgeo.geocaching.loaders;
-import cgeo.geocaching.SearchResult;
-import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.DataStore;
+import cgeo.geocaching.SearchResult;
import cgeo.geocaching.geopoint.Geopoint;
+import cgeo.geocaching.settings.Settings;
import android.content.Context;
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;
+ });
}
}
diff --git a/main/src/cgeo/geocaching/loaders/RecaptchaReceiver.java b/main/src/cgeo/geocaching/loaders/RecaptchaReceiver.java
index fd5189c..881e048 100644
--- a/main/src/cgeo/geocaching/loaders/RecaptchaReceiver.java
+++ b/main/src/cgeo/geocaching/loaders/RecaptchaReceiver.java
@@ -10,8 +10,6 @@ public interface RecaptchaReceiver {
public void fetchChallenge();
- public String getKey();
-
public void setKey(String key);
public void notifyNeed();