]> git.gag.com Git - debian/openrocket/commitdiff
Second checkpoint commit of OpenRocketLoader to make it orientation change safe....
authorkruland2607 <kruland2607@180e2498-e6e9-4542-8430-84ac67f01cd8>
Wed, 8 Feb 2012 02:22:45 +0000 (02:22 +0000)
committerkruland2607 <kruland2607@180e2498-e6e9-4542-8430-84ac67f01cd8>
Wed, 8 Feb 2012 02:22:45 +0000 (02:22 +0000)
git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@399 180e2498-e6e9-4542-8430-84ac67f01cd8

android/res/layout-land/main.xml
android/res/layout/main.xml
android/src/net/sf/openrocket/android/Application.java
android/src/net/sf/openrocket/android/Main.java
android/src/net/sf/openrocket/android/rocket/MissingMotorDialogFragment.java
android/src/net/sf/openrocket/android/rocket/OpenRocketLoaderActivity.java
android/src/net/sf/openrocket/android/rocket/OpenRocketLoaderFragment.java [new file with mode: 0644]
android/src/net/sf/openrocket/android/rocket/OpenRocketLoaderTask.java [deleted file]

index 0d682a0bfb3d31deec14a1b275f9cad8c36e7f37..fc5280254e6105e9dbde541cc8597a7ba8d046fe 100644 (file)
         android:layout_width="wrap_content"\r
         android:layout_height="match_parent"\r
         android:orientation="vertical" >\r
-\r\r
+\r
         <TextView\r
             android:layout_width="match_parent"\r
             android:layout_height="wrap_content"\r
             android:layout_weight="1"\r
             android:gravity="center_horizontal"\r
             android:text="Welcome to OpenRocket" />\r
-\r\r\r\r\r
+\r
         <LinearLayout\r
             android:layout_width="match_parent"\r
             android:layout_height="wrap_content"\r
             android:layout_gravity="bottom"\r
             android:orientation="horizontal" >\r
-\r\r
-            <Button\r
-                android:layout_width="wrap_content"\r
-                android:layout_height="wrap_content"\r
-                android:layout_gravity="center_vertical"\r
-                android:onClick="pickOrkFiles"\r
-                android:text="View ork file" />\r
-\r\r\r\r\r\r\r\r
-            <Button\r
-                android:layout_width="wrap_content"\r
-                android:layout_height="wrap_content"\r
-                android:layout_gravity="center_vertical"\r
-                android:onClick="browseMotors"\r
-                android:text="View motors" />\r
 \r
+        <Button\r
+            android:layout_width="wrap_content"\r
+            android:layout_height="wrap_content"\r
+            android:id="@+id/main_open"\r
+            android:text="View ork file" />\r
+\r
+        <Button\r
+            android:layout_width="wrap_content"\r
+            android:layout_height="wrap_content"\r
+            android:id="@+id/main_browse"\r
+            android:text="View motors" />\r
         </LinearLayout>\r
     </LinearLayout>\r
 \r
index f99a4fdd91fda468a17058da1f68cdc3ba0661cd..cdb72d664a16e289185374bec0e2911b054059bd 100644 (file)
         <Button\r
             android:layout_width="wrap_content"\r
             android:layout_height="wrap_content"\r
-            android:onClick="pickOrkFiles"\r
+            android:id="@+id/main_open"\r
             android:text="View ork file" />\r
 \r
         <Button\r
             android:layout_width="wrap_content"\r
             android:layout_height="wrap_content"\r
-            android:onClick="browseMotors"\r
+            android:id="@+id/main_browse"\r
             android:text="View motors" />\r
     </LinearLayout>\r
 \r
index 6a13a7bf5f5acd70d482b0a3f62a0b3319677d90..98df485b24a4467be6f067bed39071e557c67a71 100644 (file)
@@ -2,6 +2,7 @@ package net.sf.openrocket.android;
 \r
 import java.util.Locale;\r
 \r
