Rework the loading workflow to be more natural and fix some nasty bugs. Make the dialogs more localizable by extracting strings into resources.

This commit is contained in:
Kevin Ruland 2012-08-22 02:43:18 +00:00
parent da430d3611
commit 6a6f926e45
8 changed files with 135 additions and 67 deletions

View File

@ -3,6 +3,9 @@
<string name="app_name">OpenRocket</string>
<string name="version">version 12.07-b7</string>
<string name="cancel">Cancel</string>
<string name="ok">OK</string>
<string name="dismiss">Dismiss</string>
<string name="load">Load</string>
<string name="save">Save</string>
<string name="Add">Add</string>
@ -10,6 +13,9 @@
<string name="Download">Download</string>
<string name="About">About</string>
<string name="Preferences">Preferences</string>
<string name="missingMotors">Missing Motors</string>
<string name="missingMotorsMessageStart">The following motors are missing:</string>
<string name="missingMotorsMessageEnd">Would you like to download them from Thrustcurve?</string>
<string name="configurePlot">Change Plot</string>
<string name="view_events">View Events</string>
<string name="simulationPlotDialogTitle">Select Series And Events</string>

View File

@ -11,7 +11,6 @@ public abstract class ActivityHelpers {
public static void goHome( Activity parent ) {
Intent i = new Intent(parent, Main.class);
i.putExtra(Main.restartFlag, true);
i.addFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP + Intent.FLAG_ACTIVITY_NEW_TASK );
parent.startActivity(i);
}

View File

