aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/CompassActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/cgeo/geocaching/CompassActivity.java')
-rw-r--r--main/src/cgeo/geocaching/CompassActivity.java109
1 files changed, 58 insertions, 51 deletions
diff --git a/main/src/cgeo/geocaching/CompassActivity.java b/main/src/cgeo/geocaching/CompassActivity.java
index 025d938..00fa790 100644
--- a/main/src/cgeo/geocaching/CompassActivity.java
+++ b/main/src/cgeo/geocaching/CompassActivity.java
@@ -8,19 +8,23 @@ import cgeo.geocaching.enumerations.LoadFlags;
import cgeo.geocaching.geopoint.Geopoint;
import cgeo.geocaching.geopoint.Units;
import cgeo.geocaching.maps.CGeoMap;
-import cgeo.geocaching.sensors.DirectionProvider;
import cgeo.geocaching.sensors.GeoDirHandler;
+import cgeo.geocaching.sensors.GpsStatusProvider.Status;
import cgeo.geocaching.sensors.IGeoData;
import cgeo.geocaching.settings.Settings;
import cgeo.geocaching.speech.SpeechService;
import cgeo.geocaching.ui.CompassView;
import cgeo.geocaching.ui.LoggingUI;
+import cgeo.geocaching.utils.AngleUtils;
import cgeo.geocaching.utils.Formatter;
import cgeo.geocaching.utils.Log;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.jdt.annotation.Nullable;
+import rx.android.schedulers.AndroidSchedulers;
+import rx.functions.Action1;
+
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
@@ -34,14 +38,10 @@ import android.view.SubMenu;
import android.view.View;
import android.widget.TextView;
-import java.util.ArrayList;
-import java.util.Collection;
import java.util.List;
public class CompassActivity extends AbstractActionBarActivity {
- private static final int COORDINATES_OFFSET = 10;
-
@InjectView(R.id.nav_type) protected TextView navType;
@InjectView(R.id.nav_accuracy) protected TextView navAccuracy;
@InjectView(R.id.nav_satellites) protected TextView navSatellites;
@@ -56,7 +56,6 @@ public class CompassActivity extends AbstractActionBarActivity {
private static final String EXTRAS_NAME = "name";
private static final String EXTRAS_GEOCODE = "geocode";
private static final String EXTRAS_CACHE_INFO = "cacheinfo";
- private static final List<IWaypoint> coordinates = new ArrayList<>();
/**
* Destination of the compass, or null (if the compass is used for a waypoint only).
@@ -118,7 +117,9 @@ public class CompassActivity extends AbstractActionBarActivity {
@Override
public void onResume() {
- super.onResume(geoDirHandler.start(GeoDirHandler.UPDATE_GEODIR));
+ super.onResume(geoDirHandler.start(GeoDirHandler.UPDATE_GEODIR),
+ app.gpsStatusObservable().observeOn(AndroidSchedulers.mainThread()).subscribe(gpsStatusHandler));
+ forceRefresh();
}
@Override
@@ -138,34 +139,42 @@ public class CompassActivity extends AbstractActionBarActivity {
setTitle();
setDestCoords();
setCacheInfo();
+ forceRefresh();
+ }
+ private void forceRefresh() {
// Force a refresh of location and direction when data is available.
final CgeoApplication app = CgeoApplication.getInstance();
final IGeoData geo = app.currentGeo();
- if (geo != null) {
- geoDirHandler.updateGeoDir(geo, app.currentDirection());
- }
+ geoDirHandler.updateGeoDir(geo, app.currentDirection());
}
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.compass_activity_options, menu);
menu.findItem(R.id.menu_compass_sensor).setVisible(hasMagneticFieldSensor);
- final SubMenu subMenu = menu.findItem(R.id.menu_select_destination).getSubMenu();
- if (coordinates.size() > 1) {
- for (int i = 0; i < coordinates.size(); i++) {
- final IWaypoint coordinate = coordinates.get(i);
- subMenu.add(0, COORDINATES_OFFSET + i, 0, coordinate.getName() + " (" + coordinate.getCoordType() + ")");
- }
- } else {
- menu.findItem(R.id.menu_select_destination).setVisible(false);
- }
if (cache != null) {
LoggingUI.addMenuItems(this, menu, cache);
}
+ addWaypointItems(menu);
return true;
}
+ private void addWaypointItems(final Menu menu) {
+ if (cache != null) {
+ final List<Waypoint> waypoints = cache.getWaypoints();
+ boolean visible = false;
+ final SubMenu subMenu = menu.findItem(R.id.menu_select_destination).getSubMenu();
+ for (final Waypoint waypoint : waypoints) {
+ if (waypoint.getCoords() != null) {
+ subMenu.add(0, waypoint.getId(), 0, waypoint.getName());
+ visible = true;
+ }
+ }
+ menu.findItem(R.id.menu_select_destination).setVisible(visible);
+ }
+ }
+
@Override
public boolean onPrepareOptionsMenu(final Menu menu) {
super.onPrepareOptionsMenu(menu);
@@ -207,18 +216,19 @@ public class CompassActivity extends AbstractActionBarActivity {
if (LoggingUI.onMenuItemSelected(item, this, cache)) {
return true;
}
- final int coordinatesIndex = id - COORDINATES_OFFSET;
- if (coordinatesIndex >= 0 && coordinatesIndex < coordinates.size()) {
- final IWaypoint coordinate = coordinates.get(coordinatesIndex);
- title = coordinate.getName();
- dstCoords = coordinate.getCoords();
- setTitle();
- setDestCoords();
- setCacheInfo();
- updateDistanceInfo(app.currentGeo());
-
- Log.d("destination set: " + title + " (" + dstCoords + ")");
- return true;
+ if (cache != null) {
+ final Waypoint waypoint = cache.getWaypointById(id);
+ if (waypoint != null) {
+ title = waypoint.getName();
+ dstCoords = waypoint.getCoords();
+ setTitle();
+ setDestCoords();
+ setCacheInfo();
+ updateDistanceInfo(app.currentGeo());
+
+ Log.d("destination set: " + title + " (" + dstCoords + ")");
+ return true;
+ }
}
}
return super.onOptionsItemSelected(item);
@@ -259,16 +269,22 @@ public class CompassActivity extends AbstractActionBarActivity {
headingView.setText(Math.round(cacheHeading) + "°");
}
+ private final Action1<Status> gpsStatusHandler = new Action1<Status>() {
+ @Override
+ public void call(final Status gpsStatus) {
+ if (gpsStatus.satellitesVisible >= 0) {
+ navSatellites.setText(res.getString(R.string.loc_sat) + ": " + gpsStatus.satellitesFixed + "/" + gpsStatus.satellitesVisible);
+ } else {
+ navSatellites.setText("");
+ }
+ }
+ };
+
private final GeoDirHandler geoDirHandler = new GeoDirHandler() {
@Override
public void updateGeoDir(final IGeoData geo, final float dir) {
try {
if (geo.getCoords() != null) {
- if (geo.getSatellitesVisible() >= 0) {
- navSatellites.setText(res.getString(R.string.loc_sat) + ": " + geo.getSatellitesFixed() + "/" + geo.getSatellitesVisible());
- } else {
- navSatellites.setText("");
- }
navType.setText(res.getString(geo.getLocationProvider().resourceId));
if (geo.getAccuracy() >= 0) {
@@ -286,7 +302,7 @@ public class CompassActivity extends AbstractActionBarActivity {
navLocation.setText(res.getString(R.string.loc_trying));
}
- updateNorthHeading(DirectionProvider.getDirectionNow(dir));
+ updateNorthHeading(AngleUtils.getDirectionNow(dir));
} catch (final RuntimeException e) {
Log.w("Failed to LocationUpdater location.");
}
@@ -299,17 +315,8 @@ public class CompassActivity extends AbstractActionBarActivity {
}
}
- public static void startActivity(final Context context, final String geocode, final String displayedName, final Geopoint coords, final Collection<IWaypoint> coordinatesWithType,
+ public static void startActivity(final Context context, final String geocode, final String displayedName, final Geopoint coords,
final String info) {
- coordinates.clear();
- if (coordinatesWithType != null) {
- for (final IWaypoint coordinate : coordinatesWithType) {
- if (coordinate != null) {
- coordinates.add(coordinate);
- }
- }
- }
-
final Intent navigateIntent = new Intent(context, CompassActivity.class);
navigateIntent.putExtra(EXTRAS_COORDS, coords);
navigateIntent.putExtra(EXTRAS_GEOCODE, geocode);
@@ -320,12 +327,12 @@ public class CompassActivity extends AbstractActionBarActivity {
context.startActivity(navigateIntent);
}
- public static void startActivity(final Context context, final String geocode, final String displayedName, final Geopoint coords, final Collection<IWaypoint> coordinatesWithType) {
- CompassActivity.startActivity(context, geocode, displayedName, coords, coordinatesWithType, null);
+ public static void startActivity(final Context context, final String geocode, final String displayedName, final Geopoint coords) {
+ startActivity(context, geocode, displayedName, coords, null);
}
- public static void startActivity(final Context context, final Geocache cache) {
- startActivity(context, cache.getGeocode(), cache.getName(), cache.getCoords(), null,
+ public static void startActivityCache(final Context context, final Geocache cache) {
+ startActivity(context, cache.getGeocode(), cache.getName(), cache.getCoords(),
Formatter.formatCacheInfoShort(cache));
}