diff options
author | Xavier Ducrohet <xav@android.com> | 2009-06-16 17:41:09 -0700 |
---|---|---|
committer | Xavier Ducrohet <xav@android.com> | 2009-06-17 11:40:19 -0700 |
commit | 88f1127ee0b90d7fe91597d072ff6a2c693eff7c (patch) | |
tree | 687250026e77fc0660cd35513b21ac01455e7f82 /eclipse | |
parent | 5dafec27ae2cb37516d1b12c3dd0fbbcbe188e59 (diff) | |
download | sdk-88f1127ee0b90d7fe91597d072ff6a2c693eff7c.zip sdk-88f1127ee0b90d7fe91597d072ff6a2c693eff7c.tar.gz sdk-88f1127ee0b90d7fe91597d072ff6a2c693eff7c.tar.bz2 |
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.
Diffstat (limited to 'eclipse')
3 files changed, 43 insertions, 114 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/DeviceChooserDialog.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/DeviceChooserDialog.java index 3bc68fe..6813d0b 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/DeviceChooserDialog.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/DeviceChooserDialog.java @@ -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>(); - - // get the full list of Android Virtual Devices - if (reloadAvds || mFullAvdList == null) { - AvdManager avdManager = mSdk.getAvdManager(); - if (avdManager != null) { - mFullAvdList = avdManager.getValidAvds(); - } + private final class NonRunningAvdFilter implements IAvdFilter { + + 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) { diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/EmulatorConfigTab.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/EmulatorConfigTab.java index 664babe..4d40c2e 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/EmulatorConfigTab.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/EmulatorConfigTab.java @@ -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) diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/avdmanager/AvdManagerListPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/avdmanager/AvdManagerListPage.java index 0ce569c..9708a0f 100755 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/avdmanager/AvdManagerListPage.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/avdmanager/AvdManagerListPage.java @@ -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(); |