--- /dev/null
+package net.sf.openrocket.android.rocket;\r
+\r
+import java.util.Set;\r
+\r
+import net.sf.openrocket.motor.ThrustCurveMotorPlaceholder;\r
+import android.app.AlertDialog;\r
+import android.app.Dialog;\r
+import android.content.DialogInterface;\r
+import android.os.Bundle;\r
+import android.support.v4.app.DialogFragment;\r
+\r
+public class MissingMotorDialogFragment extends DialogFragment {\r
+\r
+ Set<ThrustCurveMotorPlaceholder> missingMotors;\r
+\r
+ public static MissingMotorDialogFragment newInstance( Set<ThrustCurveMotorPlaceholder> missingMotors ) {\r
+ MissingMotorDialogFragment frag = new MissingMotorDialogFragment();\r
+ frag.missingMotors = missingMotors;\r
+ return frag;\r
+ }\r
+\r
+ @Override\r
+ public Dialog onCreateDialog(Bundle savedInstanceState) {\r
+\r
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());\r
+ // .setIcon(android.R.drawable.alert_dialog_icon)\r
+ builder.setTitle("Missing Motors");\r
+ StringBuilder sb = new StringBuilder();\r
+ sb.append("The following motors are missing:");\r
+ for( ThrustCurveMotorPlaceholder m : missingMotors ) {\r
+ sb.append("\n").append(m.getManufacturer()).append(" ").append(m.getDesignation());\r
+ }\r
+ sb.append("\nWould you like to download them from Thrustcurve?");\r
+ builder.setMessage(sb.toString());\r
+ builder.setPositiveButton("OK",\r
+ new DialogInterface.OnClickListener() {\r
+ public void onClick(DialogInterface dialog, int whichButton) {\r
+ ((OpenRocketLoaderActivity)getActivity()).doFixMissingMotors();\r
+ }\r
+ }\r
+ );\r
+ builder.setNegativeButton("Cancel",\r
+ new DialogInterface.OnClickListener() {\r
+ public void onClick(DialogInterface dialog, int whichButton) {\r
+ ((OpenRocketLoaderActivity)getActivity()).doNotFixMissingMotors();\r
+ }\r
+ }\r
+ );\r
+ return builder.create();\r
+ }\r
+}\r
+\r
--- /dev/null
+package net.sf.openrocket.android.rocket;\r
+\r
+import java.util.HashSet;\r
+import java.util.Iterator;\r
+import java.util.Set;\r
+\r
+import net.sf.openrocket.aerodynamics.WarningSet;\r
+import net.sf.openrocket.android.util.AndroidLogWrapper;\r
+import net.sf.openrocket.file.DatabaseMotorFinder;\r
+import net.sf.openrocket.motor.Motor;\r
+import net.sf.openrocket.motor.ThrustCurveMotorPlaceholder;\r
+import net.sf.openrocket.rocketcomponent.Configuration;\r
+import net.sf.openrocket.rocketcomponent.MotorMount;\r
+import net.sf.openrocket.rocketcomponent.Rocket;\r
+\r
+public abstract class MissingMotorHelpers {\r
+\r
+ public static Set<ThrustCurveMotorPlaceholder> findMissingMotors( Rocket rocket ) {\r
+\r
+ Set<ThrustCurveMotorPlaceholder> missingMotors = new HashSet<ThrustCurveMotorPlaceholder>();\r
+ Configuration config = rocket.getDefaultConfiguration();\r
+ for( String configID : rocket.getMotorConfigurationIDs() ) {\r
+ config.setMotorConfigurationID(configID);\r
+ Iterator<MotorMount> mmts = config.motorIterator();\r
+ while ( mmts.hasNext() ) {\r
+ MotorMount mmt = mmts.next();\r
+ Motor m = mmt.getMotor(configID);\r
+ if ( m instanceof ThrustCurveMotorPlaceholder ) {\r
+ missingMotors.add( (ThrustCurveMotorPlaceholder) m );\r
+ }\r
+ }\r
+\r
+ }\r
+\r
+ for ( ThrustCurveMotorPlaceholder m : missingMotors ) {\r
+ AndroidLogWrapper.d(MissingMotorHelpers.class, "Missing Motor: {}", m);\r
+ }\r
+\r
+ return missingMotors;\r
+ }\r
+\r
+ public static void updateMissingMotors( Rocket rocket, WarningSet warnings ) {\r
+ \r
+ DatabaseMotorFinder finder = new DatabaseMotorFinder();\r
+ \r
+ Configuration config = rocket.getDefaultConfiguration();\r
+ for( String configID : rocket.getMotorConfigurationIDs() ) {\r
+ config.setMotorConfigurationID(configID);\r
+ Iterator<MotorMount> mmts = config.motorIterator();\r
+ while ( mmts.hasNext() ) {\r
+ MotorMount mmt = mmts.next();\r
+ Motor m = mmt.getMotor(configID);\r
+ if ( m instanceof ThrustCurveMotorPlaceholder ) {\r
+ \r
+ ThrustCurveMotorPlaceholder placeholder = (ThrustCurveMotorPlaceholder)m;\r
+ Motor newMotor = finder.findMotor(placeholder.getMotorType(),\r
+ placeholder.getManufacturer(),\r
+ placeholder.getDesignation(),\r
+ placeholder.getDiameter(),\r
+ placeholder.getLength(),\r
+ placeholder.getDigest(),\r
+ warnings);\r
+\r
+ if ( newMotor != null ) {\r
+ // one is now here so replace it\r
+ mmt.setMotor(configID, newMotor);\r
+ }\r
+ }\r
+ }\r
+\r
+ }\r
+\r
+ \r
+ }\r
+ \r
+}\r
package net.sf.openrocket.android.rocket;\r
\r
import java.io.File;\r
+import java.util.Set;\r
\r
import net.sf.openrocket.R;\r
import net.sf.openrocket.aerodynamics.WarningSet;\r
import net.sf.openrocket.android.Application;\r
+import net.sf.openrocket.android.thrustcurve.TCMissingMotorDownloadAction;\r
+import net.sf.openrocket.android.thrustcurve.TCQueryAction;\r
import net.sf.openrocket.android.util.AndroidLogWrapper;\r
-import android.app.AlertDialog;\r
-import android.app.Dialog;\r
+import net.sf.openrocket.motor.ThrustCurveMotorPlaceholder;\r
import android.app.ProgressDialog;\r
-import android.content.DialogInterface;\r
import android.content.Intent;\r
import android.net.Uri;\r
import android.os.Bundle;\r
import android.support.v4.app.DialogFragment;\r
import android.support.v4.app.FragmentActivity;\r
\r
-public class OpenRocketLoaderActivity extends FragmentActivity {\r
+public class OpenRocketLoaderActivity extends FragmentActivity\r
+implements TCQueryAction.OnComplete\r
+{\r
\r
+ private OpenRocketLoaderResult result;\r
+ \r
+ private Set<ThrustCurveMotorPlaceholder> missingMotors;\r
+ private OpenRocketLoaderTask task;\r
private ProgressDialog progress;\r
+ private DialogFragment missingMotorDialog;\r
+ private TCMissingMotorDownloadAction missingMotorDownloadAction;\r
\r
@Override\r
protected void onCreate(Bundle savedInstanceState) {\r
super.onCreate(savedInstanceState);\r
setContentView(R.layout.main);\r
- Intent i = getIntent();\r
- Uri file = i.getData();\r
- loadOrkFile(file);\r
+ missingMotorDownloadAction = new TCMissingMotorDownloadAction(this);\r
+ if ( savedInstanceState == null || savedInstanceState.getBoolean("isLoading", false) == false ) {\r
+ Intent i = getIntent();\r
+ Uri file = i.getData();\r
+ loadOrkFile(file);\r
+ } else {\r
+ progress = ProgressDialog.show(this, "Loading file", "");\r
+ }\r
+ }\r
+\r
+ @Override\r
+ protected void onSaveInstanceState(Bundle outState) {\r
+ super.onSaveInstanceState(outState);\r
+ outState.putBoolean("isLoading", true);\r
}\r
\r
@Override\r
}\r
progress = null;\r
}\r
+ if ( missingMotorDownloadAction != null ) {\r
+ missingMotorDownloadAction.dismiss();\r
+ }\r
+\r
super.onDestroy();\r
}\r
\r
File orkFile = new File(path);\r
progress = ProgressDialog.show(this, "Loading file", "");\r
\r
- final OpenRocketLoaderTask task = new OpenRocketLoaderTask() {\r
-\r
- /* (non-Javadoc)\r
- * @see android.os.AsyncTask#onPostExecute(java.lang.Object)\r
- */\r
- @Override\r
- protected void onPostExecute(OpenRocketLoaderResult result) {\r
- super.onPostExecute(result);\r
- AndroidLogWrapper.d(OpenRocketLoaderActivity.class,"Finished loading " + OpenRocketLoaderActivity.this);\r
- finishedLoading(result);\r
- }\r
-\r
- };\r
+ task = new OpenRocketLoaderTask(this);\r
\r
task.execute(orkFile);\r
\r
}\r
- \r
- private void finishedLoading(OpenRocketLoaderResult result) {\r
- if ( progress.isShowing() ) {\r
+\r
+ /**\r
+ * Called by the OpenRocketLoaderTask when it completes.\r
+ * is default visibility so it can be called from this package.\r
+ * \r
+ * @param result\r
+ */\r
+ void finishedLoading(OpenRocketLoaderResult result) {\r
+ if ( progress != null && progress.isShowing() ) {\r
progress.dismiss();\r
}\r
+ this.result = result;\r
+ ((Application)OpenRocketLoaderActivity.this.getApplication()).setRocketDocument( result.rocket );\r
+\r
+ updateMissingMotors();\r
+\r
+ }\r
+\r
+ private void updateMissingMotors() {\r
+ missingMotors = MissingMotorHelpers.findMissingMotors(result.rocket.getRocket());\r
+\r
+ if ( missingMotors.size() > 0 ) {\r
+ missingMotorDialog = MissingMotorDialogFragment.newInstance( missingMotors );\r
+ missingMotorDialog.show(getSupportFragmentManager(), "missing motors");\r
+ return;\r
+ }\r
+\r
+ displayWarningDialog();\r
+ }\r
+\r
+ /**\r
+ * Called when the TCMissingMotorDownload process finishes.\r
+ */\r
+ @Override\r
+ public void onComplete() {\r
+\r
+ // Need to update the motor references.\r
+ MissingMotorHelpers.updateMissingMotors(result.rocket.getRocket(), result.warnings);\r
+\r
+ displayWarningDialog();\r
+ }\r
\r
+ private void displayWarningDialog() {\r
WarningSet warnings = result.warnings;\r
if (warnings == null || warnings.isEmpty()) {\r
- ((Application)OpenRocketLoaderActivity.this.getApplication()).setRocketDocument( result.rocket );\r
- Intent i = new Intent(this,OpenRocketViewer.class);\r
- startActivity(i);\r
- finish();\r
} else {\r
// TODO - Build a warning listing dialog\r
DialogFragment newFragment = WarningDialogFragment.newInstance();\r
newFragment.show(getSupportFragmentManager(), "dialog");\r
+ return;\r
}\r
+\r
+ moveOnToViewer();\r
+ }\r
+\r
+ public void doFixMissingMotors() {\r
+\r
+ missingMotorDialog.dismiss();\r
+\r
+ missingMotorDownloadAction.setMissingMotors(missingMotors);\r
+ missingMotorDownloadAction.start();\r
+\r
+ }\r
+\r
+ public void doNotFixMissingMotors() {\r
+ missingMotorDialog.dismiss();\r
+ displayWarningDialog();\r
}\r
\r
- public void doPositiveClick() {\r
- // Do stuff here.\r
- AndroidLogWrapper.i(OpenRocketLoaderActivity.class, "Positive click!");\r
- finish();\r
- }\r
-\r
- public void doNegativeClick() {\r
- // Do stuff here.\r
- AndroidLogWrapper.i(OpenRocketLoaderActivity.class, "Negative click!");\r
- finish();\r
- }\r
-\r
- public static class WarningDialogFragment extends DialogFragment {\r
-\r
- public static WarningDialogFragment newInstance() {\r
- WarningDialogFragment frag = new WarningDialogFragment();\r
- Bundle args = new Bundle();\r
- frag.setArguments(args);\r
- return frag;\r
- }\r
-\r
- @Override\r
- public Dialog onCreateDialog(Bundle savedInstanceState) {\r
-\r
- return new AlertDialog.Builder(getActivity())\r
-// .setIcon(android.R.drawable.alert_dialog_icon)\r
- .setTitle("Warnings")\r
- .setPositiveButton("OK",\r
- new DialogInterface.OnClickListener() {\r
- public void onClick(DialogInterface dialog, int whichButton) {\r
- ((OpenRocketLoaderActivity)getActivity()).doPositiveClick();\r
- }\r
- }\r
- )\r
- .setNegativeButton("Cancel",\r
- new DialogInterface.OnClickListener() {\r
- public void onClick(DialogInterface dialog, int whichButton) {\r
- ((OpenRocketLoaderActivity)getActivity()).doNegativeClick();\r
- }\r
- }\r
- )\r
- .create();\r
- }\r
+ private void moveOnToViewer() {\r
+ Intent i = new Intent(this,OpenRocketViewer.class);\r
+ startActivity(i);\r
+ finish();\r
}\r
}\r
\r
import net.sf.openrocket.android.util.AndroidLogWrapper;\r
import net.sf.openrocket.document.OpenRocketDocument;\r
-import net.sf.openrocket.file.DatabaseMotorFinder;\r
+import net.sf.openrocket.file.DatabaseMotorFinderWithMissingMotors;\r
import net.sf.openrocket.file.RocketLoadException;\r
import net.sf.openrocket.file.openrocket.importt.OpenRocketLoader;\r
+import android.app.Activity;\r
import android.os.AsyncTask;\r
\r
public class OpenRocketLoaderTask extends AsyncTask<File, Void, OpenRocketLoaderResult> {\r
\r
+ private OpenRocketLoaderActivity parent;\r
+ \r
+ public OpenRocketLoaderTask( OpenRocketLoaderActivity parent ) {\r
+ this.parent = parent;\r
+ }\r
+ \r
/* (non-Javadoc)\r
* @see android.os.AsyncTask#doInBackground(Params[])\r
*/\r
OpenRocketLoader rocketLoader = new OpenRocketLoader();\r
try {\r
OpenRocketLoaderResult result = new OpenRocketLoaderResult();\r
- OpenRocketDocument rocket = rocketLoader.load(arg0[0], new DatabaseMotorFinder());\r
+ OpenRocketDocument rocket = rocketLoader.load(arg0[0], new DatabaseMotorFinderWithMissingMotors());\r
result.rocket = rocket;\r
result.warnings = result.warnings;\r
return result;\r
return null;\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
+ parent.finishedLoading(result);\r
+ }\r
+\r
}\r
--- /dev/null
+package net.sf.openrocket.android.rocket;\r
+\r
+import android.app.AlertDialog;\r
+import android.app.Dialog;\r
+import android.content.DialogInterface;\r
+import android.os.Bundle;\r
+import android.support.v4.app.DialogFragment;\r
+\r
+public class WarningDialogFragment extends DialogFragment {\r
+\r
+ public static WarningDialogFragment newInstance() {\r
+ WarningDialogFragment frag = new WarningDialogFragment();\r
+ Bundle args = new Bundle();\r
+ frag.setArguments(args);\r
+ return frag;\r
+ }\r
+\r
+ @Override\r
+ public Dialog onCreateDialog(Bundle savedInstanceState) {\r
+\r
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());\r
+ // .setIcon(android.R.drawable.alert_dialog_icon)\r
+ builder.setTitle("Warnings");\r
+ builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {\r
+ public void onClick(DialogInterface dialog, int whichButton) {\r
+ getActivity().finish();\r
+ }\r
+ });\r
+ builder.setOnCancelListener(new DialogInterface.OnCancelListener() {\r
+ public void onCancel(DialogInterface dialog) {\r
+ getActivity().finish();\r
+ }\r
+ });\r
+ return builder.create();\r
+ }\r
+}\r