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.java126
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) {