aboutsummaryrefslogtreecommitdiffstats
path: root/main/src
diff options
context:
space:
mode:
authormucek4 <tomaz@gorenc.org>2013-09-04 10:44:53 +0200
committermucek4 <tomaz@gorenc.org>2013-09-04 10:44:53 +0200
commitbd09f1887a8e6a8e9b919d4605c04155a3e73760 (patch)
tree29e65f4b81e983300f080a3509ee982576bfeb14 /main/src
parent8fe25127326d3b29d53cd3ef663aa6e46241fcbc (diff)
downloadcgeo-bd09f1887a8e6a8e9b919d4605c04155a3e73760.zip
cgeo-bd09f1887a8e6a8e9b919d4605c04155a3e73760.tar.gz
cgeo-bd09f1887a8e6a8e9b919d4605c04155a3e73760.tar.bz2
Fix 2830 Browse PQs as nearby search
Diffstat (limited to 'main/src')
-rw-r--r--main/src/cgeo/geocaching/Intents.java1
-rw-r--r--main/src/cgeo/geocaching/MainActivity.java17
-rw-r--r--main/src/cgeo/geocaching/PocketQueryList.java124
-rw-r--r--main/src/cgeo/geocaching/cgeocaches.java19
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCConstants.java1
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCParser.java48
-rw-r--r--main/src/cgeo/geocaching/enumerations/CacheListType.java1
-rw-r--r--main/src/cgeo/geocaching/loaders/AbstractSearchLoader.java1
-rw-r--r--main/src/cgeo/geocaching/loaders/PocketGeocacheListLoader.java28
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();
+
+ }
+
+}