aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Tardieu <sam@rfc1149.net>2014-07-24 19:12:31 +0200
committerSamuel Tardieu <sam@rfc1149.net>2014-07-25 00:39:15 +0200
commit86adc0a0add7007d330c6daaee680ed36e5ead19 (patch)
tree4ae39d27d471a8bc39d0233a50603d5fe6a59183
parentdec5f91c0ec5059877b313fdd984c25b052f6f9a (diff)
downloadcgeo-86adc0a0add7007d330c6daaee680ed36e5ead19.zip
cgeo-86adc0a0add7007d330c6daaee680ed36e5ead19.tar.gz
cgeo-86adc0a0add7007d330c6daaee680ed36e5ead19.tar.bz2
fix #4044: blocking network access in avatar download
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCLogin.java18
-rw-r--r--main/src/cgeo/geocaching/settings/AbstractCheckCredentialsPreference.java18
-rw-r--r--main/src/cgeo/geocaching/settings/CheckECCredentialsPreference.java4
-rw-r--r--main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java4
-rw-r--r--main/src/cgeo/geocaching/ui/dialog/Dialogs.java29
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);
}
/**