package com.kedzie.vbox.machine.group; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.actionbarsherlock.app.SherlockFragment; import com.kedzie.vbox.R; import com.kedzie.vbox.SettingsActivity; import com.kedzie.vbox.api.IHost; import com.kedzie.vbox.api.IMachine; import com.kedzie.vbox.api.IManagedObjectRef; import com.kedzie.vbox.api.IVirtualBox; import com.kedzie.vbox.app.BundleBuilder; import com.kedzie.vbox.app.Utils; import com.kedzie.vbox.machine.group.VMGroupListView.OnTreeNodeSelectListener; import com.kedzie.vbox.soap.VBoxSvc; import com.kedzie.vbox.task.DialogTask; import com.kedzie.vbox.task.MachineRunnable; /** * New machine list based on groups * @apiviz.stereotype fragment */ public class MachineGroupListBaseFragment extends SherlockFragment { protected static final String TAG = MachineGroupListBaseFragment.class.getSimpleName(); protected VBoxSvc _vmgr; protected VMGroup _root; protected IHost _host; protected VMGroupListView _listView; protected OnTreeNodeSelectListener _selectListener; /** * Load Groups and VMs */ class LoadGroupsTask extends DialogTask<Void, VMGroup> { private Map<String, VMGroup> groupCache = new HashMap<String, VMGroup>(); public LoadGroupsTask(VBoxSvc vboxApi) { super(getSherlockActivity(), vboxApi, R.string.progress_loading_machines); } private VMGroup get(String name) { if(!groupCache.containsKey(name)) groupCache.put(name, new VMGroup(name)); return groupCache.get(name); } @Override protected VMGroup work(Void... params) throws Exception { _vmgr.getVBox().getVersion(); _host = _vmgr.getVBox().getHost(); _host.getMemorySize(); _host.getAPI().getVBox().getVersion(); List<String> vGroups = _vmgr.getVBox().getMachineGroups(); for(String tmp : vGroups) { if(tmp.equals("/")) continue; VMGroup previous = get(tmp); int lastIndex=0; while((lastIndex=tmp.lastIndexOf('/'))>0) { tmp=tmp.substring(0, lastIndex); VMGroup current = get(tmp); current.addChild(previous); previous=current; } get("").addChild(get(tmp)); } for(IMachine machine : _vmgr.getVBox().getMachines()) { fork(new MachineRunnable(machine) { public void run() { Utils.cacheProperties(m); List<String> groups = m.getGroups(); get(groups.get(0)).addChild(m); } }); } join(); _vmgr.getVBox().getPerformanceCollector().setupMetrics(new String[] { "*:" }, Utils.getIntPreference(getActivity().getApplicationContext(), SettingsActivity.PREF_PERIOD), Utils.getIntPreference(getActivity().getApplicationContext(), SettingsActivity.PREF_COUNT), (IManagedObjectRef)null); return get(""); } @Override protected void onSuccess(VMGroup root) { // getSherlockActivity().getSupportActionBar().setSubtitle(getResources().getString(R.string.vbox_version, _vmgr.getVBox().getVersion())); _listView.setRoot(root, _host); _root = root; } } @Override public void onAttach(Activity activity) { super.onAttach(activity); try { _selectListener = (OnTreeNodeSelectListener)activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " does not implement OnTreeNodeSelectListener"); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); _vmgr = BundleBuilder.getVBoxSvc(getActivity().getIntent()); if(savedInstanceState!=null) { _root = savedInstanceState.getParcelable(VMGroup.BUNDLE); _vmgr = BundleBuilder.getVBoxSvc(savedInstanceState); _host = _vmgr.getVBox().getHost(); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { _listView = new VMGroupListView(getActivity(), _vmgr); _listView.setOnTreeNodeSelectListener(_selectListener); return _listView; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); _listView.setSelectionEnabled(getActivity().findViewById(R.id.details)!=null); if(_root==null) new LoadGroupsTask(_vmgr).execute(); else _listView.setRoot(_root, _host); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); BundleBuilder.putVBoxSvc(outState, _vmgr); outState.putParcelable(VMGroup.BUNDLE, _root); //save current machine outState.putParcelable("checkedItem", _listView.getSelectedObject()); } }