create changelog entry
[debian/openrocket] / android / src / net / sf / openrocket / android / rocket / OpenRocketLoaderFragment.java
1 package net.sf.openrocket.android.rocket;\r
2 \r
3 import java.io.File;\r
4 \r
5 import net.sf.openrocket.R;\r
6 import net.sf.openrocket.android.util.AndroidLogWrapper;\r
7 import net.sf.openrocket.android.util.ProgressDialogFragment;\r
8 import net.sf.openrocket.document.OpenRocketDocument;\r
9 import net.sf.openrocket.file.DatabaseMotorFinderWithMissingMotors;\r
10 import net.sf.openrocket.file.GeneralRocketLoader;\r
11 import net.sf.openrocket.file.RocketLoadException;\r
12 import android.app.Activity;\r
13 import android.os.AsyncTask;\r
14 import android.os.Bundle;\r
15 import android.support.v4.app.DialogFragment;\r
16 import android.support.v4.app.Fragment;\r
17 import android.view.LayoutInflater;\r
18 import android.view.View;\r
19 import android.view.ViewGroup;\r
20 \r
21 import com.actionbarsherlock.app.SherlockFragment;\r
22 \r
23 public class OpenRocketLoaderFragment extends SherlockFragment {\r
24         \r
25         private final static String FILE_ARG_KEY = "file";\r
26         \r
27         public interface OnOpenRocketFileLoaded {\r
28                 public void onOpenRocketFileLoaded( OpenRocketLoaderResult result );\r
29         }\r
30         \r
31         private File file;\r
32         private OpenRocketLoaderTask task;\r
33         private OnOpenRocketFileLoaded listener;\r
34         \r
35         public static OpenRocketLoaderFragment newInstance(File file) {\r
36                 OpenRocketLoaderFragment frag = new OpenRocketLoaderFragment();\r
37                 Bundle b = new Bundle();\r
38                 b.putSerializable(FILE_ARG_KEY, file);\r
39                 frag.setArguments(b);\r
40                 return frag;\r
41         }\r
42         \r
43         @Override\r
44         public void onCreate(Bundle savedInstanceState) {\r
45                 super.onCreate(savedInstanceState);\r
46                 setRetainInstance(true);\r
47                 Bundle b = getArguments();\r
48                 file = (File) b.getSerializable(FILE_ARG_KEY);\r
49                 if ( task == null ) {\r
50                         // since we retain instance state, task will be non-null if it is already loading.\r
51                         task = new OpenRocketLoaderTask();\r
52                         task.execute(file);\r
53                 }\r
54         }\r
55 \r
56         @Override\r
57         public View onCreateView(LayoutInflater inflater, ViewGroup container,\r
58                         Bundle savedInstanceState) {\r
59                 return null;\r
60         }\r
61 \r
62         @Override\r
63         public void onActivityCreated(Bundle arg0) {\r
64                 super.onActivityCreated(arg0);\r
65                 Activity parent = getActivity();\r
66                 if ( parent instanceof OnOpenRocketFileLoaded ) {\r
67                         listener = (OnOpenRocketFileLoaded) parent;\r
68                 }\r
69         }\r
70 \r
71         public class OpenRocketLoaderTask extends AsyncTask<File, Void, OpenRocketLoaderResult> {\r
72                 \r
73                 private final static String PROGRESS_DIALOG_TAG = "progress_dialog";\r
74                 \r
75                 @Override\r
76                 protected void onPreExecute() {\r
77                         super.onPreExecute();\r
78                         String loading = getActivity().getResources().getString(R.string.loading);\r
79                         DialogFragment newFragment = ProgressDialogFragment.newInstance("", loading);\r
80                         newFragment.show(getFragmentManager(), PROGRESS_DIALOG_TAG);\r
81                 }\r
82 \r
83                 /* (non-Javadoc)\r
84                  * @see android.os.AsyncTask#doInBackground(Params[])\r
85                  */\r
86                 @Override\r
87                 protected OpenRocketLoaderResult doInBackground(File... arg0) {\r
88                         AndroidLogWrapper.d(OpenRocketLoaderTask.class, "doInBackgroud");\r
89                         \r
90                         GeneralRocketLoader rocketLoader = new GeneralRocketLoader();\r
91                         OpenRocketLoaderResult result = new OpenRocketLoaderResult();\r
92                         try {\r
93                                 OpenRocketDocument rocket = rocketLoader.load(arg0[0], new DatabaseMotorFinderWithMissingMotors());\r
94                                 rocket.getDefaultConfiguration().setAllStages();\r
95                                 result.rocket = rocket;\r
96                                 result.warnings = rocketLoader.getWarnings();\r
97                         } catch (RocketLoadException ex) {\r
98                                 AndroidLogWrapper.e(OpenRocketLoaderTask.class, "doInBackground rocketLaoder.load threw {}", ex);\r
99                                 result.loadingError = ex;\r
100                         }\r
101                         return result;\r
102                         \r
103                 }\r
104 \r
105                 @Override\r
106                 protected void onPostExecute(OpenRocketLoaderResult result) {\r
107                         super.onPostExecute(result);\r
108                         AndroidLogWrapper.d(OpenRocketLoaderFragment.class,"Finished loading " + OpenRocketLoaderTask.this);\r
109                         Fragment progress = getActivity().getSupportFragmentManager().findFragmentByTag(PROGRESS_DIALOG_TAG);\r
110                         if ( progress != null ) {\r
111                                 // Remove the fragment instead of trying to use DialogFragment.dismiss.\r
112                                 // If the dialog is now currently shown, dismiss fails.\r
113                                 getFragmentManager().beginTransaction().remove(progress).commitAllowingStateLoss();\r
114                         }\r
115                         if ( listener != null ) {\r
116                                 listener.onOpenRocketFileLoaded(result);\r
117                         }\r
118                 }\r
119 \r
120         }\r
121 \r
122 }\r