aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
authorrsudev <rasch@munin-soft.de>2013-07-25 11:41:13 +0200
committerrsudev <rasch@munin-soft.de>2013-07-25 11:41:13 +0200
commit8be80d1ba64788720a9ac325e072459b7ace4216 (patch)
tree4c5ea29718649d4b56ef9a63cc8a3e37e73484a5 /main
parentbc4f10436c1528884749cca99bb8d5c9290c5e34 (diff)
downloadcgeo-8be80d1ba64788720a9ac325e072459b7ace4216.zip
cgeo-8be80d1ba64788720a9ac325e072459b7ace4216.tar.gz
cgeo-8be80d1ba64788720a9ac325e072459b7ace4216.tar.bz2
Implements #17, Reload reCAPTCHA
Took layout and ideas raised by @culmor30 Moved reCAPTCHA key and challenge retrieval to the RecaptchaReceiver
Diffstat (limited to 'main')
-rw-r--r--main/res/layout/recaptcha_dialog.xml35
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCParser.java19
-rw-r--r--main/src/cgeo/geocaching/connector/gc/SearchHandler.java21
-rw-r--r--main/src/cgeo/geocaching/loaders/AbstractSearchLoader.java30
-rw-r--r--main/src/cgeo/geocaching/loaders/RecaptchaReceiver.java6
5 files changed, 84 insertions, 27 deletions
diff --git a/main/res/layout/recaptcha_dialog.xml b/main/res/layout/recaptcha_dialog.xml
index ac9f746..3cae1fa 100644
--- a/main/res/layout/recaptcha_dialog.xml
+++ b/main/res/layout/recaptcha_dialog.xml
@@ -4,16 +4,31 @@
android:layout_height="fill_parent"
android:orientation="vertical" >
- <ImageView
- android:id="@+id/image"
- android:layout_width="220dip"
- android:layout_height="42dip"
- android:layout_gravity="center"
- android:layout_marginBottom="5dip"
- android:layout_marginTop="5dip"
- android:gravity="center"
- android:scaleType="fitXY"
- android:src="@null" />
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_horizontal"
+ android:orientation="horizontal" >
+
+ <ImageView
+ android:id="@+id/image"
+ android:layout_width="220dip"
+ android:layout_height="42dip"
+ android:layout_gravity="center"
+ android:layout_marginBottom="5dip"
+ android:layout_marginTop="5dip"
+ android:scaleType="fitXY"
+ android:src="@null" />
+
+ <ImageButton
+ android:id="@+id/button_recaptcha_refresh"
+ android:layout_width="50dp"
+ android:layout_height="50dp"
+ android:layout_gravity="center_vertical"
+ android:scaleType="centerInside"
+ android:src="@drawable/ic_menu_refresh" />
+
+ </LinearLayout>
<EditText
android:id="@+id/text"
diff --git a/main/src/cgeo/geocaching/connector/gc/GCParser.java b/main/src/cgeo/geocaching/connector/gc/GCParser.java
index e32f72d..7dc048a 100644
--- a/main/src/cgeo/geocaching/connector/gc/GCParser.java
+++ b/main/src/cgeo/geocaching/connector/gc/GCParser.java
@@ -78,20 +78,15 @@ public abstract class GCParser {
searchResult.viewstates = Login.getViewstates(page);
// recaptcha
- String recaptchaChallenge = null;
if (showCaptcha) {
final String recaptchaJsParam = TextUtils.getMatch(page, GCConstants.PATTERN_SEARCH_RECAPTCHA, false, null);
if (recaptchaJsParam != null) {
- final Parameters params = new Parameters("k", recaptchaJsParam.trim());
- final String recaptchaJs = Network.getResponseData(Network.getRequest("http://www.google.com/recaptcha/api/challenge", params));
+ thread.setKey(recaptchaJsParam.trim());
- if (StringUtils.isNotBlank(recaptchaJs)) {
- recaptchaChallenge = TextUtils.getMatch(recaptchaJs, GCConstants.PATTERN_SEARCH_RECAPTCHACHALLENGE, true, 1, null, true);
- }
+ thread.fetchChallenge();
}
- if (thread != null && StringUtils.isNotBlank(recaptchaChallenge)) {
- thread.setChallenge(recaptchaChallenge);
+ if (thread != null && StringUtils.isNotBlank(thread.getChallenge())) {
thread.notifyNeed();
}
}
@@ -276,7 +271,7 @@ public abstract class GCParser {
}
String recaptchaText = null;
- if (thread != null && recaptchaChallenge != null) {
+ if (thread != null && StringUtils.isNotBlank(thread.getChallenge())) {
if (thread.getText() == null) {
thread.waitForUser();
}
@@ -284,7 +279,7 @@ public abstract class GCParser {
recaptchaText = thread.getText();
}
- if (!cids.isEmpty() && (Settings.isPremiumMember() || showCaptcha) && (recaptchaChallenge == null || StringUtils.isNotBlank(recaptchaText))) {
+ if (!cids.isEmpty() && (Settings.isPremiumMember() || showCaptcha) && ((thread == null || StringUtils.isBlank(thread.getChallenge())) || StringUtils.isNotBlank(recaptchaText))) {
Log.i("Trying to get .loc for " + cids.size() + " caches");
try {
@@ -305,8 +300,8 @@ public abstract class GCParser {
params.put("CID", cid);
}
- if (recaptchaChallenge != null && StringUtils.isNotBlank(recaptchaText)) {
- params.put("recaptcha_challenge_field", recaptchaChallenge);
+ if (thread != null && StringUtils.isNotBlank(thread.getChallenge()) && StringUtils.isNotBlank(recaptchaText)) {
+ params.put("recaptcha_challenge_field", thread.getChallenge());
params.put("recaptcha_response_field", recaptchaText);
}
params.put("ctl00$ContentBody$uxDownloadLoc", "Download Waypoints");
diff --git a/main/src/cgeo/geocaching/connector/gc/SearchHandler.java b/main/src/cgeo/geocaching/connector/gc/SearchHandler.java
index 45832e4..4358399 100644
--- a/main/src/cgeo/geocaching/connector/gc/SearchHandler.java
+++ b/main/src/cgeo/geocaching/connector/gc/SearchHandler.java
@@ -15,11 +15,13 @@ import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
+import android.widget.ImageButton;
import android.widget.ImageView;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
import java.net.URL;
public class SearchHandler extends Handler {
@@ -37,7 +39,7 @@ public class SearchHandler extends Handler {
imageView.setImageBitmap(img);
}
} catch (Exception e) {
- // nothing
+ Log.e("Error setting reCAPTCHA image", e);
}
}
};
@@ -58,6 +60,20 @@ public class SearchHandler extends Handler {
imageView = (ImageView) view.findViewById(R.id.image);
+ ImageButton reloadButton = (ImageButton) view.findViewById(R.id.button_recaptcha_refresh);
+ reloadButton.setOnClickListener(new View.OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+ recaptchaThread.fetchChallenge();
+ try {
+ (new GetCaptchaThread(new URL("http://www.google.com/recaptcha/api/image?c=" + recaptchaThread.getChallenge()))).start();
+ } catch (MalformedURLException e) {
+ Log.e("Bad reCAPTCHA image url", e);
+ }
+ }
+ });
+
(new GetCaptchaThread(new URL("http://www.google.com/recaptcha/api/image?c=" + recaptchaThread.getChallenge()))).start();
dlg.setTitle(res.getString(R.string.caches_recaptcha_title));
@@ -76,7 +92,7 @@ public class SearchHandler extends Handler {
dlg.create().show();
}
} catch (Exception e) {
- // nothing
+ Log.e("Error in reCAPTCHA handler", e);
}
}
@@ -90,6 +106,7 @@ public class SearchHandler extends Handler {
@Override
public void run() {
try {
+ Log.d("Getting reCAPTCHA image from: " + uri.toString());
HttpURLConnection connection = (HttpURLConnection) uri.openConnection();
connection.setDoInput(true);
connection.connect();
diff --git a/main/src/cgeo/geocaching/loaders/AbstractSearchLoader.java b/main/src/cgeo/geocaching/loaders/AbstractSearchLoader.java
index ece5c2f..ebf29d1 100644
--- a/main/src/cgeo/geocaching/loaders/AbstractSearchLoader.java
+++ b/main/src/cgeo/geocaching/loaders/AbstractSearchLoader.java
@@ -1,7 +1,13 @@
package cgeo.geocaching.loaders;
import cgeo.geocaching.SearchResult;
+import cgeo.geocaching.connector.gc.GCConstants;
+import cgeo.geocaching.network.Network;
+import cgeo.geocaching.network.Parameters;
import cgeo.geocaching.utils.Log;
+import cgeo.geocaching.utils.TextUtils;
+
+import org.apache.commons.lang3.StringUtils;
import android.content.Context;
import android.os.Handler;
@@ -25,6 +31,7 @@ public abstract class AbstractSearchLoader extends AsyncTaskLoader<SearchResult>
private Handler recaptchaHandler = null;
private String recaptchaChallenge = null;
+ private String recaptchaKey = null;
private String recaptchaText = null;
private SearchResult search;
private boolean loading;
@@ -90,8 +97,27 @@ public abstract class AbstractSearchLoader extends AsyncTaskLoader<SearchResult>
}
@Override
- public void setChallenge(String challenge) {
- recaptchaChallenge = challenge;
+ public void setKey(String key) {
+ recaptchaKey = key;
+ }
+
+ @Override
+ public String getKey() {
+ return recaptchaKey;
+ }
+
+ @Override
+ public void fetchChallenge() {
+ recaptchaChallenge = null;
+
+ if (StringUtils.isNotEmpty(recaptchaKey)) {
+ final Parameters params = new Parameters("k", getKey());
+ final String recaptchaJs = Network.getResponseData(Network.getRequest("http://www.google.com/recaptcha/api/challenge", params));
+
+ if (StringUtils.isNotBlank(recaptchaJs)) {
+ recaptchaChallenge = TextUtils.getMatch(recaptchaJs, GCConstants.PATTERN_SEARCH_RECAPTCHACHALLENGE, true, 1, null, true);
+ }
+ }
}
@Override
diff --git a/main/src/cgeo/geocaching/loaders/RecaptchaReceiver.java b/main/src/cgeo/geocaching/loaders/RecaptchaReceiver.java
index f64bf89..fd5189c 100644
--- a/main/src/cgeo/geocaching/loaders/RecaptchaReceiver.java
+++ b/main/src/cgeo/geocaching/loaders/RecaptchaReceiver.java
@@ -8,7 +8,11 @@ public interface RecaptchaReceiver {
public String getChallenge();
- public void setChallenge(String challenge);
+ public void fetchChallenge();
+
+ public String getKey();
+
+ public void setKey(String key);
public void notifyNeed();