Automated import from //branches/master/...@140701,140701
diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/launch/AndroidLaunchConfiguration.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/launch/AndroidLaunchConfiguration.java
index 448cda6..3e610db 100644
--- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/launch/AndroidLaunchConfiguration.java
+++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/launch/AndroidLaunchConfiguration.java
@@ -32,8 +32,30 @@
      */
     public int mLaunchAction = LaunchConfigDelegate.DEFAULT_LAUNCH_ACTION;
     
-    public static final boolean AUTO_TARGET_MODE = true;
+    public enum TargetMode {
+        AUTO(true), MANUAL(false);
+        
+        private boolean mValue;
 
+        TargetMode(boolean value) {
+            mValue = value;
+        }
+        
+        public boolean getValue() {
+            return mValue;
+        }
+        
+        public static TargetMode getMode(boolean value) {
+            for (TargetMode mode : values()) {
+                if (mode.mValue == value) {
+                    return mode;
+                }
+            }
+            
+            return null;
+        }
+    }
+    
     /**
      * Target selection mode.
      * <ul>
@@ -41,7 +63,7 @@
      * <li><code>false</code>: manual mode</li>
      * </ul>
      */
-    public boolean mTargetMode = LaunchConfigDelegate.DEFAULT_TARGET_MODE;
+    public TargetMode mTargetMode = LaunchConfigDelegate.DEFAULT_TARGET_MODE;
 
     /**
      * Indicates whether the emulator should be called with -wipe-data
@@ -81,8 +103,9 @@
         }
 
         try {
-            mTargetMode = config.getAttribute(LaunchConfigDelegate.ATTR_TARGET_MODE,
-                    mTargetMode);
+            boolean value = config.getAttribute(LaunchConfigDelegate.ATTR_TARGET_MODE,
+                    mTargetMode.getValue());
+            mTargetMode = TargetMode.getMode(value);
         } catch (CoreException e) {
             // nothing to be done here, we'll use the default value
         }
diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/launch/AndroidLaunchController.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/launch/AndroidLaunchController.java
index 499cca7..5cf9669 100644
--- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/launch/AndroidLaunchController.java
+++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/launch/AndroidLaunchController.java
@@ -29,11 +29,13 @@
 import com.android.ddmlib.SyncService;
 import com.android.ddmlib.SyncService.SyncResult;
 import com.android.ide.eclipse.adt.AdtPlugin;
+import com.android.ide.eclipse.adt.launch.AndroidLaunchConfiguration.TargetMode;
 import com.android.ide.eclipse.adt.launch.DelayedLaunchInfo.InstallRetryMode;
 import com.android.ide.eclipse.adt.launch.DeviceChooserDialog.DeviceChooserResponse;
 import com.android.ide.eclipse.adt.project.ProjectHelper;
 import com.android.ide.eclipse.adt.sdk.Sdk;
 import com.android.ide.eclipse.common.project.AndroidManifestParser;
+import com.android.prefs.AndroidLocation.AndroidLocationException;
 import com.android.sdklib.IAndroidTarget;
 import com.android.sdklib.SdkManager;
 import com.android.sdklib.avd.AvdManager;
@@ -236,7 +238,7 @@
 
                 // set default target mode
                 wc.setAttribute(LaunchConfigDelegate.ATTR_TARGET_MODE,
-                        LaunchConfigDelegate.DEFAULT_TARGET_MODE);
+                        LaunchConfigDelegate.DEFAULT_TARGET_MODE.getValue());
 
                 // default AVD: None
                 wc.setAttribute(LaunchConfigDelegate.ATTR_AVD_NAME, (String) null);
@@ -332,6 +334,16 @@
         Sdk currentSdk = Sdk.getCurrent();
         AvdManager avdManager = currentSdk.getAvdManager();
         
+        // reload the AVDs to make sure we are up to date
+        try {
+            avdManager.reloadAvds();
+        } catch (AndroidLocationException e1) {
+            // this happens if the AVD Manager failed to find the folder in which the AVDs are
+            // stored. This is unlikely to happen, but if it does, we should force to go manual
+            // to allow using physical devices.
+            config.mTargetMode = TargetMode.MANUAL;
+        }
+
         // get the project target
         final IAndroidTarget projectTarget = currentSdk.getTarget(project);
         
@@ -356,7 +368,7 @@
          *           If == 1, launch the application on this AVD/device.
          */
         
