From 077147d5d175f52be1d759427450c85bfdc95f59 Mon Sep 17 00:00:00 2001 From: Kevin Ruland Date: Thu, 21 Jun 2012 19:10:06 +0000 Subject: [PATCH] Use a different approach to prevent ForceClose after the application has been put to sleep for a long period of time. Each of the fragments in the Viewer will do their setup in onResume instead of in onCreateView. Further, the ProgressDialogFragment used in the OpenRocketLoaderFragment now exposes a dismissAllowStateLoss method so the dialog can be dismissed if the application is put in the background while loading. --- android/AndroidManifest.xml | 5 ++--- .../openrocket/android/rocket/Component.java | 7 +++---- .../android/rocket/Configurations.java | 14 ++++++-------- .../rocket/OpenRocketLoaderFragment.java | 2 +- .../android/rocket/OpenRocketViewer.java | 18 +++++++++++++----- .../sf/openrocket/android/rocket/Overview.java | 5 +++++ .../openrocket/android/rocket/Simulations.java | 5 +++++ .../android/util/ProgressDialogFragment.java | 14 ++++++++++++++ 8 files changed, 49 insertions(+), 21 deletions(-) diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index 99419d1bf..daa4f0d62 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -56,9 +56,8 @@ android:scheme="file" /> - + diff --git a/android/src/net/sf/openrocket/android/rocket/Component.java b/android/src/net/sf/openrocket/android/rocket/Component.java index 1cdbc07fa..ac8f1f993 100644 --- a/android/src/net/sf/openrocket/android/rocket/Component.java +++ b/android/src/net/sf/openrocket/android/rocket/Component.java @@ -31,13 +31,12 @@ public class Component extends Fragment { } @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - + public void onResume() { + super.onResume(); final OpenRocketDocument rocketDocument = CurrentRocketHolder.getCurrentRocket().getRocketDocument(); componentTree.setAdapter( buildAdapter( rocketDocument.getRocket() ) ); } - + private ListAdapter buildAdapter( Rocket rocket ) { TreeStateManager manager = new InMemoryTreeStateManager(); diff --git a/android/src/net/sf/openrocket/android/rocket/Configurations.java b/android/src/net/sf/openrocket/android/rocket/Configurations.java index 267507ab9..34c536427 100644 --- a/android/src/net/sf/openrocket/android/rocket/Configurations.java +++ b/android/src/net/sf/openrocket/android/rocket/Configurations.java @@ -42,6 +42,12 @@ public class Configurations extends ExpandableListFragment { return v; } + @Override + public void onResume() { + setup(); + super.onResume(); + } + @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.rocket_viewer_configurations_option_menu, menu); @@ -59,14 +65,6 @@ public class Configurations extends ExpandableListFragment { } } - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - - setup(); - - } - public void refreshConfigsList() { setup(); } diff --git a/android/src/net/sf/openrocket/android/rocket/OpenRocketLoaderFragment.java b/android/src/net/sf/openrocket/android/rocket/OpenRocketLoaderFragment.java index 99922752a..1c3e229b5 100644 --- a/android/src/net/sf/openrocket/android/rocket/OpenRocketLoaderFragment.java +++ b/android/src/net/sf/openrocket/android/rocket/OpenRocketLoaderFragment.java @@ -105,7 +105,7 @@ public class OpenRocketLoaderFragment extends Fragment { AndroidLogWrapper.d(OpenRocketLoaderActivity.class,"Finished loading " + OpenRocketLoaderTask.this); Fragment progress = getActivity().getSupportFragmentManager().findFragmentByTag(PROGRESS_DIALOG_TAG); if ( progress != null ) { - ((DialogFragment)progress).dismiss(); + ((ProgressDialogFragment)progress).dismissAllowingStateLoss(); } if ( listener != null ) { listener.onOpenRocketFileLoaded(result); diff --git a/android/src/net/sf/openrocket/android/rocket/OpenRocketViewer.java b/android/src/net/sf/openrocket/android/rocket/OpenRocketViewer.java index 94beaffe2..7673f3116 100644 --- a/android/src/net/sf/openrocket/android/rocket/OpenRocketViewer.java +++ b/android/src/net/sf/openrocket/android/rocket/OpenRocketViewer.java @@ -10,6 +10,7 @@ import net.sf.openrocket.android.simulation.SimulationChart; import net.sf.openrocket.android.simulation.SimulationViewActivity; import net.sf.openrocket.android.simulation.SimulationViewFragment; import net.sf.openrocket.android.util.AndroidLogWrapper; +import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.document.Simulation; import android.app.AlertDialog; import android.content.Intent; @@ -41,7 +42,17 @@ implements Simulations.OnSimulationSelectedListener protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setTitle(CurrentRocketHolder.getCurrentRocket().getRocketDocument().getRocket().getName()); + // If the application sleeps for a long time, the CurrentRocketHolder might get cleaned + // up. When this happens, we cannot restore this state, so instead we just + // go home. + OpenRocketDocument rocDoc = CurrentRocketHolder.getCurrentRocket().getRocketDocument(); + if ( rocDoc == null ) { + AndroidLogWrapper.d(OpenRocketViewer.class, "No document - go home"); + ActivityHelpers.goHome(this); + finish(); + return; + } + setTitle(rocDoc.getRocket().getName()); getSupportActionBar().setHomeButtonEnabled(true); setContentView(R.layout.openrocketviewer); @@ -59,10 +70,7 @@ implements Simulations.OnSimulationSelectedListener @Override protected void onResume() { RocketChangedEventHandler handler = new RocketChangedEventHandler(); - // Fire change notices so the displayed lists get updated. - // This is primarily because simulations run in the background - handler.doSimsChanged(); - CurrentRocketHolder.getCurrentRocket().setHandler( handler ); + CurrentRocketHolder.getCurrentRocket().setHandler(handler); super.onResume(); } diff --git a/android/src/net/sf/openrocket/android/rocket/Overview.java b/android/src/net/sf/openrocket/android/rocket/Overview.java index e4c226fd9..33cedaeb7 100644 --- a/android/src/net/sf/openrocket/android/rocket/Overview.java +++ b/android/src/net/sf/openrocket/android/rocket/Overview.java @@ -55,6 +55,11 @@ implements SharedPreferences.OnSharedPreferenceChangeListener SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); prefs.registerOnSharedPreferenceChangeListener(this); + } + + @Override + public void onResume() { + super.onResume(); setup(); } diff --git a/android/src/net/sf/openrocket/android/rocket/Simulations.java b/android/src/net/sf/openrocket/android/rocket/Simulations.java index e121cdaf5..4ceb210f5 100644 --- a/android/src/net/sf/openrocket/android/rocket/Simulations.java +++ b/android/src/net/sf/openrocket/android/rocket/Simulations.java @@ -87,6 +87,11 @@ implements SharedPreferences.OnSharedPreferenceChangeListener SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); prefs.registerOnSharedPreferenceChangeListener(this); + } + + @Override + public void onResume() { + super.onResume(); setup(); } diff --git a/android/src/net/sf/openrocket/android/util/ProgressDialogFragment.java b/android/src/net/sf/openrocket/android/util/ProgressDialogFragment.java index d095a5c9e..954f714a6 100644 --- a/android/src/net/sf/openrocket/android/util/ProgressDialogFragment.java +++ b/android/src/net/sf/openrocket/android/util/ProgressDialogFragment.java @@ -1,5 +1,7 @@ package net.sf.openrocket.android.util; +import java.lang.reflect.Method; + import android.app.ProgressDialog; import android.os.Bundle; import android.support.v4.app.DialogFragment; @@ -18,6 +20,18 @@ public class ProgressDialogFragment extends DialogFragment { return fragment; } + /** + * Expose the private method to allow dismissing a dialog after saveInstanceState. + */ + public void dismissAllowingStateLoss() { + try { + Method dismissInternalMethod = ProgressDialogFragment.class.getMethod("dismissInternal", Boolean.class); + dismissInternalMethod.setAccessible(true); + dismissInternalMethod.invoke(this, true); + } catch (Exception ex ) { + AndroidLogWrapper.d(ProgressDialogFragment.class, "Exception calling dismissAllowingStateInteral"); + } + } @Override public void onCreate(Bundle savedInstanceState) {