From 141efab32a8b8d491fa3781f55c2fddd62312a01 Mon Sep 17 00:00:00 2001 From: Raphael Date: Mon, 25 Jan 2010 14:54:40 -0800 Subject: [PATCH] SDK Updater: Install samples in correct directory. Also makes sure root directories exist before trying to install into them SDK Bug: 2384690 Change-Id: I9ed9f1b206debfc051d7b627afd5fd1fac96dd88 --- .../sdklib/internal/repository/AddonPackage.java | 13 +++++++++ .../sdklib/internal/repository/Archive.java | 17 ++++++++---- .../sdklib/internal/repository/Package.java | 22 +++++++++++++++ .../internal/repository/PlatformPackage.java | 16 ++++++++++- .../sdklib/internal/repository/SamplePackage.java | 32 ++++++++++++++++++---- 5 files changed, 88 insertions(+), 12 deletions(-) diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/AddonPackage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/AddonPackage.java index de51015f0..218ced0bd 100755 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/AddonPackage.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/AddonPackage.java @@ -280,6 +280,19 @@ public class AddonPackage extends Package return null; } + /** + * Makes sure the base /add-ons folder exists before installing. + */ + @Override + public void preInstallHook(String osSdkRoot, Archive archive) { + super.preInstallHook(osSdkRoot, archive); + + File addonsRoot = new File(osSdkRoot, SdkConstants.FD_ADDONS); + if (!addonsRoot.isDirectory()) { + addonsRoot.mkdir(); + } + } + @Override public boolean sameItemAs(Package pkg) { if (pkg instanceof AddonPackage) { diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/Archive.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/Archive.java index 876590529..7c0eef526 100755 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/Archive.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/Archive.java @@ -405,11 +405,18 @@ public class Archive implements IDescription { archiveFile = downloadFile(osSdkRoot, monitor, forceHttp); if (archiveFile != null) { - if (unarchive(osSdkRoot, archiveFile, sdkManager, monitor)) { - monitor.setResult("Installed %1$s", name); - // Delete the temp archive if it exists, only on success - deleteFileOrFolder(archiveFile); - return true; + boolean installSuccess = false; + try { + pkg.preInstallHook(osSdkRoot, this); + if (unarchive(osSdkRoot, archiveFile, sdkManager, monitor)) { + monitor.setResult("Installed %1$s", name); + // Delete the temp archive if it exists, only on success + deleteFileOrFolder(archiveFile); + installSuccess = true; + return true; + } + } finally { + pkg.postInstallHook(this, installSuccess); } } diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/Package.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/Package.java index bbc59ff97..9a2b93a21 100755 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/Package.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/Package.java @@ -403,6 +403,28 @@ public abstract class Package implements IDescription, Comparable { String osSdkRoot, String suggestedDir, SdkManager sdkManager); /** + * Hook called right before an archive is installed. The archive has already + * been downloaded succesfully and will be installed in the directory specified by + * {@link #getInstallFolder(String, String, SdkManager)} when this call returns. + * + * @param osSdkRoot The OS path of the SDK root folder. + * @param archive The archive that will be installed + */ + public void preInstallHook(String osSdkRoot, Archive archive) { + // Nothing to do in base class. + } + + /** + * Hook called right after an archive has been installed. + * + * @param archive The archive that has been installed + * @param installSuccess True if the archive was successfully installed. + */ + public void postInstallHook(Archive archive, boolean installSuccess) { + // Nothing to do in base class. + } + + /** * Returns whether the give package represents the same item as the current package. *

* Two packages are considered the same if they represent the same thing, except for the diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/PlatformPackage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/PlatformPackage.java index 311499ea5..3d13c93b2 100755 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/PlatformPackage.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/PlatformPackage.java @@ -179,11 +179,25 @@ public class PlatformPackage extends MinToolsPackage implements IPackageVersion } File platforms = new File(osSdkRoot, SdkConstants.FD_PLATFORMS); - File folder = new File(platforms, String.format("android-%s", getVersionName())); //$NON-NLS-1$ + File folder = new File(platforms, + String.format("android-%s", getVersion().getApiString())); //$NON-NLS-1$ return folder; } + /** + * Makes sure the base /platforms folder exists before installing. + */ + @Override + public void preInstallHook(String osSdkRoot, Archive archive) { + super.preInstallHook(osSdkRoot, archive); + + File platformsRoot = new File(osSdkRoot, SdkConstants.FD_PLATFORMS); + if (!platformsRoot.isDirectory()) { + platformsRoot.mkdir(); + } + } + @Override public boolean sameItemAs(Package pkg) { if (pkg instanceof PlatformPackage) { diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SamplePackage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SamplePackage.java index 5a0f8fca2..afb91e126 100755 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SamplePackage.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SamplePackage.java @@ -206,6 +206,9 @@ public class SamplePackage extends MinToolsPackage @Override public File getInstallFolder(String osSdkRoot, String suggestedDir, SdkManager sdkManager) { + // The /samples dir at the root of the SDK + File samplesRoot = new File(osSdkRoot, SdkConstants.FD_SAMPLES); + // First find if this platform is already installed. If so, reuse the same directory. for (IAndroidTarget target : sdkManager.getTargets()) { if (target.isPlatform() && @@ -213,25 +216,42 @@ public class SamplePackage extends MinToolsPackage String p = target.getPath(IAndroidTarget.SAMPLES); File f = new File(p); if (f.isDirectory()) { - return f; + // We *only* use this directory if it's using the "new" location + // under SDK/samples. We explicitly do not reuse the "old" location + // under SDK/platform/android-N/samples. + if (f.getParentFile().equals(samplesRoot)) { + return f; + } } } } // Otherwise, get a suitable default - File samples = new File(osSdkRoot, SdkConstants.FD_SAMPLES); - File folder = new File(samples, - String.format("android-%d", getVersion().getApiLevel())); //$NON-NLS-1$ + File folder = new File(samplesRoot, + String.format("android-%s", getVersion().getApiString())); //$NON-NLS-1$ for (int n = 1; folder.exists(); n++) { // Keep trying till we find an unused directory. - folder = new File(samples, - String.format("android-%d_%d", getVersion().getApiLevel(), n)); //$NON-NLS-1$ + folder = new File(samplesRoot, + String.format("android-%s_%d", getVersion().getApiString(), n)); //$NON-NLS-1$ } return folder; } + /** + * Makes sure the base /samples folder exists before installing. + */ + @Override + public void preInstallHook(String osSdkRoot, Archive archive) { + super.preInstallHook(osSdkRoot, archive); + + File samplesRoot = new File(osSdkRoot, SdkConstants.FD_SAMPLES); + if (!samplesRoot.isDirectory()) { + samplesRoot.mkdir(); + } + } + @Override public boolean sameItemAs(Package pkg) { if (pkg instanceof SamplePackage) { -- 2.11.0