aboutsummaryrefslogtreecommitdiffstats
path: root/main/src
diff options
context:
space:
mode:
authorSamuel Tardieu <sam@rfc1149.net>2014-01-08 00:01:11 +0100
committerSamuel Tardieu <sam@rfc1149.net>2014-01-08 19:42:40 +0100
commit8acbe950b0ade1daee1d66684ce94d1828bcf993 (patch)
tree3fcadbdedd7b2a30648af2e1ea4cff4a8620353f /main/src
parent32b87b85b396e916f79ee13eadfa9e761478a1fd (diff)
downloadcgeo-8acbe950b0ade1daee1d66684ce94d1828bcf993.zip
cgeo-8acbe950b0ade1daee1d66684ce94d1828bcf993.tar.gz
cgeo-8acbe950b0ade1daee1d66684ce94d1828bcf993.tar.bz2
Obtain address with RxJava
Diffstat (limited to 'main/src')
-rw-r--r--main/src/cgeo/geocaching/MainActivity.java118
1 files changed, 52 insertions, 66 deletions
diff --git a/main/src/cgeo/geocaching/MainActivity.java b/main/src/cgeo/geocaching/MainActivity.java
index 7905fcf..8a50c10 100644
--- a/main/src/cgeo/geocaching/MainActivity.java
+++ b/main/src/cgeo/geocaching/MainActivity.java
@@ -24,9 +24,15 @@ import cgeo.geocaching.utils.Version;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
-
-import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
+import rx.Observable;
+import rx.Observable.OnSubscribeFunc;
+import rx.Observer;
+import rx.Subscription;
+import rx.android.observables.AndroidObservable;
+import rx.concurrency.Schedulers;
+import rx.subscriptions.Subscriptions;
+import rx.util.functions.Action1;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
@@ -77,8 +83,6 @@ public class MainActivity extends AbstractActivity {
private boolean cleanupRunning = false;
private int countBubbleCnt = 0;
private Geopoint addCoords = null;
- private List<Address> addresses = null;
- private boolean addressObtaining = false;
private boolean initialized = false;
private final UpdateLocation locationUpdater = new UpdateLocation();
@@ -115,40 +119,24 @@ public class MainActivity extends AbstractActivity {
}
};
- private Handler obtainAddressHandler = new Handler() {
-
- @Override
- public void handleMessage(final Message msg) {
- try {
- if (CollectionUtils.isNotEmpty(addresses)) {
- final Address address = addresses.get(0);
- final ArrayList<String> addressParts = new ArrayList<String>();
-
- final String countryName = address.getCountryName();
- if (countryName != null) {
- addressParts.add(countryName);
- }
- final String locality = address.getLocality();
- if (locality != null) {
- addressParts.add(locality);
- } else {
- final String adminArea = address.getAdminArea();
- if (adminArea != null) {
- addressParts.add(adminArea);
- }
- }
-
- addCoords = app.currentGeo().getCoords();
+ private static String formatAddress(final Address address) {
+ final ArrayList<String> addressParts = new ArrayList<String>();
- navLocation.setText(StringUtils.join(addressParts, ", "));
- }
- } catch (RuntimeException e) {
- // nothing
+ final String countryName = address.getCountryName();
+ if (countryName != null) {
+ addressParts.add(countryName);
+ }
+ final String locality = address.getLocality();
+ if (locality != null) {
+ addressParts.add(locality);
+ } else {
+ final String adminArea = address.getAdminArea();
+ if (adminArea != null) {
+ addressParts.add(adminArea);
}
-
- addresses = null;
}
- };
+ return StringUtils.join(addressParts, ", ");
+ }
private class SatellitesHandler extends GeoDirHandler {
@@ -550,10 +538,35 @@ public class MainActivity extends AbstractActivity {
if (Settings.isShowAddress()) {
if (addCoords == null) {
- navLocation.setText(res.getString(R.string.loc_no_addr));
+ navLocation.setText(R.string.loc_no_addr);
}
- if (addCoords == null || (geo.getCoords().distanceTo(addCoords) > 0.5 && !addressObtaining)) {
- (new ObtainAddressThread()).start();
+ if (addCoords == null || (geo.getCoords().distanceTo(addCoords) > 0.5)) {
+ final Observable<String> address = Observable.create(new OnSubscribeFunc<String>() {
+ @Override
+ public Subscription onSubscribe(final Observer<? super String> observer) {
+ try {
+ addCoords = geo.getCoords();
+ final Geocoder geocoder = new Geocoder(MainActivity.this, Locale.getDefault());
+ final Geopoint coords = app.currentGeo().getCoords();
+ final List<Address> addresses = geocoder.getFromLocation(coords.getLatitude(), coords.getLongitude(), 1);
+ if (!addresses.isEmpty()) {
+ observer.onNext(formatAddress(addresses.get(0)));
+ }
+ observer.onCompleted();
+ } catch (final IOException e) {
+ observer.onError(e);
+ }
+ return Subscriptions.empty();
+ }
+ }).subscribeOn(Schedulers.threadPoolForIO());
+ AndroidObservable.fromActivity(MainActivity.this, address)
+ .onErrorResumeNext(Observable.just(geo.getCoords().toString()))
+ .subscribe(new Action1<String>() {
+ @Override
+ public void call(final String address) {
+ navLocation.setText(address);
+ }
+ });
}
} else {
navLocation.setText(geo.getCoords().toString());
@@ -567,7 +580,7 @@ public class MainActivity extends AbstractActivity {
}
navType.setText(null);
navAccuracy.setText(null);
- navLocation.setText(res.getString(R.string.loc_trying));
+ navLocation.setText(R.string.loc_trying);
}
} catch (RuntimeException e) {
Log.w("Failed to update location.");
@@ -714,33 +727,6 @@ public class MainActivity extends AbstractActivity {
}
}
- private class ObtainAddressThread extends Thread {
-
- public ObtainAddressThread() {
- setPriority(Thread.MIN_PRIORITY);
- }
-
- @Override
- public void run() {
- if (addressObtaining) {
- return;
- }
- addressObtaining = true;
-
- try {
- final Geocoder geocoder = new Geocoder(MainActivity.this, Locale.getDefault());
- final Geopoint coords = app.currentGeo().getCoords();
- addresses = geocoder.getFromLocation(coords.getLatitude(), coords.getLongitude(), 1);
- } catch (IOException e) {
- Log.i("Failed to obtain address");
- }
-
- obtainAddressHandler.sendEmptyMessage(0);
-
- addressObtaining = false;
- }
- }
-
/**
* @param view
* unused here but needed since this method is referenced from XML layout