diff --git a/android/src/net/sf/openrocket/android/CurrentRocket.java b/android/src/net/sf/openrocket/android/CurrentRocket.java index 7546808d5..17e2929a0 100644 --- a/android/src/net/sf/openrocket/android/CurrentRocket.java +++ b/android/src/net/sf/openrocket/android/CurrentRocket.java @@ -1,5 +1,7 @@ package net.sf.openrocket.android; +import static net.sf.openrocket.android.events.Events.*; + import java.io.File; import java.io.IOException; import java.util.HashSet; @@ -11,7 +13,10 @@ import net.sf.openrocket.document.Simulation; import net.sf.openrocket.document.StorageOptions; import net.sf.openrocket.file.openrocket.OpenRocketSaver; import net.sf.openrocket.rocketcomponent.Rocket; +import android.content.Context; +import android.content.Intent; import android.net.Uri; +import android.support.v4.content.LocalBroadcastManager; public class CurrentRocket { @@ -20,15 +25,9 @@ public class CurrentRocket { private OpenRocketDocument rocketDocument; private WarningSet warnings; - private RocketChangedEventHandler handler; - private boolean isModified = false; private Set runningSims = new HashSet(); - - public void setHandler( RocketChangedEventHandler handler ) { - this.handler = handler; - } - + /** * @return the rocketDocument */ @@ -36,60 +35,66 @@ public class CurrentRocket { return rocketDocument; } - public void notifySimsChanged() { - synchronized ( this ) { - isModified = true; - } - if ( handler != null ) { - handler.simsChangedMessage(); - } + private void notifySimsChanged( Context context ) { + Intent msg = new Intent(MESSAGE_ACTION); + msg.putExtra(TYPE, SIMS_CHANGED); + + LocalBroadcastManager.getInstance(context).sendBroadcast(msg); } - public void notifySimComplete() { - synchronized ( this ) { - isModified = true; - } - if ( handler != null ) { - handler.simCompleteMessage(); - } + private void notifySimComplete( Context context ) { + Intent msg = new Intent(MESSAGE_ACTION); + msg.putExtra(TYPE, SIM_COMPLETE); + + LocalBroadcastManager.getInstance(context).sendBroadcast(msg); } - public synchronized void lockSimulation( int simulationId ) { + private void notifyMotorConfigChanged( Context context ) { + Intent msg = new Intent(MESSAGE_ACTION); + msg.putExtra(TYPE, CONFIGS_CHANGED); + + LocalBroadcastManager.getInstance(context).sendBroadcast(msg); + } + + public synchronized void lockSimulation( Context context, int simulationId ) { runningSims.add(simulationId); + // TODO - someday we might want to know about this: + // notifySimsChanged( context ); } - - public synchronized void unlockSimulation( int simulationId ) { + + public synchronized void unlockSimulation( Context context, int simulationId ) { + this.isModified = true; runningSims.remove(simulationId); + notifySimComplete(context); } - + public synchronized Set lockedSimulations() { return new HashSet(runningSims); } - - public void addNewSimulation() { + + public synchronized void addNewSimulation( Context context ) { + isModified = true; Rocket rocket = rocketDocument.getRocket(); // FIXME - hopefully the change to the Simulation object will be reverted soon. Simulation newSim = new Simulation(rocketDocument, rocket); newSim.setName(rocketDocument.getNextSimulationName()); rocketDocument.addSimulation(newSim); - notifySimsChanged(); + notifySimsChanged(context); } - - public void deleteSimulation( int simulationPos ) { + + public synchronized void deleteSimulation( Context context, int simulationPos ) { + isModified = true; rocketDocument.removeSimulation( simulationPos ); - notifySimsChanged(); + notifySimsChanged(context); } - - public String addNewMotorConfig() { - synchronized ( this ) { - isModified = true; - } + + public synchronized String addNewMotorConfig( Context context ) { + isModified = true; String configId = rocketDocument.getRocket().newMotorConfigurationID(); - if ( handler != null ) { - handler.configsChangedMessage(); - } + notifyMotorConfigChanged(context); return configId; } + /** * @param rocketDocument the rocketDocument to set */ @@ -119,21 +124,21 @@ public class CurrentRocket { public boolean isModified() { return this.isModified; } - + public boolean canSave() { return this.isModified && this.runningSims.isEmpty(); } - + public void saveOpenRocketDocument() throws IOException { - + // Translate the fileUri if it happens to be a .rkt file. String filename = fileUri.getPath(); - + if ( ! filename.endsWith(".ork") ) { filename = filename.concat(".ork"); } - + OpenRocketSaver saver = new OpenRocketSaver(); StorageOptions options = new StorageOptions(); options.setCompressionEnabled(true); diff --git a/android/src/net/sf/openrocket/android/RocketChangedEventHandler.java b/android/src/net/sf/openrocket/android/RocketChangedEventHandler.java deleted file mode 100644 index 06668fa37..000000000 --- a/android/src/net/sf/openrocket/android/RocketChangedEventHandler.java +++ /dev/null @@ -1,67 +0,0 @@ -package net.sf.openrocket.android; - -import android.os.Handler; -import android.os.Looper; -import android.os.Message; - -public abstract class RocketChangedEventHandler extends Handler { - - public RocketChangedEventHandler() { - } - - public RocketChangedEventHandler(Callback callback) { - super(callback); - } - - public RocketChangedEventHandler(Looper looper) { - super(looper); - } - - public RocketChangedEventHandler(Looper looper, Callback callback) { - super(looper, callback); - } - - public static final int MOTOR_CONFIGS_CHANGED = 1; - public static final int SIMS_CHANGED = 2; - public static final int SIM_COMPLETE = 3; - - public void simCompleteMessage() { - Message m = this.obtainMessage(SIM_COMPLETE); - this.sendMessage(m); - } - - public void simsChangedMessage() { - Message m = this.obtainMessage(SIMS_CHANGED); - this.sendMessage(m); - } - - public void configsChangedMessage() { - Message m = this.obtainMessage(MOTOR_CONFIGS_CHANGED); - this.sendMessage(m); - } - - @Override - public void handleMessage(Message msg) { - int what = msg.what; - switch ( what ) { - case SIMS_CHANGED: - doSimsChanged(); - break; - case MOTOR_CONFIGS_CHANGED: - doMotorConfigsChanged(); - break; - case SIM_COMPLETE: - doSimComplete(); - break; - default: - super.handleMessage(msg); - } - } - - protected abstract void doSimComplete(); - - protected abstract void doSimsChanged(); - - protected abstract void doMotorConfigsChanged(); - -} diff --git a/android/src/net/sf/openrocket/android/events/ChangeEventBroadcastReceiver.java b/android/src/net/sf/openrocket/android/events/ChangeEventBroadcastReceiver.java new file mode 100644 index 000000000..55543eb52 --- /dev/null +++ b/android/src/net/sf/openrocket/android/events/ChangeEventBroadcastReceiver.java @@ -0,0 +1,43 @@ +package net.sf.openrocket.android.events; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.support.v4.content.LocalBroadcastManager; + +public abstract class ChangeEventBroadcastReceiver extends BroadcastReceiver { + + public void register( Context context ) { + LocalBroadcastManager.getInstance(context).registerReceiver( this, + new IntentFilter(Events.MESSAGE_ACTION) ); + } + + public void unregister( Context context ) { + LocalBroadcastManager.getInstance(context).unregisterReceiver(this); + } + + @Override + public void onReceive(Context context, Intent intent) { + + int type = intent.getIntExtra(Events.TYPE, -1); + switch( type ) { + case Events.CONFIGS_CHANGED: + doMotorConfigsChanged(); + break; + case Events.SIMS_CHANGED: + doSimsChanged(); + break; + case Events.SIM_COMPLETE: + doSimComplete(); + break; + } + } + + protected abstract void doSimComplete(); + + protected abstract void doSimsChanged(); + + protected abstract void doMotorConfigsChanged(); + +} diff --git a/android/src/net/sf/openrocket/android/events/Events.java b/android/src/net/sf/openrocket/android/events/Events.java new file mode 100644 index 000000000..75114d96c --- /dev/null +++ b/android/src/net/sf/openrocket/android/events/Events.java @@ -0,0 +1,14 @@ +package net.sf.openrocket.android.events; + +public abstract class Events { + + public final static int SIMS_CHANGED=0; + public final static int SIM_COMPLETE=1; + public final static int CONFIGS_CHANGED=2; + + public final static String MESSAGE_ACTION = "net.sf.openrocket.Message"; + + public final static String TYPE = "type"; + + +} diff --git a/android/src/net/sf/openrocket/android/rocket/Configurations.java b/android/src/net/sf/openrocket/android/rocket/Configurations.java index 4e86610b6..b588413ac 100644 --- a/android/src/net/sf/openrocket/android/rocket/Configurations.java +++ b/android/src/net/sf/openrocket/android/rocket/Configurations.java @@ -70,7 +70,7 @@ public class Configurations extends ExpandableListFragment { } private void addConfiguration() { - CurrentRocketHolder.getCurrentRocket().addNewMotorConfig(); + CurrentRocketHolder.getCurrentRocket().addNewMotorConfig(getActivity()); } private static class MotorMountInfo { diff --git a/android/src/net/sf/openrocket/android/rocket/OpenRocketViewer.java b/android/src/net/sf/openrocket/android/rocket/OpenRocketViewer.java index 5274912e6..cd1ae74c3 100644 --- a/android/src/net/sf/openrocket/android/rocket/OpenRocketViewer.java +++ b/android/src/net/sf/openrocket/android/rocket/OpenRocketViewer.java @@ -4,6 +4,7 @@ package net.sf.openrocket.android.rocket; import net.sf.openrocket.R; import net.sf.openrocket.android.ActivityHelpers; import net.sf.openrocket.android.CurrentRocketHolder; +import net.sf.openrocket.android.events.ChangeEventBroadcastReceiver; import net.sf.openrocket.android.simulation.SimulationChart; import net.sf.openrocket.android.simulation.SimulationViewActivity; import net.sf.openrocket.android.simulation.SimulationViewFragment; @@ -47,6 +48,9 @@ implements Simulations.OnSimulationSelectedListener, OpenRocketSaverFragment.OnO private boolean loadAfterSave = false; private String autoSaveEnabledKey; private boolean autoSaveEnabled = false; + + private RocketChangedEventHandler handler = new RocketChangedEventHandler(); + @Override protected void onCreate(Bundle savedInstanceState) { @@ -80,7 +84,7 @@ implements Simulations.OnSimulationSelectedListener, OpenRocketSaverFragment.OnO @Override protected void onPause() { - CurrentRocketHolder.getCurrentRocket().setHandler(null); + handler.unregister(this); SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); pref.unregisterOnSharedPreferenceChangeListener(this); super.onPause(); @@ -95,8 +99,7 @@ implements Simulations.OnSimulationSelectedListener, OpenRocketSaverFragment.OnO pref.registerOnSharedPreferenceChangeListener(this); - RocketChangedEventHandler handler = new RocketChangedEventHandler(); - CurrentRocketHolder.getCurrentRocket().setHandler(handler); + handler.register(this); super.onResume(); } @@ -220,7 +223,7 @@ implements Simulations.OnSimulationSelectedListener, OpenRocketSaverFragment.OnO } } - private class RocketChangedEventHandler extends net.sf.openrocket.android.RocketChangedEventHandler { + private class RocketChangedEventHandler extends ChangeEventBroadcastReceiver { @Override protected void doSimComplete() { diff --git a/android/src/net/sf/openrocket/android/simservice/SimulationService.java b/android/src/net/sf/openrocket/android/simservice/SimulationService.java index 65d9d8171..d241cb68a 100644 --- a/android/src/net/sf/openrocket/android/simservice/SimulationService.java +++ b/android/src/net/sf/openrocket/android/simservice/SimulationService.java @@ -23,6 +23,8 @@ public class SimulationService extends IntentService { public static void executeSimulationTask( Context c, SimulationTask t ) { AndroidLogWrapper.d(SimulationService.class, "Submitting simulation " + t.simulationId ); + CurrentRocketHolder.getCurrentRocket().lockSimulation( c, t.simulationId ); + Intent intent = new Intent( c, SimulationService.class ); intent.putExtra("net.sf.openrocket.simulationtask", t); c.startService(intent); @@ -39,8 +41,7 @@ public class SimulationService extends IntentService { Simulation sim = CurrentRocketHolder.getCurrentRocket().getRocketDocument().getSimulation(t.simulationId); AndroidLogWrapper.d(SimulationService.class, "simulating " + t.simulationId ); sim.simulate(); - CurrentRocketHolder.getCurrentRocket().unlockSimulation(t.simulationId); - CurrentRocketHolder.getCurrentRocket().notifySimsChanged(); + CurrentRocketHolder.getCurrentRocket().unlockSimulation(this, t.simulationId); } catch (SimulationException simex) { Toast.makeText(this, "Error in simulation:" + simex.getMessage(), Toast.LENGTH_LONG ).show(); diff --git a/android/src/net/sf/openrocket/android/simulation/SimulationEditFragment.java b/android/src/net/sf/openrocket/android/simulation/SimulationEditFragment.java index 147dec98d..b66a3d7c5 100644 --- a/android/src/net/sf/openrocket/android/simulation/SimulationEditFragment.java +++ b/android/src/net/sf/openrocket/android/simulation/SimulationEditFragment.java @@ -109,7 +109,7 @@ public class SimulationEditFragment extends SherlockDialogFragment { } public void onDelete( ) { - CurrentRocketHolder.getCurrentRocket().deleteSimulation(simulationId); + CurrentRocketHolder.getCurrentRocket().deleteSimulation(getActivity(), simulationId); getDialog().dismiss(); } diff --git a/android/src/net/sf/openrocket/android/simulation/Simulations.java b/android/src/net/sf/openrocket/android/simulation/Simulations.java index 805792b65..4d8314ae2 100644 --- a/android/src/net/sf/openrocket/android/simulation/Simulations.java +++ b/android/src/net/sf/openrocket/android/simulation/Simulations.java @@ -169,7 +169,7 @@ implements SharedPreferences.OnSharedPreferenceChangeListener } private void addSimulation() { - CurrentRocketHolder.getCurrentRocket().addNewSimulation(); + CurrentRocketHolder.getCurrentRocket().addNewSimulation(getActivity()); } }