-        if (config.mTargetMode == AndroidLaunchConfiguration.AUTO_TARGET_MODE) {
+        if (config.mTargetMode == TargetMode.AUTO) {
             // if we are in automatic target mode, we need to find the current devices
             IDevice[] devices = AndroidDebugBridge.getBridge().getDevices();
             
diff --git a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/launch/LaunchConfigDelegate.java b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/launch/LaunchConfigDelegate.java
index 80f62ea..db9a4ac 100644
--- a/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/launch/LaunchConfigDelegate.java
+++ b/tools/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/launch/LaunchConfigDelegate.java
@@ -18,6 +18,7 @@
 
 import com.android.ddmlib.AndroidDebugBridge;
 import com.android.ide.eclipse.adt.AdtPlugin;
+import com.android.ide.eclipse.adt.launch.AndroidLaunchConfiguration.TargetMode;
 import com.android.ide.eclipse.adt.project.ProjectHelper;
 import com.android.ide.eclipse.common.AndroidConstants;
 import com.android.ide.eclipse.common.project.AndroidManifestParser;
@@ -51,7 +52,7 @@
 
     /** Target mode parameters: true is automatic, false is manual */
     public static final String ATTR_TARGET_MODE = AdtPlugin.PLUGIN_ID + ".target"; //$NON-NLS-1$
-    public static final boolean DEFAULT_TARGET_MODE = true; //automatic mode
+    public static final TargetMode DEFAULT_TARGET_MODE = TargetMode.AUTO;
 
     /**
      * Launch action:
diff --git a/tools/sdkmanager/libs/sdklib/src/com/android/sdklib/avd/AvdManager.java b/tools/sdkmanager/libs/sdklib/src/com/android/sdklib/avd/AvdManager.java
index 65cbbe3..93577e4 100644
--- a/tools/sdkmanager/libs/sdklib/src/com/android/sdklib/avd/AvdManager.java
+++ b/tools/sdkmanager/libs/sdklib/src/com/android/sdklib/avd/AvdManager.java
@@ -177,7 +177,7 @@
     public AvdManager(SdkManager sdk, ISdkLog sdkLog) throws AndroidLocationException {
         mSdk = sdk;
         mSdkLog = sdkLog;
-        buildAvdList();
+        buildAvdList(mAvdList);
     }
 
     /**
@@ -201,6 +201,20 @@
         
         return null;
     }
+    
+    /**
+     * Reloads the AVD list.
+     * @throws AndroidLocationException if there was an error finding the location of the
+     * AVD folder.
+     */
+    public void reloadAvds() throws AndroidLocationException {
+        // build the list in a temp list first, in case the method throws an exception.
+        // It's better than deleting the whole list before reading the new one.
+        ArrayList<AvdInfo> list = new ArrayList<AvdInfo>();
+        buildAvdList(list);
+        mAvdList.clear();
+        mAvdList.addAll(list);
+    }
 
     /**
      * Creates a new AVD. It is expected that there is no existing AVD with this name already.
@@ -620,7 +634,7 @@
         }
     }
 
-    private void buildAvdList() throws AndroidLocationException {
+    private void buildAvdList(ArrayList<AvdInfo> list) throws AndroidLocationException {
         // get the Android prefs location.
         String avdRoot = AndroidLocation.getFolder() + AndroidLocation.FOLDER_AVD;
 
@@ -664,7 +678,7 @@
         for (File avd : avds) {
             AvdInfo info = parseAvdInfo(avd);
             if (info != null) {
-                mAvdList.add(info);
+                list.add(info);
                 if (avdListDebug) {
                     mSdkLog.printf("[AVD LIST DEBUG] Added AVD '%s'\n", info.getPath());
                 }