package com.kedzie.vbox.machine.settings; import java.util.ArrayList; import java.util.List; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.ImageButton; import android.widget.Spinner; import android.widget.TextView; import com.actionbarsherlock.app.SherlockFragment; import com.google.common.base.Objects; import com.kedzie.vbox.R; import com.kedzie.vbox.api.IMachine; import com.kedzie.vbox.api.IMedium; import com.kedzie.vbox.api.IStorageController; import com.kedzie.vbox.api.jaxb.IMediumAttachment; import com.kedzie.vbox.api.jaxb.IMediumAttachment.Slot; import com.kedzie.vbox.api.jaxb.StorageBus; import com.kedzie.vbox.app.Utils; import com.kedzie.vbox.task.ActionBarTask; import com.kedzie.vbox.task.DialogTask; /** * * @apiviz.stereotype fragment */ public class StorageDVDFragment extends SherlockFragment { /** * Fetch DVD/Medium details */ class LoadInfoTask extends ActionBarTask<Void, Void> { public LoadInfoTask() { super(getSherlockActivity(), _machine.getAPI()); } @Override protected Void work(Void...params) throws Exception { if(_attachment.getMedium()!=null) Utils.cacheProperties(_attachment.getMedium()); _controller = _machine.getStorageControllerByName(_attachment.getController()); _controller.getBus(); _controller.getMaxPortCount(); _controller.getMaxDevicesPerPortCount(); _attachments = _machine.getMediumAttachmentsOfController(_controller.getName()); return null; } @Override protected void onSuccess(Void result) { populate(); } } /** * Move the medium to a different slot within controller. */ class MoveTask extends ActionBarTask<Slot, Void> { public MoveTask() { super(getSherlockActivity(), _machine.getAPI()); } @Override protected Void work(Slot...params) throws Exception { if(params[0].equals(_attachment.getSlot())) return null; _machine.detachDevice(_controller.getName(), _attachment.getPort(), _attachment.getDevice()); if(_attachment.getMedium()!=null) _machine.attachDevice(_controller.getName(), params[0].port, params[0].device, _attachment.getType(), _attachment.getMedium()); else _machine.attachDeviceWithoutMedium(_controller.getName(), params[0].port, params[0].device, _attachment.getType()); return null; } } /** * List mountable mediums */ class ListMediumsTask extends ActionBarTask<Void, List<IMedium>> { public ListMediumsTask() { super(getSherlockActivity(),_machine.getAPI()); } @Override protected List<IMedium> work(Void...params) throws Exception { List<IMedium> mediums = _vmgr.getVBox().getHost().getDVDDrives(); mediums.addAll( _vmgr.getVBox().getDVDImages() ); for(IMedium m : mediums) { m.getName(); m.getHostDrive(); } return mediums; } @Override protected void onSuccess(final List<IMedium> result) { super.onSuccess(result); final CharSequence []items = new CharSequence[result.size()+1]; for(int i=0; i<result.size(); i++) { IMedium m = result.get(i); items[i] = (m.getHostDrive() ? "Host Drive " : "") + m.getName(); } items[items.length-1] = "No Disc"; new AlertDialog.Builder(getContext()) .setTitle("Select Disk") .setItems(items, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { CharSequence selected = items[item]; new MountTask().execute(selected.equals("No Disc") ? null : result.get(item)); } }).show(); } } /** * Mount different medium */ class MountTask extends DialogTask<IMedium, Void> { public MountTask() { super(getSherlockActivity(), _machine.getAPI(),R.string.progress_mounting_medium); } @Override protected Void work(IMedium...params) throws Exception { if(_attachment.getMedium()!=null) _machine.unmountMedium(_controller.getName(), _attachment.getPort(), _attachment.getDevice(), false); _attachment.setMedium(params[0]); if(params[0]!=null) { _machine.mountMedium(_controller.getName(), _attachment.getPort(), _attachment.getDevice(), params[0], false); params[0].getSize(); params[0].getType(); params[0].getLocation(); params[0].getLogicalSize(); } return null; } @Override protected void onSuccess(Void result) { super.onSuccess(result); populate(); } } private IMachine _machine; private IMediumAttachment _attachment; private IStorageController _controller; private ArrayList<IMediumAttachment> _attachments; private View _view; private Spinner _slotSpinner; private ArrayList<Slot> _slots; private ArrayAdapter<Slot> _slotAdapter; private ImageButton _mountButton; private TextView _storageTypeText; private TextView _sizeText; private TextView _locationText; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); _machine = getArguments().getParcelable(IMachine.BUNDLE); _attachment = getArguments().getParcelable(IMedium.BUNDLE); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { _view = inflater.inflate(R.layout.settings_storage_details_dvd, null); _slotSpinner = (Spinner)_view.findViewById(R.id.storage_port); _mountButton = (ImageButton)_view.findViewById(R.id.storage_mount); _mountButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { new ListMediumsTask().execute(); } }); _storageTypeText = (TextView)_view.findViewById(R.id.storage_type); _sizeText = (TextView)_view.findViewById(R.id.storage_size); _locationText = (TextView)_view.findViewById(R.id.storage_location); return _view; } @Override public void onStart() { super.onStart(); new LoadInfoTask().execute(); } private void populate() { int devicesPerPort = _controller.getMaxDevicesPerPortCount(); _slots = new ArrayList<Slot>(devicesPerPort*_controller.getMaxPortCount()); for(int i=0; i<_controller.getMaxPortCount(); i++) { for(int j=0; j<devicesPerPort; j++) { Slot slot = new Slot(i, j); boolean isUsed=false; for(IMediumAttachment a : _attachments) { if(a.getSlot().equals(slot) && !Objects.equal(a.getMedium(),_attachment.getMedium())) { isUsed=true; break; } } if(!isUsed) _slots.add(slot); if(devicesPerPort==1) slot.name = new StringBuffer(_controller.getBus().toString()).append(" Port ").append(i).toString(); else if (_controller.getBus().equals(StorageBus.IDE)) { slot.name = (i==0 ? "Primary " : "Secondary ") + (j==0 ? "MASTER" : "SLAVE"); } } } _slotAdapter = new ArrayAdapter<Slot>(getActivity(), android.R.layout.simple_spinner_item, _slots); _slotSpinner.setAdapter(_slotAdapter); _slotSpinner.setSelection(_slots.indexOf(_attachment.getSlot())); _slotSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { new MoveTask().execute(_slotAdapter.getItem(position)); } @Override public void onNothingSelected(AdapterView<?> parent) {} }); if(_attachment.getMedium()!=null) { _storageTypeText.setText( _attachment.getMedium().getType().toString() ); _sizeText.setText(_attachment.getMedium().getSize()/1024+" MB"); _locationText.setText(_attachment.getMedium().getLocation()); } } }