diff --git a/OsmAnd-java/src/main/java/net/osmand/osm/edit/Entity.java b/OsmAnd-java/src/main/java/net/osmand/osm/edit/Entity.java index 63d776b73e..b7222ec7cc 100644 --- a/OsmAnd-java/src/main/java/net/osmand/osm/edit/Entity.java +++ b/OsmAnd-java/src/main/java/net/osmand/osm/edit/Entity.java @@ -108,6 +108,8 @@ public abstract class Entity implements Serializable { private boolean dataLoaded; private int modify; private int version; + private double latitude; + private double longitude; public static final int MODIFY_UNKNOWN = 0; public static final int MODIFY_DELETED = -1; public static final int MODIFY_MODIFIED = 1; @@ -117,6 +119,11 @@ public abstract class Entity implements Serializable { this.id = id; } + public Entity(long id, double latitude, double longitude) { + this.id = id; + this.latitude = latitude; + this.longitude = longitude; + } public Entity(Entity copy, long id) { this.id = id; @@ -124,6 +131,8 @@ public abstract class Entity implements Serializable { putTagNoLC(t, copy.getTag(t)); } this.dataLoaded = copy.dataLoaded; + this.latitude = copy.latitude; + this.longitude = copy.longitude; } public Set getChangedTags() { @@ -146,6 +155,22 @@ public abstract class Entity implements Serializable { return id; } + public double getLatitude() { + return latitude; + } + + public double getLongitude() { + return longitude; + } + + public void setLatitude(double latitude) { + this.latitude = latitude; + } + + public void setLongitude(double longitude) { + this.longitude = longitude; + } + public String removeTag(String key) { if (tags != null) { return tags.remove(key); diff --git a/OsmAnd-java/src/main/java/net/osmand/osm/edit/Node.java b/OsmAnd-java/src/main/java/net/osmand/osm/edit/Node.java index 62a7052f47..e4134631b5 100644 --- a/OsmAnd-java/src/main/java/net/osmand/osm/edit/Node.java +++ b/OsmAnd-java/src/main/java/net/osmand/osm/edit/Node.java @@ -8,42 +8,20 @@ import java.util.Map; public class Node extends Entity implements Serializable { private static final long serialVersionUID = -2981499160640211082L; - private double latitude; - private double longitude; // currently not used // private boolean visible = true; public Node(double latitude, double longitude, long id){ - super(id); - this.latitude = latitude; - this.longitude = longitude; + super(id, latitude,longitude); } public Node(Node n, long newId) { super(n, newId); - this.latitude = n.latitude; - this.longitude = n.longitude; - } - - public double getLatitude() { - return latitude; - } - - public double getLongitude() { - return longitude; - } - - public void setLatitude(double latitude) { - this.latitude = latitude; - } - - public void setLongitude(double longitude) { - this.longitude = longitude; } @Override public LatLon getLatLon() { - return new LatLon(latitude, longitude); + return new LatLon(getLatitude(), getLongitude()); } @Override @@ -55,8 +33,8 @@ public class Node extends Entity implements Serializable { @Override public String toString() { return "Node{" + - "latitude=" + latitude + - ", longitude=" + longitude + + "latitude=" + getLatitude() + + ", longitude=" + getLongitude() + ", tags=" + getTags() + '}'; } diff --git a/OsmAnd-java/src/main/java/net/osmand/osm/edit/Way.java b/OsmAnd-java/src/main/java/net/osmand/osm/edit/Way.java index 9042cb5ffe..dade245f0d 100644 --- a/OsmAnd-java/src/main/java/net/osmand/osm/edit/Way.java +++ b/OsmAnd-java/src/main/java/net/osmand/osm/edit/Way.java @@ -39,6 +39,11 @@ public class Way extends Entity { } } + public Way(long id, TLongArrayList nodeIds, double lat, double lon) { + super(id, lat, lon); + this.nodeIds = nodeIds; + } + public void addNode(long id) { if (nodeIds == null) { nodeIds = new TLongArrayList(); diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml index 25de078c19..dc0bdecb44 100644 --- a/OsmAnd/res/values/strings.xml +++ b/OsmAnd/res/values/strings.xml @@ -10,6 +10,7 @@ - For wording and consistency, please note http://osmand.net/help-online?id=technical-articles#Creating_a_Consistent_User_Experience Thx - Hardy --> + Committing way… Increase search radius to %1$s \"%1$s\", as well as your location.

We do not collect personal information, we only need search data to improve the search algorithm.
]]>
diff --git a/OsmAnd/src/net/osmand/plus/osmedit/EditPoiData.java b/OsmAnd/src/net/osmand/plus/osmedit/EditPoiData.java index f818a30175..391086afbd 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/EditPoiData.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/EditPoiData.java @@ -5,7 +5,7 @@ import android.support.annotation.Nullable; import net.osmand.PlatformUtil; import net.osmand.osm.PoiCategory; import net.osmand.osm.PoiType; -import net.osmand.osm.edit.Node; +import net.osmand.osm.edit.Entity; import net.osmand.plus.OsmandApplication; import net.osmand.util.Algorithms; @@ -23,7 +23,7 @@ public class EditPoiData { private Set mListeners = new HashSet<>(); private LinkedHashMap tagValues = new LinkedHashMap(); private boolean isInEdit = false; - private Node entity; + private Entity entity; public static final String POI_TYPE_TAG = "poi_type_tag"; public static final String REMOVE_TAG_PREFIX = "----"; @@ -34,11 +34,11 @@ public class EditPoiData { private Set changedTags = new HashSet<>(); - public EditPoiData(Node node, OsmandApplication app) { + public EditPoiData(Entity entity, OsmandApplication app) { allTranslatedSubTypes = app.getPoiTypes().getAllTranslatedNames(true); category = app.getPoiTypes().getOtherPoiCategory(); - entity = node; - initTags(node); + this.entity = entity; + initTags(entity); updateTypeTag(getPoiTypeString(), false); } @@ -68,7 +68,7 @@ public class EditPoiData { return s == null ? "" : s; } - public Node getEntity() { + public Entity getEntity() { return entity; } @@ -90,7 +90,7 @@ public class EditPoiData { } } - private void initTags(Node node) { + private void initTags(Entity node) { checkNotInEdit(); for (String s : node.getTagKeySet()) { tryAddTag(s, node.getTag(s)); diff --git a/OsmAnd/src/net/osmand/plus/osmedit/EditPoiDialogFragment.java b/OsmAnd/src/net/osmand/plus/osmedit/EditPoiDialogFragment.java index 21d76332e9..85aaecd86c 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/EditPoiDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/EditPoiDialogFragment.java @@ -53,9 +53,11 @@ import net.osmand.data.Amenity; import net.osmand.data.LatLon; import net.osmand.osm.PoiCategory; import net.osmand.osm.PoiType; +import net.osmand.osm.edit.Entity; import net.osmand.osm.edit.EntityInfo; import net.osmand.osm.edit.Node; import net.osmand.osm.edit.OSMSettings; +import net.osmand.osm.edit.Way; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandPlugin; import net.osmand.plus.OsmandSettings; @@ -82,7 +84,7 @@ public class EditPoiDialogFragment extends BaseOsmAndDialogFragment { public static final String TAG = "EditPoiDialogFragment"; private static final Log LOG = PlatformUtil.getLog(EditPoiDialogFragment.class); - private static final String KEY_AMENITY_NODE = "key_amenity_node"; + private static final String KEY_AMENITY_ENTITY = "key_amenity_node"; private static final String TAGS_LIST = "tags_list"; private static final String IS_ADDING_POI = "is_adding_poi"; @@ -115,8 +117,8 @@ public class EditPoiDialogFragment extends BaseOsmAndDialogFragment { mOpenstreetmapUtil = plugin.getPoiModificationRemoteUtil(); } - Node node = (Node) getArguments().getSerializable(KEY_AMENITY_NODE); - editPoiData = new EditPoiData(node, getMyApplication()); + Entity entity = (Entity) getArguments().getSerializable(KEY_AMENITY_ENTITY); + editPoiData = new EditPoiData(entity, getMyApplication()); } @Override @@ -448,14 +450,23 @@ public class EditPoiDialogFragment extends BaseOsmAndDialogFragment { } private void save() { - Node original = editPoiData.getEntity(); + Entity original = editPoiData.getEntity(); + final boolean offlineEdit = mOpenstreetmapUtil instanceof OpenstreetmapLocalUtil; - Node node = new Node(original.getLatitude(), original.getLongitude(), original.getId()); - Action action = node.getId() < 0 ? Action.CREATE : Action.MODIFY; + Entity entity; + if (original instanceof Node) { + entity = new Node(original.getLatitude(), original.getLongitude(), original.getId()); + } else if (original instanceof Way) { + entity = new Way(original.getId(), ((Way) original).getNodeIds(), original.getLatitude(), original.getLongitude()); + } else { + return; + } + + Action action = entity.getId() < 0 ? Action.CREATE : Action.MODIFY; for (Map.Entry tag : editPoiData.getTagValues().entrySet()) { if (!Algorithms.isEmpty(tag.getKey()) && !Algorithms.isEmpty(tag.getValue()) && !tag.getKey().equals(EditPoiData.POI_TYPE_TAG)) { - node.putTagNoLC(tag.getKey(), tag.getValue()); + entity.putTagNoLC(tag.getKey(), tag.getValue()); } } String poiTypeTag = editPoiData.getTagValues().get(EditPoiData.POI_TYPE_TAG); @@ -463,29 +474,29 @@ public class EditPoiDialogFragment extends BaseOsmAndDialogFragment { if (poiTypeTag != null) { final PoiType poiType = editPoiData.getAllTranslatedSubTypes().get(poiTypeTag.trim().toLowerCase()); if (poiType != null) { - node.putTagNoLC(poiType.getEditOsmTag(), poiType.getEditOsmValue()); - node.removeTag(EditPoiData.REMOVE_TAG_PREFIX + poiType.getEditOsmTag()); + entity.putTagNoLC(poiType.getEditOsmTag(), poiType.getEditOsmValue()); + entity.removeTag(EditPoiData.REMOVE_TAG_PREFIX + poiType.getEditOsmTag()); if (poiType.getOsmTag2() != null) { - node.putTagNoLC(poiType.getOsmTag2(), poiType.getOsmValue2()); - node.removeTag(EditPoiData.REMOVE_TAG_PREFIX + poiType.getOsmTag2()); + entity.putTagNoLC(poiType.getOsmTag2(), poiType.getOsmValue2()); + entity.removeTag(EditPoiData.REMOVE_TAG_PREFIX + poiType.getOsmTag2()); } } else if (!Algorithms.isEmpty(poiTypeTag)) { PoiCategory category = editPoiData.getPoiCategory(); if (category != null) { - node.putTagNoLC(category.getDefaultTag(), poiTypeTag); + entity.putTagNoLC(category.getDefaultTag(), poiTypeTag); } } if (offlineEdit && !Algorithms.isEmpty(poiTypeTag)) { - node.putTagNoLC(EditPoiData.POI_TYPE_TAG, poiTypeTag); + entity.putTagNoLC(EditPoiData.POI_TYPE_TAG, poiTypeTag); } String actionString = action == Action.CREATE ? getString(R.string.default_changeset_add) : getString(R.string.default_changeset_edit); comment = actionString + " " + poiTypeTag; } - commitNode(action, node, mOpenstreetmapUtil.getEntityInfo(node.getId()), comment, false, - new CallbackWithObject() { + commitEntity(action, entity, mOpenstreetmapUtil.getEntityInfo(entity.getId()), comment, false, + new CallbackWithObject() { @Override - public boolean processResult(Node result) { + public boolean processResult(Entity result) { if (result != null) { OsmEditingPlugin plugin = OsmandPlugin.getPlugin(OsmEditingPlugin.class); if (plugin != null && offlineEdit) { @@ -533,12 +544,12 @@ public class EditPoiDialogFragment extends BaseOsmAndDialogFragment { poiTypeEditText.setText(subCategory); } - public static void commitNode(final Action action, - final Node node, + public static void commitEntity(final Action action, + final Entity entity, final EntityInfo info, final String comment, final boolean closeChangeSet, - final CallbackWithObject postExecute, + final CallbackWithObject postExecute, final Activity activity, final OpenstreetmapUtil openstreetmapUtil, @Nullable final Set changedTags) { @@ -546,7 +557,7 @@ public class EditPoiDialogFragment extends BaseOsmAndDialogFragment { Toast.makeText(activity, activity.getResources().getString(R.string.poi_error_info_not_loaded), Toast.LENGTH_LONG).show(); return; } - new AsyncTask() { + new AsyncTask() { ProgressDialog progress; @Override @@ -556,12 +567,12 @@ public class EditPoiDialogFragment extends BaseOsmAndDialogFragment { } @Override - protected Node doInBackground(Void... params) { - return openstreetmapUtil.commitNodeImpl(action, node, info, comment, closeChangeSet, changedTags); + protected Entity doInBackground(Void... params) { + return openstreetmapUtil.commitEntityImpl(action, entity, info, comment, closeChangeSet, changedTags); } @Override - protected void onPostExecute(Node result) { + protected void onPostExecute(Entity result) { progress.dismiss(); if (postExecute != null) { postExecute.processResult(result); @@ -652,19 +663,19 @@ public class EditPoiDialogFragment extends BaseOsmAndDialogFragment { return createInstance(node, true); } - public static EditPoiDialogFragment createInstance(Node node, boolean isAddingPoi) { + public static EditPoiDialogFragment createInstance(Entity entity, boolean isAddingPoi) { EditPoiDialogFragment editPoiDialogFragment = new EditPoiDialogFragment(); Bundle args = new Bundle(); - args.putSerializable(KEY_AMENITY_NODE, node); + args.putSerializable(KEY_AMENITY_ENTITY, entity); args.putBoolean(IS_ADDING_POI, isAddingPoi); editPoiDialogFragment.setArguments(args); return editPoiDialogFragment; } - public static EditPoiDialogFragment createInstance(Node node, boolean isAddingPoi, Map tagList) { + public static EditPoiDialogFragment createInstance(Entity entity, boolean isAddingPoi, Map tagList) { EditPoiDialogFragment editPoiDialogFragment = new EditPoiDialogFragment(); Bundle args = new Bundle(); - args.putSerializable(KEY_AMENITY_NODE, node); + args.putSerializable(KEY_AMENITY_ENTITY, entity); args.putBoolean(IS_ADDING_POI, isAddingPoi); args.putSerializable(TAGS_LIST, (Serializable) Collections.unmodifiableMap(tagList)); editPoiDialogFragment.setArguments(args); @@ -683,16 +694,16 @@ public class EditPoiDialogFragment extends BaseOsmAndDialogFragment { } else { openstreetmapUtilToLoad = plugin.getPoiModificationRemoteUtil(); } - new AsyncTask() { + new AsyncTask() { @Override - protected Node doInBackground(Void... params) { - return openstreetmapUtilToLoad.loadNode(amenity); + protected Entity doInBackground(Void... params) { + return openstreetmapUtilToLoad.loadEntity(amenity); } - protected void onPostExecute(Node n) { - if (n != null) { + protected void onPostExecute(Entity entity) { + if (entity != null) { EditPoiDialogFragment fragment = - EditPoiDialogFragment.createInstance(n, false); + EditPoiDialogFragment.createInstance(entity, false); fragment.show(activity.getSupportFragmentManager(), TAG); } else { Toast.makeText(activity, @@ -750,22 +761,22 @@ public class EditPoiDialogFragment extends BaseOsmAndDialogFragment { } public void deletePoiWithDialog(Amenity amenity) { - new AsyncTask() { + new AsyncTask() { @Override - protected Node doInBackground(Amenity... params) { - return openstreetmapUtil.loadNode(params[0]); + protected Entity doInBackground(Amenity... params) { + return openstreetmapUtil.loadEntity(params[0]); } @Override - protected void onPostExecute(Node node) { - deletePoiWithDialog(node); + protected void onPostExecute(Entity entity) { + deletePoiWithDialog(entity); } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, amenity); } - public void deletePoiWithDialog(final Node n) { - if (n == null) { + public void deletePoiWithDialog(final Entity entity) { + if (entity == null) { Toast.makeText(activity, activity.getResources().getString(R.string.poi_error_poi_not_found), Toast.LENGTH_LONG).show(); return; } @@ -793,24 +804,24 @@ public class EditPoiDialogFragment extends BaseOsmAndDialogFragment { builder.setPositiveButton(isLocalEdit ? R.string.shared_string_save : R.string.shared_string_delete, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - String c = comment == null ? null : comment.getText().toString(); - boolean closeChangeSet = closeChangesetCheckBox != null - && closeChangesetCheckBox.isChecked(); - deleteNode(n, c, closeChangeSet); + if (entity instanceof Node) { + String c = comment == null ? null : comment.getText().toString(); + boolean closeChangeSet = closeChangesetCheckBox != null + && closeChangesetCheckBox.isChecked(); + deleteNode((Node) entity, c, closeChangeSet); + } } - - }); builder.create().show(); } - private void deleteNode(final Node n, final String c, final boolean closeChangeSet) { + private void deleteNode(final Entity entity, final String c, final boolean closeChangeSet) { final boolean isLocalEdit = openstreetmapUtil instanceof OpenstreetmapLocalUtil; - commitNode(Action.DELETE, n, openstreetmapUtil.getEntityInfo(n.getId()), c, closeChangeSet, - new CallbackWithObject() { + commitEntity(Action.DELETE, entity, openstreetmapUtil.getEntityInfo(entity.getId()), c, closeChangeSet, + new CallbackWithObject() { @Override - public boolean processResult(Node result) { + public boolean processResult(Entity result) { if (result != null) { if (callback != null) { callback.poiDeleted(); diff --git a/OsmAnd/src/net/osmand/plus/osmedit/OpenstreetmapLocalUtil.java b/OsmAnd/src/net/osmand/plus/osmedit/OpenstreetmapLocalUtil.java index 5b3143da5e..145aedd151 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/OpenstreetmapLocalUtil.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/OpenstreetmapLocalUtil.java @@ -5,9 +5,11 @@ import net.osmand.data.Amenity; import net.osmand.osm.AbstractPoiType; import net.osmand.osm.MapPoiTypes; import net.osmand.osm.PoiType; +import net.osmand.osm.edit.Entity; import net.osmand.osm.edit.EntityInfo; import net.osmand.osm.edit.Node; import net.osmand.osm.edit.OSMSettings.OSMTagKey; +import net.osmand.osm.edit.Way; import net.osmand.util.Algorithms; import net.osmand.util.MapUtils; @@ -46,18 +48,24 @@ public class OpenstreetmapLocalUtil implements OpenstreetmapUtil { } @Override - public Node commitNodeImpl(OsmPoint.Action action, Node n, EntityInfo info, String comment, - boolean closeChangeSet, Set changedTags){ - Node newNode = n; - if (n.getId() == -1) { - newNode = new Node(n, Math.min(-2, plugin.getDBPOI().getMinID() - 1)); // generate local id for the created node + public Entity commitEntityImpl(OsmPoint.Action action, Entity entity, EntityInfo info, String comment, + boolean closeChangeSet, Set changedTags) { + Entity newEntity = entity; + if (entity.getId() == -1) { + if (entity instanceof Node) { + newEntity = new Node((Node) entity, Math.min(-2, plugin.getDBPOI().getMinID() - 1)); + } else if (entity instanceof Way) { + newEntity = new Way(Math.min(-2, plugin.getDBPOI().getMinID() - 1), ((Way) entity).getNodeIds(), entity.getLatitude(), entity.getLongitude()); + } else { + return null; + } } OpenstreetmapPoint p = new OpenstreetmapPoint(); - newNode.setChangedTags(changedTags); - p.setEntity(newNode); + newEntity.setChangedTags(changedTags); + p.setEntity(newEntity); p.setAction(action); p.setComment(comment); - if (p.getAction() == OsmPoint.Action.DELETE && newNode.getId() < 0) { //if it is our local poi + if (p.getAction() == OsmPoint.Action.DELETE && newEntity.getId() < 0) { //if it is our local poi plugin.getDBPOI().deletePOI(p); } else { plugin.getDBPOI().addOpenstreetmap(p); @@ -65,11 +73,11 @@ public class OpenstreetmapLocalUtil implements OpenstreetmapUtil { for (OnNodeCommittedListener listener : listeners) { listener.onNoteCommitted(); } - return newNode; + return newEntity; } @Override - public Node loadNode(Amenity n) { + public Entity loadEntity(Amenity n) { PoiType poiType = n.getType().getPoiTypeByKeyName(n.getSubType()); if(n.getId() % 2 == 1 || poiType == null){ // that's way id diff --git a/OsmAnd/src/net/osmand/plus/osmedit/OpenstreetmapPoint.java b/OsmAnd/src/net/osmand/plus/osmedit/OpenstreetmapPoint.java index 24ffc89fda..69bc753ab4 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/OpenstreetmapPoint.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/OpenstreetmapPoint.java @@ -1,12 +1,12 @@ package net.osmand.plus.osmedit; -import net.osmand.osm.edit.Node; +import net.osmand.osm.edit.Entity; import net.osmand.osm.edit.OSMSettings.OSMTagKey; import net.osmand.util.Algorithms; public class OpenstreetmapPoint extends OsmPoint { private static final long serialVersionUID = 729654300829771467L; - private Node entity; + private Entity entity; private String comment; public OpenstreetmapPoint(){ @@ -59,7 +59,7 @@ public class OpenstreetmapPoint extends OsmPoint { } - public Node getEntity() { + public Entity getEntity() { return entity; } @@ -67,7 +67,7 @@ public class OpenstreetmapPoint extends OsmPoint { return comment; } - public void setEntity(Node entity) { + public void setEntity(Entity entity) { this.entity = entity; } diff --git a/OsmAnd/src/net/osmand/plus/osmedit/OpenstreetmapRemoteUtil.java b/OsmAnd/src/net/osmand/plus/osmedit/OpenstreetmapRemoteUtil.java index 901d8f2ec1..ceef2b38b4 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/OpenstreetmapRemoteUtil.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/OpenstreetmapRemoteUtil.java @@ -5,12 +5,14 @@ import android.widget.Toast; import net.osmand.PlatformUtil; import net.osmand.data.Amenity; +import net.osmand.data.LatLon; import net.osmand.osm.PoiType; import net.osmand.osm.edit.Entity; import net.osmand.osm.edit.Entity.EntityId; import net.osmand.osm.edit.Entity.EntityType; import net.osmand.osm.edit.EntityInfo; import net.osmand.osm.edit.Node; +import net.osmand.osm.edit.Way; import net.osmand.osm.io.Base64; import net.osmand.osm.io.NetworkUtils; import net.osmand.osm.io.OsmBaseStorage; @@ -234,6 +236,32 @@ public class OpenstreetmapRemoteUtil implements OpenstreetmapUtil { } ser.endTag(null, "node"); //$NON-NLS-1$ } + + private void writeWay(Way way, EntityInfo i, XmlSerializer ser, long changeSetId, String user) + throws IllegalArgumentException, IllegalStateException, IOException { + ser.startTag(null, "way"); //$NON-NLS-1$ + ser.attribute(null, "id", way.getId() + ""); //$NON-NLS-1$ //$NON-NLS-2$ + if (i != null) { + // ser.attribute(null, "timestamp", i.getETimestamp()); + // ser.attribute(null, "uid", i.getUid()); + // ser.attribute(null, "user", i.getUser()); + ser.attribute(null, "visible", i.getVisible()); //$NON-NLS-1$ + ser.attribute(null, "version", i.getVersion()); //$NON-NLS-1$ + } + ser.attribute(null, "changeset", changeSetId + ""); //$NON-NLS-1$ //$NON-NLS-2$ + + for (String k : way.getTagKeySet()) { + String val = way.getTag(k); + if (val.length() == 0 || k.length() == 0 || EditPoiData.POI_TYPE_TAG.equals(k) || + k.startsWith(EditPoiData.REMOVE_TAG_PREFIX) || k.contains(EditPoiData.REMOVE_TAG_PREFIX)) + continue; + ser.startTag(null, "tag"); //$NON-NLS-1$ + ser.attribute(null, "k", k); //$NON-NLS-1$ + ser.attribute(null, "v", val); //$NON-NLS-1$ + ser.endTag(null, "tag"); //$NON-NLS-1$ + } + ser.endTag(null, "way"); //$NON-NLS-1$ + } private boolean isNewChangesetRequired() { // first commit @@ -251,7 +279,7 @@ public class OpenstreetmapRemoteUtil implements OpenstreetmapUtil { } @Override - public Node commitNodeImpl(OsmPoint.Action action, final Node n, EntityInfo info, String comment, + public Entity commitEntityImpl(OsmPoint.Action action, final Entity n, EntityInfo info, String comment, boolean closeChangeSet, Set changedTags) { if (isNewChangesetRequired()) { changeSetId = openChangeSet(comment); @@ -262,7 +290,7 @@ public class OpenstreetmapRemoteUtil implements OpenstreetmapUtil { } try { - Node newN = n; + Entity newE = n; StringWriter writer = new StringWriter(256); XmlSerializer ser = Xml.newSerializer(); try { @@ -274,7 +302,12 @@ public class OpenstreetmapRemoteUtil implements OpenstreetmapUtil { ser.startTag(null, OsmPoint.stringAction.get(action)); ser.attribute(null, "version", "0.6"); //$NON-NLS-1$ //$NON-NLS-2$ ser.attribute(null, "generator", Version.getAppName(ctx)); //$NON-NLS-1$ - writeNode(n, info, ser, changeSetId, settings.USER_NAME.get()); + if (n instanceof Node) { + writeNode((Node) n, info, ser, changeSetId, settings.USER_NAME.get()); + + } else if (n instanceof Way) { + writeWay((Way) n, info, ser, changeSetId, settings.USER_NAME.get()); + } ser.endTag(null, OsmPoint.stringAction.get(action)); ser.endTag(null, "osmChange"); //$NON-NLS-1$ ser.endDocument(); @@ -293,12 +326,16 @@ public class OpenstreetmapRemoteUtil implements OpenstreetmapUtil { int end = res.indexOf('\"', i); //$NON-NLS-1$ if (end > 0) { newId = Long.parseLong(res.substring(i, end)); // << 1; - newN = new Node(n, newId); + if (n instanceof Node) { + newE = new Node((Node) n, newId); + } else if (n instanceof Way) { + newE = new Way(newId, ((Way) n).getNodeIds(), n.getLatitude(), n.getLongitude()); + } } } } changeSetTimeStamp = System.currentTimeMillis(); - return newN; + return newE; } return null; } finally { @@ -374,39 +411,39 @@ public class OpenstreetmapRemoteUtil implements OpenstreetmapUtil { } @Override - public Node loadNode(Amenity n) { - if (n.getId() % 2 == 1) { - // that's way id - return null; - } - long nodeId = n.getId() >> 1; + public Entity loadEntity(Amenity n) { + boolean isWay = n.getId() % 2 == 1;// check if amenity is a way + long entityId = n.getId() >> 1; try { - String res = sendRequest( - getSiteApi() + "api/0.6/node/" + nodeId, "GET", null, ctx.getString(R.string.loading_poi_obj) + nodeId, false); //$NON-NLS-1$ //$NON-NLS-2$ + String api = isWay ? "api/0.6/way/" : "api/0.6/node/"; + String res = sendRequest(getSiteApi() + api + entityId, "GET", null, + ctx.getString(R.string.loading_poi_obj) + entityId, false); //$NON-NLS-1$ //$NON-NLS-2$ if (res != null) { OsmBaseStorage st = new OsmBaseStorage(); st.setConvertTagsToLC(false); st.parseOSM(new ByteArrayInputStream(res.getBytes("UTF-8")), null, null, true); //$NON-NLS-1$ - EntityId id = new Entity.EntityId(EntityType.NODE, nodeId); - Node entity = (Node) st.getRegisteredEntities().get(id); + EntityId id = new Entity.EntityId(isWay ? EntityType.WAY : EntityType.NODE, entityId); + Entity entity = (Entity) st.getRegisteredEntities().get(id); entityInfo = st.getRegisteredEntityInfo().get(id); entityInfoId = id; - // check whether this is node (because id of node could be the same as relation) - if (entity != null && MapUtils.getDistance(entity.getLatLon(), n.getLocation()) < 50) { - PoiType poiType = n.getType().getPoiTypeByKeyName(n.getSubType()); - if(poiType.getEditOsmValue().equals(entity.getTag(poiType.getEditOsmTag()))) { - entity.removeTag(poiType.getEditOsmTag()); - entity.putTagNoLC(EditPoiData.POI_TYPE_TAG, poiType.getTranslation()); - } else { - // later we could try to determine tags + if (entity != null) { + if (!isWay && entity instanceof Node) { + // check whether this is node (because id of node could be the same as relation) + if (MapUtils.getDistance(entity.getLatLon(), n.getLocation()) < 50) { + return replaceEditOsnTags(n, entity); + } + } else if (isWay && entity instanceof Way) { + LatLon loc = n.getLocation(); + entity.setLatitude(loc.getLatitude()); + entity.setLongitude(loc.getLongitude()); + return replaceEditOsnTags(n, entity); } - return entity; } return null; } } catch (Exception e) { - log.error("Loading node failed " + nodeId, e); //$NON-NLS-1$ + log.error("Loading entity failed " + entityId, e); //$NON-NLS-1$ ctx.runInUIThread(new Runnable() { @Override @@ -419,6 +456,17 @@ public class OpenstreetmapRemoteUtil implements OpenstreetmapUtil { return null; } + private Entity replaceEditOsnTags(Amenity amenity, Entity entity) { + PoiType poiType = amenity.getType().getPoiTypeByKeyName(amenity.getSubType()); + if (poiType.getEditOsmValue().equals(entity.getTag(poiType.getEditOsmTag()))) { + entity.removeTag(poiType.getEditOsmTag()); + entity.putTagNoLC(EditPoiData.POI_TYPE_TAG, poiType.getTranslation()); + } else { + // later we could try to determine tags + } + return entity; + } + private void showWarning(final String msg) { ctx.runInUIThread(new Runnable() { @Override @@ -427,5 +475,4 @@ public class OpenstreetmapRemoteUtil implements OpenstreetmapUtil { } }); } - } diff --git a/OsmAnd/src/net/osmand/plus/osmedit/OpenstreetmapUtil.java b/OsmAnd/src/net/osmand/plus/osmedit/OpenstreetmapUtil.java index ae313fa17f..b620199e07 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/OpenstreetmapUtil.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/OpenstreetmapUtil.java @@ -3,8 +3,8 @@ package net.osmand.plus.osmedit; import android.support.annotation.Nullable; import net.osmand.data.Amenity; +import net.osmand.osm.edit.Entity; import net.osmand.osm.edit.EntityInfo; -import net.osmand.osm.edit.Node; import java.util.Set; @@ -12,9 +12,9 @@ public interface OpenstreetmapUtil { EntityInfo getEntityInfo(long id); - Node commitNodeImpl(OsmPoint.Action action, Node n, EntityInfo info, String comment, boolean closeChangeSet, @Nullable Set changedTags); + Entity commitEntityImpl(OsmPoint.Action action, Entity n, EntityInfo info, String comment, boolean closeChangeSet, @Nullable Set changedTags); void closeChangeSet(); - Node loadNode(Amenity n); + Entity loadEntity(Amenity n); } diff --git a/OsmAnd/src/net/osmand/plus/osmedit/OsmEditingPlugin.java b/OsmAnd/src/net/osmand/plus/osmedit/OsmEditingPlugin.java index b195d55420..d6f0d9c8e4 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/OsmEditingPlugin.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/OsmEditingPlugin.java @@ -21,7 +21,7 @@ import net.osmand.PlatformUtil; import net.osmand.data.Amenity; import net.osmand.data.TransportStop; import net.osmand.osm.PoiType; -import net.osmand.osm.edit.Node; +import net.osmand.osm.edit.Entity; import net.osmand.plus.ContextMenuAdapter; import net.osmand.plus.ContextMenuAdapter.ItemClickListener; import net.osmand.plus.ContextMenuItem; @@ -200,7 +200,7 @@ public class OsmEditingPlugin extends OsmandPlugin { EditPoiDialogFragment.showEditInstance(selectedObj instanceof TransportStop ? ((TransportStop) selectedObj).getAmenity() : (Amenity) selectedObj, mapActivity); } else if (resId == R.string.poi_context_menu_modify_osm_change) { - final Node entity = ((OpenstreetmapPoint) selectedObj).getEntity(); + final Entity entity = ((OpenstreetmapPoint) selectedObj).getEntity(); EditPoiDialogFragment.createInstance(entity, false) .show(mapActivity.getSupportFragmentManager(), EditPoiDialogFragment.TAG); } diff --git a/OsmAnd/src/net/osmand/plus/osmedit/OsmEditsFragment.java b/OsmAnd/src/net/osmand/plus/osmedit/OsmEditsFragment.java index 87a87631e9..3fd20c83e1 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/OsmEditsFragment.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/OsmEditsFragment.java @@ -31,7 +31,7 @@ import android.widget.Toast; import net.osmand.AndroidUtils; import net.osmand.data.PointDescription; -import net.osmand.osm.edit.Node; +import net.osmand.osm.edit.Entity; import net.osmand.plus.GPXUtilities; import net.osmand.plus.GPXUtilities.GPXFile; import net.osmand.plus.GPXUtilities.WptPt; @@ -537,7 +537,7 @@ public class OsmEditsFragment extends OsmAndListFragment implements SendPoiDialo @Override public void onModifyOsmChangeClick(OsmPoint osmPoint) { OpenstreetmapPoint i = (OpenstreetmapPoint) getPointAfterModify(osmPoint); - final Node entity = i.getEntity(); + final Entity entity = i.getEntity(); refreshId = entity.getId(); EditPoiDialogFragment.createInstance(entity, false).show(getActivity().getSupportFragmentManager(), "edit_poi"); } diff --git a/OsmAnd/src/net/osmand/plus/osmedit/OsmEditsLayer.java b/OsmAnd/src/net/osmand/plus/osmedit/OsmEditsLayer.java index 2735f88168..93ece10d15 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/OsmEditsLayer.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/OsmEditsLayer.java @@ -13,7 +13,7 @@ import android.widget.Toast; import net.osmand.data.LatLon; import net.osmand.data.PointDescription; import net.osmand.data.RotatedTileBox; -import net.osmand.osm.edit.Node; +import net.osmand.osm.edit.Entity; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.views.ContextMenuLayer; @@ -209,9 +209,9 @@ public class OsmEditsLayer extends OsmandMapLayer implements ContextMenuLayer.IC if (o instanceof OsmPoint) { if (o instanceof OpenstreetmapPoint) { OpenstreetmapPoint objectInMotion = (OpenstreetmapPoint) o; - Node node = objectInMotion.getEntity(); - node.setLatitude(position.getLatitude()); - node.setLongitude(position.getLongitude()); + Entity entity = objectInMotion.getEntity(); + entity.setLatitude(position.getLatitude()); + entity.setLongitude(position.getLongitude()); new SaveOsmChangeAsyncTask(mOsmChangeUtil, callback, objectInMotion).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } else if (o instanceof OsmNotesPoint) { OsmNotesPoint objectInMotion = (OsmNotesPoint) o; @@ -223,7 +223,7 @@ public class OsmEditsLayer extends OsmandMapLayer implements ContextMenuLayer.IC } } - static class SaveOsmChangeAsyncTask extends AsyncTask { + static class SaveOsmChangeAsyncTask extends AsyncTask { private final OpenstreetmapLocalUtil mOpenstreetmapUtil; @Nullable private final ContextMenuLayer.ApplyMovedObjectCallback mCallback; @@ -237,16 +237,16 @@ public class OsmEditsLayer extends OsmandMapLayer implements ContextMenuLayer.IC } @Override - protected Node doInBackground(Void... params) { - Node node = objectInMotion.getEntity(); - return mOpenstreetmapUtil.commitNodeImpl(objectInMotion.getAction(), node, - mOpenstreetmapUtil.getEntityInfo(node.getId()), "", false, null); + protected Entity doInBackground(Void... params) { + Entity entity = objectInMotion.getEntity(); + return mOpenstreetmapUtil.commitEntityImpl(objectInMotion.getAction(), entity, + mOpenstreetmapUtil.getEntityInfo(entity.getId()), "", false, null); } @Override - protected void onPostExecute(Node newNode) { + protected void onPostExecute(Entity newEntity) { if (mCallback != null) { - mCallback.onApplyMovedObject(newNode != null, objectInMotion); + mCallback.onApplyMovedObject(newEntity != null, objectInMotion); } } } diff --git a/OsmAnd/src/net/osmand/plus/osmedit/UploadOpenstreetmapPointAsyncTask.java b/OsmAnd/src/net/osmand/plus/osmedit/UploadOpenstreetmapPointAsyncTask.java index 56c279caee..5a88ab060d 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/UploadOpenstreetmapPointAsyncTask.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/UploadOpenstreetmapPointAsyncTask.java @@ -3,6 +3,7 @@ package net.osmand.plus.osmedit; import android.content.DialogInterface; import android.os.AsyncTask; +import net.osmand.osm.edit.Entity; import net.osmand.osm.edit.EntityInfo; import net.osmand.osm.edit.Node; import net.osmand.plus.dialogs.ProgressDialogFragment; @@ -53,9 +54,15 @@ public class UploadOpenstreetmapPointAsyncTask OpenstreetmapPoint p = (OpenstreetmapPoint) point; EntityInfo entityInfo = null; if (OsmPoint.Action.CREATE != p.getAction()) { - entityInfo = remotepoi.loadNode(p.getEntity()); + Entity entity = p.getEntity(); + if (entity instanceof Node) { + entityInfo = remotepoi.loadNode((Node) entity); + } else { + loadErrorsMap.put(point, "Entity is not node"); + return loadErrorsMap; + } } - Node n = remotepoi.commitNodeImpl(p.getAction(), p.getEntity(), entityInfo, + Entity n = remotepoi.commitEntityImpl(p.getAction(), p.getEntity(), entityInfo, p.getComment(), false, null); if (n != null) { uploaded = true; diff --git a/OsmAnd/src/net/osmand/plus/quickaction/actions/AddPOIAction.java b/OsmAnd/src/net/osmand/plus/quickaction/actions/AddPOIAction.java index e961cfb161..f7f9cc7b9c 100644 --- a/OsmAnd/src/net/osmand/plus/quickaction/actions/AddPOIAction.java +++ b/OsmAnd/src/net/osmand/plus/quickaction/actions/AddPOIAction.java @@ -32,6 +32,7 @@ import net.osmand.osm.AbstractPoiType; import net.osmand.osm.MapPoiTypes; import net.osmand.osm.PoiCategory; import net.osmand.osm.PoiType; +import net.osmand.osm.edit.Entity; import net.osmand.osm.edit.Node; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandPlugin; @@ -91,9 +92,9 @@ public class AddPOIAction extends QuickAction { node.replaceTags(getTagsFromParams()); EditPoiData editPoiData = new EditPoiData(node, activity.getMyApplication()); if (Boolean.valueOf(getParams().get(KEY_DIALOG))) { - Node newNode = editPoiData.getEntity(); + Entity newEntity = editPoiData.getEntity(); EditPoiDialogFragment editPoiDialogFragment = - EditPoiDialogFragment.createInstance(newNode, true, getTagsFromParams()); + EditPoiDialogFragment.createInstance(newEntity, true, getTagsFromParams()); editPoiDialogFragment.show(activity.getSupportFragmentManager(), EditPoiDialogFragment.TAG); } else { @@ -129,11 +130,11 @@ public class AddPOIAction extends QuickAction { newNode.putTagNoLC(tag.getKey(), tag.getValue()); } } - EditPoiDialogFragment.commitNode(action, newNode, mOpenstreetmapUtil.getEntityInfo(newNode.getId()), "", false, - new CallbackWithObject() { + EditPoiDialogFragment.commitEntity(action, newNode, mOpenstreetmapUtil.getEntityInfo(newNode.getId()), "", false, + new CallbackWithObject() { @Override - public boolean processResult(Node result) { + public boolean processResult(Entity result) { if (result != null) { OsmEditingPlugin plugin = OsmandPlugin.getPlugin(OsmEditingPlugin.class); if (plugin != null && offlineEdit) {