+import net.sf.openrocket.aerodynamics.WarningSet;\r
 import net.sf.openrocket.android.util.AndroidLogWrapper;\r
 import net.sf.openrocket.document.OpenRocketDocument;\r
 import net.sf.openrocket.l10n.DebugTranslator;\r
@@ -12,6 +13,7 @@ import android.preference.PreferenceManager;
 public class Application extends android.app.Application {\r
 \r
        private OpenRocketDocument rocketDocument;\r
+       private WarningSet warnings;\r
        \r
        // Big B boolean so I can synchronize on it.\r
        private static Boolean initialized = false;\r
@@ -71,6 +73,14 @@ public class Application extends android.app.Application {
        public void setRocketDocument(OpenRocketDocument rocketDocument) {\r
                this.rocketDocument = rocketDocument;\r
        }\r
+\r
+       public WarningSet getWarnings() {\r
+               return warnings;\r
+       }\r
+\r
+       public void setWarnings(WarningSet warnings) {\r
+               this.warnings = warnings;\r
+       }\r
        \r
        \r
        \r
index ff5fd8debf84f445631dbb4d460d3e5a959e1f77..8dacde3afb6aa9b4b0543a8f8be11226bc7dec8f 100644 (file)
@@ -14,6 +14,7 @@ import android.view.Menu;
 import android.view.MenuInflater;\r
 import android.view.MenuItem;\r
 import android.view.View;\r
+import android.widget.Button;\r
 \r
 public class Main extends FragmentActivity {\r
 \r
@@ -24,6 +25,20 @@ public class Main extends FragmentActivity {
        public void onCreate(Bundle icicle) {\r
                super.onCreate(icicle);\r
                setContentView(R.layout.main);\r
+               ((Button) findViewById(R.id.main_open)).setOnClickListener(\r
+                               new View.OnClickListener() {\r
+                                       @Override\r
+                                       public void onClick(View v) {\r
+                                               Main.this.pickOrkFiles();\r
+                                       }\r
+                               });\r
+               ((Button) findViewById(R.id.main_browse)).setOnClickListener(\r
+                               new View.OnClickListener() {\r
+                                       @Override\r
+                                       public void onClick(View v) {\r
+                                               ActivityHelpers.browseMotors(Main.this);\r
+                                       }\r
+                               });\r
        }\r
 \r
        @Override\r
index 4cbb31d1069c238f45643434c86c9c6a75aed33f..731800a38d5170982408f1cae87ae40f6d4ed2d3 100644 (file)
@@ -10,28 +10,44 @@ import android.os.Bundle;
 import android.support.v4.app.DialogFragment;\r
 \r
 public class MissingMotorDialogFragment extends DialogFragment {\r
-\r
-       Set<ThrustCurveMotorPlaceholder> missingMotors;\r
+       \r
+       private final static String MESSAGE_ARG_KEY = "message";\r
 \r
        public static MissingMotorDialogFragment newInstance( Set<ThrustCurveMotorPlaceholder> missingMotors ) {\r
                MissingMotorDialogFragment frag = new MissingMotorDialogFragment();\r
-               frag.missingMotors = missingMotors;\r
+               Bundle b = new Bundle();\r
+               b.putString(MESSAGE_ARG_KEY, buildMessage(missingMotors));\r
+               frag.setArguments(b);\r
                return frag;\r
        }\r
 \r
-       @Override\r
-       public Dialog onCreateDialog(Bundle savedInstanceState) {\r
-\r
-               AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());\r
-               //                      .setIcon(android.R.drawable.alert_dialog_icon)\r
-               builder.setTitle("Missing Motors");\r
+       private static String buildMessage( Set<ThrustCurveMotorPlaceholder> missingMotors ) {\r
                StringBuilder sb = new StringBuilder();\r
                sb.append("The following motors are missing:");\r
                for( ThrustCurveMotorPlaceholder m : missingMotors ) {\r
                        sb.append("\n").append(m.getManufacturer()).append(" ").append(m.getDesignation());\r
                }\r
                sb.append("\nWould you like to download them from Thrustcurve?");\r
-               builder.setMessage(sb.toString());\r
+               return sb.toString();\r
+       }\r
+       \r
+       @Override\r
+       public void onCreate(Bundle savedInstanceState) {\r
+               super.onCreate(savedInstanceState);\r
+               setRetainInstance(true);\r
+               setCancelable(false);\r
+       }\r
+\r
+\r
+       @Override\r
+       public Dialog onCreateDialog(Bundle savedInstanceState) {\r
+\r
+               String message = getArguments().getString(MESSAGE_ARG_KEY);\r
+               \r
+               AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());\r
+               //                      .setIcon(android.R.drawable.alert_dialog_icon)\r
+               builder.setTitle("Missing Motors");\r
+               builder.setMessage(message);\r
                builder.setPositiveButton("OK",\r
                                new DialogInterface.OnClickListener() {\r
                        public void onClick(DialogInterface dialog, int whichButton) {\r
@@ -48,5 +64,18 @@ public class MissingMotorDialogFragment extends DialogFragment {
                                );\r
                return builder.create();\r
        }\r
+\r
+       /**\r
+        * Work around for dialog getting dismissed on orientation change.  See code.google.com/p/android/issues/detail?id=17423\r
+        */\r
+       @Override\r
+       public void onDestroyView() {\r
+               if ( getDialog() != null  && getRetainInstance() ) {\r
+                       getDialog().setDismissMessage(null);\r
+               }\r
+               super.onDestroyView();\r
+       }\r
+       \r
+       \r
 }\r
 \r
index 30c313448be5bbb573a7ad905f3d4cd68d98ded3..48d6e491794e01a3c82b5177a9df8e712aaccfee 100644 (file)
@@ -10,7 +10,7 @@ import net.sf.openrocket.android.thrustcurve.TCMissingMotorDownloadAction;
 import net.sf.openrocket.android.thrustcurve.TCQueryAction;\r
 import net.sf.openrocket.android.util.AndroidLogWrapper;\r
 import net.sf.openrocket.motor.ThrustCurveMotorPlaceholder;\r
-import android.app.ProgressDialog;\r
+import net.sf.openrocket.rocketcomponent.Rocket;\r
 import android.content.Intent;\r
 import android.net.Uri;\r
 import android.os.Bundle;\r
@@ -18,15 +18,11 @@ import android.support.v4.app.DialogFragment;
 import android.support.v4.app.FragmentActivity;\r
 \r
 public class OpenRocketLoaderActivity extends FragmentActivity\r
-implements TCQueryAction.OnComplete\r
+implements TCQueryAction.OnComplete, OpenRocketLoaderFragment.OnOpenRocketFileLoaded\r
 {\r
 \r
-       private OpenRocketLoaderResult result;\r
+       private final static String MISSING_MOTOR_DIAG_FRAGMENT_TAG = "missingmotordialog";\r
        \r
-       private Set<ThrustCurveMotorPlaceholder> missingMotors;\r
-       private OpenRocketLoaderTask task;\r
-       private ProgressDialog progress;\r
-       private DialogFragment missingMotorDialog;\r
        private TCMissingMotorDownloadAction missingMotorDownloadAction;\r
 \r
        @Override\r
@@ -39,7 +35,6 @@ implements TCQueryAction.OnComplete
                        Uri file = i.getData();\r
                        loadOrkFile(file);\r
                } else {\r
-                       progress = ProgressDialog.show(this, "Loading file", "");\r
                }\r
        }\r
 \r
@@ -51,12 +46,6 @@ implements TCQueryAction.OnComplete
 \r
        @Override\r
        protected void onDestroy() {\r
-               if ( progress != null ) {\r
-                       if ( progress.isShowing() ) {\r
-                               progress.dismiss();\r
-                       }\r
-                       progress = null;\r
-               }\r
                if ( missingMotorDownloadAction != null ) {\r
                        missingMotorDownloadAction.dismiss();\r
                }\r
@@ -68,12 +57,9 @@ implements TCQueryAction.OnComplete
                AndroidLogWrapper.d(OpenRocketLoaderActivity.class,"Use ork file: " + file);\r
                String path = file.getPath();\r
                File orkFile = new File(path);\r
-               progress = ProgressDialog.show(this, "Loading file", "");\r
-\r
-               task = new OpenRocketLoaderTask(this);\r
-\r
-               task.execute(orkFile);\r
-\r
+               \r
+               getSupportFragmentManager().beginTransaction().add( OpenRocketLoaderFragment.newInstance(orkFile), "loader").commit();\r
+               \r
        }\r
 \r
        /**\r
@@ -82,23 +68,21 @@ implements TCQueryAction.OnComplete
         * \r
         * @param result\r
         */\r
-       void finishedLoading(OpenRocketLoaderResult result) {\r
-               if ( progress != null && progress.isShowing() ) {\r
-                       progress.dismiss();\r
-               }\r
-               this.result = result;\r
+       public void onOpenRocketFileLoaded(OpenRocketLoaderResult result) {\r
                ((Application)OpenRocketLoaderActivity.this.getApplication()).setRocketDocument( result.rocket );\r
-\r
+               ((Application)OpenRocketLoaderActivity.this.getApplication()).setWarnings( result.warnings );\r
+               \r
                updateMissingMotors();\r
 \r
        }\r
 \r
        private void updateMissingMotors() {\r
-               missingMotors = MissingMotorHelpers.findMissingMotors(result.rocket.getRocket());\r
+               Rocket rocket = ((Application)OpenRocketLoaderActivity.this.getApplication()).getRocketDocument().getRocket();\r
+               Set<ThrustCurveMotorPlaceholder> missingMotors = MissingMotorHelpers.findMissingMotors(rocket);\r
 \r
                if ( missingMotors.size() > 0 ) {\r
-                       missingMotorDialog = MissingMotorDialogFragment.newInstance( missingMotors );\r
-                       missingMotorDialog.show(getSupportFragmentManager(), "missing motors");\r
+                       DialogFragment missingMotorDialog = MissingMotorDialogFragment.newInstance( missingMotors );\r
+                       getSupportFragmentManager().beginTransaction().add(missingMotorDialog, MISSING_MOTOR_DIAG_FRAGMENT_TAG).commit();\r
                        return;\r
                }\r
 \r
@@ -111,14 +95,16 @@ implements TCQueryAction.OnComplete
        @Override\r
        public void onComplete() {\r
 \r
+               Rocket rocket = ((Application)OpenRocketLoaderActivity.this.getApplication()).getRocketDocument().getRocket();\r
+               WarningSet warnings = ((Application)OpenRocketLoaderActivity.this.getApplication()).getWarnings();\r
                // Need to update the motor references.\r
-               MissingMotorHelpers.updateMissingMotors(result.rocket.getRocket(), result.warnings);\r
+               MissingMotorHelpers.updateMissingMotors(rocket, warnings);\r
 \r
                displayWarningDialog();\r
        }\r
 \r
        private void displayWarningDialog() {\r
-               WarningSet warnings = result.warnings;\r
+               WarningSet warnings = ((Application)OpenRocketLoaderActivity.this.getApplication()).getWarnings();\r
                if (warnings == null || warnings.isEmpty()) {\r
                } else {\r
                        // TODO - Build a warning listing dialog\r
@@ -131,8 +117,8 @@ implements TCQueryAction.OnComplete
        }\r
 \r
        public void doFixMissingMotors() {\r
-\r
-               missingMotorDialog.dismiss();\r
+               Rocket rocket = ((Application)OpenRocketLoaderActivity.this.getApplication()).getRocketDocument().getRocket();\r
+               Set<ThrustCurveMotorPlaceholder> missingMotors = MissingMotorHelpers.findMissingMotors(rocket);\r
 \r
                missingMotorDownloadAction.setMissingMotors(missingMotors);\r
                missingMotorDownloadAction.start();\r
@@ -140,7 +126,6 @@ implements TCQueryAction.OnComplete
        }\r
 \r
        public void doNotFixMissingMotors() {\r
-               missingMotorDialog.dismiss();\r
                displayWarningDialog();\r
        }\r
 \r
diff --git a/android/src/net/sf/openrocket/android/rocket/OpenRocketLoaderFragment.java b/android/src/net/sf/openrocket/android/rocket/OpenRocketLoaderFragment.java
new file mode 100644 (file)
index 0000000..89c202c
--- /dev/null
@@ -0,0 +1,117 @@
+package net.sf.openrocket.android.rocket;\r
+\r
+import java.io.File;\r
+\r
+import net.sf.openrocket.android.util.AndroidLogWrapper;\r
+import net.sf.openrocket.android.util.ProgressDialogFragment;\r
+import net.sf.openrocket.document.OpenRocketDocument;\r
+import net.sf.openrocket.file.DatabaseMotorFinderWithMissingMotors;\r
+import net.sf.openrocket.file.RocketLoadException;\r
+import net.sf.openrocket.file.openrocket.importt.OpenRocketLoader;\r
+import android.app.Activity;\r
+import android.os.AsyncTask;\r
+import android.os.Bundle;\r
+import android.support.v4.app.DialogFragment;\r
+import android.support.v4.app.Fragment;\r
+import android.view.LayoutInflater;\r
+import android.view.View;\r
+import android.view.ViewGroup;\r
+\r
+public class OpenRocketLoaderFragment extends Fragment {\r
+       \r
+       private final static String FILE_ARG_KEY = "file";\r
+       \r
+       private final static String LOADING_MESSAGE = "Loading file...";\r
+\r
+       public interface OnOpenRocketFileLoaded {\r
+               public void onOpenRocketFileLoaded( OpenRocketLoaderResult result );\r
+       }\r
+       \r
+       private File file;\r
+       private OpenRocketLoaderTask task;\r
+       private OnOpenRocketFileLoaded listener;\r
+       \r
+       public static OpenRocketLoaderFragment newInstance(File file) {\r
+               OpenRocketLoaderFragment frag = new OpenRocketLoaderFragment();\r
+               Bundle b = new Bundle();\r
+               b.putSerializable(FILE_ARG_KEY, file);\r
+               frag.setArguments(b);\r
+               return frag;\r
+       }\r
+       \r
+       @Override\r
+       public void onCreate(Bundle savedInstanceState) {\r
+               super.onCreate(savedInstanceState);\r
+               setRetainInstance(true);\r
+               Bundle b = getArguments();\r
+               file = (File) b.getSerializable(FILE_ARG_KEY);\r
+               if ( task == null ) {\r
+                       // since we retain instance state, task will be non-null if it is already loading.\r
+                       task = new OpenRocketLoaderTask();\r
+                       task.execute(file);\r
+               }\r
+       }\r
+\r
+       @Override\r
+       public View onCreateView(LayoutInflater inflater, ViewGroup container,\r
+                       Bundle savedInstanceState) {\r
+               return null;\r
+       }\r
+\r
+       @Override\r
+       public void onActivityCreated(Bundle arg0) {\r
+               super.onActivityCreated(arg0);\r
+               Activity parent = getActivity();\r
+               if ( parent instanceof OnOpenRocketFileLoaded ) {\r
+                       listener = (OnOpenRocketFileLoaded) parent;\r
+               }\r
+       }\r
+\r
+       public class OpenRocketLoaderTask extends AsyncTask<File, Void, OpenRocketLoaderResult> {\r
+               \r
+               private final static String PROGRESS_DIALOG_TAG = "progress_dialog";\r
+               \r
+               @Override\r
+               protected void onPreExecute() {\r
+                       super.onPreExecute();\r
+                       DialogFragment newFragment = ProgressDialogFragment.newInstance("", LOADING_MESSAGE);\r
+                       newFragment.show(getFragmentManager(), PROGRESS_DIALOG_TAG);\r
+               }\r
+\r
+               /* (non-Javadoc)\r
+                * @see android.os.AsyncTask#doInBackground(Params[])\r
+                */\r
+               @Override\r
+               protected OpenRocketLoaderResult doInBackground(File... arg0) {\r
+                       AndroidLogWrapper.d(OpenRocketLoaderTask.class, "doInBackgroud");\r
+                       \r
+                       OpenRocketLoader rocketLoader = new OpenRocketLoader();\r
+                       try {\r
+                               OpenRocketLoaderResult result = new OpenRocketLoaderResult();\r
+                               OpenRocketDocument rocket = rocketLoader.load(arg0[0], new DatabaseMotorFinderWithMissingMotors());\r
+                               result.rocket = rocket;\r
+                               result.warnings = rocketLoader.getWarnings();\r
+                               return result;\r
+                       } catch (RocketLoadException ex) {\r
+                               AndroidLogWrapper.e(OpenRocketLoaderTask.class, "doInBackground rocketLaoder.load threw", ex);\r
+                       }\r
+                       return null;\r
+                       \r
+               }\r
+\r
+               @Override\r
+               protected void onPostExecute(OpenRocketLoaderResult result) {\r
+                       super.onPostExecute(result);\r
+                       AndroidLogWrapper.d(OpenRocketLoaderActivity.class,"Finished loading " + OpenRocketLoaderTask.this);\r
+                       Fragment progress = getActivity().getSupportFragmentManager().findFragmentByTag(PROGRESS_DIALOG_TAG);\r
+                       if ( progress != null ) {\r
+                               ((DialogFragment)progress).dismiss();\r
+                       }\r
+                       if ( listener != null ) {\r
+                               listener.onOpenRocketFileLoaded(result);\r
+                       }\r
+               }\r
+\r
+       }\r
+\r
+}\r
diff --git a/android/src/net/sf/openrocket/android/rocket/OpenRocketLoaderTask.java b/android/src/net/sf/openrocket/android/rocket/OpenRocketLoaderTask.java
deleted file mode 100644 (file)
index a4cb558..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-package net.sf.openrocket.android.rocket;\r
-\r
-import java.io.File;\r
-\r
-import net.sf.openrocket.android.util.AndroidLogWrapper;\r
-import net.sf.openrocket.document.OpenRocketDocument;\r
-import net.sf.openrocket.file.DatabaseMotorFinderWithMissingMotors;\r
-import net.sf.openrocket.file.RocketLoadException;\r
-import net.sf.openrocket.file.openrocket.importt.OpenRocketLoader;\r
-import android.app.Activity;\r
-import android.os.AsyncTask;\r
-\r
-public class OpenRocketLoaderTask extends AsyncTask<File, Void, OpenRocketLoaderResult> {\r
-       \r
-       private OpenRocketLoaderActivity parent;\r
-       \r
-       public OpenRocketLoaderTask( OpenRocketLoaderActivity parent ) {\r
-               this.parent = parent;\r
-       }\r
-       \r
-       /* (non-Javadoc)\r
-        * @see android.os.AsyncTask#doInBackground(Params[])\r
-        */\r
-       @Override\r
-       protected OpenRocketLoaderResult doInBackground(File... arg0) {\r
-               AndroidLogWrapper.d(OpenRocketLoaderTask.class, "doInBackgroud");\r
-               \r
-               OpenRocketLoader rocketLoader = new OpenRocketLoader();\r
-               try {\r
-                       OpenRocketLoaderResult result = new OpenRocketLoaderResult();\r
-                       OpenRocketDocument rocket = rocketLoader.load(arg0[0], new DatabaseMotorFinderWithMissingMotors());\r
-                       result.rocket = rocket;\r
-                       result.warnings = result.warnings;\r
-                       return result;\r
-               } catch (RocketLoadException ex) {\r
-                       AndroidLogWrapper.e(OpenRocketLoaderTask.class, "doInBackground rocketLaoder.load threw", ex);\r
-               }\r
-               return null;\r
-               \r
-       }\r
-\r
-       @Override\r
-       protected void onPostExecute(OpenRocketLoaderResult result) {\r
-               super.onPostExecute(result);\r
-               AndroidLogWrapper.d(OpenRocketLoaderActivity.class,"Finished loading " + OpenRocketLoaderTask.this);\r
-               parent.finishedLoading(result);\r
-       }\r
-\r
-}\r