diff options
Diffstat (limited to 'main/src/cgeo/geocaching/EditWaypointActivity.java')
| -rw-r--r-- | main/src/cgeo/geocaching/EditWaypointActivity.java | 76 |
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) { |
