package com.kedzie.vbox.machine;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.view.View;
import android.widget.FrameLayout;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.view.MenuItem;
import com.kedzie.vbox.R;
import com.kedzie.vbox.api.IHost;
import com.kedzie.vbox.api.IMachine;
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.TabSupport;
import com.kedzie.vbox.app.TabSupportActionBarViewPager;
import com.kedzie.vbox.app.Utils;
import com.kedzie.vbox.event.EventIntentService;
import com.kedzie.vbox.host.HostInfoFragment;
import com.kedzie.vbox.machine.group.GroupInfoFragment;
import com.kedzie.vbox.machine.group.TreeNode;
import com.kedzie.vbox.machine.group.VMGroup;
import com.kedzie.vbox.machine.group.VMGroupListView.OnTreeNodeSelectListener;
import com.kedzie.vbox.soap.VBoxSvc;
import com.kedzie.vbox.task.DialogTask;
/**
*
* @author Marek Kędzierski
* @apiviz.stereotype activity
*/
public class MachineListActivity extends BaseActivity implements OnTreeNodeSelectListener {
/** Is the dual Fragment Layout active? */
private boolean _dualPane;
/** VirtualBox API */
private VBoxSvc _vmgr;
/** {@link ActionBar} tabs */
private TabSupport _tabSupport;
/**
* Disconnect from VirtualBox webservice
*/
private class LogoffTask extends DialogTask<Void, Void> {
public LogoffTask(VBoxSvc vmgr) {
super(MachineListActivity.this, vmgr, R.string.progress_logging_off);
}
@Override
protected Void work(Void... params) throws Exception {
_vmgr.logoff();
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
finish();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
_vmgr = BundleBuilder.getVBoxSvc(getIntent());
setContentView(R.layout.machine_list);
FrameLayout detailsFrame = (FrameLayout)findViewById(R.id.details);
_dualPane = detailsFrame != null && detailsFrame.getVisibility() == View.VISIBLE;
startService(new Intent(this, EventIntentService.class).putExtras(getIntent()));
}
@Override
protected void onStart() {
super.onStart();
setSupportProgressBarIndeterminateVisibility(false);
}
@Override
public void onTreeNodeSelect(TreeNode node) {
if(node instanceof IMachine)
onMachineSelected((IMachine)node);
else if (node instanceof VMGroup)
onGroupSelected((VMGroup)node);
else if (node instanceof IHost)
onHostSelected((IHost)node);
}
private void onMachineSelected(IMachine machine) {
Bundle b = new BundleBuilder().putVBoxSvc(_vmgr).putProxy(IMachine.BUNDLE, machine).create();
if (_dualPane)
show(new FragmentElement(machine.getName(), MachineFragment.class, b));
else
Utils.startActivity(this, new Intent(this, MachineActivity.class).putExtras(b));
}
private void onGroupSelected(VMGroup group) {
show(new FragmentElement(group.getName(), GroupInfoFragment.class,
new BundleBuilder().putVBoxSvc(_vmgr).putParcelable(VMGroup.BUNDLE, group).create()));
}
private void onHostSelected(IHost host) {
show(new FragmentElement("Host", HostInfoFragment.class,
new BundleBuilder().putVBoxSvc(_vmgr).putParcelable(IHost.BUNDLE, host).create()));
}
private void show(FragmentElement details) {
if(_dualPane) {
Utils.setCustomAnimations(getSupportFragmentManager().beginTransaction()).replace(R.id.details, details.instantiate(this)).commit();
} else {
Utils.startActivity(this, new Intent(this, FragmentActivity.class).putExtra(FragmentElement.BUNDLE, details));
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case android.R.id.home:
logoff();
return true;
}
return false;
}
@Override
public void onBackPressed() {
logoff();
}
@Override
public void finish() {
super.finish();
Utils.overrideBackTransition(this);
}
public void logoff() {
stopService(new Intent(this, EventIntentService.class));
if(_vmgr.getVBox()!=null)
new LogoffTask(_vmgr). execute();
}
}