diff options
| author | Samuel Tardieu <sam@rfc1149.net> | 2014-01-17 23:02:46 +0100 |
|---|---|---|
| committer | Samuel Tardieu <sam@rfc1149.net> | 2014-01-17 23:05:02 +0100 |
| commit | 624876a771f4a7f8d8ae1c25b9cf80d5fa5e74e7 (patch) | |
| tree | ae75e3544e762a3c9c89bf640ba256f718c3a701 /main/src | |
| parent | b9a26e88108d1926a9a40b9e41e5c06636614ce9 (diff) | |
| download | cgeo-624876a771f4a7f8d8ae1c25b9cf80d5fa5e74e7.zip cgeo-624876a771f4a7f8d8ae1c25b9cf80d5fa5e74e7.tar.gz cgeo-624876a771f4a7f8d8ae1c25b9cf80d5fa5e74e7.tar.bz2 | |
refactoring: cleanup logic flow of RecaptchaHandler
Diffstat (limited to 'main/src')
4 files changed, 117 insertions, 129 deletions
diff --git a/main/src/cgeo/geocaching/CacheListActivity.java b/main/src/cgeo/geocaching/CacheListActivity.java index b581411..a12663d 100644 --- a/main/src/cgeo/geocaching/CacheListActivity.java +++ b/main/src/cgeo/geocaching/CacheListActivity.java @@ -8,7 +8,7 @@ import cgeo.geocaching.activity.Progress; import cgeo.geocaching.apps.cache.navi.NavigationAppFactory; import cgeo.geocaching.apps.cachelist.CacheListAppFactory; import cgeo.geocaching.compatibility.Compatibility; -import cgeo.geocaching.connector.gc.SearchHandler; +import cgeo.geocaching.connector.gc.RecaptchaHandler; import cgeo.geocaching.enumerations.CacheListType; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.enumerations.LoadFlags; @@ -1643,7 +1643,7 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA showFooterLoadingCaches(); if (loader != null) { - loader.setRecaptchaHandler(new SearchHandler(this, res, loader)); + loader.setRecaptchaHandler(new RecaptchaHandler(this, loader)); } return loader; } diff --git a/main/src/cgeo/geocaching/connector/gc/RecaptchaHandler.java b/main/src/cgeo/geocaching/connector/gc/RecaptchaHandler.java new file mode 100644 index 0000000..db7b390 --- /dev/null +++ b/main/src/cgeo/geocaching/connector/gc/RecaptchaHandler.java @@ -0,0 +1,113 @@ +package cgeo.geocaching.connector.gc; + +import cgeo.geocaching.R; +import cgeo.geocaching.loaders.RecaptchaReceiver; +import cgeo.geocaching.network.Network; +import cgeo.geocaching.utils.Log; + +import org.apache.commons.io.IOUtils; +import rx.Observable; +import rx.android.observables.AndroidObservable; +import rx.concurrency.Schedulers; +import rx.util.functions.Action1; +import rx.util.functions.Func0; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.os.Handler; +import android.os.Message; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageButton; +import android.widget.ImageView; + +import java.io.InputStream; + +public class RecaptchaHandler extends Handler { + final public static int SHOW_CAPTCHA = 1; + + final private Activity activity; + final private RecaptchaReceiver recaptchaReceiver; + + public RecaptchaHandler(final Activity activity, final RecaptchaReceiver recaptchaReceiver) { + this.activity = activity; + this.recaptchaReceiver = recaptchaReceiver; + } + + private void loadChallenge(final ImageView imageView, final View reloadButton) { + getCaptcha().subscribe(new Action1<Bitmap>() { + @Override + public void call(final Bitmap bitmap) { + imageView.setImageBitmap(bitmap); + } + }, new Action1<Throwable>() { + @Override + public void call(final Throwable throwable) { + // Do nothing + } + }); + reloadButton.setEnabled(true); + } + + @Override + public void handleMessage(Message msg) { + if (msg.what == SHOW_CAPTCHA) { + final AlertDialog.Builder dlg = new AlertDialog.Builder(activity); + final View view = activity.getLayoutInflater().inflate(R.layout.recaptcha_dialog, null); + + final ImageView imageView = (ImageView) view.findViewById(R.id.image); + + final ImageButton reloadButton = (ImageButton) view.findViewById(R.id.button_recaptcha_refresh); + reloadButton.setEnabled(false); + reloadButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + recaptchaReceiver.fetchChallenge(); + loadChallenge(imageView, reloadButton); + } + }); + + loadChallenge(imageView, reloadButton); + + dlg.setTitle(activity.getString(R.string.caches_recaptcha_title)); + dlg.setView(view); + dlg.setNeutralButton(activity.getString(R.string.caches_recaptcha_continue), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + final String text = ((EditText) view.findViewById(R.id.text)).getText().toString(); + recaptchaReceiver.setText(text); + dialog.cancel(); + } + }); + + dlg.create().show(); + } + } + + private Observable<Bitmap> getCaptcha() { + return AndroidObservable.fromActivity(activity, + Observable.defer(new Func0<Observable<? extends Bitmap>>() { + @Override + public Observable<? extends Bitmap> call() { + InputStream is = null; + try { + final String url = "http://www.google.com/recaptcha/api/image?c=" + recaptchaReceiver.getChallenge(); + Log.d("Getting reCAPTCHA image from " + url); + is = Network.getRequest(url).getEntity().getContent(); + final Bitmap img = BitmapFactory.decodeStream(is); + IOUtils.closeQuietly(is); + return Observable.from(img); + } catch (final Exception e) { + Log.e("RecaptchaHandler.getCaptcha", e); + return Observable.error(e); + } finally { + IOUtils.closeQuietly(is); + } + } + }).subscribeOn(Schedulers.threadPoolForIO())); + } + +} diff --git a/main/src/cgeo/geocaching/connector/gc/SearchHandler.java b/main/src/cgeo/geocaching/connector/gc/SearchHandler.java deleted file mode 100644 index 795ed2f..0000000 --- a/main/src/cgeo/geocaching/connector/gc/SearchHandler.java +++ /dev/null @@ -1,126 +0,0 @@ -package cgeo.geocaching.connector.gc; - -import cgeo.geocaching.R; -import cgeo.geocaching.loaders.RecaptchaReceiver; -import cgeo.geocaching.utils.Log; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.res.Resources; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.os.Handler; -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 { - private Activity activity = null; - private Resources res = null; - private RecaptchaReceiver recaptchaThread = null; - private ImageView imageView = null; - private Bitmap img = null; - - private Handler imgHandler = new Handler() { - @Override - public void handleMessage(Message msg) { - try { - if (img != null && imageView != null) { - imageView.setImageBitmap(img); - } - } catch (Exception e) { - Log.e("Error setting reCAPTCHA image", e); - } - } - }; - - public SearchHandler(Activity activityIn, Resources resIn, RecaptchaReceiver recaptchaThreadIn) { - activity = activityIn; - res = resIn; - recaptchaThread = recaptchaThreadIn; - } - - @Override - public void handleMessage(Message msg) { - try { - if (msg.what == 1) { - final AlertDialog.Builder dlg = new AlertDialog.Builder(activity); - final LayoutInflater inflater = activity.getLayoutInflater(); - final View view = inflater.inflate(R.layout.recaptcha_dialog, null); - - 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)); - dlg.setView(view); - dlg.setNeutralButton(res.getString(R.string.caches_recaptcha_continue), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - final String text = ((EditText) view.findViewById(R.id.text)).getText().toString(); - - recaptchaThread.setText(text); - - dialog.cancel(); - } - }); - - dlg.create().show(); - } - } catch (MalformedURLException e) { - Log.e("Error in reCAPTCHA handler", e); - } - } - - private class GetCaptchaThread extends Thread { - private URL uri = null; - - public GetCaptchaThread(URL uriIn) { - uri = uriIn; - } - - @Override - public void run() { - try { - Log.d("Getting reCAPTCHA image from: " + uri.toString()); - HttpURLConnection connection = (HttpURLConnection) uri.openConnection(); - connection.setDoInput(true); - connection.connect(); - - InputStream is = connection.getInputStream(); - - img = BitmapFactory.decodeStream(is); - - is.close(); - - imgHandler.sendEmptyMessage(0); - } catch (IOException e) { - Log.e("Failed to download reCAPTCHA image", e); - } - } - } -} diff --git a/main/src/cgeo/geocaching/loaders/AbstractSearchLoader.java b/main/src/cgeo/geocaching/loaders/AbstractSearchLoader.java index e3306f3..c4f10c9 100644 --- a/main/src/cgeo/geocaching/loaders/AbstractSearchLoader.java +++ b/main/src/cgeo/geocaching/loaders/AbstractSearchLoader.java @@ -2,6 +2,7 @@ package cgeo.geocaching.loaders; import cgeo.geocaching.SearchResult; import cgeo.geocaching.connector.gc.GCConstants; +import cgeo.geocaching.connector.gc.RecaptchaHandler; import cgeo.geocaching.network.Network; import cgeo.geocaching.network.Parameters; import cgeo.geocaching.utils.Log; @@ -83,7 +84,7 @@ public abstract class AbstractSearchLoader extends AsyncTaskLoader<SearchResult> @Override public void notifyNeed() { if (recaptchaHandler != null) { - recaptchaHandler.sendEmptyMessage(1); + recaptchaHandler.sendEmptyMessage(RecaptchaHandler.SHOW_CAPTCHA); } } |
