package it.geosolutions.geocollect.android.core.form.action;
import it.geosolutions.android.map.wfs.geojson.GeoJson;
import it.geosolutions.geocollect.android.app.R;
import it.geosolutions.geocollect.android.core.form.FormEditActivity;
import it.geosolutions.geocollect.android.core.form.utils.FormUtils;
import it.geosolutions.geocollect.android.core.login.LoginActivity;
import it.geosolutions.geocollect.android.core.login.utils.LoginRequestInterceptor;
import it.geosolutions.geocollect.android.core.mission.Mission;
import it.geosolutions.geocollect.android.core.mission.MissionFeature;
import it.geosolutions.geocollect.android.core.mission.PendingMissionListActivity;
import it.geosolutions.geocollect.android.core.mission.utils.MissionUtils;
import it.geosolutions.geocollect.android.core.mission.utils.PersistenceUtils;
import it.geosolutions.geocollect.android.core.widgets.dialog.UploadDialog;
import it.geosolutions.geocollect.model.config.MissionTemplate;
import it.geosolutions.geocollect.model.http.CommitResponse;
import it.geosolutions.geocollect.model.viewmodel.FormAction;
import it.geosolutions.geocollect.model.viewmodel.Page;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import jsqlite.Database;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.NavUtils;
import android.text.Html;
import android.util.Log;
import android.widget.Toast;
import com.actionbarsherlock.app.SherlockFragment;
/**
* class to start the upload process for a created missionFeature
*
* @author robertoehler
*
*/
public class SendMissionFeatureAction extends AndroidAction {
private static final long serialVersionUID = 6464461286516024625L;
final String TAG = SendMissionFeatureAction.class.getSimpleName();
private static final String ATTRIBUTE_CONFIRM_MESSAGE="confirmMessage";
/**
* Fragment upload
*/
private static final String FRAGMENT_UPLOAD_DIALOG="FRAGMENT_UPLOAD_DIALOG";
public SendMissionFeatureAction(FormAction a){
super(a);
this.attributes = a.attributes;
this.dataModel = a.dataModel;
this.iconCls = a.iconCls;
this.id = a.id;
this.type = a.type;
this.text = a.text;
}
/**
* check if all mandatory fields are filled, confirm the upload
* @param fragment
* @param action
* @param missionFeature
*/
public void performAction(final SherlockFragment fragment, final FormAction action, final MissionFeature missionFeature) {
Log.d(SendMissionFeatureAction.class.getSimpleName(), "perform sendaction");
final MissionTemplate t = MissionUtils.getDefaultTemplate(fragment.getActivity());
Database db = ((FormEditActivity) fragment.getSherlockActivity()).spatialiteDatabase;
// check database for mandatory fields
ArrayList<String> notFilledMandatoryEntries = MissionUtils.checkIfAllMandatoryFieldsAreSatisfied(t.seg_form, Mission.ORIGIN_ID_STRING, db,t.schema_seg.localSourceStore+ MissionTemplate.NEW_NOTICE_SUFFIX);
if(notFilledMandatoryEntries.size() > 0){
String missing = fragment.getString(R.string.mandatory_fields_not_filled)+"\n\n";
for(String string : notFilledMandatoryEntries){
missing+=" \u2022 "+ string+"\n";
}
missing += "\n"+fragment.getString(R.string.mandatory_fields_please_fill);
Log.d(TAG, "missing "+Html.fromHtml(missing));
new AlertDialog.Builder(fragment.getActivity())
.setTitle(R.string.missing_data)
.setMessage(missing)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
//nothing
}
})
.show();
return;
}
// Edit the MissionFeature for a better JSON compliance
MissionUtils.alignPropertiesTypes(missionFeature, t.schema_seg.fields );
String confirm =null;
if(attributes!=null){
confirm= (String) attributes.get(ATTRIBUTE_CONFIRM_MESSAGE);
}
if(confirm !=null){
new AlertDialog.Builder(fragment.getActivity())
.setTitle(R.string.sending_data)
.setMessage(confirm)
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
sendData( fragment, action, MissionUtils.alignMissionFeatureProperties(missionFeature, t.schema_seg.fields) );
}
})
.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// do nothing
}
})
.show();
}else{
//missing confirm message will send without any confirmation
sendData( fragment, action, MissionUtils.alignMissionFeatureProperties(missionFeature, t.schema_seg.fields));
}
}
/**
* Send data to the server
* @param fragment
* @param action
* @param missionFeature to send
*/
private void sendData(final SherlockFragment fragment, FormAction action,final MissionFeature missionFeature) {
//createProgressAlert();
//uploadData();
android.support.v4.app.FragmentManager fm = fragment.getSherlockActivity().getSupportFragmentManager();
Fragment mTaskFragment = (Fragment)fm.findFragmentByTag(FRAGMENT_UPLOAD_DIALOG);
if(mTaskFragment==null){
FragmentTransaction ft = fm.beginTransaction();
String url = (String) action.attributes.get("url");
String murl = (String) action.attributes.get("mediaurl");
mTaskFragment = new UploadDialog(){
/**
* Delete this entry if uploading was successful
*
* Navigate up to the list
*/
/* (non-Javadoc)
* @see it.geosolutions.geocollect.android.core.widgets.dialog.UploadDialog#onFinish(android.app.Activity, it.geosolutions.geocollect.model.http.CommitResponse)
*/
@Override
public void onFinish(Activity ctx, CommitResponse result) {
if(result !=null && result.isSuccess()){
if(ctx != null){
Toast.makeText(ctx, getResources().getString(R.string.data_send_success), Toast.LENGTH_LONG).show();
//delete this mission
final MissionTemplate t = MissionUtils.getDefaultTemplate(fragment.getSherlockActivity());
final Database db = ((FormEditActivity)fragment.getSherlockActivity()).spatialiteDatabase;
PersistenceUtils.deleteMissionFeature(db, t.schema_seg.localSourceStore+ MissionTemplate.NEW_NOTICE_SUFFIX, missionFeature.id);
//back to list
Intent i = new Intent(ctx,PendingMissionListActivity.class);
i.putExtra(PendingMissionListActivity.ARG_CREATE_MISSIONFEATURE, true);
i.putExtra(PendingMissionListActivity.KEY_NAVIGATING_UP, true);
NavUtils.navigateUpTo(ctx, i);
}
super.onFinish(ctx,result);
}else{
Toast.makeText(ctx, R.string.error_sending_data, Toast.LENGTH_LONG).show();
super.onFinish(ctx,result);
}
}
};
Bundle arguments = new Bundle();
arguments.putString(UploadDialog.PARAMS.DATAURL, url);
arguments.putString(UploadDialog.PARAMS.MEDIAURL, murl);
String featureIDString = MissionUtils.getFeatureGCID(missionFeature);
// Set the "MY_ORIG_ID" to link this feature to its photos
if(missionFeature.properties == null){
missionFeature.properties = new HashMap<String, Object>();
}
missionFeature.properties.put(Mission.MY_ORIG_ID_STRING, featureIDString);
// Auto set GCID
missionFeature.properties.put(MissionUtils.GCID_STRING, featureIDString);
GeoJson gson = new GeoJson();
String c = gson.toJson( missionFeature);
String data = null;
try {
data = new String(c.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
Log.e(TAG, "error transforming missionfeature to gson",e);
}
int defaultImageSize = 1000;
FormUtils.resizeImagesToMax(fragment.getActivity().getBaseContext(), featureIDString, defaultImageSize);
//
// arguments.putString(UploadDialog.PARAMS.DATA, data);
// arguments.putString(UploadDialog.PARAMS.ORIGIN_ID, featureIDString);
//
// /*
// * TODO: Change this line into
// * arguments.putString(UploadDialog.PARAMS.MISSION_ID, <mission_id_here>);
// * when the MapStore GetFeatureInfoMenu will handle parametric missions id
// */
// arguments.putString(UploadDialog.PARAMS.MISSION_ID, "punti_abbandono");
//
// arguments.putStringArray(UploadDialog.PARAMS.MEDIA, FormUtils.getPhotoUriStrings(fragment.getActivity().getBaseContext(),featureIDString));
// arguments.putBoolean(UploadDialog.PARAMS.MISSION_FEATURE_UPLOAD, true);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(fragment.getSherlockActivity());
//String authKey = prefs.getString(LoginActivity.PREFS_AUTH_KEY, null);
String email = prefs.getString(LoginActivity.PREFS_USER_EMAIL, null);
String pass = prefs.getString(LoginActivity.PREFS_PASSWORD, null);
arguments.putString(UploadDialog.PARAMS.BASIC_AUTH, LoginRequestInterceptor.getB64Auth(email, pass));
mTaskFragment.setArguments(arguments);
((DialogFragment)mTaskFragment).setCancelable(false);
ft.add(mTaskFragment, FRAGMENT_UPLOAD_DIALOG);
//ft.add(R.id.embedded, newFragment);
ft.commit();
}
}
@Override
public void performAction(SherlockFragment fragment, FormAction action,
Mission m, Page p) {
// TODO Auto-generated method stub
}
}