diff options
Diffstat (limited to 'main/src/cgeo/geocaching/MainActivity.java')
| -rw-r--r-- | main/src/cgeo/geocaching/MainActivity.java | 195 |
1 files changed, 82 insertions, 113 deletions
diff --git a/main/src/cgeo/geocaching/MainActivity.java b/main/src/cgeo/geocaching/MainActivity.java index 924c66d..3ffc631 100644 --- a/main/src/cgeo/geocaching/MainActivity.java +++ b/main/src/cgeo/geocaching/MainActivity.java @@ -10,6 +10,7 @@ import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.Units; +import cgeo.geocaching.list.PseudoList; import cgeo.geocaching.list.StoredList; import cgeo.geocaching.maps.CGeoMap; import cgeo.geocaching.settings.Settings; @@ -19,15 +20,22 @@ import cgeo.geocaching.ui.dialog.Dialogs; import cgeo.geocaching.utils.DatabaseBackupUtils; import cgeo.geocaching.utils.GeoDirHandler; import cgeo.geocaching.utils.Log; -import cgeo.geocaching.utils.RunnableWithArgument; 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; import android.app.SearchManager; @@ -48,7 +56,6 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; -import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -77,8 +84,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(); @@ -104,7 +109,7 @@ public class MainActivity extends AbstractActivity { if (conn.isLoggedIn()) { userInfo.append(conn.getUserName()); if (conn.getCachesFound() >= 0) { - userInfo.append(" (").append(String.valueOf(conn.getCachesFound())).append(')'); + userInfo.append(" (").append(conn.getCachesFound()).append(')'); } userInfo.append(Formatter.SEPARATOR); } @@ -115,40 +120,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 { @@ -285,7 +274,7 @@ public class MainActivity extends AbstractActivity { @Override public boolean onPrepareOptionsMenu(final Menu menu) { super.onPrepareOptionsMenu(menu); - menu.findItem(R.id.menu_pocket_queries).setVisible(Settings.isPremiumMember()); + menu.findItem(R.id.menu_pocket_queries).setVisible(Settings.isGCPremiumMember()); return true; } @@ -309,13 +298,13 @@ public class MainActivity extends AbstractActivity { startScannerApplication(); return true; case R.id.menu_pocket_queries: - if (!Settings.isPremiumMember()) { + if (!Settings.isGCPremiumMember()) { return true; } - new PocketQueryList.UserInterface(MainActivity.this).promptForListSelection(new RunnableWithArgument<PocketQueryList>() { + PocketQueryList.promptForListSelection(this, new Action1<PocketQueryList>() { @Override - public void run(final PocketQueryList pql) { + public void call(final PocketQueryList pql) { CacheListActivity.startActivityPocket(MainActivity.this, pql); } }); @@ -388,14 +377,14 @@ public class MainActivity extends AbstractActivity { @Override public boolean onLongClick(final View v) { - new StoredList.UserInterface(MainActivity.this).promptForListSelection(R.string.list_title, new RunnableWithArgument<Integer>() { + new StoredList.UserInterface(MainActivity.this).promptForListSelection(R.string.list_title, new Action1<Integer>() { @Override - public void run(final Integer selectedListId) { + public void call(final Integer selectedListId) { Settings.saveLastList(selectedListId); CacheListActivity.startActivityOffline(MainActivity.this); } - }); + }, false, PseudoList.HISTORY_LIST.id); return true; } }); @@ -525,52 +514,61 @@ public class MainActivity extends AbstractActivity { @Override public void updateGeoData(final IGeoData geo) { - try { - if (geo.getCoords() != null) { - if (!nearestView.isClickable()) { - nearestView.setFocusable(true); - nearestView.setClickable(true); - nearestView.setOnClickListener(new OnClickListener() { - @Override - public void onClick(final View v) { - cgeoFindNearest(v); - } - }); - nearestView.setBackgroundResource(R.drawable.main_nearby); + if (!nearestView.isClickable()) { + nearestView.setFocusable(true); + nearestView.setClickable(true); + nearestView.setOnClickListener(new OnClickListener() { + @Override + public void onClick(final View v) { + cgeoFindNearest(v); } + }); + nearestView.setBackgroundResource(R.drawable.main_nearby); + } - navType.setText(res.getString(geo.getLocationProvider().resourceId)); + navType.setText(res.getString(geo.getLocationProvider().resourceId)); - if (geo.getAccuracy() >= 0) { - int speed = Math.round(geo.getSpeed()) * 60 * 60 / 1000; - navAccuracy.setText("±" + Units.getDistanceFromMeters(geo.getAccuracy()) + Formatter.SEPARATOR + Units.getSpeed(speed)); - } else { - navAccuracy.setText(null); - } + if (geo.getAccuracy() >= 0) { + int speed = Math.round(geo.getSpeed()) * 60 * 60 / 1000; + navAccuracy.setText("±" + Units.getDistanceFromMeters(geo.getAccuracy()) + Formatter.SEPARATOR + Units.getSpeed(speed)); + } else { + navAccuracy.setText(null); + } - if (Settings.isShowAddress()) { - if (addCoords == null) { - navLocation.setText(res.getString(R.string.loc_no_addr)); - } - if (addCoords == null || (geo.getCoords().distanceTo(addCoords) > 0.5 && !addressObtaining)) { - (new ObtainAddressThread()).start(); + if (Settings.isShowAddress()) { + if (addCoords == null) { + navLocation.setText(R.string.loc_no_addr); + } + 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 Exception e) { + observer.onError(e); + } + return Subscriptions.empty(); } - } else { - navLocation.setText(geo.getCoords().toString()); - } - } else { - if (nearestView.isClickable()) { - nearestView.setFocusable(false); - nearestView.setClickable(false); - nearestView.setOnClickListener(null); - nearestView.setBackgroundResource(R.drawable.main_nearby_disabled); - } - navType.setText(null); - navAccuracy.setText(null); - navLocation.setText(res.getString(R.string.loc_trying)); + }).subscribeOn(Schedulers.threadPoolForIO()); + AndroidObservable.fromActivity(MainActivity.this, address) + .onErrorResumeNext(Observable.from(geo.getCoords().toString())) + .subscribe(new Action1<String>() { + @Override + public void call(final String address) { + navLocation.setText(address); + } + }); } - } catch (RuntimeException e) { - Log.w("Failed to update location."); + } else { + navLocation.setText(geo.getCoords().toString()); } } } @@ -714,35 +712,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 (final IOException e) { - Log.i("Failed to obtain address"); - } catch (final IllegalArgumentException e) { - Log.w("ObtainAddressThread.run", e); - } - - obtainAddressHandler.sendEmptyMessage(0); - - addressObtaining = false; - } - } - /** * @param view * unused here but needed since this method is referenced from XML layout |
