moveOnToViewer() actually calls finish(). So just return here.
[debian/openrocket] / android / src / net / sf / openrocket / android / rocket / OpenRocketLoaderActivity.java
1 package net.sf.openrocket.android.rocket;\r
2 \r
3 import java.io.File;\r
4 import java.util.Set;\r
5 \r
6 import net.sf.openrocket.R;\r
7 import net.sf.openrocket.aerodynamics.WarningSet;\r
8 import net.sf.openrocket.android.CurrentRocketHolder;\r
9 import net.sf.openrocket.android.filebrowser.SimpleFileBrowser;\r
10 import net.sf.openrocket.android.thrustcurve.TCMissingMotorDownloadAction;\r
11 import net.sf.openrocket.android.thrustcurve.TCQueryAction;\r
12 import net.sf.openrocket.android.util.AndroidLogWrapper;\r
13 import net.sf.openrocket.motor.ThrustCurveMotorPlaceholder;\r
14 import net.sf.openrocket.rocketcomponent.Rocket;\r
15 import android.app.AlertDialog;\r
16 import android.content.ActivityNotFoundException;\r
17 import android.content.DialogInterface;\r
18 import android.content.Intent;\r
19 import android.content.SharedPreferences;\r
20 import android.content.res.Resources;\r
21 import android.net.Uri;\r
22 import android.os.Bundle;\r
23 import android.preference.PreferenceManager;\r
24 import android.support.v4.app.DialogFragment;\r
25 \r
26 import com.actionbarsherlock.app.SherlockFragmentActivity;\r
27 \r
28 public class OpenRocketLoaderActivity extends SherlockFragmentActivity\r
29 implements TCQueryAction.OnTCQueryCompleteListener, OpenRocketLoaderFragment.OnOpenRocketFileLoaded\r
30 {\r
31 \r
32         private static final int PICK_ORK_FILE_RESULT = 1;\r
33 \r
34         private final static String MISSING_MOTOR_DIAG_FRAGMENT_TAG = "missingmotordialog";\r
35         private final static String MISSING_MOTOR_DOWNLOAD_FRAGMENT_TAG = "missingmotortask";\r
36 \r
37         /*\r
38          * Set to true when we have started to load a file.  Is saved in InstanceState.\r
39          */\r
40         private boolean isLoading = false;\r
41         /*\r
42          * Set to the Uri of the file we are supposed to load.  Is saved in InstanceState.\r
43          */\r
44         private Uri fileToLoad = null;\r
45 \r
46         @Override\r
47         protected void onPostCreate(Bundle savedInstanceState) {\r
48                 super.onPostCreate(savedInstanceState);\r
49                 Intent i = getIntent();\r
50                 if (Intent.ACTION_VIEW.equals(i.getAction()) && i.getData() != null ) {\r
51                         Uri file = i.getData();\r
52                         fileToLoad = file;\r
53                         loadOrkFile();\r
54                 } else {\r
55                 }\r
56         }\r
57 \r
58         @Override\r
59         protected void onSaveInstanceState(Bundle outState) {\r
60                 AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "onSaveInstanceState");\r
61                 outState.putBoolean("isLoading", isLoading);\r
62                 if ( fileToLoad != null ) {\r
63                         outState.putParcelable("fileToLoad", fileToLoad);\r
64                 }\r
65                 super.onSaveInstanceState(outState);\r
66         }\r
67 \r
68         @Override\r
69         protected void onRestoreInstanceState(Bundle savedInstanceState) {\r
70                 AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "onRestoreInstanceState");\r
71                 isLoading = savedInstanceState.getBoolean("isLoading",false);\r
72                 if ( savedInstanceState.containsKey("fileToLoad") ) {\r
73                         fileToLoad = savedInstanceState.getParcelable("fileToLoad");\r
74                 }\r
75                 super.onRestoreInstanceState(savedInstanceState);\r
76         }\r
77 \r
78         @Override\r
79         protected void onResume() {\r
80                 AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "onResume");\r
81                 super.onResume();\r
82                 // Start loading a file if we have a file and are not already loading one.\r
83                 if ( fileToLoad != null && !isLoading ) {\r
84                         loadOrkFile();\r
85                 }\r
86         }\r
87 \r
88         /* (non-Javadoc)\r
89          * @see android.app.Activity#onActivityResult(int, int, android.content.Intent)\r
90          */\r
91         @Override\r
92         protected void onActivityResult(int requestCode, int resultCode, Intent data) {\r
93                 AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "onActivityResult");\r
94                 switch ( requestCode ) {\r
95                 case PICK_ORK_FILE_RESULT:\r
96                         if(resultCode==RESULT_OK){\r
97                                 Uri file = data.getData();\r
98                                 fileToLoad = file;\r
99                                 // It would be nice to just start loading the file - but that doesn't work correctly.\r
100                                 // I'm uncertain if it is a bug in Android 14/15 or a bug in the v4 support library.\r
101                                 // essentially what happens is, when the FileBrowserActivity is brought up,\r
102                                 // this activity goes through the saveInstanceState calls to push it to the background.\r
103                                 // When the FileBrowserActivity returns the result, this.onActivityResult is called\r
104                                 // prior to any of the other lifecycle methods (onRestoreInstanceState as documented, but onStart is\r
105                                 // a bug. Since onStart hasn't been called, this activity is not able to create fragments - which \r
106                                 // are used to indicate progress etc.\r
107                                 // Instead of calling loadOrkFile() here, we push the file Uri into a member variable,\r
108                                 // then check the member variable in onResume to actuall kick off the work.\r
109                         }\r
110                         break;\r
111                 default:\r
112                         super.onActivityResult(requestCode, resultCode, data);\r
113                 }\r
114         }\r
115 \r
116         protected void pickOrkFiles( ) {\r
117                 Resources resources = this.getResources();\r
118                 String key = resources.getString(R.string.PreferenceUseInternalFileBrowserOption);\r
119                 SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);\r
120 \r
121                 boolean useinternalbrowser = pref.getBoolean(key, true);\r
122 \r
123                 if ( useinternalbrowser ) {\r
124                         Intent intent = new Intent(OpenRocketLoaderActivity.this, SimpleFileBrowser.class);\r
125                         startActivityForResult(intent,PICK_ORK_FILE_RESULT);\r
126                 } else {\r
127                         try {\r
128                                 Intent intent = new Intent(Intent.ACTION_GET_CONTENT);\r
129                                 intent.setType("file/*");\r
130                                 startActivityForResult(intent,PICK_ORK_FILE_RESULT);\r
131                         } catch ( ActivityNotFoundException ex ) { \r
132                                 // No activity for ACTION_GET_CONTENT  use internal file browser\r
133                                 // update the preference value.\r
134                                 pref.edit().putBoolean(key, false).commit();\r
135                                 // fire our browser\r
136                                 Intent intent = new Intent(OpenRocketLoaderActivity.this, SimpleFileBrowser.class);\r
137                                 startActivityForResult(intent,PICK_ORK_FILE_RESULT);\r
138                         }\r
139                 }               \r
140         }\r
141 \r
142         private void loadOrkFile( ) {\r
143                 // a little protection.\r
144                 if ( fileToLoad == null ) {\r
145                         return;\r
146                 }\r
147                 isLoading = true;\r
148                 CurrentRocketHolder.getCurrentRocket().setFileUri( fileToLoad );\r
149                 AndroidLogWrapper.d(OpenRocketLoaderActivity.class,"Use ork file: " + fileToLoad);\r
150                 String path = fileToLoad.getPath();\r
151                 File orkFile = new File(path);\r
152 \r
153                 // Also need commitAllowingState loss because of a bug in v4 dialog show.\r
154                 getSupportFragmentManager().beginTransaction()\r
155                   .add( OpenRocketLoaderFragment.newInstance(orkFile), "loader")\r
156                   .commitAllowingStateLoss();\r
157 \r
158         }\r
159 \r
160         /**\r
161          * Called by the OpenRocketLoaderTask when it completes.\r
162          * is default visibility so it can be called from this package.\r
163          * \r
164          * @param result\r
165          */\r
166         public void onOpenRocketFileLoaded(OpenRocketLoaderResult result) {\r
167                 isLoading = false;\r
168                 if ( result.loadingError != null ) {\r
169 \r
170                         AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);\r
171                         dialogBuilder.setTitle("Error Loading File" );\r
172                         dialogBuilder.setMessage( result.loadingError.getLocalizedMessage());\r
173                         dialogBuilder.setOnCancelListener( new DialogInterface.OnCancelListener() {\r
174                                 @Override\r
175                                 public void onCancel(DialogInterface dialog) {\r
176                                         OpenRocketLoaderActivity.this.finish();\r
177                                 }\r
178                         });\r
179                         dialogBuilder.create().show();\r
180 \r
181                 } else {\r
182                         CurrentRocketHolder.getCurrentRocket().setRocketDocument( result.rocket );\r
183                         CurrentRocketHolder.getCurrentRocket().setWarnings( result.warnings );\r
184 \r
185                         updateMissingMotors();\r
186                 }\r
187         }\r
188 \r
189         private void updateMissingMotors() {\r
190                 Rocket rocket = CurrentRocketHolder.getCurrentRocket().getRocketDocument().getRocket();\r
191                 Set<ThrustCurveMotorPlaceholder> missingMotors = MissingMotorHelpers.findMissingMotors(rocket);\r
192 \r
193                 if ( missingMotors.size() > 0 ) {\r
194                         DialogFragment missingMotorDialog = MissingMotorDialogFragment.newInstance( missingMotors );\r
195                         getSupportFragmentManager().beginTransaction().add(missingMotorDialog, MISSING_MOTOR_DIAG_FRAGMENT_TAG).commit();\r
196                         return;\r
197                 }\r
198 \r
199                 displayWarningDialog();\r
200         }\r
201 \r
202         /**\r
203          * Called when the TCMissingMotorDownload process finishes.\r
204          */\r
205         @Override\r
206         public void onTCQueryComplete(String message) {\r
207 \r
208                 Rocket rocket = CurrentRocketHolder.getCurrentRocket().getRocketDocument().getRocket();\r
209                 WarningSet warnings = CurrentRocketHolder.getCurrentRocket().getWarnings();\r
210                 // Need to update the motor references.\r
211                 MissingMotorHelpers.updateMissingMotors(rocket, warnings);\r
212 \r
213                 displayWarningDialog();\r
214         }\r
215 \r
216         private void displayWarningDialog() {\r
217                 WarningSet warnings = CurrentRocketHolder.getCurrentRocket().getWarnings();\r
218                 if (warnings == null || warnings.isEmpty()) {\r
219                 } else {\r
220                         DialogFragment newFragment = WarningDialogFragment.newInstance();\r
221                         newFragment.show(getSupportFragmentManager(), "dialog");\r
222                         return;\r
223                 }\r
224 \r
225                 moveOnToViewer();\r
226         }\r
227 \r
228         public void doFixMissingMotors() {\r
229                 Rocket rocket = CurrentRocketHolder.getCurrentRocket().getRocketDocument().getRocket();\r
230                 Set<ThrustCurveMotorPlaceholder> missingMotors = MissingMotorHelpers.findMissingMotors(rocket);\r
231 \r
232                 TCMissingMotorDownloadAction motorfrag = TCMissingMotorDownloadAction.newInstance( missingMotors );\r
233                 getSupportFragmentManager().beginTransaction().add( motorfrag, MISSING_MOTOR_DOWNLOAD_FRAGMENT_TAG).commit();\r
234 \r
235         }\r
236 \r
237         public void doNotFixMissingMotors() {\r
238                 displayWarningDialog();\r
239         }\r
240 \r
241         public void moveOnToViewer() {\r
242                 Intent i = new Intent(this,OpenRocketViewer.class);\r
243                 startActivity(i);\r
244                 finish();\r
245         }\r
246 }\r