package net.osmand.plus.osmedit; import android.content.DialogInterface; import android.os.AsyncTask; import net.osmand.osm.edit.EntityInfo; import net.osmand.osm.edit.Node; import net.osmand.plus.dialogs.ProgressDialogFragment; import java.util.HashMap; import java.util.Map; /** */ public class UploadOpenstreetmapPointAsyncTask extends AsyncTask<OsmPoint, OsmPoint, Map<OsmPoint, String>> { private ProgressDialogFragment progress; private OpenstreetmapRemoteUtil remotepoi; private OsmBugsRemoteUtil remotebug; private int listSize = 0; private boolean interruptUploading = false; private OsmEditsUploadListener listener; private OsmEditingPlugin plugin; private final boolean closeChangeSet; private final boolean loadAnonymous; public UploadOpenstreetmapPointAsyncTask(ProgressDialogFragment progress, OsmEditsUploadListener listener, OsmEditingPlugin plugin, int listSize, boolean closeChangeSet, boolean loadAnonymous) { this.progress = progress; this.plugin = plugin; this.remotepoi = plugin.getPoiModificationRemoteUtil(); this.remotebug = plugin.getOsmNotesRemoteUtil(); this.listSize = listSize; this.listener = listener; this.closeChangeSet = closeChangeSet; this.loadAnonymous = loadAnonymous; } @Override protected Map<OsmPoint, String> doInBackground(OsmPoint... points) { Map<OsmPoint, String> loadErrorsMap = new HashMap<>(); boolean uploaded = false; for (OsmPoint point : points) { if (interruptUploading) break; if (point.getGroup() == OsmPoint.Group.POI) { OpenstreetmapPoint p = (OpenstreetmapPoint) point; EntityInfo entityInfo = null; if (OsmPoint.Action.CREATE != p.getAction()) { entityInfo = remotepoi.loadNode(p.getEntity()); } Node n = remotepoi.commitNodeImpl(p.getAction(), p.getEntity(), entityInfo, p.getComment(), false); if (n != null) { uploaded = true; plugin.getDBPOI().deletePOI(p); publishProgress(p); } loadErrorsMap.put(point, n != null ? null : "Unknown problem"); } else if (point.getGroup() == OsmPoint.Group.BUG) { OsmNotesPoint p = (OsmNotesPoint) point; String errorMessage = remotebug.commit(p, p.getText(), p.getAction(), loadAnonymous).warning; if (errorMessage == null) { plugin.getDBBug().deleteAllBugModifications(p); publishProgress(p); } loadErrorsMap.put(point, errorMessage); } } if(uploaded && closeChangeSet) { remotepoi.closeChangeSet(); } return loadErrorsMap; } @Override protected void onPreExecute() { interruptUploading = false; progress.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { UploadOpenstreetmapPointAsyncTask.this.setInterruptUploading(true); } }); progress.setMax(listSize); } @Override protected void onPostExecute(Map<OsmPoint, String> loadErrorsMap) { if (progress != null) { progress.dismiss(); } listener.uploadEnded(loadErrorsMap); } public void setInterruptUploading(boolean b) { interruptUploading = b; } @Override protected void onProgressUpdate(OsmPoint... points) { for (OsmPoint p : points) { listener.uploadUpdated(p); if (progress != null) { progress.incrementProgressBy(1); } } } }