Fix #1776 : app crashes when you rotate the screen when uploading to OSM

Implemented with dialog fragment.
This commit is contained in:
GaidamakUA 2015-12-07 17:52:40 +02:00
parent 81a610c738
commit 29e88f41ac
6 changed files with 113 additions and 40 deletions

View file

@ -0,0 +1,80 @@
package net.osmand.plus.dialogs;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import net.osmand.plus.ProgressImplementation;
/**
* Created by GaidamakUA on 12/7/15.
*/
public class ProgressDialogFragment extends DialogFragment {
public static final String TAG = "progress";
private static final String TITLE_ID = "title_id";
private static final String MESSAGE_ID = "message_id";
private static final String STYLE = "style";
private int mMax;
private int accumulatedDelta;
private DialogInterface.OnDismissListener onDismissListener;
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Bundle args = getArguments();
int titleId = args.getInt(TITLE_ID);
int messageId = args.getInt(MESSAGE_ID);
int style = args.getInt(STYLE);
final ProgressDialog dialog = ProgressImplementation.createProgressDialog(getActivity(),
getString(titleId), getString(messageId),
style).getDialog();
dialog.setIndeterminate(false);
dialog.setMax(mMax);
dialog.setProgress(0);
return dialog;
}
public void setMax(final int max) {
mMax = max;
if (getDialog() != null) {
getProgressDialog().setMax(mMax);
}
}
public void incrementProgressBy(int delta) {
if (getDialog() == null) {
accumulatedDelta += delta;
} else {
getProgressDialog().incrementProgressBy(delta + accumulatedDelta);
}
}
private ProgressDialog getProgressDialog() {
return (ProgressDialog) getDialog();
}
@Override
public void onDismiss(DialogInterface dialog) {
if (onDismissListener != null) {
onDismissListener.onDismiss(dialog);
}
}
public void setOnDismissListener(DialogInterface.OnDismissListener onDismissListener) {
this.onDismissListener = onDismissListener;
}
public static ProgressDialogFragment createInstance(int titleId, int messageId, int style) {
ProgressDialogFragment fragment = new ProgressDialogFragment();
Bundle args = new Bundle();
args.putInt(TITLE_ID, titleId);
args.putInt(MESSAGE_ID, messageId);
args.putInt(STYLE, style);
fragment.setArguments(args);
return fragment;
}
}

View file

