package com.kedzie.vbox.host; import java.util.ArrayList; import java.util.List; import org.ksoap2.SoapFault; import android.content.Context; import android.os.Bundle; import android.util.Log; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; import com.actionbarsherlock.app.SherlockFragment; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; import com.kedzie.vbox.R; import com.kedzie.vbox.api.IDHCPServer; import com.kedzie.vbox.api.IHost; import com.kedzie.vbox.api.IHostNetworkInterface; import com.kedzie.vbox.api.IProgress; import com.kedzie.vbox.api.jaxb.HostNetworkInterfaceType; import com.kedzie.vbox.app.BundleBuilder; import com.kedzie.vbox.app.Tuple; import com.kedzie.vbox.app.Utils; import com.kedzie.vbox.task.ActionBarTask; import com.kedzie.vbox.task.DialogTask; public class HostNetworkListFragment extends SherlockFragment { private View _view; private ListView _listView; private TextView _hostInterfaceAdapterText; private TextView _hostInterfaceDHCPEnabledText; private ArrayAdapter<IHostNetworkInterface> _listAdapter; // private boolean _dualPane; private IHost _host; private ArrayList<IHostNetworkInterface> _interfaces; private ArrayList<IDHCPServer> _dhcpServers; /** * create a network interface */ private class AddInterfaceTask extends DialogTask<IHost, IHostNetworkInterface> { public AddInterfaceTask() { super(getSherlockActivity(), _host.getAPI(), R.string.progress_creating_network_interface); } @Override protected IHostNetworkInterface work(IHost...params) throws Exception { Tuple<IHostNetworkInterface, IProgress> val = _vmgr.createHostOnlyNetworkInterface(params[0]); handleProgress(val.second); return val.first; }; @Override protected void onSuccess(IHostNetworkInterface result) { super.onSuccess(result); new LoadDataTask().execute(); showInterfaceDialog(result); } } /** * Delete a network interface */ private class DeleteInterfaceTask extends ActionBarTask<IHostNetworkInterface, IHostNetworkInterface> { public DeleteInterfaceTask() { super(getSherlockActivity(), _host.getAPI()); } @Override protected IHostNetworkInterface work(IHostNetworkInterface...params) throws Exception { handleProgress(_host.removeHostOnlyNetworkInterface(params[0].getId())); return params[0]; }; @Override protected void onSuccess(IHostNetworkInterface result) { super.onSuccess(result); new LoadDataTask().execute(); } } /** * Load list of host network interfaces */ private class LoadDataTask extends ActionBarTask<IHost, ArrayList<IHostNetworkInterface>> { public LoadDataTask() { super(getSherlockActivity(), _host.getAPI()); } @Override protected ArrayList<IHostNetworkInterface> work(IHost... params) throws Exception { ArrayList<IHostNetworkInterface> data = _host.findHostNetworkInterfacesOfType(HostNetworkInterfaceType.HOST_ONLY); _dhcpServers = new ArrayList<IDHCPServer>(data.size()); for(IHostNetworkInterface net : data) { net.getId(); net.getName(); net.getNetworkName(); net.getDHCPEnabled(); try { IDHCPServer dhcp = _vmgr.getVBox().findDHCPServerByNetworkName(net.getNetworkName()); if(dhcp!=null) dhcp.getEnabled(); _dhcpServers.add(dhcp); } catch(SoapFault e) { Log.e(TAG, "SoapFault finding DHCP Server", e); _dhcpServers.add(null); } } return data; } @Override protected void onSuccess(ArrayList<IHostNetworkInterface> result) { super.onSuccess(result); _interfaces = result; Log.d(TAG, "# of interfaces: " + _interfaces.size()); _listAdapter = new ItemAdapter(getActivity(), _interfaces); _listView.setAdapter(_listAdapter); } } /** * List adapter for Fragments */ private class ItemAdapter extends ArrayAdapter<IHostNetworkInterface> { private LayoutInflater inflater; public ItemAdapter(Context context, List<IHostNetworkInterface> objects) { super(context, 0, objects); inflater = LayoutInflater.from(context); } @Override public View getView(int position, View convertView, ViewGroup parent) { IHostNetworkInterface info = getItem(position); if(convertView==null) { convertView = inflater.inflate(R.layout.simple_selectable_list_item, parent, false); convertView.setTag((TextView)convertView.findViewById(android.R.id.text1)); } TextView text1 = (TextView)convertView.getTag(); text1.setText(info.getName()); return convertView; } } void showInterfaceDialog(IHostNetworkInterface hostInterface) { // FragmentElement category = new FragmentElement(hostInterface.getName(), HostNetworkDialog2Fragment.class, new BundleBuilder().putParcelable(IHostNetworkInterface.BUNDLE, hostInterface).create()); // startActivity(new Intent(getActivity(), FragmentActivity.class).putExtra(FragmentElement.BUNDLE, category)); Utils.showDialog(getFragmentManager(), "dialog", HostNetworkDialog.getInstance(new BundleBuilder().putParcelable(IHostNetworkInterface.BUNDLE, hostInterface).create())); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelableArrayList("interfaces", _interfaces); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); _host = (IHost)getArguments().getParcelable(IHost.BUNDLE); if(savedInstanceState!=null) _interfaces = savedInstanceState.getParcelableArrayList("interfaces"); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // _dualPane = getActivity().findViewById(R.id.details)!=null; _view = inflater.inflate(R.layout.host_settings_network_list, null); _listView = (ListView)_view.findViewById(R.id.host_interface_list); _listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); _listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { _listView.setItemChecked(position, true); _hostInterfaceAdapterText.setText("Manually Configured"); IDHCPServer dhcp = _dhcpServers.get(position); if(dhcp!=null && dhcp.getEnabled()) _hostInterfaceDHCPEnabledText.setText("Enabled"); else _hostInterfaceDHCPEnabledText.setText("Disabled"); } }); registerForContextMenu(_listView); _hostInterfaceAdapterText = (TextView)_view.findViewById(R.id.host_interface_adapter); _hostInterfaceDHCPEnabledText = (TextView)_view.findViewById(R.id.host_interface_dhcp_enabled); return _view; } @Override public void onStart() { super.onStart(); new LoadDataTask().execute(); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.host_interface_actions, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case R.id.option_menu_add: new AddInterfaceTask().execute(_host); return true; } return false; } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { menu.add(Menu.NONE, R.id.host_interface_context_menu_edit, Menu.NONE, R.string.edit); menu.add(Menu.NONE, R.id.host_interface_context_menu_delete, Menu.NONE, R.string.delete); } @Override public boolean onContextItemSelected(android.view.MenuItem item) { int position = ((AdapterContextMenuInfo)item.getMenuInfo()).position; final IHostNetworkInterface hostInterface = _listAdapter.getItem(position); switch (item.getItemId()) { case R.id.host_interface_context_menu_edit: showInterfaceDialog(hostInterface); return true; case R.id.host_interface_context_menu_delete: new DeleteInterfaceTask().execute(hostInterface); return true; } return false; } }