android:layout_width="wrap_content"\r
android:layout_height="match_parent"\r
android:orientation="vertical" >\r
-\r\r
+\r
<TextView\r
android:layout_width="match_parent"\r
android:layout_height="wrap_content"\r
android:layout_weight="1"\r
android:gravity="center_horizontal"\r
android:text="Welcome to OpenRocket" />\r
-\r\r\r\r\r
+\r
<LinearLayout\r
android:layout_width="match_parent"\r
android:layout_height="wrap_content"\r
android:layout_gravity="bottom"\r
android:orientation="horizontal" >\r
-\r\r
- <Button\r
- android:layout_width="wrap_content"\r
- android:layout_height="wrap_content"\r
- android:layout_gravity="center_vertical"\r
- android:onClick="pickOrkFiles"\r
- android:text="View ork file" />\r
-\r\r\r\r\r\r\r\r
- <Button\r
- android:layout_width="wrap_content"\r
- android:layout_height="wrap_content"\r
- android:layout_gravity="center_vertical"\r
- android:onClick="browseMotors"\r
- android:text="View motors" />\r
\r
+ <Button\r
+ android:layout_width="wrap_content"\r
+ android:layout_height="wrap_content"\r
+ android:id="@+id/main_open"\r
+ android:text="View ork file" />\r
+\r
+ <Button\r
+ android:layout_width="wrap_content"\r
+ android:layout_height="wrap_content"\r
+ android:id="@+id/main_browse"\r
+ android:text="View motors" />\r
</LinearLayout>\r
</LinearLayout>\r
\r
<Button\r
android:layout_width="wrap_content"\r
android:layout_height="wrap_content"\r
- android:onClick="pickOrkFiles"\r
+ android:id="@+id/main_open"\r
android:text="View ork file" />\r
\r
<Button\r
android:layout_width="wrap_content"\r
android:layout_height="wrap_content"\r
- android:onClick="browseMotors"\r
+ android:id="@+id/main_browse"\r
android:text="View motors" />\r
</LinearLayout>\r
\r
\r
import java.util.Locale;\r
\r
+import net.sf.openrocket.aerodynamics.WarningSet;\r
import net.sf.openrocket.android.util.AndroidLogWrapper;\r
import net.sf.openrocket.document.OpenRocketDocument;\r
import net.sf.openrocket.l10n.DebugTranslator;\r
public class Application extends android.app.Application {\r
\r
private OpenRocketDocument rocketDocument;\r
+ private WarningSet warnings;\r
\r
// Big B boolean so I can synchronize on it.\r
private static Boolean initialized = false;\r
public void setRocketDocument(OpenRocketDocument rocketDocument) {\r
this.rocketDocument = rocketDocument;\r
}\r
+\r
+ public WarningSet getWarnings() {\r
+ return warnings;\r
+ }\r
+\r
+ public void setWarnings(WarningSet warnings) {\r
+ this.warnings = warnings;\r
+ }\r
\r
\r
\r
import android.view.MenuInflater;\r
import android.view.MenuItem;\r
import android.view.View;\r
+import android.widget.Button;\r
\r
public class Main extends FragmentActivity {\r
\r
public void onCreate(Bundle icicle) {\r
super.onCreate(icicle);\r
setContentView(R.layout.main);\r
+ ((Button) findViewById(R.id.main_open)).setOnClickListener(\r
+ new View.OnClickListener() {\r
+ @Override\r
+ public void onClick(View v) {\r
+ Main.this.pickOrkFiles();\r
+ }\r
+ });\r
+ ((Button) findViewById(R.id.main_browse)).setOnClickListener(\r
+ new View.OnClickListener() {\r
+ @Override\r
+ public void onClick(View v) {\r
+ ActivityHelpers.browseMotors(Main.this);\r
+ }\r
+ });\r
}\r
\r
@Override\r
import android.support.v4.app.DialogFragment;\r
\r
public class MissingMotorDialogFragment extends DialogFragment {\r
-\r
- Set<ThrustCurveMotorPlaceholder> missingMotors;\r
+ \r
+ private final static String MESSAGE_ARG_KEY = "message";\r
\r
public static MissingMotorDialogFragment newInstance( Set<ThrustCurveMotorPlaceholder> missingMotors ) {\r
MissingMotorDialogFragment frag = new MissingMotorDialogFragment();\r
- frag.missingMotors = missingMotors;\r
+ Bundle b = new Bundle();\r
+ b.putString(MESSAGE_ARG_KEY, buildMessage(missingMotors));\r
+ frag.setArguments(b);\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
+ private static String buildMessage( Set<ThrustCurveMotorPlaceholder> missingMotors ) {\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
+ return sb.toString();\r
+ }\r
+ \r
+ @Override\r
+ public void onCreate(Bundle savedInstanceState) {\r
+ super.onCreate(savedInstanceState);\r
+ setRetainInstance(true);\r
+ setCancelable(false);\r
+ }\r
+\r
+\r
+ @Override\r
+ public Dialog onCreateDialog(Bundle savedInstanceState) {\r
+\r
+ String message = getArguments().getString(MESSAGE_ARG_KEY);\r
+ \r
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());\r
+ // .setIcon(android.R.drawable.alert_dialog_icon)\r
+ builder.setTitle("Missing Motors");\r
+ builder.setMessage(message);\r
builder.setPositiveButton("OK",\r
new DialogInterface.OnClickListener() {\r
public void onClick(DialogInterface dialog, int whichButton) {\r
);\r
return builder.create();\r
}\r
+\r
+ /**\r
+ * Work around for dialog getting dismissed on orientation change. See code.google.com/p/android/issues/detail?id=17423\r
+ */\r
+ @Override\r
+ public void onDestroyView() {\r
+ if ( getDialog() != null && getRetainInstance() ) {\r
+ getDialog().setDismissMessage(null);\r
+ }\r
+ super.onDestroyView();\r
+ }\r
+ \r
+ \r
}\r
\r
import net.sf.openrocket.android.thrustcurve.TCQueryAction;\r
import net.sf.openrocket.android.util.AndroidLogWrapper;\r
import net.sf.openrocket.motor.ThrustCurveMotorPlaceholder;\r
-import android.app.ProgressDialog;\r
+import net.sf.openrocket.rocketcomponent.Rocket;\r
import android.content.Intent;\r
import android.net.Uri;\r
import android.os.Bundle;\r
import android.support.v4.app.FragmentActivity;\r
\r
public class OpenRocketLoaderActivity extends FragmentActivity\r
-implements TCQueryAction.OnComplete\r
+implements TCQueryAction.OnComplete, OpenRocketLoaderFragment.OnOpenRocketFileLoaded\r
{\r
\r
- private OpenRocketLoaderResult result;\r
+ private final static String MISSING_MOTOR_DIAG_FRAGMENT_TAG = "missingmotordialog";\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
Uri file = i.getData();\r
loadOrkFile(file);\r
} else {\r
- progress = ProgressDialog.show(this, "Loading file", "");\r
}\r
}\r
\r
\r
@Override\r
protected void onDestroy() {\r
- if ( progress != null ) {\r
- if ( progress.isShowing() ) {\r
- progress.dismiss();\r
- }\r
- progress = null;\r
- }\r
if ( missingMotorDownloadAction != null ) {\r
missingMotorDownloadAction.dismiss();\r
}\r
AndroidLogWrapper.d(OpenRocketLoaderActivity.class,"Use ork file: " + file);\r
String path = file.getPath();\r
File orkFile = new File(path);\r
- progress = ProgressDialog.show(this, "Loading file", "");\r
-\r
- task = new OpenRocketLoaderTask(this);\r
-\r
- task.execute(orkFile);\r
-\r
+ \r
+ getSupportFragmentManager().beginTransaction().add( OpenRocketLoaderFragment.newInstance(orkFile), "loader").commit();\r
+ \r
}\r
\r
/**\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
+ public void onOpenRocketFileLoaded(OpenRocketLoaderResult result) {\r
((Application)OpenRocketLoaderActivity.this.getApplication()).setRocketDocument( result.rocket );\r
-\r
+ ((Application)OpenRocketLoaderActivity.this.getApplication()).setWarnings( result.warnings );\r
+ \r
updateMissingMotors();\r
\r
}\r
\r
private void updateMissingMotors() {\r
- missingMotors = MissingMotorHelpers.findMissingMotors(result.rocket.getRocket());\r
+ Rocket rocket = ((Application)OpenRocketLoaderActivity.this.getApplication()).getRocketDocument().getRocket();\r
+ Set<ThrustCurveMotorPlaceholder> missingMotors = MissingMotorHelpers.findMissingMotors(rocket);\r
\r
if ( missingMotors.size() > 0 ) {\r
- missingMotorDialog = MissingMotorDialogFragment.newInstance( missingMotors );\r
- missingMotorDialog.show(getSupportFragmentManager(), "missing motors");\r
+ DialogFragment missingMotorDialog = MissingMotorDialogFragment.newInstance( missingMotors );\r
+ getSupportFragmentManager().beginTransaction().add(missingMotorDialog, MISSING_MOTOR_DIAG_FRAGMENT_TAG).commit();\r
return;\r
}\r
\r
@Override\r
public void onComplete() {\r
\r
+ Rocket rocket = ((Application)OpenRocketLoaderActivity.this.getApplication()).getRocketDocument().getRocket();\r
+ WarningSet warnings = ((Application)OpenRocketLoaderActivity.this.getApplication()).getWarnings();\r
// Need to update the motor references.\r
- MissingMotorHelpers.updateMissingMotors(result.rocket.getRocket(), result.warnings);\r
+ MissingMotorHelpers.updateMissingMotors(rocket, warnings);\r
\r
displayWarningDialog();\r
}\r
\r
private void displayWarningDialog() {\r
- WarningSet warnings = result.warnings;\r
+ WarningSet warnings = ((Application)OpenRocketLoaderActivity.this.getApplication()).getWarnings();\r
if (warnings == null || warnings.isEmpty()) {\r
} else {\r
// TODO - Build a warning listing dialog\r
}\r
\r
public void doFixMissingMotors() {\r
-\r
- missingMotorDialog.dismiss();\r
+ Rocket rocket = ((Application)OpenRocketLoaderActivity.this.getApplication()).getRocketDocument().getRocket();\r
+ Set<ThrustCurveMotorPlaceholder> missingMotors = MissingMotorHelpers.findMissingMotors(rocket);\r
\r
missingMotorDownloadAction.setMissingMotors(missingMotors);\r
missingMotorDownloadAction.start();\r
}\r
\r
public void doNotFixMissingMotors() {\r
- missingMotorDialog.dismiss();\r
displayWarningDialog();\r
}\r
\r
--- /dev/null
+package net.sf.openrocket.android.rocket;\r
+\r
+import java.io.File;\r
+\r
+import net.sf.openrocket.android.util.AndroidLogWrapper;\r
+import net.sf.openrocket.android.util.ProgressDialogFragment;\r
+import net.sf.openrocket.document.OpenRocketDocument;\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
+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 OpenRocketLoaderFragment extends Fragment {\r
+ \r
+ private final static String FILE_ARG_KEY = "file";\r
+ \r
+ private final static String LOADING_MESSAGE = "Loading file...";\r
+\r
+ public interface OnOpenRocketFileLoaded {\r
+ public void onOpenRocketFileLoaded( OpenRocketLoaderResult result );\r
+ }\r
+ \r
+ private File file;\r
+ private OpenRocketLoaderTask task;\r
+ private OnOpenRocketFileLoaded listener;\r
+ \r
+ public static OpenRocketLoaderFragment newInstance(File file) {\r
+ OpenRocketLoaderFragment frag = new OpenRocketLoaderFragment();\r
+ Bundle b = new Bundle();\r
+ b.putSerializable(FILE_ARG_KEY, file);\r
+ frag.setArguments(b);\r
+ return frag;\r
+ }\r
+ \r
+ @Override\r
+ public void onCreate(Bundle savedInstanceState) {\r
+ super.onCreate(savedInstanceState);\r
+ setRetainInstance(true);\r
+ Bundle b = getArguments();\r
+ file = (File) b.getSerializable(FILE_ARG_KEY);\r
+ if ( task == null ) {\r
+ // since we retain instance state, task will be non-null if it is already loading.\r
+ task = new OpenRocketLoaderTask();\r
+ task.execute(file);\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 OnOpenRocketFileLoaded ) {\r
+ listener = (OnOpenRocketFileLoaded) parent;\r
+ }\r
+ }\r
+\r
+ public class OpenRocketLoaderTask extends AsyncTask<File, Void, OpenRocketLoaderResult> {\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("", LOADING_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 OpenRocketLoaderResult doInBackground(File... arg0) {\r
+ AndroidLogWrapper.d(OpenRocketLoaderTask.class, "doInBackgroud");\r
+ \r
+ OpenRocketLoader rocketLoader = new OpenRocketLoader();\r
+ try {\r
+ OpenRocketLoaderResult result = new OpenRocketLoaderResult();\r
+ OpenRocketDocument rocket = rocketLoader.load(arg0[0], new DatabaseMotorFinderWithMissingMotors());\r
+ result.rocket = rocket;\r
+ result.warnings = rocketLoader.getWarnings();\r
+ return result;\r
+ } catch (RocketLoadException ex) {\r
+ AndroidLogWrapper.e(OpenRocketLoaderTask.class, "doInBackground rocketLaoder.load threw", ex);\r
+ }\r
+ return null;\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
+ Fragment progress = getActivity().getSupportFragmentManager().findFragmentByTag(PROGRESS_DIALOG_TAG);\r
+ if ( progress != null ) {\r
+ ((DialogFragment)progress).dismiss();\r
+ }\r
+ if ( listener != null ) {\r
+ listener.onOpenRocketFileLoaded(result);\r
+ }\r
+ }\r
+\r
+ }\r
+\r
+}\r
+++ /dev/null
-package net.sf.openrocket.android.rocket;\r
-\r
-import java.io.File;\r
-\r
-import net.sf.openrocket.android.util.AndroidLogWrapper;\r
-import net.sf.openrocket.document.OpenRocketDocument;\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
- @Override\r
- protected OpenRocketLoaderResult doInBackground(File... arg0) {\r
- AndroidLogWrapper.d(OpenRocketLoaderTask.class, "doInBackgroud");\r
- \r
- OpenRocketLoader rocketLoader = new OpenRocketLoader();\r
- try {\r
- OpenRocketLoaderResult result = new OpenRocketLoaderResult();\r
- OpenRocketDocument rocket = rocketLoader.load(arg0[0], new DatabaseMotorFinderWithMissingMotors());\r
- result.rocket = rocket;\r
- result.warnings = result.warnings;\r
- return result;\r
- } catch (RocketLoadException ex) {\r
- AndroidLogWrapper.e(OpenRocketLoaderTask.class, "doInBackground rocketLaoder.load threw", ex);\r
- }\r
- return null;\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