diff options
| author | Portree-Kid <keith.paterson@gmx.de> | 2013-03-08 15:06:41 +0100 |
|---|---|---|
| committer | Portree-Kid <keith.paterson@gmx.de> | 2013-03-08 15:06:41 +0100 |
| commit | a0932683fdf840fd97464e93a4597fac5c93a731 (patch) | |
| tree | a0e27bbad9012436d378da27f3e2b052a0edb2f3 /main/src/cgeo/geocaching/loaders | |
| parent | cfb16fb725c069f59d545a50ba40045320a55c2c (diff) | |
| download | cgeo-a0932683fdf840fd97464e93a4597fac5c93a731.zip cgeo-a0932683fdf840fd97464e93a4597fac5c93a731.tar.gz cgeo-a0932683fdf840fd97464e93a4597fac5c93a731.tar.bz2 | |
Refactoring to use Loaders fixes #2365
Diffstat (limited to 'main/src/cgeo/geocaching/loaders')
11 files changed, 358 insertions, 0 deletions
diff --git a/main/src/cgeo/geocaching/loaders/AbstractSearchLoader.java b/main/src/cgeo/geocaching/loaders/AbstractSearchLoader.java new file mode 100644 index 0000000..e178acc --- /dev/null +++ b/main/src/cgeo/geocaching/loaders/AbstractSearchLoader.java @@ -0,0 +1,111 @@ +package cgeo.geocaching.loaders; + +import cgeo.geocaching.SearchResult; +import cgeo.geocaching.Settings; +import cgeo.geocaching.connector.gc.GCParser; +import cgeo.geocaching.utils.Log; + +import android.content.Context; +import android.os.Handler; +import android.support.v4.content.AsyncTaskLoader; + +public abstract class AbstractSearchLoader extends AsyncTaskLoader<SearchResult> implements RecaptchaReceiver { + + public enum CacheListLoaderType { + OFFLINE, + HISTORY, + NEAREST, + COORDINATE, + KEYWORD, + ADDRESS, + USERNAME, + OWNER, + MAP, + REMOVE_FROM_HISTORY; + } + + private Handler recaptchaHandler = null; + private String recaptchaChallenge = null; + private String recaptchaText = null; + private SearchResult search; + private boolean loading; + + public boolean isLoading() { + return loading; + } + + public AbstractSearchLoader(Context context) { + super(context); + } + + public abstract SearchResult runSearch(); + + @Override + public SearchResult loadInBackground() { + loading = true; + if (search == null) { + search = runSearch(); + } else { + //Unless we make a new Search the Loader framework won't deliver results. It does't do equals only identity + SearchResult newSearch = new SearchResult(search); + newSearch.setUrl(search.getUrl()); + newSearch.setViewstates(search.getViewstates()); + search = GCParser.searchByNextPage(newSearch, Settings.isShowCaptcha(), this); + } + loading = false; + return search; + } + + @Override + public boolean takeContentChanged() { + return super.takeContentChanged(); + } + + @Override + protected void onStartLoading() { + forceLoad(); + } + + public void setRecaptchaHandler(Handler recaptchaHandlerIn) { + recaptchaHandler = recaptchaHandlerIn; + } + + @Override + public void notifyNeed() { + if (recaptchaHandler != null) { + recaptchaHandler.sendEmptyMessage(1); + } + } + + public synchronized void waitForUser() { + try { + wait(); + } catch (InterruptedException e) { + Log.w("searchThread is not waiting for user…"); + } + } + + @Override + public void setChallenge(String challenge) { + recaptchaChallenge = challenge; + } + + @Override + public String getChallenge() { + return recaptchaChallenge; + } + + @Override + public synchronized void setText(String text) { + recaptchaText = text; + + notify(); + } + + @Override + public synchronized String getText() { + return recaptchaText; + } + + +} diff --git a/main/src/cgeo/geocaching/loaders/AddressGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/AddressGeocacheListLoader.java new file mode 100644 index 0000000..6e4f99a --- /dev/null +++ b/main/src/cgeo/geocaching/loaders/AddressGeocacheListLoader.java @@ -0,0 +1,23 @@ +package cgeo.geocaching.loaders; + +import cgeo.geocaching.SearchResult; +import cgeo.geocaching.Settings; +import cgeo.geocaching.connector.gc.GCParser; + +import android.content.Context; + +public class AddressGeocacheListLoader extends AbstractSearchLoader { + + private String address; + + public AddressGeocacheListLoader(Context context, String address) { + super(context); + this.address = address; + } + + @Override + public SearchResult runSearch() { + return GCParser.searchByAddress(address, Settings.getCacheType(), Settings.isShowCaptcha(), this); + } + +} diff --git a/main/src/cgeo/geocaching/loaders/CoordsGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/CoordsGeocacheListLoader.java new file mode 100644 index 0000000..2f76d49 --- /dev/null +++ b/main/src/cgeo/geocaching/loaders/CoordsGeocacheListLoader.java @@ -0,0 +1,36 @@ +package cgeo.geocaching.loaders; + +import cgeo.geocaching.SearchResult; +import cgeo.geocaching.Settings; +import cgeo.geocaching.connector.ConnectorFactory; +import cgeo.geocaching.connector.capability.ISearchByCenter; +import cgeo.geocaching.connector.gc.GCParser; +import cgeo.geocaching.geopoint.Geopoint; + +import android.content.Context; + +public class CoordsGeocacheListLoader extends AbstractSearchLoader { + private Geopoint coords; + + public CoordsGeocacheListLoader(Context context, Geopoint coords) { + super(context); + this.coords = coords; + } + + @Override + public SearchResult runSearch() { + SearchResult search = GCParser.searchByCoords(coords, Settings.getCacheType(), Settings.isShowCaptcha(), this); + + for (ISearchByCenter centerConn : ConnectorFactory.getSearchByCenterConnectors()) { + if (centerConn.isActivated()) { + SearchResult temp = centerConn.searchByCenter(coords); + if (temp != null) { + search.addGeocodes(temp.getGeocodes()); + } + } + } + + return search; + } + +} diff --git a/main/src/cgeo/geocaching/loaders/HistoryGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/HistoryGeocacheListLoader.java new file mode 100644 index 0000000..59a5726 --- /dev/null +++ b/main/src/cgeo/geocaching/loaders/HistoryGeocacheListLoader.java @@ -0,0 +1,26 @@ +package cgeo.geocaching.loaders; + +import cgeo.geocaching.SearchResult; +import cgeo.geocaching.Settings; +import cgeo.geocaching.cgData; +import cgeo.geocaching.enumerations.CacheType; +import cgeo.geocaching.geopoint.Geopoint; + +import android.content.Context; + +public class HistoryGeocacheListLoader extends AbstractSearchLoader { + + + private Geopoint coords; + + public HistoryGeocacheListLoader(Context context, Geopoint coords) { + super(context); + this.coords = coords; + } + + @Override + public SearchResult runSearch() { + return cgData.getHistoryOfCaches(true, coords != null ? Settings.getCacheType() : CacheType.ALL); + } + +} diff --git a/main/src/cgeo/geocaching/loaders/KeywordGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/KeywordGeocacheListLoader.java new file mode 100644 index 0000000..5f05e24 --- /dev/null +++ b/main/src/cgeo/geocaching/loaders/KeywordGeocacheListLoader.java @@ -0,0 +1,23 @@ +package cgeo.geocaching.loaders; + +import cgeo.geocaching.SearchResult; +import cgeo.geocaching.Settings; +import cgeo.geocaching.connector.gc.GCParser; + +import android.content.Context; + +public class KeywordGeocacheListLoader extends AbstractSearchLoader { + + private String keyword; + + public KeywordGeocacheListLoader(Context context, String keyword) { + super(context); + this.keyword = keyword; + } + + @Override + public SearchResult runSearch() { + return GCParser.searchByKeyword(keyword, Settings.getCacheType(), Settings.isShowCaptcha(), this); + } + +} diff --git a/main/src/cgeo/geocaching/loaders/NextPageGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/NextPageGeocacheListLoader.java new file mode 100644 index 0000000..b05cc25 --- /dev/null +++ b/main/src/cgeo/geocaching/loaders/NextPageGeocacheListLoader.java @@ -0,0 +1,22 @@ +package cgeo.geocaching.loaders; + +import cgeo.geocaching.SearchResult; +import cgeo.geocaching.Settings; +import cgeo.geocaching.connector.gc.GCParser; + +import android.content.Context; + +public class NextPageGeocacheListLoader extends AbstractSearchLoader { + private SearchResult search; + + public NextPageGeocacheListLoader(Context context, SearchResult search) { + super(context); + this.search = search; + } + + @Override + public SearchResult runSearch() { + return GCParser.searchByNextPage(search, Settings.isShowCaptcha(), this); + } + +} diff --git a/main/src/cgeo/geocaching/loaders/OfflineGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/OfflineGeocacheListLoader.java new file mode 100644 index 0000000..48e0ae3 --- /dev/null +++ b/main/src/cgeo/geocaching/loaders/OfflineGeocacheListLoader.java @@ -0,0 +1,26 @@ +package cgeo.geocaching.loaders; + +import cgeo.geocaching.SearchResult; +import cgeo.geocaching.Settings; +import cgeo.geocaching.cgData; +import cgeo.geocaching.geopoint.Geopoint; + +import android.content.Context; + +public class OfflineGeocacheListLoader extends AbstractSearchLoader { + + private int listId; + private Geopoint searchCenter; + + public OfflineGeocacheListLoader(Context context, Geopoint searchCenter, int listId) { + super(context); + this.searchCenter = searchCenter; + this.listId = listId; + } + + @Override + public SearchResult runSearch() { + return cgData.getBatchOfStoredCaches(searchCenter, Settings.getCacheType(), listId); + } + +} diff --git a/main/src/cgeo/geocaching/loaders/OwnerGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/OwnerGeocacheListLoader.java new file mode 100644 index 0000000..a7e44fd --- /dev/null +++ b/main/src/cgeo/geocaching/loaders/OwnerGeocacheListLoader.java @@ -0,0 +1,23 @@ +package cgeo.geocaching.loaders; + +import cgeo.geocaching.SearchResult; +import cgeo.geocaching.Settings; +import cgeo.geocaching.connector.gc.GCParser; + +import android.content.Context; + +public class OwnerGeocacheListLoader extends AbstractSearchLoader { + + private String username; + + public OwnerGeocacheListLoader(Context context, String username) { + super(context); + this.username = username; + } + + @Override + public SearchResult runSearch() { + return GCParser.searchByOwner(username, Settings.getCacheType(), Settings.isShowCaptcha(), this); + } + +} diff --git a/main/src/cgeo/geocaching/loaders/RecaptchaReceiver.java b/main/src/cgeo/geocaching/loaders/RecaptchaReceiver.java new file mode 100644 index 0000000..f64bf89 --- /dev/null +++ b/main/src/cgeo/geocaching/loaders/RecaptchaReceiver.java @@ -0,0 +1,17 @@ +package cgeo.geocaching.loaders; + +public interface RecaptchaReceiver { + + public String getText(); + + public void setText(String text); + + public String getChallenge(); + + public void setChallenge(String challenge); + + public void notifyNeed(); + + public void waitForUser(); + +} diff --git a/main/src/cgeo/geocaching/loaders/RemoveFromHistoryLoader.java b/main/src/cgeo/geocaching/loaders/RemoveFromHistoryLoader.java new file mode 100644 index 0000000..7e9ea8f --- /dev/null +++ b/main/src/cgeo/geocaching/loaders/RemoveFromHistoryLoader.java @@ -0,0 +1,28 @@ +package cgeo.geocaching.loaders; + +import cgeo.geocaching.SearchResult; +import cgeo.geocaching.Settings; +import cgeo.geocaching.cgData; +import cgeo.geocaching.enumerations.CacheType; +import cgeo.geocaching.geopoint.Geopoint; + +import android.content.Context; + +public class RemoveFromHistoryLoader extends AbstractSearchLoader { + + private String[] selected; + private Geopoint coords; + + public RemoveFromHistoryLoader(Context context, String[] selected, Geopoint coords) { + super(context); + this.selected = selected; + this.coords = coords; + } + + @Override + public SearchResult runSearch() { + cgData.clearVisitDate(selected); + return cgData.getHistoryOfCaches(true, coords != null ? Settings.getCacheType() : CacheType.ALL); + } + +} diff --git a/main/src/cgeo/geocaching/loaders/UsernameGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/UsernameGeocacheListLoader.java new file mode 100644 index 0000000..e613d5a --- /dev/null +++ b/main/src/cgeo/geocaching/loaders/UsernameGeocacheListLoader.java @@ -0,0 +1,23 @@ +package cgeo.geocaching.loaders; + +import cgeo.geocaching.SearchResult; +import cgeo.geocaching.Settings; +import cgeo.geocaching.connector.gc.GCParser; + +import android.content.Context; + +public class UsernameGeocacheListLoader extends AbstractSearchLoader { + + private String username; + + public UsernameGeocacheListLoader(Context context, String username) { + super(context); + this.username = username; + } + + @Override + public SearchResult runSearch() { + return GCParser.searchByUsername(username, Settings.getCacheType(), Settings.isShowCaptcha(), this); + } + +} |
