diff options
| author | Samuel Tardieu <sam@rfc1149.net> | 2014-01-08 00:01:11 +0100 |
|---|---|---|
| committer | Samuel Tardieu <sam@rfc1149.net> | 2014-01-08 19:42:40 +0100 |
| commit | 8acbe950b0ade1daee1d66684ce94d1828bcf993 (patch) | |
| tree | 3fcadbdedd7b2a30648af2e1ea4cff4a8620353f /main/src | |
| parent | 32b87b85b396e916f79ee13eadfa9e761478a1fd (diff) | |
| download | cgeo-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.java | 118 |
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 |
