diff options
| author | Samuel Tardieu <sam@rfc1149.net> | 2014-07-24 19:12:31 +0200 |
|---|---|---|
| committer | Samuel Tardieu <sam@rfc1149.net> | 2014-07-25 00:39:15 +0200 |
| commit | 86adc0a0add7007d330c6daaee680ed36e5ead19 (patch) | |
| tree | 4ae39d27d471a8bc39d0233a50603d5fe6a59183 | |
| parent | dec5f91c0ec5059877b313fdd984c25b052f6f9a (diff) | |
| download | cgeo-86adc0a0add7007d330c6daaee680ed36e5ead19.zip cgeo-86adc0a0add7007d330c6daaee680ed36e5ead19.tar.gz cgeo-86adc0a0add7007d330c6daaee680ed36e5ead19.tar.bz2 | |
fix #4044: blocking network access in avatar download
5 files changed, 53 insertions, 20 deletions
diff --git a/main/src/cgeo/geocaching/connector/gc/GCLogin.java b/main/src/cgeo/geocaching/connector/gc/GCLogin.java index 4a7905b..e84851e 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCLogin.java +++ b/main/src/cgeo/geocaching/connector/gc/GCLogin.java @@ -14,13 +14,18 @@ import cgeo.geocaching.utils.MatcherWrapper; import cgeo.geocaching.utils.TextUtils; import ch.boye.httpclientandroidlib.HttpResponse; + import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import android.graphics.drawable.BitmapDrawable; +import rx.Observable; +import rx.functions.Func0; +import rx.util.async.Async; + +import android.graphics.drawable.Drawable; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -253,7 +258,7 @@ public class GCLogin extends AbstractLogin { return false; } - public BitmapDrawable downloadAvatarAndGetMemberStatus() { + public Observable<Drawable> downloadAvatarAndGetMemberStatus() { try { final String responseData = StringUtils.defaultString(Network.getResponseData(Network.getRequest("http://www.geocaching.com/my/"))); final String profile = TextUtils.replaceWhitespace(responseData); @@ -267,8 +272,13 @@ public class GCLogin extends AbstractLogin { final String avatarURL = TextUtils.getMatch(profile, GCConstants.PATTERN_AVATAR_IMAGE_PROFILE_PAGE, false, null); if (null != avatarURL) { - final HtmlImage imgGetter = new HtmlImage("", false, 0, false); - return imgGetter.getDrawable(avatarURL.replace("avatar", "user/large")); + return Async.start(new Func0<Drawable>() { + @Override + public Drawable call() { + final HtmlImage imgGetter = new HtmlImage("", false, 0, false); + return imgGetter.getDrawable(avatarURL.replace("avatar", "user/large")); + } + }); } // No match? There may be no avatar set by user. Log.d("No avatar set for user"); diff --git a/main/src/cgeo/geocaching/settings/AbstractCheckCredentialsPreference.java b/main/src/cgeo/geocaching/settings/AbstractCheckCredentialsPreference.java index 8a9f279..2f83028 100644 --- a/main/src/cgeo/geocaching/settings/AbstractCheckCredentialsPreference.java +++ b/main/src/cgeo/geocaching/settings/AbstractCheckCredentialsPreference.java @@ -10,6 +10,7 @@ import cgeo.geocaching.utils.RxUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; +import rx.Observable; import rx.android.observables.AndroidObservable; import rx.functions.Action1; import rx.functions.Func0; @@ -39,7 +40,14 @@ public abstract class AbstractCheckCredentialsPreference extends AbstractClickab protected abstract ImmutablePair<String, String> getCredentials(); - protected abstract ImmutablePair<StatusCode, ? extends Drawable> login(); + /** + * Try to login. + * + * @return A pair containing the status code, and, if the status code is + * <tt>NO_ERROR</tt>, an observable (or <tt>null</tt>) wihch may emit + * the avatar for the user (every drawable will be shown in place of the previous one). + */ + protected abstract ImmutablePair<StatusCode, Observable<Drawable>> login(); private class LoginCheckClickListener implements OnPreferenceClickListener { final private SettingsActivity settingsActivity; @@ -66,14 +74,14 @@ public abstract class AbstractCheckCredentialsPreference extends AbstractClickab loginDialog.setCancelable(false); Cookies.clearCookies(); - AndroidObservable.bindActivity(settingsActivity, Async.start(new Func0<ImmutablePair<StatusCode, ? extends Drawable>>() { + AndroidObservable.bindActivity(settingsActivity, Async.start(new Func0<ImmutablePair<StatusCode, Observable<Drawable>>>() { @Override - public ImmutablePair<StatusCode, ? extends Drawable> call() { + public ImmutablePair<StatusCode, Observable<Drawable>> call() { return login(); } - })).subscribeOn(RxUtils.networkScheduler).subscribe(new Action1<ImmutablePair<StatusCode, ? extends Drawable>>() { + })).subscribeOn(RxUtils.networkScheduler).subscribe(new Action1<ImmutablePair<StatusCode, Observable<Drawable>>>() { @Override - public void call(final ImmutablePair<StatusCode, ? extends Drawable> loginInfo) { + public void call(final ImmutablePair<StatusCode, Observable<Drawable>> loginInfo) { loginDialog.dismiss(); if (loginInfo.getLeft() == StatusCode.NO_ERROR) { Dialogs.message(settingsActivity, R.string.init_login_popup, R.string.init_login_popup_ok, loginInfo.getRight()); diff --git a/main/src/cgeo/geocaching/settings/CheckECCredentialsPreference.java b/main/src/cgeo/geocaching/settings/CheckECCredentialsPreference.java index 027858e..f5d9ab5 100644 --- a/main/src/cgeo/geocaching/settings/CheckECCredentialsPreference.java +++ b/main/src/cgeo/geocaching/settings/CheckECCredentialsPreference.java @@ -6,6 +6,8 @@ import cgeo.geocaching.enumerations.StatusCode; import org.apache.commons.lang3.tuple.ImmutablePair; +import rx.Observable; + import android.content.Context; import android.graphics.drawable.Drawable; import android.util.AttributeSet; @@ -26,7 +28,7 @@ public class CheckECCredentialsPreference extends AbstractCheckCredentialsPrefer } @Override - protected ImmutablePair<StatusCode, Drawable> login() { + protected ImmutablePair<StatusCode, Observable<Drawable>> login() { return new ImmutablePair<>(ECLogin.getInstance().login(), null); } } diff --git a/main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java b/main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java index 2a05f47..0269f3b 100644 --- a/main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java +++ b/main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java @@ -5,6 +5,8 @@ import cgeo.geocaching.enumerations.StatusCode; import org.apache.commons.lang3.tuple.ImmutablePair; +import rx.Observable; + import android.content.Context; import android.graphics.drawable.Drawable; import android.util.AttributeSet; @@ -25,7 +27,7 @@ public class CheckGcCredentialsPreference extends AbstractCheckCredentialsPrefer } @Override - protected ImmutablePair<StatusCode, ? extends Drawable> login() { + protected ImmutablePair<StatusCode, Observable<Drawable>> login() { final StatusCode loginResult = GCLogin.getInstance().login(); switch (loginResult) { case NO_ERROR: diff --git a/main/src/cgeo/geocaching/ui/dialog/Dialogs.java b/main/src/cgeo/geocaching/ui/dialog/Dialogs.java index 79775fb..027e69d 100644 --- a/main/src/cgeo/geocaching/ui/dialog/Dialogs.java +++ b/main/src/cgeo/geocaching/ui/dialog/Dialogs.java @@ -3,10 +3,13 @@ package cgeo.geocaching.ui.dialog; import cgeo.geocaching.CgeoApplication; import cgeo.geocaching.R; import cgeo.geocaching.settings.Settings; +import cgeo.geocaching.utils.ImageUtils; import org.apache.commons.lang3.StringUtils; import org.eclipse.jdt.annotation.Nullable; +import rx.Observable; +import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import android.app.Activity; @@ -246,7 +249,7 @@ public final class Dialogs { } /** - * Show a message dialog with a single "OK" button and an icon. + * Show a message dialog with a single "OK" button and an eventual icon. * * @param context * activity owning the dialog @@ -254,10 +257,10 @@ public final class Dialogs { * message dialog title * @param message * message dialog content - * @param icon - * message dialog title icon + * @param iconObservable + * observable (may be <tt>null</tt>) containing the icon(s) to set */ - public static void message(final Activity context, final @Nullable String title, final String message, final @Nullable Drawable icon) { + public static void message(final Activity context, final @Nullable String title, final String message, final Observable<Drawable> iconObservable) { Builder builder = new AlertDialog.Builder(context) .setMessage(message) .setCancelable(true) @@ -265,10 +268,18 @@ public final class Dialogs { if (title != null) { builder.setTitle(title); } - if (icon != null) { - builder.setIcon(icon); + builder.setIcon(ImageUtils.getTransparent1x1Drawable(context.getResources())); + + final AlertDialog dialog = builder.create(); + if (iconObservable != null) { + iconObservable.observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<Drawable>() { + @Override + public void call(final Drawable drawable) { + dialog.setIcon(drawable); + } + }); } - builder.create().show(); + dialog.show(); } /** @@ -311,8 +322,8 @@ public final class Dialogs { * @param icon * message dialog title icon */ - public static void message(final Activity context, final int title, final int message, final @Nullable Drawable icon) { - message(context, getString(title), getString(message), icon); + public static void message(final Activity context, final int title, final int message, final Observable<Drawable> iconObservable) { + message(context, getString(title), getString(message), iconObservable); } /** |
