aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/EditWaypointActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/cgeo/geocaching/EditWaypointActivity.java')
-rw-r--r--main/src/cgeo/geocaching/EditWaypointActivity.java76
1 files changed, 48 insertions, 28 deletions
diff --git a/main/src/cgeo/geocaching/EditWaypointActivity.java b/main/src/cgeo/geocaching/EditWaypointActivity.java
index 56ee959..c31ad40 100644
--- a/main/src/cgeo/geocaching/EditWaypointActivity.java
+++ b/main/src/cgeo/geocaching/EditWaypointActivity.java
@@ -48,6 +48,8 @@ import java.util.List;
@EActivity
public class EditWaypointActivity extends AbstractActivity {
+ private static final ArrayList<WaypointType> POSSIBLE_WAYPOINT_TYPES = new ArrayList<WaypointType>(WaypointType.ALL_TYPES_EXCEPT_OWN_AND_ORIGINAL);
+
@ViewById(R.id.buttonLatitude) protected Button buttonLat;
@ViewById(R.id.buttonLongitude) protected Button buttonLon;
@ViewById(R.id.add_waypoint) protected Button addWaypoint;
@@ -70,14 +72,21 @@ public class EditWaypointActivity extends AbstractActivity {
@Extra(Intents.EXTRA_COUNT) protected int wpCount = 0;
@InstanceState protected int waypointTypeSelectorPosition = -1;
+
private ProgressDialog waitDialog = null;
private Waypoint waypoint = null;
private String prefix = "OWN";
private String lookup = "---";
private boolean own = true;
- ArrayList<WaypointType> wpTypes = null;
ArrayList<String> distanceUnits = null;
+ /**
+ * {@code true} if the activity is newly created, {@code false} if it is restored from an instance state
+ */
private boolean initViews = true;
+ /**
+ * This is the cache that the waypoint belongs to.
+ */
+ private Geocache cache;
private Handler loadWaypointHandler = new Handler() {
@@ -107,14 +116,14 @@ public class EditWaypointActivity extends AbstractActivity {
note.setText(StringUtils.trimToEmpty(waypoint.getNote()));
}
}
- final Geocache cache = cgData.loadCache(geocode, LoadFlags.LOAD_CACHE_ONLY);
+ final Geocache cache = DataStore.loadCache(geocode, LoadFlags.LOAD_CACHE_ONLY);
setCoordsModificationVisibility(ConnectorFactory.getConnector(geocode), cache);
}
if (own) {
initializeWaypointTypeSelector();
}
- } catch (Exception e) {
+ } catch (RuntimeException e) {
Log.e("EditWaypointActivity.loadWaypointHandler", e);
} finally {
if (waitDialog != null) {
@@ -158,6 +167,10 @@ public class EditWaypointActivity extends AbstractActivity {
initViews = false;
}
+ if (geocode != null) {
+ cache = DataStore.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB);
+ setCoordsModificationVisibility(ConnectorFactory.getConnector(geocode), cache);
+ }
if (id > 0) { // existing waypoint
waitDialog = ProgressDialog.show(this, null, res.getString(R.string.waypoint_loading), true);
waitDialog.setCancelable(true);
@@ -166,11 +179,6 @@ public class EditWaypointActivity extends AbstractActivity {
} else { // new waypoint
initializeWaypointTypeSelector();
-
- if (geocode != null) {
- final Geocache cache = cgData.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB);
- setCoordsModificationVisibility(ConnectorFactory.getConnector(geocode), cache);
- }
}
initializeDistanceUnitSelector();
@@ -202,8 +210,7 @@ public class EditWaypointActivity extends AbstractActivity {
}
private void initializeWaypointTypeSelector() {
- wpTypes = new ArrayList<WaypointType>(WaypointType.ALL_TYPES_EXCEPT_OWN_AND_ORIGINAL);
- ArrayAdapter<WaypointType> wpAdapter = new ArrayAdapter<WaypointType>(this, android.R.layout.simple_spinner_item, wpTypes.toArray(new WaypointType[wpTypes.size()]));
+ ArrayAdapter<WaypointType> wpAdapter = new ArrayAdapter<WaypointType>(this, android.R.layout.simple_spinner_item, POSSIBLE_WAYPOINT_TYPES.toArray(new WaypointType[POSSIBLE_WAYPOINT_TYPES.size()]));
wpAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
waypointTypeSelector.setAdapter(wpAdapter);
@@ -218,17 +225,30 @@ public class EditWaypointActivity extends AbstractActivity {
}
});
- if (initViews) {
- int typeIndex = -1;
- if (waypoint != null) {
- typeIndex = wpTypes.indexOf(waypoint.getWaypointType());
- }
- waypointTypeSelector.setSelection(typeIndex >= 0 ? typeIndex : wpTypes.indexOf(WaypointType.WAYPOINT));
- } else {
- waypointTypeSelector.setSelection(waypointTypeSelectorPosition);
+ waypointTypeSelector.setSelection(getDefaultWaypointType());
+ waypointTypeSelector.setVisibility(View.VISIBLE);
+ }
+
+ private int getDefaultWaypointType() {
+ // potentially restore saved instance state
+ if (waypointTypeSelectorPosition >= 0) {
+ return waypointTypeSelectorPosition;
}
- waypointTypeSelector.setVisibility(View.VISIBLE);
+ // when editing, use the existing type
+ if (waypoint != null) {
+ return POSSIBLE_WAYPOINT_TYPES.indexOf(waypoint.getWaypointType());
+ }
+
+ // make default for new waypoint depend on cache type
+ switch (cache.getType()) {
+ case MYSTERY:
+ return POSSIBLE_WAYPOINT_TYPES.indexOf(WaypointType.FINAL);
+ case MULTI:
+ return POSSIBLE_WAYPOINT_TYPES.indexOf(WaypointType.STAGE);
+ default:
+ return POSSIBLE_WAYPOINT_TYPES.indexOf(WaypointType.WAYPOINT);
+ }
}
private void initializeDistanceUnitSelector() {
@@ -259,7 +279,7 @@ public class EditWaypointActivity extends AbstractActivity {
@Override
public void run() {
try {
- waypoint = cgData.loadWaypoint(id);
+ waypoint = DataStore.loadWaypoint(id);
loadWaypointHandler.sendMessage(Message.obtain());
} catch (Exception e) {
@@ -278,7 +298,7 @@ public class EditWaypointActivity extends AbstractActivity {
} catch (Geopoint.ParseException e) {
// button text is blank when creating new waypoint
}
- Geocache cache = cgData.loadCache(geocode, LoadFlags.LOAD_WAYPOINTS);
+ Geocache cache = DataStore.loadCache(geocode, LoadFlags.LOAD_WAYPOINTS);
CoordinatesInputDialog coordsDialog = new CoordinatesInputDialog(EditWaypointActivity.this, cache, gp, app.currentGeo());
coordsDialog.setCancelable(true);
coordsDialog.setOnCoordinateUpdate(new CoordinatesInputDialog.CoordinateUpdate() {
@@ -361,7 +381,7 @@ public class EditWaypointActivity extends AbstractActivity {
final String noteText = note.getText().toString().trim();
final Geopoint coordsToSave = coords;
final int selectedTypeIndex = waypointTypeSelector.getSelectedItemPosition();
- final WaypointType type = selectedTypeIndex >= 0 ? wpTypes.get(selectedTypeIndex) : waypoint.getWaypointType();
+ final WaypointType type = selectedTypeIndex >= 0 ? POSSIBLE_WAYPOINT_TYPES.get(selectedTypeIndex) : waypoint.getWaypointType();
final boolean visited = visitedCheckBox.isChecked();
final ProgressDialog progress = ProgressDialog.show(EditWaypointActivity.this, getString(R.string.cache), getString(R.string.waypoint_being_saved), true);
final Handler finishHandler = new Handler() {
@@ -416,14 +436,14 @@ public class EditWaypointActivity extends AbstractActivity {
waypoint.setVisited(visited);
waypoint.setId(id);
- Geocache cache = cgData.loadCache(geocode, LoadFlags.LOAD_WAYPOINTS);
+ Geocache cache = DataStore.loadCache(geocode, LoadFlags.LOAD_WAYPOINTS);
if (cache == null) {
finishHandler.sendEmptyMessage(SAVE_ERROR);
return null;
}
Waypoint oldWaypoint = cache.getWaypointById(id);
if (cache.addOrChangeWaypoint(waypoint, true)) {
- cgData.saveCache(cache, EnumSet.of(SaveFlag.SAVE_DB));
+ DataStore.saveCache(cache, EnumSet.of(SaveFlag.SAVE_DB));
if (!StaticMapsProvider.hasAllStaticMapsForWaypoint(geocode, waypoint)) {
StaticMapsProvider.removeWpStaticMaps(oldWaypoint, geocode);
if (Settings.isStoreOfflineWpMaps()) {
@@ -432,13 +452,13 @@ public class EditWaypointActivity extends AbstractActivity {
}
if (modifyLocal.isChecked() || modifyBoth.isChecked()) {
if (!cache.hasUserModifiedCoords()) {
- final Waypoint origWaypoint = new Waypoint(cgeoapplication.getInstance().getString(R.string.cache_coordinates_original), WaypointType.ORIGINAL, false);
+ final Waypoint origWaypoint = new Waypoint(CgeoApplication.getInstance().getString(R.string.cache_coordinates_original), WaypointType.ORIGINAL, false);
origWaypoint.setCoords(cache.getCoords());
cache.addOrChangeWaypoint(origWaypoint, false);
cache.setUserModifiedCoords(true);
}
cache.setCoords(waypoint.getCoords());
- cgData.saveChangedCache(cache);
+ DataStore.saveChangedCache(cache);
}
if (modifyBoth.isChecked() && waypoint.getCoords() != null) {
finishHandler.sendEmptyMessage(UPLOAD_START);
@@ -468,8 +488,8 @@ public class EditWaypointActivity extends AbstractActivity {
return con.supportsOwnCoordinates() && con.uploadModifiedCoordinates(cache, waypointUploaded);
}
- public static void startActivityEditWaypoint(final Context context, final int waypointId) {
- EditWaypointActivity_.intent(context).id(waypointId).start();
+ public static void startActivityEditWaypoint(final Context context, final Geocache cache, final int waypointId) {
+ EditWaypointActivity_.intent(context).geocode(cache.getGeocode()).id(waypointId).start();
}
public static void startActivityAddWaypoint(final Context context, final Geocache cache) {