Use a different approach to prevent ForceClose after the application has been put...
[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.android.util.AndroidLogWrapper;\r
6 import net.sf.openrocket.android.util.ProgressDialogFragment;\r
7 import net.sf.openrocket.document.OpenRocketDocument;\r
8 import net.sf.openrocket.file.DatabaseMotorFinderWithMissingMotors;\r
9 import net.sf.openrocket.file.GeneralRocketLoader;\r
10 import net.sf.openrocket.file.RocketLoadException;\r
11 import android.app.Activity;\r
12 import android.os.AsyncTask;\r
13 import android.os.Bundle;\r
14 import android.support.v4.app.DialogFragment;\r
15 import android.support.v4.app.Fragment;\r
16 import android.view.LayoutInflater;\r
17 import android.view.View;\r
18 import android.view.ViewGroup;\r
19 \r
20 public class OpenRocketLoaderFragment extends Fragment {\r
21         \r
22         private final static String FILE_ARG_KEY = "file";\r
23         \r
24         private final static String LOADING_MESSAGE = "Loading file...";\r
25 \r
26         public interface OnOpenRocketFileLoaded {\r
27                 public void onOpenRocketFileLoaded( OpenRocketLoaderResult result );\r
28         }\r
29         \r
30         private File file;\r
31         private OpenRocketLoaderTask task;\r
32         private OnOpenRocketFileLoaded listener;\r
33         \r
34         public static OpenRocketLoaderFragment newInstance(File file) {\r
35                 OpenRocketLoaderFragment frag = new OpenRocketLoaderFragment();\r
36                 Bundle b = new Bundle();\r
37                 b.putSerializable(FILE_ARG_KEY, file);\r
38                 frag.setArguments(b);\r
39                 return frag;\r
40         }\r
41         \r
42         @Override\r
43         public void onCreate(Bundle savedInstanceState) {\r
44                 super.onCreate(savedInstanceState);\r
45                 setRetainInstance(true);\r
46                 Bundle b = getArguments();\r
47                 file = (File) b.getSerializable(FILE_ARG_KEY);\r
48                 if ( task == null ) {\r
49                         // since we retain instance state, task will be non-null if it is already loading.\r
50                         task = new OpenRocketLoaderTask();\r
51                         task.execute(file);\r
52                 }\r
53         }\r
54 \r
55         @Override\r
56         public View onCreateView(LayoutInflater inflater, ViewGroup container,\r
57                         Bundle savedInstanceState) {\r
58                 return null;\r
59         }\r
60 \r
61         @Override\r
62         public void onActivityCreated(Bundle arg0) {\r
63                 super.onActivityCreated(arg0);\r
64                 Activity parent = getActivity();\r
65                 if ( parent instanceof OnOpenRocketFileLoaded ) {\r
66                         listener = (OnOpenRocketFileLoaded) parent;\r
67                 }\r
68         }\r
69 \r
70         public class OpenRocketLoaderTask extends AsyncTask<File, Void, OpenRocketLoaderResult> {\r
71                 \r
72                 private final static String PROGRESS_DIALOG_TAG = "progress_dialog";\r
73                 \r
74                 @Override\r
75                 protected void onPreExecute() {\r
76                         super.onPreExecute();\r
77                         DialogFragment newFragment = ProgressDialogFragment.newInstance("", LOADING_MESSAGE);\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                                 result.rocket = rocket;\r
93                                 result.warnings = rocketLoader.getWarnings();\r
94                         } catch (RocketLoadException ex) {\r
95                                 AndroidLogWrapper.e(OpenRocketLoaderTask.class, "doInBackground rocketLaoder.load threw {}", ex);\r
96                                 result.loadingError = ex;\r
97                         }\r
98                         return result;\r
99                         \r
100                 }\r
101 \r
102                 @Override\r
103                 protected void onPostExecute(OpenRocketLoaderResult result) {\r
104                         super.onPostExecute(result);\r
105                         AndroidLogWrapper.d(OpenRocketLoaderActivity.class,"Finished loading " + OpenRocketLoaderTask.this);\r
106                         Fragment progress = getActivity().getSupportFragmentManager().findFragmentByTag(PROGRESS_DIALOG_TAG);\r
107                         if ( progress != null ) {\r
108                                 ((ProgressDialogFragment)progress).dismissAllowingStateLoss();\r
109                         }\r
110                         if ( listener != null ) {\r
111                                 listener.onOpenRocketFileLoaded(result);\r
112                         }\r
113                 }\r
114 \r
115         }\r
116 \r
117 }\r