Added local foreground service which runs simulations. Wired into the SimulationEdit...
authorkruland2607 <kruland2607@180e2498-e6e9-4542-8430-84ac67f01cd8>
Mon, 4 Jun 2012 19:16:27 +0000 (19:16 +0000)
committerkruland2607 <kruland2607@180e2498-e6e9-4542-8430-84ac67f01cd8>
Mon, 4 Jun 2012 19:16:27 +0000 (19:16 +0000)
git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@749 180e2498-e6e9-4542-8430-84ac67f01cd8

android/AndroidManifest.xml
android/res/layout/simulation_condition_dialog.xml
android/res/values/pref_strings.xml
android/src/net/sf/openrocket/android/rocket/SimulationEditFragment.java
android/src/net/sf/openrocket/android/simservice/SimulationService.java [new file with mode: 0644]
android/src/net/sf/openrocket/android/simservice/SimulationTask.java [new file with mode: 0644]

index 9043baf92db7fe6be7d4a89070f3217d01467901..1c9c3a11998daa517939e3e06edf48a8b545b595 100644 (file)
         <activity\r
             android:name=".android.simulation.SimulationViewActivity"\r
             android:theme="@style/AppTheme.NoActionBar" />\r
-        <activity android:name=".android.filebrowser.SimpleFileBrowser"\r
+        <activity\r
+            android:name=".android.filebrowser.SimpleFileBrowser"\r
             android:theme="@style/Theme.Sherlock.Dialog" />\r
+\r
+        <service android:name=".android.simservice.SimulationService" />\r
     </application>\r
 \r
 </manifest>
\ No newline at end of file
index d4149d2d7cea0868f3463240236bf9c91f2ab489..ef667c846ea6bae5174ca5307824611c8b3afb49 100644 (file)
@@ -44,7 +44,7 @@
         android:text="@string/simulationConditionsLaunchRodAngle" />\r
 \r
     <EditText\r
-        android:id="@+id/simulation_condition_roddirection"\r
+        android:id="@+id/simulation_condition_rodangle"\r
         android:layout_width="match_parent"\r
         android:layout_height="wrap_content"\r
         android:ems="10"\r
@@ -59,7 +59,7 @@
         android:text="@string/simulationConditionsLaunchRodDirection" />\r
 \r
     <EditText\r
-        android:id="@+id/simulation_condition_rodangle"\r
+        android:id="@+id/simulation_condition_roddirection"\r
         android:layout_width="match_parent"\r
         android:layout_height="wrap_content"\r
         android:ems="10"\r
index dcdd42210ab833a4fefa0674dac8aa26800508ab..f9da2e828e5591438fc1f60c3f52d19766864896 100644 (file)
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>\r
 <resources>\r
 \r
+    <string name="SimulationServiceNotificationID"></string>\r
     <string name="PreferenceMotorBrowserGroupingOption">PreferenceMotorBrowserGroupingOption</string>\r
     <string name="PreferenceUseInternalFileBrowserOption">PreferenceUseInternalFileBrowserOpion</string>\r
     <string name="PreferenceFileBrowserBaseDirectory">PreferenceFileBrowserBaseDirectory</string>\r
index bb28281d72ace59d4bdd593e24a4a312248bdffe..01706658ee17fa9b50e4c2401facb111646ce47e 100644 (file)
@@ -3,6 +3,8 @@ package net.sf.openrocket.android.rocket;
 \r
 import net.sf.openrocket.R;\r
 import net.sf.openrocket.android.CurrentRocketHolder;\r
+import net.sf.openrocket.android.simservice.SimulationService;\r
+import net.sf.openrocket.android.simservice.SimulationTask;\r
 import net.sf.openrocket.document.OpenRocketDocument;\r
 import net.sf.openrocket.document.Simulation;\r
 import net.sf.openrocket.simulation.SimulationOptions;\r
