\r
import net.sf.openrocket.R;\r
import net.sf.openrocket.aerodynamics.WarningSet;\r
-import net.sf.openrocket.android.Application;\r
-import net.sf.openrocket.android.actionbarcompat.ActionBarFragmentActivity;\r
+import net.sf.openrocket.android.CurrentRocketHolder;\r
+import net.sf.openrocket.android.filebrowser.SimpleFileBrowser;\r
import net.sf.openrocket.android.thrustcurve.TCMissingMotorDownloadAction;\r
import net.sf.openrocket.android.thrustcurve.TCQueryAction;\r
import net.sf.openrocket.android.util.AndroidLogWrapper;\r
import net.sf.openrocket.motor.ThrustCurveMotorPlaceholder;\r
import net.sf.openrocket.rocketcomponent.Rocket;\r
-import android.app.AlertDialog;\r
-import android.content.DialogInterface;\r
+import android.content.ActivityNotFoundException;\r
import android.content.Intent;\r
+import android.content.SharedPreferences;\r
+import android.content.res.Resources;\r
import android.net.Uri;\r
import android.os.Bundle;\r
+import android.preference.PreferenceManager;\r
import android.support.v4.app.DialogFragment;\r
\r
-public class OpenRocketLoaderActivity extends ActionBarFragmentActivity\r
+import com.actionbarsherlock.app.SherlockFragmentActivity;\r
+\r
+public class OpenRocketLoaderActivity extends SherlockFragmentActivity\r
implements TCQueryAction.OnTCQueryCompleteListener, OpenRocketLoaderFragment.OnOpenRocketFileLoaded\r
{\r
\r
+ private static final int PICK_ORK_FILE_RESULT = 1;\r
+\r
private final static String MISSING_MOTOR_DIAG_FRAGMENT_TAG = "missingmotordialog";\r
private final static String MISSING_MOTOR_DOWNLOAD_FRAGMENT_TAG = "missingmotortask";\r
\r
+ /*\r
+ * Set to true when we have started to load a file. Is saved in InstanceState.\r
+ */\r
+ private boolean isLoading = false;\r
+ /*\r
+ * Set to the Uri of the file we are supposed to load. Is saved in InstanceState.\r
+ */\r
+ private Uri fileToLoad = null;\r
+ \r
+ protected boolean isLoading() {\r
+ AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "isLoading " + this.hashCode());\r
+ AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "isLoading = " + isLoading);\r
+ return isLoading;\r
+ }\r
+\r
@Override\r
- protected void onCreate(Bundle savedInstanceState) {\r
- super.onCreate(savedInstanceState);\r
- setTitle("");\r
- setContentView(R.layout.main);\r
- if ( savedInstanceState == null || savedInstanceState.getBoolean("isLoading", false) == false ) {\r
- Intent i = getIntent();\r
+ protected void onPostCreate(Bundle savedInstanceState) {\r
+ super.onPostCreate(savedInstanceState);\r
+ Intent i = getIntent();\r
+ if (Intent.ACTION_VIEW.equals(i.getAction()) && i.getData() != null ) {\r
Uri file = i.getData();\r
- loadOrkFile(file);\r
+ fileToLoad = file;\r
+ loadOrkFile();\r
} else {\r
}\r
}\r
\r
@Override\r
protected void onSaveInstanceState(Bundle outState) {\r
+ AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "onSaveInstanceState " + this.hashCode());\r
+ AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "isLoading = " + isLoading);\r
+ outState.putBoolean("isLoading", isLoading);\r
+ if ( fileToLoad != null ) {\r
+ outState.putParcelable("fileToLoad", fileToLoad);\r
+ }\r
super.onSaveInstanceState(outState);\r
- outState.putBoolean("isLoading", true);\r
}\r
\r
- private void loadOrkFile( Uri file ) {\r
- AndroidLogWrapper.d(OpenRocketLoaderActivity.class,"Use ork file: " + file);\r
- String path = file.getPath();\r
+ @Override\r
+ protected void onRestoreInstanceState(Bundle savedInstanceState) {\r
+ AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "onRestoreInstanceState");\r
+ isLoading = savedInstanceState.getBoolean("isLoading",false);\r
+ AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "isLoading = " + isLoading);\r
+ if ( savedInstanceState.containsKey("fileToLoad") ) {\r
+ fileToLoad = savedInstanceState.getParcelable("fileToLoad");\r
+ }\r
+ super.onRestoreInstanceState(savedInstanceState);\r
+ }\r
+\r
+ @Override\r
+ protected void onResume() {\r
+ AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "onResume");\r
+ super.onResume();\r
+ // Start loading a file if we have a file and are not already loading one.\r
+ if ( fileToLoad != null && !isLoading ) {\r
+ loadOrkFile();\r
+ }\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see android.app.Activity#onActivityResult(int, int, android.content.Intent)\r
+ */\r
+ @Override\r
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {\r
+ AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "onActivityResult");\r
+ switch ( requestCode ) {\r
+ case PICK_ORK_FILE_RESULT:\r
+ if(resultCode==RESULT_OK){\r
+ Uri file = data.getData();\r
+ fileToLoad = file;\r
+ // It would be nice to just start loading the file - but that doesn't work correctly.\r
+ // I'm uncertain if it is a bug in Android 14/15 or a bug in the v4 support library.\r
+ // essentially what happens is, when the FileBrowserActivity is brought up,\r
+ // this activity goes through the saveInstanceState calls to push it to the background.\r
+ // When the FileBrowserActivity returns the result, this.onActivityResult is called\r
+ // prior to any of the other lifecycle methods (onRestoreInstanceState as documented, but onStart is\r
+ // a bug. Since onStart hasn't been called, this activity is not able to create fragments - which \r
+ // are used to indicate progress etc.\r
+ // Instead of calling loadOrkFile() here, we push the file Uri into a member variable,\r
+ // then check the member variable in onResume to actuall kick off the work.\r
+ }\r
+ break;\r
+ default:\r
+ super.onActivityResult(requestCode, resultCode, data);\r
+ }\r
+ }\r
+\r
+ protected void pickOrkFiles( ) {\r
+ Resources resources = this.getResources();\r
+ String key = resources.getString(R.string.PreferenceUseInternalFileBrowserOption);\r
+ SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);\r
+\r
+ boolean useinternalbrowser = pref.getBoolean(key, true);\r
+\r
+ if ( useinternalbrowser ) {\r
+ Intent intent = new Intent(OpenRocketLoaderActivity.this, SimpleFileBrowser.class);\r
+ startActivityForResult(intent,PICK_ORK_FILE_RESULT);\r
+ } else {\r
+ try {\r
+ Intent intent = new Intent(Intent.ACTION_GET_CONTENT);\r
+ intent.setType("file/*");\r
+ startActivityForResult(intent,PICK_ORK_FILE_RESULT);\r
+ } catch ( ActivityNotFoundException ex ) { \r
+ // No activity for ACTION_GET_CONTENT use internal file browser\r
+ // update the preference value.\r
+ pref.edit().putBoolean(key, false).commit();\r
+ // fire our browser\r
+ Intent intent = new Intent(OpenRocketLoaderActivity.this, SimpleFileBrowser.class);\r
+ startActivityForResult(intent,PICK_ORK_FILE_RESULT);\r
+ }\r
+ } \r
+ }\r
+\r
+ private void loadOrkFile( ) {\r
+ // a little protection.\r
+ if ( fileToLoad == null ) {\r
+ return;\r
+ }\r
+ isLoading = true;\r
+ CurrentRocketHolder.getCurrentRocket().setFileUri( fileToLoad );\r
+ AndroidLogWrapper.d(OpenRocketLoaderActivity.class,"Use ork file: " + fileToLoad);\r
+ String path = fileToLoad.getPath();\r
File orkFile = new File(path);\r
\r
- getSupportFragmentManager().beginTransaction().add( OpenRocketLoaderFragment.newInstance(orkFile), "loader").commit();\r
+ // Also need commitAllowingState loss because of a bug in v4 dialog show.\r
+ getSupportFragmentManager().beginTransaction()\r
+ .add( OpenRocketLoaderFragment.newInstance(orkFile), "loader")\r
+ .commitAllowingStateLoss();\r
\r
}\r
\r
*/\r
public void onOpenRocketFileLoaded(OpenRocketLoaderResult result) {\r
if ( result.loadingError != null ) {\r
- \r
- AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);\r
- dialogBuilder.setTitle("Error Loading File" );\r
- dialogBuilder.setMessage( result.loadingError.getLocalizedMessage());\r
- dialogBuilder.setOnCancelListener( new DialogInterface.OnCancelListener() {\r
- @Override\r
- public void onCancel(DialogInterface dialog) {\r
- OpenRocketLoaderActivity.this.finish();\r
- }\r
- });\r
- dialogBuilder.create().show();\r
+\r
+ ErrorLoadingFileDialogFragment errorDialog = ErrorLoadingFileDialogFragment.newInstance(R.string.loadingErrorMessage, result.loadingError.getLocalizedMessage());\r
+ errorDialog.show(getSupportFragmentManager(),"errorDialog");\r
\r
} else {\r
- ((Application)OpenRocketLoaderActivity.this.getApplication()).setRocketDocument( result.rocket );\r
- ((Application)OpenRocketLoaderActivity.this.getApplication()).setWarnings( result.warnings );\r
+ CurrentRocketHolder.getCurrentRocket().setRocketDocument( result.rocket );\r
+ CurrentRocketHolder.getCurrentRocket().setWarnings( result.warnings );\r
\r
updateMissingMotors();\r
}\r
}\r
\r
private void updateMissingMotors() {\r
- Rocket rocket = ((Application)OpenRocketLoaderActivity.this.getApplication()).getRocketDocument().getRocket();\r
+ Rocket rocket = CurrentRocketHolder.getCurrentRocket().getRocketDocument().getRocket();\r
Set<ThrustCurveMotorPlaceholder> missingMotors = MissingMotorHelpers.findMissingMotors(rocket);\r
\r
if ( missingMotors.size() > 0 ) {\r
- DialogFragment missingMotorDialog = MissingMotorDialogFragment.newInstance( missingMotors );\r
- getSupportFragmentManager().beginTransaction().add(missingMotorDialog, MISSING_MOTOR_DIAG_FRAGMENT_TAG).commit();\r
+ MissingMotorDialogFragment missingMotorDialog = MissingMotorDialogFragment.newInstance( missingMotors );\r
+ missingMotorDialog.show(getSupportFragmentManager(), MISSING_MOTOR_DIAG_FRAGMENT_TAG);\r
return;\r
}\r
\r
@Override\r
public void onTCQueryComplete(String message) {\r
\r
- Rocket rocket = ((Application)OpenRocketLoaderActivity.this.getApplication()).getRocketDocument().getRocket();\r
- WarningSet warnings = ((Application)OpenRocketLoaderActivity.this.getApplication()).getWarnings();\r
+ Rocket rocket = CurrentRocketHolder.getCurrentRocket().getRocketDocument().getRocket();\r
+ WarningSet warnings = CurrentRocketHolder.getCurrentRocket().getWarnings();\r
// Need to update the motor references.\r
MissingMotorHelpers.updateMissingMotors(rocket, warnings);\r
\r
}\r
\r
private void displayWarningDialog() {\r
- WarningSet warnings = ((Application)OpenRocketLoaderActivity.this.getApplication()).getWarnings();\r
+ WarningSet warnings = CurrentRocketHolder.getCurrentRocket().getWarnings();\r
if (warnings == null || warnings.isEmpty()) {\r
} else {\r
DialogFragment newFragment = WarningDialogFragment.newInstance();\r
}\r
\r
public void doFixMissingMotors() {\r
- Rocket rocket = ((Application)OpenRocketLoaderActivity.this.getApplication()).getRocketDocument().getRocket();\r
+ Rocket rocket = CurrentRocketHolder.getCurrentRocket().getRocketDocument().getRocket();\r
Set<ThrustCurveMotorPlaceholder> missingMotors = MissingMotorHelpers.findMissingMotors(rocket);\r
\r
TCMissingMotorDownloadAction motorfrag = TCMissingMotorDownloadAction.newInstance( missingMotors );\r
displayWarningDialog();\r
}\r
\r
+ public void doDismissErrorDialog() {\r
+ isLoading = false;\r
+ fileToLoad = null;\r
+ }\r
+ \r
public void moveOnToViewer() {\r
+ isLoading = false;\r
Intent i = new Intent(this,OpenRocketViewer.class);\r
startActivity(i);\r
finish();\r