diff options
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(); |
