Various fixes which should probably be broken into multiple commits:)
authorkruland2607 <kruland2607@180e2498-e6e9-4542-8430-84ac67f01cd8>
Mon, 25 Jun 2012 18:30:41 +0000 (18:30 +0000)
committerkruland2607 <kruland2607@180e2498-e6e9-4542-8430-84ac67f01cd8>
Mon, 25 Jun 2012 18:30:41 +0000 (18:30 +0000)
- Changed the way the ProgressDialog is dismissed from using some non-functional reflection code, to using a FragmentTransaction (which works)
- Added code which shows the save button only when the CurrentRocket is modified.
- Broke the save functionality into a Fragment with background Task so it is more reliable.

git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@808 180e2498-e6e9-4542-8430-84ac67f01cd8

android/res/menu/rocket_viewer_configurations_option_menu.xml
android/res/menu/rocket_viewer_option_menu.xml
android/res/menu/rocket_viewer_simulation_option_menu.xml
android/src/net/sf/openrocket/android/CurrentRocket.java
android/src/net/sf/openrocket/android/rocket/OpenRocketLoaderFragment.java
android/src/net/sf/openrocket/android/rocket/OpenRocketSaverFragment.java [new file with mode: 0644]
android/src/net/sf/openrocket/android/rocket/OpenRocketViewer.java
android/src/net/sf/openrocket/android/util/ProgressDialogFragment.java

index e87042586b520633f9ef8b07b0cd211263d0660a..0464e59ab7791b51027258d08c6e92a5efcca4d2 100644 (file)
@@ -4,7 +4,7 @@
     <item\r
         android:id="@+id/menu_add"\r
         android:icon="@drawable/ic_menu_add"\r
-        android:orderInCategory="0"\r
+        android:orderInCategory="2"\r
         android:showAsAction="always"\r
         android:title="@string/Add"/>\r
 \r
index 906f539db484a67981b9b8a44376abbdfa81ebf0..eaf7bc22a260a7d4d1aba19ae9feff27a8ee1262 100644 (file)
@@ -4,8 +4,8 @@
     <item\r
         android:id="@+id/menu_load"\r
         android:icon="@drawable/ic_menu_archive"\r
-        android:orderInCategory="0"\r
-        android:showAsAction="always"\r
+        android:orderInCategory="1"\r
+        android:showAsAction="ifRoom"\r
         android:title="@string/load"/>\r
     <item\r
         android:id="@+id/menu_save"\r
     <item\r
         android:id="@+id/preference_menu_option"\r
         android:icon="@drawable/ic_menu_preferences"\r
+        android:orderInCategory="10"\r
         android:title="@string/Preferences"/>\r
     <item\r
         android:id="@+id/menu_about"\r
+        android:icon="@drawable/ic_menu_info_details"\r
+        android:orderInCategory="10"\r
         android:showAsAction="never"\r
-                android:icon="@drawable/ic_menu_info_details"\r
-        \r
         android:title="@string/About"/>\r
 \r
 </menu>
\ No newline at end of file
index e87042586b520633f9ef8b07b0cd211263d0660a..0464e59ab7791b51027258d08c6e92a5efcca4d2 100644 (file)
@@ -4,7 +4,7 @@
     <item\r
         android:id="@+id/menu_add"\r
         android:icon="@drawable/ic_menu_add"\r
-        android:orderInCategory="0"\r
+        android:orderInCategory="2"\r
         android:showAsAction="always"\r
         android:title="@string/Add"/>\r
 \r
