aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--androidprefs/src/com/android/prefs/AndroidLocation.java2
-rw-r--r--sdkmanager/libs/sdklib/src/com/android/sdklib/internal/avd/AvdManager.java13
-rwxr-xr-xsdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/AvdManagerPage.java15
-rwxr-xr-xsdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java43
-rwxr-xr-xsdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterWindowImpl.java23
-rw-r--r--sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdSelector.java5
6 files changed, 88 insertions, 13 deletions
diff --git a/androidprefs/src/com/android/prefs/AndroidLocation.java b/androidprefs/src/com/android/prefs/AndroidLocation.java
index 446c426..4936489 100644
--- a/androidprefs/src/com/android/prefs/AndroidLocation.java
+++ b/androidprefs/src/com/android/prefs/AndroidLocation.java
@@ -52,7 +52,7 @@ public final class AndroidLocation {
// if the above failed, we throw an exception.
if (home == null) {
throw new AndroidLocationException(
- "Unable to get the home directory. Make sure the user.home property is set up");
+ "Unable to get the home directory. Make sure the environment variable ANDROID_SDK_HOME is set up");
} else {
sPrefsLocation = home + File.separator + ".android" + File.separator;
}
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 8df6935..cc679cf 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
@@ -240,7 +240,7 @@ public final class AvdManager {
*/
public static File getIniFile(String name) throws AndroidLocationException {
String avdRoot;
- avdRoot = AndroidLocation.getFolder() + AndroidLocation.FOLDER_AVD;
+ avdRoot = getBaseAvdFolder();
return new File(avdRoot, name + INI_EXTENSION);
}
@@ -351,6 +351,15 @@ public final class AvdManager {
private final SdkManager mSdkManager;
/**
+ * Returns the base folder where AVDs are created.
+ *
+ * @throws AndroidLocationException
+ */
+ public static String getBaseAvdFolder() throws AndroidLocationException {
+ return AndroidLocation.getFolder() + AndroidLocation.FOLDER_AVD;
+ }
+
+ /**
* Creates an AVD Manager for a given SDK represented by a {@link SdkManager}.
* @param sdkManager The SDK.
* @param log The log object to receive the log of the initial loading of the AVDs.
@@ -1049,7 +1058,7 @@ public final class AvdManager {
*/
private File[] buildAvdFilesList() throws AndroidLocationException {
// get the Android prefs location.
- String avdRoot = AndroidLocation.getFolder() + AndroidLocation.FOLDER_AVD;
+ String avdRoot = AvdManager.getBaseAvdFolder();
// ensure folder validity.
File folder = new File(avdRoot);
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/AvdManagerPage.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/AvdManagerPage.java
index 8e63cf9..eb1dccd 100755
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/AvdManagerPage.java
+++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/AvdManagerPage.java
@@ -16,11 +16,14 @@
package com.android.sdkuilib.internal.repository;
+import com.android.prefs.AndroidLocation.AndroidLocationException;
+import com.android.sdklib.internal.avd.AvdManager;
import com.android.sdkuilib.internal.widgets.AvdSelector;
import com.android.sdkuilib.internal.widgets.AvdSelector.DisplayMode;
import com.android.sdkuilib.repository.UpdaterWindow.ISdkListener;
import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
@@ -50,7 +53,17 @@ public class AvdManagerPage extends Composite implements ISdkListener {
parent.setLayout(new GridLayout(1, false));
Label label = new Label(parent, SWT.NONE);
- label.setText("List of existing Android Virtual Devices:");
+ label.setLayoutData(new GridData());
+
+ try {
+ label.setText(String.format(
+ "List of existing Android Virtual Devices located at %s",
+ AvdManager.getBaseAvdFolder()));
+ } catch (AndroidLocationException e) {
+ // We shouldn't be getting here anymore: UpdaterData.initSdk() will
+ // no longer complete if the AvdManager failed to be created.
+ label.setText("Error: Please define the environment variable ANDROID_SDK_HOME.");
+ }
mAvdSelector = new AvdSelector(parent,
mUpdaterData.getOsSdkRoot(),
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java
index 5e40e5b..3d5405c 100755
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java
+++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java
@@ -18,6 +18,7 @@ package com.android.sdkuilib.internal.repository;
import com.android.prefs.AndroidLocation.AndroidLocationException;
import com.android.sdklib.ISdkLog;
+import com.android.sdklib.SdkConstants;
import com.android.sdklib.SdkManager;
import com.android.sdklib.internal.avd.AvdManager;
import com.android.sdklib.internal.repository.AddonPackage;
@@ -70,6 +71,8 @@ class UpdaterData {
private Shell mWindowShell;
+ private AndroidLocationException mAvdManagerInitError;
+
/**
* Creates a new updater data.
*
@@ -167,6 +170,36 @@ class UpdaterData {
return mWindowShell;
}
+ /**
+ * Check if any error occurred during initialization.
+ * If it did, display an error message.
+ *
+ * @return True if an error occurred, false if we should continue.
+ */
+ public boolean checkIfInitFailed() {
+ if (mAvdManagerInitError != null) {
+ String example;
+ if (SdkConstants.currentPlatform() == SdkConstants.PLATFORM_WINDOWS) {
+ example = "%USERPROFILE%"; //$NON-NLS-1$
+ } else {
+ example = "~"; //$NON-NLS-1$
+ }
+
+ MessageDialog.openError(mWindowShell,
+ "Android Virtual Devices Manager",
+ String.format(
+ "The AVD manager normally uses the user's profile directory to store " +
+ "AVD files. However it failed to find the default profile directory. " +
+ "\n" +
+ "To fix this please set the environment variable ANDROID_SDK_HOME to " +
+ "a valid path such as \"%s\".",
+ example));
+
+ return true;
+ }
+ return false;
+ }
+
// -----
/**
@@ -178,7 +211,15 @@ class UpdaterData {
mAvdManager = null; // remove the old one if needed.
mAvdManager = new AvdManager(mSdkManager, mSdkLog);
} catch (AndroidLocationException e) {
- mSdkLog.error(e, "Unable to read AVDs");
+ mSdkLog.error(e, "Unable to read AVDs: " + e.toString()); //$NON-NLS-1$
+
+ // Note: we used to continue here, but the thing is that
+ // mAvdManager==null so nothing is really going to work as
+ // expected. Let's just display an error later in checkIfInitFailed()
+ // and abort right there. This step is just too early in the SWT
+ // setup process to display a message box yet.
+
+ mAvdManagerInitError = e;
}
// notify adapters/parsers
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterWindowImpl.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterWindowImpl.java
index 4a41e4d..eda46e5 100755
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterWindowImpl.java
+++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterWindowImpl.java
@@ -106,12 +106,12 @@ public class UpdaterWindowImpl {
mAndroidSdkUpdater.open();
mAndroidSdkUpdater.layout();
- postCreate(); //$hide$ (hide from SWT designer)
-
- Display display = Display.getDefault();
- while (!mAndroidSdkUpdater.isDisposed()) {
- if (!display.readAndDispatch()) {
- display.sleep();
+ if (postCreate()) { //$hide$ (hide from SWT designer)
+ Display display = Display.getDefault();
+ while (!mAndroidSdkUpdater.isDisposed()) {
+ if (!display.readAndDispatch()) {
+ display.sleep();
+ }
}
}
@@ -257,8 +257,10 @@ public class UpdaterWindowImpl {
/**
* Once the UI has been created, initializes the content.
* This creates the pages, selects the first one, setup sources and scan for local folders.
+ *
+ * Returns true if we should show the window.
*/
- private void postCreate() {
+ private boolean postCreate() {
mUpdaterData.setWindowShell(getShell());
mTaskFactory = new ProgressTaskFactory(getShell());
mUpdaterData.setTaskFactory(mTaskFactory);
@@ -285,11 +287,18 @@ public class UpdaterWindowImpl {
setupSources();
initializeSettings();
+
+ if (mUpdaterData.checkIfInitFailed()) {
+ return false;
+ }
+
mUpdaterData.notifyListeners(true /*init*/);
if (mRequestAutoUpdate) {
mUpdaterData.updateOrInstallAll(null /*selectedArchives*/);
}
+
+ return true;
}
/**
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 60a3c82..fe686dc 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
@@ -362,6 +362,7 @@ public final class AvdSelector {
adjustColumnsWidth(mTable, column0, column1, column2, column3);
setupSelectionListener(mTable);
fillTable(mTable);
+ setEnabled(true);
}
/**
@@ -588,7 +589,8 @@ public final class AvdSelector {
* @param enabled the new enabled state.
*/
public void setEnabled(boolean enabled) {
- mIsEnabled = enabled;
+ // We can only enable widgets if the AVD Manager is defined.
+ mIsEnabled = enabled && mAvdManager != null;
mTable.setEnabled(mIsEnabled);
mRefreshButton.setEnabled(mIsEnabled);
@@ -837,6 +839,7 @@ public final class AvdSelector {
mAvdManager,
mImageFactory,
mSdkLog);
+
if (dlg.open() == Window.OK) {
refresh(false /*reload*/);
}