diff options
Diffstat (limited to 'main/src/cgeo/geocaching/EditWaypointActivity.java')
| -rw-r--r-- | main/src/cgeo/geocaching/EditWaypointActivity.java | 301 |
1 files changed, 109 insertions, 192 deletions
diff --git a/main/src/cgeo/geocaching/EditWaypointActivity.java b/main/src/cgeo/geocaching/EditWaypointActivity.java index 7f011fc..483920a 100644 --- a/main/src/cgeo/geocaching/EditWaypointActivity.java +++ b/main/src/cgeo/geocaching/EditWaypointActivity.java @@ -1,7 +1,6 @@ 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; @@ -12,15 +11,19 @@ import cgeo.geocaching.geopoint.DistanceParser; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.GeopointFormatter; import cgeo.geocaching.ui.dialog.CoordinatesInputDialog; -import cgeo.geocaching.utils.BaseUtils; import cgeo.geocaching.utils.GeoDirHandler; import cgeo.geocaching.utils.Log; +import cgeo.geocaching.utils.TextUtils; + +import com.googlecode.androidannotations.annotations.EActivity; +import com.googlecode.androidannotations.annotations.Extra; +import com.googlecode.androidannotations.annotations.InstanceState; +import com.googlecode.androidannotations.annotations.ViewById; import org.apache.commons.lang3.StringUtils; import android.app.ProgressDialog; import android.content.Context; -import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; @@ -28,76 +31,88 @@ import android.os.Message; import android.text.Html; import android.view.View; import android.widget.AdapterView; -import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.Button; import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.EditText; import android.widget.RadioButton; +import android.widget.RadioGroup; import android.widget.Spinner; import java.util.ArrayList; +import java.util.Arrays; import java.util.EnumSet; import java.util.List; +@EActivity public class EditWaypointActivity extends AbstractActivity { + @ViewById(R.id.buttonLatitude) protected Button buttonLat; + @ViewById(R.id.buttonLongitude) protected Button buttonLon; + @ViewById(R.id.add_waypoint) protected Button addWaypoint; + @ViewById(R.id.note) protected EditText note; + @ViewById(R.id.wpt_visited_checkbox) protected CheckBox visitedCheckBox; + @ViewById(R.id.name) protected AutoCompleteTextView waypointName; + @ViewById(R.id.type) protected Spinner waypointTypeSelector; + @ViewById(R.id.distance) protected EditText distanceView; + @ViewById(R.id.modify_cache_coordinates_group) protected RadioGroup coordinatesGroup; + @ViewById(R.id.modify_cache_coordinates_local_and_remote) protected RadioButton modifyBoth; + @ViewById(R.id.distanceUnit) protected Spinner distanceUnitSelector; + @ViewById(R.id.bearing) protected EditText bearing; + @ViewById(R.id.modify_cache_coordinates_local) protected RadioButton modifyLocal; + + @Extra(Intents.EXTRA_GEOCODE) protected String geocode = null; + @Extra(Intents.EXTRA_WAYPOINT_ID) protected int id = -1; + /** + * number of waypoints that the corresponding cache has until now + */ + @Extra(Intents.EXTRA_COUNT) protected int wpCount = 0; - private String geocode = null; - private int id = -1; + @InstanceState protected int waypointTypeSelectorPosition = -1; private ProgressDialog waitDialog = null; private Waypoint waypoint = null; - private Geopoint gpTemp = null; - private WaypointType type = WaypointType.OWN; private String prefix = "OWN"; private String lookup = "---"; private boolean own = true; - private boolean visited = false; ArrayList<WaypointType> wpTypes = null; - String distanceUnit = ""; + ArrayList<String> distanceUnits = null; + private boolean initViews = true; - /** - * number of waypoints that the corresponding cache has until now - */ - private int wpCount = 0; private Handler loadWaypointHandler = new Handler() { @Override public void handleMessage(Message msg) { try { if (waypoint == null) { + Log.d("No waypoint loaded to edit. id= " + id); id = -1; } else { geocode = waypoint.getGeocode(); - type = waypoint.getWaypointType(); prefix = waypoint.getPrefix(); lookup = waypoint.getLookup(); own = waypoint.isUserDefined(); - visited = waypoint.isVisited(); - if (waypoint.getCoords() != null) { - ((Button) findViewById(R.id.buttonLatitude)).setText(waypoint.getCoords().format(GeopointFormatter.Format.LAT_DECMINUTE)); - ((Button) findViewById(R.id.buttonLongitude)).setText(waypoint.getCoords().format(GeopointFormatter.Format.LON_DECMINUTE)); - } - ((EditText) findViewById(R.id.name)).setText(Html.fromHtml(StringUtils.trimToEmpty(waypoint.getName())).toString()); - if (BaseUtils.containsHtml(waypoint.getNote())) { - ((EditText) findViewById(R.id.note)).setText(Html.fromHtml(StringUtils.trimToEmpty(waypoint.getNote())).toString()); - } - else { - ((EditText) findViewById(R.id.note)).setText(StringUtils.trimToEmpty(waypoint.getNote())); + if (initViews) { + visitedCheckBox.setChecked(waypoint.isVisited()); + if (waypoint.getCoords() != null) { + buttonLat.setText(waypoint.getCoords().format(GeopointFormatter.Format.LAT_DECMINUTE)); + buttonLon.setText(waypoint.getCoords().format(GeopointFormatter.Format.LON_DECMINUTE)); + } + waypointName.setText(Html.fromHtml(StringUtils.trimToEmpty(waypoint.getName())).toString()); + if (TextUtils.containsHtml(waypoint.getNote())) { + note.setText(Html.fromHtml(StringUtils.trimToEmpty(waypoint.getNote())).toString()); + } + else { + note.setText(StringUtils.trimToEmpty(waypoint.getNote())); + } } - Geocache cache = cgData.loadCache(geocode, LoadFlags.LOAD_CACHE_ONLY); + final Geocache cache = cgData.loadCache(geocode, LoadFlags.LOAD_CACHE_ONLY); setCoordsModificationVisibility(ConnectorFactory.getConnector(geocode), cache); } if (own) { initializeWaypointTypeSelector(); } - ((CheckBox) findViewById(R.id.wpt_visited_checkbox)).setChecked(visited); - - initializeDistanceUnitSelector(); } catch (Exception e) { Log.e("EditWaypointActivity.loadWaypointHandler", e); } finally { @@ -111,19 +126,7 @@ public class EditWaypointActivity extends AbstractActivity { @Override public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setTheme(); - setContentView(R.layout.edit_waypoint_activity); - setTitle("waypoint"); - - // get parameters - Bundle extras = getIntent().getExtras(); - if (extras != null) { - geocode = extras.getString(Intents.EXTRA_GEOCODE); - wpCount = extras.getInt(Intents.EXTRA_COUNT, 0); - id = extras.getInt(Intents.EXTRA_WAYPOINT_ID); - } + super.onCreate(savedInstanceState, R.layout.editwaypoint_activity); if (StringUtils.isBlank(geocode) && id <= 0) { showToast(res.getString(R.string.err_waypoint_cache_unknown)); @@ -138,59 +141,49 @@ public class EditWaypointActivity extends AbstractActivity { setTitle(res.getString(R.string.waypoint_edit_title)); } - Button buttonLat = (Button) findViewById(R.id.buttonLatitude); buttonLat.setOnClickListener(new CoordDialogListener()); - Button buttonLon = (Button) findViewById(R.id.buttonLongitude); buttonLon.setOnClickListener(new CoordDialogListener()); - Button addWaypoint = (Button) findViewById(R.id.add_waypoint); - addWaypoint.setOnClickListener(new CoordsListener()); + addWaypoint.setOnClickListener(new SaveWaypointListener()); List<String> wayPointNames = new ArrayList<String>(); for (WaypointType wpt : WaypointType.ALL_TYPES_EXCEPT_OWN_AND_ORIGINAL) { wayPointNames.add(wpt.getL10n()); } - AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.name); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, wayPointNames); - textView.setAdapter(adapter); + waypointName.setAdapter(adapter); - if (id > 0) { - Spinner waypointTypeSelector = (Spinner) findViewById(R.id.type); - waypointTypeSelector.setVisibility(View.GONE); + if (savedInstanceState != null) { + initViews = false; + } + if (id > 0) { // existing waypoint waitDialog = ProgressDialog.show(this, null, res.getString(R.string.waypoint_loading), true); waitDialog.setCancelable(true); (new LoadWaypointThread()).start(); - } else { + + } else { // new waypoint initializeWaypointTypeSelector(); - } - if (geocode != null) { - Geocache cache = cgData.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB); - IConnector con = ConnectorFactory.getConnector(geocode); - setCoordsModificationVisibility(con, cache); - } - CheckBox visitedCheckBox = ((CheckBox) findViewById(R.id.wpt_visited_checkbox)); - visitedCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - visited = isChecked; + if (geocode != null) { + final Geocache cache = cgData.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB); + setCoordsModificationVisibility(ConnectorFactory.getConnector(geocode), cache); } - }); + } initializeDistanceUnitSelector(); - disableSuggestions((EditText) findViewById(R.id.distance)); + disableSuggestions(distanceView); } private void setCoordsModificationVisibility(IConnector con, Geocache 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); + coordinatesGroup.setVisibility(View.VISIBLE); + modifyBoth.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); + coordinatesGroup.setVisibility(View.GONE); + modifyBoth.setVisibility(View.GONE); } } @@ -199,25 +192,6 @@ public class EditWaypointActivity extends AbstractActivity { super.onResume(); geoDirHandler.startGeo(); - - if (id > 0) { - if (waitDialog == null) { - waitDialog = ProgressDialog.show(this, null, res.getString(R.string.waypoint_loading), true); - waitDialog.setCancelable(true); - - (new LoadWaypointThread()).start(); - } - } - } - - @Override - public void onDestroy() { - super.onDestroy(); - } - - @Override - public void onStop() { - super.onStop(); } @Override @@ -227,40 +201,40 @@ public class EditWaypointActivity extends AbstractActivity { } private void initializeWaypointTypeSelector() { - - Spinner waypointTypeSelector = (Spinner) findViewById(R.id.type); - 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); - int typeIndex = wpTypes.indexOf(type); - if (typeIndex < 0) { - typeIndex = wpTypes.indexOf(WaypointType.WAYPOINT); - } + waypointTypeSelector.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView<?> parent, View v, int pos, long id) { + waypointTypeSelectorPosition = pos; + } - waypointTypeSelector.setSelection(typeIndex); - waypointTypeSelector.setOnItemSelectedListener(new ChangeWaypointType(this)); + @Override + public void onNothingSelected(AdapterView<?> parent) { + } + }); + + 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.setVisibility(View.VISIBLE); } private void initializeDistanceUnitSelector() { - - Spinner distanceUnitSelector = (Spinner) findViewById(R.id.distanceUnit); - - if (StringUtils.isBlank(distanceUnit)) { - if (Settings.isUseMetricUnits()) { - distanceUnitSelector.setSelection(0); // m - distanceUnit = res.getStringArray(R.array.distance_units)[0]; - } else { - distanceUnitSelector.setSelection(2); // ft - distanceUnit = res.getStringArray(R.array.distance_units)[2]; - } + distanceUnits = new ArrayList<String>(Arrays.asList(res.getStringArray(R.array.distance_units))); + if (initViews) { + distanceUnitSelector.setSelection(Settings.isUseMetricUnits() ? 0 : 2); //0:m, 2:ft } - - distanceUnitSelector.setOnItemSelectedListener(new ChangeDistanceUnit(this)); } final private GeoDirHandler geoDirHandler = new GeoDirHandler() { @@ -271,10 +245,8 @@ public class EditWaypointActivity extends AbstractActivity { } try { - Button bLat = (Button) findViewById(R.id.buttonLatitude); - 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)); + buttonLat.setHint(geo.getCoords().format(GeopointFormatter.Format.LAT_DECMINUTE_RAW)); + buttonLon.setHint(geo.getCoords().format(GeopointFormatter.Format.LON_DECMINUTE_RAW)); } catch (final Exception e) { Log.e("failed to update location", e); } @@ -290,7 +262,7 @@ public class EditWaypointActivity extends AbstractActivity { loadWaypointHandler.sendMessage(Message.obtain()); } catch (Exception e) { - Log.e("cgeowaypoint.loadWaypoint.run", e); + Log.e("EditWaypointActivity.loadWaypoint.run", e); } } } @@ -300,10 +272,10 @@ public class EditWaypointActivity extends AbstractActivity { @Override public void onClick(View arg0) { Geopoint gp = null; - if (waypoint != null && waypoint.getCoords() != null) { - gp = waypoint.getCoords(); - } else if (gpTemp != null) { - gp = gpTemp; + try { + gp = new Geopoint(buttonLat.getText().toString(), buttonLon.getText().toString()); + } catch (Geopoint.ParseException e) { + // button text is blank when creating new waypoint } Geocache cache = cgData.loadCache(geocode, LoadFlags.LOAD_WAYPOINTS); CoordinatesInputDialog coordsDialog = new CoordinatesInputDialog(EditWaypointActivity.this, cache, gp, app.currentGeo()); @@ -311,62 +283,14 @@ public class EditWaypointActivity extends AbstractActivity { coordsDialog.setOnCoordinateUpdate(new CoordinatesInputDialog.CoordinateUpdate() { @Override public void update(final Geopoint gp) { - ((Button) findViewById(R.id.buttonLatitude)).setText(gp.format(GeopointFormatter.Format.LAT_DECMINUTE)); - ((Button) findViewById(R.id.buttonLongitude)).setText(gp.format(GeopointFormatter.Format.LON_DECMINUTE)); - if (waypoint != null) { - waypoint.setCoords(gp); - } else { - gpTemp = gp; - } + buttonLat.setText(gp.format(GeopointFormatter.Format.LAT_DECMINUTE)); + buttonLon.setText(gp.format(GeopointFormatter.Format.LON_DECMINUTE)); } }); coordsDialog.show(); } } - private static class ChangeWaypointType implements OnItemSelectedListener { - - private ChangeWaypointType(EditWaypointActivity wpView) { - this.wpView = wpView; - } - - private EditWaypointActivity wpView; - - @Override - public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, - long arg3) { - if (null != wpView.wpTypes) { - wpView.type = wpView.wpTypes.get(arg2); - } - } - - @Override - public void onNothingSelected(AdapterView<?> arg0) { - if (null != wpView.wpTypes) { - arg0.setSelection(wpView.wpTypes.indexOf(wpView.type)); - } - } - } - - private static class ChangeDistanceUnit implements OnItemSelectedListener { - - private ChangeDistanceUnit(EditWaypointActivity unitView) { - this.unitView = unitView; - } - - private EditWaypointActivity unitView; - - @Override - public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, - long arg3) { - unitView.distanceUnit = (String) arg0.getItemAtPosition(arg2); - } - - @Override - public void onNothingSelected(AdapterView<?> arg0) { - } - } - public static final int SUCCESS = 0; public static final int UPLOAD_START = 1; public static final int UPLOAD_ERROR = 2; @@ -374,15 +298,15 @@ public class EditWaypointActivity extends AbstractActivity { public static final int UPLOAD_SUCCESS = 4; public static final int SAVE_ERROR = 5; - private class CoordsListener implements View.OnClickListener { + private class SaveWaypointListener implements View.OnClickListener { @Override public void onClick(View arg0) { - final String bearingText = ((EditText) findViewById(R.id.bearing)).getText().toString(); + final String bearingText = bearing.getText().toString(); // combine distance from EditText and distanceUnit saved from Spinner - final String distanceText = ((EditText) findViewById(R.id.distance)).getText().toString() + distanceUnit; - final String latText = ((Button) findViewById(R.id.buttonLatitude)).getText().toString(); - final String lonText = ((Button) findViewById(R.id.buttonLongitude)).getText().toString(); + final String distanceText = distanceView.getText().toString() + distanceUnits.get(distanceUnitSelector.getSelectedItemPosition()); + final String latText = buttonLat.getText().toString(); + final String lonText = buttonLon.getText().toString(); if (StringUtils.isBlank(bearingText) && StringUtils.isBlank(distanceText) && StringUtils.isBlank(latText) && StringUtils.isBlank(lonText)) { @@ -430,10 +354,13 @@ public class EditWaypointActivity extends AbstractActivity { } // if no name is given, just give the waypoint its number as name - final String givenName = ((EditText) findViewById(R.id.name)).getText().toString().trim(); + final String givenName = waypointName.getText().toString().trim(); final String name = StringUtils.isNotEmpty(givenName) ? givenName : res.getString(R.string.waypoint) + " " + (wpCount + 1); - final String note = ((EditText) findViewById(R.id.note)).getText().toString().trim(); + 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 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() { @@ -483,7 +410,7 @@ public class EditWaypointActivity extends AbstractActivity { waypoint.setPrefix(prefix); waypoint.setLookup(lookup); waypoint.setCoords(coordsToSave); - waypoint.setNote(note); + waypoint.setNote(noteText); waypoint.setVisited(visited); waypoint.setId(id); @@ -501,8 +428,6 @@ public class EditWaypointActivity extends AbstractActivity { 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); @@ -541,19 +466,11 @@ public class EditWaypointActivity extends AbstractActivity { return con.supportsOwnCoordinates() && con.uploadModifiedCoordinates(cache, waypointUploaded); } - @Override - public void goManual(final View view) { - ActivityMixin.goManual(this, id >= 0 ? "c:geo-waypoint-edit" : "c:geo-waypoint-new"); - } - public static void startActivityEditWaypoint(final Context context, final int waypointId) { - context.startActivity(new Intent(context, EditWaypointActivity.class) - .putExtra(Intents.EXTRA_WAYPOINT_ID, waypointId)); + EditWaypointActivity_.intent(context).id(waypointId).start(); } public static void startActivityAddWaypoint(final Context context, final Geocache cache) { - context.startActivity(new Intent(context, EditWaypointActivity.class) - .putExtra(Intents.EXTRA_GEOCODE, cache.getGeocode()) - .putExtra(Intents.EXTRA_COUNT, cache.getWaypoints().size())); + EditWaypointActivity_.intent(context).geocode(cache.getGeocode()).wpCount(cache.getWaypoints().size()).start(); } } |