@ -14,12 +14,12 @@ import android.widget.TextView;
import net.osmand.data.PointDescription;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.ProgressImplementation;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.dashboard.DashBaseFragment;
import net.osmand.plus.dashboard.DashboardOnMap;
import net.osmand.plus.dashboard.tools.DashFragmentData;
import net.osmand.plus.dialogs.ProgressDialogFragment;
import net.osmand.plus.osmedit.dialogs.SendPoiDialogFragment;
import java.util.ArrayList;
@ -153,9 +153,8 @@ public class DashOsmEditsFragment extends DashBaseFragment
public void showProgressDialog(OsmPoint[] points, boolean closeChangeSet) {
OsmPoint[] toUpload = points;
ProgressDialog dialog = ProgressImplementation.createProgressDialog(getActivity(),
getString(R.string.uploading), getString(R.string.local_openstreetmap_uploading),
ProgressDialog.STYLE_HORIZONTAL).getDialog();
ProgressDialogFragment dialog = ProgressDialogFragment.createInstance(R.string.uploading,
R.string.local_openstreetmap_uploading, ProgressDialog.STYLE_HORIZONTAL);
OsmEditsUploadListener listener = new OsmEditsUploadListenerHelper(getActivity(),
getString(R.string.local_openstreetmap_were_uploaded)) {
@Override
@ -174,10 +173,10 @@ public class DashOsmEditsFragment extends DashBaseFragment
}
}
};
dialog.show(getChildFragmentManager(), ProgressDialogFragment.TAG);
UploadOpenstreetmapPointAsyncTask uploadTask = new UploadOpenstreetmapPointAsyncTask(dialog,
listener, plugin, toUpload.length, closeChangeSet);
uploadTask.execute(toUpload);
dialog.show();
}
private void getOsmPoints(ArrayList<OsmPoint> dataPoints) {

View file

@ -8,9 +8,9 @@ import net.osmand.access.AccessibleAlertBuilder;
import net.osmand.data.PointDescription;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.ProgressImplementation;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.dialogs.ProgressDialogFragment;
import net.osmand.plus.mapcontextmenu.MenuController;
import net.osmand.plus.osmedit.OsmPoint.Action;
import net.osmand.plus.osmedit.dialogs.SendPoiDialogFragment;
@ -26,7 +26,7 @@ public class EditPOIMenuController extends MenuController {
private String pointTypeStr;
private ProgressDialogPoiUploader poiUploader;
public EditPOIMenuController(OsmandApplication app, MapActivity mapActivity, PointDescription pointDescription, OsmPoint osmPoint) {
public EditPOIMenuController(OsmandApplication app, final MapActivity mapActivity, PointDescription pointDescription, OsmPoint osmPoint) {
super(new EditPOIMenuBuilder(app, osmPoint), pointDescription, mapActivity);
this.osmPoint = osmPoint;
plugin = OsmandPlugin.getPlugin(OsmEditingPlugin.class);
@ -34,11 +34,10 @@ public class EditPOIMenuController extends MenuController {
poiUploader = new ProgressDialogPoiUploader() {
@Override
public void showProgressDialog(OsmPoint[] points, boolean closeChangeSet) {
ProgressDialog dialog = ProgressImplementation.createProgressDialog(
getMapActivity(),
getMapActivity().getString(R.string.uploading),
getMapActivity().getString(R.string.local_openstreetmap_uploading),
ProgressDialog.STYLE_HORIZONTAL).getDialog();
ProgressDialogFragment dialog = ProgressDialogFragment.createInstance(
R.string.uploading,
R.string.local_openstreetmap_uploading,
ProgressDialog.STYLE_HORIZONTAL);
OsmEditsUploadListener listener = new OsmEditsUploadListenerHelper(getMapActivity(),
getMapActivity().getString(R.string.local_openstreetmap_were_uploaded)) {
@Override
@ -52,11 +51,10 @@ public class EditPOIMenuController extends MenuController {
}
}
};
dialog.show(mapActivity.getSupportFragmentManager(), ProgressDialogFragment.TAG);
UploadOpenstreetmapPointAsyncTask uploadTask = new UploadOpenstreetmapPointAsyncTask(
dialog, listener, plugin, points.length, closeChangeSet);
uploadTask.execute(points);
dialog.show();
}
};

View file

@ -27,19 +27,20 @@ import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import net.osmand.access.AccessibleToast;
import net.osmand.data.PointDescription;
import net.osmand.osm.edit.Node;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.OsmandSettings;
import net.osmand.plus.ProgressImplementation;
import net.osmand.plus.R;
import net.osmand.plus.activities.ActionBarProgressActivity;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.OsmAndListFragment;
import net.osmand.plus.activities.OsmandActionBarActivity;
import net.osmand.plus.dialogs.DirectionsDialogs;
import net.osmand.plus.dialogs.ProgressDialogFragment;
import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.myplaces.FavoritesActivity;
import net.osmand.plus.osmedit.OsmPoint.Action;
@ -527,11 +528,10 @@ public class OsmEditsFragment extends OsmAndListFragment
}
public void showProgressDialog(OsmPoint[] points, boolean closeChangeSet) {
ProgressDialog dialog = ProgressImplementation.createProgressDialog(
getActivity(),
getString(R.string.uploading),
getString(R.string.local_openstreetmap_uploading),
ProgressDialog.STYLE_HORIZONTAL).getDialog();
ProgressDialogFragment dialog = ProgressDialogFragment.createInstance(
R.string.uploading,
R.string.local_openstreetmap_uploading,
ProgressDialog.STYLE_HORIZONTAL);
OsmEditsUploadListener listener = new OsmEditsUploadListenerHelper(getActivity(),
getString(R.string.local_openstreetmap_were_uploaded)) {
@Override
@ -545,11 +545,10 @@ public class OsmEditsFragment extends OsmAndListFragment
listAdapter.notifyDataSetChanged();
}
};
dialog.show(getActivity().getSupportFragmentManager(), ProgressDialogFragment.TAG);
UploadOpenstreetmapPointAsyncTask uploadTask = new UploadOpenstreetmapPointAsyncTask(
dialog, listener, plugin, points.length, closeChangeSet);
uploadTask.execute(points);
dialog.show();
}

View file

@ -27,8 +27,8 @@ import net.osmand.access.AccessibleToast;
import net.osmand.plus.IconsCache;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.ProgressImplementation;
import net.osmand.plus.R;
import net.osmand.plus.dialogs.ProgressDialogFragment;
import java.text.MessageFormat;
import java.util.ArrayList;
@ -85,16 +85,14 @@ public class OsmEditsUploadListenerHelper implements OsmEditsUploadListener {
activity.getResources().getString(R.string.local_openstreetmap_were_uploaded));
Resources resources = activity.getResources();
ProgressDialog dialog = ProgressImplementation.createProgressDialog(
activity,
resources.getString(R.string.uploading),
resources.getString(R.string.local_openstreetmap_uploading),
ProgressDialog.STYLE_HORIZONTAL).getDialog();
ProgressDialogFragment dialog = ProgressDialogFragment.createInstance(
R.string.uploading,
R.string.local_openstreetmap_uploading,
ProgressDialog.STYLE_HORIZONTAL);
dialog.show(activity.getSupportFragmentManager(), ProgressDialogFragment.TAG);
UploadOpenstreetmapPointAsyncTask uploadTask = new UploadOpenstreetmapPointAsyncTask(
dialog, helper, plugin, toUpload.length, false);
uploadTask.execute(toUpload);
dialog.show();
}
public static final class UploadingErrorDialogFragment extends DialogFragment {

View file

@ -1,11 +1,11 @@
package net.osmand.plus.osmedit;
import android.app.ProgressDialog;
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;
@ -14,7 +14,7 @@ import java.util.Map;
*/
public class UploadOpenstreetmapPointAsyncTask
extends AsyncTask<OsmPoint, OsmPoint, Map<OsmPoint, String>> {
private ProgressDialog progress;
private ProgressDialogFragment progress;
private OpenstreetmapRemoteUtil remotepoi;
private OsmBugsRemoteUtil remotebug;
private int listSize = 0;
@ -23,7 +23,7 @@ public class UploadOpenstreetmapPointAsyncTask
private OsmEditingPlugin plugin;
private final boolean closeChangeSet;
public UploadOpenstreetmapPointAsyncTask(ProgressDialog progress,
public UploadOpenstreetmapPointAsyncTask(ProgressDialogFragment progress,
OsmEditsUploadListener listener,
OsmEditingPlugin plugin,
int listSize,
@ -81,20 +81,18 @@ public class UploadOpenstreetmapPointAsyncTask
protected void onPreExecute() {
interruptUploading = false;
progress.setOnCancelListener(new DialogInterface.OnCancelListener() {
progress.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onCancel(DialogInterface dialog) {
public void onDismiss(DialogInterface dialog) {
UploadOpenstreetmapPointAsyncTask.this.setInterruptUploading(true);
}
});
progress.setIndeterminate(false);
progress.setMax(listSize);
progress.setProgress(0);
}
@Override
protected void onPostExecute(Map<OsmPoint, String> loadErrorsMap) {
if (progress.isShowing()) {
if (progress != null) {
progress.dismiss();
}
listener.uploadEnded(loadErrorsMap);
@ -108,9 +106,10 @@ public class UploadOpenstreetmapPointAsyncTask
protected void onProgressUpdate(OsmPoint... points) {
for (OsmPoint p : points) {
listener.uploadUpdated(p);
progress.incrementProgressBy(1);
if (progress != null) {
progress.incrementProgressBy(1);
}
}
}
}