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.java222
1 files changed, 115 insertions, 107 deletions
diff --git a/main/src/cgeo/geocaching/CompassActivity.java b/main/src/cgeo/geocaching/CompassActivity.java
index 025d938..4196ee2 100644
--- a/main/src/cgeo/geocaching/CompassActivity.java
+++ b/main/src/cgeo/geocaching/CompassActivity.java
@@ -8,19 +8,24 @@ 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.NonNull;
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 +39,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;
@@ -52,25 +53,19 @@ public class CompassActivity extends AbstractActionBarActivity {
@InjectView(R.id.destination) protected TextView destinationTextView;
@InjectView(R.id.cacheinfo) protected TextView cacheInfoView;
- private static final String EXTRAS_COORDS = "coords";
- 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).
*/
- private @Nullable Geocache cache = null;
+ private Geocache cache = null;
private Geopoint dstCoords = null;
private float cacheHeading = 0;
- private String title = null;
- private String info = null;
private boolean hasMagneticFieldSensor;
+ private String description;
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState, R.layout.compass_activity);
+ ButterKnife.inject(this);
final SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
hasMagneticFieldSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null;
@@ -80,37 +75,38 @@ public class CompassActivity extends AbstractActionBarActivity {
// get parameters
final Bundle extras = getIntent().getExtras();
- if (extras != null) {
- final String geocode = extras.getString(EXTRAS_GEOCODE);
- if (StringUtils.isNotEmpty(geocode)) {
- cache = DataStore.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB);
- }
- title = geocode;
- final String name = extras.getString(EXTRAS_NAME);
- dstCoords = extras.getParcelable(EXTRAS_COORDS);
- info = extras.getString(EXTRAS_CACHE_INFO);
-
- if (StringUtils.isNotBlank(name)) {
- if (StringUtils.isNotBlank(title)) {
- title += ": " + name;
- } else {
- title = name;
- }
- }
- } else {
- final Intent pointIntent = new Intent(this, NavigateAnyPointActivity.class);
- startActivity(pointIntent);
-
+ if (extras == null) {
finish();
return;
}
- // set header
- setTitle();
- setDestCoords();
- setCacheInfo();
+ // cache must exist, except for "any point navigation"
+ final String geocode = extras.getString(Intents.EXTRA_GEOCODE);
+ if (geocode != null) {
+ cache = DataStore.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB);
+ }
- ButterKnife.inject(this);
+ // find the wanted navigation target
+ if (extras.containsKey(Intents.EXTRA_WAYPOINT_ID)) {
+ final int waypointId = extras.getInt(Intents.EXTRA_WAYPOINT_ID);
+ setTarget(DataStore.loadWaypoint(waypointId));
+ }
+ else if (extras.containsKey(Intents.EXTRA_COORDS)) {
+ final Geopoint coords = extras.getParcelable(Intents.EXTRA_COORDS);
+ final String description = extras.getString(Intents.EXTRA_DESCRIPTION);
+ setTarget(coords, description);
+ }
+ else {
+ setTarget(cache);
+ }
+
+ // set activity title just once, independent of what target is switched to
+ if (cache != null) {
+ setCacheTitleBar(cache);
+ }
+ else {
+ setTitle(StringUtils.defaultIfBlank(extras.getString(Intents.EXTRA_NAME), res.getString(R.string.navigation)));
+ }
// make sure we can control the TTS volume
setVolumeControlStream(AudioManager.STREAM_MUSIC);
@@ -118,7 +114,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
@@ -134,38 +132,44 @@ public class CompassActivity extends AbstractActionBarActivity {
setContentView(R.layout.compass_activity);
ButterKnife.inject(this);
+ setTarget(dstCoords, description);
- 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);
@@ -177,6 +181,7 @@ public class CompassActivity extends AbstractActionBarActivity {
}
menu.findItem(R.id.menu_tts_start).setVisible(!SpeechService.isRunning());
menu.findItem(R.id.menu_tts_stop).setVisible(SpeechService.isRunning());
+ menu.findItem(R.id.menu_compass_cache).setVisible(cache != null);
return true;
}
@@ -203,36 +208,42 @@ public class CompassActivity extends AbstractActionBarActivity {
SpeechService.stopService(this);
invalidateOptionsMenuCompatible();
return true;
+ case R.id.menu_compass_cache:
+ setTarget(cache);
+ return true;
default:
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) {
+ setTarget(waypoint);
+ return true;
+ }
}
}
return super.onOptionsItemSelected(item);
}
- private void setTitle() {
- if (StringUtils.isNotBlank(title)) {
- setTitle(title);
- } else {
- setTitle(res.getString(R.string.navigation));
- }
+ private void setTarget(final Geopoint coords, final String description) {
+ setDestCoords(coords);
+ setTargetDescription(description);
+ updateDistanceInfo(app.currentGeo());
+
+ Log.d("destination set: " + description + " (" + dstCoords + ")");
}
- private void setDestCoords() {
+ private void setTarget(final @NonNull Waypoint waypoint) {
+ setTarget(waypoint.getCoords(), waypoint.getName());
+ }
+
+ private void setTarget(final Geocache cache) {
+ setTarget(cache.getCoords(), Formatter.formatCacheInfoShort(cache));
+ }
+
+ private void setDestCoords(final Geopoint coords) {
+ dstCoords = coords;
if (dstCoords == null) {
return;
}
@@ -240,13 +251,14 @@ public class CompassActivity extends AbstractActionBarActivity {
destinationTextView.setText(dstCoords.toString());
}
- private void setCacheInfo() {
- if (info == null) {
+ private void setTargetDescription(final @Nullable String newDescription) {
+ description = newDescription;
+ if (description == null) {
cacheInfoView.setVisibility(View.GONE);
return;
}
cacheInfoView.setVisibility(View.VISIBLE);
- cacheInfoView.setText(info);
+ cacheInfoView.setText(description);
}
private void updateDistanceInfo(final IGeoData geo) {
@@ -259,16 +271,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,9 +304,9 @@ 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.");
+ Log.w("Failed to update location", e);
}
}
};
@@ -299,34 +317,24 @@ 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,
- final String info) {
- coordinates.clear();
- if (coordinatesWithType != null) {
- for (final IWaypoint coordinate : coordinatesWithType) {
- if (coordinate != null) {
- coordinates.add(coordinate);
- }
- }
- }
-
+ public static void startActivityWaypoint(final Context context, final Waypoint waypoint) {
final Intent navigateIntent = new Intent(context, CompassActivity.class);
- navigateIntent.putExtra(EXTRAS_COORDS, coords);
- navigateIntent.putExtra(EXTRAS_GEOCODE, geocode);
- if (null != displayedName) {
- navigateIntent.putExtra(EXTRAS_NAME, displayedName);
- }
- navigateIntent.putExtra(EXTRAS_CACHE_INFO, info);
+ navigateIntent.putExtra(Intents.EXTRA_GEOCODE, waypoint.getGeocode());
+ navigateIntent.putExtra(Intents.EXTRA_WAYPOINT_ID, waypoint.getId());
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 startActivityPoint(final Context context, final Geopoint coords, final String displayedName) {
+ final Intent navigateIntent = new Intent(context, CompassActivity.class);
+ navigateIntent.putExtra(Intents.EXTRA_COORDS, coords);
+ navigateIntent.putExtra(Intents.EXTRA_NAME, displayedName);
+ context.startActivity(navigateIntent);
}
- public static void startActivity(final Context context, final Geocache cache) {
- startActivity(context, cache.getGeocode(), cache.getName(), cache.getCoords(), null,
- Formatter.formatCacheInfoShort(cache));
+ public static void startActivityCache(final Context context, final Geocache cache) {
+ final Intent navigateIntent = new Intent(context, CompassActivity.class);
+ navigateIntent.putExtra(Intents.EXTRA_GEOCODE, cache.getGeocode());
+ context.startActivity(navigateIntent);
}
}