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