package it.geosolutions.geocollect.android.core.widgets.dialog;
import it.geosolutions.geocollect.android.app.R;
import it.geosolutions.geocollect.android.core.mission.MissionFeature;
import it.geosolutions.geocollect.android.core.mission.utils.UploadTask;
import it.geosolutions.geocollect.model.config.MissionTemplate;
import it.geosolutions.geocollect.model.http.CommitResponse;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
/**
* Fragment that shows upload status
* @author Lorenzo Natali (lorenzo.natali@geo-solutions.it)
*
* adapted for multiple uploads in one background thread by
* @author Robert Oehler
*
*/
public class UploadDialog extends RetainedDialogFragment {
private ProgressBar dataProgress;
private ProgressBar progressMedia;
private TextView txtDataSend;
private TextView txtMediaSend;
private ImageView imgOKData;
private ImageView imgOKMedia;
private ImageView imgBadData;
private ImageView imgBadMedia;
private boolean skipData = false;
private Activity activity;
private static boolean sending = false;
public static class PARAMS {
public static final String DATAURL="URL";
public static final String MEDIAURL="MEDIAURL";
public static final String MISSION_ID="MISSION_ID";
public static final String AUTH_KEY="AUTH_KEY";
public static final String BASIC_AUTH="BASIC_AUTH";
public static final String MISSIONS= "MISSIONS";
public static final String MISSION_MEDIA_URLS= "MISSION_MEDIA_URLS";
public static final String TABLENAME = "TABLENAME";
public static final String FEATURES="FEATURES";
public static final String MISSION_TEMPLATE="MISSION_TEMPLATE";
}
public UploadDialog() {
// Empty constructor required for DialogFragment
super();
}
/**
* Create the view that display current upload progress
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//TODO the retained fragment call this method.
if(getView()==null){;
View view = inflater.inflate(R.layout.progress_send, container);
getDialog().setTitle(getString(R.string.sending_data));
getDialog().setCancelable(false);
//if rotation continue to have problems, block orientation change.
//don't forget to remove the requested orientation after finish
//getActivity().setRequestedOrientation(getActivity().getResources().getConfiguration().orientation);
return view;
} else return getView();
//return super.onCreateView( inflater, container, savedInstanceState);
}
/* (non-Javadoc)
* @see android.support.v4.app.Fragment#onViewCreated(android.view.View, android.os.Bundle)
*/
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if( sending == false ){
setupControls();
}
}
/**
* setup view components (progress elements and textviews for data and progress)
*/
protected void setupControls() {
dataProgress = (ProgressBar) getView().findViewById(
R.id.progress_data_send);
progressMedia = (ProgressBar) getView().findViewById(
R.id.progress_media_send);
txtDataSend = (TextView) getView().findViewById(
R.id.txt_data_send);
txtMediaSend = (TextView) getView().findViewById(
R.id.txt_media_send);
imgOKData = (ImageView) getView().findViewById(
R.id.img_data_send_ok);
imgBadData = (ImageView) getView().findViewById(
R.id.img_data_send_bad);
imgOKMedia = (ImageView) getView()
.findViewById(R.id.img_media_send_ok);
imgBadMedia = (ImageView) getView().findViewById(
R.id.img_media_send_bad);
}
@SuppressWarnings("unchecked")
@Override
public void onActivityCreated(Bundle arg0) {
super.onActivityCreated(arg0);
if (isAdded() && (!sending)) {
new UIUploadTask(
getActivity(),
(MissionTemplate)getArguments().getSerializable(PARAMS.MISSION_TEMPLATE),
(List<MissionFeature>)getArguments().getSerializable(PARAMS.FEATURES)
/*
(HashMap<String, String>) getArguments().getSerializable(PARAMS.MISSIONS),
(HashMap<String, String[]>) getArguments().getSerializable(PARAMS.MISSION_MEDIA_URLS),
getArguments().getStringArray(PARAMS.DATAURL),
getArguments().getStringArray(PARAMS.MEDIAURL),
getArguments().getStringArray(PARAMS.TABLENAME),
(String)getArguments().getSerializable(PARAMS.MISSION_ID)
*/
)
.execute();
}
}
public class Result{
}
/**
* extends Uploadtask giving feedback about the upload status on the UI
*
* @author Robert Oehler
*
*/
private class UIUploadTask extends UploadTask{
public UIUploadTask(
Context pContext,
MissionTemplate mMissionTemplate,
List<MissionFeature> mFeaturesList
/*
HashMap<String, String> pUploads,
HashMap<String, String[]> pMediaUrls,
String[] pDataUrl,
String[] pMediaUrl,
String[] pTableName,
String pMissionID
*/) {
super(pContext, mMissionTemplate, mFeaturesList);
//super(pContext, pUploads, pMediaUrls, pDataUrl, pMediaUrl, pTableName,pMissionID);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
sending = true;
setupDataControls(true);
}
@Override
protected void onPostExecute(CommitResponse result) {
super.onPostExecute(result);
if(result == null || !result.isSuccess()){
setDataSendResultUI(false);
setMediaSendResultUI(false);
closeDialog(false);
Toast.makeText(activity, R.string.error_sending_data, Toast.LENGTH_LONG).show();
Activity c = activity != null ? activity : getActivity();
onFinish(c, result);
}else {
//SUCCESS
setupDataControls(false);
setDataSendResultUI(true);
setupMediaControl(false);
setMediaSendResultUI(true);
closeDialog(true);
Activity c = activity != null ? activity : getActivity();
onFinish(c,result);
}
}
@Override
public void hideMedia() {
//UI update -> data upload
UploadDialog.this.getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
setupMediaControl(false);
setupDataControls(true);
}
});
}
@Override
public void dataDone() {
UploadDialog.this.getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
setupDataControls(false);
setDataSendResultUI(true);
setupMediaControl(true);
}
});
}
@Override
public void done(CommitResponse response) {
//this method is used for tests
}
}
/**
* CloseDialog
*
* @param closeActivity
*/
private void closeDialog(boolean closeActivity) {
//getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
this.dismiss();
sending = false;
}
/**
* Method to override called when application finish
* @param activity the current running activity
* @param result
*/
public void onFinish(Activity ctx, CommitResponse result){
}
/**
* setup the controls for data upload
*
* @param started
*/
private void setupDataControls(boolean started) {
if (started) {
//display progress
dataProgress.setVisibility(View.VISIBLE);
txtDataSend.setTypeface(null, Typeface.BOLD_ITALIC);
} else {
//hide progress
dataProgress.setVisibility(View.GONE);
txtDataSend.setTypeface(null, Typeface.NORMAL);
}
}
/**
* setup the controls for media upload
*
* @param started
*/
private void setupMediaControl(boolean started) {
if (started) {
//display progress
progressMedia.setVisibility(View.VISIBLE);
txtMediaSend.setTypeface(null, Typeface.BOLD_ITALIC);
} else {
//hide progress
progressMedia.setVisibility(View.GONE);
txtMediaSend.setTypeface(null, Typeface.NORMAL);
}
}
/**
* set
*
* @param set up result for data send
*/
private void setDataSendResultUI(boolean success) {
if (success) {
imgBadData.setVisibility(View.GONE);
imgOKData.setVisibility(View.VISIBLE);
} else {
imgBadData.setVisibility(View.VISIBLE);
imgOKData.setVisibility(View.GONE);
}
}
/**
* Setup result for media send
*
* @param success
*/
private void setMediaSendResultUI(boolean success) {
if (success) {
imgBadMedia.setVisibility(View.GONE);
imgOKMedia.setVisibility(View.VISIBLE);
} else {
imgBadMedia.setVisibility(View.VISIBLE);
imgOKMedia.setVisibility(View.GONE);
}
}
/**
* Refresh the activity reference when changes
*/
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
this.activity = activity;
}
public interface UploadCallback{
public void success();
public void error();
}
}