package it.geosolutions.geocollect.android.core.form.action;
import it.geosolutions.geocollect.android.app.BuildConfig;
import it.geosolutions.geocollect.android.app.R;
import it.geosolutions.geocollect.android.core.mission.Mission;
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.model.config.MissionTemplate;
import it.geosolutions.geocollect.model.viewmodel.FormAction;
import it.geosolutions.geocollect.model.viewmodel.Page;
import java.util.ArrayList;
import java.util.HashMap;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.v4.app.NavUtils;
import android.text.Html;
import android.util.Log;
import android.widget.Toast;
import com.actionbarsherlock.app.SherlockFragment;
public class SaveAction extends AndroidAction {
/**
* Tag for Logging
*/
private static String TAG = "SaveAction";
/**
* serialVersionUID
*/
private static final long serialVersionUID = 1L;
public SaveAction(FormAction a) {
super(a);
}
/* (non-Javadoc)
* @see it.geosolutions.geocollect.android.core.form.action.AndroidAction#performAction(android.support.v4.app.Fragment, it.geosolutions.geocollect.model.viewmodel.Action, it.geosolutions.geocollect.android.core.mission.Mission, it.geosolutions.geocollect.model.viewmodel.Page)
*/
@Override
public void performAction(final SherlockFragment fragment, final FormAction action, final Mission m, final Page p) {
if(fragment == null){
if(BuildConfig.DEBUG){
Log.w(TAG, "Given fragment is NULL, cannot perform action");
}
return;
}
if(fragment.getActivity() == null){
if(BuildConfig.DEBUG){
Log.w(TAG, "Given fragment Activity is NULL, cannot perform action");
}
return;
}
String tableName = m.getTemplate().id+"_data";
if(m.getTemplate().schema_sop != null && m.getTemplate().schema_sop.localFormStore != null && !m.getTemplate().schema_sop.localFormStore.isEmpty()){
tableName = m.getTemplate().schema_sop.localFormStore;
}
MissionTemplate t = MissionUtils.getDefaultTemplate(fragment.getActivity());
String originIDString = MissionUtils.getMissionGCID(m);
// check database for mandatory fields
ArrayList<String> notFilledMandatoryEntries = MissionUtils.checkIfAllMandatoryFieldsAreSatisfied(t.sop_form, originIDString, m.db, tableName);
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;
}
final String finalTableName = tableName;
new AlertDialog.Builder(fragment.getActivity())
.setTitle(R.string.saving_data_title)
.setMessage(fragment.getString(R.string.saving_data_message, fragment.getString(R.string.survey)))
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
//save "uploadable" state
HashMap<String,ArrayList<String>> uploadables = PersistenceUtils.loadUploadables(fragment.getSherlockActivity());
if(uploadables.containsKey(finalTableName)){
//list exists, add this entry
uploadables.get(finalTableName).add(MissionUtils.getFeatureGCID( m.getOrigin()));
}else{
ArrayList<String> ids = new ArrayList<String>();
ids.add(MissionUtils.getFeatureGCID(m.getOrigin()));
uploadables.put(finalTableName, ids);
}
PersistenceUtils.saveUploadables(fragment.getSherlockActivity(), uploadables);
//confirm save to user
Toast.makeText(fragment.getSherlockActivity(), fragment.getResources().getString(R.string.entry_saved_success,fragment.getResources().getString(R.string.survey)), Toast.LENGTH_LONG).show();
//done, navigate back
Intent i = new Intent(fragment.getSherlockActivity(), PendingMissionListActivity.class);
i.putExtra(PendingMissionListActivity.KEY_NAVIGATING_UP, true);
NavUtils.navigateUpTo(fragment.getSherlockActivity(), i );
}
})
.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// do nothing
}
})
.show();
}
}