diff options
| author | mucek4 <tomaz@gorenc.org> | 2013-09-04 10:44:53 +0200 |
|---|---|---|
| committer | mucek4 <tomaz@gorenc.org> | 2013-09-04 10:44:53 +0200 |
| commit | bd09f1887a8e6a8e9b919d4605c04155a3e73760 (patch) | |
| tree | 29e65f4b81e983300f080a3509ee982576bfeb14 /main/src/cgeo | |
| parent | 8fe25127326d3b29d53cd3ef663aa6e46241fcbc (diff) | |
| download | cgeo-bd09f1887a8e6a8e9b919d4605c04155a3e73760.zip cgeo-bd09f1887a8e6a8e9b919d4605c04155a3e73760.tar.gz cgeo-bd09f1887a8e6a8e9b919d4605c04155a3e73760.tar.bz2 | |
Fix 2830 Browse PQs as nearby search
Diffstat (limited to 'main/src/cgeo')
| -rw-r--r-- | main/src/cgeo/geocaching/Intents.java | 1 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/MainActivity.java | 17 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/PocketQueryList.java | 124 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/cgeocaches.java | 19 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/connector/gc/GCConstants.java | 1 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/connector/gc/GCParser.java | 48 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/enumerations/CacheListType.java | 1 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/loaders/AbstractSearchLoader.java | 1 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/loaders/PocketGeocacheListLoader.java | 28 |
9 files changed, 240 insertions, 0 deletions
diff --git a/main/src/cgeo/geocaching/Intents.java b/main/src/cgeo/geocaching/Intents.java index a700451..d9d9829 100644 --- a/main/src/cgeo/geocaching/Intents.java +++ b/main/src/cgeo/geocaching/Intents.java @@ -28,4 +28,5 @@ public class Intents { public static final String EXTRA_USERNAME = PREFIX + "username"; public static final String EXTRA_WAYPOINT_ID = PREFIX + "waypoint_id"; public static final String EXTRA_CACHELIST = PREFIX + "cache_list"; + public static final String EXTRA_POCKET_GUID = PREFIX + "pocket_guid"; } diff --git a/main/src/cgeo/geocaching/MainActivity.java b/main/src/cgeo/geocaching/MainActivity.java index b6f267a..1b9fe46 100644 --- a/main/src/cgeo/geocaching/MainActivity.java +++ b/main/src/cgeo/geocaching/MainActivity.java @@ -511,6 +511,23 @@ public class MainActivity extends AbstractActivity { } }); nearestView.setBackgroundResource(R.drawable.main_nearby); + + nearestView.setOnLongClickListener(new View.OnLongClickListener() { + + @Override + public boolean onLongClick(View v) { + new PocketQueryList.UserInterface(MainActivity.this).promptForListSelection(new RunnableWithArgument<PocketQueryList>() { + + @Override + public void run(PocketQueryList pql) { + cgeocaches.startActivityPocket(MainActivity.this, pql.getGuid(), pql.getName()); + } + }); + return true; + } + }); + nearestView.setLongClickable(true); + } navType.setText(res.getString(geo.getLocationProvider().resourceId)); diff --git a/main/src/cgeo/geocaching/PocketQueryList.java b/main/src/cgeo/geocaching/PocketQueryList.java new file mode 100644 index 0000000..cef4463 --- /dev/null +++ b/main/src/cgeo/geocaching/PocketQueryList.java @@ -0,0 +1,124 @@ +package cgeo.geocaching; + +import cgeo.geocaching.activity.ActivityMixin; +import cgeo.geocaching.connector.gc.GCParser; +import cgeo.geocaching.utils.RunnableWithArgument; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.ProgressDialog; +import android.content.DialogInterface; +import android.content.res.Resources; +import android.os.Handler; +import android.os.Message; + +import java.util.List; + +public final class PocketQueryList { + + private final String guid; + private final int maxCaches; + private final String name; + + public PocketQueryList(String guid, String name, int maxCaches) { + this.guid = guid; + this.name = name; + this.maxCaches = maxCaches; + } + + public static class UserInterface { + + List<PocketQueryList> pocketQueryList = null; + RunnableWithArgument<PocketQueryList> runAfterwards; + + private Handler loadPocketQueryHandler = new Handler() { + + @Override + public void handleMessage(Message msg) { + if ((pocketQueryList == null) || (pocketQueryList.size() == 0)) { + if (waitDialog != null) { + waitDialog.dismiss(); + } + + ActivityMixin.showToast(activity, res.getString(R.string.warn_no_pocket_query_found)); + + return; + } + + if (waitDialog != null) { + waitDialog.dismiss(); + } + + final CharSequence[] items = new CharSequence[pocketQueryList.size()]; + + for (int i = 0; i < pocketQueryList.size(); i++) { + PocketQueryList pq = pocketQueryList.get(i); + + items[i] = pq.name + " (" + pq.maxCaches + ")"; + + } + + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle(res.getString(R.string.search_pocket_select)); + builder.setItems(items, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int itemId) { + runAfterwards.run(pocketQueryList.get(itemId)); + } + }); + builder.create().show(); + + } + }; + + private class LoadPocketQueryListThread extends Thread { + final private Handler handler; + + public LoadPocketQueryListThread(Handler handlerIn) { + handler = handlerIn; + } + + @Override + public void run() { + pocketQueryList = GCParser.searchPocketQueryList(); + handler.sendMessage(Message.obtain()); + } + } + + private final Activity activity; + private final cgeoapplication app; + private final Resources res; + private ProgressDialog waitDialog = null; + + public UserInterface(final Activity activity) { + this.activity = activity; + app = cgeoapplication.getInstance(); + res = app.getResources(); + } + + public void promptForListSelection(final RunnableWithArgument<PocketQueryList> runAfterwards) { + + this.runAfterwards = runAfterwards; + + waitDialog = ProgressDialog.show(activity, res.getString(R.string.search_pocket_title), res.getString(R.string.search_pocket_loading), true, true); + + LoadPocketQueryListThread thread = new LoadPocketQueryListThread(loadPocketQueryHandler); + thread.start(); + } + + + } + + public String getGuid() { + return guid; + } + + public int getMaxCaches() { + return maxCaches; + } + + public String getName() { + return name; + } + +} diff --git a/main/src/cgeo/geocaching/cgeocaches.java b/main/src/cgeo/geocaching/cgeocaches.java index d1ea7c4..4ffe7ed 100644 --- a/main/src/cgeo/geocaching/cgeocaches.java +++ b/main/src/cgeo/geocaching/cgeocaches.java @@ -25,6 +25,7 @@ import cgeo.geocaching.loaders.KeywordGeocacheListLoader; import cgeo.geocaching.loaders.NextPageGeocacheListLoader; import cgeo.geocaching.loaders.OfflineGeocacheListLoader; import cgeo.geocaching.loaders.OwnerGeocacheListLoader; +import cgeo.geocaching.loaders.PocketGeocacheListLoader; import cgeo.geocaching.loaders.RemoveFromHistoryLoader; import cgeo.geocaching.loaders.UsernameGeocacheListLoader; import cgeo.geocaching.maps.CGeoMap; @@ -1678,6 +1679,18 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity context.startActivity(cachesIntent); } + public static void startActivityPocket(final AbstractActivity context, final String guid, final String name) { + if (guid == null) { + context.showToast(cgeoapplication.getInstance().getString(R.string.warn_pocket_query_select)); + return; + } + final Intent cachesIntent = new Intent(context, cgeocaches.class); + cachesIntent.putExtra(Intents.EXTRA_LIST_TYPE, CacheListType.POCKET); + cachesIntent.putExtra(Intents.EXTRA_NAME, name); + cachesIntent.putExtra(Intents.EXTRA_POCKET_GUID, guid); + context.startActivity(cachesIntent); + } + public static void startActivityMap(final Context context, final SearchResult search) { final Intent cachesIntent = new Intent(context, cgeocaches.class); cachesIntent.putExtra(Intents.EXTRA_LIST_TYPE, CacheListType.MAP); @@ -1765,6 +1778,12 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity case NEXT_PAGE: loader = new NextPageGeocacheListLoader(app, search); break; + case POCKET: + final String guid = extras.getString(Intents.EXTRA_POCKET_GUID); + final String pocket_name = extras.getString(Intents.EXTRA_NAME); + title = pocket_name; + loader = new PocketGeocacheListLoader(app, guid); + break; } setTitle(title); showProgress(true); diff --git a/main/src/cgeo/geocaching/connector/gc/GCConstants.java b/main/src/cgeo/geocaching/connector/gc/GCConstants.java index 16aa967..84c27fe 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCConstants.java +++ b/main/src/cgeo/geocaching/connector/gc/GCConstants.java @@ -158,6 +158,7 @@ public final class GCConstants { public final static Pattern PATTERN_VIEWSTATEFIELDCOUNT = Pattern.compile("id=\"__VIEWSTATEFIELDCOUNT\"[^(value)]+value=\"(\\d+)\"[^>]+>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE); public final static Pattern PATTERN_VIEWSTATES = Pattern.compile("id=\"__VIEWSTATE(\\d*)\"[^(value)]+value=\"([^\"]+)\"[^>]+>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE); public final static Pattern PATTERN_USERTOKEN = Pattern.compile("userToken\\s*=\\s*'([^']+)'"); + public final static Pattern PATTERN_LIST_PQ = Pattern.compile(Pattern.quote("pocket_query.png") + ".*?" + Pattern.quote("(") + "(.*?)" + Pattern.quote(")") + ".*?guid=([^\"]*)\".*?>([^<]*)<"); /** Live Map since 14.02.2012 */ public final static Pattern PATTERN_USERSESSION = Pattern.compile("UserSession\\('([^']+)'"); diff --git a/main/src/cgeo/geocaching/connector/gc/GCParser.java b/main/src/cgeo/geocaching/connector/gc/GCParser.java index 3885679..bd20216 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCParser.java +++ b/main/src/cgeo/geocaching/connector/gc/GCParser.java @@ -3,6 +3,7 @@ package cgeo.geocaching.connector.gc; import cgeo.geocaching.Geocache; import cgeo.geocaching.Image; import cgeo.geocaching.LogEntry; +import cgeo.geocaching.PocketQueryList; import cgeo.geocaching.R; import cgeo.geocaching.SearchResult; import cgeo.geocaching.Trackable; @@ -906,6 +907,17 @@ public abstract class GCParser { return searchByAny(cacheType, isSearchForMyCaches(userName), showCaptcha, params, recaptchaReceiver); } + public static SearchResult searchByPocket(final String pocketGuid, final CacheType cacheType, final boolean showCaptcha, RecaptchaReceiver recaptchaReceiver) { + if (StringUtils.isBlank(pocketGuid)) { + Log.e("GCParser.searchByPocket: No guid name given"); + return null; + } + + final Parameters params = new Parameters("pq", pocketGuid); + + return searchByAny(cacheType, false, showCaptcha, params, recaptchaReceiver); + } + public static SearchResult searchByOwner(final String userName, final CacheType cacheType, final boolean showCaptcha, RecaptchaReceiver recaptchaReceiver) { if (StringUtils.isBlank(userName)) { Log.e("GCParser.searchByOwner: No user name given"); @@ -978,6 +990,42 @@ public abstract class GCParser { return trackable; } + public static List<PocketQueryList> searchPocketQueryList() { + + final Parameters params = new Parameters(); + + final String page = Login.getRequestLogged("http://www.geocaching.com/pocket/default.aspx", params); + + if (StringUtils.isBlank(page)) { + Log.e("GCParser.searchPocketQueryList: No data from server"); + return null; + } + + String subPage = StringUtils.substringAfter(page, "class=\"PocketQueryListTable"); + if (StringUtils.isEmpty(subPage)) { + Log.e("GCParser.searchPocketQueryList: class \"PocketQueryListTable\" not found on page"); + return Collections.emptyList(); + } + + List<PocketQueryList> list = new ArrayList<PocketQueryList>(); + + final MatcherWrapper matcherPocket = new MatcherWrapper(GCConstants.PATTERN_LIST_PQ, subPage); + + while (matcherPocket.find()) { + int maxCaches; + try { + maxCaches = Integer.parseInt(matcherPocket.group(1)); + } catch (NumberFormatException e) { + maxCaches = 0; + Log.e("GCParser.searchPocketQueryList: Unable to parse max caches", e); + } + final PocketQueryList pqList = new PocketQueryList(matcherPocket.group(2), matcherPocket.group(3), maxCaches); + list.add(pqList); + } + + return list; + } + public static ImmutablePair<StatusCode, String> postLog(final String geocode, final String cacheid, final String[] viewstates, final LogType logType, final int year, final int month, final int day, final String log, final List<TrackableLog> trackables) { diff --git a/main/src/cgeo/geocaching/enumerations/CacheListType.java b/main/src/cgeo/geocaching/enumerations/CacheListType.java index 641947d..5c326a3 100644 --- a/main/src/cgeo/geocaching/enumerations/CacheListType.java +++ b/main/src/cgeo/geocaching/enumerations/CacheListType.java @@ -2,6 +2,7 @@ package cgeo.geocaching.enumerations; public enum CacheListType { OFFLINE, + POCKET, HISTORY, NEAREST, COORDINATE, diff --git a/main/src/cgeo/geocaching/loaders/AbstractSearchLoader.java b/main/src/cgeo/geocaching/loaders/AbstractSearchLoader.java index ebf29d1..1cc9706 100644 --- a/main/src/cgeo/geocaching/loaders/AbstractSearchLoader.java +++ b/main/src/cgeo/geocaching/loaders/AbstractSearchLoader.java @@ -17,6 +17,7 @@ public abstract class AbstractSearchLoader extends AsyncTaskLoader<SearchResult> public enum CacheListLoaderType { OFFLINE, + POCKET, HISTORY, NEAREST, COORDINATE, diff --git a/main/src/cgeo/geocaching/loaders/PocketGeocacheListLoader.java b/main/src/cgeo/geocaching/loaders/PocketGeocacheListLoader.java new file mode 100644 index 0000000..9256189 --- /dev/null +++ b/main/src/cgeo/geocaching/loaders/PocketGeocacheListLoader.java @@ -0,0 +1,28 @@ +package cgeo.geocaching.loaders; + +import cgeo.geocaching.SearchResult; +import cgeo.geocaching.connector.gc.GCParser; +import cgeo.geocaching.settings.Settings; + +import android.content.Context; + +public class PocketGeocacheListLoader extends AbstractSearchLoader { + private final String guid; + + public PocketGeocacheListLoader(Context context, String guid) { + super(context); + this.guid = guid; + } + + @Override + public SearchResult runSearch() { + + if (Settings.isGCConnectorActive()) { + return GCParser.searchByPocket(guid, Settings.getCacheType(), Settings.isShowCaptcha(), this); + } + + return new SearchResult(); + + } + +} |
