package net.sf.openrocket.android.rocket;
import net.sf.openrocket.R;
import net.sf.openrocket.android.CurrentRocketHolder;
import net.sf.openrocket.android.util.AndroidLogWrapper;
import net.sf.openrocket.android.util.ProgressDialogFragment;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import com.actionbarsherlock.app.SherlockFragmentActivity;
public class OpenRocketSaverFragment extends Fragment {
public static OpenRocketSaverFragment newInstance( boolean showProgressDialog) {
OpenRocketSaverFragment frag = new OpenRocketSaverFragment();
Bundle b = new Bundle();
b.putBoolean(SHOW_PRGRESS_DIALOG_ARG, showProgressDialog);
frag.setArguments(b);
return frag;
}
public interface OnOpenRocketFileSaved {
public void onOpenRocketFileSaved( Boolean result );
}
private final static String SHOW_PRGRESS_DIALOG_ARG = "net.sf.openrocket.android.ShowProgressDialog";
private boolean showProgressDialog = true;
private OpenRocketSaverTask task;
private OnOpenRocketFileSaved listener;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
Bundle b = getArguments();
if ( b != null ) {
showProgressDialog = b.getBoolean(SHOW_PRGRESS_DIALOG_ARG, true);
}
if ( task == null ) {
// since we retain instance state, task will be non-null if it is already loading.
task = new OpenRocketSaverTask();
task.execute();
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return null;
}
@Override
public void onActivityCreated(Bundle arg0) {
super.onActivityCreated(arg0);
Activity parent = getActivity();
if ( parent instanceof OnOpenRocketFileSaved ) {
listener = (OnOpenRocketFileSaved) parent;
}
}
public class OpenRocketSaverTask extends AsyncTask<Void, Void, Boolean> {
private final static String PROGRESS_DIALOG_TAG = "progress_dialog";
@Override
protected void onPreExecute() {
super.onPreExecute();
if ( showProgressDialog ) {
String savingMessage = getActivity().getResources().getString(R.string.saving);
DialogFragment newFragment = ProgressDialogFragment.newInstance("", savingMessage);
newFragment.show(getFragmentManager(), PROGRESS_DIALOG_TAG);
} else {
((SherlockFragmentActivity)getActivity()).setSupportProgressBarIndeterminate(true);
((SherlockFragmentActivity)getActivity()).setSupportProgress(0);
}
}
/* (non-Javadoc)
* @see android.os.AsyncTask#doInBackground(Params[])
*/
@Override
protected Boolean doInBackground(Void... arg0) {
AndroidLogWrapper.d(OpenRocketSaverTask.class, "doInBackgroud");
try {
CurrentRocketHolder.getCurrentRocket().saveOpenRocketDocument();
return true;
} catch (Throwable ex) {
AndroidLogWrapper.e(OpenRocketSaverTask.class, "doInBackground rocketLaoder.load threw {}", ex);
}
return false;
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
AndroidLogWrapper.d(OpenRocketSaverFragment.class,"Finished saving " + OpenRocketSaverTask.this);
if ( showProgressDialog ) {
Fragment progress = getActivity().getSupportFragmentManager().findFragmentByTag(PROGRESS_DIALOG_TAG);
if ( progress != null ) {
// Remove the fragment instead of trying to use DialogFragment.dismiss.
// If the dialog is now currently shown, dismiss fails.
getFragmentManager().beginTransaction().remove(progress).commitAllowingStateLoss();
}
} else {
((SherlockFragmentActivity)getActivity()).setSupportProgress(Window.PROGRESS_END);
((SherlockFragmentActivity)getActivity()).setSupportProgressBarVisibility(false);
}
if ( listener != null ) {
listener.onOpenRocketFileSaved(result);
}
}
}
}