@ -2,7 +2,6 @@ package net.sf.openrocket.android;
import net.sf.openrocket.R;
import net.sf.openrocket.android.rocket.OpenRocketLoaderActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
@ -13,17 +12,10 @@ import com.actionbarsherlock.view.MenuItem;
public class Main extends OpenRocketLoaderActivity {
public final static String restartFlag = "restart";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
Intent i = getIntent();
// Rocket already loaded. go to viewer unless we want to restart.
if ( ( i.getBooleanExtra(restartFlag, false) == false) && CurrentRocketHolder.getCurrentRocket().getRocketDocument() != null ) {
moveOnToViewer();
}
setContentView(R.layout.main);
((Button) findViewById(R.id.main_open)).setOnClickListener(
new View.OnClickListener() {
@ -48,6 +40,15 @@ public class Main extends OpenRocketLoaderActivity {
});
}
@Override
protected void onPostResume() {
super.onPostResume();
// Rocket already loaded.
if ( !isLoading() && CurrentRocketHolder.getCurrentRocket().getRocketDocument() != null ) {
moveOnToViewer();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getSupportMenuInflater();

View File

@ -0,0 +1,59 @@
package net.sf.openrocket.android.rocket;
import net.sf.openrocket.R;
import net.sf.openrocket.android.util.AndroidLogWrapper;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import com.actionbarsherlock.app.SherlockDialogFragment;
public class ErrorLoadingFileDialogFragment extends SherlockDialogFragment {
public static ErrorLoadingFileDialogFragment newInstance( int titleRes, String message ) {
ErrorLoadingFileDialogFragment dialog = new ErrorLoadingFileDialogFragment();
Bundle b = new Bundle();
b.putString("message", message);
b.putInt("titleRes", titleRes);
dialog.setArguments(b);
dialog.setCancelable(true);
return dialog;
}
@Override
public void onCancel(DialogInterface dialog) {
((OpenRocketLoaderActivity)getActivity()).doDismissErrorDialog();
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AndroidLogWrapper.d(ErrorLoadingFileDialogFragment.class,"onCreateDialog");
String message = getArguments().getString("message");
final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
if ( getArguments().containsKey("titleRes") ) {
int titleRes = getArguments().getInt("titleRes");
builder.setTitle(titleRes);
}
builder.setMessage(message);
builder.setNeutralButton(R.string.dismiss, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
((OpenRocketLoaderActivity)getActivity()).doDismissErrorDialog();
}
});
final AlertDialog dialog = builder.create();
dialog.setOwnerActivity(getActivity());
return dialog;
}
}

View File

@ -2,6 +2,8 @@ package net.sf.openrocket.android.rocket;
import java.util.Set;
import net.sf.openrocket.R;
import net.sf.openrocket.android.util.AndroidLogWrapper;
import net.sf.openrocket.motor.ThrustCurveMotorPlaceholder;
import android.app.AlertDialog;
import android.app.Dialog;
@ -11,72 +13,68 @@ import android.os.Bundle;
import com.actionbarsherlock.app.SherlockDialogFragment;
public class MissingMotorDialogFragment extends SherlockDialogFragment {
private final static String MESSAGE_ARG_KEY = "message";
private final static String MESSAGES_ARG_KEY = "messages";
public static MissingMotorDialogFragment newInstance( Set<ThrustCurveMotorPlaceholder> missingMotors ) {
MissingMotorDialogFragment frag = new MissingMotorDialogFragment();
Bundle b = new Bundle();
b.putString(MESSAGE_ARG_KEY, buildMessage(missingMotors));
String[] messages = new String[ missingMotors.size() ];
int index = 0;
for( ThrustCurveMotorPlaceholder m : missingMotors ) {
messages[index++] = m.getManufacturer() + " " + m.getDesignation();
}
b.putStringArray(MESSAGES_ARG_KEY, messages);
frag.setArguments(b);
frag.setCancelable(false);
return frag;
}
private static String buildMessage( Set<ThrustCurveMotorPlaceholder> missingMotors ) {
private String buildMessage( String[] missingMotors ) {
StringBuilder sb = new StringBuilder();
sb.append("The following motors are missing:");
for( ThrustCurveMotorPlaceholder m : missingMotors ) {
sb.append("\n").append(m.getManufacturer()).append(" ").append(m.getDesignation());
sb.append(this.getString(R.string.missingMotorsMessageStart));
for( String m : missingMotors ) {
sb.append("\n").append(m);
}
sb.append("\nWould you like to download them from Thrustcurve?");
sb.append("\n").append(this.getString(R.string.missingMotorsMessageEnd));
return sb.toString();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
setCancelable(false);
}
@Override
public void onCancel(DialogInterface dialog) {
((OpenRocketLoaderActivity)getActivity()).doNotFixMissingMotors();
super.onCancel(dialog);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
String message = getArguments().getString(MESSAGE_ARG_KEY);
AndroidLogWrapper.d(MissingMotorDialogFragment.class,"onCreateDialog");
String[] messages = getArguments().getStringArray(MESSAGES_ARG_KEY);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
// .setIcon(android.R.drawable.alert_dialog_icon)
builder.setTitle("Missing Motors");
builder.setMessage(message);
builder.setPositiveButton("OK",
builder.setTitle(R.string.missingMotors);
builder.setMessage(buildMessage(messages));
builder.setPositiveButton(R.string.yes,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
((OpenRocketLoaderActivity)getActivity()).doFixMissingMotors();
}
}
);
builder.setNegativeButton("Cancel",
});
builder.setNegativeButton(R.string.no,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
((OpenRocketLoaderActivity)getActivity()).doNotFixMissingMotors();
}
}
);
return builder.create();
});
AlertDialog dialog = builder.create();
dialog.setOwnerActivity(getActivity());
return dialog;
}
/**
* Work around for dialog getting dismissed on orientation change. See code.google.com/p/android/issues/detail?id=17423
*/
@Override
public void onDestroyView() {
if ( getDialog() != null && getRetainInstance() ) {
getDialog().setDismissMessage(null);
}
super.onDestroyView();
}
}

View File