index a5468eeb353184df434acfb4a14e128c6c8d6c46..596e2e0ce0bb4ec6695b0edba0f610cfc0dfbd94 100644 (file)
@@ -20,6 +20,8 @@ public class CurrentRocket {
 \r
        private RocketChangedEventHandler handler;\r
        \r
+       private boolean isModified = false;\r
+       \r
        public void setHandler( RocketChangedEventHandler handler ) {\r
                this.handler = handler;\r
        }\r
@@ -32,6 +34,7 @@ public class CurrentRocket {
        }\r
 \r
        public void notifySimsChanged() {\r
+               isModified = true;\r
                if ( handler != null ) {\r
                        handler.simsChangedMessage();\r
                }\r
@@ -52,6 +55,7 @@ public class CurrentRocket {
        }\r
        \r
        public String addNewMotorConfig() {\r
+               isModified = true;\r
                String configId = rocketDocument.getRocket().newMotorConfigurationID();\r
                if ( handler != null ) {\r
                        handler.configsChangedMessage();\r
@@ -63,6 +67,7 @@ public class CurrentRocket {
         */\r
        public void setRocketDocument(OpenRocketDocument rocketDocument) {\r
                this.rocketDocument = rocketDocument;\r
+               isModified = false;\r
        }\r
 \r
        public WarningSet getWarnings() {\r
@@ -81,14 +86,17 @@ public class CurrentRocket {
                this.fileUri = fileUri;\r
        }\r
 \r
+       public boolean isModified() {\r
+               return this.isModified;\r
+       }\r
+       \r
        public void saveOpenRocketDocument() throws IOException {\r
                OpenRocketSaver saver = new OpenRocketSaver();\r
                StorageOptions options = new StorageOptions();\r
                options.setCompressionEnabled(true);\r
                options.setSimulationTimeSkip(StorageOptions.SIMULATION_DATA_ALL);\r
                saver.save(new File(fileUri.getPath()),rocketDocument,options);\r
-\r
+               isModified = false;\r
        }\r
 \r
-\r
 }\r
index 26193b4a1da87e7f455d8acc5020793be495fad1..01b9549f6765e216ce357ab90004e62de9e46c98 100644 (file)
@@ -103,10 +103,12 @@ public class OpenRocketLoaderFragment extends Fragment {
                @Override\r
                protected void onPostExecute(OpenRocketLoaderResult result) {\r
                        super.onPostExecute(result);\r
-                       AndroidLogWrapper.d(OpenRocketLoaderActivity.class,"Finished loading " + OpenRocketLoaderTask.this);\r
+                       AndroidLogWrapper.d(OpenRocketLoaderFragment.class,"Finished loading " + OpenRocketLoaderTask.this);\r
                        Fragment progress = getActivity().getSupportFragmentManager().findFragmentByTag(PROGRESS_DIALOG_TAG);\r
                        if ( progress != null ) {\r
-                               ((ProgressDialogFragment)progress).dismissAllowingStateLoss();\r
+                               // Remove the fragment instead of trying to use DialogFragment.dismiss.\r
+                               // If the dialog is now currently shown, dismiss fails.\r
+                               getFragmentManager().beginTransaction().remove(progress).commitAllowingStateLoss();\r
                        }\r
                        if ( listener != null ) {\r
                                listener.onOpenRocketFileLoaded(result);\r
diff --git a/android/src/net/sf/openrocket/android/rocket/OpenRocketSaverFragment.java b/android/src/net/sf/openrocket/android/rocket/OpenRocketSaverFragment.java
new file mode 100644 (file)
index 0000000..353b15c
--- /dev/null
@@ -0,0 +1,105 @@
+package net.sf.openrocket.android.rocket;\r
+\r
+import net.sf.openrocket.android.CurrentRocketHolder;\r
+import net.sf.openrocket.android.util.AndroidLogWrapper;\r
+import net.sf.openrocket.android.util.ProgressDialogFragment;\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 OpenRocketSaverFragment extends Fragment {\r
+       \r
+       private final static String SAVING_MESSAGE = "Savinging file...";\r
+\r
+       public static OpenRocketSaverFragment newInstance() {\r
+               OpenRocketSaverFragment frag = new OpenRocketSaverFragment();\r
+               Bundle b = new Bundle();\r
+               frag.setArguments(b);\r
+               return frag;\r
+       }\r
+       \r
+       public interface OnOpenRocketFileSaved {\r
+               public void onOpenRocketFileSaved( Boolean result );\r
+       }\r
+       \r
+       private OpenRocketSaverTask task;\r
+       private OnOpenRocketFileSaved listener;\r
+       \r
+       @Override\r
+       public void onCreate(Bundle savedInstanceState) {\r
+               super.onCreate(savedInstanceState);\r
+               setRetainInstance(true);\r
+               Bundle b = getArguments();\r
+               if ( task == null ) {\r
+                       // since we retain instance state, task will be non-null if it is already loading.\r
+                       task = new OpenRocketSaverTask();\r
+                       task.execute();\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 OnOpenRocketFileSaved ) {\r
+                       listener = (OnOpenRocketFileSaved) parent;\r
+               }\r
+       }\r
+\r
+       public class OpenRocketSaverTask extends AsyncTask<Void, Void, Boolean> {\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("", SAVING_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 Boolean doInBackground(Void... arg0) {\r
+                       AndroidLogWrapper.d(OpenRocketSaverTask.class, "doInBackgroud");\r
+                       \r
+                       try {\r
+                               CurrentRocketHolder.getCurrentRocket().saveOpenRocketDocument();\r
+                               return true;\r
+                       } catch (Throwable ex) {\r
+                               AndroidLogWrapper.e(OpenRocketSaverTask.class, "doInBackground rocketLaoder.load threw {}", ex);\r
+                       }\r
+                       return false;\r
+                       \r
+               }\r
+\r
+               @Override\r
+               protected void onPostExecute(Boolean result) {\r
+                       super.onPostExecute(result);\r
+                       AndroidLogWrapper.d(OpenRocketSaverFragment.class,"Finished saving " + OpenRocketSaverTask.this);\r
+                       Fragment progress = getActivity().getSupportFragmentManager().findFragmentByTag(PROGRESS_DIALOG_TAG);\r
+                       if ( progress != null ) {\r
+                               // Remove the fragment instead of trying to use DialogFragment.dismiss.\r
+                               // If the dialog is now currently shown, dismiss fails.\r
+                               getFragmentManager().beginTransaction().remove(progress).commitAllowingStateLoss();\r
+                       }\r
+                       if ( listener != null ) {\r
+                               listener.onOpenRocketFileSaved(result);\r
+                       }\r
+               }\r
+\r
+       }\r
+\r
+}\r
index 58bb82759458577b5f3ea3069234c930d85358ba..34f8b9d02db0d8acb6ee0fc3b973cfac4af3d65e 100644 (file)
@@ -1,8 +1,6 @@
 package net.sf.openrocket.android.rocket;\r
 \r
 \r
-import java.io.IOException;\r
-\r
 import net.sf.openrocket.R;\r
 import net.sf.openrocket.android.ActivityHelpers;\r
 import net.sf.openrocket.android.CurrentRocketHolder;\r
@@ -37,8 +35,6 @@ implements Simulations.OnSimulationSelectedListener
        private final static int TABSIZE = 4;\r
 \r
        private OpenRocketViewerPagerAdapter viewPagerAdapter;\r
-       \r
-       private MenuItem saveAction;\r
 \r
        @Override\r
        protected void onCreate(Bundle savedInstanceState) {\r
@@ -80,7 +76,14 @@ implements Simulations.OnSimulationSelectedListener
        public boolean onCreateOptionsMenu(Menu menu) {\r
                MenuInflater inflater = getSupportMenuInflater();\r
                inflater.inflate(R.menu.rocket_viewer_option_menu, menu);\r
-               saveAction = menu.findItem(R.id.menu_save);\r
+               MenuItem saveAction = menu.findItem(R.id.menu_save);\r
+               if ( CurrentRocketHolder.getCurrentRocket().isModified() ) {\r
+                       saveAction.setVisible(true);\r
+                       saveAction.setShowAsAction( MenuItem.SHOW_AS_ACTION_ALWAYS );\r
+               } else {\r
+                       saveAction.setVisible(false);\r
+                       saveAction.setShowAsAction( MenuItem.SHOW_AS_ACTION_NEVER );\r
+               }\r
                return true;\r
        }\r
 \r
@@ -94,13 +97,9 @@ implements Simulations.OnSimulationSelectedListener
                        return true;\r
                case R.id.menu_save:\r
                        // FIXME - Probably want to open a dialog here.\r
-                       try {\r
-                               CurrentRocketHolder.getCurrentRocket().saveOpenRocketDocument();\r
-                               saveAction.setVisible(false);\r
-                               invalidateOptionsMenu();\r
-                       } catch ( IOException iex ) {\r
-                               AndroidLogWrapper.d(OpenRocketViewer.class, iex.getMessage());\r
-                       }\r
+                       getSupportFragmentManager().beginTransaction()\r
+                       .add( OpenRocketSaverFragment.newInstance(), "saver")\r
+                       .commitAllowingStateLoss();\r
                        return true;\r
                case android.R.id.home:\r
                        ActivityHelpers.goHome(this);\r
@@ -154,13 +153,10 @@ implements Simulations.OnSimulationSelectedListener
        }\r
 \r
        private class RocketChangedEventHandler extends net.sf.openrocket.android.RocketChangedEventHandler {\r
-               \r
+\r
                @Override\r
                protected void doSimsChanged() {\r
-                       if (saveAction != null ) {\r
-                               saveAction.setVisible(true);\r
-                               invalidateOptionsMenu();\r
-                       }\r
+                       invalidateOptionsMenu();\r
                        Simulations sims = (Simulations) viewPagerAdapter.getFragmentAtPos(SIMS_POS);\r
                        if ( sims != null ) {\r
                                sims.refreshSimulationList();\r
@@ -169,10 +165,7 @@ implements Simulations.OnSimulationSelectedListener
 \r
                @Override\r
                protected void doMotorConfigsChanged() {\r
-                       if (saveAction != null ) {\r
-                               saveAction.setVisible(true);\r
-                               invalidateOptionsMenu();\r
-                       }\r
+                       invalidateOptionsMenu();\r
                        Configurations configs = (Configurations) viewPagerAdapter.getFragmentAtPos(CONFIGS_POS);\r
                        if ( configs != null ) {\r
                                configs.refreshConfigsList();\r
index 954f714a650cbccf78a40d026e1ad42fbae1c497..20a369b5d43eb8092058e2650a499e11d159dafb 100644 (file)
@@ -20,19 +20,6 @@ public class ProgressDialogFragment extends DialogFragment {
                return fragment;\r
        }\r
 \r
-       /**\r
-        * Expose the private method to allow dismissing a dialog after saveInstanceState.\r
-        */\r
-       public void dismissAllowingStateLoss() {\r
-               try {\r
-                       Method dismissInternalMethod = ProgressDialogFragment.class.getMethod("dismissInternal", Boolean.class);\r
-                       dismissInternalMethod.setAccessible(true);\r
-                       dismissInternalMethod.invoke(this, true);\r
-               } catch (Exception ex ) {\r
-                       AndroidLogWrapper.d(ProgressDialogFragment.class, "Exception calling dismissAllowingStateInteral");\r
-               }\r
-       }\r
-\r
        @Override\r
        public void onCreate(Bundle savedInstanceState) {\r
                super.onCreate(savedInstanceState);\r