package de.blau.android.dialogs;
import org.acra.ACRA;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AlertDialog.Builder;
import android.support.v7.app.AppCompatDialog;
import android.util.Log;
import de.blau.android.App;
import de.blau.android.Logic;
import de.blau.android.Main;
import de.blau.android.R;
import de.blau.android.UploadResult;
import de.blau.android.osm.OsmElement;
import de.blau.android.osm.StorageDelegator;
import de.blau.android.util.ThemeUtils;
/**
* Dialog to resolve upload conflicts one by one
* @author simon
*
*/
public class UploadConflict extends DialogFragment
{
private static final String DEBUG_TAG = UploadConflict.class.getSimpleName();
private static final String TAG = "fragment_upload_conflict";
private UploadResult result;
static public void showDialog(FragmentActivity activity, UploadResult result) {
dismissDialog(activity);
FragmentManager fm = activity.getSupportFragmentManager();
try {
UploadConflict uploadConflictDialogFragment = newInstance(result);
if (uploadConflictDialogFragment != null) {
uploadConflictDialogFragment.show(fm, TAG);
} else {
Log.e(DEBUG_TAG,"Unable to create dialog for upload conflict " + result);
}
} catch (IllegalStateException isex) {
Log.e(DEBUG_TAG,"dismissDialog",isex);
}
}
private static void dismissDialog(FragmentActivity activity) {
FragmentManager fm = activity.getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
Fragment fragment = fm.findFragmentByTag(TAG);
try {
if (fragment != null) {
ft.remove(fragment);
}
ft.commit();
} catch (IllegalStateException isex) {
Log.e(DEBUG_TAG,"dismissDialog",isex);
}
}
/**
*/
static private UploadConflict newInstance(final UploadResult result) {
UploadConflict f = new UploadConflict();
Bundle args = new Bundle();
args.putSerializable("uploadresult", result);
f.setArguments(args);
f.setShowsDialog(true);
return f;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Log.d(DEBUG_TAG, "onAttach");
if (!(activity instanceof Main)) {
throw new ClassCastException(activity.toString() + " can ownly be called from Main");
}
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setCancelable(true);
result = (UploadResult) getArguments().getSerializable("uploadresult");
}
@NonNull
@Override
public AppCompatDialog onCreateDialog(Bundle savedInstanceState)
{
Builder builder = new AlertDialog.Builder(getActivity());
builder.setIcon(ThemeUtils.getResIdFromAttribute(getActivity(),R.attr.alert_dialog));
builder.setTitle(R.string.upload_conflict_title);
Resources res = getActivity().getResources();
final Logic logic = App.getLogic();
final OsmElement elementOnServer = logic.getElement(getActivity(), result.elementType, result.osmId);
final OsmElement elementLocal = App.getDelegator().getOsmElement(result.elementType, result.osmId);
final long newVersion;
try {
boolean useServerOnly = false;
if (elementOnServer != null) {
if (elementLocal.getState()==OsmElement.STATE_DELETED) {
builder.setMessage(res.getString(R.string.upload_conflict_message_referential, elementLocal.getDescription(true)));
useServerOnly = true;
} else {
builder.setMessage(res.getString(R.string.upload_conflict_message_version, elementLocal.getDescription(true), elementLocal.getOsmVersion(), elementOnServer.getOsmVersion()));
}
newVersion = elementOnServer.getOsmVersion();
} else {
if (elementLocal.getState()==OsmElement.STATE_DELETED) {
builder.setMessage(res.getString(R.string.upload_conflict_message_already_deleted, elementLocal.getDescription(true)));
App.getDelegator().removeFromUpload(elementLocal);
builder.setPositiveButton(R.string.retry, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
((Main)getActivity()).confirmUpload(); // FIXME this should be made independent from Main
}
});
return builder.create();
} else {
builder.setMessage(res.getString(R.string.upload_conflict_message_deleted, elementLocal.getDescription(true), elementLocal.getOsmVersion()));
}
newVersion = elementLocal.getOsmVersion() + 1;
}
if (!useServerOnly) {
builder.setPositiveButton(R.string.use_local_version, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
logic.fixElementWithConflict(getActivity(), newVersion, elementLocal, elementOnServer);
((Main)getActivity()).confirmUpload(); // FIXME this should be made independent from Main
}
});
}
builder.setNeutralButton(R.string.use_server_version,new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
StorageDelegator storageDelegator = App.getDelegator();
storageDelegator.removeFromUpload(elementLocal);
if (elementOnServer != null) {
logic.downloadElement(getActivity(), elementLocal.getName(), elementLocal.getOsmId(), false, true, null);
} else { // delete local element
logic.updateToDeleted(getActivity(), elementLocal);
}
if (!storageDelegator.getApiStorage().isEmpty()) {
((Main)getActivity()).confirmUpload(); // FIXME this should be made independent from Main
}
}
});
} catch (Exception e) {
Log.e(DEBUG_TAG,"Caught exception " + e);
ACRA.getErrorReporter().putCustomData("STATUS","NOCRASH");
ACRA.getErrorReporter().handleException(e);
}
builder.setNegativeButton(R.string.cancel, null);
return builder.create();
}
}