@ -12,8 +12,6 @@ import net.sf.openrocket.android.thrustcurve.TCQueryAction;
import net.sf.openrocket.android.util.AndroidLogWrapper;
import net.sf.openrocket.motor.ThrustCurveMotorPlaceholder;
import net.sf.openrocket.rocketcomponent.Rocket;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.content.SharedPreferences;
@ -42,6 +40,12 @@ implements TCQueryAction.OnTCQueryCompleteListener, OpenRocketLoaderFragment.OnO
* Set to the Uri of the file we are supposed to load. Is saved in InstanceState.
*/
private Uri fileToLoad = null;
protected boolean isLoading() {
AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "isLoading " + this.hashCode());
AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "isLoading = " + isLoading);
return isLoading;
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
@ -57,7 +61,8 @@ implements TCQueryAction.OnTCQueryCompleteListener, OpenRocketLoaderFragment.OnO
@Override
protected void onSaveInstanceState(Bundle outState) {
AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "onSaveInstanceState");
AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "onSaveInstanceState " + this.hashCode());
AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "isLoading = " + isLoading);
outState.putBoolean("isLoading", isLoading);
if ( fileToLoad != null ) {
outState.putParcelable("fileToLoad", fileToLoad);
@ -69,6 +74,7 @@ implements TCQueryAction.OnTCQueryCompleteListener, OpenRocketLoaderFragment.OnO
protected void onRestoreInstanceState(Bundle savedInstanceState) {
AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "onRestoreInstanceState");
isLoading = savedInstanceState.getBoolean("isLoading",false);
AndroidLogWrapper.d(OpenRocketLoaderActivity.class, "isLoading = " + isLoading);
if ( savedInstanceState.containsKey("fileToLoad") ) {
fileToLoad = savedInstanceState.getParcelable("fileToLoad");
}
@ -164,16 +170,10 @@ implements TCQueryAction.OnTCQueryCompleteListener, OpenRocketLoaderFragment.OnO
* @param result
*/
public void onOpenRocketFileLoaded(OpenRocketLoaderResult result) {
isLoading = false;
if ( result.loadingError != null ) {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
dialogBuilder.setTitle( R.string.loadingErrorMessage );
dialogBuilder.setMessage( result.loadingError.getLocalizedMessage());
dialogBuilder.setCancelable(true);
Dialog d = dialogBuilder.create();
d.setCanceledOnTouchOutside(true);
d.show();
ErrorLoadingFileDialogFragment errorDialog = ErrorLoadingFileDialogFragment.newInstance(R.string.loadingErrorMessage, result.loadingError.getLocalizedMessage());
errorDialog.show(getSupportFragmentManager(),"errorDialog");
} else {
CurrentRocketHolder.getCurrentRocket().setRocketDocument( result.rocket );
@ -188,8 +188,8 @@ implements TCQueryAction.OnTCQueryCompleteListener, OpenRocketLoaderFragment.OnO
Set<ThrustCurveMotorPlaceholder> missingMotors = MissingMotorHelpers.findMissingMotors(rocket);
if ( missingMotors.size() > 0 ) {
DialogFragment missingMotorDialog = MissingMotorDialogFragment.newInstance( missingMotors );
getSupportFragmentManager().beginTransaction().add(missingMotorDialog, MISSING_MOTOR_DIAG_FRAGMENT_TAG).commit();
MissingMotorDialogFragment missingMotorDialog = MissingMotorDialogFragment.newInstance( missingMotors );
missingMotorDialog.show(getSupportFragmentManager(), MISSING_MOTOR_DIAG_FRAGMENT_TAG);
return;
}
@ -235,7 +235,13 @@ implements TCQueryAction.OnTCQueryCompleteListener, OpenRocketLoaderFragment.OnO
displayWarningDialog();
}
public void doDismissErrorDialog() {
isLoading = false;
fileToLoad = null;
}
public void moveOnToViewer() {
isLoading = false;
Intent i = new Intent(this,OpenRocketViewer.class);
startActivity(i);
finish();

View File

@ -18,7 +18,9 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class OpenRocketLoaderFragment extends Fragment {
import com.actionbarsherlock.app.SherlockFragment;
public class OpenRocketLoaderFragment extends SherlockFragment {
private final static String FILE_ARG_KEY = "file";

View File

@ -15,6 +15,7 @@ public class WarningDialogFragment extends DialogFragment {
WarningDialogFragment frag = new WarningDialogFragment();
Bundle args = new Bundle();
frag.setArguments(args);
frag.setCancelable(false);
return frag;
}
@ -35,11 +36,7 @@ public class WarningDialogFragment extends DialogFragment {
((OpenRocketLoaderActivity)getActivity()).moveOnToViewer();
}
});
builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
public void onCancel(DialogInterface dialog) {
((OpenRocketLoaderActivity)getActivity()).moveOnToViewer();
}
});
return builder.create();
Dialog dialog = builder.create();
return dialog;
}
}