diff options
Diffstat (limited to 'main/src/cgeo/geocaching/EditWaypointActivity.java')
| -rw-r--r-- | main/src/cgeo/geocaching/EditWaypointActivity.java | 126 |
1 files changed, 108 insertions, 18 deletions
diff --git a/main/src/cgeo/geocaching/EditWaypointActivity.java b/main/src/cgeo/geocaching/EditWaypointActivity.java index ef2a2cc..f64e6df 100644 --- a/main/src/cgeo/geocaching/EditWaypointActivity.java +++ b/main/src/cgeo/geocaching/EditWaypointActivity.java @@ -2,6 +2,9 @@ package cgeo.geocaching; import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.activity.ActivityMixin; +import cgeo.geocaching.connector.ConnectorFactory; +import cgeo.geocaching.connector.IConnector; +import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.enumerations.LoadFlags; import cgeo.geocaching.enumerations.LoadFlags.SaveFlag; import cgeo.geocaching.enumerations.WaypointType; @@ -28,6 +31,7 @@ import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.EditText; +import android.widget.RadioButton; import android.widget.Spinner; import java.util.ArrayList; @@ -39,7 +43,7 @@ public class EditWaypointActivity extends AbstractActivity { private String geocode = null; private int id = -1; private ProgressDialog waitDialog = null; - private cgWaypoint waypoint = null; + private Waypoint waypoint = null; private Geopoint gpTemp = null; private WaypointType type = WaypointType.OWN; private String prefix = "OWN"; @@ -77,6 +81,8 @@ public class EditWaypointActivity extends AbstractActivity { else { ((EditText) findViewById(R.id.note)).setText(StringUtils.trimToEmpty(waypoint.getNote())); } + cgCache cache = cgData.loadCache(geocode, LoadFlags.LOAD_CACHE_ONLY); + setCoordsModificationVisibility(ConnectorFactory.getConnector(geocode), cache); } if (own) { @@ -100,7 +106,7 @@ public class EditWaypointActivity extends AbstractActivity { super.onCreate(savedInstanceState); setTheme(); - setContentView(R.layout.waypoint_new); + setContentView(R.layout.edit_waypoint_activity); setTitle("waypoint"); // get parameters @@ -133,7 +139,7 @@ public class EditWaypointActivity extends AbstractActivity { addWaypoint.setOnClickListener(new coordsListener()); List<String> wayPointNames = new ArrayList<String>(); - for (WaypointType wpt : WaypointType.ALL_TYPES_EXCEPT_OWN) { + for (WaypointType wpt : WaypointType.ALL_TYPES_EXCEPT_OWN_AND_ORIGINAL) { wayPointNames.add(wpt.getL10n()); } AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.name); @@ -152,11 +158,27 @@ public class EditWaypointActivity extends AbstractActivity { initializeWaypointTypeSelector(); } + if (geocode != null) { + cgCache cache = cgData.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB); + IConnector con = ConnectorFactory.getConnector(geocode); + setCoordsModificationVisibility(con, cache); + } + initializeDistanceUnitSelector(); disableSuggestions((EditText) findViewById(R.id.distance)); } + private void setCoordsModificationVisibility(IConnector con, cgCache cache) { + if (cache != null && (cache.getType() == CacheType.MYSTERY || cache.getType() == CacheType.MULTI)) { + findViewById(R.id.modify_cache_coordinates_group).setVisibility(View.VISIBLE); + findViewById(R.id.modify_cache_coordinates_local_and_remote).setVisibility(con.supportsOwnCoordinates() ? View.VISIBLE : View.GONE); + } else { + findViewById(R.id.modify_cache_coordinates_group).setVisibility(View.GONE); + findViewById(R.id.modify_cache_coordinates_local_and_remote).setVisibility(View.GONE); + } + } + @Override public void onResume() { super.onResume(); @@ -193,7 +215,7 @@ public class EditWaypointActivity extends AbstractActivity { Spinner waypointTypeSelector = (Spinner) findViewById(R.id.type); - wpTypes = new ArrayList<WaypointType>(WaypointType.ALL_TYPES_EXCEPT_OWN); + 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()])); wpAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); waypointTypeSelector.setAdapter(wpAdapter); @@ -229,7 +251,6 @@ public class EditWaypointActivity extends AbstractActivity { final private GeoDirHandler geoDirHandler = new GeoDirHandler() { @Override public void updateGeoData(final IGeoData geo) { - Log.d("EditWaypointActivity.updateLocation called"); if (geo.getCoords() == null) { return; } @@ -239,8 +260,8 @@ public class EditWaypointActivity extends AbstractActivity { Button bLon = (Button) findViewById(R.id.buttonLongitude); bLat.setHint(geo.getCoords().format(GeopointFormatter.Format.LAT_DECMINUTE_RAW)); bLon.setHint(geo.getCoords().format(GeopointFormatter.Format.LON_DECMINUTE_RAW)); - } catch (Exception e) { - Log.w("Failed to update location."); + } catch (final Exception e) { + Log.e("failed to update location", e); } } }; @@ -250,7 +271,7 @@ public class EditWaypointActivity extends AbstractActivity { @Override public void run() { try { - waypoint = app.loadWaypoint(id); + waypoint = cgData.loadWaypoint(id); loadWaypointHandler.sendMessage(Message.obtain()); } catch (Exception e) { @@ -269,7 +290,7 @@ public class EditWaypointActivity extends AbstractActivity { } else if (gpTemp != null) { gp = gpTemp; } - cgCache cache = app.loadCache(geocode, LoadFlags.LOAD_WAYPOINTS); + cgCache cache = cgData.loadCache(geocode, LoadFlags.LOAD_WAYPOINTS); cgeocoords coordsDialog = new cgeocoords(EditWaypointActivity.this, cache, gp, app.currentGeo()); coordsDialog.setCancelable(true); coordsDialog.setOnCoordinateUpdate(new cgeocoords.CoordinateUpdate() { @@ -288,7 +309,7 @@ public class EditWaypointActivity extends AbstractActivity { } } - private class changeWaypointType implements OnItemSelectedListener { + private static class changeWaypointType implements OnItemSelectedListener { private changeWaypointType(EditWaypointActivity wpView) { this.wpView = wpView; @@ -312,7 +333,7 @@ public class EditWaypointActivity extends AbstractActivity { } } - private class changeDistanceUnit implements OnItemSelectedListener { + private static class changeDistanceUnit implements OnItemSelectedListener { private changeDistanceUnit(EditWaypointActivity unitView) { this.unitView = unitView; @@ -335,6 +356,7 @@ public class EditWaypointActivity extends AbstractActivity { @Override public void onClick(View arg0) { + // TODO Show progress across whole function, it is performing very long time on slower devices final String bearingText = ((EditText) findViewById(R.id.bearing)).getText().toString(); // combine distance from EditText and distanceUnit saved from Spinner final String distanceText = ((EditText) findViewById(R.id.distance)).getText().toString() + distanceUnit; @@ -388,12 +410,12 @@ public class EditWaypointActivity extends AbstractActivity { String name = ((EditText) findViewById(R.id.name)).getText().toString().trim(); // if no name is given, just give the waypoint its number as name - if (name.length() == 0) { - name = res.getString(R.string.waypoint) + " " + String.valueOf(wpCount + 1); + if (StringUtils.isEmpty(name)) { + name = res.getString(R.string.waypoint) + " " + (wpCount + 1); } final String note = ((EditText) findViewById(R.id.note)).getText().toString().trim(); - final cgWaypoint waypoint = new cgWaypoint(name, type, own); + final Waypoint waypoint = new Waypoint(name, type, own); waypoint.setGeocode(geocode); waypoint.setPrefix(prefix); waypoint.setLookup(lookup); @@ -401,20 +423,88 @@ public class EditWaypointActivity extends AbstractActivity { waypoint.setNote(note); waypoint.setId(id); - cgCache cache = app.loadCache(geocode, LoadFlags.LOAD_WAYPOINTS); + cgCache cache = cgData.loadCache(geocode, LoadFlags.LOAD_WAYPOINTS); if (null != cache && cache.addOrChangeWaypoint(waypoint, true)) { - app.saveCache(cache, EnumSet.of(SaveFlag.SAVE_DB)); + cgData.saveCache(cache, EnumSet.of(SaveFlag.SAVE_DB)); StaticMapsProvider.removeWpStaticMaps(id, geocode); if (Settings.isStoreOfflineWpMaps()) { - StaticMapsProvider.storeWaypointStaticMap(cache, EditWaypointActivity.this, waypoint, false); + StaticMapsProvider.storeWaypointStaticMap(cache, waypoint, false); + } + final RadioButton modifyLocal = (RadioButton) findViewById(R.id.modify_cache_coordinates_local); + final RadioButton modifyBoth = (RadioButton) findViewById(R.id.modify_cache_coordinates_local_and_remote); + if (modifyLocal.isChecked() || modifyBoth.isChecked()) { + if (!cache.hasUserModifiedCoords()) { + 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); + } + if (modifyBoth.isChecked() && waypoint.getCoords() != null) { + if (cache.supportsOwnCoordinates()) { + final ProgressDialog progress = ProgressDialog.show(EditWaypointActivity.this, getString(R.string.cache), getString(R.string.waypoint_coordinates_uploading_to_website, waypoint.getCoords()), true); + Handler finishHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + progress.dismiss(); + finish(); + } + }; + new UploadModifiedCoordsThread(cache, waypoint.getCoords(), progress, finishHandler).start(); + } else { + showToast(getString(R.string.waypoint_coordinates_couldnt_be_modified_on_website)); + } + } else { + finish(); } - finish(); } else { showToast(res.getString(R.string.err_waypoint_add_failed)); } } } + private class UploadModifiedCoordsThread extends Thread { + + private final Geopoint waypoint_uploaded; + private final ProgressDialog progress; + private final cgCache cache; + private final Handler handler; + + public UploadModifiedCoordsThread(cgCache cache, Geopoint wpt, ProgressDialog progress, Handler finishHandler) { + this.cache = cache; + this.waypoint_uploaded = wpt; + this.progress = progress; + this.handler = finishHandler; + } + + @Override + public void run() { + boolean result = false; + IConnector con = ConnectorFactory.getConnector(cache); + if (con.supportsOwnCoordinates()) { + result = con.uploadModifiedCoordinates(cache, waypoint_uploaded); + } + final boolean res = result; + runOnUiThread(new Runnable() { + + @Override + public void run() { + if (res) { + showToast(getString(R.string.waypoint_coordinates_has_been_modified_on_website, waypoint_uploaded.getCoords().toString())); + } else { + showToast(getString(R.string.waypoint_coordinates_upload_error)); + } + if (progress != null) { + progress.dismiss(); + } + handler.sendMessage(Message.obtain()); + } + }); + } + } + @Override public void goManual(View view) { if (id >= 0) { |
