aboutsummaryrefslogtreecommitdiffstats
path: root/sdkmanager
diff options
context:
space:
mode:
authorRaphael Moll <ralf@android.com>2012-11-16 21:57:34 -0800
committerRaphael Moll <ralf@android.com>2012-11-26 13:46:35 -0800
commit8e151ab957b82e8d0573ac0768f3bd4424caaf30 (patch)
treec004ea07d8b5da196ddbd5fc3e10f9a6e7f53279 /sdkmanager
parent69d33c68eab8a49867c2cd9618f0d3d380ab2857 (diff)
downloadsdk-8e151ab957b82e8d0573ac0768f3bd4424caaf30.zip
sdk-8e151ab957b82e8d0573ac0768f3bd4424caaf30.tar.gz
sdk-8e151ab957b82e8d0573ac0768f3bd4424caaf30.tar.bz2
Fix refresh issue in the AVD Manager.
In tools 21.0.0, hitting refrehs in the AVD Manager will create the list display to blink rapidly several times in a row. Same happens when a new AVD is created from a device. The issue is that the DeviceManager reparses and rebuilds its internal lists from scratch for every single call to getDevices() and getDeviceStatus(). Each time it notifies the listeners, and consequently the AVD Manager rebuilds its table. 2 fixes for that: - First use a boolean guard to prevent recursive refreshes of the avd manager table in AvdSelector. - Second fix DeviceManager to not rebuilt its lists all the time. This also changes DeviceManager so that callers create one instance that contains all the lists and there no static data shared between the instances. This is more deterministic. It shifts the responsibility to the callers to pass around the same instance if they want the data to remain consistent. Change-Id: Ia0c104395fe599071892e24bc234f8cffde9f635
Diffstat (limited to 'sdkmanager')
-rw-r--r--sdkmanager/libs/sdklib/src/com/android/sdklib/devices/DeviceManager.java258
-rw-r--r--sdkmanager/libs/sdklib/src/com/android/sdklib/internal/avd/AvdManager.java76
-rwxr-xr-xsdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/AvdManagerPage.java6
-rwxr-xr-xsdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/AvdManagerWindowImpl1.java5
-rwxr-xr-xsdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/DeviceManagerPage.java28
-rw-r--r--sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdCreationDialog.java13
-rw-r--r--sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdSelector.java37
-rw-r--r--sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdStartDialog.java4
-rw-r--r--sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/DeviceCreationDialog.java2
9 files changed, 246 insertions, 183 deletions
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/devices/DeviceManager.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/devices/DeviceManager.java
index 37b6876..c17a4df 100644
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/devices/DeviceManager.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/devices/DeviceManager.java
@@ -17,6 +17,7 @@
package com.android.sdklib.devices;
import com.android.SdkConstants;
+import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
import com.android.prefs.AndroidLocation;
import com.android.prefs.AndroidLocation.AndroidLocationException;
@@ -56,20 +57,26 @@ import javax.xml.transform.TransformerFactoryConfigurationError;
*/
public class DeviceManager {
- private final static String sDeviceProfilesProp = "DeviceProfiles";
- private final static Pattern sPathPropertyPattern = Pattern.compile("^" + PkgProps.EXTRA_PATH
- + "=" + sDeviceProfilesProp + "$");
+ private static final String DEVICE_PROFILES_PROP = "DeviceProfiles";
+ private static final Pattern PATH_PROPERTY_PATTERN =
+ Pattern.compile("^" + PkgProps.EXTRA_PATH + "=" + DEVICE_PROFILES_PROP + "$");
private ILogger mLog;
- // Vendor devices can't be a static list since they change based on the SDK
- // Location
private List<Device> mVendorDevices;
- // Keeps track of where the currently loaded vendor devices were loaded from
- private String mVendorDevicesLocation = "";
- private static List<Device> mUserDevices;
- private static List<Device> mDefaultDevices;
- private static final Object sLock = new Object();
- private static final List<DevicesChangeListener> sListeners =
- new ArrayList<DevicesChangeListener>();
+ private List<Device> mUserDevices;
+ private List<Device> mDefaultDevices;
+ private final Object mLock = new Object();
+ private final List<DevicesChangedListener> sListeners =
+ new ArrayList<DevicesChangedListener>();
+ private final String mOsSdkPath;
+
+ /** getDevices() flag to list user devices. */
+ public static final int USER_DEVICES = 1;
+ /** getDevices() flag to list default devices. */
+ public static final int DEFAULT_DEVICES = 2;
+ /** getDevices() flag to list vendor devices. */
+ public static final int VENDOR_DEVICES = 4;
+ /** getDevices() flag to list all devices. */
+ public static final int ALL_DEVICES = USER_DEVICES | DEFAULT_DEVICES | VENDOR_DEVICES;
public static enum DeviceStatus {
/**
@@ -86,10 +93,26 @@ public class DeviceManager {
MISSING;
}
- // TODO: Refactor this to look more like AvdManager so that we don't have
- // multiple instances in the same application, which forces us to parse
- // the XML multiple times when we don't have to.
- public DeviceManager(ILogger log) {
+ /**
+ * Creates a new instance of DeviceManager.
+ *
+ * @param osSdkPath Path to the current SDK. If null or invalid, vendor devices are ignored.
+ * @param log SDK logger instance. Should be non-null.
+ */
+ public static DeviceManager createInstance(@Nullable String osSdkPath, @NonNull ILogger log) {
+ // TODO consider using a cache and reusing the same instance of the device manager
+ // for the same manager/log combo.
+ return new DeviceManager(osSdkPath, log);
+ }
+
+ /**
+ * Creates a new instance of DeviceManager.
+ *
+ * @param osSdkPath Path to the current SDK. If null or invalid, vendor devices are ignored.
+ * @param log SDK logger instance. Should be non-null.
+ */
+ private DeviceManager(@Nullable String osSdkPath, @NonNull ILogger log) {
+ mOsSdkPath = osSdkPath;
mLog = log;
}
@@ -97,11 +120,11 @@ public class DeviceManager {
* Interface implemented by objects which want to know when changes occur to the {@link Device}
* lists.
*/
- public static interface DevicesChangeListener {
+ public static interface DevicesChangedListener {
/**
* Called after one of the {@link Device} lists has been updated.
*/
- public void onDevicesChange();
+ public void onDevicesChanged();
}
/**
@@ -109,7 +132,7 @@ public class DeviceManager {
*
* @param listener The listener to add. Ignored if already registered.
*/
- public void registerListener(DevicesChangeListener listener) {
+ public void registerListener(DevicesChangedListener listener) {
if (listener != null) {
synchronized (sListeners) {
if (!sListeners.contains(listener)) {
@@ -125,15 +148,14 @@ public class DeviceManager {
*
* @param listener The listener to remove.
*/
- public boolean unregisterListener(DevicesChangeListener listener) {
+ public boolean unregisterListener(DevicesChangedListener listener) {
synchronized (sListeners) {
return sListeners.remove(listener);
}
}
- public DeviceStatus getDeviceStatus(
- @Nullable String sdkLocation, String name, String manufacturer, int hashCode) {
- Device d = getDevice(sdkLocation, name, manufacturer);
+ public DeviceStatus getDeviceStatus(String name, String manufacturer, int hashCode) {
+ Device d = getDevice(name, manufacturer);
if (d == null) {
return DeviceStatus.MISSING;
} else {
@@ -141,46 +163,64 @@ public class DeviceManager {
}
}
- public Device getDevice(@Nullable String sdkLocation, String name, String manufacturer) {
- List<Device> devices;
- if (sdkLocation != null) {
- devices = getDevices(sdkLocation);
- } else {
- devices = new ArrayList<Device>(getDefaultDevices());
- devices.addAll(getUserDevices());
- }
- for (Device d : devices) {
- if (d.getName().equals(name) && d.getManufacturer().equals(manufacturer)) {
- return d;
+ public Device getDevice(String name, String manufacturer) {
+ initDevicesLists();
+ for (List<?> devices :
+ new List<?>[] { mUserDevices, mDefaultDevices, mVendorDevices } ) {
+ if (devices != null) {
+ @SuppressWarnings("unchecked") List<Device> devicesList = (List<Device>) devices;
+ for (Device d : devicesList) {
+ if (d.getName().equals(name) && d.getManufacturer().equals(manufacturer)) {
+ return d;
+ }
+ }
}
}
return null;
}
/**
- * Returns both vendor provided and user created {@link Device}s.
+ * Returns the known {@link Device} list.
*
- * @param sdkLocation Location of the Android SDK
- * @return A list of both vendor and user provided {@link Device}s
+ * @param deviceFilter A combination of USER_DEVICES, VENDOR_DEVICES and DEFAULT_DEVICES
+ * or the constant ALL_DEVICES.
+ * @return A copy of the list of {@link Device}s. Can be empty but not null.
*/
- public List<Device> getDevices(String sdkLocation) {
- List<Device> devices = new ArrayList<Device>(getVendorDevices(sdkLocation));
- devices.addAll(getDefaultDevices());
- devices.addAll(getUserDevices());
+ public List<Device> getDevices(int deviceFilter) {
+ initDevicesLists();
+ List<Device> devices = new ArrayList<Device>();
+ if (mUserDevices != null && (deviceFilter & USER_DEVICES) != 0) {
+ devices.addAll(mUserDevices);
+ }
+ if (mDefaultDevices != null && (deviceFilter & DEFAULT_DEVICES) != 0) {
+ devices.addAll(mDefaultDevices);
+ }
+ if (mVendorDevices != null && (deviceFilter & VENDOR_DEVICES) != 0) {
+ devices.addAll(mVendorDevices);
+ }
return Collections.unmodifiableList(devices);
}
+ private void initDevicesLists() {
+ boolean changed = initDefaultDevices();
+ changed |= initVendorDevices();
+ changed |= initUserDevices();
+ if (changed) {
+ notifyListeners();
+ }
+ }
+
/**
- * Gets the {@link List} of {@link Device}s packaged with the SDK.
- *
- * @return The {@link List} of default {@link Device}s
+ * Initializes the {@link Device}s packaged with the SDK.
+ * @return True if the list has changed.
*/
- public List<Device> getDefaultDevices() {
- synchronized (sLock) {
+ private boolean initDefaultDevices() {
+ synchronized (mLock) {
if (mDefaultDevices == null) {
try {
mDefaultDevices = DeviceParser.parse(
DeviceManager.class.getResourceAsStream(SdkConstants.FN_DEVICES_XML));
+ return true;
} catch (IllegalStateException e) {
// The device builders can throw IllegalStateExceptions if
// build gets called before everything is properly setup
@@ -190,65 +230,64 @@ public class DeviceManager {
mLog.error(null, "Error reading default devices");
mDefaultDevices = new ArrayList<Device>();
}
- notifyListeners();
}
}
- return Collections.unmodifiableList(mDefaultDevices);
+ return false;
}
/**
- * Returns all vendor-provided {@link Device}s
- *
- * @param sdkLocation Location of the Android SDK
- * @return A list of vendor-provided {@link Device}s
+ * Initializes all vendor-provided {@link Device}s.
+ * @return True if the list has changed.
*/
- public List<Device> getVendorDevices(String sdkLocation) {
- synchronized (sLock) {
- if (mVendorDevices == null || !mVendorDevicesLocation.equals(sdkLocation)) {
- mVendorDevicesLocation = sdkLocation;
- List<Device> devices = new ArrayList<Device>();
-
- // Load devices from tools folder
- File toolsDevices = new File(sdkLocation, SdkConstants.OS_SDK_TOOLS_LIB_FOLDER +
- File.separator + SdkConstants.FN_DEVICES_XML);
- if (toolsDevices.isFile()) {
- devices.addAll(loadDevices(toolsDevices));
- }
+ private boolean initVendorDevices() {
+ synchronized (mLock) {
+ if (mVendorDevices == null) {
+ mVendorDevices = new ArrayList<Device>();
+
+ if (mOsSdkPath != null) {
+ // Load devices from tools folder
+ File toolsDevices = new File(mOsSdkPath,
+ SdkConstants.OS_SDK_TOOLS_LIB_FOLDER +
+ File.separator +
+ SdkConstants.FN_DEVICES_XML);
+ if (toolsDevices.isFile()) {
+ mVendorDevices.addAll(loadDevices(toolsDevices));
+ }
- // Load devices from vendor extras
- File extrasFolder = new File(sdkLocation, SdkConstants.FD_EXTRAS);
- List<File> deviceDirs = getExtraDirs(extrasFolder);
- for (File deviceDir : deviceDirs) {
- File deviceXml = new File(deviceDir, SdkConstants.FN_DEVICES_XML);
- if (deviceXml.isFile()) {
- devices.addAll(loadDevices(deviceXml));
+ // Load devices from vendor extras
+ File extrasFolder = new File(mOsSdkPath, SdkConstants.FD_EXTRAS);
+ List<File> deviceDirs = getExtraDirs(extrasFolder);
+ for (File deviceDir : deviceDirs) {
+ File deviceXml = new File(deviceDir, SdkConstants.FN_DEVICES_XML);
+ if (deviceXml.isFile()) {
+ mVendorDevices.addAll(loadDevices(deviceXml));
+ }
}
+ return true;
}
- mVendorDevices = devices;
- notifyListeners();
}
}
- return Collections.unmodifiableList(mVendorDevices);
+ return false;
}
/**
- * Returns all user-created {@link Device}s
- *
- * @return All user-created {@link Device}s
+ * Initializes all user-created {@link Device}s
+ * @return True if the list has changed.
*/
- public List<Device> getUserDevices() {
- synchronized (sLock) {
+ private boolean initUserDevices() {
+ synchronized (mLock) {
if (mUserDevices == null) {
// User devices should be saved out to
// $HOME/.android/devices.xml
mUserDevices = new ArrayList<Device>();
File userDevicesFile = null;
try {
- userDevicesFile = new File(AndroidLocation.getFolder(),
+ userDevicesFile = new File(
+ AndroidLocation.getFolder(),
SdkConstants.FN_DEVICES_XML);
if (userDevicesFile.exists()) {
mUserDevices.addAll(DeviceParser.parse(userDevicesFile));
- notifyListeners();
+ return true;
}
} catch (AndroidLocationException e) {
mLog.warning("Couldn't load user devices: %1$s", e.getMessage());
@@ -262,7 +301,8 @@ public class DeviceManager {
renamedConfig = new File(base + '.' + (i++));
}
mLog.error(null, "Error parsing %1$s, backing up to %2$s",
- userDevicesFile.getAbsolutePath(), renamedConfig.getAbsolutePath());
+ userDevicesFile.getAbsolutePath(),
+ renamedConfig.getAbsolutePath());
userDevicesFile.renameTo(renamedConfig);
}
} catch (ParserConfigurationException e) {
@@ -274,42 +314,52 @@ public class DeviceManager {
}
}
}
- return Collections.unmodifiableList(mUserDevices);
+ return false;
}
public void addUserDevice(Device d) {
- synchronized (sLock) {
+ boolean changed = false;
+ synchronized (mLock) {
if (mUserDevices == null) {
- getUserDevices();
+ initUserDevices();
+ assert mUserDevices != null;
}
- mUserDevices.add(d);
+ if (mUserDevices != null) {
+ mUserDevices.add(d);
+ }
+ changed = true;
+ }
+ if (changed) {
+ notifyListeners();
}
- notifyListeners();
}
public void removeUserDevice(Device d) {
- synchronized (sLock) {
+ synchronized (mLock) {
if (mUserDevices == null) {
- getUserDevices();
+ initUserDevices();
+ assert mUserDevices != null;
}
- Iterator<Device> it = mUserDevices.iterator();
- while (it.hasNext()) {
- Device userDevice = it.next();
- if (userDevice.getName().equals(d.getName())
- && userDevice.getManufacturer().equals(d.getManufacturer())) {
- it.remove();
- notifyListeners();
- break;
- }
+ if (mUserDevices != null) {
+ Iterator<Device> it = mUserDevices.iterator();
+ while (it.hasNext()) {
+ Device userDevice = it.next();
+ if (userDevice.getName().equals(d.getName())
+ && userDevice.getManufacturer().equals(d.getManufacturer())) {
+ it.remove();
+ notifyListeners();
+ return;
+ }
+ }
}
}
}
public void replaceUserDevice(Device d) {
- synchronized (sLock) {
+ synchronized (mLock) {
if (mUserDevices == null) {
- getUserDevices();
+ initUserDevices();
}
removeUserDevice(d);
addUserDevice(d);
@@ -339,7 +389,7 @@ public class DeviceManager {
return;
}
- synchronized (sLock) {
+ synchronized (mLock) {
if (mUserDevices.size() > 0) {
try {
DeviceWriter.writeToXml(new FileOutputStream(userDevicesFile), mUserDevices);
@@ -446,8 +496,8 @@ public class DeviceManager {
private void notifyListeners() {
synchronized (sListeners) {
- for (DevicesChangeListener listener : sListeners) {
- listener.onDevicesChange();
+ for (DevicesChangedListener listener : sListeners) {
+ listener.onDevicesChanged();
}
}
}
@@ -483,7 +533,7 @@ public class DeviceManager {
try {
String line;
while ((line = propertiesReader.readLine()) != null) {
- Matcher m = sPathPropertyPattern.matcher(line);
+ Matcher m = PATH_PROPERTY_PATTERN.matcher(line);
if (m.matches()) {
return true;
}
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/avd/AvdManager.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/avd/AvdManager.java
index 6b219d3..5f35661 100644
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/avd/AvdManager.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/avd/AvdManager.java
@@ -59,7 +59,7 @@ public class AvdManager {
/**
* Exception thrown when something is wrong with a target path.
*/
- private final static class InvalidTargetPathException extends Exception {
+ private static final class InvalidTargetPathException extends Exception {
private static final long serialVersionUID = 1L;
InvalidTargetPathException(String message) {
@@ -69,26 +69,26 @@ public class AvdManager {
public static final String AVD_FOLDER_EXTENSION = ".avd"; //$NON-NLS-1$
- public final static String AVD_INFO_PATH = "path"; //$NON-NLS-1$
- public final static String AVD_INFO_TARGET = "target"; //$NON-NLS-1$
+ public static final String AVD_INFO_PATH = "path"; //$NON-NLS-1$
+ public static final String AVD_INFO_TARGET = "target"; //$NON-NLS-1$
/**
* AVD/config.ini key name representing the abi type of the specific avd
*
*/
- public final static String AVD_INI_ABI_TYPE = "abi.type"; //$NON-NLS-1$
+ public static final String AVD_INI_ABI_TYPE = "abi.type"; //$NON-NLS-1$
/**
* AVD/config.ini key name representing the CPU architecture of the specific avd
*
*/
- public final static String AVD_INI_CPU_ARCH = "hw.cpu.arch"; //$NON-NLS-1$
+ public static final String AVD_INI_CPU_ARCH = "hw.cpu.arch"; //$NON-NLS-1$
/**
* AVD/config.ini key name representing the CPU architecture of the specific avd
*
*/
- public final static String AVD_INI_CPU_MODEL = "hw.cpu.model"; //$NON-NLS-1$
+ public static final String AVD_INI_CPU_MODEL = "hw.cpu.model"; //$NON-NLS-1$
/**
* AVD/config.ini key name representing the manufacturer of the device this avd was based on.
@@ -106,19 +106,19 @@ public class AvdManager {
*
* @see #NUMERIC_SKIN_SIZE
*/
- public final static String AVD_INI_SKIN_PATH = "skin.path"; //$NON-NLS-1$
+ public static final String AVD_INI_SKIN_PATH = "skin.path"; //$NON-NLS-1$
/**
* AVD/config.ini key name representing an UI name for the skin.
* This config key is ignored by the emulator. It is only used by the SDK manager or
* tools to give a friendlier name to the skin.
* If missing, use the {@link #AVD_INI_SKIN_PATH} key instead.
*/
- public final static String AVD_INI_SKIN_NAME = "skin.name"; //$NON-NLS-1$
+ public static final String AVD_INI_SKIN_NAME = "skin.name"; //$NON-NLS-1$
/**
* AVD/config.ini key name representing whether a dynamic skin should be displayed.
*/
- public final static String AVD_INI_SKIN_DYNAMIC = "skin.dynamic"; //$NON-NLS-1$
+ public static final String AVD_INI_SKIN_DYNAMIC = "skin.dynamic"; //$NON-NLS-1$
/**
* AVD/config.ini key name representing the path to the sdcard file.
@@ -127,7 +127,7 @@ public class AvdManager {
*
* @see #SDCARD_IMG
*/
- public final static String AVD_INI_SDCARD_PATH = "sdcard.path"; //$NON-NLS-1$
+ public static final String AVD_INI_SDCARD_PATH = "sdcard.path"; //$NON-NLS-1$
/**
* AVD/config.ini key name representing the size of the SD card.
* This property is for UI purposes only. It is not used by the emulator.
@@ -135,7 +135,7 @@ public class AvdManager {
* @see #SDCARD_SIZE_PATTERN
* @see #parseSdcardSize(String, String[])
*/
- public final static String AVD_INI_SDCARD_SIZE = "sdcard.size"; //$NON-NLS-1$
+ public static final String AVD_INI_SDCARD_SIZE = "sdcard.size"; //$NON-NLS-1$
/**
* AVD/config.ini key name representing the first path where the emulator looks
* for system images. Typically this is the path to the add-on system image or
@@ -143,80 +143,80 @@ public class AvdManager {
* <p/>
* The emulator looks at {@link #AVD_INI_IMAGES_1} before {@link #AVD_INI_IMAGES_2}.
*/
- public final static String AVD_INI_IMAGES_1 = "image.sysdir.1"; //$NON-NLS-1$
+ public static final String AVD_INI_IMAGES_1 = "image.sysdir.1"; //$NON-NLS-1$
/**
* AVD/config.ini key name representing the second path where the emulator looks
* for system images. Typically this is the path to the platform system image.
*
* @see #AVD_INI_IMAGES_1
*/
- public final static String AVD_INI_IMAGES_2 = "image.sysdir.2"; //$NON-NLS-1$
+ public static final String AVD_INI_IMAGES_2 = "image.sysdir.2"; //$NON-NLS-1$
/**
* AVD/config.ini key name representing the presence of the snapshots file.
* This property is for UI purposes only. It is not used by the emulator.
*
* @see #SNAPSHOTS_IMG
*/
- public final static String AVD_INI_SNAPSHOT_PRESENT = "snapshot.present"; //$NON-NLS-1$
+ public static final String AVD_INI_SNAPSHOT_PRESENT = "snapshot.present"; //$NON-NLS-1$
/**
* AVD/config.ini key name representing whether hardware OpenGLES emulation is enabled
*/
- public final static String AVD_INI_GPU_EMULATION = "hw.gpu.enabled"; //$NON-NLS-1$
+ public static final String AVD_INI_GPU_EMULATION = "hw.gpu.enabled"; //$NON-NLS-1$
/**
* AVD/config.ini key name representing how to emulate the front facing camera
*/
- public final static String AVD_INI_CAMERA_FRONT = "hw.camera.front"; //$NON-NLS-1$
+ public static final String AVD_INI_CAMERA_FRONT = "hw.camera.front"; //$NON-NLS-1$
/**
* AVD/config.ini key name representing how to emulate the rear facing camera
*/
- public final static String AVD_INI_CAMERA_BACK = "hw.camera.back"; //$NON-NLS-1$
+ public static final String AVD_INI_CAMERA_BACK = "hw.camera.back"; //$NON-NLS-1$
/**
* AVD/config.ini key name representing the amount of RAM the emulated device should have
*/
- public final static String AVD_INI_RAM_SIZE = "hw.ramSize";
+ public static final String AVD_INI_RAM_SIZE = "hw.ramSize";
/**
* AVD/config.ini key name representing the amount of memory available to applications by default
*/
- public final static String AVD_INI_VM_HEAP_SIZE = "vm.heapSize";
+ public static final String AVD_INI_VM_HEAP_SIZE = "vm.heapSize";
/**
* AVD/config.ini key name representing the size of the data partition
*/
- public final static String AVD_INI_DATA_PARTITION_SIZE = "disk.dataPartition.size";
+ public static final String AVD_INI_DATA_PARTITION_SIZE = "disk.dataPartition.size";
/**
* AVD/config.ini key name representing the hash of the device this AVD is based on
*/
- public final static String AVD_INI_DEVICE_HASH = "hw.device.hash";
+ public static final String AVD_INI_DEVICE_HASH = "hw.device.hash";
/**
* Pattern to match pixel-sized skin "names", e.g. "320x480".
*/
- public final static Pattern NUMERIC_SKIN_SIZE = Pattern.compile("([0-9]{2,})x([0-9]{2,})"); //$NON-NLS-1$
+ public static final Pattern NUMERIC_SKIN_SIZE = Pattern.compile("([0-9]{2,})x([0-9]{2,})"); //$NON-NLS-1$
- private final static String USERDATA_IMG = "userdata.img"; //$NON-NLS-1$
- final static String CONFIG_INI = "config.ini"; //$NON-NLS-1$
- private final static String SDCARD_IMG = "sdcard.img"; //$NON-NLS-1$
- private final static String SNAPSHOTS_IMG = "snapshots.img"; //$NON-NLS-1$
+ private static final String USERDATA_IMG = "userdata.img"; //$NON-NLS-1$
+ static final String CONFIG_INI = "config.ini"; //$NON-NLS-1$
+ private static final String SDCARD_IMG = "sdcard.img"; //$NON-NLS-1$
+ private static final String SNAPSHOTS_IMG = "snapshots.img"; //$NON-NLS-1$
- final static String INI_EXTENSION = ".ini"; //$NON-NLS-1$
- private final static Pattern INI_NAME_PATTERN = Pattern.compile("(.+)\\" + //$NON-NLS-1$
+ static final String INI_EXTENSION = ".ini"; //$NON-NLS-1$
+ private static final Pattern INI_NAME_PATTERN = Pattern.compile("(.+)\\" + //$NON-NLS-1$
INI_EXTENSION + "$", //$NON-NLS-1$
Pattern.CASE_INSENSITIVE);
- private final static Pattern IMAGE_NAME_PATTERN = Pattern.compile("(.+)\\.img$", //$NON-NLS-1$
+ private static final Pattern IMAGE_NAME_PATTERN = Pattern.compile("(.+)\\.img$", //$NON-NLS-1$
Pattern.CASE_INSENSITIVE);
/**
* Pattern for matching SD Card sizes, e.g. "4K" or "16M".
* Callers should use {@link #parseSdcardSize(String, String[])} instead of using this directly.
*/
- private final static Pattern SDCARD_SIZE_PATTERN = Pattern.compile("(\\d+)([KMG])"); //$NON-NLS-1$
+ private static final Pattern SDCARD_SIZE_PATTERN = Pattern.compile("(\\d+)([KMG])"); //$NON-NLS-1$
/**
* Minimal size of an SDCard image file in bytes. Currently 9 MiB.
@@ -229,19 +229,19 @@ public class AvdManager {
public static final long SDCARD_MAX_BYTE_SIZE = 1023L<<30;
/** The sdcard string represents a valid number but the size is outside of the allowed range. */
- public final static int SDCARD_SIZE_NOT_IN_RANGE = 0;
+ public static final int SDCARD_SIZE_NOT_IN_RANGE = 0;
/** The sdcard string looks like a size number+suffix but the number failed to decode. */
- public final static int SDCARD_SIZE_INVALID = -1;
+ public static final int SDCARD_SIZE_INVALID = -1;
/** The sdcard string doesn't look like a size, it might be a path instead. */
- public final static int SDCARD_NOT_SIZE_PATTERN = -2;
+ public static final int SDCARD_NOT_SIZE_PATTERN = -2;
/** Regex used to validate characters that compose an AVD name. */
- public final static Pattern RE_AVD_NAME = Pattern.compile("[a-zA-Z0-9._-]+"); //$NON-NLS-1$
+ public static final Pattern RE_AVD_NAME = Pattern.compile("[a-zA-Z0-9._-]+"); //$NON-NLS-1$
/** List of valid characters for an AVD name. Used for display purposes. */
- public final static String CHARS_AVD_NAME = "a-z A-Z 0-9 . _ -"; //$NON-NLS-1$
+ public static final String CHARS_AVD_NAME = "a-z A-Z 0-9 . _ -"; //$NON-NLS-1$
- public final static String HARDWARE_INI = "hardware.ini"; //$NON-NLS-1$
+ public static final String HARDWARE_INI = "hardware.ini"; //$NON-NLS-1$
/**
* Status returned by {@link AvdManager#isAvdNameConflicting(String)}.
@@ -1410,8 +1410,8 @@ public class AvdManager {
String hash = properties.get(AVD_INI_DEVICE_HASH);
if (deviceName != null && deviceMfctr != null && hash != null) {
int deviceHash = Integer.parseInt(hash);
- deviceStatus = (new DeviceManager(log)).getDeviceStatus(
- mSdkManager.getLocation(), deviceName, deviceMfctr, deviceHash);
+ DeviceManager devMan = DeviceManager.createInstance(mSdkManager.getLocation(), log);
+ deviceStatus = devMan.getDeviceStatus(deviceName, deviceMfctr, deviceHash);
}
}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/AvdManagerPage.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/AvdManagerPage.java
index 4d7e79e..a092550 100755
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/AvdManagerPage.java
+++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/AvdManagerPage.java
@@ -18,7 +18,7 @@ package com.android.sdkuilib.internal.repository.ui;
import com.android.prefs.AndroidLocation.AndroidLocationException;
import com.android.sdklib.devices.DeviceManager;
-import com.android.sdklib.devices.DeviceManager.DevicesChangeListener;
+import com.android.sdklib.devices.DeviceManager.DevicesChangedListener;
import com.android.sdklib.internal.avd.AvdInfo;
import com.android.sdklib.internal.avd.AvdManager;
import com.android.sdkuilib.internal.repository.UpdaterData;
@@ -44,7 +44,7 @@ import org.eclipse.swt.widgets.Label;
* page displays the actually list of AVDs and various action buttons.
*/
public class AvdManagerPage extends Composite
- implements ISdkChangeListener, DevicesChangeListener, DisposeListener {
+ implements ISdkChangeListener, DevicesChangedListener, DisposeListener {
private AvdSelector mAvdSelector;
@@ -162,7 +162,7 @@ public class AvdManagerPage extends Composite
// --- Implementation of DevicesChangeListener
@Override
- public void onDevicesChange() {
+ public void onDevicesChanged() {
mAvdSelector.refresh(false /*reload*/);
}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/AvdManagerWindowImpl1.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/AvdManagerWindowImpl1.java
index 08eed1b..e3efca6 100755
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/AvdManagerWindowImpl1.java
+++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/AvdManagerWindowImpl1.java
@@ -94,7 +94,7 @@ public class AvdManagerWindowImpl1 {
mContext = context;
mUpdaterData = new UpdaterData(osSdkRoot, sdkLog);
mOwnUpdaterData = true;
- mDeviceManager = new DeviceManager(sdkLog);
+ mDeviceManager = DeviceManager.createInstance(osSdkRoot, sdkLog);
}
/**
@@ -116,7 +116,8 @@ public class AvdManagerWindowImpl1 {
mContext = context;
mUpdaterData = updaterData;
mOwnUpdaterData = false;
- mDeviceManager = new DeviceManager(mUpdaterData.getSdkLog());
+ mDeviceManager = DeviceManager.createInstance(mUpdaterData.getOsSdkRoot(),
+ mUpdaterData.getSdkLog());
}
/**
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/DeviceManagerPage.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/DeviceManagerPage.java
index 6bac1ba..7b63d39 100755
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/DeviceManagerPage.java
+++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/DeviceManagerPage.java
@@ -18,7 +18,7 @@ package com.android.sdkuilib.internal.repository.ui;
import com.android.sdklib.devices.Device;
import com.android.sdklib.devices.DeviceManager;
-import com.android.sdklib.devices.DeviceManager.DevicesChangeListener;
+import com.android.sdklib.devices.DeviceManager.DevicesChangedListener;
import com.android.sdklib.devices.Hardware;
import com.android.sdklib.devices.Screen;
import com.android.sdklib.devices.Storage;
@@ -88,7 +88,7 @@ import java.util.regex.Pattern;
* - a filter box to do a string search on any part of the display.
*/
public class DeviceManagerPage extends Composite
- implements ISdkChangeListener, DevicesChangeListener, DisposeListener {
+ implements ISdkChangeListener, DevicesChangedListener, DisposeListener {
public interface IAvdCreatedListener {
public void onAvdCreated(AvdInfo createdAvdInfo);
@@ -355,11 +355,10 @@ public class DeviceManagerPage extends Composite
try {
mDisableRefresh = true;
disposables.addAll(fillDevices(table, boldFont, true,
- mDeviceManager.getUserDevices(),
- null));
+ mDeviceManager.getDevices(DeviceManager.USER_DEVICES)));
disposables.addAll(fillDevices(table, boldFont, false,
- mDeviceManager.getDefaultDevices(),
- mDeviceManager.getVendorDevices(mUpdaterData.getOsSdkRoot())));
+ mDeviceManager.getDevices(DeviceManager.DEFAULT_DEVICES |
+ DeviceManager.VENDOR_DEVICES)));
} finally {
mDisableRefresh = false;
}
@@ -456,19 +455,15 @@ public class DeviceManagerPage extends Composite
Table table,
Font boldFont,
boolean isUser,
- List<Device> devices1,
- List<Device> devices2) {
+ List<Device> devices) {
List<Resource> disposables = new ArrayList<Resource>();
Display display = table.getDisplay();
TextStyle boldStyle = new TextStyle();
boldStyle.font = boldFont;
-
- List<Device> devices = new ArrayList<Device>(devices1);
- if (devices2 != null) {
- devices.addAll(devices2);
- }
+ // We need the list to be be modifiable so that we can sort it.
+ devices = new ArrayList<Device>(devices);
if (isUser) {
// Just sort user devices by alphabetical name. They will show up at the top.
@@ -582,15 +577,14 @@ public class DeviceManagerPage extends Composite
}
// Constants extracted from DeviceMenuListerner -- TODO refactor somewhere else.
- @SuppressWarnings("unused")
- private static final String NEXUS = "Nexus"; //$NON-NLS-1$
+ private static final String NEXUS = "Nexus"; //$NON-NLS-1$
private static final String GENERIC = "Generic"; //$NON-NLS-1$
private static Pattern PATTERN = Pattern.compile(
"(\\d+\\.?\\d*)in (.+?)( \\(.*Nexus.*\\))?"); //$NON-NLS-1$
/**
* Returns a pretty name for the device.
*
- * Extracted from DeviceMenuListerner.
+ * Extracted from DeviceMenuListener.
* Modified to remove the leading space insertion as it doesn't render
* neatly in the avd manager. Instead added the option to add leading
* zeroes to make the string names sort properly.
@@ -828,7 +822,7 @@ public class DeviceManagerPage extends Composite
// --- Implementation of DevicesChangeListener
@Override
- public void onDevicesChange() {
+ public void onDevicesChanged() {
onRefresh();
}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdCreationDialog.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdCreationDialog.java
index 5d2a264..e88b3e8 100644
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdCreationDialog.java
+++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdCreationDialog.java
@@ -461,8 +461,8 @@ public class AvdCreationDialog extends GridDialog {
SdkManager sdkManager = mAvdManager.getSdkManager();
String location = sdkManager.getLocation();
if (sdkManager != null && location != null) {
- DeviceManager deviceManager = new DeviceManager(mSdkLog);
- List<Device> deviceList = new ArrayList<Device>(deviceManager.getDevices(location));
+ DeviceManager deviceManager = DeviceManager.createInstance(location, mSdkLog);
+ List<Device> deviceList = deviceManager.getDevices(DeviceManager.ALL_DEVICES);
// Sort
List<Device> nexus = new ArrayList<Device>(deviceList.size());
@@ -608,6 +608,9 @@ public class AvdCreationDialog extends GridDialog {
case XHIGH:
case XXHIGH:
vmHeapSize = 128;
+ break;
+ case NODPI:
+ break;
}
} else {
switch (density) {
@@ -622,7 +625,9 @@ public class AvdCreationDialog extends GridDialog {
case XHIGH:
case XXHIGH:
vmHeapSize = 64;
-
+ break;
+ case NODPI:
+ break;
}
}
mVmHeap.setText(Integer.toString(vmHeapSize));
@@ -734,6 +739,8 @@ public class AvdCreationDialog extends GridDialog {
}
}
+ @SuppressWarnings("unused")
+ @Deprecated // FIXME unused, cleanup later
private IAndroidTarget getSelectedTarget() {
IAndroidTarget[] targets = (IAndroidTarget[]) mTarget.getData();
int index = mTarget.getSelectionIndex();
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdSelector.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdSelector.java
index 42d85eb..67d161f 100644
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdSelector.java
+++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdSelector.java
@@ -115,6 +115,8 @@ public final class AvdSelector {
private final ILogger mSdkLog;
+ private boolean mInternalRefresh;
+
/**
* The display mode of the AVD Selector.
@@ -467,21 +469,29 @@ public final class AvdSelector {
* <code>false</code>.
*/
public boolean refresh(boolean reload) {
- if (reload) {
+ if (!mInternalRefresh) {
try {
- mAvdManager.reloadAvds(NullLogger.getLogger());
- } catch (AndroidLocationException e) {
- return false;
+ // Note that AvdManagerPage.onDevicesChange() will trigger a
+ // refresh while the AVDs are being reloaded so prevent from
+ // having a recursive call to here.
+ mInternalRefresh = true;
+ if (reload) {
+ try {
+ mAvdManager.reloadAvds(NullLogger.getLogger());
+ } catch (AndroidLocationException e) {
+ return false;
+ }
+ }
+
+ AvdInfo selected = getSelected();
+ fillTable(mTable);
+ setSelection(selected);
+ return true;
+ } finally {
+ mInternalRefresh = false;
}
}
-
- AvdInfo selected = getSelected();
-
- fillTable(mTable);
-
- setSelection(selected);
-
- return true;
+ return false;
}
/**
@@ -1021,7 +1031,8 @@ public final class AvdSelector {
// Overwrite the properties derived from the device and nothing else
Map<String, String> properties = new HashMap<String, String>(avdInfo.getProperties());
- List<Device> devices = (new DeviceManager(mSdkLog)).getDevices(mOsSdkPath);
+ DeviceManager devMan = DeviceManager.createInstance(mOsSdkPath, mSdkLog);
+ List<Device> devices = devMan.getDevices(DeviceManager.ALL_DEVICES);
String name = properties.get(AvdManager.AVD_INI_DEVICE_NAME);
String manufacturer = properties.get(AvdManager.AVD_INI_DEVICE_MANUFACTURER);
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdStartDialog.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdStartDialog.java
index 0c68dcf..925b0cd 100644
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdStartDialog.java
+++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdStartDialog.java
@@ -100,7 +100,7 @@ final class AvdStartDialog extends GridDialog {
mAvd = avd;
mSdkLocation = sdkLocation;
mSettingsController = settingsController;
- mDeviceManager = new DeviceManager(sdkLog);
+ mDeviceManager = DeviceManager.createInstance(mSdkLocation, sdkLog);
if (mAvd == null) {
throw new IllegalArgumentException("avd cannot be null");
}
@@ -449,7 +449,7 @@ final class AvdStartDialog extends GridDialog {
String name = properties.get(AvdManager.AVD_INI_DEVICE_NAME);
String mfctr = properties.get(AvdManager.AVD_INI_DEVICE_MANUFACTURER);
if (name != null && mfctr != null) {
- Device d = mDeviceManager.getDevice(mSdkLocation, name, mfctr);
+ Device d = mDeviceManager.getDevice(name, mfctr);
if (d != null) {
double screenSize =
d.getDefaultHardware().getScreen().getDiagonalLength();
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/DeviceCreationDialog.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/DeviceCreationDialog.java
index 0707ddc..68c4fd5 100644
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/DeviceCreationDialog.java
+++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/DeviceCreationDialog.java
@@ -143,7 +143,7 @@ public class DeviceCreationDialog extends GridDialog {
mImageFactory = imageFactory;
mDevice = device;
mManager = manager;
- mUserDevices = mManager.getUserDevices();
+ mUserDevices = mManager.getDevices(DeviceManager.USER_DEVICES);
}
/**