Merge commit '42b2e5ca519766e37ce6941ba4faecc9691cc403' into upstream
[debian/openrocket] / android / src / net / sf / openrocket / android / rocket / OpenRocketLoaderActivity.java
index 151a6e0f63753339b2a3111aa1c911f055e3a4a5..9a3a84310d9890cfc508b68abf28f6ef9044e4a2 100644 (file)
@@ -5,52 +5,161 @@ import java.util.Set;
 \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
@@ -62,33 +171,25 @@ implements TCQueryAction.OnTCQueryCompleteListener, OpenRocketLoaderFragment.OnO
         */\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
@@ -101,8 +202,8 @@ implements TCQueryAction.OnTCQueryCompleteListener, OpenRocketLoaderFragment.OnO
        @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
@@ -110,7 +211,7 @@ implements TCQueryAction.OnTCQueryCompleteListener, OpenRocketLoaderFragment.OnO
        }\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
@@ -122,7 +223,7 @@ implements TCQueryAction.OnTCQueryCompleteListener, OpenRocketLoaderFragment.OnO
        }\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
@@ -134,7 +235,13 @@ implements TCQueryAction.OnTCQueryCompleteListener, OpenRocketLoaderFragment.OnO
                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