package com.kedzie.vbox.widget;
import android.appwidget.AppWidgetManager;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.app.Fragment;
import android.view.View;
import android.widget.FrameLayout;
import com.kedzie.vbox.R;
import com.kedzie.vbox.api.IMachine;
import com.kedzie.vbox.api.IVirtualBox;
import com.kedzie.vbox.app.BaseActivity;
import com.kedzie.vbox.app.BundleBuilder;
import com.kedzie.vbox.app.Utils;
import com.kedzie.vbox.machine.group.MachineGroupListBaseFragment;
import com.kedzie.vbox.machine.group.TreeNode;
import com.kedzie.vbox.machine.group.VMGroupListView.OnTreeNodeSelectListener;
import com.kedzie.vbox.server.Server;
import com.kedzie.vbox.server.ServerListFragment.OnSelectServerListener;
import com.kedzie.vbox.soap.VBoxSvc;
import com.kedzie.vbox.task.DialogTask;
/**
* VirtualBox server list for picking a VM for widget
* @author Marek Kędzierski
* @apiviz.stereotype activity
* @apiviz.owns com.kedzie.vbox.server.ServerListFragment
*/
public class ServerListPickActivity extends BaseActivity implements OnSelectServerListener, OnTreeNodeSelectListener {
/**
* Log on to VirtualBox webservice, load machine list
*/
class LogonTask extends DialogTask<Server, IVirtualBox> {
public LogonTask() {
super(ServerListPickActivity.this, null, R.string.progress_connecting);
}
@Override
protected IVirtualBox work(Server... params) throws Exception {
_vmgr = new VBoxSvc(params[0]);
return _vmgr.logon();
}
@Override
protected void onSuccess(IVirtualBox vbox) {
launchMachineList(_vmgr);
}
}
/**
* Disconnect from VirtualBox webservice
*/
private class LogoffTask extends DialogTask<Void, Void> {
public LogoffTask(VBoxSvc vmgr) {
super(ServerListPickActivity.this, vmgr, R.string.progress_logging_off);
}
@Override
protected Void work(Void... params) throws Exception {
_vmgr.logoff();
return null;
}
}
/** Are we in a dual pane (tablet) layout */
private boolean _dualPane;
/** ID of AppWidget */
private int mAppWidgetId;
/** Currently selected logged on api */
private VBoxSvc _vmgr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setResult(RESULT_CANCELED);
mAppWidgetId = getIntent().getExtras().getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
getSupportActionBar().setTitle(R.string.widget_server_list);
getSupportActionBar().setDisplayShowTitleEnabled(true);
setContentView(R.layout.widget_server_list);
FrameLayout detailsFrame = (FrameLayout)findViewById(R.id.details);
_dualPane = detailsFrame != null && detailsFrame.getVisibility() == View.VISIBLE;
}
void launchMachineList(VBoxSvc vboxApi) {
_vmgr=vboxApi;
if(_dualPane) {
Utils.setCustomAnimations(getSupportFragmentManager().beginTransaction())
.replace(R.id.details, Fragment.instantiate(this, MachineGroupListBaseFragment.class.getName(), new BundleBuilder().putParcelable(VBoxSvc.BUNDLE, vboxApi).create()))
.commit();
} else {
Utils.startActivityForResult(this, new Intent(ServerListPickActivity.this, MachineListPickActivity.class)
.putExtra(VBoxSvc.BUNDLE, (Parcelable)vboxApi)
.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId), 0);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode==RESULT_OK) {
setResult(resultCode, data);
finish();
}
}
@Override
public void onTreeNodeSelect(TreeNode node) {
if(node instanceof IMachine) {
Provider.savePrefs(this, _vmgr, (IMachine)node, mAppWidgetId);
setResult(RESULT_OK, new Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId));
finish();
}
}
@Override
public void onSelectServer(final Server server) {
if(_vmgr!=null) {
new LogoffTask(_vmgr) {
protected void onPostExecute(Void result) {
new LogonTask().execute(server);
};
}.execute();
} else {
new LogonTask().execute(server);
}
}
}