package com.kedzie.vbox.machine.settings;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.widget.FrameLayout;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.kedzie.vbox.R;
import com.kedzie.vbox.api.IMachine;
import com.kedzie.vbox.api.ISession;
import com.kedzie.vbox.api.jaxb.LockType;
import com.kedzie.vbox.app.BaseActivity;
import com.kedzie.vbox.app.BundleBuilder;
import com.kedzie.vbox.app.FragmentActivity;
import com.kedzie.vbox.app.FragmentElement;
import com.kedzie.vbox.app.Utils;
import com.kedzie.vbox.machine.settings.CategoryFragment.OnSelectCategoryListener;
import com.kedzie.vbox.soap.VBoxSvc;
import com.kedzie.vbox.task.ActionBarTask;
/**
* Obtain a write-lock and then edit virtual machine settings
*
* @apiviz.stereotype activity
*/
public class VMSettingsActivity extends BaseActivity implements OnSelectCategoryListener {
public static final String MUTABLE_KEY = "mutable";
/**
* Get Write Lock on machine
*/
class LockMachineTask extends ActionBarTask<IMachine, IMachine> {
public LockMachineTask() {
super(VMSettingsActivity.this, VMSettingsActivity.this._vmgr);
}
@Override
protected IMachine work(IMachine... m) throws Exception {
ISession session = _vmgr.getVBox().getSessionObject();
m[0].lockMachine(session, LockType.WRITE);
return session.getMachine();
}
@Override
protected void onSuccess(IMachine result) {
super.onSuccess(result);
_mutable = result;
FragmentTransaction tx = getSupportFragmentManager().beginTransaction();
tx.add(R.id.list, Fragment.instantiate(VMSettingsActivity.this, CategoryFragment.class.getName(), new BundleBuilder().putProxy(IMachine.BUNDLE, _mutable).create()));
tx.commit();
}
}
/**
* Save settings
*/
class SaveSettingsTask extends ActionBarTask<IMachine, Integer> {
public SaveSettingsTask() {
super(VMSettingsActivity.this, VMSettingsActivity.this._vmgr);
}
@Override
protected Integer work(IMachine... m) throws Exception {
m[0].saveSettings();
_vmgr.getVBox().getSessionObject().unlockMachine();
return 1;
}
@Override
protected void onSuccess(Integer result) {
super.onSuccess(result);
Utils.toastLong(VMSettingsActivity.this, VMSettingsActivity.this.getString(R.string.toast_saved_settings));
finish();
}
}
/**
* Discard settings
*/
class DiscardSettingsTask extends ActionBarTask<IMachine, Integer> {
public DiscardSettingsTask() {
super(VMSettingsActivity.this, VMSettingsActivity.this._vmgr);
}
@Override
protected Integer work(IMachine... m) throws Exception {
m[0].discardSettings();
_vmgr.getVBox().getSessionObject().unlockMachine();
return 1;
}
@Override
protected void onSuccess(Integer result) {
super.onSuccess(result);
Utils.toastLong(VMSettingsActivity.this, getString(R.string.toast_discarding_settings));
finish();
}
}
/** Is the dual Fragment Layout active? */
private boolean _dualPane;
/** VirtualBox API */
private VBoxSvc _vmgr;
/** Immutable vm reference */
private IMachine _machine;
/** Mutable vm reference. Initialized when machine is successfully WRITE-Locked */
private IMachine _mutable;
/** Currently selected settings category */
private String currentCategory;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
_vmgr = BundleBuilder.getVBoxSvc(getIntent());
_machine = BundleBuilder.getProxy(getIntent(), IMachine.BUNDLE, IMachine.class);
getSupportActionBar().setTitle(_machine.getName() + " Settings");
getSupportActionBar().setDisplayShowTitleEnabled(true);
getSupportActionBar().setIcon(getApp().getOSDrawable(_machine.getOSTypeId()));
setContentView(R.layout.fragment_list_layout);
FrameLayout detailsFrame = (FrameLayout)findViewById(R.id.details);
_dualPane = detailsFrame != null && detailsFrame.getVisibility()==View.VISIBLE;
if(savedInstanceState==null)
new LockMachineTask().execute(_machine);
else {
_mutable = savedInstanceState.getParcelable(MUTABLE_KEY);
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if(_mutable!=null)
BundleBuilder.putProxy(outState, MUTABLE_KEY, _mutable);
}
@Override
public void onSelectCategory(FragmentElement category) {
if(_dualPane) {
FragmentTransaction tx = Utils.setCustomAnimations(getSupportFragmentManager().beginTransaction());
Utils.detachFragment(getSupportFragmentManager(), tx, currentCategory);
Utils.addOrAttachFragment(this, getSupportFragmentManager(), tx, R.id.details, category);
tx.commit();
} else {
Utils.startActivity(this, new Intent(this, FragmentActivity.class).putExtra(FragmentElement.BUNDLE, category));
}
currentCategory = category.name;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.machine_settings, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case R.id.option_menu_save:
saveSettings();
return true;
case R.id.option_menu_discard:
discardSettings();
return true;
case android.R.id.home:
onBackPressed();
return true;
}
return false;
}
@Override
public void onBackPressed() {
new AlertDialog.Builder(this)
.setTitle("Save Changes?")
.setMessage("Do you wish to save changes?")
.setIcon(android.R.drawable.ic_dialog_info)
.setPositiveButton("OK", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
saveSettings();
finish();
}
})
.setNegativeButton("Discard", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
discardSettings();
finish();
}
})
.show();
}
private void saveSettings() {
new SaveSettingsTask().execute(_mutable);
}
private void discardSettings() {
if(_mutable!=null)
new DiscardSettingsTask().execute(_mutable);
}
@Override
public void finish() {
super.finish();
Utils.overrideBackTransition(this);
}
}