aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--files/devices.xml27
-rwxr-xr-xsdkmanager/app/etc/android.bat4
-rw-r--r--sdkmanager/libs/sdklib/src/com/android/sdklib/SdkManager.java217
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/Archive.java2
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/LocalSdkParser.java3
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/Package.java1
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkAddonSource.java4
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkRepoSource.java7
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkSource.java75
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SourcePackage.java12
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SystemImagePackage.java10
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/io/FileOp.java7
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/repository/SdkRepoConstants.java15
-rwxr-xr-xsdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/MockBrokenPackage.java2
-rwxr-xr-xsdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/MockEmptyPackage.java6
-rwxr-xr-xsdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/MockSourcePackage.java11
-rwxr-xr-xsdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/MockSystemImagePackage.java15
-rwxr-xr-xsdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/SourcePackageTest.java5
-rwxr-xr-xsdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/SystemImagePackageTest.java7
-rwxr-xr-xsdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java6
20 files changed, 291 insertions, 145 deletions
diff --git a/files/devices.xml b/files/devices.xml
index 6dc0a3f..9b90578 100644
--- a/files/devices.xml
+++ b/files/devices.xml
@@ -261,6 +261,33 @@
</d:config>
</d:device>
+ <d:device name="4.7in WXGA">
+ <d:default>
+ <d:screen-size>normal</d:screen-size>
+ <d:screen-ratio>long</d:screen-ratio>
+ <d:screen-orientation>port</d:screen-orientation>
+ <d:pixel-density>xhdpi</d:pixel-density>
+ <d:touch-type>finger</d:touch-type>
+ <d:keyboard-state>keyssoft</d:keyboard-state>
+ <d:text-input-method>nokeys</d:text-input-method>
+ <d:nav-state>navexposed</d:nav-state>
+ <d:nav-method>nonav</d:nav-method>
+ <d:screen-dimension>
+ <d:size>1280</d:size>
+ <d:size>720</d:size>
+ </d:screen-dimension>
+ <d:xdpi>320</d:xdpi>
+ <d:ydpi>320</d:ydpi>
+ </d:default>
+
+ <d:config name="Portrait">
+ <d:screen-orientation>port</d:screen-orientation>
+ </d:config>
+ <d:config name="Landscape">
+ <d:screen-orientation>land</d:screen-orientation>
+ </d:config>
+ </d:device>
+
<d:device name="5.1in WVGA">
<d:default>
<d:screen-size>large</d:screen-size>
diff --git a/sdkmanager/app/etc/android.bat b/sdkmanager/app/etc/android.bat
index 3233ebd..6f93c7b 100755
--- a/sdkmanager/app/etc/android.bat
+++ b/sdkmanager/app/etc/android.bat
@@ -64,8 +64,8 @@ if not "%1"=="" goto EndTempCopy
copy /B /D /Y lib\commons-logging* %tmp_dir%\lib\ > nul
copy /B /D /Y lib\commons-codec* %tmp_dir%\lib\ > nul
copy /B /D /Y lib\httpclient* %tmp_dir%\lib\ > nul
- copy /B /D /Y lib\httpcode* %tmp_dir%\lib\ > nul
- copy /B /D /Y lib\httpmime* %tmp_dir%\lib\ > nul
+ copy /B /D /Y lib\httpcore* %tmp_dir%\lib\ > nul
+ copy /B /D /Y lib\httpmime* %tmp_dir%\lib\ > nul
rem jar_path and swt_path are relative to PWD so we don't need to adjust them, just change dirs.
set tools_dir=%cd%
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/SdkManager.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/SdkManager.java
index 8b54ccd..eab2dbe 100644
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/SdkManager.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/SdkManager.java
@@ -344,127 +344,126 @@ public class SdkManager {
private static PlatformTarget loadPlatform(String sdkOsPath, File platformFolder,
ISdkLog log) {
FileWrapper buildProp = new FileWrapper(platformFolder, SdkConstants.FN_BUILD_PROP);
+ FileWrapper sourcePropFile = new FileWrapper(platformFolder, SdkConstants.FN_SOURCE_PROP);
- if (buildProp.isFile()) {
+ if (buildProp.isFile() && sourcePropFile.isFile()) {
+ Map<String, String> platformProp = new HashMap<String, String>();
+
+ // add all the property files
Map<String, String> map = ProjectProperties.parsePropertyFile(buildProp, log);
+ if (map != null) {
+ platformProp.putAll(map);
+ }
+ map = ProjectProperties.parsePropertyFile(sourcePropFile, log);
if (map != null) {
- // look for some specific values in the map.
+ platformProp.putAll(map);
+ }
- // version string
- String apiName = map.get(PROP_VERSION_RELEASE);
- if (apiName == null) {
- log.warning(
- "Ignoring platform '%1$s': %2$s is missing from '%3$s'",
- platformFolder.getName(), PROP_VERSION_RELEASE,
- SdkConstants.FN_BUILD_PROP);
- return null;
+ FileWrapper sdkPropFile = new FileWrapper(platformFolder, SdkConstants.FN_SDK_PROP);
+ if (sdkPropFile.isFile()) { // obsolete platforms don't have this.
+ map = ProjectProperties.parsePropertyFile(sdkPropFile, log);
+ if (map != null) {
+ platformProp.putAll(map);
}
+ }
- // api level
- int apiNumber;
- String stringValue = map.get(PROP_VERSION_SDK);
- if (stringValue == null) {
+ // look for some specific values in the map.
+
+ // api level
+ int apiNumber;
+ String stringValue = platformProp.get(PROP_VERSION_SDK);
+ if (stringValue == null) {
+ log.warning(
+ "Ignoring platform '%1$s': %2$s is missing from '%3$s'",
+ platformFolder.getName(), PROP_VERSION_SDK,
+ SdkConstants.FN_BUILD_PROP);
+ return null;
+ } else {
+ try {
+ apiNumber = Integer.parseInt(stringValue);
+ } catch (NumberFormatException e) {
+ // looks like apiNumber does not parse to a number.
+ // Ignore this platform.
log.warning(
- "Ignoring platform '%1$s': %2$s is missing from '%3$s'",
+ "Ignoring platform '%1$s': %2$s is not a valid number in %3$s.",
platformFolder.getName(), PROP_VERSION_SDK,
SdkConstants.FN_BUILD_PROP);
return null;
- } else {
- try {
- apiNumber = Integer.parseInt(stringValue);
- } catch (NumberFormatException e) {
- // looks like apiNumber does not parse to a number.
- // Ignore this platform.
- log.warning(
- "Ignoring platform '%1$s': %2$s is not a valid number in %3$s.",
- platformFolder.getName(), PROP_VERSION_SDK,
- SdkConstants.FN_BUILD_PROP);
- return null;
- }
- }
-
- // codename (optional)
- String apiCodename = map.get(PROP_VERSION_CODENAME);
- if (apiCodename != null && apiCodename.equals("REL")) {
- apiCodename = null; // REL means it's a release version and therefore the
- // codename is irrelevant at this point.
}
+ }
- // platform rev number & layoutlib version are extracted from the source.properties
- // saved by the SDK Manager when installing the package.
-
- int revision = 1;
- LayoutlibVersion layoutlibVersion = null;
-
- FileWrapper sourcePropFile =
- new FileWrapper(platformFolder, SdkConstants.FN_SOURCE_PROP);
+ // codename (optional)
+ String apiCodename = platformProp.get(PROP_VERSION_CODENAME);
+ if (apiCodename != null && apiCodename.equals("REL")) {
+ apiCodename = null; // REL means it's a release version and therefore the
+ // codename is irrelevant at this point.
+ }
- Map<String, String> sourceProp = ProjectProperties.parsePropertyFile(
- sourcePropFile, log);
+ // version string
+ String apiName = platformProp.get(PkgProps.PLATFORM_VERSION);
+ if (apiName == null) {
+ apiName = platformProp.get(PROP_VERSION_RELEASE);
+ }
+ if (apiName == null) {
+ log.warning(
+ "Ignoring platform '%1$s': %2$s is missing from '%3$s'",
+ platformFolder.getName(), PROP_VERSION_RELEASE,
+ SdkConstants.FN_BUILD_PROP);
+ return null;
+ }
- if (sourceProp != null) {
- try {
- revision = Integer.parseInt(sourceProp.get(PkgProps.PKG_REVISION));
- } catch (NumberFormatException e) {
- // do nothing, we'll keep the default value of 1.
- }
+ // platform rev number & layoutlib version are extracted from the source.properties
+ // saved by the SDK Manager when installing the package.
- try {
- String propApi = sourceProp.get(PkgProps.LAYOUTLIB_API);
- String propRev = sourceProp.get(PkgProps.LAYOUTLIB_REV);
- int llApi = propApi == null ? LayoutlibVersion.NOT_SPECIFIED :
- Integer.parseInt(propApi);
- int llRev = propRev == null ? LayoutlibVersion.NOT_SPECIFIED :
- Integer.parseInt(propRev);
- if (llApi > LayoutlibVersion.NOT_SPECIFIED &&
- llRev >= LayoutlibVersion.NOT_SPECIFIED) {
- layoutlibVersion = new LayoutlibVersion(llApi, llRev);
- }
- } catch (NumberFormatException e) {
- // do nothing, we'll ignore the layoutlib version if it's invalid
- }
+ int revision = 1;
+ LayoutlibVersion layoutlibVersion = null;
+ try {
+ revision = Integer.parseInt(platformProp.get(PkgProps.PKG_REVISION));
+ } catch (NumberFormatException e) {
+ // do nothing, we'll keep the default value of 1.
+ }
- map.putAll(sourceProp);
+ try {
+ String propApi = platformProp.get(PkgProps.LAYOUTLIB_API);
+ String propRev = platformProp.get(PkgProps.LAYOUTLIB_REV);
+ int llApi = propApi == null ? LayoutlibVersion.NOT_SPECIFIED :
+ Integer.parseInt(propApi);
+ int llRev = propRev == null ? LayoutlibVersion.NOT_SPECIFIED :
+ Integer.parseInt(propRev);
+ if (llApi > LayoutlibVersion.NOT_SPECIFIED &&
+ llRev >= LayoutlibVersion.NOT_SPECIFIED) {
+ layoutlibVersion = new LayoutlibVersion(llApi, llRev);
}
+ } catch (NumberFormatException e) {
+ // do nothing, we'll ignore the layoutlib version if it's invalid
+ }
- // Ant properties
- FileWrapper sdkPropFile = new FileWrapper(platformFolder, SdkConstants.FN_SDK_PROP);
- Map<String, String> antProp = null;
- if (sdkPropFile.isFile()) { // obsolete platforms don't have this.
- antProp = ProjectProperties.parsePropertyFile(sdkPropFile, log);
- }
+ // api number and name look valid, perform a few more checks
+ if (checkPlatformContent(platformFolder, log) == false) {
+ return null;
+ }
- if (antProp != null) {
- map.putAll(antProp);
- }
+ ISystemImage[] systemImages =
+ getPlatformSystemImages(sdkOsPath, platformFolder, apiNumber, apiCodename);
+
+ // create the target.
+ PlatformTarget target = new PlatformTarget(
+ sdkOsPath,
+ platformFolder.getAbsolutePath(),
+ apiNumber,
+ apiCodename,
+ apiName,
+ revision,
+ layoutlibVersion,
+ systemImages,
+ platformProp);
- // api number and name look valid, perform a few more checks
- if (checkPlatformContent(platformFolder, log) == false) {
- return null;
- }
+ // need to parse the skins.
+ String[] skins = parseSkinFolder(target.getPath(IAndroidTarget.SKINS));
+ target.setSkins(skins);
- ISystemImage[] systemImages =
- getPlatformSystemImages(sdkOsPath, platformFolder, apiNumber, apiCodename);
-
- // create the target.
- PlatformTarget target = new PlatformTarget(
- sdkOsPath,
- platformFolder.getAbsolutePath(),
- apiNumber,
- apiCodename,
- apiName,
- revision,
- layoutlibVersion,
- systemImages,
- map);
-
- // need to parse the skins.
- String[] skins = parseSkinFolder(target.getPath(IAndroidTarget.SKINS));
- target.setSkins(skins);
-
- return target;
- }
+ return target;
} else {
log.warning("Ignoring platform '%1$s': %2$s is missing.", //$NON-NLS-1$
platformFolder.getName(),
@@ -560,7 +559,15 @@ public class SdkManager {
try {
File propFile = new File(secondLevel, SdkConstants.FN_SOURCE_PROP);
Properties props = new Properties();
- props.load(new FileInputStream(propFile));
+ FileInputStream fis = null;
+ try {
+ fis = new FileInputStream(propFile);
+ props.load(fis);
+ } finally {
+ if (fis != null) {
+ fis.close();
+ }
+ }
AndroidVersion propsVersion = new AndroidVersion(props);
if (!propsVersion.equals(version)) {
@@ -1025,7 +1032,15 @@ public class SdkManager {
File sourceProp = new File(folder, SdkConstants.FN_SOURCE_PROP);
try {
Properties p = new Properties();
- p.load(new FileInputStream(sourceProp));
+ FileInputStream fis = null;
+ try {
+ fis = new FileInputStream(sourceProp);
+ p.load(fis);
+ } finally {
+ if (fis != null) {
+ fis.close();
+ }
+ }
return new AndroidVersion(p);
} catch (FileNotFoundException e) {
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 8aea2c1..f56d202 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
@@ -215,7 +215,7 @@ public class Archive implements IDescription, Comparable<Archive> {
mLocalOsPath = localOsPath;
mSize = 0;
mChecksum = "";
- mIsLocal = true;
+ mIsLocal = localOsPath != 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 4324623..efc736a 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
@@ -149,7 +149,8 @@ public class LocalSdkParser {
target.getVersion(),
0 /*revision*/, // this will use the one from siProps if any
systemImage.getAbiType(),
- siProps);
+ siProps,
+ siDir.getAbsolutePath());
packages.add(pkg2);
visited.add(siDir);
}
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 c5a176f..57de740 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
@@ -147,6 +147,7 @@ public abstract class Package implements IDescription, Comparable<Package> {
}
mSource = source;
+ assert archiveOsPath != null;
mArchives = initializeArchives(props, archiveOs, archiveArch, archiveOsPath);
}
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkAddonSource.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkAddonSource.java
index b79cc90..42f7603 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkAddonSource.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkAddonSource.java
@@ -50,8 +50,8 @@ public class SdkAddonSource extends SdkSource {
}
@Override
- protected String getUrlDefaultXmlFile() {
- return SdkAddonConstants.URL_DEFAULT_FILENAME;
+ protected String[] getDefaultXmlFileUrls() {
+ return new String[] { SdkAddonConstants.URL_DEFAULT_FILENAME };
}
@Override
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkRepoSource.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkRepoSource.java
index d53bcc5..d35e365 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkRepoSource.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkRepoSource.java
@@ -64,8 +64,11 @@ public class SdkRepoSource extends SdkSource {
}
@Override
- protected String getUrlDefaultXmlFile() {
- return SdkRepoConstants.URL_DEFAULT_FILENAME;
+ protected String[] getDefaultXmlFileUrls() {
+ return new String[] {
+ SdkRepoConstants.URL_DEFAULT_FILENAME2,
+ SdkRepoConstants.URL_DEFAULT_FILENAME
+ };
}
@Override
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkSource.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkSource.java
index 5cc2cce..263bf15 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkSource.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkSource.java
@@ -86,7 +86,10 @@ public abstract class SdkSource implements IDescription, Comparable<SdkSource> {
// looked for. This way it will be obvious to the user which
// resource we are actually trying to fetch.
if (url.endsWith("/")) { //$NON-NLS-1$
- url += getUrlDefaultXmlFile();
+ String[] names = getDefaultXmlFileUrls();
+ if (names.length > 0) {
+ url += names[0];
+ }
}
mUrl = url;
@@ -100,8 +103,13 @@ public abstract class SdkSource implements IDescription, Comparable<SdkSource> {
*/
public abstract boolean isAddonSource();
- /** Returns SdkRepoConstants.URL_DEFAULT_XML_FILE or SdkAddonConstants.URL_DEFAULT_XML_FILE */
- protected abstract String getUrlDefaultXmlFile();
+ /**
+ * Returns the basename of the default URLs to try to download the
+ * XML manifest.
+ * E.g. this is typically SdkRepoConstants.URL_DEFAULT_XML_FILE
+ * or SdkAddonConstants.URL_DEFAULT_XML_FILE
+ */
+ protected abstract String[] getDefaultXmlFileUrls();
/** Returns SdkRepoConstants.NS_LATEST_VERSION or SdkAddonConstants.NS_LATEST_VERSION. */
protected abstract int getNsLatestVersion();
@@ -250,7 +258,7 @@ public abstract class SdkSource implements IDescription, Comparable<SdkSource> {
*/
public void load(ITaskMonitor monitor, boolean forceHttp) {
- monitor.setProgressMax(6);
+ monitor.setProgressMax(7);
setDefaultDescription();
@@ -266,28 +274,77 @@ public abstract class SdkSource implements IDescription, Comparable<SdkSource> {
Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };
String[] validationError = new String[] { null };
Exception[] exception = new Exception[] { null };
- InputStream xml = fetchUrl(url, monitor.createSubMonitor(1), exception);
Document validatedDoc = null;
boolean usingAlternateXml = false;
boolean usingAlternateUrl = false;
String validatedUri = null;
+ String[] defaultNames = getDefaultXmlFileUrls();
+ String firstDefaultName = defaultNames.length > 0 ? defaultNames[0] : "";
+
+ InputStream xml = fetchUrl(url, monitor.createSubMonitor(1), exception);
+ if (xml != null) {
+ int version = getXmlSchemaVersion(xml);
+ if (version == 0) {
+ xml = null;
+ }
+ }
+
+ // FIXME: this is a quick fix to support an alternate upgrade path.
+ // The whole logic below needs to be updated.
+ if (xml == null && defaultNames.length > 0) {
+ ITaskMonitor subMonitor = monitor.createSubMonitor(1);
+ subMonitor.setProgressMax(defaultNames.length);
+
+ String baseUrl = url;
+ if (!baseUrl.endsWith("/")) {
+ int pos = baseUrl.lastIndexOf('/');
+ if (pos > 0) {
+ baseUrl = baseUrl.substring(0, pos + 1);
+ }
+ }
+
+ for(String name : defaultNames) {
+ String newUrl = baseUrl + name;
+ if (newUrl.equals(url)) {
+ continue;
+ }
+ xml = fetchUrl(newUrl, subMonitor.createSubMonitor(1), exception);
+ if (xml != null) {
+ int version = getXmlSchemaVersion(xml);
+ if (version == 0) {
+ xml = null;
+ } else {
+ url = newUrl;
+ subMonitor.incProgress(
+ subMonitor.getProgressMax() - subMonitor.getProgress());
+ break;
+ }
+ }
+ }
+ } else {
+ monitor.incProgress(1);
+ }
+
// If the original URL can't be fetched
// and the URL doesn't explicitly end with our filename
// and it wasn't an HTTP authentication operation canceled by the user
// then make another tentative after changing the URL.
if (xml == null
- && !url.endsWith(getUrlDefaultXmlFile())
+ && !url.endsWith(firstDefaultName)
&& !(exception[0] instanceof CanceledByUserException)) {
if (!url.endsWith("/")) { //$NON-NLS-1$
url += "/"; //$NON-NLS-1$
}
- url += getUrlDefaultXmlFile();
+ url += firstDefaultName;
xml = fetchUrl(url, monitor.createSubMonitor(1), exception);
usingAlternateUrl = true;
+ } else {
+ monitor.incProgress(1);
}
+ // FIXME this needs to revisited.
if (xml != null) {
monitor.setDescription("Validate XML: %1$s", url);
@@ -348,11 +405,11 @@ public abstract class SdkSource implements IDescription, Comparable<SdkSource> {
// If we haven't already tried the alternate URL, let's do it now.
// We don't capture any fetch exception that happen during the second
// fetch in order to avoid hidding any previous fetch errors.
- if (!url.endsWith(getUrlDefaultXmlFile())) {
+ if (!url.endsWith(firstDefaultName)) {
if (!url.endsWith("/")) { //$NON-NLS-1$
url += "/"; //$NON-NLS-1$
}
- url += getUrlDefaultXmlFile();
+ url += firstDefaultName;
xml = fetchUrl(url, subMonitor.createSubMonitor(1), null /* outException */);
subMonitor.incProgress(1);
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SourcePackage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SourcePackage.java
index 8b928c7..c33d949 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SourcePackage.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SourcePackage.java
@@ -72,8 +72,9 @@ public class SourcePackage extends Package implements IPackageVersion {
protected SourcePackage(
AndroidVersion platformVersion,
int revision,
- Properties props) {
- this(null /*source*/, platformVersion, revision, props);
+ Properties props,
+ String localOsPath) {
+ this(null /*source*/, platformVersion, revision, props, localOsPath);
}
@VisibleForTesting(visibility=Visibility.PRIVATE)
@@ -81,7 +82,8 @@ public class SourcePackage extends Package implements IPackageVersion {
SdkSource source,
AndroidVersion platformVersion,
int revision,
- Properties props) {
+ Properties props,
+ String localOsPath) {
super( source, //source
props, //properties
revision, //revision
@@ -90,7 +92,7 @@ public class SourcePackage extends Package implements IPackageVersion {
null, //descUrl
Os.getCurrentOs(), //archiveOs
Arch.getCurrentArch(), //archiveArch
- null //archiveOsPath
+ localOsPath //archiveOsPath
);
mVersion = platformVersion;
}
@@ -119,7 +121,7 @@ public class SourcePackage extends Package implements IPackageVersion {
version = new AndroidVersion(props);
// The constructor will extract the revision from the properties
// and it will not consider a missing revision as being fatal.
- return new SourcePackage(version, 0 /*revision*/, props);
+ return new SourcePackage(version, 0 /*revision*/, props, srcDir.getAbsolutePath());
} catch (AndroidVersionException e) {
error = String.format("Invalid file %1$s: %2$s",
SdkConstants.FN_SOURCE_PROP,
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SystemImagePackage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SystemImagePackage.java
index 63d7732..3e8363c 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SystemImagePackage.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SystemImagePackage.java
@@ -77,8 +77,9 @@ public class SystemImagePackage extends Package
AndroidVersion platformVersion,
int revision,
String abi,
- Properties props) {
- this(null /*source*/, platformVersion, revision, abi, props);
+ Properties props,
+ String localOsPath) {
+ this(null /*source*/, platformVersion, revision, abi, props, localOsPath);
}
@VisibleForTesting(visibility=Visibility.PRIVATE)
@@ -87,7 +88,8 @@ public class SystemImagePackage extends Package
AndroidVersion platformVersion,
int revision,
String abi,
- Properties props) {
+ Properties props,
+ String localOsPath) {
super( source, //source
props, //properties
revision, //revision
@@ -96,7 +98,7 @@ public class SystemImagePackage extends Package
null, //descUrl
Os.getCurrentOs(), //archiveOs
Arch.getCurrentArch(), //archiveArch
- null //archiveOsPath
+ localOsPath //archiveOsPath
);
mVersion = platformVersion;
if (abi == null && props != null) {
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/io/FileOp.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/io/FileOp.java
index 4600e68..efab4ad 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/io/FileOp.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/io/FileOp.java
@@ -95,8 +95,11 @@ public class FileOp implements IFileOp {
if (fileOrFolder != null) {
if (isDirectory(fileOrFolder)) {
// Must delete content recursively first
- for (File item : fileOrFolder.listFiles()) {
- deleteFileOrFolder(item);
+ File[] files = fileOrFolder.listFiles();
+ if (files != null) {
+ for (File item : files) {
+ deleteFileOrFolder(item);
+ }
}
}
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/SdkRepoConstants.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/SdkRepoConstants.java
index b7701fe..bbd5f7a 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/SdkRepoConstants.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/SdkRepoConstants.java
@@ -26,6 +26,10 @@ import java.io.InputStream;
*/
public class SdkRepoConstants extends RepoConstants {
+ /** The latest version of the sdk-repository XML Schema.
+ * Valid version numbers are between 1 and this number, included. */
+ public static final int NS_LATEST_VERSION = 5;
+
/** The URL of the official Google sdk-repository site. */
public static final String URL_GOOGLE_SDK_SITE =
"https://dl-ssl.google.com/android/repository/"; //$NON-NLS-1$
@@ -34,6 +38,13 @@ public class SdkRepoConstants extends RepoConstants {
* sdk-repository XML if the URL doesn't match an existing resource. */
public static final String URL_DEFAULT_FILENAME = "repository.xml"; //$NON-NLS-1$
+ /** The pattern name looked by {@link SdkSource} when trying to load
+ * the latest sdk-repository XML that is specific to the current XSD
+ * schema revision.
+ */
+ public static final String URL_DEFAULT_FILENAME2 =
+ String.format("repository-%d.xml", NS_LATEST_VERSION); //$NON-NLS-1$
+
/** The base of our sdk-repository XML namespace. */
private static final String NS_BASE =
"http://schemas.android.com/sdk/android/repository/"; //$NON-NLS-1$
@@ -44,10 +55,6 @@ public class SdkRepoConstants extends RepoConstants {
*/
public static final String NS_PATTERN = NS_BASE + "([1-9][0-9]*)"; //$NON-NLS-1$
- /** The latest version of the sdk-repository XML Schema.
- * Valid version numbers are between 1 and this number, included. */
- public static final int NS_LATEST_VERSION = 5;
-
/** The XML namespace of the latest sdk-repository XML. */
public static final String NS_URI = getSchemaUri(NS_LATEST_VERSION);
diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/MockBrokenPackage.java b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/MockBrokenPackage.java
index b64af25..9ea9dfa 100755
--- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/MockBrokenPackage.java
+++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/MockBrokenPackage.java
@@ -50,6 +50,6 @@ public class MockBrokenPackage extends BrokenPackage {
longDescription,
minApiLevel,
exactApiLevel,
- null /*osPath*/);
+ "/sdk/broken/package" /*osPath*/);
}
}
diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/MockEmptyPackage.java b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/MockEmptyPackage.java
index 040d18d..7fdee5b 100755
--- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/MockEmptyPackage.java
+++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/MockEmptyPackage.java
@@ -48,7 +48,7 @@ public class MockEmptyPackage extends Package {
null /*descUrl*/,
Os.ANY /*archiveOs*/,
Arch.ANY /*archiveArch*/,
- null /*archiveOsPath*/
+ "/sdk/tmp/empty_pkg" /*archiveOsPath*/
);
mTestHandle = testHandle;
}
@@ -69,7 +69,7 @@ public class MockEmptyPackage extends Package {
null /*descUrl*/,
Os.ANY /*archiveOs*/,
Arch.ANY /*archiveArch*/,
- null /*archiveOsPath*/
+ "/sdk/tmp/empty_pkg" /*archiveOsPath*/
);
mTestHandle = testHandle;
}
@@ -91,7 +91,7 @@ public class MockEmptyPackage extends Package {
null /*descUrl*/,
Os.ANY /*archiveOs*/,
Arch.ANY /*archiveArch*/,
- null /*archiveOsPath*/
+ "/sdk/tmp/empty_pkg" /*archiveOsPath*/
);
mTestHandle = testHandle;
}
diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/MockSourcePackage.java b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/MockSourcePackage.java
index f45e79a..ea65566 100755
--- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/MockSourcePackage.java
+++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/MockSourcePackage.java
@@ -32,7 +32,10 @@ public class MockSourcePackage extends SourcePackage {
* By design, this package contains one and only one archive.
*/
public MockSourcePackage(AndroidVersion version, int revision) {
- super(version, revision, null /*props*/);
+ super(version,
+ revision,
+ null /*props*/,
+ String.format("/sdk/sources/android-%s", version.getApiString()));
}
/**
@@ -45,6 +48,10 @@ public class MockSourcePackage extends SourcePackage {
SdkSource source,
AndroidVersion version,
int revision) {
- super(source, version, revision, null /*props*/);
+ super(source,
+ version,
+ revision,
+ null /*props*/,
+ String.format("/sdk/sources/android-%s", version.getApiString()));
}
}
diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/MockSystemImagePackage.java b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/MockSystemImagePackage.java
index 53f3a54..3237fbb 100755
--- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/MockSystemImagePackage.java
+++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/MockSystemImagePackage.java
@@ -30,7 +30,12 @@ public class MockSystemImagePackage extends SystemImagePackage {
* By design, this package contains one and only one archive.
*/
public MockSystemImagePackage(MockPlatformPackage basePlatform, int revision, String abi) {
- super(basePlatform.getVersion(), revision, abi, null /*props*/);
+ super(basePlatform.getVersion(),
+ revision,
+ abi,
+ null /*props*/,
+ String.format("/sdk/system-images/android-%s/%s",
+ basePlatform.getVersion().getApiString(), abi));
}
/**
@@ -44,6 +49,12 @@ public class MockSystemImagePackage extends SystemImagePackage {
MockPlatformPackage basePlatform,
int revision,
String abi) {
- super(source, basePlatform.getVersion(), revision, abi, null /*props*/);
+ super(source,
+ basePlatform.getVersion(),
+ revision,
+ abi,
+ null /*props*/,
+ String.format("/sdk/system-images/android-%s/%s",
+ basePlatform.getVersion().getApiString(), abi));
}
}
diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/SourcePackageTest.java b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/SourcePackageTest.java
index 2558546..2311feb 100755
--- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/SourcePackageTest.java
+++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/SourcePackageTest.java
@@ -37,7 +37,10 @@ public class SourcePackageTest extends PackageTest {
AndroidVersion platformVersion,
int revision,
Properties props) {
- super(platformVersion, revision, props);
+ super(platformVersion,
+ revision,
+ props,
+ String.format("/sdk/sources/android-%s", platformVersion.getApiString()));
}
@Override
diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/SystemImagePackageTest.java b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/SystemImagePackageTest.java
index 14a8c3b..e6f0a2d 100755
--- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/SystemImagePackageTest.java
+++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/SystemImagePackageTest.java
@@ -38,7 +38,12 @@ public class SystemImagePackageTest extends PackageTest {
int revision,
String abi,
Properties props) {
- super(platformVersion, revision, abi, props);
+ super(platformVersion,
+ revision,
+ abi,
+ props,
+ String.format("/sdk/system-images/android-%s/%s",
+ platformVersion.getApiString(), abi));
}
@Override
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 d59e67b..cb26576 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
@@ -337,10 +337,12 @@ public class UpdaterData implements IUpdaterData {
for (String url : urls) {
if (url != null) {
url = url.trim();
- if (url.endsWith("/") || url.endsWith(SdkRepoConstants.URL_DEFAULT_FILENAME)) {
+ if (url.endsWith("/")
+ || url.endsWith(SdkRepoConstants.URL_DEFAULT_FILENAME)
+ || url.endsWith(SdkRepoConstants.URL_DEFAULT_FILENAME2)) {
String fullUrl = url;
if (fullUrl.endsWith("/")) {
- fullUrl += SdkRepoConstants.URL_DEFAULT_FILENAME;
+ fullUrl += SdkRepoConstants.URL_DEFAULT_FILENAME2;
}
SdkSource s = new SdkRepoSource(fullUrl, null/*uiName*/);