@@ -59,13 +61,20 @@ public class SimulationEditFragment extends SherlockDialogFragment {
                \r
                Button deleteButton = (Button) v.findViewById(R.id.simulationConditionDelete);\r
                deleteButton.setOnClickListener( new OnClickListener() {\r
-\r
                        @Override\r
                        public void onClick(View v) {\r
                                onDelete();\r
                        }\r
-                       \r
                });\r
+               \r
+               Button runButton = (Button) v.findViewById(R.id.simulationConditionRun);\r
+               runButton.setOnClickListener( new OnClickListener() {\r
+                       @Override\r
+                       public void onClick(View v) {\r
+                               onRun();\r
+                       }\r
+               });\r
+\r
                windspeedField = (EditText) v.findViewById(R.id.simulation_condition_windspeed);\r
                rodlengthField = (EditText) v.findViewById(R.id.simulation_condition_rodlength);\r
                rodangleField = (EditText) v.findViewById(R.id.simulation_condition_rodangle);\r
@@ -83,8 +92,8 @@ public class SimulationEditFragment extends SherlockDialogFragment {
                if ( options != null ) {\r
                        windspeedField.setText( UnitGroup.UNITS_VELOCITY.toString( options.getWindSpeedAverage() ));\r
                        rodlengthField.setText( UnitGroup.UNITS_LENGTH.toString( options.getLaunchRodLength() ));\r
-                       rodangleField.setText( String.valueOf( options.getLaunchRodLength() ));\r
-                       roddirectionField.setText( String.valueOf( options.getLaunchRodDirection() ));\r
+                       rodangleField.setText( UnitGroup.UNITS_ANGLE.toString( options.getLaunchRodAngle() ));\r
+                       roddirectionField.setText( UnitGroup.UNITS_ANGLE.toString( options.getLaunchRodDirection() ));\r
                        motorSpinner.setSelectedConfiguration(options.getMotorConfigurationID());\r
                }\r
 \r
@@ -103,4 +112,20 @@ public class SimulationEditFragment extends SherlockDialogFragment {
                getDialog().dismiss();\r
        }\r
        \r
+       public void onRun() {\r
+               \r
+               OpenRocketDocument rocketDocument = CurrentRocketHolder.getCurrentRocket().getRocketDocument();\r
+               Simulation sim = rocketDocument.getSimulation(simulationId);\r
+               SimulationOptions options = sim.getOptions();\r
+\r
+               options.setWindSpeedAverage( UnitGroup.UNITS_VELOCITY.fromUnit(Double.parseDouble( windspeedField.getText().toString() )));\r
+               options.setLaunchRodLength( UnitGroup.UNITS_LENGTH.fromUnit(Double.parseDouble( rodlengthField.getText().toString() )));\r
+               options.setLaunchRodAngle( UnitGroup.UNITS_ANGLE.fromUnit(Double.parseDouble( rodangleField.getText().toString() )));\r
+               options.setLaunchRodDirection( UnitGroup.UNITS_ANGLE.fromUnit(Double.parseDouble( roddirectionField.getText().toString() )));\r
+               options.setMotorConfigurationID( motorSpinner.getSelectedConfiguration() );\r
+               \r
+               SimulationTask t = new SimulationTask(simulationId);\r
+               SimulationService.executeSimulationTask(getActivity(), t);\r
+               getDialog().dismiss();\r
+       }\r
 }
\ No newline at end of file
diff --git a/android/src/net/sf/openrocket/android/simservice/SimulationService.java b/android/src/net/sf/openrocket/android/simservice/SimulationService.java
new file mode 100644 (file)
index 0000000..dad4629
--- /dev/null
@@ -0,0 +1,85 @@
+package net.sf.openrocket.android.simservice;\r
+\r
+import net.sf.openrocket.R;\r
+import net.sf.openrocket.android.CurrentRocketHolder;\r
+import net.sf.openrocket.android.util.AndroidLogWrapper;\r
+import net.sf.openrocket.document.Simulation;\r
+import net.sf.openrocket.simulation.exception.SimulationException;\r
+import android.app.IntentService;\r
+import android.app.Notification;\r
+import android.app.PendingIntent;\r
+import android.content.Context;\r
+import android.content.Intent;\r
+import android.os.IBinder;\r
+import android.widget.Toast;\r
+\r
+public class SimulationService extends IntentService {\r
+\r
+       // We use an id (from a dummy string) as the notificationID because it is unique.\r
+       private final static int notificationID = R.string.SimulationServiceNotificationID;\r
+       \r
+       private Notification notification;\r
+       \r
+       public static void executeSimulationTask( Context c, SimulationTask t ) {\r
+               AndroidLogWrapper.d(SimulationService.class, "Submitting simulation " + t.simulationId );\r
+\r
+               Intent intent = new Intent( c, SimulationService.class );\r
+               intent.putExtra("net.sf.openrocket.simulationtask", t);\r
+               c.startService(intent);\r
+       }\r
+       \r
+       public SimulationService() {\r
+               super("OpenRocket Simulation Execution Service");\r
+       }\r
+\r
+       @Override\r
+       protected void onHandleIntent(Intent intent) {\r
+               SimulationTask t = (SimulationTask) intent.getSerializableExtra("net.sf.openrocket.simulationtask");\r
+               try {\r
+                       Simulation sim = CurrentRocketHolder.getCurrentRocket().getRocketDocument().getSimulation(t.simulationId);\r
+                       AndroidLogWrapper.d(SimulationService.class, "simulating " + t.simulationId );\r
+                       sim.simulate();\r
+                       CurrentRocketHolder.getCurrentRocket().notifySimsChanged();\r
+               }\r
+               catch (SimulationException simex) {\r
+                       Toast.makeText(this, "Error in simulation:" + simex.getMessage(), Toast.LENGTH_LONG ).show();\r
+               }\r
+       }\r
+\r
+       @Override\r
+       public IBinder onBind(Intent intent) {\r
+               return null;\r
+       }\r
+\r
+       @Override\r
+       public void onCreate() {\r
+               super.onCreate();\r
+               \r
+               this.notification = buildNotification();\r
+               startForeground(notificationID, notification);\r
+               \r
+       }\r
+\r
+       @Override\r
+       public int onStartCommand(Intent intent, int flags, int startId) {\r
+               super.onStartCommand(intent, flags, startId);\r
+               return START_STICKY;\r
+       }\r
+\r
+       \r
+       @Override\r
+       public void onDestroy() {\r
+               super.onDestroy();\r
+               stopForeground(true);\r
+       }\r
+\r
+       private Notification buildNotification( ) {\r
+               String message = "OpenRocket Simulation Execution";\r
+               Notification notification = new Notification(R.drawable.or_launcher, message, System.currentTimeMillis());\r
+               \r
+               notification.flags = Notification.FLAG_NO_CLEAR;\r
+               PendingIntent contentIntent = PendingIntent.getActivity( this, 0 , new Intent( ), PendingIntent.FLAG_UPDATE_CURRENT );\r
+               notification.setLatestEventInfo(this, "OpenRocket", message, contentIntent);\r
+               return notification;\r
+       }\r
+}\r
diff --git a/android/src/net/sf/openrocket/android/simservice/SimulationTask.java b/android/src/net/sf/openrocket/android/simservice/SimulationTask.java
new file mode 100644 (file)
index 0000000..12abc3a
--- /dev/null
@@ -0,0 +1,13 @@
+package net.sf.openrocket.android.simservice;\r
+\r
+import java.io.Serializable;\r
+\r
+public class SimulationTask implements Serializable {\r
+\r
+       int simulationId;\r
+\r
+       public SimulationTask(int simulationId) {\r
+               this.simulationId = simulationId;\r
+       }\r
+       \r
+}\r