aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
authorSamuel Tardieu <sam@rfc1149.net>2014-04-05 14:55:40 +0200
committerSamuel Tardieu <sam@rfc1149.net>2014-04-05 18:23:20 +0200
commitcca4c9b0bcc1bd7742d419166fd5cfd5415fde9e (patch)
tree5c88f703e8130e07ff98e0f13277a8fddc44d2b1 /main
parentde71f9ba50bf7ee8f8987402b52912b014c5b460 (diff)
downloadcgeo-cca4c9b0bcc1bd7742d419166fd5cfd5415fde9e.zip
cgeo-cca4c9b0bcc1bd7742d419166fd5cfd5415fde9e.tar.gz
cgeo-cca4c9b0bcc1bd7742d419166fd5cfd5415fde9e.tar.bz2
Do not use AndroidObservable
This lets us return to an unmodified version of RxJava.
Diffstat (limited to 'main')
-rw-r--r--main/libs/rxjava-android-0.17.5.jar (renamed from main/libs/rxjava-android-0.17.1-cgeo.jar)bin36413 -> 36559 bytes
-rw-r--r--main/libs/rxjava-async-util-0.17.5.jar (renamed from main/libs/rxjava-async-util-0.17.1-cgeo.jar)bin48346 -> 47317 bytes
-rw-r--r--main/libs/rxjava-core-0.17.1-cgeo.jarbin716623 -> 0 bytes
-rw-r--r--main/libs/rxjava-core-0.17.5.jarbin0 -> 746598 bytes
-rw-r--r--main/src/cgeo/geocaching/AbstractPopupActivity.java7
-rw-r--r--main/src/cgeo/geocaching/CacheDetailActivity.java119
-rw-r--r--main/src/cgeo/geocaching/DataStore.java7
-rw-r--r--main/src/cgeo/geocaching/MainActivity.java10
-rw-r--r--main/src/cgeo/geocaching/PocketQueryList.java7
-rw-r--r--main/src/cgeo/geocaching/StatusFragment.java4
-rw-r--r--main/src/cgeo/geocaching/TrackableActivity.java16
-rw-r--r--main/src/cgeo/geocaching/connector/gc/RecaptchaHandler.java72
-rw-r--r--main/src/cgeo/geocaching/network/HtmlImage.java10
-rw-r--r--main/src/cgeo/geocaching/sensors/GeoDirHandler.java1
-rw-r--r--main/src/cgeo/geocaching/settings/AbstractCheckCredentialsPreference.java16
-rw-r--r--main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java6
-rw-r--r--main/src/cgeo/geocaching/settings/RegisterSend2CgeoPreference.java48
-rw-r--r--main/src/cgeo/geocaching/ui/ImagesList.java15
-rw-r--r--main/src/cgeo/geocaching/utils/RxUtils.java51
19 files changed, 222 insertions, 167 deletions
diff --git a/main/libs/rxjava-android-0.17.1-cgeo.jar b/main/libs/rxjava-android-0.17.5.jar
index 1120cb5..42b7f16 100644
--- a/main/libs/rxjava-android-0.17.1-cgeo.jar
+++ b/main/libs/rxjava-android-0.17.5.jar
Binary files differ
diff --git a/main/libs/rxjava-async-util-0.17.1-cgeo.jar b/main/libs/rxjava-async-util-0.17.5.jar
index 644daab..bc71622 100644
--- a/main/libs/rxjava-async-util-0.17.1-cgeo.jar
+++ b/main/libs/rxjava-async-util-0.17.5.jar
Binary files differ
diff --git a/main/libs/rxjava-core-0.17.1-cgeo.jar b/main/libs/rxjava-core-0.17.1-cgeo.jar
deleted file mode 100644
index 75692f2..0000000
--- a/main/libs/rxjava-core-0.17.1-cgeo.jar
+++ /dev/null
Binary files differ
diff --git a/main/libs/rxjava-core-0.17.5.jar b/main/libs/rxjava-core-0.17.5.jar
new file mode 100644
index 0000000..5a54704
--- /dev/null
+++ b/main/libs/rxjava-core-0.17.5.jar
Binary files differ
diff --git a/main/src/cgeo/geocaching/AbstractPopupActivity.java b/main/src/cgeo/geocaching/AbstractPopupActivity.java
index 82543b0..683579f 100644
--- a/main/src/cgeo/geocaching/AbstractPopupActivity.java
+++ b/main/src/cgeo/geocaching/AbstractPopupActivity.java
@@ -14,13 +14,12 @@ import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.ui.CacheDetailsCreator;
import cgeo.geocaching.ui.LoggingUI;
import cgeo.geocaching.utils.Log;
+import cgeo.geocaching.utils.RxUtils;
import org.apache.commons.lang3.StringUtils;
import rx.Observable;
-import rx.android.observables.AndroidObservable;
import rx.functions.Action1;
import rx.functions.Func0;
-import rx.schedulers.Schedulers;
import android.graphics.Rect;
import android.os.Bundle;
@@ -80,13 +79,13 @@ public abstract class AbstractPopupActivity extends AbstractActivity implements
if (!cache.supportsGCVote()) {
return;
}
- AndroidObservable.bindActivity(this, Observable.defer(new Func0<Observable<GCVoteRating>>() {
+ RxUtils.subscribeOnIOThenUI(Observable.defer(new Func0<Observable<GCVoteRating>>() {
@Override
public Observable<GCVoteRating> call() {
final GCVoteRating rating = GCVote.getRating(cache.getGuid(), geocode);
return rating != null ? Observable.just(rating) : Observable.<GCVoteRating>empty();
}
- }).subscribeOn(Schedulers.io())).subscribe(new Action1<GCVoteRating>() {
+ }), new Action1<GCVoteRating>() {
@Override
public void call(final GCVoteRating rating) {
cache.setRating(rating.getRating());
diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java
index f525955..0f86de6 100644
--- a/main/src/cgeo/geocaching/CacheDetailActivity.java
+++ b/main/src/cgeo/geocaching/CacheDetailActivity.java
@@ -45,6 +45,7 @@ import cgeo.geocaching.utils.CryptUtils;
import cgeo.geocaching.utils.ImageUtils;
import cgeo.geocaching.utils.Log;
import cgeo.geocaching.utils.MatcherWrapper;
+import cgeo.geocaching.utils.RxUtils;
import cgeo.geocaching.utils.SimpleCancellableHandler;
import cgeo.geocaching.utils.SimpleHandler;
import cgeo.geocaching.utils.TextUtils;
@@ -61,7 +62,6 @@ import rx.Observer;
import rx.Scheduler.Inner;
import rx.Subscriber;
import rx.Subscription;
-import rx.android.observables.AndroidObservable;
import rx.functions.Action1;
import rx.schedulers.Schedulers;
@@ -878,7 +878,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
view = (ScrollView) getLayoutInflater().inflate(R.layout.cachedetail_details_page, null);
// Start loading preview map
- AndroidObservable.bindActivity(CacheDetailActivity.this, previewMap.subscribeOn(Schedulers.io())).subscribe(new Action1<BitmapDrawable>() {
+ RxUtils.subscribeOnIOThenUI(previewMap, new Action1<BitmapDrawable>() {
@Override
public void call(final BitmapDrawable image) {
final Bitmap bitmap = image.getBitmap();
@@ -1605,71 +1605,70 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc
}
});
- AndroidObservable.bindActivity(this, producer.subscribeOn(Schedulers.io()))
- .subscribe(new Observer<Spanned>() {
- @Override
- public void onCompleted() {
- if (null != loadingIndicatorView) {
- loadingIndicatorView.setVisibility(View.GONE);
- }
- }
+ RxUtils.subscribeOnIOThenUI(producer, new Observer<Spanned>() {
+ @Override
+ public void onCompleted() {
+ if (null != loadingIndicatorView) {
+ loadingIndicatorView.setVisibility(View.GONE);
+ }
+ }
- @Override
- public void onError(final Throwable throwable) {
- showToast(res.getString(R.string.err_load_descr_failed));
- }
+ @Override
+ public void onError(final Throwable throwable) {
+ showToast(res.getString(R.string.err_load_descr_failed));
+ }
- @Override
- public void onNext(final Spanned description) {
- if (StringUtils.isNotBlank(descriptionString)) {
- try {
- descriptionView.setText(description, TextView.BufferType.SPANNABLE);
- } catch (final Exception e) {
- // On 4.1, there is sometimes a crash on measuring the layout: https://code.google.com/p/android/issues/detail?id=35412
- Log.e("Android bug setting text: ", e);
- // remove the formatting by converting to a simple string
- descriptionView.setText(description.toString());
- }
- descriptionView.setMovementMethod(AnchorAwareLinkMovementMethod.getInstance());
- fixTextColor(descriptionString);
- descriptionView.setVisibility(View.VISIBLE);
- registerForContextMenu(descriptionView);
+ @Override
+ public void onNext(final Spanned description) {
+ if (StringUtils.isNotBlank(descriptionString)) {
+ try {
+ descriptionView.setText(description, TextView.BufferType.SPANNABLE);
+ } catch (final Exception e) {
+ // On 4.1, there is sometimes a crash on measuring the layout: https://code.google.com/p/android/issues/detail?id=35412
+ Log.e("Android bug setting text: ", e);
+ // remove the formatting by converting to a simple string
+ descriptionView.setText(description.toString());
+ }
+ descriptionView.setMovementMethod(AnchorAwareLinkMovementMethod.getInstance());
+ fixTextColor(descriptionString);
+ descriptionView.setVisibility(View.VISIBLE);
+ registerForContextMenu(descriptionView);
+ }
+ }
+
+ /**
+ * Handle caches with black font color in dark skin and white font color in light skin
+ * by changing background color of the view
+ *
+ * @param text
+ * to be checked
+ */
+ private void fixTextColor(final String text) {
+ int backcolor;
+ if (Settings.isLightSkin()) {
+ backcolor = color.white;
+
+ for (final Pattern pattern : LIGHT_COLOR_PATTERNS) {
+ final MatcherWrapper matcher = new MatcherWrapper(pattern, text);
+ if (matcher.find()) {
+ descriptionView.setBackgroundResource(color.darker_gray);
+ return;
}
}
+ } else {
+ backcolor = color.black;
- /**
- * Handle caches with black font color in dark skin and white font color in light skin
- * by changing background color of the view
- *
- * @param text
- * to be checked
- */
- private void fixTextColor(final String text) {
- int backcolor;
- if (Settings.isLightSkin()) {
- backcolor = color.white;
-
- for (final Pattern pattern : LIGHT_COLOR_PATTERNS) {
- final MatcherWrapper matcher = new MatcherWrapper(pattern, text);
- if (matcher.find()) {
- descriptionView.setBackgroundResource(color.darker_gray);
- return;
- }
- }
- } else {
- backcolor = color.black;
-
- for (final Pattern pattern : DARK_COLOR_PATTERNS) {
- final MatcherWrapper matcher = new MatcherWrapper(pattern, text);
- if (matcher.find()) {
- descriptionView.setBackgroundResource(color.darker_gray);
- return;
- }
- }
+ for (final Pattern pattern : DARK_COLOR_PATTERNS) {
+ final MatcherWrapper matcher = new MatcherWrapper(pattern, text);
+ if (matcher.find()) {
+ descriptionView.setBackgroundResource(color.darker_gray);
+ return;
}
- descriptionView.setBackgroundResource(backcolor);
}
- });
+ }
+ descriptionView.setBackgroundResource(backcolor);
+ }
+ });
}
private class WaypointsViewCreator extends AbstractCachingPageViewCreator<ListView> {
diff --git a/main/src/cgeo/geocaching/DataStore.java b/main/src/cgeo/geocaching/DataStore.java
index f627d7d..ee6c9ef 100644
--- a/main/src/cgeo/geocaching/DataStore.java
+++ b/main/src/cgeo/geocaching/DataStore.java
@@ -20,16 +20,15 @@ import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.ui.dialog.Dialogs;
import cgeo.geocaching.utils.FileUtils;
import cgeo.geocaching.utils.Log;
+import cgeo.geocaching.utils.RxUtils;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.jdt.annotation.NonNull;
-import rx.android.observables.AndroidObservable;
import rx.functions.Action1;
import rx.functions.Func0;
import rx.functions.Func1;
-import rx.schedulers.Schedulers;
import rx.util.async.Async;
import android.app.Activity;
@@ -393,7 +392,7 @@ public class DataStore {
*/
public static void moveDatabase(final Activity fromActivity) {
final ProgressDialog dialog = ProgressDialog.show(fromActivity, fromActivity.getString(R.string.init_dbmove_dbmove), fromActivity.getString(R.string.init_dbmove_running), true, false);
- AndroidObservable.bindActivity(fromActivity, Async.fromFunc0(new Func0<Boolean>() {
+ RxUtils.subscribeOnIOThenUI(Async.fromCallable(new Func0<Boolean>() {
@Override
public Boolean call() {
if (!LocalStorage.isExternalStorageAvailable()) {
@@ -418,7 +417,7 @@ public class DataStore {
init();
return true;
}
- })).subscribeOn(Schedulers.io()).subscribe(new Action1<Boolean>() {
+ }), new Action1<Boolean>() {
@Override
public void call(final Boolean success) {
dialog.dismiss();
diff --git a/main/src/cgeo/geocaching/MainActivity.java b/main/src/cgeo/geocaching/MainActivity.java
index 3295d04..b82614b 100644
--- a/main/src/cgeo/geocaching/MainActivity.java
+++ b/main/src/cgeo/geocaching/MainActivity.java
@@ -21,6 +21,7 @@ import cgeo.geocaching.ui.Formatter;
import cgeo.geocaching.ui.dialog.Dialogs;
import cgeo.geocaching.utils.DatabaseBackupUtils;
import cgeo.geocaching.utils.Log;
+import cgeo.geocaching.utils.RxUtils;
import cgeo.geocaching.utils.Version;
import com.google.zxing.integration.android.IntentIntegrator;
@@ -29,9 +30,7 @@ import org.apache.commons.lang3.StringUtils;
import rx.Observable;
import rx.Observable.OnSubscribe;
import rx.Subscriber;
-import rx.android.observables.AndroidObservable;
import rx.functions.Action1;
-import rx.schedulers.Schedulers;
import rx.subscriptions.Subscriptions;
import android.app.AlertDialog;
@@ -551,10 +550,9 @@ public class MainActivity extends AbstractActivity {
subscriber.onError(e);
}
}
- }).subscribeOn(Schedulers.io());
- AndroidObservable.bindActivity(MainActivity.this, address)
- .onErrorResumeNext(Observable.from(geo.getCoords().toString()))
- .subscribe(new Action1<String>() {
+ });
+ RxUtils.subscribeOnIOThenUI(address.onErrorResumeNext(Observable.from(geo.getCoords().toString())),
+ new Action1<String>() {
@Override
public void call(final String address) {
navLocation.setText(address);
diff --git a/main/src/cgeo/geocaching/PocketQueryList.java b/main/src/cgeo/geocaching/PocketQueryList.java
index e624808..e748b29 100644
--- a/main/src/cgeo/geocaching/PocketQueryList.java
+++ b/main/src/cgeo/geocaching/PocketQueryList.java
@@ -2,13 +2,12 @@ package cgeo.geocaching;
import cgeo.geocaching.activity.ActivityMixin;
import cgeo.geocaching.connector.gc.GCParser;
+import cgeo.geocaching.utils.RxUtils;
import org.apache.commons.collections4.CollectionUtils;
import rx.Observable;
import rx.Observable.OnSubscribe;
import rx.Subscriber;
-import rx.android.observables.AndroidObservable;
-import rx.schedulers.Schedulers;
import rx.functions.Action1;
import android.app.Activity;
@@ -46,13 +45,13 @@ public final class PocketQueryList {
public static void promptForListSelection(final Activity activity, final Action1<PocketQueryList> runAfterwards) {
final Dialog waitDialog = ProgressDialog.show(activity, activity.getString(R.string.search_pocket_title), activity.getString(R.string.search_pocket_loading), true, true);
- AndroidObservable.bindActivity(activity, Observable.create(new OnSubscribe<List<PocketQueryList>>() {
+ RxUtils.subscribeOnIOThenUI(Observable.create(new OnSubscribe<List<PocketQueryList>>() {
@Override
public void call(final Subscriber<? super List<PocketQueryList>> subscriber) {
subscriber.onNext(GCParser.searchPocketQueryList());
subscriber.onCompleted();
}
- }).subscribeOn(Schedulers.io())).subscribe(new Action1<List<PocketQueryList>>() {
+ }), new Action1<List<PocketQueryList>>() {
@Override
public void call(final List<PocketQueryList> pocketQueryLists) {
waitDialog.dismiss();
diff --git a/main/src/cgeo/geocaching/StatusFragment.java b/main/src/cgeo/geocaching/StatusFragment.java
index 5229f1e..a59316f 100644
--- a/main/src/cgeo/geocaching/StatusFragment.java
+++ b/main/src/cgeo/geocaching/StatusFragment.java
@@ -3,9 +3,9 @@ package cgeo.geocaching;
import cgeo.geocaching.network.StatusUpdater;
import cgeo.geocaching.network.StatusUpdater.Status;
import cgeo.geocaching.utils.Log;
+import cgeo.geocaching.utils.RxUtils;
import rx.Subscription;
-import rx.android.observables.AndroidObservable;
import rx.functions.Action1;
import android.content.Intent;
@@ -30,7 +30,7 @@ public class StatusFragment extends Fragment {
final ViewGroup statusGroup = (ViewGroup) inflater.inflate(R.layout.status, container, false);
final ImageView statusIcon = (ImageView) statusGroup.findViewById(R.id.status_icon);
final TextView statusMessage = (TextView) statusGroup.findViewById(R.id.status_message);
- statusSubscription = AndroidObservable.bindFragment(this, StatusUpdater.latestStatus).subscribe(new Action1<Status>() {
+ statusSubscription = RxUtils.subscribeOnIOThenUI(StatusUpdater.latestStatus, new Action1<Status>() {
@Override
public void call(final Status status) {
if (status == null) {
diff --git a/main/src/cgeo/geocaching/TrackableActivity.java b/main/src/cgeo/geocaching/TrackableActivity.java
index 11f19f5..a14a397 100644
--- a/main/src/cgeo/geocaching/TrackableActivity.java
+++ b/main/src/cgeo/geocaching/TrackableActivity.java
@@ -20,12 +20,12 @@ import cgeo.geocaching.ui.UserNameClickListener;
import cgeo.geocaching.ui.logs.TrackableLogsViewCreator;
import cgeo.geocaching.utils.HtmlUtils;
import cgeo.geocaching.utils.Log;
+import cgeo.geocaching.utils.RxUtils;
import cgeo.geocaching.utils.UnknownTagsHandler;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
-import rx.android.observables.AndroidObservable;
import rx.android.observables.ViewObservable;
import rx.functions.Action1;
@@ -524,14 +524,12 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi
}
});
- AndroidObservable.bindActivity(TrackableActivity.this,
- new HtmlImage(geocode, true, 0, false).fetchDrawable(trackable.getImage()))
- .subscribe(new Action1<BitmapDrawable>() {
- @Override
- public void call(final BitmapDrawable bitmapDrawable) {
- trackableImage.setImageDrawable(bitmapDrawable);
- }
- });
+ RxUtils.subscribeThenUI(new HtmlImage(geocode, true, 0, false).fetchDrawable(trackable.getImage()), new Action1<BitmapDrawable>() {
+ @Override
+ public void call(final BitmapDrawable bitmapDrawable) {
+ trackableImage.setImageDrawable(bitmapDrawable);
+ }
+ });
imageView.addView(trackableImage);
}
diff --git a/main/src/cgeo/geocaching/connector/gc/RecaptchaHandler.java b/main/src/cgeo/geocaching/connector/gc/RecaptchaHandler.java
index 934cc88..2fd782c 100644
--- a/main/src/cgeo/geocaching/connector/gc/RecaptchaHandler.java
+++ b/main/src/cgeo/geocaching/connector/gc/RecaptchaHandler.java
@@ -4,12 +4,10 @@ import cgeo.geocaching.R;
import cgeo.geocaching.loaders.RecaptchaReceiver;
import cgeo.geocaching.network.Network;
import cgeo.geocaching.utils.Log;
+import cgeo.geocaching.utils.RxUtils;
import org.apache.commons.io.IOUtils;
-
import rx.Observable;
-import rx.android.observables.AndroidObservable;
-import rx.schedulers.Schedulers;
import rx.functions.Action1;
import rx.functions.Func0;
@@ -39,17 +37,36 @@ public class RecaptchaHandler extends Handler {
}
private void loadChallenge(final ImageView imageView, final View reloadButton) {
- getCaptcha().subscribe(new Action1<Bitmap>() {
+ final Observable<Bitmap> captcha = Observable.defer(new Func0<Observable<? extends Bitmap>>() {
+ @Override
+ public Observable<? extends Bitmap> call() {
+ final String url = "http://www.google.com/recaptcha/api/image?c=" + recaptchaReceiver.getChallenge();
+ final InputStream is = Network.getResponseStream(Network.getRequest(url));
+ if (is != null) {
+ try {
+ final Bitmap img = BitmapFactory.decodeStream(is);
+ return Observable.from(img);
+ } catch (final Exception e) {
+ Log.e("RecaptchaHandler.getCaptcha", e);
+ return Observable.error(e);
+ } finally {
+ IOUtils.closeQuietly(is);
+ }
+ }
+ return Observable.empty();
+ }
+ });
+ RxUtils.subscribeOnIOThenUI(captcha, 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
- }
- });
+ @Override
+ public void call(final Throwable throwable) {
+ // Do nothing
+ }
+ });
reloadButton.setEnabled(true);
}
@@ -89,26 +106,25 @@ public class RecaptchaHandler extends Handler {
}
private Observable<Bitmap> getCaptcha() {
- return AndroidObservable.bindActivity(activity,
- Observable.defer(new Func0<Observable<? extends Bitmap>>() {
- @Override
- public Observable<? extends Bitmap> call() {
- final String url = "http://www.google.com/recaptcha/api/image?c=" + recaptchaReceiver.getChallenge();
- final InputStream is = Network.getResponseStream(Network.getRequest(url));
- if (is != null) {
- try {
- final Bitmap img = BitmapFactory.decodeStream(is);
- return Observable.from(img);
- } catch (final Exception e) {
- Log.e("RecaptchaHandler.getCaptcha", e);
- return Observable.error(e);
- } finally {
- IOUtils.closeQuietly(is);
- }
- }
- return Observable.empty();
+ return Observable.defer(new Func0<Observable<? extends Bitmap>>() {
+ @Override
+ public Observable<? extends Bitmap> call() {
+ final String url = "http://www.google.com/recaptcha/api/image?c=" + recaptchaReceiver.getChallenge();
+ final InputStream is = Network.getResponseStream(Network.getRequest(url));
+ if (is != null) {
+ try {
+ final Bitmap img = BitmapFactory.decodeStream(is);
+ return Observable.from(img);
+ } catch (final Exception e) {
+ Log.e("RecaptchaHandler.getCaptcha", e);
+ return Observable.error(e);
+ } finally {
+ IOUtils.closeQuietly(is);
}
- }).subscribeOn(Schedulers.io()));
+ }
+ return Observable.empty();
+ }
+ });
}
}
diff --git a/main/src/cgeo/geocaching/network/HtmlImage.java b/main/src/cgeo/geocaching/network/HtmlImage.java
index 5d713eb..bde85ee 100644
--- a/main/src/cgeo/geocaching/network/HtmlImage.java
+++ b/main/src/cgeo/geocaching/network/HtmlImage.java
@@ -10,6 +10,7 @@ import cgeo.geocaching.utils.CancellableHandler;
import cgeo.geocaching.utils.FileUtils;
import cgeo.geocaching.utils.ImageUtils;
import cgeo.geocaching.utils.Log;
+import cgeo.geocaching.utils.RxUtils;
import ch.boye.httpclientandroidlib.HttpResponse;
import ch.boye.httpclientandroidlib.androidextra.Base64;
@@ -127,9 +128,8 @@ public class HtmlImage implements Html.ImageGetter {
return drawable.toBlockingObservable().lastOrDefault(null);
}
- // Caches are loaded from disk on Schedulers.computation() to avoid using more threads than processors
- // on the phone while decoding the image. Downloads happen on downloadScheduler, in parallel with image
- // decoding.
+ // Caches are loaded from disk on a computation scheduler to avoid using more threads than cores while decoding
+ // the image. Downloads happen on downloadScheduler, in parallel with image decoding.
public Observable<BitmapDrawable> fetchDrawable(final String url) {
if (StringUtils.isBlank(url) || ImageUtils.containsPattern(url, BLOCKED)) {
@@ -143,7 +143,7 @@ public class HtmlImage implements Html.ImageGetter {
@Override
public void call(final Subscriber<? super BitmapDrawable> subscriber) {
subscription.add(subscriber);
- subscriber.add(Schedulers.computation().schedule(new Action1<Inner>() {
+ subscriber.add(RxUtils.computationScheduler.schedule(new Action1<Inner>() {
@Override
public void call(final Inner inner) {
final Pair<BitmapDrawable, Boolean> loaded = loadFromDisk();
@@ -195,7 +195,7 @@ public class HtmlImage implements Html.ImageGetter {
if (onlySave) {
subscriber.onCompleted();
} else {
- Schedulers.computation().schedule(new Action1<Inner>() {
+ RxUtils.computationScheduler.schedule(new Action1<Inner>() {
@Override
public void call(final Inner inner) {
final Pair<BitmapDrawable, Boolean> loaded = loadFromDisk();
diff --git a/main/src/cgeo/geocaching/sensors/GeoDirHandler.java b/main/src/cgeo/geocaching/sensors/GeoDirHandler.java
index df19a92..09c0794 100644
--- a/main/src/cgeo/geocaching/sensors/GeoDirHandler.java
+++ b/main/src/cgeo/geocaching/sensors/GeoDirHandler.java
@@ -4,7 +4,6 @@ import cgeo.geocaching.CgeoApplication;
import cgeo.geocaching.settings.Settings;
import org.apache.commons.lang3.tuple.ImmutablePair;
-
import rx.Observable;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
diff --git a/main/src/cgeo/geocaching/settings/AbstractCheckCredentialsPreference.java b/main/src/cgeo/geocaching/settings/AbstractCheckCredentialsPreference.java
index 8a9d1c7..298270b 100644
--- a/main/src/cgeo/geocaching/settings/AbstractCheckCredentialsPreference.java
+++ b/main/src/cgeo/geocaching/settings/AbstractCheckCredentialsPreference.java
@@ -5,13 +5,12 @@ import cgeo.geocaching.activity.ActivityMixin;
import cgeo.geocaching.enumerations.StatusCode;
import cgeo.geocaching.network.Cookies;
import cgeo.geocaching.ui.dialog.Dialogs;
+import cgeo.geocaching.utils.RxUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
-import rx.android.observables.AndroidObservable;
import rx.functions.Action1;
import rx.functions.Func0;
-import rx.schedulers.Schedulers;
import rx.util.async.Async;
import android.app.ProgressDialog;
@@ -38,7 +37,7 @@ public abstract class AbstractCheckCredentialsPreference extends AbstractClickab
protected abstract ImmutablePair<String, String> getCredentials();
- protected abstract ImmutablePair<StatusCode, Drawable> login();
+ protected abstract ImmutablePair<StatusCode, ? extends Drawable> login();
private class LoginCheckClickListener implements OnPreferenceClickListener {
final private SettingsActivity activity;
@@ -65,14 +64,14 @@ public abstract class AbstractCheckCredentialsPreference extends AbstractClickab
loginDialog.setCancelable(false);
Cookies.clearCookies();
- AndroidObservable.bindActivity(activity, Async.start(new Func0<ImmutablePair<StatusCode, Drawable>>() {
+ RxUtils.subscribeOnIOThenUI(Async.start(new Func0<ImmutablePair<StatusCode, ? extends Drawable>>() {
@Override
- public ImmutablePair<StatusCode, Drawable> call() {
+ public ImmutablePair<StatusCode, ? extends Drawable> call() {
return login();
}
- }, Schedulers.io())).subscribe(new Action1<ImmutablePair<StatusCode, Drawable>>() {
+ }), new Action1<ImmutablePair<StatusCode, ? extends Drawable>>() {
@Override
- public void call(final ImmutablePair<StatusCode, Drawable> loginInfo) {
+ public void call(final ImmutablePair<StatusCode, ? extends Drawable> loginInfo) {
loginDialog.dismiss();
if (loginInfo.getLeft() == StatusCode.NO_ERROR) {
Dialogs.message(activity, R.string.init_login_popup, R.string.init_login_popup_ok, loginInfo.getRight());
@@ -81,7 +80,8 @@ public abstract class AbstractCheckCredentialsPreference extends AbstractClickab
res.getString(R.string.init_login_popup_failed_reason)
+ " "
+ loginInfo.getLeft().getErrorString(res)
- + ".");
+ + "."
+ );
}
activity.initBasicMemberPreferences();
}
diff --git a/main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java b/main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java
index 8257fdd..2a05f47 100644
--- a/main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java
+++ b/main/src/cgeo/geocaching/settings/CheckGcCredentialsPreference.java
@@ -25,14 +25,14 @@ public class CheckGcCredentialsPreference extends AbstractCheckCredentialsPrefer
}
@Override
- protected ImmutablePair<StatusCode, Drawable> login() {
+ protected ImmutablePair<StatusCode, ? extends Drawable> login() {
final StatusCode loginResult = GCLogin.getInstance().login();
switch (loginResult) {
case NO_ERROR:
GCLogin.detectGcCustomDate();
- return new ImmutablePair<StatusCode, Drawable>(StatusCode.NO_ERROR, GCLogin.getInstance().downloadAvatarAndGetMemberStatus());
+ return ImmutablePair.of(StatusCode.NO_ERROR, GCLogin.getInstance().downloadAvatarAndGetMemberStatus());
default:
- return new ImmutablePair<StatusCode, Drawable>(loginResult, null);
+ return ImmutablePair.of(loginResult, null);
}
}
}
diff --git a/main/src/cgeo/geocaching/settings/RegisterSend2CgeoPreference.java b/main/src/cgeo/geocaching/settings/RegisterSend2CgeoPreference.java
index 49239bc..1b18438 100644
--- a/main/src/cgeo/geocaching/settings/RegisterSend2CgeoPreference.java
+++ b/main/src/cgeo/geocaching/settings/RegisterSend2CgeoPreference.java
@@ -6,14 +6,13 @@ import cgeo.geocaching.network.Network;
import cgeo.geocaching.network.Parameters;
import cgeo.geocaching.ui.dialog.Dialogs;
import cgeo.geocaching.utils.Log;
+import cgeo.geocaching.utils.RxUtils;
import ch.boye.httpclientandroidlib.HttpResponse;
import org.apache.commons.lang3.StringUtils;
import rx.Observable;
-import rx.android.observables.AndroidObservable;
import rx.functions.Action1;
import rx.functions.Func0;
-import rx.schedulers.Schedulers;
import android.app.ProgressDialog;
import android.content.Context;
@@ -53,30 +52,29 @@ public class RegisterSend2CgeoPreference extends AbstractClickablePreference {
activity.getString(R.string.init_sendToCgeo_registering), true);
progressDialog.setCancelable(false);
- AndroidObservable.bindActivity(activity,
- Observable.defer(new Func0<Observable<Integer>>() {
- @Override
- public Observable<Integer> call() {
- final String nam = StringUtils.defaultString(deviceName);
- final String cod = StringUtils.defaultString(deviceCode);
-
- final Parameters params = new Parameters("name", nam, "code", cod);
- HttpResponse response = Network.getRequest("http://send2.cgeo.org/auth.html", params);
-
- if (response != null && response.getStatusLine().getStatusCode() == 200) {
- //response was OK
- final String[] strings = StringUtils.split(Network.getResponseData(response), ',');
- Settings.setWebNameCode(nam, strings[0]);
- try {
- return Observable.from(Integer.parseInt(strings[1].trim()));
- } catch (final Exception e) {
- Log.e("RegisterSend2CgeoPreference", e);
- }
- }
-
- return Observable.empty();
+ RxUtils.subscribeOnIOThenUI(Observable.defer(new Func0<Observable<Integer>>() {
+ @Override
+ public Observable<Integer> call() {
+ final String nam = StringUtils.defaultString(deviceName);
+ final String cod = StringUtils.defaultString(deviceCode);
+
+ final Parameters params = new Parameters("name", nam, "code", cod);
+ HttpResponse response = Network.getRequest("http://send2.cgeo.org/auth.html", params);
+
+ if (response != null && response.getStatusLine().getStatusCode() == 200) {
+ //response was OK
+ final String[] strings = StringUtils.split(Network.getResponseData(response), ',');
+ Settings.setWebNameCode(nam, strings[0]);
+ try {
+ return Observable.from(Integer.parseInt(strings[1].trim()));
+ } catch (final Exception e) {
+ Log.e("RegisterSend2CgeoPreference", e);
}
- }).firstOrDefault(0).subscribeOn(Schedulers.io())).subscribe(new Action1<Integer>() {
+ }
+
+ return Observable.empty();
+ }
+ }).firstOrDefault(0), new Action1<Integer>() {
@Override
public void call(final Integer pin) {
progressDialog.dismiss();
diff --git a/main/src/cgeo/geocaching/ui/ImagesList.java b/main/src/cgeo/geocaching/ui/ImagesList.java
index 31a61b5..d3f107a 100644
--- a/main/src/cgeo/geocaching/ui/ImagesList.java
+++ b/main/src/cgeo/geocaching/ui/ImagesList.java
@@ -6,11 +6,11 @@ import cgeo.geocaching.files.LocalStorage;
import cgeo.geocaching.list.StoredList;
import cgeo.geocaching.network.HtmlImage;
import cgeo.geocaching.utils.Log;
+import cgeo.geocaching.utils.RxUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import rx.Subscription;
-import rx.android.observables.AndroidObservable;
import rx.functions.Action0;
import rx.functions.Action1;
import rx.subscriptions.CompositeSubscription;
@@ -116,13 +116,12 @@ public class ImagesList {
final ImageView imageView = (ImageView) inflater.inflate(R.layout.image_item, null);
assert(imageView != null);
- subscriptions.add(AndroidObservable.bindActivity(activity, imgGetter.fetchDrawable(img.getUrl()))
- .subscribe(new Action1<BitmapDrawable>() {
- @Override
- public void call(final BitmapDrawable image) {
- display(imageView, image, img, rowView);
- }
- }));
+ subscriptions.add(RxUtils.subscribeThenUI(imgGetter.fetchDrawable(img.getUrl()), new Action1<BitmapDrawable>() {
+ @Override
+ public void call(final BitmapDrawable image) {
+ display(imageView, image, img, rowView);
+ }
+ }));
rowView.addView(imageView);
imagesView.addView(rowView);
}
diff --git a/main/src/cgeo/geocaching/utils/RxUtils.java b/main/src/cgeo/geocaching/utils/RxUtils.java
new file mode 100644
index 0000000..9926bab
--- /dev/null
+++ b/main/src/cgeo/geocaching/utils/RxUtils.java
@@ -0,0 +1,51 @@
+package cgeo.geocaching.utils;
+
+import rx.Observable;
+import rx.Observer;
+import rx.Scheduler;
+import rx.Subscription;
+import rx.android.schedulers.AndroidSchedulers;
+import rx.functions.Action1;
+import rx.schedulers.Schedulers;
+
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+public class RxUtils {
+
+ // Utility class, not to be instanciated
+ private RxUtils() {}
+
+ final static private int cores = Runtime.getRuntime().availableProcessors();
+ public final static Scheduler computationScheduler = Schedulers.executor(new ThreadPoolExecutor(1, cores, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()));
+
+ public static <T> Subscription subscribeThenUI(final Observable<T> observable, final Observer<T> observer) {
+ return observable.observeOn(AndroidSchedulers.mainThread()).subscribe(observer);
+ }
+
+ public static <T> Subscription subscribeThenUI(final Observable<T> observable, final Action1<T> action) {
+ return observable.observeOn(AndroidSchedulers.mainThread()).subscribe(action);
+ }
+
+ public static <T> Subscription subscribeThenUI(final Observable<T> observable, final Action1<T> action, final Action1<Throwable> onError) {
+ return observable.observeOn(AndroidSchedulers.mainThread()).subscribe(action, onError);
+ }
+
+ public static <T> Observable<T> onIO(final Observable<T> observable) {
+ return observable.subscribeOn(Schedulers.io());
+ }
+
+ public static <T> Subscription subscribeOnIOThenUI(final Observable<T> observable, final Observer<T> observer) {
+ return subscribeThenUI(onIO(observable), observer);
+ }
+
+ public static <T> Subscription subscribeOnIOThenUI(final Observable<T> observable, final Action1<T> action) {
+ return subscribeThenUI(onIO(observable), action);
+ }
+
+ public static <T> Subscription subscribeOnIOThenUI(final Observable<T> observable, final Action1<T> action, final Action1<Throwable> onError) {
+ return subscribeThenUI(onIO(observable), action, onError);
+ }
+
+}