package com.kedzie.vbox.machine.settings;
import java.util.Arrays;
import java.util.List;
import android.os.Bundle;
import android.os.NetworkOnMainThreadException;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.EditText;
import android.widget.Spinner;
import com.actionbarsherlock.app.SherlockFragment;
import com.kedzie.vbox.R;
import com.kedzie.vbox.api.IHostNetworkInterface;
import com.kedzie.vbox.api.INetworkAdapter;
import com.kedzie.vbox.api.jaxb.HostNetworkInterfaceType;
import com.kedzie.vbox.api.jaxb.NetworkAdapterPromiscModePolicy;
import com.kedzie.vbox.api.jaxb.NetworkAdapterType;
import com.kedzie.vbox.api.jaxb.NetworkAttachmentType;
import com.kedzie.vbox.app.Tuple;
import com.kedzie.vbox.app.Utils;
import com.kedzie.vbox.task.DialogTask;
/**
* @apiviz.stereotype fragment
*/
public class NetworkAdapterFragment extends SherlockFragment {
private static final String TAG = "NetworkAdapterFragment";
class LoadInfoTask extends DialogTask<INetworkAdapter, Tuple<INetworkAdapter, String[]>> {
public LoadInfoTask() {
super(getSherlockActivity(), _adapter.getAPI(), R.string.progress_loading_data_generic);
}
@Override
protected Tuple<INetworkAdapter, String[]> work(INetworkAdapter...params) throws Exception {
INetworkAdapter adapter = params[0];
params[0].clearCache();
adapter.getAdapterType(); adapter.getAttachmentType(); adapter.getCableConnected();
adapter.getEnabled(); adapter.getPromiscModePolicy(); adapter.getMACAddress();
String[] interfaces = null;
if(adapter.getAttachmentType().equals(NetworkAttachmentType.BRIDGED)) {
adapter.getBridgedInterface();
List<IHostNetworkInterface> types = _vmgr.getVBox().getHost().findHostNetworkInterfacesOfType(HostNetworkInterfaceType.BRIDGED);
interfaces = new String[types.size()+1];
interfaces[0] = "Not Attached";
for(int i=0; i<types.size(); i++)
interfaces[i+1] = types.get(i).getName();
} else if(adapter.getAttachmentType().equals(NetworkAttachmentType.HOST_ONLY)) {
adapter.getHostOnlyInterface();
List<IHostNetworkInterface> types = _vmgr.getVBox().getHost().findHostNetworkInterfacesOfType(HostNetworkInterfaceType.HOST_ONLY);
interfaces = new String[types.size()+1];
interfaces[0] = "Not Attached";
for(int i=0; i<types.size(); i++)
interfaces[i+1] = types.get(i).getName();
} else if(adapter.getAttachmentType().equals(NetworkAttachmentType.GENERIC)) {
adapter.getGenericDriver();
} else if(adapter.getAttachmentType().equals(NetworkAttachmentType.INTERNAL)) {
adapter.getInternalNetwork();
} else if(adapter.getAttachmentType().equals(NetworkAttachmentType.NAT)) {
interfaces = new String[1];
interfaces[0] = "Not Attached";
}
return new Tuple<INetworkAdapter, String[]>(adapter, interfaces);
}
@Override
protected void onSuccess(Tuple<INetworkAdapter, String[]> result) {
super.onSuccess(result);
_adapter = result.first;
Log.d(TAG, "Host Interfaces: " + Arrays.toString(result.second));
_hostInterfaces = result.second;
if(_hostInterfaces!=null) {
_nameAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, _hostInterfaces);
_nameSpinner.setAdapter(_nameAdapter);
}
populate();
}
}
private INetworkAdapter _adapter;
private String[] _hostInterfaces;
private View _view;
private CheckBox _enabledCheckBox;
private CheckBox _cableConnectedCheckBox;
private Spinner _attachmentTypeSpinner;
private ArrayAdapter<NetworkAttachmentType> _attachmentTypeAdapter;
private NetworkAttachmentType[] _attachmentTypes = Utils.removeNull(NetworkAttachmentType.values());
private Spinner _nameSpinner;
private ArrayAdapter<String> _nameAdapter;
private EditText _nameText;
private Spinner _adapterTypeSpinner;
private ArrayAdapter<NetworkAdapterType> _adapterTypeAdapter;
private NetworkAdapterType[] _adapterTypes = Utils.removeNull(NetworkAdapterType.values());
private Spinner _promiscuousModeSpinner;
private ArrayAdapter<NetworkAdapterPromiscModePolicy> _promiscuousModeAdapter;
private EditText _macText;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
_adapter = (INetworkAdapter) (savedInstanceState==null ? getArguments().getParcelable(INetworkAdapter.BUNDLE) : savedInstanceState.getParcelable(INetworkAdapter.BUNDLE));
if(savedInstanceState!=null) {
_hostInterfaces = savedInstanceState.getStringArray("interfaces");
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putStringArray("interfaces", _hostInterfaces);
outState.putParcelable(INetworkAdapter.BUNDLE, _adapter);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
_view = inflater.inflate(R.layout.settings_network_adapter, null);
_enabledCheckBox = (CheckBox) _view.findViewById(R.id.network_enabled);
_cableConnectedCheckBox = (CheckBox) _view.findViewById(R.id.network_cable_connected);
_macText = (EditText)_view.findViewById(R.id.network_mac);
_adapterTypeSpinner = (Spinner) _view.findViewById(R.id.network_adapter_type);
_adapterTypeAdapter = new ArrayAdapter<NetworkAdapterType>(getActivity(), android.R.layout.simple_spinner_item, _adapterTypes);
_adapterTypeSpinner.setAdapter(_adapterTypeAdapter);
_attachmentTypeSpinner = (Spinner) _view.findViewById(R.id.network_attached);
_attachmentTypeAdapter = new ArrayAdapter<NetworkAttachmentType>(getActivity(), android.R.layout.simple_spinner_item, _attachmentTypes);
_attachmentTypeSpinner.setAdapter(_attachmentTypeAdapter);
_nameSpinner = (Spinner) _view.findViewById(R.id.network_name_spinner);
_nameText = (EditText)_view.findViewById(R.id.network_name_text);
_promiscuousModeSpinner = (Spinner) _view.findViewById(R.id.network_promiscuous);
_promiscuousModeAdapter = new ArrayAdapter<NetworkAdapterPromiscModePolicy>(getActivity(), android.R.layout.simple_spinner_item, NetworkAdapterPromiscModePolicy.values());
_promiscuousModeSpinner.setAdapter(_promiscuousModeAdapter);
return _view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if(_adapter.getCache().containsKey("getEnabled"))
safePopulate();
else
new LoadInfoTask().execute(_adapter);
}
private void safePopulate() {
try {
populate();
} catch(NetworkOnMainThreadException e) {
Log.e(TAG, "Populate error", e);
new LoadInfoTask().execute(_adapter);
}
}
private void populate() {
boolean enabled = _adapter.getEnabled();
_enabledCheckBox.setChecked(enabled);
_enabledCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
_adapter.setEnabled(isChecked);
new LoadInfoTask().execute(_adapter);
}
});
_cableConnectedCheckBox.setEnabled(enabled);
_macText .setEnabled(enabled);
_adapterTypeSpinner.setEnabled(enabled);
_attachmentTypeSpinner.setEnabled(enabled);
_nameSpinner.setEnabled(enabled);
_nameText.setEnabled(enabled);
_promiscuousModeSpinner.setEnabled(enabled);
_attachmentTypeSpinner.setSelection(Utils.indexOf(_attachmentTypes, _adapter.getAttachmentType()));
_attachmentTypeSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
_adapter.setAttachmentType(_attachmentTypeAdapter.getItem(position));
new LoadInfoTask().execute(_adapter);
}
@Override public void onNothingSelected(AdapterView<?> parent) {}
});
if(_adapter.getAttachmentType().equals(NetworkAttachmentType.BRIDGED)) {
_nameSpinner.setVisibility(View.VISIBLE);
_nameText.setVisibility(View.GONE);
if(Utils.isEmpty(_adapter.getBridgedInterface()))
_nameSpinner.setSelection(0);
else
_nameSpinner.setSelection(Utils.indexOf(_hostInterfaces, _adapter.getBridgedInterface()));
} else if(_adapter.getAttachmentType().equals(NetworkAttachmentType.HOST_ONLY)) {
_nameSpinner.setVisibility(View.VISIBLE);
_nameText.setVisibility(View.GONE);
if(Utils.isEmpty(_adapter.getHostOnlyInterface()))
_nameSpinner.setSelection(0);
else
_nameSpinner.setSelection(Utils.indexOf(_hostInterfaces, _adapter.getHostOnlyInterface()));
} else if(_adapter.getAttachmentType().equals(NetworkAttachmentType.GENERIC)) {
_nameSpinner.setVisibility(View.GONE);
_nameText.setVisibility(View.VISIBLE);
_nameText.setText(_adapter.getGenericDriver());
} else if(_adapter.getAttachmentType().equals(NetworkAttachmentType.INTERNAL)) {
_nameSpinner.setVisibility(View.GONE);
_nameText.setVisibility(View.VISIBLE);
_nameText.setText(_adapter.getInternalNetwork());
} else if(_adapter.getAttachmentType().equals(NetworkAttachmentType.NAT)) {
_nameSpinner.setVisibility(View.VISIBLE);
_nameText.setVisibility(View.GONE);
_nameSpinner.setSelection(0);
_nameSpinner.setEnabled(false);
}
_nameSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if(_adapter.getAttachmentType().equals(NetworkAttachmentType.BRIDGED))
_adapter.setBridgedInterface(_nameAdapter.getItem(position));
else if(_adapter.getAttachmentType().equals(NetworkAttachmentType.HOST_ONLY))
_adapter.setHostOnlyInterface(_nameAdapter.getItem(position));
else if(_adapter.getAttachmentType().equals(NetworkAttachmentType.GENERIC))
_adapter.setGenericDriver(_nameAdapter.getItem(position));
else if(_adapter.getAttachmentType().equals(NetworkAttachmentType.INTERNAL))
_adapter.setInternalNetwork(_nameAdapter.getItem(position));
}
@Override public void onNothingSelected(AdapterView<?> parent) {}
});
_adapterTypeSpinner.setSelection(Utils.indexOf(_adapterTypes, _adapter.getAdapterType()));
_adapterTypeSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
_adapter.setAdapterType(_adapterTypeAdapter.getItem(position));
}
@Override public void onNothingSelected(AdapterView<?> parent) {}
});
_promiscuousModeSpinner.setSelection(Utils.indexOf(NetworkAdapterPromiscModePolicy.values(), _adapter.getPromiscModePolicy()));
_promiscuousModeSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
_adapter.setPromiscModePolicy(_promiscuousModeAdapter.getItem(position));
}
@Override public void onNothingSelected(AdapterView<?> parent) {}
});
_cableConnectedCheckBox.setChecked( _adapter.getCableConnected());
_cableConnectedCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
_adapter.setCableConnected(isChecked);
}
});
_macText.setText(_adapter.getMACAddress());
_macText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
_adapter.setMACAddress(_macText.getText().toString());
}
@Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override public void afterTextChanged(Editable s) {}
});
}
}