diff options
14 files changed, 364 insertions, 113 deletions
diff --git a/draw9patch/src/com/android/draw9patch/ui/ImageEditorPanel.java b/draw9patch/src/com/android/draw9patch/ui/ImageEditorPanel.java index aac6145..e0aa026 100644 --- a/draw9patch/src/com/android/draw9patch/ui/ImageEditorPanel.java +++ b/draw9patch/src/com/android/draw9patch/ui/ImageEditorPanel.java @@ -655,11 +655,11 @@ class ImageEditorPanel extends JPanel { private static final double STRIPES_SPACING = 6.0; private static final int STRIPES_ANGLE = 45; - private int zoom; + private int zoom = DEFAULT_ZOOM; private boolean showPatches; private boolean showLock = true; - private Dimension size; + private final Dimension size; private boolean locked; @@ -699,7 +699,6 @@ class ImageEditorPanel extends JPanel { setOpaque(true); - // Set dummy size. // Exact size will be set by setZoom() in AncestorListener#ancestorMoved. size = new Dimension(0, 0); @@ -1029,14 +1028,16 @@ class ImageEditorPanel extends JPanel { zoom = value; if (size.height == 0 || (getHeight() - size.height) == 0) { - size = new Dimension(width * zoom, height * zoom + helpPanel.getHeight()); + size.setSize(width * zoom, height * zoom + helpPanel.getHeight()); } else { - size = new Dimension(width * zoom, height * zoom); + size.setSize(width * zoom, height * zoom); } - setSize(size); - ImageEditorPanel.this.validate(); - repaint(); + if (!size.equals(getSize())) { + setSize(size); + ImageEditorPanel.this.validate(); + repaint(); + } } void setPatchesVisible(boolean visible) { diff --git a/sdkmanager/libs/sdklib/.settings/org.eclipse.core.resources.prefs b/sdkmanager/libs/sdklib/.settings/org.eclipse.core.resources.prefs new file mode 100755 index 0000000..683b395 --- /dev/null +++ b/sdkmanager/libs/sdklib/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,3 @@ +#Wed Feb 02 16:41:18 PST 2011
+eclipse.preferences.version=1
+encoding//tests/com/android/sdklib/testdata/addon_sample_1.xml=UTF-8
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/SdkConstants.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/SdkConstants.java index f8f7f19..37265b1 100644 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/SdkConstants.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/SdkConstants.java @@ -227,6 +227,8 @@ public final class SdkConstants { public final static String FD_SKINS = "skins"; /** Name of the SDK samples folder. */ public final static String FD_SAMPLES = "samples"; + /** Name of the SDK extras folder. */ + public final static String FD_EXTRAS = "extras"; /** Name of the SDK templates folder, i.e. "templates" */ public final static String FD_TEMPLATES = "templates"; /** Name of the SDK Ant folder, i.e. "ant" */ diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/SdkManager.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/SdkManager.java index 767e582..3e6e23e 100644 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/SdkManager.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/SdkManager.java @@ -16,6 +16,8 @@ package com.android.sdklib; +import com.android.annotations.VisibleForTesting; +import com.android.annotations.VisibleForTesting.Visibility; import com.android.prefs.AndroidLocation; import com.android.prefs.AndroidLocation.AndroidLocationException; import com.android.sdklib.AndroidVersion.AndroidVersionException; @@ -42,7 +44,7 @@ import java.util.regex.Pattern; * @see PlatformTarget * @see AddOnTarget */ -public final class SdkManager { +public class SdkManager { public final static String PROP_VERSION_SDK = "ro.build.version.sdk"; //$NON-NLS-1$ public final static String PROP_VERSION_CODENAME = "ro.build.version.codename"; //$NON-NLS-1$ @@ -92,7 +94,8 @@ public final class SdkManager { * * @param osSdkPath the location of the SDK. */ - private SdkManager(String osSdkPath) { + @VisibleForTesting(visibility=Visibility.PRIVATE) + protected SdkManager(String osSdkPath) { mOsSdkPath = osSdkPath; } @@ -146,7 +149,8 @@ public final class SdkManager { * <p/> * The array can be empty but not null. */ - private void setTargets(IAndroidTarget[] targets) { + @VisibleForTesting(visibility=Visibility.PRIVATE) + protected void setTargets(IAndroidTarget[] targets) { assert targets != null; mTargets = targets; } 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 9a90b2c..bed9174 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 @@ -329,22 +329,6 @@ public class AddonPackage extends Package return null;
}
- /**
- * Makes sure the base /add-ons folder exists before installing.
- */
- @Override
- public boolean preInstallHook(Archive archive,
- ITaskMonitor monitor,
- String osSdkRoot,
- File installFolder) {
- File addonsRoot = new File(osSdkRoot, SdkConstants.FD_ADDONS);
- if (!addonsRoot.isDirectory()) {
- addonsRoot.mkdir();
- }
-
- return super.preInstallHook(archive, monitor, osSdkRoot, installFolder);
- }
-
@Override
public boolean sameItemAs(Package pkg) {
if (pkg instanceof AddonPackage) {
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/ExtraPackage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/ExtraPackage.java index 9c94800..49236dc 100755 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/ExtraPackage.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/ExtraPackage.java @@ -16,6 +16,7 @@ package com.android.sdklib.internal.repository;
+import com.android.sdklib.NullSdkLog;
import com.android.sdklib.SdkConstants;
import com.android.sdklib.SdkManager;
import com.android.sdklib.internal.repository.Archive.Arch;
@@ -50,7 +51,8 @@ public class ExtraPackage extends MinToolsPackage private final String mVendor;
/**
- * The sub-folder name. It must be a non-empty single-segment path.
+ * The sub-folder name. It must be a non-empty single-segment path and has the same
+ * rules as {@link #mVendor}.
*/
private final String mPath;
@@ -164,7 +166,7 @@ public class ExtraPackage extends MinToolsPackage props.setProperty(PROP_PATH, mPath);
if (mVendor != null) {
- props.setProperty(PROP_PATH, mVendor);
+ props.setProperty(PROP_VENDOR, mVendor);
}
if (getMinApiLevel() != MIN_API_LEVEL_NOT_SPECIFIED) {
@@ -181,74 +183,126 @@ public class ExtraPackage extends MinToolsPackage }
/**
- * Static helper to check if a given path is acceptable for an "extra" package.
+ * Static helper to check if a given vendor and path is acceptable for an "extra" package.
*/
public boolean isPathValid() {
- if (SdkConstants.FD_ADDONS.equals(mPath) ||
- SdkConstants.FD_PLATFORMS.equals(mPath) ||
- SdkConstants.FD_PLATFORM_TOOLS.equals(mPath) ||
- SdkConstants.FD_TOOLS.equals(mPath) ||
- SdkConstants.FD_DOCS.equals(mPath) ||
- RepoConstants.FD_TEMP.equals(mPath)) {
+ return isSegmentValid(mVendor) && isSegmentValid(mPath);
+ }
+
+ private boolean isSegmentValid(String segment) {
+ if (SdkConstants.FD_ADDONS.equals(segment) ||
+ SdkConstants.FD_PLATFORMS.equals(segment) ||
+ SdkConstants.FD_PLATFORM_TOOLS.equals(segment) ||
+ SdkConstants.FD_TOOLS.equals(segment) ||
+ SdkConstants.FD_DOCS.equals(segment) ||
+ RepoConstants.FD_TEMP.equals(segment)) {
return false;
}
- return mPath != null && mPath.indexOf('/') == -1 && mPath.indexOf('\\') == -1;
+ return segment != null && segment.indexOf('/') == -1 && segment.indexOf('\\') == -1;
}
/**
- * The install folder name. It is a single-segment path.
+ * Returns the sanitized path folder name. It is a single-segment path.
+ * <p/>
+ * The package is installed in SDK/extras/vendor_name/path_name.
* <p/>
* The paths "add-ons", "platforms", "tools" and "docs" are reserved and cannot be used.
* This limitation cannot be written in the XML Schema and must be enforced here by using
* the method {@link #isPathValid()} *before* installing the package.
*/
public String getPath() {
- String path = mPath;
+ // The XSD specifies the XML vendor and path should only contain [a-zA-Z0-9]+
+ // and cannot be empty. Let's be defensive and enforce that anyway since things
+ // like "____" are still valid values that we don't want to allow.
- if (mVendor != null && mVendor.length() > 0) {
- path = mVendor + "-" + mPath; //$NON-NLS-1$
+ // Sanitize the path
+ String path = mPath.replaceAll("[^a-zA-Z0-9-]+", "_"); //$NON-NLS-1$
+ if (path.length() == 0 || path.equals("_")) { //$NON-NLS-1$
+ int h = path.hashCode();
+ path = String.format("extra%08x", h); //$NON-NLS-1$
}
- int h = path.hashCode();
+ return path;
+ }
- // Sanitize the path
- path = path.replaceAll("[^a-zA-Z0-9-]+", "_"); //$NON-NLS-1$
- if (path.length() == 0) {
- path = String.format("unknown_extra%08x", h); //$NON-NLS-1$
+ /**
+ * Returns the sanitized vendor folder name. It is a single-segment path.
+ * <p/>
+ * The package is installed in SDK/extras/vendor_name/path_name.
+ * <p/>
+ * An empty string is returned in case of error.
+ */
+ public String getVendor() {
+
+ // The XSD specifies the XML vendor and path should only contain [a-zA-Z0-9]+
+ // and cannot be empty. Let's be defensive and enforce that anyway since things
+ // like "____" are still valid values that we don't want to allow.
+
+ if (mVendor != null && mVendor.length() > 0) {
+ String vendor = mVendor;
+ // Sanitize the vendor
+ vendor = vendor.replaceAll("[^a-zA-Z0-9-]+", "_"); //$NON-NLS-1$
+ if (vendor.equals("_")) { //$NON-NLS-1$
+ int h = vendor.hashCode();
+ vendor = String.format("vendor%08x", h); //$NON-NLS-1$
+ }
+
+ return vendor;
}
- return path;
+ return ""; //$NON-NLS-1$
}
/** Returns a short description for an {@link IDescription}. */
@Override
public String getShortDescription() {
- String name = getPath();
- if (name != null) {
- // Uniformize all spaces in the name and upper case words.
-
- name = name.replaceAll("[ _\t\f-]+", " "); //$NON-NLS-1$ //$NON-NLS-2$
-
- // Look at all lower case characters in range [1..n-1] and replace them by an upper
- // case if they are preceded by a space. Also upper cases the first character of the
- // string.
- boolean changed = false;
- char[] chars = name.toCharArray();
- for (int n = chars.length - 1, i = 0; i < n; i++) {
- if (Character.isLowerCase(chars[i]) && (i == 0 || chars[i - 1] == ' ')) {
- chars[i] = Character.toUpperCase(chars[i]);
- changed = true;
- }
+ String name = mPath;
+
+ // In the past, we used to save the extras in a folder vendor-path,
+ // and that "vendor" would end up in the path when we reload the extra from
+ // disk. Detect this and compensate.
+ if (mVendor != null && mVendor.length() > 0) {
+ if (name.startsWith(mVendor + "-")) { //$NON-NLS-1$
+ name = name.substring(mVendor.length() + 1);
}
- if (changed) {
- name = new String(chars);
+ }
+
+ // Uniformize all spaces in the name
+ if (name != null) {
+ name = name.replaceAll("[ _\t\f-]+", " ").trim(); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ if (name == null || name.length() == 0) { //$NON-NLS-1$
+ name = "Unkown Extra";
+ }
+
+ if (mVendor != null && mVendor.length() > 0) {
+ name = mVendor + " " + name; //$NON-NLS-1$
+ name = name.replaceAll("[ _\t\f-]+", " ").trim(); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ // Look at all lower case characters in range [1..n-1] and replace them by an upper
+ // case if they are preceded by a space. Also upper cases the first character of the
+ // string.
+ boolean changed = false;
+ char[] chars = name.toCharArray();
+ for (int n = chars.length - 1, i = 0; i < n; i++) {
+ if (Character.isLowerCase(chars[i]) && (i == 0 || chars[i - 1] == ' ')) {
+ chars[i] = Character.toUpperCase(chars[i]);
+ changed = true;
}
}
+ if (changed) {
+ name = new String(chars);
+ }
+
+ // Special case: reformat a few typical acronyms.
+ name = name.replaceAll(" Usb ", " USB "); //$NON-NLS-1$
+ name = name.replaceAll(" Api ", " API "); //$NON-NLS-1$
String s = String.format("%1$s package, revision %2$d%3$s",
name,
getRevision(),
- isObsolete() ? " (Obsolete)" : "");
+ isObsolete() ? " (Obsolete)" : ""); //$NON-NLS-2$
return s;
}
@@ -263,13 +317,13 @@ public class ExtraPackage extends MinToolsPackage public String getLongDescription() {
String s = getDescription();
if (s == null || s.length() == 0) {
- s = String.format("Extra %1$s package", getPath());
+ s = String.format("Extra %1$s package by %2$s", getPath(), getVendor());
}
if (s.indexOf("revision") == -1) {
s += String.format("\nRevision %1$d%2$s",
getRevision(),
- isObsolete() ? " (Obsolete)" : "");
+ isObsolete() ? " (Obsolete)" : ""); //$NON-NLS-2$
}
if (getMinToolsRevision() != MIN_TOOLS_REV_NOT_SPECIFIED) {
@@ -280,6 +334,13 @@ public class ExtraPackage extends MinToolsPackage s += String.format("\nRequires SDK Platform Android API %1$s", getMinApiLevel());
}
+ // For a local archive, also put the install path in the long description.
+ // This should help users locate the extra on their drive.
+ File localPath = getLocalArchivePath();
+ if (localPath != null) {
+ s += String.format("\nLocation: %1$s", localPath.getAbsolutePath());
+ }
+
return s;
}
@@ -291,16 +352,82 @@ public class ExtraPackage extends MinToolsPackage *
* @param osSdkRoot The OS path of the SDK root folder.
* @param sdkManager An existing SDK manager to list current platforms and addons.
+ * Not used in this implementation.
* @return A new {@link File} corresponding to the directory to use to install this package.
*/
@Override
public File getInstallFolder(String osSdkRoot, SdkManager sdkManager) {
- return new File(osSdkRoot, getPath());
+
+ // First find if this extra is already installed. If so, reuse the same directory.
+ LocalSdkParser localParser = new LocalSdkParser();
+ Package[] pkgs = localParser.parseSdk(osSdkRoot, sdkManager, new NullSdkLog());
+
+ for (Package pkg : pkgs) {
+ if (sameItemAs(pkg) && pkg instanceof ExtraPackage) {
+ File localPath = ((ExtraPackage) pkg).getLocalArchivePath();
+ if (localPath != null) {
+ return localPath;
+ }
+ }
+ }
+
+ // The /extras dir at the root of the SDK
+ File path = new File(osSdkRoot, SdkConstants.FD_EXTRAS);
+
+ String vendor = getVendor();
+ if (vendor != null && vendor.length() > 0) {
+ path = new File(path, vendor);
+ }
+
+ String name = getPath();
+ if (name != null && name.length() > 0) {
+ path = new File(path, name);
+ }
+
+ return path;
}
@Override
public boolean sameItemAs(Package pkg) {
- // Extra packages are similar if they have the same path.
- return pkg instanceof ExtraPackage && ((ExtraPackage)pkg).mPath.equals(mPath);
+ // Extra packages are similar if they have the same path and vendor
+ if (pkg instanceof ExtraPackage) {
+ ExtraPackage ep = (ExtraPackage) pkg;
+
+ // To be backward compatible, we need to support the old vendor-path form
+ if (ep.mPath != null && (ep.mVendor == null || ep.mVendor.length() == 0) &&
+ mPath != null && mVendor != null) {
+ if (ep.mPath.equals(mVendor + "-" + mPath)) { //$NON-NLS-1$
+ return true;
+ }
+ }
+
+ if (!mPath.equals(ep.mPath)) {
+ return false;
+ }
+ if ((mVendor == null && ep.mVendor == null) ||
+ (mVendor != null && !mVendor.equals(ep.mVendor))) {
+ return false;
+ }
+ }
+
+ return false;
+ }
+
+ // ---
+
+ /**
+ * If this package is installed, returns the install path of the archive if valid.
+ * Returns null if not installed or if the path does not exist.
+ */
+ private File getLocalArchivePath() {
+ Archive[] archives = getArchives();
+ if (archives.length == 1 && archives[0].isLocal()) {
+ File path = new File(archives[0].getLocalOsPath());
+ if (path.isDirectory()) {
+ return path;
+ }
+ }
+
+ return null;
}
}
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/LocalSdkParser.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/LocalSdkParser.java index 9a2bf46..eb00562 100755 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/LocalSdkParser.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/LocalSdkParser.java @@ -142,6 +142,7 @@ public class LocalSdkParser { scanMissingAddons(sdkManager, visited, packages, log);
scanMissingSamples(osSdkRoot, visited, packages, log);
scanExtras(osSdkRoot, visited, packages, log);
+ scanExtrasDirectory(osSdkRoot, visited, packages, log);
Collections.sort(packages);
@@ -150,14 +151,36 @@ public class LocalSdkParser { }
/**
- * Find any other directory <em>at the top level</em> that hasn't been visited yet
- * and assume they contain extra packages. This is <em>not</em> a recursive search.
+ * Find any directory in the /extras/vendors/path folders for extra packages.
+ * This isn't a recursive search.
*/
private void scanExtras(String osSdkRoot,
HashSet<File> visited,
ArrayList<Package> packages,
ISdkLog log) {
- File root = new File(osSdkRoot);
+ File root = new File(osSdkRoot, SdkConstants.FD_EXTRAS);
+
+ if (!root.isDirectory()) {
+ // This should not happen. It makes listFiles() return null so let's avoid it.
+ return;
+ }
+
+ for (File vendor : root.listFiles()) {
+ if (vendor.isDirectory()) {
+ scanExtrasDirectory(vendor.getAbsolutePath(), visited, packages, log);
+ }
+ }
+ }
+
+ /**
+ * Find any other directory in the given "root" directory that hasn't been visited yet
+ * and assume they contain extra packages. This is <em>not</em> a recursive search.
+ */
+ private void scanExtrasDirectory(String extrasRoot,
+ HashSet<File> visited,
+ ArrayList<Package> packages,
+ ISdkLog log) {
+ File root = new File(extrasRoot);
if (!root.isDirectory()) {
// This should not happen. It makes listFiles() return null so let's avoid it.
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 12ca0e9..3e9f9d6 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 @@ -409,10 +409,13 @@ public abstract class Package implements IDescription, Comparable<Package> { * <p/>
* Some types of packages install in a fix location, for example docs and tools.
* In this case the returned folder may already exist with a different archive installed
- * at the desired location.
+ * at the desired location. <br/>
* For other packages types, such as add-on or platform, the folder name is only partially
* relevant to determine the content and thus a real check will be done to provide an
* existing or new folder depending on the current content of the SDK.
+ * <p/>
+ * Note that the installer *will* create all directories returned here just before
+ * installation so this method must not attempt to create them.
*
* @param osSdkRoot The OS path of the SDK root folder.
* @param sdkManager An existing SDK manager to list current platforms and addons.
@@ -429,6 +432,11 @@ public abstract class Package implements IDescription, Comparable<Package> { * be continue. The installer will still install the remaining packages if possible.
* <p/>
* The base implementation always return true.
+ * <p/>
+ * Note that the installer *will* create all directories specified by
+ * {@link #getInstallFolder} just before installation, so they must not be
+ * created here. This is also called before the previous install dir is removed
+ * so the previous content is still there during upgrade.
*
* @param archive The archive that will be installed
* @param monitor The {@link ITaskMonitor} to display errors.
@@ -513,6 +521,12 @@ public abstract class Package implements IDescription, Comparable<Package> { * - Add-on based on n <br/>
* - Add-on based on n-1 <br/>
* - Extra packages <br/>
+ * <p/>
+ * Important: this must NOT be used to compare if two packages are the same thing.
+ * This is achieved by {@link #sameItemAs(Package)} or {@link #canBeUpdatedBy(Package)}.
+ * <p/>
+ * This {@link #compareTo(Package)} method is purely an implementation detail to
+ * perform the right ordering of the packages in the list of available or installed packages.
*/
public int compareTo(Package other) {
int s1 = this.sortingScore();
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 8dee635..c303e2f 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 @@ -193,22 +193,6 @@ public class PlatformPackage extends MinToolsPackage implements IPackageVersion return folder;
}
- /**
- * Makes sure the base /platforms folder exists before installing.
- */
- @Override
- public boolean preInstallHook(Archive archive,
- ITaskMonitor monitor,
- String osSdkRoot,
- File installFolder) {
- File platformsRoot = new File(osSdkRoot, SdkConstants.FD_PLATFORMS);
- if (!platformsRoot.isDirectory()) {
- platformsRoot.mkdir();
- }
-
- return super.preInstallHook(archive, monitor, osSdkRoot, installFolder);
- }
-
@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 b6976e9..035677b 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 @@ -226,7 +226,7 @@ public class SamplePackage extends MinToolsPackage // 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.
+ // First find if this sample is already installed. If so, reuse the same directory.
for (IAndroidTarget target : sdkManager.getTargets()) {
if (target.isPlatform() &&
target.getVersion().equals(mVersion)) {
@@ -278,10 +278,6 @@ public class SamplePackage extends MinToolsPackage ITaskMonitor monitor,
String osSdkRoot,
File installFolder) {
- File samplesRoot = new File(osSdkRoot, SdkConstants.FD_SAMPLES);
- if (!samplesRoot.isDirectory()) {
- samplesRoot.mkdir();
- }
if (installFolder != null && installFolder.isDirectory()) {
// Get the hash computed during the last installation
diff --git a/sdkmanager/libs/sdklib/tests/com/android/sdklib/internal/repository/MockEmptySdkManager.java b/sdkmanager/libs/sdklib/tests/com/android/sdklib/internal/repository/MockEmptySdkManager.java new file mode 100755 index 0000000..455841a --- /dev/null +++ b/sdkmanager/libs/sdklib/tests/com/android/sdklib/internal/repository/MockEmptySdkManager.java @@ -0,0 +1,30 @@ +/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Eclipse Public License, Version 1.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/org/documents/epl-v10.php
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.sdklib.internal.repository;
+
+import com.android.sdklib.IAndroidTarget;
+import com.android.sdklib.SdkManager;
+
+/**
+ * An invalid SDK Manager, just good enough to avoid passing a null reference.
+ */
+class MockEmptySdkManager extends SdkManager {
+ public MockEmptySdkManager(String osSdkPath) {
+ super(osSdkPath);
+ setTargets(new IAndroidTarget[0]);
+ }
+}
diff --git a/sdkmanager/libs/sdklib/tests/com/android/sdklib/internal/repository/SdkAddonSourceTest.java b/sdkmanager/libs/sdklib/tests/com/android/sdklib/internal/repository/SdkAddonSourceTest.java index 9e152d5..ea6c4f6 100755 --- a/sdkmanager/libs/sdklib/tests/com/android/sdklib/internal/repository/SdkAddonSourceTest.java +++ b/sdkmanager/libs/sdklib/tests/com/android/sdklib/internal/repository/SdkAddonSourceTest.java @@ -16,11 +16,13 @@ package com.android.sdklib.internal.repository;
+import com.android.sdklib.SdkManager;
import com.android.sdklib.repository.SdkAddonConstants;
import org.w3c.dom.Document;
import java.io.ByteArrayInputStream;
+import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -171,29 +173,46 @@ public class SdkAddonSourceTest extends TestCase { assertEquals("Found My First add-on by John Doe, Android API 1, revision 1\n" +
"Found My Second add-on by John Deer, Android API 2, revision 42\n" +
"Found This add-on has no libraries by Joe Bar, Android API 4, revision 3\n" +
- "Found A Usb Driver package, revision 43 (Obsolete)\n" +
- "Found Android Vendor Extra Api Dep package, revision 2 (Obsolete)\n",
+ "Found G USB Driver package, revision 43 (Obsolete)\n" +
+ "Found Android Vendor Extra API Dep package, revision 2 (Obsolete)\n" +
+ "Found Unkown Extra package, revision 2 (Obsolete)\n",
monitor.getCapturedDescriptions());
assertEquals("", monitor.getCapturedResults());
// check the packages we found... we expected to find 11 packages with each at least
// one archive.
Package[] pkgs = mSource.getPackages();
- assertEquals(5, pkgs.length);
+ assertEquals(6, pkgs.length);
for (Package p : pkgs) {
assertTrue(p.getArchives().length >= 1);
}
- // Check the extra packages path
- ArrayList<String> extraPaths = new ArrayList<String>();
+ // Check the extra packages path, vendor, install folder
+
+ final String osSdkPath = "SDK";
+ final SdkManager sdkManager = new MockEmptySdkManager(osSdkPath);
+
+ ArrayList<String> extraPaths = new ArrayList<String>();
+ ArrayList<String> extraVendors = new ArrayList<String>();
+ ArrayList<File> extraInstall = new ArrayList<File>();
for (Package p : pkgs) {
if (p instanceof ExtraPackage) {
extraPaths.add(((ExtraPackage) p).getPath());
+ extraVendors.add(((ExtraPackage) p).getVendor());
+ extraInstall.add(((ExtraPackage) p).getInstallFolder(osSdkPath, sdkManager));
}
}
assertEquals(
- "[a-usb_driver, android_vendor-extra_api_dep]",
+ "[usb_driver, extra_api_dep, extra0000005f]",
Arrays.toString(extraPaths.toArray()));
+ assertEquals(
+ "[g, android_vendor, vendor0000005f]",
+ Arrays.toString(extraVendors.toArray()));
+ assertEquals(
+ ("[SDK/extras/g/usb_driver, " +
+ "SDK/extras/android_vendor/extra_api_dep, " +
+ "SDK/extras/vendor0000005f/extra0000005f]").replace('/', File.separatorChar),
+ Arrays.toString(extraInstall.toArray()));
}
/**
diff --git a/sdkmanager/libs/sdklib/tests/com/android/sdklib/internal/repository/SdkRepoSourceTest.java b/sdkmanager/libs/sdklib/tests/com/android/sdklib/internal/repository/SdkRepoSourceTest.java index c92acde..aee811f 100755 --- a/sdkmanager/libs/sdklib/tests/com/android/sdklib/internal/repository/SdkRepoSourceTest.java +++ b/sdkmanager/libs/sdklib/tests/com/android/sdklib/internal/repository/SdkRepoSourceTest.java @@ -16,11 +16,13 @@ package com.android.sdklib.internal.repository;
+import com.android.sdklib.SdkManager;
import com.android.sdklib.repository.SdkRepoConstants;
import org.w3c.dom.Document;
import java.io.ByteArrayInputStream;
+import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -208,16 +210,30 @@ public class SdkRepoSourceTest extends TestCase { assertTrue(p.getArchives().length >= 1);
}
- // Check the extra packages path
- ArrayList<String> extraPaths = new ArrayList<String>();
+ // Check the extra packages path, vendor, install folder
+
+ final String osSdkPath = "SDK";
+ final SdkManager sdkManager = new MockEmptySdkManager(osSdkPath);
+
+ ArrayList<String> extraPaths = new ArrayList<String>();
+ ArrayList<String> extraVendors = new ArrayList<String>();
+ ArrayList<File> extraInstall = new ArrayList<File>();
for (Package p : pkgs) {
if (p instanceof ExtraPackage) {
extraPaths.add(((ExtraPackage) p).getPath());
+ extraVendors.add(((ExtraPackage) p).getVendor());
+ extraInstall.add(((ExtraPackage) p).getInstallFolder(osSdkPath, sdkManager));
}
}
assertEquals(
"[usb_driver]",
Arrays.toString(extraPaths.toArray()));
+ assertEquals(
+ "[]",
+ Arrays.toString(extraVendors.toArray()));
+ assertEquals(
+ "[SDK/extras/usb_driver]".replace('/', File.separatorChar),
+ Arrays.toString(extraInstall.toArray()));
}
/**
@@ -259,7 +275,7 @@ public class SdkRepoSourceTest extends TestCase { "Found Android SDK Tools, revision 42\n" +
"Found This add-on has no libraries by Joe Bar, Android API 4, revision 3\n" +
"Found Usb Driver package, revision 43 (Obsolete)\n" +
- "Found Extra Api Dep package, revision 2 (Obsolete)\n" +
+ "Found Extra API Dep package, revision 2 (Obsolete)\n" +
"Found Samples for SDK API 14, revision 24 (Obsolete)\n",
monitor.getCapturedDescriptions());
assertEquals("", monitor.getCapturedResults());
@@ -272,16 +288,30 @@ public class SdkRepoSourceTest extends TestCase { assertTrue(p.getArchives().length >= 1);
}
- // Check the extra packages path
- ArrayList<String> extraPaths = new ArrayList<String>();
+ // Check the extra packages path, vendor, install folder
+
+ final String osSdkPath = "SDK";
+ final SdkManager sdkManager = new MockEmptySdkManager(osSdkPath);
+
+ ArrayList<String> extraPaths = new ArrayList<String>();
+ ArrayList<String> extraVendors = new ArrayList<String>();
+ ArrayList<File> extraInstall = new ArrayList<File>();
for (Package p : pkgs) {
if (p instanceof ExtraPackage) {
extraPaths.add(((ExtraPackage) p).getPath());
+ extraVendors.add(((ExtraPackage) p).getVendor());
+ extraInstall.add(((ExtraPackage) p).getInstallFolder(osSdkPath, sdkManager));
}
}
assertEquals(
"[usb_driver, extra_api_dep]",
Arrays.toString(extraPaths.toArray()));
+ assertEquals(
+ "[, ]",
+ Arrays.toString(extraVendors.toArray()));
+ assertEquals(
+ "[SDK/extras/usb_driver, SDK/extras/extra_api_dep]".replace('/', File.separatorChar),
+ Arrays.toString(extraInstall.toArray()));
}
/**
@@ -320,8 +350,8 @@ public class SdkRepoSourceTest extends TestCase { "Found Documentation for Android SDK, API 2, revision 42\n" +
"Found Android SDK Tools, revision 42\n" +
"Found Android SDK Platform-tools, revision 3\n" +
- "Found A Usb Driver package, revision 43 (Obsolete)\n" +
- "Found Android Vendor Extra Api Dep package, revision 2 (Obsolete)\n" +
+ "Found A USB Driver package, revision 43 (Obsolete)\n" +
+ "Found Android Vendor Extra API Dep package, revision 2 (Obsolete)\n" +
"Found Samples for SDK API 14, revision 24 (Obsolete)\n",
monitor.getCapturedDescriptions());
assertEquals("", monitor.getCapturedResults());
@@ -334,16 +364,31 @@ public class SdkRepoSourceTest extends TestCase { assertTrue(p.getArchives().length >= 1);
}
- // Check the extra packages path
- ArrayList<String> extraPaths = new ArrayList<String>();
+ // Check the extra packages path, vendor, install folder
+
+ final String osSdkPath = "SDK";
+ final SdkManager sdkManager = new MockEmptySdkManager(osSdkPath);
+
+ ArrayList<String> extraPaths = new ArrayList<String>();
+ ArrayList<String> extraVendors = new ArrayList<String>();
+ ArrayList<File> extraInstall = new ArrayList<File>();
for (Package p : pkgs) {
if (p instanceof ExtraPackage) {
extraPaths.add(((ExtraPackage) p).getPath());
+ extraVendors.add(((ExtraPackage) p).getVendor());
+ extraInstall.add(((ExtraPackage) p).getInstallFolder(osSdkPath, sdkManager));
}
}
assertEquals(
- "[a-usb_driver, android_vendor-extra_api_dep]",
+ "[usb_driver, extra_api_dep]",
Arrays.toString(extraPaths.toArray()));
+ assertEquals(
+ "[a, android_vendor]",
+ Arrays.toString(extraVendors.toArray()));
+ assertEquals(
+ "[SDK/extras/a/usb_driver, SDK/extras/android_vendor/extra_api_dep]"
+ .replace('/', File.separatorChar),
+ Arrays.toString(extraInstall.toArray()));
}
/**
diff --git a/sdkmanager/libs/sdklib/tests/com/android/sdklib/testdata/addon_sample_1.xml b/sdkmanager/libs/sdklib/tests/com/android/sdklib/testdata/addon_sample_1.xml index 4e3f750..d761d73 100755 --- a/sdkmanager/libs/sdklib/tests/com/android/sdklib/testdata/addon_sample_1.xml +++ b/sdkmanager/libs/sdklib/tests/com/android/sdklib/testdata/addon_sample_1.xml @@ -106,7 +106,7 @@ </sdk:add-on> <sdk:extra> - <sdk:vendor>a</sdk:vendor> + <sdk:vendor>g</sdk:vendor> <sdk:path>usb_driver</sdk:path> <sdk:uses-license ref="license2" /> <sdk:revision>43</sdk:revision> @@ -142,4 +142,23 @@ <sdk:obsolete></sdk:obsolete> </sdk:extra> + <sdk:extra> + <sdk:vendor>____</sdk:vendor> + <sdk:path>____</sdk:path> + <sdk:uses-license ref="license2" /> + <sdk:revision>2</sdk:revision> + <sdk:archives> + <sdk:archive os="any" arch="any"> + <sdk:size>65536</sdk:size> + <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum> + <sdk:url>distrib/extra_mega_duff.zip</sdk:url> + </sdk:archive> + </sdk:archives> + <sdk:description>Some extra package that has a min-api-level of 42</sdk:description> + <sdk:desc-url>http://www.example.com/extra.html</sdk:desc-url> + <sdk:min-tools-rev>3</sdk:min-tools-rev> + <sdk:min-api-level>42</sdk:min-api-level> + <sdk:obsolete></sdk:obsolete> + </sdk:extra> + </sdk:sdk-addon> |