First step of a more standalone AvdSelector.
- New/Delete/Info/Refresh/Manager buttons. - Ability to set any kind of AVD filter - Self-refresh: Selector knows the AvdManager and can refresh itself. - Manager mode or simple (selection or checkboxes) - Manager mode displays broken AVDs. Updated the SdkUpdate AVD page and the various use of the Selector in ADT.
This commit is contained in:
@@ -26,13 +26,12 @@ import com.android.ddmuilib.ImageHelper;
|
||||
import com.android.ddmuilib.TableHelper;
|
||||
import com.android.ide.eclipse.adt.AdtPlugin;
|
||||
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
|
||||
import com.android.ide.eclipse.adt.internal.wizards.actions.AvdManagerAction;
|
||||
import com.android.ide.eclipse.ddms.DdmsPlugin;
|
||||
import com.android.sdklib.IAndroidTarget;
|
||||
import com.android.sdklib.internal.avd.AvdManager;
|
||||
import com.android.sdklib.internal.avd.AvdManager.AvdInfo;
|
||||
import com.android.sdkuilib.internal.widgets.AvdSelector;
|
||||
import com.android.sdkuilib.internal.widgets.AvdSelector.SelectionMode;
|
||||
import com.android.sdkuilib.internal.widgets.AvdSelector.DisplayMode;
|
||||
import com.android.sdkuilib.internal.widgets.AvdSelector.IAvdFilter;
|
||||
|
||||
import org.eclipse.jface.dialogs.Dialog;
|
||||
import org.eclipse.jface.dialogs.IDialogConstants;
|
||||
@@ -58,8 +57,6 @@ import org.eclipse.swt.widgets.Label;
|
||||
import org.eclipse.swt.widgets.Shell;
|
||||
import org.eclipse.swt.widgets.Table;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* A dialog that lets the user choose a device to deploy an application.
|
||||
* The user can either choose an exiting running device (including running emulators)
|
||||
@@ -91,8 +88,6 @@ public class DeviceChooserDialog extends Dialog implements IDeviceChangeListener
|
||||
private final IAndroidTarget mProjectTarget;
|
||||
private final Sdk mSdk;
|
||||
|
||||
private AvdInfo[] mFullAvdList;
|
||||
|
||||
private Button mDeviceRadioButton;
|
||||
|
||||
private boolean mDisableAvdSelectionChange = false;
|
||||
@@ -264,6 +259,7 @@ public class DeviceChooserDialog extends Dialog implements IDeviceChangeListener
|
||||
mProjectTarget = projectTarget;
|
||||
mSdk = Sdk.getCurrent();
|
||||
|
||||
AndroidDebugBridge.addDeviceChangeListener(this);
|
||||
loadImages();
|
||||
}
|
||||
|
||||
@@ -415,24 +411,9 @@ public class DeviceChooserDialog extends Dialog implements IDeviceChangeListener
|
||||
offsetComp.setLayout(layout);
|
||||
|
||||
mPreferredAvdSelector = new AvdSelector(offsetComp,
|
||||
getNonRunningAvds(false /*reloadAvds*/),
|
||||
mProjectTarget,
|
||||
new AvdSelector.IExtraAction() {
|
||||
public void run() {
|
||||
AvdManagerAction action = new AvdManagerAction();
|
||||
action.run(null);
|
||||
refillAvdList(true /*reloadAvds*/);
|
||||
}
|
||||
|
||||
public boolean isEnabled() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public String label() {
|
||||
return "AVD Manager...";
|
||||
}
|
||||
},
|
||||
SelectionMode.CHECK);
|
||||
mSdk.getAvdManager(),
|
||||
new NonRunningAvdFilter(),
|
||||
DisplayMode.SIMPLE_SELECTION);
|
||||
mPreferredAvdSelector.setTableHeightHint(100);
|
||||
mPreferredAvdSelector.setEnabled(false);
|
||||
mPreferredAvdSelector.setSelectionListener(new SelectionAdapter() {
|
||||
@@ -594,6 +575,7 @@ public class DeviceChooserDialog extends Dialog implements IDeviceChangeListener
|
||||
// update the display of AvdInfo (since it's filtered to only display
|
||||
// non running AVD). This is done on deviceChanged because the avd name
|
||||
// of a (emulator) device may be updated as the emulator boots.
|
||||
|
||||
refillAvdList(false /*reloadAvds*/);
|
||||
|
||||
// if the changed device is the current selection,
|
||||
@@ -707,50 +689,44 @@ public class DeviceChooserDialog extends Dialog implements IDeviceChangeListener
|
||||
handleDeviceSelection();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the list of {@link AvdInfo} that are not already running in an emulator.
|
||||
*/
|
||||
private AvdInfo[] getNonRunningAvds(boolean reloadAvds) {
|
||||
ArrayList<AvdInfo> list = new ArrayList<AvdInfo>();
|
||||
private final class NonRunningAvdFilter implements IAvdFilter {
|
||||
|
||||
// get the full list of Android Virtual Devices
|
||||
if (reloadAvds || mFullAvdList == null) {
|
||||
AvdManager avdManager = mSdk.getAvdManager();
|
||||
if (avdManager != null) {
|
||||
mFullAvdList = avdManager.getValidAvds();
|
||||
}
|
||||
private IDevice[] mDevices;
|
||||
|
||||
public void prepare() {
|
||||
mDevices = AndroidDebugBridge.getBridge().getDevices();
|
||||
}
|
||||
|
||||
// loop through all the Avd and put the one that are not running in the list.
|
||||
if (mFullAvdList != null) {
|
||||
IDevice[] devices = AndroidDebugBridge.getBridge().getDevices();
|
||||
avdLoop: for (AvdInfo info : mFullAvdList) {
|
||||
for (IDevice d : devices) {
|
||||
if (info.getName().equals(d.getAvdName())) {
|
||||
continue avdLoop;
|
||||
public boolean accept(AvdInfo avd) {
|
||||
if (mDevices != null) {
|
||||
for (IDevice d : mDevices) {
|
||||
if (mProjectTarget.isCompatibleBaseFor(avd.getTarget()) == false ||
|
||||
avd.getName().equals(d.getAvdName())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
list.add(info);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return list.toArray(new AvdInfo[list.size()]);
|
||||
public void cleanup() {
|
||||
mDevices = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Refills the AVD list keeping the current selection.
|
||||
*/
|
||||
private void refillAvdList(boolean reloadAvds) {
|
||||
AvdInfo[] array = getNonRunningAvds(reloadAvds);
|
||||
|
||||
// save the current selection
|
||||
AvdInfo selected = mPreferredAvdSelector.getSelected();
|
||||
|
||||
// disable selection change.
|
||||
mDisableAvdSelectionChange = true;
|
||||
|
||||
// set the new list in the selector
|
||||
mPreferredAvdSelector.setAvds(array, mProjectTarget);
|
||||
// refresh the list
|
||||
mPreferredAvdSelector.refresh(false);
|
||||
|
||||
// attempt to reselect the proper avd if needed
|
||||
if (selected != null) {
|
||||
|
||||
@@ -20,14 +20,13 @@ import com.android.ide.eclipse.adt.AdtPlugin;
|
||||
import com.android.ide.eclipse.adt.internal.launch.AndroidLaunchConfiguration.TargetMode;
|
||||
import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
|
||||
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
|
||||
import com.android.ide.eclipse.adt.internal.wizards.actions.AvdManagerAction;
|
||||
import com.android.ide.eclipse.ddms.DdmsPlugin;
|
||||
import com.android.prefs.AndroidLocation.AndroidLocationException;
|
||||
import com.android.sdklib.IAndroidTarget;
|
||||
import com.android.sdklib.internal.avd.AvdManager;
|
||||
import com.android.sdklib.internal.avd.AvdManager.AvdInfo;
|
||||
import com.android.sdkuilib.internal.widgets.AvdSelector;
|
||||
import com.android.sdkuilib.internal.widgets.AvdSelector.SelectionMode;
|
||||
import com.android.sdkuilib.internal.widgets.AvdSelector.DisplayMode;
|
||||
|
||||
import org.eclipse.core.resources.IProject;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
@@ -191,24 +190,12 @@ public class EmulatorConfigTab extends AbstractLaunchConfigurationTab {
|
||||
|
||||
mPreferredAvdLabel = new Label(offsetComp, SWT.NONE);
|
||||
mPreferredAvdLabel.setText("Select a preferred Android Virtual Device for deployment:");
|
||||
mPreferredAvdSelector = new AvdSelector(offsetComp,
|
||||
null /*avds*/,
|
||||
new AvdSelector.IExtraAction() {
|
||||
public void run() {
|
||||
AvdManagerAction action = new AvdManagerAction();
|
||||
action.run(null);
|
||||
updateAvdList(null);
|
||||
}
|
||||
|
||||
public boolean isEnabled() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public String label() {
|
||||
return "AVD Manager...";
|
||||
}
|
||||
},
|
||||
SelectionMode.CHECK);
|
||||
// create the selector with no manager, we'll reset the manager every time this is
|
||||
// displayed to ensure we have the latest one (dialog is reused but SDK could have
|
||||
// been changed in between.
|
||||
mPreferredAvdSelector = new AvdSelector(offsetComp, null /* avd manager */,
|
||||
DisplayMode.SIMPLE_CHECK);
|
||||
mPreferredAvdSelector.setTableHeightHint(100);
|
||||
mPreferredAvdSelector.setSelectionListener(new SelectionAdapter() {
|
||||
@Override
|
||||
@@ -322,13 +309,9 @@ public class EmulatorConfigTab extends AbstractLaunchConfigurationTab {
|
||||
avdManager = Sdk.getCurrent().getAvdManager();
|
||||
}
|
||||
|
||||
AvdInfo[] avds = null;
|
||||
// no project? we don't want to display any "compatible" AVDs.
|
||||
if (avdManager != null && mProjectTarget != null) {
|
||||
avds = avdManager.getValidAvds();
|
||||
}
|
||||
|
||||
mPreferredAvdSelector.setAvds(avds, mProjectTarget);
|
||||
mPreferredAvdSelector.setManager(avdManager);
|
||||
mPreferredAvdSelector.setFilter(mProjectTarget);
|
||||
mPreferredAvdSelector.refresh(false);
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
||||
@@ -27,7 +27,7 @@ import com.android.sdklib.ISdkLog;
|
||||
import com.android.sdklib.internal.avd.AvdManager;
|
||||
import com.android.sdklib.internal.avd.AvdManager.AvdInfo;
|
||||
import com.android.sdkuilib.internal.widgets.AvdSelector;
|
||||
import com.android.sdkuilib.internal.widgets.AvdSelector.SelectionMode;
|
||||
import com.android.sdkuilib.internal.widgets.AvdSelector.DisplayMode;
|
||||
|
||||
import org.eclipse.core.resources.IProject;
|
||||
import org.eclipse.jface.wizard.WizardPage;
|
||||
@@ -162,21 +162,7 @@ class AvdManagerListPage extends WizardPage {
|
||||
}
|
||||
});
|
||||
|
||||
mAvdSelector = new AvdSelector(parent,
|
||||
SelectionMode.SELECT,
|
||||
new AvdSelector.IExtraAction() {
|
||||
public String label() {
|
||||
return "Delete AVD...";
|
||||
}
|
||||
|
||||
public boolean isEnabled() {
|
||||
return mAvdSelector != null && mAvdSelector.getSelected() != null;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
onDelete();
|
||||
}
|
||||
});
|
||||
mAvdSelector = new AvdSelector(parent, getAvdManager(), DisplayMode.MANAGER);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -430,29 +416,12 @@ class AvdManagerListPage extends WizardPage {
|
||||
* Tries to preserve the selection.
|
||||
*/
|
||||
private void reloadAvdList() {
|
||||
AvdInfo selected = mAvdSelector.getSelected();
|
||||
|
||||
AvdManager avdm = getAvdManager();
|
||||
AvdInfo[] avds = null;
|
||||
|
||||
// For the AVD manager to reload the list, in case AVDs where created using the
|
||||
// command line tool.
|
||||
// The AVD manager may not exist yet, typically when loading the SDK.
|
||||
if (avdm != null) {
|
||||
try {
|
||||
avdm.reloadAvds();
|
||||
} catch (AndroidLocationException e) {
|
||||
AdtPlugin.log(e, "AVD Manager reload failed"); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
avds = avdm.getValidAvds();
|
||||
}
|
||||
|
||||
mAvdSelector.setAvds(avds, null /*filter*/);
|
||||
mAvdSelector.refresh(true /* reload */);
|
||||
|
||||
// Keep the list of known AVD names to check if they exist quickly. however
|
||||
// use the list of all AVDs, including broken ones (unless we don't know their
|
||||
// name).
|
||||
AvdManager avdm = getAvdManager();
|
||||
mKnownAvdNames.clear();
|
||||
if (avdm != null) {
|
||||
for (AvdInfo avd : avdm.getAllAvds()) {
|
||||
@@ -462,14 +431,15 @@ class AvdManagerListPage extends WizardPage {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mAvdSelector.setSelection(selected);
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggered when the user selects the "delete" button (the extra action in the selector)
|
||||
* Deletes the currently selected AVD, if any.
|
||||
*
|
||||
* This is obsolete. Kept around to reuse the code later in the AvdSelector itself.
|
||||
*/
|
||||
@Deprecated
|
||||
private void onDelete() {
|
||||
AvdInfo avdInfo = mAvdSelector.getSelected();
|
||||
AvdManager avdm = getAvdManager();
|
||||
|
||||
Reference in New Issue
Block a user