diff options
Diffstat (limited to 'main/src/cgeo/geocaching/loaders')
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(); |
