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