<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
<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
<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
\r
private RocketChangedEventHandler handler;\r
\r
+ private boolean isModified = false;\r
+ \r
public void setHandler( RocketChangedEventHandler handler ) {\r
this.handler = handler;\r
}\r
}\r
\r
public void notifySimsChanged() {\r
+ isModified = true;\r
if ( handler != null ) {\r
handler.simsChangedMessage();\r
}\r
}\r
\r
public String addNewMotorConfig() {\r
+ isModified = true;\r
String configId = rocketDocument.getRocket().newMotorConfigurationID();\r
if ( handler != null ) {\r
handler.configsChangedMessage();\r
*/\r
public void setRocketDocument(OpenRocketDocument rocketDocument) {\r
this.rocketDocument = rocketDocument;\r
+ isModified = false;\r
}\r
\r
public WarningSet getWarnings() {\r
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
@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
--- /dev/null
+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
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
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
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
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
}\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
\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
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