Display the AVD manager wizard during launches where no compatible AVDs exist.
diff --git a/eclipse/changes.txt b/eclipse/changes.txt
index 02d9075..e385e0c 100644
--- a/eclipse/changes.txt
+++ b/eclipse/changes.txt
@@ -1,4 +1,11 @@
-0.9.0 (work in progress)
+0.9.1:
+- Added an AVD creation wizard to ADT. It is automatically displayed during a launch if no compatible AVDs are found.
+- Fixed issue with libs/ folder where files with no extension would prevent the build from finishing.
+- Improved error handling during the final steps of the build to mark the project if an unexpected error prevent the build from finishing.
+- Fixed issue when launching ADT on a clean install would trigger org.eclipse.swt.SWTError: Not implemented [multiple displays].
+
+
+0.9.0:
- Projects now store generated Java files (R.java/Manifest.java and output from aidl) in a 'gen' source folder.
- Support for the new Android SDK with support for multiple versions of the Android platform and for vendor supplied add-ons.
* New Project Wizard lets you choose which platform/add-on to target.
diff --git a/eclipse/plugins/README.txt b/eclipse/plugins/README.txt
deleted file mode 100644
index 184d731..0000000
--- a/eclipse/plugins/README.txt
+++ /dev/null
@@ -1,114 +0,0 @@
-Compiling and deploying the Android Development Toolkit (ADT) feature.
-
-The ADT feature is composed of four plugins:
-- com.android.ide.eclipse.adt:
- The ADT plugin, which provides support for compiling and debugging android
- applications.
-- com.android.ide.eclipse.common:
- A common plugin providing utility services to the other plugins.
-- com.android.ide.eclipse.editors:
- A plugin providing optional XML editors.
-- com.android.ide.eclipse.ddms:
- A plugin version of the tool DDMS
-
-Because the DDMS plugin source code is not yet released, compiling the
-ADT/Common/Editors plugins requires to install the DDMS plugin in eclipse.
-
-Basic requirements:
-- Eclipse 3.3 or 3.4 with JDT and PDE.
-- DDMS plugin installed and running.
-
-
---------------------------
-1- Install the DDMS plugin
---------------------------
-
-The easiest way to setup the DDMS plugin in your Eclipse environment is to
-install the ADT features (see SDK documentation for details) and then remove
-the following features and plugins:
-
-- <eclipse-directory>/features/com.android.ide.eclipse.adt_x.x.x.jar
-- <eclipse-directory>/plugins/com.android.ide.eclipse.adt_x.x.x.jar
-- <eclipse-directory>/plugins/com.android.ide.eclipse.common_x.x.x.jar
-- <eclipse-directory>/plugins/com.android.ide.eclipse.editors_x.x.x.jar
-
-This will leave you with only the DDMS plugin installed in your Eclipse
-distribution.
-
-
--------------------------------------
-2- Setting up the ADT/Common project
--------------------------------------
-
-- Download the ADT/Common/Editors source.
-
-- From the SDK, copy the following jars:
- * androidprefs.jar => com.android.ide.eclipse.adt folder.
- * jarutils.jar => com.android.ide.eclipse.adt folder.
- * ping.jar => com.android.ide.eclipse.common folder.
- * androidprefs.jar => com.android.ide.eclipse.common folder.
-
-- Create a java project from existing source for both the ADT plugin and the
- common plugin.
-
-- In the Package Explorer, right click the projects and choose
- PDE Tools > Convert Projects to Plug-in Project...
-
-- Select your projects in the dialog box and click OK.
-
-- In the Package Explorer, for ADT and common, right click the jar files mentioned above
- and choose Build Path > Add to Build Path
-
-At this point the projects will compile.
-
-To launch the projects, open the Run/Debug Dialog and create an "Eclipse
-Application" launch configuration.
-
-Additionnaly, another feature containing the Android Editors Plugin
-(com.android.ide.eclipse.editors) is available.
-
-- Make sure the common project is present in your workspace as the Editors
- plugin depends on this plugin. Alternatively, you can have the offical ADT
- feature installed in your Eclipse distribution.
-- Create a java project from existing source for the Editors project.
-- In the Package Explorer, right click the project and choose
- PDE Tools > Convert Projects to Plug-in Project...
-- Select your project in the dialog box and click OK.
-
-Create an "Eclipse Application" launch configuration to test the plugin.
-
--------------------------------------
-3- Setting up the Editors project
--------------------------------------
-
-The "editors" plugin is optional. You can use ADT to develop Android
-applications without the XML editor support. When this plugin is present, it
-offers several customized form-based XML editors and one graphical layout
-editor.
-
-At the time of this release (Android 0.9 SDK), some of the supporting libraries
-still need some cleanup and are currently only provided as JAR files.
-
-- Download the ADT/Common/Editors source.
-
-- From the source archives, copy the following jars:
- * ninepatch.jar => com.android.ide.eclipse.editors folder.
- * layoutlib_utils.jar => com.android.ide.eclipse.editors folder.
- * layoutlib_api.jar => com.android.ide.eclipse.editors folder.
-
-- From http://kxml.sourceforge.net/ download:
- * kXML2-2.3.0.jar => com.android.ide.eclipse.editors folder.
-
-- Create a java project from existing source for both the editors plugin.
-
-- In the Package Explorer, right click the project and choose
- PDE Tools > Convert Projects to Plug-in Project...
-
-- Select your project in the dialog box and click OK.
-
-- In the Package Explorer for editors, right click the jar files mentioned
- above and choose Build Path > Add to Build Path
-
-To launch the projects, reuse the "Eclipse Application" launch configuration
-created for ADT.
-
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/launch/AndroidLaunchController.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/launch/AndroidLaunchController.java
index 04393c9..c08c0f4 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/launch/AndroidLaunchController.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/launch/AndroidLaunchController.java
@@ -35,6 +35,7 @@
import com.android.ide.eclipse.adt.project.ApkInstallManager;
import com.android.ide.eclipse.adt.project.ProjectHelper;
import com.android.ide.eclipse.adt.sdk.Sdk;
+import com.android.ide.eclipse.adt.wizards.actions.AvdManagerAction;
import com.android.ide.eclipse.common.project.AndroidManifestParser;
import com.android.ide.eclipse.common.project.BaseProjectHelper;
import com.android.prefs.AndroidLocation.AndroidLocationException;
@@ -64,6 +65,9 @@
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
import java.io.BufferedReader;
import java.io.IOException;
@@ -465,17 +469,7 @@
// we are going to take the closest AVD. ie a compatible AVD that has the API level
// closest to the project target.
- AvdInfo[] avds = avdManager.getValidAvds();
- AvdInfo defaultAvd = null;
- for (AvdInfo avd : avds) {
- if (projectTarget.isCompatibleBaseFor(avd.getTarget())) {
- if (defaultAvd == null ||
- avd.getTarget().getApiVersionNumber() <
- defaultAvd.getTarget().getApiVersionNumber()) {
- defaultAvd = avd;
- }
- }
- }
+ AvdInfo defaultAvd = findMatchingAvd(avdManager, projectTarget);
if (defaultAvd != null) {
response.setAvdToLaunch(defaultAvd);
@@ -487,13 +481,48 @@
continueLaunch(response, project, launch, launchInfo, config);
return;
} else {
- // FIXME: ask the user if he wants to create a AVD.
- // we found no compatible AVD.
- AdtPlugin.printErrorToConsole(project, String.format(
- "Failed to find an AVD compatible with target '%1$s'. Launch aborted.",
+ AdtPlugin.printToConsole(project, String.format(
+ "Failed to find an AVD compatible with target '%1$s'.",
projectTarget.getName()));
- stopLaunch(launchInfo);
- return;
+
+ final Display display = AdtPlugin.getDisplay();
+ final int[] result = new int[] { Window.CANCEL };
+ // ask the user to create a new one.
+ display.syncExec(new Runnable() {
+ public void run() {
+ Shell shell = display.getActiveShell();
+ if (MessageDialog.openQuestion(shell, "AVD Error",
+ "No Compatible targets were found. Do you wish to create one?")) {
+ AvdManagerAction action = new AvdManagerAction();
+ action.run(null /*action*/);
+ result[0] = action.getDialogResult();
+ }
+ }
+ });
+ if (result[0] == Window.CANCEL) {
+ AdtPlugin.printErrorToConsole(project, String.format("Launch aborted."));
+ stopLaunch(launchInfo);
+ return;
+ } else {
+ // attempt to reload the AVDs and find one compatible.
+ defaultAvd = findMatchingAvd(avdManager, projectTarget);
+
+ if (defaultAvd == null) {
+ AdtPlugin.printErrorToConsole(project, String.format(
+ "Still no compatible AVDs with target '%1$s': Aborting launch.",
+ projectTarget.getName()));
+ stopLaunch(launchInfo);
+ } else {
+ response.setAvdToLaunch(defaultAvd);
+
+ AdtPlugin.printToConsole(project, String.format(
+ "Launching new emulator with compatible AVD '%1$s'",
+ defaultAvd.getName()));
+
+ continueLaunch(response, project, launch, launchInfo, config);
+ return;
+ }
+ }
}
} else if (hasDevice == false && compatibleRunningAvds.size() == 1) {
Entry<IDevice, AvdInfo> e = compatibleRunningAvds.entrySet().iterator().next();
@@ -557,6 +586,26 @@
}
});
}
+
+ /**
+ * @param avdManager
+ * @param projectTarget
+ * @return
+ */
+ private AvdInfo findMatchingAvd(AvdManager avdManager, final IAndroidTarget projectTarget) {
+ AvdInfo[] avds = avdManager.getValidAvds();
+ AvdInfo defaultAvd = null;
+ for (AvdInfo avd : avds) {
+ if (projectTarget.isCompatibleBaseFor(avd.getTarget())) {
+ if (defaultAvd == null ||
+ avd.getTarget().getApiVersionNumber() <
+ defaultAvd.getTarget().getApiVersionNumber()) {
+ defaultAvd = avd;
+ }
+ }
+ }
+ return defaultAvd;
+ }
/**
* Continues the launch based on the DeviceChooser response.
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/wizards/avdmanager/AvdManagerListPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/wizards/avdmanager/AvdManagerListPage.java
index a7691ca..6444608 100755
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/wizards/avdmanager/AvdManagerListPage.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/wizards/avdmanager/AvdManagerListPage.java
@@ -144,8 +144,6 @@
* Creates the AVD selector and refresh & delete buttons.
*/
private void createAvdGroup(Composite parent) {
- int col = 0;
-
final Composite grid2 = new Composite(parent, SWT.NONE);
grid2.setLayout(new GridLayout(2, false /*makeColumnsEqualWidth*/));
grid2.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
diff --git a/eclipse/source_package_readme.txt b/eclipse/source_package_readme.txt
deleted file mode 100644
index 456bae7..0000000
--- a/eclipse/source_package_readme.txt
+++ /dev/null
@@ -1,49 +0,0 @@
-HOW TO PACKAGE THE SOURCE OF THE PLUGINS FOR RELEASE.
-
-Note: this is only useful before we move to the public source repository, after which this will
-be obsolete.
-
-The source archive must contains:
-1/ Source of the EPL plugins that are released.
-2/ Any closed source dependencies that were created by Google.
-3/ The readme file explaining how to build the plugins.
-
-
-1/ PLUGIN SOURCE
-
-The Plugins that are currently released and that are EPL are:
-- Android Developer Tools => com.android.ide.eclipse.adt
-- Common => com.android.ide.eclipse.common
-- Android Editors => com.android.ide.eclipse.editors
-
-All three plugins are located in
- device/tools/eclipse/plugins/
-
-Before packing them up, it is important to:
-- remove the bin directory if it exists
-- remove any symlinks to jar files from the top level folder of each plugin
-
-2/ PLUGIN DEPENDENCIES
-
-The plugin dependencies are jar files embedded in some of the plugins. Some of those jar files
-are android libraries for which the source code is not yet being released (They will be released
-under the APL).
-
-Those libraries are not part of the SDK, and need to be taken from a engineering build.
-They will be located in
- device/out/host/<platform>/framework/
-
-The libraries to copy are:
- - layoutlib_api.jar
- - layoutlib_utils.jar
- - ninepatch.jar
-
-They should be placed in a "libs" folder in the source archive.
-
-3/ README
-
-In the source archive, at the top level, needs to be present a file explaining how to compile
-the plugins.
-
-This file is located at:
- device/tools/eclipse/plugins/README.txt
\ No newline at end of file