X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=android%2Fsrc%2Fnet%2Fsf%2Fopenrocket%2Fandroid%2Frocket%2FOpenRocketViewer.java;h=635d5264349e02e4f0b3190fa94820bdd448d30b;hb=refs%2Fheads%2Fupstream;hp=2ab9b63e2e9445107ae9030abfa06d0c1839f1d4;hpb=f844d4a1ea0b48efc942ea08f5847ab1ef52fd8b;p=debian%2Fopenrocket diff --git a/android/src/net/sf/openrocket/android/rocket/OpenRocketViewer.java b/android/src/net/sf/openrocket/android/rocket/OpenRocketViewer.java index 2ab9b63e..635d5264 100644 --- a/android/src/net/sf/openrocket/android/rocket/OpenRocketViewer.java +++ b/android/src/net/sf/openrocket/android/rocket/OpenRocketViewer.java @@ -1,32 +1,39 @@ package net.sf.openrocket.android.rocket; -import java.io.IOException; - 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; +import net.sf.openrocket.android.simulation.Simulations; import net.sf.openrocket.android.util.AndroidLogWrapper; +import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.document.Simulation; import android.app.AlertDialog; +import android.content.DialogInterface; import android.content.Intent; +import android.content.SharedPreferences; +import android.content.res.Resources; import android.os.Bundle; +import android.preference.PreferenceManager; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.ViewPager; import android.view.View; +import android.widget.Toast; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; +import com.actionbarsherlock.view.Window; public class OpenRocketViewer extends OpenRocketLoaderActivity -implements Simulations.OnSimulationSelectedListener +implements Simulations.OnSimulationSelectedListener, OpenRocketSaverFragment.OnOpenRocketFileSaved, SharedPreferences.OnSharedPreferenceChangeListener { private final static int OVERVIEW_POS = 0; @@ -37,31 +44,83 @@ implements Simulations.OnSimulationSelectedListener private OpenRocketViewerPagerAdapter viewPagerAdapter; + private final static String LOAD_AFTER_SAVE = "net.sf.openrocket.android.loadAfterSave"; + private boolean loadAfterSave = false; + private String autoSaveEnabledKey; + private boolean autoSaveEnabled = false; + + private RocketChangedEventHandler handler = new RocketChangedEventHandler(); + + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setTitle(CurrentRocketHolder.getCurrentRocket().getRocketDocument().getRocket().getName()); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); + // If the application sleeps for a long time, the CurrentRocketHolder might get cleaned + // up. When this happens, we cannot restore this state, so instead we just + // go home. + OpenRocketDocument rocDoc = CurrentRocketHolder.getCurrentRocket().getRocketDocument(); + if ( rocDoc == null ) { + AndroidLogWrapper.d(OpenRocketViewer.class, "No document - go home"); + ActivityHelpers.goHome(this); + finish(); + return; + } + if (savedInstanceState != null ) { + loadAfterSave = savedInstanceState.getBoolean(LOAD_AFTER_SAVE); + } + // Must use com.actionbarsherlock.view.Window.FEATURE_INDETERMINATE_PROGRESS + requestWindowFeature(Window.FEATURE_PROGRESS); + setSupportProgressBarIndeterminate(true); + + setTitle(rocDoc.getRocket().getName()); + getSupportActionBar().setHomeButtonEnabled(true); setContentView(R.layout.openrocketviewer); ViewPager viewPager = (ViewPager)findViewById(R.id.pager); viewPagerAdapter = new OpenRocketViewerPagerAdapter( this.getSupportFragmentManager() ); viewPager.setAdapter( viewPagerAdapter ); - - CurrentRocketHolder.getCurrentRocket().setHandler( new RocketChangedEventHandler( ) ); } @Override protected void onPause() { - CurrentRocketHolder.getCurrentRocket().setHandler(null); + handler.unregister(this); + SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); + pref.unregisterOnSharedPreferenceChangeListener(this); super.onPause(); } + @Override + protected void onResume() { + Resources resources = this.getResources(); + autoSaveEnabledKey = resources.getString(R.string.PreferenceAutoSaveOption); + SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); + autoSaveEnabled = pref.getBoolean(autoSaveEnabledKey, false); + + pref.registerOnSharedPreferenceChangeListener(this); + + handler.register(this); + super.onResume(); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putBoolean(LOAD_AFTER_SAVE, loadAfterSave); + } + @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getSupportMenuInflater(); inflater.inflate(R.menu.rocket_viewer_option_menu, menu); + MenuItem saveAction = menu.findItem(R.id.menu_save); + if ( CurrentRocketHolder.getCurrentRocket().canSave() ) { + saveAction.setVisible(true); + saveAction.setShowAsAction( MenuItem.SHOW_AS_ACTION_ALWAYS ); + } else { + saveAction.setVisible(false); + saveAction.setShowAsAction( MenuItem.SHOW_AS_ACTION_NEVER ); + } return true; } @@ -70,16 +129,29 @@ implements Simulations.OnSimulationSelectedListener AndroidLogWrapper.d(OpenRocketViewer.class,"onMenuItemSelected" + item.getItemId()); switch(item.getItemId()) { case R.id.menu_load: - // FIXME - Might want to prompt for save here. - pickOrkFiles(); + if ( CurrentRocketHolder.getCurrentRocket().isModified() ) { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setMessage(R.string.loadWarnUnsaved); + builder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + pickOrkFiles(); + } + }); + builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + OpenRocketViewer.this.loadAfterSave = true; + OpenRocketViewer.this.saveRocketDocument(); + } + }); + builder.create().show(); + } else { + pickOrkFiles(); + } return true; case R.id.menu_save: - // FIXME - Probably want to open a dialog here. - try { - CurrentRocketHolder.getCurrentRocket().saveOpenRocketDocument(); - } catch ( IOException iex ) { - AndroidLogWrapper.d(OpenRocketViewer.class, iex.getMessage()); - } + OpenRocketViewer.this.saveRocketDocument(); return true; case android.R.id.home: ActivityHelpers.goHome(this); @@ -97,16 +169,20 @@ implements Simulations.OnSimulationSelectedListener return super.onMenuItemSelected(featureId, item); } + @Override + public void onSharedPreferenceChanged(SharedPreferences arg0, String arg1) { + if ( autoSaveEnabledKey.equals(arg1) ) { + autoSaveEnabled = arg0.getBoolean(autoSaveEnabledKey, false); + } + } + @Override public void onSimulationSelected(int simulationId) { Simulation sim = CurrentRocketHolder.getCurrentRocket().getRocketDocument().getSimulation(simulationId); // Check if there is data for this simulation. if ( sim.getSimulatedData() == null || sim.getSimulatedData().getBranchCount() == 0 ) { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setMessage("The selected simulation does not have saved data."); - builder.setCancelable(true); - builder.show(); + // This shouldn't happen because the Simulations list does the check. return; } @@ -132,11 +208,35 @@ implements Simulations.OnSimulationSelectedListener } } - private class RocketChangedEventHandler extends net.sf.openrocket.android.RocketChangedEventHandler { + private void saveRocketDocument() { + getSupportFragmentManager().beginTransaction() + .add( OpenRocketSaverFragment.newInstance(true), "saver") + .commitAllowingStateLoss(); + } + + @Override + public void onOpenRocketFileSaved(Boolean result) { + invalidateOptionsMenu(); + if ( loadAfterSave ) { + loadAfterSave = false; + pickOrkFiles(); + } + } + + private class RocketChangedEventHandler extends ChangeEventBroadcastReceiver { + + @Override + protected void doSimComplete() { + if ( autoSaveEnabled && CurrentRocketHolder.getCurrentRocket().canSave() ) { + Toast.makeText(OpenRocketViewer.this, R.string.autoSaveMessage, Toast.LENGTH_SHORT).show(); + OpenRocketViewer.this.saveRocketDocument(); + } + doSimsChanged(); + } - @Override protected void doSimsChanged() { + invalidateOptionsMenu(); Simulations sims = (Simulations) viewPagerAdapter.getFragmentAtPos(SIMS_POS); if ( sims != null ) { sims.refreshSimulationList(); @@ -145,6 +245,7 @@ implements Simulations.OnSimulationSelectedListener @Override protected void doMotorConfigsChanged() { + invalidateOptionsMenu(); Configurations configs = (Configurations) viewPagerAdapter.getFragmentAtPos(CONFIGS_POS); if ( configs != null ) { configs.refreshConfigsList();