Merge "Add support for hv protocol that works via DDM"
diff --git a/anttasks/.classpath b/anttasks/.classpath
index 39171d9..f214a3b 100644
--- a/anttasks/.classpath
+++ b/anttasks/.classpath
@@ -2,10 +2,10 @@
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry combineaccessrules="false" kind="src" path="/SdkLib"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/sdklib"/>
<classpathentry kind="var" path="ANDROID_SRC/prebuilts/tools/common/ant/ant.jar"/>
<classpathentry combineaccessrules="false" kind="src" path="/common"/>
- <classpathentry combineaccessrules="false" kind="src" path="/ManifestMerger"/>
<classpathentry kind="var" path="ANDROID_SRC/prebuilts/tools/common/guava-tools/guava-13.0.1.jar" sourcepath="ANDROID_SRC/prebuilts/tools/common/guava-tools/src.zip"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/manifest-merger"/>
<classpathentry kind="output" path="bin"/>
</classpath>
diff --git a/anttasks/Android.mk b/anttasks/Android.mk
index 5139400..9922f53 100644
--- a/anttasks/Android.mk
+++ b/anttasks/Android.mk
@@ -22,6 +22,7 @@
LOCAL_JAR_MANIFEST := etc/manifest.txt
LOCAL_JAVA_LIBRARIES := \
+ common \
sdklib \
manifmerger \
ant
diff --git a/build/product_sdk.mk b/build/product_sdk.mk
index 48a0367..226dba3 100644
--- a/build/product_sdk.mk
+++ b/build/product_sdk.mk
@@ -51,11 +51,9 @@
ninepatch-tests \
rule_api \
sdklib \
- sdklib-tests \
sdkmanager \
sdkstats \
sdkuilib \
- sdkuilib-tests \
swtmenubar \
traceview \
uiautomatorviewer \
diff --git a/build/tools.atree b/build/tools.atree
index f3d34c6..af88dad 100644
--- a/build/tools.atree
+++ b/build/tools.atree
@@ -192,8 +192,6 @@
sdk/testapps tests/testapps
framework/ninepatch-tests.jar tests/libtests/ninepatch-tests.jar
framework/common-tests.jar tests/libtests/common-tests.jar
-framework/sdklib-tests.jar tests/libtests/sdklib-tests.jar
-framework/sdkuilib-tests.jar tests/libtests/sdkuilib-tests.jar
framework/layoutlib_api.jar tests/libtests/layoutlib_api.jar
framework/dvlib-tests.jar tests/libtests/dvlib-tests.jar
diff --git a/lint/cli/.classpath b/lint/cli/.classpath
index 3278842..f698d34 100644
--- a/lint/cli/.classpath
+++ b/lint/cli/.classpath
@@ -10,6 +10,6 @@
<classpathentry kind="var" path="ANDROID_SRC/prebuilts/tools/common/asm-tools/asm-analysis-4.0.jar" sourcepath="/ANDROID_SRC/prebuilts/tools/common/asm-tools/src-4.0.zip"/>
<classpathentry kind="var" path="ANDROID_SRC/prebuilts/tools/common/guava-tools/guava-13.0.1.jar" sourcepath="/ANDROID_SRC/prebuilts/tools/common/guava-tools/src-4.0.zip"/>
<classpathentry kind="var" path="ANDROID_SRC/prebuilts/tools/common/lombok-ast/lombok-ast-0.2.jar" sourcepath="/ANDROID_SRC/prebuilts/tools/common/lombok-ast/src-4.0.zip"/>
- <classpathentry combineaccessrules="false" kind="src" path="/SdkLib"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/sdklib"/>
<classpathentry kind="output" path="bin"/>
</classpath>
diff --git a/lint/libs/lint_api/.classpath b/lint/libs/lint_api/.classpath
index b9f0a8a..63e37d2 100644
--- a/lint/libs/lint_api/.classpath
+++ b/lint/libs/lint_api/.classpath
@@ -8,6 +8,6 @@
<classpathentry kind="var" path="ANDROID_SRC/prebuilts/tools/common/guava-tools/guava-13.0.1.jar" sourcepath="/ANDROID_SRC/prebuilts/tools/common/guava-tools/src-4.0.zip"/>
<classpathentry kind="var" path="ANDROID_SRC/prebuilts/tools/common/lombok-ast/lombok-ast-0.2.jar" sourcepath="/ANDROID_SRC/prebuilts/tools/common/lombok-ast/src-4.0.zip"/>
<classpathentry combineaccessrules="false" kind="src" path="/layoutlib_api"/>
- <classpathentry combineaccessrules="false" kind="src" path="/SdkLib"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/sdklib"/>
<classpathentry kind="output" path="bin"/>
</classpath>
diff --git a/lint/libs/lint_checks/.classpath b/lint/libs/lint_checks/.classpath
index 51eb645..03bbecd 100644
--- a/lint/libs/lint_checks/.classpath
+++ b/lint/libs/lint_checks/.classpath
@@ -10,6 +10,6 @@
<classpathentry kind="var" path="ANDROID_SRC/prebuilts/tools/common/lombok-ast/lombok-ast-0.2.jar" sourcepath="/ANDROID_SRC/prebuilts/tools/common/lombok-ast/src-4.0.zip"/>
<classpathentry combineaccessrules="false" kind="src" path="/layoutlib_api"/>
<classpathentry combineaccessrules="false" kind="src" path="/common"/>
- <classpathentry combineaccessrules="false" kind="src" path="/SdkLib"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/sdklib"/>
<classpathentry kind="output" path="bin"/>
</classpath>
diff --git a/sdkmanager/app/.classpath b/sdkmanager/app/.classpath
index ba2dc0c..b06fd5a 100644
--- a/sdkmanager/app/.classpath
+++ b/sdkmanager/app/.classpath
@@ -4,7 +4,7 @@
<classpathentry excluding="**/Android.mk" kind="src" path="tests"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry combineaccessrules="false" kind="src" path="/sdklib"/>
- <classpathentry combineaccessrules="false" kind="src" path="/SdkUiLib"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/sdkuilib"/>
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/>
<classpathentry combineaccessrules="false" kind="src" path="/common"/>
<classpathentry kind="var" path="ANDROID_OUT_FRAMEWORK/swt.jar"/>
diff --git a/sdkmanager/app/tests/Android.mk b/sdkmanager/app/tests/Android.mk
index 4f67370..7b88129 100644
--- a/sdkmanager/app/tests/Android.mk
+++ b/sdkmanager/app/tests/Android.mk
@@ -23,6 +23,12 @@
LOCAL_MODULE := sdkmanager-tests
LOCAL_MODULE_TAGS := optional
-LOCAL_JAVA_LIBRARIES := sdkmanager sdklib-tests junit
+LOCAL_JAVA_LIBRARIES := \
+ httpclient-4.1.1 \
+ httpcore-4.1 \
+ httpmime-4.1.1 \
+ junit \
+ sdkmanager \
+ sdklib
include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/SdkManagerTestCase.java b/sdkmanager/app/tests/com/android/sdklib/SdkManagerTestCase.java
similarity index 97%
rename from sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/SdkManagerTestCase.java
rename to sdkmanager/app/tests/com/android/sdklib/SdkManagerTestCase.java
index 86a555a..ab45785 100755
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/SdkManagerTestCase.java
+++ b/sdkmanager/app/tests/com/android/sdklib/SdkManagerTestCase.java
@@ -14,6 +14,14 @@
* limitations under the License.
*/
+
+/*
+ Note: this file is duplicated from tools/base/sdklib/src/tests.
+ The version of sdkmanager-tests in sdk.git does no longer have
+ access to sdklib-tests.
+ FIXME: if this generic enough, move it to test-utils.
+*/
+
package com.android.sdklib;
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/mock/MockLog.java b/sdkmanager/app/tests/com/android/sdklib/mock/MockLog.java
similarity index 90%
rename from sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/mock/MockLog.java
rename to sdkmanager/app/tests/com/android/sdklib/mock/MockLog.java
index f2e30d2..e64ed51 100644
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/mock/MockLog.java
+++ b/sdkmanager/app/tests/com/android/sdklib/mock/MockLog.java
@@ -14,6 +14,14 @@
* limitations under the License.
*/
+
+/*
+ Note: this file is duplicated from tools/base/sdklib/src/tests.
+ The version of sdkmanager-tests in sdk.git does no longer have
+ access to sdklib-tests.
+ FIXME: if this generic enough, move it to test-utils.
+*/
+
package com.android.sdklib.mock;
import com.android.annotations.NonNull;
diff --git a/sdkmanager/libs/sdklib/Android.mk b/sdkmanager/libs/sdklib/Android.mk
index e5e1a27..dfd3fcb 100644
--- a/sdkmanager/libs/sdklib/Android.mk
+++ b/sdkmanager/libs/sdklib/Android.mk
@@ -12,15 +12,18 @@
# 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.
-#
+
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_SRC_FILES := $(call all-java-files-under, src/main/java)
-LOCAL_JAVA_RESOURCE_DIRS := src/main/java
+# The sdklib code has moved to tools/base/sdklib.
+# The rule below uses the prebuilt sdklib.jar if found.
+#
+# If you want to run the tests, cd to tools/base
+# and run ./gradlew :sdklib:test
-LOCAL_JAR_MANIFEST := manifest.txt
-
+LOCAL_MODULE := sdklib
+LOCAL_MODULE_TAGS := optional
# IMPORTANT: if you add a new dependency here, please make sure
# to also check the following files:
# sdkmanager/sdklib/manifest.txt
@@ -38,21 +41,8 @@
mkidentity-prebuilt \
layoutlib_api
-LOCAL_MODULE := sdklib
+LOCAL_PREBUILT_JAVA_LIBRARIES := \
+ ../../../../prebuilts/devtools/$(LOCAL_MODULE)/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
-include $(BUILD_HOST_JAVA_LIBRARY)
+include $(BUILD_HOST_PREBUILT)
-
-# Build tests
-include $(CLEAR_VARS)
-
-# Only compile source java files in this lib.
-LOCAL_SRC_FILES := $(call all-java-files-under, src/test/java)
-LOCAL_JAVA_RESOURCE_DIRS := src/test/java
-
-LOCAL_MODULE := sdklib-tests
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_JAVA_LIBRARIES := sdklib junit dvlib-tests
-
-include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/AddOnTarget.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/AddOnTarget.java
deleted file mode 100644
index 12d4a49..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/AddOnTarget.java
+++ /dev/null
@@ -1,462 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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;
-
-import com.android.SdkConstants;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Map.Entry;
-
-/**
- * Represents an add-on target in the SDK.
- * An add-on extends a standard {@link PlatformTarget}.
- */
-final class AddOnTarget implements IAndroidTarget {
- /**
- * String to compute hash for add-on targets.
- * Format is vendor:name:apiVersion
- * */
- private final static String ADD_ON_FORMAT = "%s:%s:%s"; //$NON-NLS-1$
-
- private final static class OptionalLibrary implements IOptionalLibrary {
- private final String mJarName;
- private final String mJarPath;
- private final String mName;
- private final String mDescription;
-
- OptionalLibrary(String jarName, String jarPath, String name, String description) {
- mJarName = jarName;
- mJarPath = jarPath;
- mName = name;
- mDescription = description;
- }
-
- @Override
- public String getJarName() {
- return mJarName;
- }
-
- @Override
- public String getJarPath() {
- return mJarPath;
- }
-
- @Override
- public String getName() {
- return mName;
- }
-
- @Override
- public String getDescription() {
- return mDescription;
- }
- }
-
- private final String mLocation;
- private final PlatformTarget mBasePlatform;
- private final String mName;
- private final ISystemImage[] mSystemImages;
- private final String mVendor;
- private final int mRevision;
- private final String mDescription;
- private final boolean mHasRenderingLibrary;
- private final boolean mHasRenderingResources;
-
- private String[] mSkins;
- private String mDefaultSkin;
- private IOptionalLibrary[] mLibraries;
- private int mVendorId = NO_USB_ID;
-
- /**
- * Creates a new add-on
- * @param location the OS path location of the add-on
- * @param name the name of the add-on
- * @param vendor the vendor name of the add-on
- * @param revision the revision of the add-on
- * @param description the add-on description
- * @param systemImages list of supported system images. Can be null or empty.
- * @param libMap A map containing the optional libraries. The map key is the fully-qualified
- * library name. The value is a 2 string array with the .jar filename, and the description.
- * @param hasRenderingLibrary whether the addon has a custom layoutlib.jar
- * @param hasRenderingResources whether the add has custom framework resources.
- * @param basePlatform the platform the add-on is extending.
- */
- AddOnTarget(
- String location,
- String name,
- String vendor,
- int revision,
- String description,
- ISystemImage[] systemImages,
- Map<String, String[]> libMap,
- boolean hasRenderingLibrary,
- boolean hasRenderingResources,
- PlatformTarget basePlatform) {
- if (location.endsWith(File.separator) == false) {
- location = location + File.separator;
- }
-
- mLocation = location;
- mName = name;
- mVendor = vendor;
- mRevision = revision;
- mDescription = description;
- mHasRenderingLibrary = hasRenderingLibrary;
- mHasRenderingResources = hasRenderingResources;
- mBasePlatform = basePlatform;
-
- // If the add-on does not have any system-image of its own, the list here
- // is empty and it's up to the callers to query the parent platform.
- mSystemImages = systemImages == null ? new ISystemImage[0] : systemImages;
- Arrays.sort(mSystemImages);
-
- // handle the optional libraries.
- if (libMap != null) {
- mLibraries = new IOptionalLibrary[libMap.size()];
- int index = 0;
- for (Entry<String, String[]> entry : libMap.entrySet()) {
- String jarFile = entry.getValue()[0];
- String desc = entry.getValue()[1];
- mLibraries[index++] = new OptionalLibrary(jarFile,
- mLocation + SdkConstants.OS_ADDON_LIBS_FOLDER + jarFile,
- entry.getKey(), desc);
- }
- }
- }
-
- @Override
- public String getLocation() {
- return mLocation;
- }
-
- @Override
- public String getName() {
- return mName;
- }
-
- @Override
- public ISystemImage getSystemImage(String abiType) {
- for (ISystemImage sysImg : mSystemImages) {
- if (sysImg.getAbiType().equals(abiType)) {
- return sysImg;
- }
- }
- return null;
- }
-
- @Override
- public ISystemImage[] getSystemImages() {
- return mSystemImages;
- }
-
- @Override
- public String getVendor() {
- return mVendor;
- }
-
- @Override
- public String getFullName() {
- return String.format("%1$s (%2$s)", mName, mVendor);
- }
-
- @Override
- public String getClasspathName() {
- return String.format("%1$s [%2$s]", mName, mBasePlatform.getClasspathName());
- }
-
- @Override
- public String getShortClasspathName() {
- return String.format("%1$s [%2$s]", mName, mBasePlatform.getVersionName());
- }
-
- @Override
- public String getDescription() {
- return mDescription;
- }
-
- @Override
- public AndroidVersion getVersion() {
- // this is always defined by the base platform
- return mBasePlatform.getVersion();
- }
-
- @Override
- public String getVersionName() {
- return mBasePlatform.getVersionName();
- }
-
- @Override
- public int getRevision() {
- return mRevision;
- }
-
- @Override
- public boolean isPlatform() {
- return false;
- }
-
- @Override
- public IAndroidTarget getParent() {
- return mBasePlatform;
- }
-
- @Override
- public String getPath(int pathId) {
- switch (pathId) {
- case SKINS:
- return mLocation + SdkConstants.OS_SKINS_FOLDER;
- case DOCS:
- return mLocation + SdkConstants.FD_DOCS + File.separator
- + SdkConstants.FD_DOCS_REFERENCE;
-
- case LAYOUT_LIB:
- if (mHasRenderingLibrary) {
- return mLocation + SdkConstants.FD_DATA + File.separator
- + SdkConstants.FN_LAYOUTLIB_JAR;
- }
- return mBasePlatform.getPath(pathId);
-
- case RESOURCES:
- if (mHasRenderingResources) {
- return mLocation + SdkConstants.FD_DATA + File.separator
- + SdkConstants.FD_RES;
- }
- return mBasePlatform.getPath(pathId);
-
- case FONTS:
- if (mHasRenderingResources) {
- return mLocation + SdkConstants.FD_DATA + File.separator
- + SdkConstants.FD_FONTS;
- }
- return mBasePlatform.getPath(pathId);
-
- case SAMPLES:
- // only return the add-on samples folder if there is actually a sample (or more)
- File sampleLoc = new File(mLocation, SdkConstants.FD_SAMPLES);
- if (sampleLoc.isDirectory()) {
- File[] files = sampleLoc.listFiles(new FileFilter() {
- @Override
- public boolean accept(File pathname) {
- return pathname.isDirectory();
- }
-
- });
- if (files != null && files.length > 0) {
- return sampleLoc.getAbsolutePath();
- }
- }
- //$FALL-THROUGH$
- default :
- return mBasePlatform.getPath(pathId);
- }
- }
-
- @Override
- public boolean hasRenderingLibrary() {
- return mHasRenderingLibrary || mHasRenderingResources;
- }
-
- @Override
- public String[] getSkins() {
- return mSkins;
- }
-
- @Override
- public String getDefaultSkin() {
- return mDefaultSkin;
- }
-
- @Override
- public IOptionalLibrary[] getOptionalLibraries() {
- return mLibraries;
- }
-
- /**
- * Returns the list of libraries of the underlying platform.
- *
- * {@inheritDoc}
- */
- @Override
- public String[] getPlatformLibraries() {
- return mBasePlatform.getPlatformLibraries();
- }
-
- @Override
- public String getProperty(String name) {
- return mBasePlatform.getProperty(name);
- }
-
- @Override
- public Integer getProperty(String name, Integer defaultValue) {
- return mBasePlatform.getProperty(name, defaultValue);
- }
-
- @Override
- public Boolean getProperty(String name, Boolean defaultValue) {
- return mBasePlatform.getProperty(name, defaultValue);
- }
-
- @Override
- public Map<String, String> getProperties() {
- return mBasePlatform.getProperties();
- }
-
- @Override
- public int getUsbVendorId() {
- return mVendorId;
- }
-
- @Override
- public boolean canRunOn(IAndroidTarget target) {
- // basic test
- if (target == this) {
- return true;
- }
-
- /*
- * The method javadoc indicates:
- * Returns whether the given target is compatible with the receiver.
- * <p/>A target is considered compatible if applications developed for the receiver can
- * run on the given target.
- */
-
- // The receiver is an add-on. There are 2 big use cases: The add-on has libraries
- // or the add-on doesn't (in which case we consider it a platform).
- if (mLibraries == null || mLibraries.length == 0) {
- return mBasePlatform.canRunOn(target);
- } else {
- // the only targets that can run the receiver are the same add-on in the same or later
- // versions.
- // first check: vendor/name
- if (mVendor.equals(target.getVendor()) == false ||
- mName.equals(target.getName()) == false) {
- return false;
- }
-
- // now check the version. At this point since we checked the add-on part,
- // we can revert to the basic check on version/codename which are done by the
- // base platform already.
- return mBasePlatform.canRunOn(target);
- }
-
- }
-
- @Override
- public String hashString() {
- return String.format(ADD_ON_FORMAT, mVendor, mName,
- mBasePlatform.getVersion().getApiString());
- }
-
- @Override
- public int hashCode() {
- return hashString().hashCode();
- }
-
- @Override
- public boolean equals(Object obj) {
- if (obj instanceof AddOnTarget) {
- AddOnTarget addon = (AddOnTarget)obj;
-
- return mVendor.equals(addon.mVendor) && mName.equals(addon.mName) &&
- mBasePlatform.getVersion().equals(addon.mBasePlatform.getVersion());
- }
-
- return false;
- }
-
- /*
- * Order by API level (preview/n count as between n and n+1).
- * At the same API level, order as: Platform first, then add-on ordered by vendor and then name
- * (non-Javadoc)
- * @see java.lang.Comparable#compareTo(java.lang.Object)
- */
- @Override
- public int compareTo(IAndroidTarget target) {
- // quick check.
- if (this == target) {
- return 0;
- }
-
- int versionDiff = getVersion().compareTo(target.getVersion());
-
- // only if the version are the same do we care about platform/add-ons.
- if (versionDiff == 0) {
- // platforms go before add-ons.
- if (target.isPlatform()) {
- return +1;
- } else {
- AddOnTarget targetAddOn = (AddOnTarget)target;
-
- // both are add-ons of the same version. Compare per vendor then by name
- int vendorDiff = mVendor.compareTo(targetAddOn.mVendor);
- if (vendorDiff == 0) {
- return mName.compareTo(targetAddOn.mName);
- } else {
- return vendorDiff;
- }
- }
-
- }
-
- return versionDiff;
- }
-
- /**
- * Returns a string representation suitable for debugging.
- * The representation is not intended for display to the user.
- *
- * The representation is also purposely compact. It does not describe _all_ the properties
- * of the target, only a few key ones.
- *
- * @see #getDescription()
- */
- @Override
- public String toString() {
- return String.format("AddonTarget %1$s rev %2$d (based on %3$s)", //$NON-NLS-1$
- getVersion(),
- getRevision(),
- getParent().toString());
- }
-
- // ---- local methods.
-
- void setSkins(String[] skins, String defaultSkin) {
- mDefaultSkin = defaultSkin;
-
- // we mix the add-on and base platform skins
- HashSet<String> skinSet = new HashSet<String>();
- skinSet.addAll(Arrays.asList(skins));
- skinSet.addAll(Arrays.asList(mBasePlatform.getSkins()));
-
- mSkins = skinSet.toArray(new String[skinSet.size()]);
- }
-
- /**
- * Sets the USB vendor id in the add-on.
- */
- void setUsbVendorId(int vendorId) {
- if (vendorId == 0) {
- throw new IllegalArgumentException( "VendorId must be > 0");
- }
-
- mVendorId = vendorId;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/AndroidVersion.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/AndroidVersion.java
deleted file mode 100644
index 44ffa63..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/AndroidVersion.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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;
-
-import com.android.SdkConstants;
-import com.android.annotations.Nullable;
-import com.android.sdklib.repository.PkgProps;
-
-import java.util.Properties;
-
-/**
- * Represents the version of a target or device.
- * <p/>
- * A version is defined by an API level and an optional code name.
- * <ul><li>Release versions of the Android platform are identified by their API level (integer),
- * (technically the code name for release version is "REL" but this class will return
- * <code>null<code> instead.)</li>
- * <li>Preview versions of the platform are identified by a code name. Their API level
- * is usually set to the value of the previous platform.</li></ul>
- * <p/>
- * While this class contains both values, its goal is to abstract them, so that code comparing 2+
- * versions doesn't have to deal with the logic of handle both values.
- * <p/>
- * There are some cases where ones may want to access the values directly. This can be done
- * with {@link #getApiLevel()} and {@link #getCodename()}.
- * <p/>
- * For generic UI display of the API version, {@link #getApiString()} is to be used.
- */
-public final class AndroidVersion implements Comparable<AndroidVersion> {
-
- private final int mApiLevel;
- private final String mCodename;
-
- /**
- * Thrown when an {@link AndroidVersion} object could not be created.
- * @see AndroidVersion#AndroidVersion(Properties)
- */
- public final static class AndroidVersionException extends Exception {
- private static final long serialVersionUID = 1L;
-
- AndroidVersionException(String message, Throwable cause) {
- super(message, cause);
- }
- }
-
- /**
- * Creates an {@link AndroidVersion} with the given api level and codename.
- * Codename should be null for a release version, otherwise it's a preview codename.
- */
- public AndroidVersion(int apiLevel, String codename) {
- mApiLevel = apiLevel;
- mCodename = sanitizeCodename(codename);
- }
-
- /**
- * Creates an {@link AndroidVersion} from {@link Properties}, with default values if the
- * {@link Properties} object doesn't contain the expected values.
- * <p/>The {@link Properties} is expected to have been filled with
- * {@link #saveProperties(Properties)}.
- */
- public AndroidVersion(Properties properties, int defaultApiLevel, String defaultCodeName) {
- if (properties == null) {
- mApiLevel = defaultApiLevel;
- mCodename = sanitizeCodename(defaultCodeName);
- } else {
- mApiLevel = Integer.parseInt(properties.getProperty(PkgProps.VERSION_API_LEVEL,
- Integer.toString(defaultApiLevel)));
- mCodename = sanitizeCodename(
- properties.getProperty(PkgProps.VERSION_CODENAME, defaultCodeName));
- }
- }
-
- /**
- * Creates an {@link AndroidVersion} from {@link Properties}. The properties must contain
- * android version information, or an exception will be thrown.
- * @throws AndroidVersionException if no Android version information have been found
- *
- * @see #saveProperties(Properties)
- */
- public AndroidVersion(Properties properties) throws AndroidVersionException {
- Exception error = null;
-
- String apiLevel = properties.getProperty(PkgProps.VERSION_API_LEVEL, null/*defaultValue*/);
- if (apiLevel != null) {
- try {
- mApiLevel = Integer.parseInt(apiLevel);
- mCodename = sanitizeCodename(properties.getProperty(PkgProps.VERSION_CODENAME,
- null/*defaultValue*/));
- return;
- } catch (NumberFormatException e) {
- error = e;
- }
- }
-
- // reaching here means the Properties object did not contain the apiLevel which is required.
- throw new AndroidVersionException(PkgProps.VERSION_API_LEVEL + " not found!", error);
- }
-
- public void saveProperties(Properties props) {
- props.setProperty(PkgProps.VERSION_API_LEVEL, Integer.toString(mApiLevel));
- if (mCodename != null) {
- props.setProperty(PkgProps.VERSION_CODENAME, mCodename);
- }
- }
-
- /**
- * Returns the api level as an integer.
- * <p/>For target that are in preview mode, this can be superseded by
- * {@link #getCodename()}.
- * <p/>To display the API level in the UI, use {@link #getApiString()}, which will use the
- * codename if applicable.
- * @see #getCodename()
- * @see #getApiString()
- */
- public int getApiLevel() {
- return mApiLevel;
- }
-
- /**
- * Returns the version code name if applicable, null otherwise.
- * <p/>If the codename is non null, then the API level should be ignored, and this should be
- * used as a unique identifier of the target instead.
- */
- public String getCodename() {
- return mCodename;
- }
-
- /**
- * Returns a string representing the API level and/or the code name.
- */
- public String getApiString() {
- if (mCodename != null) {
- return mCodename;
- }
-
- return Integer.toString(mApiLevel);
- }
-
- /**
- * Returns whether or not the version is a preview version.
- */
- public boolean isPreview() {
- return mCodename != null;
- }
-
- /**
- * Checks whether a device running a version similar to the receiver can run a project compiled
- * for the given <var>version</var>.
- * <p/>
- * Be aware that this is not a perfect test, as other properties could break compatibility
- * despite this method returning true. For a more comprehensive test, see
- * {@link IAndroidTarget#canRunOn(IAndroidTarget)}.
- * <p/>
- * Nevertheless, when testing if an application can run on a device (where there is no
- * access to the list of optional libraries), this method can give a good indication of whether
- * there is a chance the application could run, or if there's a direct incompatibility.
- */
- public boolean canRun(AndroidVersion appVersion) {
- // if the application is compiled for a preview version, the device must be running exactly
- // the same.
- if (appVersion.mCodename != null) {
- return appVersion.mCodename.equals(mCodename);
- }
-
- // otherwise, we check the api level (note that a device running a preview version
- // will have the api level of the previous platform).
- return mApiLevel >= appVersion.mApiLevel;
- }
-
- /**
- * Returns <code>true</code> if the AndroidVersion is an API level equals to
- * <var>apiLevel</var>.
- */
- public boolean equals(int apiLevel) {
- return mCodename == null && apiLevel == mApiLevel;
- }
-
- /**
- * Compares the receiver with either an {@link AndroidVersion} object or a {@link String}
- * object.
- * <p/>If <var>obj</var> is a {@link String}, then the method will first check if it's a string
- * representation of a number, in which case it'll compare it to the api level. Otherwise, it'll
- * compare it against the code name.
- * <p/>For all other type of object give as parameter, this method will return
- * <code>false</code>.
- */
- @Override
- public boolean equals(Object obj) {
- if (obj instanceof AndroidVersion) {
- AndroidVersion version = (AndroidVersion)obj;
-
- if (mCodename == null) {
- return version.mCodename == null &&
- mApiLevel == version.mApiLevel;
- } else {
- return mCodename.equals(version.mCodename) &&
- mApiLevel == version.mApiLevel;
- }
-
- } else if (obj instanceof String) {
- // if we have a code name, this must match.
- if (mCodename != null) {
- return mCodename.equals(obj);
- }
-
- // else we try to convert to a int and compare to the api level
- try {
- int value = Integer.parseInt((String)obj);
- return value == mApiLevel;
- } catch (NumberFormatException e) {
- // not a number? we'll return false below.
- }
- }
-
- return false;
- }
-
- @Override
- public int hashCode() {
- if (mCodename != null) {
- return mCodename.hashCode();
- }
-
- // there may be some collisions between the hashcode of the codename and the api level
- // but it's acceptable.
- return mApiLevel;
- }
-
- /**
- * Returns a string with the API Level and optional codename.
- * Useful for debugging.
- * For display purpose, please use {@link #getApiString()} instead.
- */
- @Override
- public String toString() {
- String s = String.format("API %1$d", mApiLevel); //$NON-NLS-1$
- if (isPreview()) {
- s += String.format(", %1$s preview", mCodename); //$NON-NLS-1$
- }
- return s;
- }
-
- /**
- * Compares this object with the specified object for order. Returns a
- * negative integer, zero, or a positive integer as this object is less
- * than, equal to, or greater than the specified object.
- *
- * @param o the Object to be compared.
- * @return a negative integer, zero, or a positive integer as this object is
- * less than, equal to, or greater than the specified object.
- */
- @Override
- public int compareTo(AndroidVersion o) {
- return compareTo(o.mApiLevel, o.mCodename);
- }
-
- public int compareTo(int apiLevel, String codename) {
- if (mCodename == null) {
- if (codename == null) {
- return mApiLevel - apiLevel;
- } else {
- if (mApiLevel == apiLevel) {
- return -1; // same api level but argument is a preview for next version
- }
-
- return mApiLevel - apiLevel;
- }
- } else {
- // 'this' is a preview
- if (mApiLevel == apiLevel) {
- if (codename == null) {
- return +1;
- } else {
- return mCodename.compareTo(codename); // strange case where the 2 previews
- // have different codename?
- }
- } else {
- return mApiLevel - apiLevel;
- }
- }
- }
-
- /**
- * Compares this version with the specified API and returns true if this version
- * is greater or equal than the requested API -- that is the current version is a
- * suitable min-api-level for the argument API.
- */
- public boolean isGreaterOrEqualThan(int api) {
- return compareTo(api, null /*codename*/) >= 0;
- }
-
- /**
- * Sanitizes the codename string according to the following rules:
- * - A codename should be {@code null} for a release version or it should be a non-empty
- * string for an actual preview.
- * - In input, spacing is trimmed since it is irrelevant.
- * - An empty string or the special codename "REL" means a release version
- * and is converted to {@code null}.
- *
- * @param codename A possible-null codename.
- * @return Null for a release version or a non-empty codename.
- */
- private @Nullable String sanitizeCodename(@Nullable String codename) {
- if (codename != null) {
- codename = codename.trim();
- if (codename.length() == 0 || SdkConstants.CODENAME_RELEASE.equals(codename)) {
- codename = null;
- }
- }
- return codename;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/IAndroidTarget.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/IAndroidTarget.java
deleted file mode 100644
index 18577cf..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/IAndroidTarget.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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;
-
-import java.util.Map;
-
-
-
-/**
- * A version of Android that applications can target when building.
- */
-public interface IAndroidTarget extends Comparable<IAndroidTarget> {
-
- /**
- * Prefix used to build hash strings for platform targets
- * @see SdkManager#getTargetFromHashString(String)
- */
- public static final String PLATFORM_HASH_PREFIX = "android-";
-
- /** OS Path to the "android.jar" file. */
- public final static int ANDROID_JAR = 1;
- /** OS Path to the "framework.aidl" file. */
- public final static int ANDROID_AIDL = 2;
- /** OS Path to the "samples" folder which contains sample projects. */
- public final static int SAMPLES = 4;
- /** OS Path to the "skins" folder which contains the emulator skins. */
- public final static int SKINS = 5;
- /** OS Path to the "templates" folder which contains the templates for new projects. */
- public final static int TEMPLATES = 6;
- /** OS Path to the "data" folder which contains data & libraries for the SDK tools. */
- public final static int DATA = 7;
- /** OS Path to the "attrs.xml" file. */
- public final static int ATTRIBUTES = 8;
- /** OS Path to the "attrs_manifest.xml" file. */
- public final static int MANIFEST_ATTRIBUTES = 9;
- /** OS Path to the "data/layoutlib.jar" library. */
- public final static int LAYOUT_LIB = 10;
- /** OS Path to the "data/res" folder. */
- public final static int RESOURCES = 11;
- /** OS Path to the "data/fonts" folder. */
- public final static int FONTS = 12;
- /** OS Path to the "data/widgets.txt" file. */
- public final static int WIDGETS = 13;
- /** OS Path to the "data/activity_actions.txt" file. */
- public final static int ACTIONS_ACTIVITY = 14;
- /** OS Path to the "data/broadcast_actions.txt" file. */
- public final static int ACTIONS_BROADCAST = 15;
- /** OS Path to the "data/service_actions.txt" file. */
- public final static int ACTIONS_SERVICE = 16;
- /** OS Path to the "data/categories.txt" file. */
- public final static int CATEGORIES = 17;
- /** OS Path to the "sources" folder. */
- public final static int SOURCES = 18;
- /** OS Path to the target specific docs */
- public final static int DOCS = 19;
- /** OS Path to the target's version of the aapt tool.
- * This is deprecated as aapt is now in the platform tools and not in the platform. */
- @Deprecated
- public final static int AAPT = 20;
- /** OS Path to the target's version of the aidl tool.
- * This is deprecated as aidl is now in the platform tools and not in the platform. */
- @Deprecated
- public final static int AIDL = 21;
- /** OS Path to the target's version of the dx too.<br>
- * This is deprecated as dx is now in the platform tools and not in the platform. */
- @Deprecated
- public final static int DX = 22;
- /** OS Path to the target's version of the dx.jar file.<br>
- * This is deprecated as dx.jar is now in the platform tools and not in the platform. */
- @Deprecated
- public final static int DX_JAR = 23;
- /** OS Path to the "ant" folder which contains the ant build rules (ver 2 and above) */
- public final static int ANT = 24;
- /** OS Path to the Renderscript include folder.
- * This is deprecated as this is now in the platform tools and not in the platform. */
- @Deprecated
- public final static int ANDROID_RS = 25;
- /** OS Path to the Renderscript(clang) include folder.
- * This is deprecated as this is now in the platform tools and not in the platform. */
- @Deprecated
- public final static int ANDROID_RS_CLANG = 26;
- /** OS Path to the "uiautomator.jar" file. */
- public final static int UI_AUTOMATOR_JAR = 27;
-
- /**
- * Return value for {@link #getUsbVendorId()} meaning no USB vendor IDs are defined by the
- * Android target.
- */
- public final static int NO_USB_ID = 0;
-
- /** An optional library provided by an Android Target */
- public interface IOptionalLibrary {
- /** The name of the library, as used in the manifest (<uses-library>). */
- String getName();
- /** The file name of the jar file. */
- String getJarName();
- /** Absolute OS path to the jar file. */
- String getJarPath();
- /** Description of the library. */
- String getDescription();
- }
-
- /**
- * Returns the target location.
- */
- String getLocation();
-
- /**
- * Returns the name of the vendor of the target.
- */
- String getVendor();
-
- /**
- * Returns the name of the target.
- */
- String getName();
-
- /**
- * Returns the full name of the target, possibly including vendor name.
- */
- String getFullName();
-
- /**
- * Returns the name to be displayed when representing all the libraries this target contains.
- */
- String getClasspathName();
-
- /**
- * Returns the name to be displayed when representing all the libraries this target contains.
- */
- String getShortClasspathName();
-
- /**
- * Returns the description of the target.
- */
- String getDescription();
-
- /**
- * Returns the version of the target. This is guaranteed to be non-null.
- */
- AndroidVersion getVersion();
-
- /**
- * Returns the platform version as a readable string.
- */
- public String getVersionName();
-
- /** Returns the revision number for the target. */
- int getRevision();
-
- /**
- * Returns true if the target is a standard Android platform.
- */
- boolean isPlatform();
-
- /**
- * Returns the parent target. This is likely to only be non <code>null</code> if
- * {@link #isPlatform()} returns <code>false</code>
- */
- IAndroidTarget getParent();
-
- /**
- * Returns the path of a platform component.
- * @param pathId the id representing the path to return. Any of the constants defined in the
- * {@link IAndroidTarget} interface can be used.
- */
- String getPath(int pathId);
-
- /**
- * Returns whether the target is able to render layouts.
- */
- boolean hasRenderingLibrary();
-
- /**
- * Returns the available skins for this target.
- */
- String[] getSkins();
-
- /**
- * Returns the default skin for this target.
- */
- String getDefaultSkin();
-
- /**
- * Returns the available optional libraries for this target.
- * @return an array of optional libraries or <code>null</code> if there is none.
- */
- IOptionalLibrary[] getOptionalLibraries();
-
- /**
- * Returns the list of libraries available for a given platform.
- *
- * @return an array of libraries provided by the platform or <code>null</code> if there is none.
- */
- String[] getPlatformLibraries();
-
- /**
- * Return the value of a given property for this target.
- * @return the property value or <code>null</code> if it was not found.
- */
- String getProperty(String name);
-
- /**
- * Returns the value of a given property for this target as an Integer value.
- * <p/> If the value is missing or is not an integer, the method will return the given default
- * value.
- * @param name the name of the property to return
- * @param defaultValue the default value to return.
- *
- * @see Integer#decode(String)
- */
- Integer getProperty(String name, Integer defaultValue);
-
- /**
- * Returns the value of a given property for this target as a Boolean value.
- * <p/> If the value is missing or is not an boolean, the method will return the given default
- * value.
- *
- * @param name the name of the property to return
- * @param defaultValue the default value to return.
- *
- * @see Boolean#valueOf(String)
- */
-
- Boolean getProperty(String name, Boolean defaultValue);
-
- /**
- * Returns all the properties associated with this target. This can be null if the target has
- * no properties.
- */
- Map<String, String> getProperties();
-
- /**
- * Returns the USB Vendor ID for the vendor of this target.
- * <p/>If the target defines no USB Vendor ID, then the method return 0.
- */
- int getUsbVendorId();
-
- /**
- * Returns an array of system images for this target.
- * The array can be empty but not null.
- */
- public ISystemImage[] getSystemImages();
-
- /**
- * Returns the system image information for the given {@code abiType}.
- *
- * @param abiType An ABI type string.
- * @return An existing {@link ISystemImage} for the requested {@code abiType}
- * or null if none exists for this type.
- */
- public ISystemImage getSystemImage(String abiType);
-
- /**
- * Returns whether the given target is compatible with the receiver.
- * <p/>
- * This means that a project using the receiver's target can run on the given target.
- * <br/>
- * Example:
- * <pre>
- * CupcakeTarget.canRunOn(DonutTarget) == true
- * </pre>.
- *
- * @param target the IAndroidTarget to test.
- */
- boolean canRunOn(IAndroidTarget target);
-
- /**
- * Returns a string able to uniquely identify a target.
- * Typically the target will encode information such as api level, whether it's a platform
- * or add-on, and if it's an add-on vendor and add-on name.
- */
- String hashString();
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/ISystemImage.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/ISystemImage.java
deleted file mode 100755
index 7a69030..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/ISystemImage.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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;
-
-import com.android.SdkConstants;
-
-import java.io.File;
-
-
-/**
- * Describes a system image as used by an {@link IAndroidTarget}.
- * A system image has an installation path, a location type and an ABI type.
- */
-public interface ISystemImage extends Comparable<ISystemImage> {
-
- /** Indicates the type of location for the system image folder in the SDK. */
- public enum LocationType {
- /**
- * The system image is located in the legacy platform's {@link SdkConstants#FD_IMAGES}
- * folder.
- * <p/>
- * Used by both platform and add-ons.
- */
- IN_PLATFORM_LEGACY,
-
- /**
- * The system image is located in a sub-directory of the platform's
- * {@link SdkConstants#FD_IMAGES} folder, allowing for multiple system
- * images within the platform.
- * <p/>
- * Used by both platform and add-ons.
- */
- IN_PLATFORM_SUBFOLDER,
-
- /**
- * The system image is located in the new SDK's {@link SdkConstants#FD_SYSTEM_IMAGES}
- * folder. Supported as of Tools R14 and Repository XSD version 5.
- * <p/>
- * Used <em>only</em> by both platform. This is not supported for add-ons yet.
- */
- IN_SYSTEM_IMAGE,
- }
-
- /** Returns the actual location of an installed system image. */
- public abstract File getLocation();
-
- /** Indicates the location strategy for this system image in the SDK. */
- public abstract LocationType getLocationType();
-
- /**
- * Returns the ABI type. For example, one of {@link SdkConstants#ABI_ARMEABI},
- * {@link SdkConstants#ABI_ARMEABI_V7A}, {@link SdkConstants#ABI_INTEL_ATOM} or
- * {@link SdkConstants#ABI_MIPS}.
- * Cannot be null nor empty.
- */
- public abstract String getAbiType();
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/PlatformTarget.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/PlatformTarget.java
deleted file mode 100644
index 7c2b4aa..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/PlatformTarget.java
+++ /dev/null
@@ -1,427 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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;
-
-import com.android.SdkConstants;
-import com.android.sdklib.SdkManager.LayoutlibVersion;
-import com.android.sdklib.util.SparseArray;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Map;
-
-/**
- * Represents a platform target in the SDK.
- */
-final class PlatformTarget implements IAndroidTarget {
- /** String used to get a hash to the platform target */
- private final static String PLATFORM_HASH = "android-%s";
-
- private final static String PLATFORM_VENDOR = "Android Open Source Project";
-
- private final static String PLATFORM_NAME = "Android %s";
- private final static String PLATFORM_NAME_PREVIEW = "Android %s (Preview)";
-
- /** the OS path to the root folder of the platform component. */
- private final String mRootFolderOsPath;
- private final String mName;
- private final AndroidVersion mVersion;
- private final String mVersionName;
- private final int mRevision;
- private final Map<String, String> mProperties;
- private final SparseArray<String> mPaths = new SparseArray<String>();
- private String[] mSkins;
- private final ISystemImage[] mSystemImages;
- private final LayoutlibVersion mLayoutlibVersion;
-
- /**
- * Creates a Platform target.
- *
- * @param sdkOsPath the root folder of the SDK
- * @param platformOSPath the root folder of the platform component
- * @param apiVersion the API Level + codename.
- * @param versionName the version name of the platform.
- * @param revision the revision of the platform component.
- * @param layoutlibVersion The {@link LayoutlibVersion}. May be null.
- * @param systemImages list of supported system images
- * @param properties the platform properties
- */
- @SuppressWarnings("deprecation")
- PlatformTarget(
- String sdkOsPath,
- String platformOSPath,
- AndroidVersion apiVersion,
- String versionName,
- int revision,
- LayoutlibVersion layoutlibVersion,
- ISystemImage[] systemImages,
- Map<String, String> properties) {
- if (platformOSPath.endsWith(File.separator) == false) {
- platformOSPath = platformOSPath + File.separator;
- }
- mRootFolderOsPath = platformOSPath;
- mProperties = Collections.unmodifiableMap(properties);
- mVersion = apiVersion;
- mVersionName = versionName;
- mRevision = revision;
- mLayoutlibVersion = layoutlibVersion;
- mSystemImages = systemImages == null ? new ISystemImage[0] : systemImages;
- Arrays.sort(mSystemImages);
-
- if (mVersion.isPreview()) {
- mName = String.format(PLATFORM_NAME_PREVIEW, mVersionName);
- } else {
- mName = String.format(PLATFORM_NAME, mVersionName);
- }
-
- // pre-build the path to the platform components
- mPaths.put(ANDROID_JAR, mRootFolderOsPath + SdkConstants.FN_FRAMEWORK_LIBRARY);
- mPaths.put(UI_AUTOMATOR_JAR, mRootFolderOsPath + SdkConstants.FN_UI_AUTOMATOR_LIBRARY);
- mPaths.put(SOURCES, mRootFolderOsPath + SdkConstants.FD_ANDROID_SOURCES);
- mPaths.put(ANDROID_AIDL, mRootFolderOsPath + SdkConstants.FN_FRAMEWORK_AIDL);
- mPaths.put(SAMPLES, mRootFolderOsPath + SdkConstants.OS_PLATFORM_SAMPLES_FOLDER);
- mPaths.put(SKINS, mRootFolderOsPath + SdkConstants.OS_SKINS_FOLDER);
- mPaths.put(TEMPLATES, mRootFolderOsPath + SdkConstants.OS_PLATFORM_TEMPLATES_FOLDER);
- mPaths.put(DATA, mRootFolderOsPath + SdkConstants.OS_PLATFORM_DATA_FOLDER);
- mPaths.put(ATTRIBUTES, mRootFolderOsPath + SdkConstants.OS_PLATFORM_ATTRS_XML);
- mPaths.put(MANIFEST_ATTRIBUTES,
- mRootFolderOsPath + SdkConstants.OS_PLATFORM_ATTRS_MANIFEST_XML);
- mPaths.put(RESOURCES, mRootFolderOsPath + SdkConstants.OS_PLATFORM_RESOURCES_FOLDER);
- mPaths.put(FONTS, mRootFolderOsPath + SdkConstants.OS_PLATFORM_FONTS_FOLDER);
- mPaths.put(LAYOUT_LIB, mRootFolderOsPath + SdkConstants.OS_PLATFORM_DATA_FOLDER +
- SdkConstants.FN_LAYOUTLIB_JAR);
- mPaths.put(WIDGETS, mRootFolderOsPath + SdkConstants.OS_PLATFORM_DATA_FOLDER +
- SdkConstants.FN_WIDGETS);
- mPaths.put(ACTIONS_ACTIVITY, mRootFolderOsPath + SdkConstants.OS_PLATFORM_DATA_FOLDER +
- SdkConstants.FN_INTENT_ACTIONS_ACTIVITY);
- mPaths.put(ACTIONS_BROADCAST, mRootFolderOsPath + SdkConstants.OS_PLATFORM_DATA_FOLDER +
- SdkConstants.FN_INTENT_ACTIONS_BROADCAST);
- mPaths.put(ACTIONS_SERVICE, mRootFolderOsPath + SdkConstants.OS_PLATFORM_DATA_FOLDER +
- SdkConstants.FN_INTENT_ACTIONS_SERVICE);
- mPaths.put(CATEGORIES, mRootFolderOsPath + SdkConstants.OS_PLATFORM_DATA_FOLDER +
- SdkConstants.FN_INTENT_CATEGORIES);
- mPaths.put(ANT, mRootFolderOsPath + SdkConstants.OS_PLATFORM_ANT_FOLDER);
-
- // location for aapt, aidl, dx is now in the platform-tools folder.
- mPaths.put(AAPT, sdkOsPath + SdkConstants.OS_SDK_PLATFORM_TOOLS_FOLDER +
- SdkConstants.FN_AAPT);
- mPaths.put(AIDL, sdkOsPath + SdkConstants.OS_SDK_PLATFORM_TOOLS_FOLDER +
- SdkConstants.FN_AIDL);
- mPaths.put(DX, sdkOsPath + SdkConstants.OS_SDK_PLATFORM_TOOLS_FOLDER +
- SdkConstants.FN_DX);
- mPaths.put(DX_JAR, sdkOsPath + SdkConstants.OS_SDK_PLATFORM_TOOLS_LIB_FOLDER +
- SdkConstants.FN_DX_JAR);
- mPaths.put(ANDROID_RS, sdkOsPath + SdkConstants.OS_SDK_PLATFORM_TOOLS_FOLDER +
- SdkConstants.OS_FRAMEWORK_RS);
- mPaths.put(ANDROID_RS_CLANG, sdkOsPath + SdkConstants.OS_SDK_PLATFORM_TOOLS_FOLDER +
- SdkConstants.OS_FRAMEWORK_RS_CLANG);
- }
-
- /**
- * Returns the {@link LayoutlibVersion}. May be null.
- */
- public LayoutlibVersion getLayoutlibVersion() {
- return mLayoutlibVersion;
- }
-
- @Override
- public ISystemImage getSystemImage(String abiType) {
- for (ISystemImage sysImg : mSystemImages) {
- if (sysImg.getAbiType().equals(abiType)) {
- return sysImg;
- }
- }
- return null;
- }
-
- @Override
- public ISystemImage[] getSystemImages() {
- return mSystemImages;
- }
-
- @Override
- public String getLocation() {
- return mRootFolderOsPath;
- }
-
- /**
- * {@inheritDoc}
- * <p/>
- * For Platform, the vendor name is always "Android".
- *
- * @see com.android.sdklib.IAndroidTarget#getVendor()
- */
- @Override
- public String getVendor() {
- return PLATFORM_VENDOR;
- }
-
- @Override
- public String getName() {
- return mName;
- }
-
- @Override
- public String getFullName() {
- return mName;
- }
-
- @Override
- public String getClasspathName() {
- return mName;
- }
-
- @Override
- public String getShortClasspathName() {
- return mName;
- }
-
- /*
- * (non-Javadoc)
- *
- * Description for the Android platform is dynamically generated.
- *
- * @see com.android.sdklib.IAndroidTarget#getDescription()
- */
- @Override
- public String getDescription() {
- return String.format("Standard Android platform %s", mVersionName);
- }
-
- @Override
- public AndroidVersion getVersion() {
- return mVersion;
- }
-
- @Override
- public String getVersionName() {
- return mVersionName;
- }
-
- @Override
- public int getRevision() {
- return mRevision;
- }
-
- @Override
- public boolean isPlatform() {
- return true;
- }
-
- @Override
- public IAndroidTarget getParent() {
- return null;
- }
-
- @Override
- public String getPath(int pathId) {
- return mPaths.get(pathId);
- }
-
- /**
- * Returns whether the target is able to render layouts. This is always true for platforms.
- */
- @Override
- public boolean hasRenderingLibrary() {
- return true;
- }
-
-
- @Override
- public String[] getSkins() {
- return mSkins;
- }
-
- @Override
- public String getDefaultSkin() {
- // only one skin? easy.
- if (mSkins.length == 1) {
- return mSkins[0];
- }
-
- // look for the skin name in the platform props
- String skinName = mProperties.get(SdkConstants.PROP_SDK_DEFAULT_SKIN);
- if (skinName != null) {
- return skinName;
- }
-
- // otherwise try to find a good default.
- if (mVersion.getApiLevel() >= 4) {
- // at this time, this is the default skin for all older platforms that had 2+ skins.
- return "WVGA800";
- }
-
- return "HVGA"; // this is for 1.5 and earlier.
- }
-
- /**
- * Always returns null, as a standard platform ha no optional libraries.
- *
- * {@inheritDoc}
- * @see com.android.sdklib.IAndroidTarget#getOptionalLibraries()
- */
- @Override
- public IOptionalLibrary[] getOptionalLibraries() {
- return null;
- }
-
- /**
- * Currently always return a fixed list with "android.test.runner" in it.
- * <p/>
- * TODO change the fixed library list to be build-dependent later.
- * {@inheritDoc}
- */
- @Override
- public String[] getPlatformLibraries() {
- return new String[] { SdkConstants.ANDROID_TEST_RUNNER_LIB };
- }
-
- /**
- * The platform has no USB Vendor Id: always return {@link IAndroidTarget#NO_USB_ID}.
- * {@inheritDoc}
- */
- @Override
- public int getUsbVendorId() {
- return NO_USB_ID;
- }
-
- @Override
- public boolean canRunOn(IAndroidTarget target) {
- // basic test
- if (target == this) {
- return true;
- }
-
- // if the platform has a codename (ie it's a preview of an upcoming platform), then
- // both platforms must be exactly identical.
- if (mVersion.getCodename() != null) {
- return mVersion.equals(target.getVersion());
- }
-
- // target is compatible wit the receiver as long as its api version number is greater or
- // equal.
- return target.getVersion().getApiLevel() >= mVersion.getApiLevel();
- }
-
- @Override
- public String hashString() {
- return String.format(PLATFORM_HASH, mVersion.getApiString());
- }
-
- @Override
- public int hashCode() {
- return hashString().hashCode();
- }
-
- @Override
- public boolean equals(Object obj) {
- if (obj instanceof PlatformTarget) {
- PlatformTarget platform = (PlatformTarget)obj;
-
- return mVersion.equals(platform.getVersion());
- }
-
- return false;
- }
-
- /*
- * Order by API level (preview/n count as between n and n+1).
- * At the same API level, order as: Platform first, then add-on ordered by vendor and then name
- * (non-Javadoc)
- * @see java.lang.Comparable#compareTo(java.lang.Object)
- */
- @Override
- public int compareTo(IAndroidTarget target) {
- // quick check.
- if (this == target) {
- return 0;
- }
-
- int versionDiff = mVersion.compareTo(target.getVersion());
-
- // only if the version are the same do we care about add-ons.
- if (versionDiff == 0) {
- // platforms go before add-ons.
- if (target.isPlatform() == false) {
- return -1;
- }
- }
-
- return versionDiff;
- }
-
- /**
- * Returns a string representation suitable for debugging.
- * The representation is not intended for display to the user.
- *
- * The representation is also purposely compact. It does not describe _all_ the properties
- * of the target, only a few key ones.
- *
- * @see #getDescription()
- */
- @Override
- public String toString() {
- return String.format("PlatformTarget %1$s rev %2$d", //$NON-NLS-1$
- getVersion(),
- getRevision());
- }
-
- @Override
- public String getProperty(String name) {
- return mProperties.get(name);
- }
-
- @Override
- public Integer getProperty(String name, Integer defaultValue) {
- try {
- String value = getProperty(name);
- if (value != null) {
- return Integer.decode(value);
- }
- } catch (NumberFormatException e) {
- // ignore, return default value;
- }
-
- return defaultValue;
- }
-
- @Override
- public Boolean getProperty(String name, Boolean defaultValue) {
- String value = getProperty(name);
- if (value != null) {
- return Boolean.valueOf(value);
- }
-
- return defaultValue;
- }
-
- @Override
- public Map<String, String> getProperties() {
- return mProperties; // mProperties is unmodifiable.
- }
-
- // ---- platform only methods.
-
- void setSkins(String[] skins) {
- mSkins = skins;
- }
-
- void setSamplesPath(String osLocation) {
- mPaths.put(SAMPLES, osLocation);
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/SdkManager.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/SdkManager.java
deleted file mode 100644
index 0bca185..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/SdkManager.java
+++ /dev/null
@@ -1,1368 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.annotations.VisibleForTesting;
-import com.android.annotations.VisibleForTesting.Visibility;
-import com.android.io.FileWrapper;
-import com.android.prefs.AndroidLocation;
-import com.android.prefs.AndroidLocation.AndroidLocationException;
-import com.android.sdklib.AndroidVersion.AndroidVersionException;
-import com.android.sdklib.ISystemImage.LocationType;
-import com.android.sdklib.internal.project.ProjectProperties;
-import com.android.sdklib.internal.repository.LocalSdkParser;
-import com.android.sdklib.internal.repository.NullTaskMonitor;
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.packages.ExtraPackage;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.internal.repository.packages.PlatformToolPackage;
-import com.android.sdklib.repository.PkgProps;
-import com.android.utils.ILogger;
-import com.android.utils.NullLogger;
-import com.android.utils.Pair;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.TreeSet;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.zip.Adler32;
-
-/**
- * The SDK manager parses the SDK folder and gives access to the content.
- * @see PlatformTarget
- * @see AddOnTarget
- */
-public class SdkManager {
-
- private static final boolean DEBUG = System.getenv("SDKMAN_DEBUG") != null; //$NON-NLS-1$
-
- 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$
- public final static String PROP_VERSION_RELEASE = "ro.build.version.release"; //$NON-NLS-1$
-
- public final static String ADDON_NAME = "name"; //$NON-NLS-1$
- public final static String ADDON_VENDOR = "vendor"; //$NON-NLS-1$
- public final static String ADDON_API = "api"; //$NON-NLS-1$
- public final static String ADDON_DESCRIPTION = "description"; //$NON-NLS-1$
- public final static String ADDON_LIBRARIES = "libraries"; //$NON-NLS-1$
- public final static String ADDON_DEFAULT_SKIN = "skin"; //$NON-NLS-1$
- public final static String ADDON_USB_VENDOR = "usb-vendor"; //$NON-NLS-1$
- public final static String ADDON_REVISION = "revision"; //$NON-NLS-1$
- public final static String ADDON_REVISION_OLD = "version"; //$NON-NLS-1$
-
-
- private final static Pattern PATTERN_LIB_DATA = Pattern.compile(
- "^([a-zA-Z0-9._-]+\\.jar);(.*)$", Pattern.CASE_INSENSITIVE); //$NON-NLS-1$
-
- // usb ids are 16-bit hexadecimal values.
- private final static Pattern PATTERN_USB_IDS = Pattern.compile(
- "^0x[a-f0-9]{4}$", Pattern.CASE_INSENSITIVE); //$NON-NLS-1$
-
- /** List of items in the platform to check when parsing it. These paths are relative to the
- * platform root folder. */
- private final static String[] sPlatformContentList = new String[] {
- SdkConstants.FN_FRAMEWORK_LIBRARY,
- SdkConstants.FN_FRAMEWORK_AIDL,
- };
-
- /** Preference file containing the usb ids for adb */
- private final static String ADB_INI_FILE = "adb_usb.ini"; //$NON-NLS-1$
- //0--------90--------90--------90--------90--------90--------90--------90--------9
- private final static String ADB_INI_HEADER =
- "# ANDROID 3RD PARTY USB VENDOR ID LIST -- DO NOT EDIT.\n" + //$NON-NLS-1$
- "# USE 'android update adb' TO GENERATE.\n" + //$NON-NLS-1$
- "# 1 USB VENDOR ID PER LINE.\n"; //$NON-NLS-1$
-
- /** The location of the SDK as an OS path */
- private final String mOsSdkPath;
- /** Valid targets that have been loaded. Can be empty but not null. */
- private IAndroidTarget[] mTargets = new IAndroidTarget[0];
- /** A map to keep information on directories to see if they change later. */
- private final Map<File, DirInfo> mTargetDirs = new HashMap<File, SdkManager.DirInfo>();
-
- /**
- * Create a new {@link SdkManager} instance.
- * External users should use {@link #createManager(String, ILogger)}.
- *
- * @param osSdkPath the location of the SDK.
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected SdkManager(String osSdkPath) {
- mOsSdkPath = osSdkPath;
- }
-
- /**
- * Creates an {@link SdkManager} for a given sdk location.
- * @param osSdkPath the location of the SDK.
- * @param log the ILogger object receiving warning/error from the parsing. Cannot be null.
- * @return the created {@link SdkManager} or null if the location is not valid.
- */
- public static SdkManager createManager(String osSdkPath, ILogger log) {
- try {
- SdkManager manager = new SdkManager(osSdkPath);
- manager.reloadSdk(log);
-
- return manager;
- } catch (IllegalArgumentException e) {
- log.error(e, "Error parsing the sdk.");
- }
-
- return null;
- }
-
- /**
- * Reloads the content of the SDK.
- *
- * @param log the ILogger object receiving warning/error from the parsing. Cannot be null.
- */
- public void reloadSdk(ILogger log) {
- // get the current target list.
- mTargetDirs.clear();
- ArrayList<IAndroidTarget> targets = new ArrayList<IAndroidTarget>();
- loadPlatforms(mOsSdkPath, targets, mTargetDirs, log);
- loadAddOns(mOsSdkPath, targets, mTargetDirs, log);
-
- // For now replace the old list with the new one.
- // In the future we may want to keep the current objects, so that ADT doesn't have to deal
- // with new IAndroidTarget objects when a target didn't actually change.
-
- // sort the targets/add-ons
- Collections.sort(targets);
- setTargets(targets.toArray(new IAndroidTarget[targets.size()]));
-
- // load the samples, after the targets have been set.
- initializeSamplePaths(log);
- }
-
- /**
- * Checks whether any of the SDK platforms/add-ons have changed on-disk
- * since we last loaded the SDK. This does not reload the SDK nor does it
- * change the underlying targets.
- *
- * @return True if at least one directory or source.prop has changed.
- */
- public boolean hasChanged() {
- Set<File> visited = new HashSet<File>();
- boolean changed = false;
-
- File platformFolder = new File(mOsSdkPath, SdkConstants.FD_PLATFORMS);
- if (platformFolder.isDirectory()) {
- File[] platforms = platformFolder.listFiles();
- if (platforms != null) {
- for (File platform : platforms) {
- if (!platform.isDirectory()) {
- continue;
- }
- visited.add(platform);
- DirInfo dirInfo = mTargetDirs.get(platform);
- if (dirInfo == null) {
- // This is a new platform directory.
- changed = true;
- } else {
- changed = dirInfo.hasChanged();
- }
- if (changed) {
- if (DEBUG) {
- System.out.println("SDK changed due to " + //$NON-NLS-1$
- (dirInfo != null ? dirInfo.toString() : platform.getPath()));
- }
- }
- }
- }
- }
-
- File addonFolder = new File(mOsSdkPath, SdkConstants.FD_ADDONS);
-
- if (!changed && addonFolder.isDirectory()) {
- File[] addons = addonFolder.listFiles();
- if (addons != null) {
- for (File addon : addons) {
- if (!addon.isDirectory()) {
- continue;
- }
- visited.add(addon);
- DirInfo dirInfo = mTargetDirs.get(addon);
- if (dirInfo == null) {
- // This is a new add-on directory.
- changed = true;
- } else {
- changed = dirInfo.hasChanged();
- }
- if (changed) {
- if (DEBUG) {
- System.out.println("SDK changed due to " + //$NON-NLS-1$
- (dirInfo != null ? dirInfo.toString() : addon.getPath()));
- }
- }
- }
- }
- }
-
- if (!changed) {
- // Check whether some pre-existing target directories have vanished.
- for (File previousDir : mTargetDirs.keySet()) {
- if (!visited.contains(previousDir)) {
- // This directory is no longer present.
- changed = true;
- if (DEBUG) {
- System.out.println("SDK changed: " + //$NON-NLS-1$
- previousDir.getPath() + " removed"); //$NON-NLS-1$
- }
- break;
- }
- }
- }
-
- return changed;
- }
-
- /**
- * Returns the location of the SDK.
- */
- public String getLocation() {
- return mOsSdkPath;
- }
-
- /**
- * Returns the targets that are available in the SDK.
- * <p/>
- * The array can be empty but not null.
- */
- public IAndroidTarget[] getTargets() {
- return mTargets;
- }
-
- /**
- * Sets the targets that are available in the SDK.
- * <p/>
- * The array can be empty but not null.
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected void setTargets(IAndroidTarget[] targets) {
- assert targets != null;
- mTargets = targets;
- }
-
- /**
- * Returns a target from a hash that was generated by {@link IAndroidTarget#hashString()}.
- *
- * @param hash the {@link IAndroidTarget} hash string.
- * @return The matching {@link IAndroidTarget} or null.
- */
- public IAndroidTarget getTargetFromHashString(String hash) {
- if (hash != null) {
- for (IAndroidTarget target : mTargets) {
- if (hash.equals(target.hashString())) {
- return target;
- }
- }
- }
-
- return null;
- }
-
- /**
- * Updates adb with the USB devices declared in the SDK add-ons.
- * @throws AndroidLocationException
- * @throws IOException
- */
- public void updateAdb() throws AndroidLocationException, IOException {
- FileWriter writer = null;
- try {
- // get the android prefs location to know where to write the file.
- File adbIni = new File(AndroidLocation.getFolder(), ADB_INI_FILE);
- writer = new FileWriter(adbIni);
-
- // first, put all the vendor id in an HashSet to remove duplicate.
- HashSet<Integer> set = new HashSet<Integer>();
- IAndroidTarget[] targets = getTargets();
- for (IAndroidTarget target : targets) {
- if (target.getUsbVendorId() != IAndroidTarget.NO_USB_ID) {
- set.add(target.getUsbVendorId());
- }
- }
-
- // write file header.
- writer.write(ADB_INI_HEADER);
-
- // now write the Id in a text file, one per line.
- for (Integer i : set) {
- writer.write(String.format("0x%04x\n", i)); //$NON-NLS-1$
- }
- } finally {
- if (writer != null) {
- writer.close();
- }
- }
- }
-
- /**
- * Returns the greatest {@link LayoutlibVersion} found amongst all platform
- * targets currently loaded in the SDK.
- * <p/>
- * We only started recording Layoutlib Versions recently in the platform meta data
- * so it's possible to have an SDK with many platforms loaded but no layoutlib
- * version defined.
- *
- * @return The greatest {@link LayoutlibVersion} or null if none is found.
- * @deprecated This does NOT solve the right problem and will be changed later.
- */
- @Deprecated
- public LayoutlibVersion getMaxLayoutlibVersion() {
- LayoutlibVersion maxVersion = null;
-
- for (IAndroidTarget target : getTargets()) {
- if (target instanceof PlatformTarget) {
- LayoutlibVersion lv = ((PlatformTarget) target).getLayoutlibVersion();
- if (lv != null) {
- if (maxVersion == null || lv.compareTo(maxVersion) > 0) {
- maxVersion = lv;
- }
- }
- }
- }
-
- return maxVersion;
- }
-
- /**
- * Returns a map of the <em>root samples directories</em> located in the SDK/extras packages.
- * No guarantee is made that the extras' samples directory actually contain any valid samples.
- * The only guarantee is that the root samples directory actually exists.
- * The map is { File: Samples root directory => String: Extra package display name. }
- *
- * @return A non-null possibly empty map of extra samples directories and their associated
- * extra package display name.
- */
- public @NonNull Map<File, String> getExtraSamples() {
- LocalSdkParser parser = new LocalSdkParser();
- Package[] packages = parser.parseSdk(mOsSdkPath,
- this,
- LocalSdkParser.PARSE_EXTRAS,
- new NullTaskMonitor(NullLogger.getLogger()));
-
- Map<File, String> samples = new HashMap<File, String>();
-
- for (Package pkg : packages) {
- if (pkg instanceof ExtraPackage && pkg.isLocal()) {
- // isLocal()==true implies there's a single locally-installed archive.
- assert pkg.getArchives() != null && pkg.getArchives().length == 1;
- Archive a = pkg.getArchives()[0];
- assert a != null;
- File path = new File(a.getLocalOsPath(), SdkConstants.FD_SAMPLES);
- if (path.isDirectory()) {
- samples.put(path, pkg.getListDescription());
- continue;
- }
- // Some old-style extras simply have a single "sample" directory.
- // Accept it if it contains an AndroidManifest.xml.
- path = new File(a.getLocalOsPath(), SdkConstants.FD_SAMPLE);
- if (path.isDirectory() &&
- new File(path, SdkConstants.FN_ANDROID_MANIFEST_XML).isFile()) {
- samples.put(path, pkg.getListDescription());
- }
- }
- }
-
- return samples;
- }
-
- /**
- * Returns a map of all the extras found in the <em>local</em> SDK with their major revision.
- * <p/>
- * Map keys are in the form "vendor-id/path-id". These ids uniquely identify an extra package.
- * The version is the incremental integer major revision of the package.
- *
- * @return A non-null possibly empty map of { string "vendor/path" => integer major revision }
- */
- public @NonNull Map<String, Integer> getExtrasVersions() {
- LocalSdkParser parser = new LocalSdkParser();
- Package[] packages = parser.parseSdk(mOsSdkPath,
- this,
- LocalSdkParser.PARSE_EXTRAS,
- new NullTaskMonitor(NullLogger.getLogger()));
-
- Map<String, Integer> extraVersions = new TreeMap<String, Integer>();
-
- for (Package pkg : packages) {
- if (pkg instanceof ExtraPackage && pkg.isLocal()) {
- ExtraPackage ep = (ExtraPackage) pkg;
- String vendor = ep.getVendorId();
- String path = ep.getPath();
- int majorRev = ep.getRevision().getMajor();
-
- extraVersions.put(vendor + '/' + path, majorRev);
- }
- }
-
- return extraVersions;
- }
-
- /** Returns the platform tools version if installed, null otherwise. */
- public @Nullable String getPlatformToolsVersion() {
- LocalSdkParser parser = new LocalSdkParser();
- Package[] packages = parser.parseSdk(mOsSdkPath, this, LocalSdkParser.PARSE_PLATFORM_TOOLS,
- new NullTaskMonitor(NullLogger.getLogger()));
-
- for (Package pkg : packages) {
- if (pkg instanceof PlatformToolPackage && pkg.isLocal()) {
- return pkg.getRevision().toShortString();
- }
- }
-
- return null;
- }
-
-
- // -------- private methods ----------
-
- /**
- * Loads the Platforms from the SDK.
- * Creates the "platforms" folder if necessary.
- *
- * @param sdkOsPath Location of the SDK
- * @param targets the list to fill with the platforms.
- * @param dirInfos a map to keep information on directories to see if they change later.
- * @param log the ILogger object receiving warning/error from the parsing. Cannot be null.
- * @throws RuntimeException when the "platforms" folder is missing and cannot be created.
- */
- private static void loadPlatforms(
- String sdkOsPath,
- ArrayList<IAndroidTarget> targets,
- Map<File, DirInfo> dirInfos, ILogger log) {
- File platformFolder = new File(sdkOsPath, SdkConstants.FD_PLATFORMS);
-
- if (platformFolder.isDirectory()) {
- File[] platforms = platformFolder.listFiles();
-
- for (File platform : platforms) {
- PlatformTarget target = null;
- if (platform.isDirectory()) {
- target = loadPlatform(sdkOsPath, platform, log);
- if (target != null) {
- targets.add(target);
- }
- // Remember we visited this file/directory,
- // even if we failed to load anything from it.
- dirInfos.put(platform, new DirInfo(platform));
- } else {
- log.warning("Ignoring platform '%1$s', not a folder.", platform.getName());
- }
- }
-
- return;
- }
-
- // Try to create it or complain if something else is in the way.
- if (!platformFolder.exists()) {
- if (!platformFolder.mkdir()) {
- throw new RuntimeException(
- String.format("Failed to create %1$s.",
- platformFolder.getAbsolutePath()));
- }
- } else {
- throw new RuntimeException(
- String.format("%1$s is not a folder.",
- platformFolder.getAbsolutePath()));
- }
- }
-
- /**
- * Loads a specific Platform at a given location.
- * @param sdkOsPath Location of the SDK
- * @param platformFolder the root folder of the platform.
- * @param log the ILogger object receiving warning/error from the parsing. Cannot be null.
- */
- private static PlatformTarget loadPlatform(
- String sdkOsPath,
- File platformFolder,
- ILogger log) {
- FileWrapper buildProp = new FileWrapper(platformFolder, SdkConstants.FN_BUILD_PROP);
- FileWrapper sourcePropFile = new FileWrapper(platformFolder, SdkConstants.FN_SOURCE_PROP);
-
- 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) {
- platformProp.putAll(map);
- }
-
- 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);
- }
- }
-
- // 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 not a valid number in %3$s.",
- platformFolder.getName(), PROP_VERSION_SDK,
- SdkConstants.FN_BUILD_PROP);
- return null;
- }
- }
-
- // Codename must be either null or a platform codename.
- // REL means it's a release version and therefore the codename should be null.
- AndroidVersion apiVersion =
- new AndroidVersion(apiNumber, platformProp.get(PROP_VERSION_CODENAME));
-
- // 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;
- }
-
- // 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;
- try {
- revision = Integer.parseInt(platformProp.get(PkgProps.PKG_REVISION));
- } catch (NumberFormatException e) {
- // do nothing, we'll keep the default value of 1.
- }
-
- 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
- }
-
- // api number and name look valid, perform a few more checks
- if (checkPlatformContent(platformFolder, log) == false) {
- return null;
- }
-
- ISystemImage[] systemImages =
- getPlatformSystemImages(sdkOsPath, platformFolder, apiVersion);
-
- // create the target.
- PlatformTarget target = new PlatformTarget(
- sdkOsPath,
- platformFolder.getAbsolutePath(),
- apiVersion,
- apiName,
- revision,
- layoutlibVersion,
- systemImages,
- platformProp);
-
- // need to parse the skins.
- String[] skins = parseSkinFolder(target.getPath(IAndroidTarget.SKINS));
- target.setSkins(skins);
-
- return target;
- } else {
- log.warning("Ignoring platform '%1$s': %2$s is missing.", //$NON-NLS-1$
- platformFolder.getName(),
- SdkConstants.FN_BUILD_PROP);
- }
-
- return null;
- }
-
- /**
- * Get all the system images supported by an add-on target.
- * For an add-on, we first look for sub-folders in the addon/images directory.
- * If none are found but the directory exists and is not empty, assume it's a legacy
- * arm eabi system image.
- * <p/>
- * Note that it's OK for an add-on to have no system-images at all, since it can always
- * rely on the ones from its base platform.
- *
- * @param root Root of the add-on target being loaded.
- * @return an array of ISystemImage containing all the system images for the target.
- * The list can be empty.
- */
- private static ISystemImage[] getAddonSystemImages(File root) {
- Set<ISystemImage> found = new TreeSet<ISystemImage>();
-
- root = new File(root, SdkConstants.OS_IMAGES_FOLDER);
- File[] files = root.listFiles();
- boolean hasImgFiles = false;
-
- if (files != null) {
- // Look for sub-directories
- for (File file : files) {
- if (file.isDirectory()) {
- found.add(new SystemImage(
- file,
- LocationType.IN_PLATFORM_SUBFOLDER,
- file.getName()));
- } else if (!hasImgFiles && file.isFile()) {
- if (file.getName().endsWith(".img")) { //$NON-NLS-1$
- hasImgFiles = true;
- }
- }
- }
- }
-
- if (found.size() == 0 && hasImgFiles && root.isDirectory()) {
- // We found no sub-folder system images but it looks like the top directory
- // has some img files in it. It must be a legacy ARM EABI system image folder.
- found.add(new SystemImage(
- root,
- LocationType.IN_PLATFORM_LEGACY,
- SdkConstants.ABI_ARMEABI));
- }
-
- return found.toArray(new ISystemImage[found.size()]);
- }
-
- /**
- * Get all the system images supported by a platform target.
- * For a platform, we first look in the new sdk/system-images folders then we
- * look for sub-folders in the platform/images directory and/or the one legacy
- * folder.
- * If any given API appears twice or more, the first occurrence wins.
- *
- * @param sdkOsPath The path to the SDK.
- * @param root Root of the platform target being loaded.
- * @param version API level + codename of platform being loaded.
- * @return an array of ISystemImage containing all the system images for the target.
- * The list can be empty.
- */
- private static ISystemImage[] getPlatformSystemImages(
- String sdkOsPath,
- File root,
- AndroidVersion version) {
- Set<ISystemImage> found = new TreeSet<ISystemImage>();
- Set<String> abiFound = new HashSet<String>();
-
- // First look in the SDK/system-image/platform-n/abi folders.
- // We require/enforce the system image to have a valid properties file.
- // The actual directory names are irrelevant.
- // If we find multiple occurrences of the same platform/abi, the first one read wins.
-
- File[] firstLevelFiles = new File(sdkOsPath, SdkConstants.FD_SYSTEM_IMAGES).listFiles();
- if (firstLevelFiles != null) {
- for (File firstLevel : firstLevelFiles) {
- File[] secondLevelFiles = firstLevel.listFiles();
- if (secondLevelFiles != null) {
- for (File secondLevel : secondLevelFiles) {
- try {
- File propFile = new File(secondLevel, SdkConstants.FN_SOURCE_PROP);
- Properties props = new Properties();
- 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)) {
- continue;
- }
-
- String abi = props.getProperty(PkgProps.SYS_IMG_ABI);
- if (abi != null && !abiFound.contains(abi)) {
- found.add(new SystemImage(
- secondLevel,
- LocationType.IN_SYSTEM_IMAGE,
- abi));
- abiFound.add(abi);
- }
- } catch (Exception ignore) {
- }
- }
- }
- }
- }
-
- // Then look in either the platform/images/abi or the legacy folder
- root = new File(root, SdkConstants.OS_IMAGES_FOLDER);
- File[] files = root.listFiles();
- boolean useLegacy = true;
- boolean hasImgFiles = false;
-
- if (files != null) {
- // Look for sub-directories
- for (File file : files) {
- if (file.isDirectory()) {
- useLegacy = false;
- String abi = file.getName();
- if (!abiFound.contains(abi)) {
- found.add(new SystemImage(
- file,
- LocationType.IN_PLATFORM_SUBFOLDER,
- abi));
- abiFound.add(abi);
- }
- } else if (!hasImgFiles && file.isFile()) {
- if (file.getName().endsWith(".img")) { //$NON-NLS-1$
- hasImgFiles = true;
- }
- }
- }
- }
-
- if (useLegacy && hasImgFiles && root.isDirectory() &&
- !abiFound.contains(SdkConstants.ABI_ARMEABI)) {
- // We found no sub-folder system images but it looks like the top directory
- // has some img files in it. It must be a legacy ARM EABI system image folder.
- found.add(new SystemImage(
- root,
- LocationType.IN_PLATFORM_LEGACY,
- SdkConstants.ABI_ARMEABI));
- }
-
- return found.toArray(new ISystemImage[found.size()]);
- }
-
- /**
- * Loads the Add-on from the SDK.
- * Creates the "add-ons" folder if necessary.
- *
- * @param osSdkPath Location of the SDK
- * @param targets the list to fill with the add-ons.
- * @param dirInfos a map to keep information on directories to see if they change later.
- * @param log the ILogger object receiving warning/error from the parsing. Cannot be null.
- * @throws RuntimeException when the "add-ons" folder is missing and cannot be created.
- */
- private static void loadAddOns(
- String osSdkPath,
- ArrayList<IAndroidTarget> targets,
- Map<File, DirInfo> dirInfos, ILogger log) {
- File addonFolder = new File(osSdkPath, SdkConstants.FD_ADDONS);
-
- if (addonFolder.isDirectory()) {
- File[] addons = addonFolder.listFiles();
-
- IAndroidTarget[] targetList = targets.toArray(new IAndroidTarget[targets.size()]);
-
- if (addons != null) {
- for (File addon : addons) {
- // Add-ons have to be folders. Ignore files and no need to warn about them.
- AddOnTarget target = null;
- if (addon.isDirectory()) {
- target = loadAddon(addon, targetList, log);
- if (target != null) {
- targets.add(target);
- }
- // Remember we visited this file/directory,
- // even if we failed to load anything from it.
- dirInfos.put(addon, new DirInfo(addon));
- }
- }
- }
-
- return;
- }
-
- // Try to create it or complain if something else is in the way.
- if (!addonFolder.exists()) {
- if (!addonFolder.mkdir()) {
- throw new RuntimeException(
- String.format("Failed to create %1$s.",
- addonFolder.getAbsolutePath()));
- }
- } else {
- throw new RuntimeException(
- String.format("%1$s is not a folder.",
- addonFolder.getAbsolutePath()));
- }
- }
-
- /**
- * Loads a specific Add-on at a given location.
- * @param addonDir the location of the add-on directory.
- * @param targetList The list of Android target that were already loaded from the SDK.
- * @param log the ILogger object receiving warning/error from the parsing. Cannot be null.
- */
- private static AddOnTarget loadAddon(File addonDir,
- IAndroidTarget[] targetList,
- ILogger log) {
-
- // Parse the addon properties to ensure we can load it.
- Pair<Map<String, String>, String> infos = parseAddonProperties(addonDir, targetList, log);
-
- Map<String, String> propertyMap = infos.getFirst();
- String error = infos.getSecond();
-
- if (error != null) {
- log.warning("Ignoring add-on '%1$s': %2$s", addonDir.getName(), error);
- return null;
- }
-
- // Since error==null we're not supposed to encounter any issues loading this add-on.
- try {
- assert propertyMap != null;
-
- String api = propertyMap.get(ADDON_API);
- String name = propertyMap.get(ADDON_NAME);
- String vendor = propertyMap.get(ADDON_VENDOR);
-
- assert api != null;
- assert name != null;
- assert vendor != null;
-
- PlatformTarget baseTarget = null;
-
- // Look for a platform that has a matching api level or codename.
- for (IAndroidTarget target : targetList) {
- if (target.isPlatform() && target.getVersion().equals(api)) {
- baseTarget = (PlatformTarget)target;
- break;
- }
- }
-
- assert baseTarget != null;
-
- // get the optional description
- String description = propertyMap.get(ADDON_DESCRIPTION);
-
- // get the add-on revision
- int revisionValue = 1;
- String revision = propertyMap.get(ADDON_REVISION);
- if (revision == null) {
- revision = propertyMap.get(ADDON_REVISION_OLD);
- }
- if (revision != null) {
- revisionValue = Integer.parseInt(revision);
- }
-
- // get the optional libraries
- String librariesValue = propertyMap.get(ADDON_LIBRARIES);
- Map<String, String[]> libMap = null;
-
- if (librariesValue != null) {
- librariesValue = librariesValue.trim();
- if (librariesValue.length() > 0) {
- // split in the string into the libraries name
- String[] libraries = librariesValue.split(";"); //$NON-NLS-1$
- if (libraries.length > 0) {
- libMap = new HashMap<String, String[]>();
- for (String libName : libraries) {
- libName = libName.trim();
-
- // get the library data from the properties
- String libData = propertyMap.get(libName);
-
- if (libData != null) {
- // split the jar file from the description
- Matcher m = PATTERN_LIB_DATA.matcher(libData);
- if (m.matches()) {
- libMap.put(libName, new String[] {
- m.group(1), m.group(2) });
- } else {
- log.warning(
- "Ignoring library '%1$s', property value has wrong format\n\t%2$s",
- libName, libData);
- }
- } else {
- log.warning(
- "Ignoring library '%1$s', missing property value",
- libName, libData);
- }
- }
- }
- }
- }
-
- // get the abi list.
- ISystemImage[] systemImages = getAddonSystemImages(addonDir);
-
- // check whether the add-on provides its own rendering info/library.
- boolean hasRenderingLibrary = false;
- boolean hasRenderingResources = false;
-
- File dataFolder = new File(addonDir, SdkConstants.FD_DATA);
- if (dataFolder.isDirectory()) {
- hasRenderingLibrary = new File(dataFolder, SdkConstants.FN_LAYOUTLIB_JAR).isFile();
- hasRenderingResources = new File(dataFolder, SdkConstants.FD_RES).isDirectory() &&
- new File(dataFolder, SdkConstants.FD_FONTS).isDirectory();
- }
-
- AddOnTarget target = new AddOnTarget(addonDir.getAbsolutePath(), name, vendor,
- revisionValue, description, systemImages, libMap,
- hasRenderingLibrary, hasRenderingResources,baseTarget);
-
- // need to parse the skins.
- String[] skins = parseSkinFolder(target.getPath(IAndroidTarget.SKINS));
-
- // get the default skin, or take it from the base platform if needed.
- String defaultSkin = propertyMap.get(ADDON_DEFAULT_SKIN);
- if (defaultSkin == null) {
- if (skins.length == 1) {
- defaultSkin = skins[0];
- } else {
- defaultSkin = baseTarget.getDefaultSkin();
- }
- }
-
- // get the USB ID (if available)
- int usbVendorId = convertId(propertyMap.get(ADDON_USB_VENDOR));
- if (usbVendorId != IAndroidTarget.NO_USB_ID) {
- target.setUsbVendorId(usbVendorId);
- }
-
- target.setSkins(skins, defaultSkin);
-
- return target;
- }
- catch (Exception e) {
- log.warning("Ignoring add-on '%1$s': error %2$s.",
- addonDir.getName(), e.toString());
- }
-
- return null;
- }
-
- /**
- * Parses the add-on properties and decodes any error that occurs when loading an addon.
- *
- * @param addonDir the location of the addon directory.
- * @param targetList The list of Android target that were already loaded from the SDK.
- * @param log the ILogger object receiving warning/error from the parsing. Cannot be null.
- * @return A pair with the property map and an error string. Both can be null but not at the
- * same time. If a non-null error is present then the property map must be ignored. The error
- * should be translatable as it might show up in the SdkManager UI.
- */
- public static Pair<Map<String, String>, String> parseAddonProperties(
- File addonDir,
- IAndroidTarget[] targetList,
- ILogger log) {
- Map<String, String> propertyMap = null;
- String error = null;
-
- FileWrapper addOnManifest = new FileWrapper(addonDir, SdkConstants.FN_MANIFEST_INI);
-
- do {
- if (!addOnManifest.isFile()) {
- error = String.format("File not found: %1$s", SdkConstants.FN_MANIFEST_INI);
- break;
- }
-
- propertyMap = ProjectProperties.parsePropertyFile(addOnManifest, log);
- if (propertyMap == null) {
- error = String.format("Failed to parse properties from %1$s",
- SdkConstants.FN_MANIFEST_INI);
- break;
- }
-
- // look for some specific values in the map.
- // we require name, vendor, and api
- String name = propertyMap.get(ADDON_NAME);
- if (name == null) {
- error = addonManifestWarning(ADDON_NAME);
- break;
- }
-
- String vendor = propertyMap.get(ADDON_VENDOR);
- if (vendor == null) {
- error = addonManifestWarning(ADDON_VENDOR);
- break;
- }
-
- String api = propertyMap.get(ADDON_API);
- PlatformTarget baseTarget = null;
- if (api == null) {
- error = addonManifestWarning(ADDON_API);
- break;
- }
-
- // Look for a platform that has a matching api level or codename.
- for (IAndroidTarget target : targetList) {
- if (target.isPlatform() && target.getVersion().equals(api)) {
- baseTarget = (PlatformTarget)target;
- break;
- }
- }
-
- if (baseTarget == null) {
- error = String.format("Unable to find base platform with API level '%1$s'", api);
- break;
- }
-
- // get the add-on revision
- String revision = propertyMap.get(ADDON_REVISION);
- if (revision == null) {
- revision = propertyMap.get(ADDON_REVISION_OLD);
- }
- if (revision != null) {
- try {
- Integer.parseInt(revision);
- } catch (NumberFormatException e) {
- // looks like revision does not parse to a number.
- error = String.format("%1$s is not a valid number in %2$s.",
- ADDON_REVISION, SdkConstants.FN_BUILD_PROP);
- break;
- }
- }
-
- } while(false);
-
- return Pair.of(propertyMap, error);
- }
-
- /**
- * Converts a string representation of an hexadecimal ID into an int.
- * @param value the string to convert.
- * @return the int value, or {@link IAndroidTarget#NO_USB_ID} if the convertion failed.
- */
- private static int convertId(String value) {
- if (value != null && value.length() > 0) {
- if (PATTERN_USB_IDS.matcher(value).matches()) {
- String v = value.substring(2);
- try {
- return Integer.parseInt(v, 16);
- } catch (NumberFormatException e) {
- // this shouldn't happen since we check the pattern above, but this is safer.
- // the method will return 0 below.
- }
- }
- }
-
- return IAndroidTarget.NO_USB_ID;
- }
-
- /**
- * Prepares a warning about the addon being ignored due to a missing manifest value.
- * This string will show up in the SdkManager UI.
- *
- * @param valueName The missing manifest value, for display.
- */
- private static String addonManifestWarning(String valueName) {
- return String.format("'%1$s' is missing from %2$s.",
- valueName, SdkConstants.FN_MANIFEST_INI);
- }
-
- /**
- * Checks the given platform has all the required files, and returns true if they are all
- * present.
- * <p/>This checks the presence of the following files: android.jar, framework.aidl, aapt(.exe),
- * aidl(.exe), dx(.bat), and dx.jar
- *
- * @param platform The folder containing the platform.
- * @param log Logger. Cannot be null.
- */
- private static boolean checkPlatformContent(File platform, ILogger log) {
- for (String relativePath : sPlatformContentList) {
- File f = new File(platform, relativePath);
- if (!f.exists()) {
- log.warning(
- "Ignoring platform '%1$s': %2$s is missing.", //$NON-NLS-1$
- platform.getName(), relativePath);
- return false;
- }
- }
- return true;
- }
-
-
-
- /**
- * Parses the skin folder and builds the skin list.
- * @param osPath The path of the skin root folder.
- */
- private static String[] parseSkinFolder(String osPath) {
- File skinRootFolder = new File(osPath);
-
- if (skinRootFolder.isDirectory()) {
- ArrayList<String> skinList = new ArrayList<String>();
-
- File[] files = skinRootFolder.listFiles();
-
- for (File skinFolder : files) {
- if (skinFolder.isDirectory()) {
- // check for layout file
- File layout = new File(skinFolder, SdkConstants.FN_SKIN_LAYOUT);
-
- if (layout.isFile()) {
- // for now we don't parse the content of the layout and
- // simply add the directory to the list.
- skinList.add(skinFolder.getName());
- }
- }
- }
-
- return skinList.toArray(new String[skinList.size()]);
- }
-
- return new String[0];
- }
-
- /**
- * Initialize the sample folders for all known targets (platforms and addons).
- * <p/>
- * Samples used to be located at SDK/Target/samples. We then changed this to
- * have a separate SDK/samples/samples-API directory. This parses either directories
- * and sets the targets' sample path accordingly.
- *
- * @param log Logger. Cannot be null.
- */
- private void initializeSamplePaths(ILogger log) {
- File sampleFolder = new File(mOsSdkPath, SdkConstants.FD_SAMPLES);
- if (sampleFolder.isDirectory()) {
- File[] platforms = sampleFolder.listFiles();
-
- for (File platform : platforms) {
- if (platform.isDirectory()) {
- // load the source.properties file and get an AndroidVersion object from it.
- AndroidVersion version = getSamplesVersion(platform, log);
-
- if (version != null) {
- // locate the platform matching this version
- for (IAndroidTarget target : mTargets) {
- if (target.isPlatform() && target.getVersion().equals(version)) {
- ((PlatformTarget)target).setSamplesPath(platform.getAbsolutePath());
- break;
- }
- }
- }
- }
- }
- }
- }
-
- /**
- * Returns the {@link AndroidVersion} of the sample in the given folder.
- *
- * @param folder The sample's folder.
- * @param log Logger for errors. Cannot be null.
- * @return An {@link AndroidVersion} or null on error.
- */
- private AndroidVersion getSamplesVersion(File folder, ILogger log) {
- File sourceProp = new File(folder, SdkConstants.FN_SOURCE_PROP);
- try {
- Properties p = new Properties();
- FileInputStream fis = null;
- try {
- fis = new FileInputStream(sourceProp);
- p.load(fis);
- } finally {
- if (fis != null) {
- fis.close();
- }
- }
-
- return new AndroidVersion(p);
- } catch (FileNotFoundException e) {
- log.warning("Ignoring sample '%1$s': does not contain %2$s.", //$NON-NLS-1$
- folder.getName(), SdkConstants.FN_SOURCE_PROP);
- } catch (IOException e) {
- log.warning("Ignoring sample '%1$s': failed reading %2$s.", //$NON-NLS-1$
- folder.getName(), SdkConstants.FN_SOURCE_PROP);
- } catch (AndroidVersionException e) {
- log.warning("Ignoring sample '%1$s': no android version found in %2$s.", //$NON-NLS-1$
- folder.getName(), SdkConstants.FN_SOURCE_PROP);
- }
-
- return null;
- }
-
- // -------------
-
- public static class LayoutlibVersion implements Comparable<LayoutlibVersion> {
- private final int mApi;
- private final int mRevision;
-
- public static final int NOT_SPECIFIED = 0;
-
- public LayoutlibVersion(int api, int revision) {
- mApi = api;
- mRevision = revision;
- }
-
- public int getApi() {
- return mApi;
- }
-
- public int getRevision() {
- return mRevision;
- }
-
- @Override
- public int compareTo(LayoutlibVersion rhs) {
- boolean useRev = this.mRevision > NOT_SPECIFIED && rhs.mRevision > NOT_SPECIFIED;
- int lhsValue = (this.mApi << 16) + (useRev ? this.mRevision : 0);
- int rhsValue = (rhs.mApi << 16) + (useRev ? rhs.mRevision : 0);
- return lhsValue - rhsValue;
- }
- }
-
- // -------------
-
- private static class DirInfo {
- private final @NonNull File mDir;
- private final long mDirModifiedTS;
- private final long mPropsModifedTS;
- private final long mPropsChecksum;
-
- /**
- * Creates a new immutable {@link DirInfo}.
- *
- * @param dir The platform/addon directory of the target. It should be a directory.
- */
- public DirInfo(@NonNull File dir) {
- mDir = dir;
- mDirModifiedTS = dir.lastModified();
-
- // Capture some info about the source.properties file if it exists.
- // We use propsModifedTS == 0 to mean there is no props file.
- long propsChecksum = 0;
- long propsModifedTS = 0;
- File props = new File(dir, SdkConstants.FN_SOURCE_PROP);
- if (props.isFile()) {
- propsModifedTS = props.lastModified();
- propsChecksum = getFileChecksum(props);
- }
- mPropsModifedTS = propsModifedTS;
- mPropsChecksum = propsChecksum;
- }
-
- /**
- * Checks whether the directory/source.properties attributes have changed.
- *
- * @return True if the directory modified timestampd or
- * its source.property files have changed.
- */
- public boolean hasChanged() {
- // Does platform directory still exist?
- if (!mDir.isDirectory()) {
- return true;
- }
- // Has platform directory modified-timestamp changed?
- if (mDirModifiedTS != mDir.lastModified()) {
- return true;
- }
-
- File props = new File(mDir, SdkConstants.FN_SOURCE_PROP);
-
- // The directory did not have a props file if target was null or
- // if mPropsModifedTS is 0.
- boolean hadProps = mPropsModifedTS != 0;
-
- // Was there a props file and it vanished, or there wasn't and there's one now?
- if (hadProps != props.isFile()) {
- return true;
- }
-
- if (hadProps) {
- // Has source.props file modified-timestampd changed?
- if (mPropsModifedTS != props.lastModified()) {
- return true;
- }
- // Had the content of source.props changed?
- if (mPropsChecksum != getFileChecksum(props)) {
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * Computes an adler32 checksum (source.props are small files, so this
- * should be OK with an acceptable collision rate.)
- */
- private static long getFileChecksum(File file) {
- FileInputStream fis = null;
- try {
- fis = new FileInputStream(file);
- Adler32 a = new Adler32();
- byte[] buf = new byte[1024];
- int n;
- while ((n = fis.read(buf)) > 0) {
- a.update(buf, 0, n);
- }
- return a.getValue();
- } catch (Exception ignore) {
- } finally {
- try {
- if (fis != null) {
- fis.close();
- }
- } catch(Exception ignore) {};
- }
- return 0;
- }
-
- /** Returns a visual representation of this object for debugging. */
- @Override
- public String toString() {
- String s = String.format("<DirInfo %1$s TS=%2$d", mDir, mDirModifiedTS); //$NON-NLS-1$
- if (mPropsModifedTS != 0) {
- s += String.format(" | Props TS=%1$d, Chksum=%2$s", //$NON-NLS-1$
- mPropsModifedTS, mPropsChecksum);
- }
- return s + ">"; //$NON-NLS-1$
- }
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/SystemImage.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/SystemImage.java
deleted file mode 100755
index afc11c7..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/SystemImage.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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;
-
-import com.android.SdkConstants;
-import com.android.sdklib.io.FileOp;
-
-import java.io.File;
-import java.util.Locale;
-
-
-/**
- * Describes a system image as used by an {@link IAndroidTarget}.
- * A system image has an installation path, a location type and an ABI type.
- */
-public class SystemImage implements ISystemImage {
-
- public static final String ANDROID_PREFIX = "android-"; //$NON-NLS-1$
-
- private final LocationType mLocationtype;
- private final String mAbiType;
- private final File mLocation;
-
- /**
- * Creates a {@link SystemImage} description for an existing system image folder.
- *
- * @param location The location of an installed system image.
- * @param locationType Where the system image folder is located for this ABI.
- * @param abiType The ABI type. For example, one of {@link SdkConstants#ABI_ARMEABI},
- * {@link SdkConstants#ABI_ARMEABI_V7A}, {@link SdkConstants#ABI_INTEL_ATOM} or
- * {@link SdkConstants#ABI_MIPS}.
- */
- public SystemImage(File location, LocationType locationType, String abiType) {
- mLocation = location;
- mLocationtype = locationType;
- mAbiType = abiType;
- }
-
- /**
- * Creates a {@link SystemImage} description for a non-existing system image folder.
- * The actual location is computed based on the {@code locationtype}.
- *
- * @param sdkManager The current SDK manager.
- * @param locationType Where the system image folder is located for this ABI.
- * @param abiType The ABI type. For example, one of {@link SdkConstants#ABI_ARMEABI},
- * {@link SdkConstants#ABI_ARMEABI_V7A}, {@link SdkConstants#ABI_INTEL_ATOM} or
- * {@link SdkConstants#ABI_MIPS}.
- * @throws IllegalArgumentException if the {@code target} used for
- * {@link ISystemImage.LocationType#IN_SYSTEM_IMAGE} is not a {@link PlatformTarget}.
- */
- public SystemImage(
- SdkManager sdkManager,
- IAndroidTarget target,
- LocationType locationType,
- String abiType) {
- mLocationtype = locationType;
- mAbiType = abiType;
-
- File location = null;
- switch(locationType) {
- case IN_PLATFORM_LEGACY:
- location = new File(target.getLocation(), SdkConstants.OS_IMAGES_FOLDER);
- break;
-
- case IN_PLATFORM_SUBFOLDER:
- location = FileOp.append(target.getLocation(), SdkConstants.OS_IMAGES_FOLDER, abiType);
- break;
-
- case IN_SYSTEM_IMAGE:
- if (!target.isPlatform()) {
- throw new IllegalArgumentException(
- "Add-ons do not support the system-image location type"); //$NON-NLS-1$
- }
-
- location = getCanonicalFolder(sdkManager.getLocation(), target.getVersion(), abiType);
- break;
- default:
- // This is not supposed to happen unless LocationType is
- // extended without adjusting this code.
- assert false : "SystemImage used with an incorrect locationType"; //$NON-NLS-1$
- }
- mLocation = location;
- }
-
- /**
- * Static helper method that returns the canonical path for a system-image that uses
- * the {@link ISystemImage.LocationType#IN_SYSTEM_IMAGE} location type.
- * <p/>
- * Such an image is located in {@code SDK/system-images/android-N/abiType}.
- * For this reason this method requires the root SDK as well as the platform and the ABI type.
- *
- * @param sdkOsPath The OS path to the SDK.
- * @param platformVersion The platform version.
- * @param abiType An optional ABI type. If null, the parent directory is returned.
- * @return A file that represents the location of the canonical system-image folder
- * for this configuration.
- */
- public static File getCanonicalFolder(
- String sdkOsPath,
- AndroidVersion platformVersion,
- String abiType) {
- File root = FileOp.append(
- sdkOsPath,
- SdkConstants.FD_SYSTEM_IMAGES,
- ANDROID_PREFIX + platformVersion.getApiString());
- if (abiType == null) {
- return root;
- } else {
- return FileOp.append(root, abiType);
- }
- }
-
- /** Returns the actual location of an installed system image. */
- @Override
- public File getLocation() {
- return mLocation;
- }
-
- /** Indicates the location strategy for this system image in the SDK. */
- @Override
- public LocationType getLocationType() {
- return mLocationtype;
- }
-
- /**
- * Returns the ABI type. For example, one of {@link SdkConstants#ABI_ARMEABI},
- * {@link SdkConstants#ABI_ARMEABI_V7A}, {@link SdkConstants#ABI_INTEL_ATOM} or
- * {@link SdkConstants#ABI_MIPS}.
- * Cannot be null nor empty.
- */
- @Override
- public String getAbiType() {
- return mAbiType;
- }
-
- @Override
- public int compareTo(ISystemImage other) {
- // Sort by ABI name only. This is what matters from a user point of view.
- return this.getAbiType().compareToIgnoreCase(other.getAbiType());
- }
-
- /**
- * Generates a string representation suitable for debug purposes.
- * The string is not intended to be displayed to the user.
- *
- * {@inheritDoc}
- */
- @Override
- public String toString() {
- return String.format("SystemImage ABI=%s, location %s='%s'", //$NON-NLS-1$
- mAbiType,
- mLocationtype.toString().replace('_', ' ').toLowerCase(Locale.US),
- mLocation
- );
- }
-
-
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/build/ApkBuilder.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/build/ApkBuilder.java
deleted file mode 100644
index d499feb..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/build/ApkBuilder.java
+++ /dev/null
@@ -1,1000 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.build;
-
-import com.android.SdkConstants;
-import com.android.sdklib.internal.build.DebugKeyProvider;
-import com.android.sdklib.internal.build.DebugKeyProvider.IKeyGenOutput;
-import com.android.sdklib.internal.build.DebugKeyProvider.KeytoolException;
-import com.android.sdklib.internal.build.SignedJarBuilder;
-import com.android.sdklib.internal.build.SignedJarBuilder.IZipEntryFilter;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.PrintStream;
-import java.security.PrivateKey;
-import java.security.cert.X509Certificate;
-import java.text.DateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.regex.Pattern;
-
-/**
- * Class making the final apk packaging.
- * The inputs are:
- * - packaged resources (output of aapt)
- * - code file (ouput of dx)
- * - Java resources coming from the project, its libraries, and its jar files
- * - Native libraries from the project or its library.
- *
- */
-public final class ApkBuilder implements IArchiveBuilder {
-
- private final static Pattern PATTERN_NATIVELIB_EXT = Pattern.compile("^.+\\.so$",
- Pattern.CASE_INSENSITIVE);
- private final static Pattern PATTERN_BITCODELIB_EXT = Pattern.compile("^.+\\.bc$",
- Pattern.CASE_INSENSITIVE);
-
- /**
- * A No-op zip filter. It's used to detect conflicts.
- *
- */
- private final class NullZipFilter implements IZipEntryFilter {
- private File mInputFile;
-
- void reset(File inputFile) {
- mInputFile = inputFile;
- }
-
- @Override
- public boolean checkEntry(String archivePath) throws ZipAbortException {
- verbosePrintln("=> %s", archivePath);
-
- File duplicate = checkFileForDuplicate(archivePath);
- if (duplicate != null) {
- throw new DuplicateFileException(archivePath, duplicate, mInputFile);
- } else {
- mAddedFiles.put(archivePath, mInputFile);
- }
-
- return true;
- }
- }
-
- /**
- * Custom {@link IZipEntryFilter} to filter out everything that is not a standard java
- * resources, and also record whether the zip file contains native libraries.
- * <p/>Used in {@link SignedJarBuilder#writeZip(java.io.InputStream, IZipEntryFilter)} when
- * we only want the java resources from external jars.
- */
- private final class JavaAndNativeResourceFilter implements IZipEntryFilter {
- private final List<String> mNativeLibs = new ArrayList<String>();
- private boolean mNativeLibsConflict = false;
- private File mInputFile;
-
- @Override
- public boolean checkEntry(String archivePath) throws ZipAbortException {
- // split the path into segments.
- String[] segments = archivePath.split("/");
-
- // empty path? skip to next entry.
- if (segments.length == 0) {
- return false;
- }
-
- // Check each folders to make sure they should be included.
- // Folders like CVS, .svn, etc.. should already have been excluded from the
- // jar file, but we need to exclude some other folder (like /META-INF) so
- // we check anyway.
- for (int i = 0 ; i < segments.length - 1; i++) {
- if (checkFolderForPackaging(segments[i]) == false) {
- return false;
- }
- }
-
- // get the file name from the path
- String fileName = segments[segments.length-1];
-
- boolean check = checkFileForPackaging(fileName);
-
- // only do additional checks if the file passes the default checks.
- if (check) {
- verbosePrintln("=> %s", archivePath);
-
- File duplicate = checkFileForDuplicate(archivePath);
- if (duplicate != null) {
- throw new DuplicateFileException(archivePath, duplicate, mInputFile);
- } else {
- mAddedFiles.put(archivePath, mInputFile);
- }
-
- if (archivePath.endsWith(".so") || archivePath.endsWith(".bc")) {
- mNativeLibs.add(archivePath);
-
- // only .so located in lib/ will interfere with the installation
- if (archivePath.startsWith(SdkConstants.FD_APK_NATIVE_LIBS + "/")) {
- mNativeLibsConflict = true;
- }
- } else if (archivePath.endsWith(".jnilib")) {
- mNativeLibs.add(archivePath);
- }
- }
-
- return check;
- }
-
- List<String> getNativeLibs() {
- return mNativeLibs;
- }
-
- boolean getNativeLibsConflict() {
- return mNativeLibsConflict;
- }
-
- void reset(File inputFile) {
- mInputFile = inputFile;
- mNativeLibs.clear();
- mNativeLibsConflict = false;
- }
- }
-
- private File mApkFile;
- private File mResFile;
- private File mDexFile;
- private PrintStream mVerboseStream;
- private SignedJarBuilder mBuilder;
- private boolean mDebugMode = false;
- private boolean mIsSealed = false;
-
- private final NullZipFilter mNullFilter = new NullZipFilter();
- private final JavaAndNativeResourceFilter mFilter = new JavaAndNativeResourceFilter();
- private final HashMap<String, File> mAddedFiles = new HashMap<String, File>();
-
- /**
- * Status for the addition of a jar file resources into the APK.
- * This indicates possible issues with native library inside the jar file.
- */
- public interface JarStatus {
- /**
- * Returns the list of native libraries found in the jar file.
- */
- List<String> getNativeLibs();
-
- /**
- * Returns whether some of those libraries were located in the location that Android
- * expects its native libraries.
- */
- boolean hasNativeLibsConflicts();
-
- }
-
- /** Internal implementation of {@link JarStatus}. */
- private final static class JarStatusImpl implements JarStatus {
- public final List<String> mLibs;
- public final boolean mNativeLibsConflict;
-
- private JarStatusImpl(List<String> libs, boolean nativeLibsConflict) {
- mLibs = libs;
- mNativeLibsConflict = nativeLibsConflict;
- }
-
- @Override
- public List<String> getNativeLibs() {
- return mLibs;
- }
-
- @Override
- public boolean hasNativeLibsConflicts() {
- return mNativeLibsConflict;
- }
- }
-
- /**
- * Signing information.
- *
- * Both the {@link PrivateKey} and the {@link X509Certificate} are guaranteed to be non-null.
- *
- */
- public final static class SigningInfo {
- public final PrivateKey key;
- public final X509Certificate certificate;
-
- private SigningInfo(PrivateKey key, X509Certificate certificate) {
- if (key == null || certificate == null) {
- throw new IllegalArgumentException("key and certificate cannot be null");
- }
- this.key = key;
- this.certificate = certificate;
- }
- }
-
- /**
- * Returns the key and certificate from a given debug store.
- *
- * It is expected that the store password is 'android' and the key alias and password are
- * 'androiddebugkey' and 'android' respectively.
- *
- * @param storeOsPath the OS path to the debug store.
- * @param verboseStream an option {@link PrintStream} to display verbose information
- * @return they key and certificate in a {@link SigningInfo} object or null.
- * @throws ApkCreationException
- */
- public static SigningInfo getDebugKey(String storeOsPath, final PrintStream verboseStream)
- throws ApkCreationException {
- try {
- if (storeOsPath != null) {
- File storeFile = new File(storeOsPath);
- try {
- checkInputFile(storeFile);
- } catch (FileNotFoundException e) {
- // ignore these since the debug store can be created on the fly anyway.
- }
-
- // get the debug key
- if (verboseStream != null) {
- verboseStream.println(String.format("Using keystore: %s", storeOsPath));
- }
-
- IKeyGenOutput keygenOutput = null;
- if (verboseStream != null) {
- keygenOutput = new IKeyGenOutput() {
- @Override
- public void out(String message) {
- verboseStream.println(message);
- }
-
- @Override
- public void err(String message) {
- verboseStream.println(message);
- }
- };
- }
-
- DebugKeyProvider keyProvider = new DebugKeyProvider(
- storeOsPath, null /*store type*/, keygenOutput);
-
- PrivateKey key = keyProvider.getDebugKey();
- X509Certificate certificate = (X509Certificate)keyProvider.getCertificate();
-
- if (key == null) {
- throw new ApkCreationException("Unable to get debug signature key");
- }
-
- // compare the certificate expiration date
- if (certificate != null && certificate.getNotAfter().compareTo(new Date()) < 0) {
- // TODO, regenerate a new one.
- throw new ApkCreationException("Debug Certificate expired on " +
- DateFormat.getInstance().format(certificate.getNotAfter()));
- }
-
- return new SigningInfo(key, certificate);
- } else {
- return null;
- }
- } catch (KeytoolException e) {
- if (e.getJavaHome() == null) {
- throw new ApkCreationException(e.getMessage() +
- "\nJAVA_HOME seems undefined, setting it will help locating keytool automatically\n" +
- "You can also manually execute the following command\n:" +
- e.getCommandLine(), e);
- } else {
- throw new ApkCreationException(e.getMessage() +
- "\nJAVA_HOME is set to: " + e.getJavaHome() +
- "\nUpdate it if necessary, or manually execute the following command:\n" +
- e.getCommandLine(), e);
- }
- } catch (ApkCreationException e) {
- throw e;
- } catch (Exception e) {
- throw new ApkCreationException(e);
- }
- }
-
- /**
- * Creates a new instance.
- *
- * This creates a new builder that will create the specified output file, using the two
- * mandatory given input files.
- *
- * An optional debug keystore can be provided. If set, it is expected that the store password
- * is 'android' and the key alias and password are 'androiddebugkey' and 'android'.
- *
- * An optional {@link PrintStream} can also be provided for verbose output. If null, there will
- * be no output.
- *
- * @param apkOsPath the OS path of the file to create.
- * @param resOsPath the OS path of the packaged resource file.
- * @param dexOsPath the OS path of the dex file. This can be null for apk with no code.
- * @param verboseStream the stream to which verbose output should go. If null, verbose mode
- * is not enabled.
- * @throws ApkCreationException
- */
- public ApkBuilder(String apkOsPath, String resOsPath, String dexOsPath, String storeOsPath,
- PrintStream verboseStream) throws ApkCreationException {
- this(new File(apkOsPath),
- new File(resOsPath),
- dexOsPath != null ? new File(dexOsPath) : null,
- storeOsPath,
- verboseStream);
- }
-
- /**
- * Creates a new instance.
- *
- * This creates a new builder that will create the specified output file, using the two
- * mandatory given input files.
- *
- * Optional {@link PrivateKey} and {@link X509Certificate} can be provided to sign the APK.
- *
- * An optional {@link PrintStream} can also be provided for verbose output. If null, there will
- * be no output.
- *
- * @param apkOsPath the OS path of the file to create.
- * @param resOsPath the OS path of the packaged resource file.
- * @param dexOsPath the OS path of the dex file. This can be null for apk with no code.
- * @param key the private key used to sign the package. Can be null.
- * @param certificate the certificate used to sign the package. Can be null.
- * @param verboseStream the stream to which verbose output should go. If null, verbose mode
- * is not enabled.
- * @throws ApkCreationException
- */
- public ApkBuilder(String apkOsPath, String resOsPath, String dexOsPath, PrivateKey key,
- X509Certificate certificate, PrintStream verboseStream) throws ApkCreationException {
- this(new File(apkOsPath),
- new File(resOsPath),
- dexOsPath != null ? new File(dexOsPath) : null,
- key, certificate,
- verboseStream);
- }
-
- /**
- * Creates a new instance.
- *
- * This creates a new builder that will create the specified output file, using the two
- * mandatory given input files.
- *
- * An optional debug keystore can be provided. If set, it is expected that the store password
- * is 'android' and the key alias and password are 'androiddebugkey' and 'android'.
- *
- * An optional {@link PrintStream} can also be provided for verbose output. If null, there will
- * be no output.
- *
- * @param apkFile the file to create
- * @param resFile the file representing the packaged resource file.
- * @param dexFile the file representing the dex file. This can be null for apk with no code.
- * @param debugStoreOsPath the OS path to the debug keystore, if needed or null.
- * @param verboseStream the stream to which verbose output should go. If null, verbose mode
- * is not enabled.
- * @throws ApkCreationException
- */
- public ApkBuilder(File apkFile, File resFile, File dexFile, String debugStoreOsPath,
- final PrintStream verboseStream) throws ApkCreationException {
-
- SigningInfo info = getDebugKey(debugStoreOsPath, verboseStream);
- if (info != null) {
- init(apkFile, resFile, dexFile, info.key, info.certificate, verboseStream);
- } else {
- init(apkFile, resFile, dexFile, null /*key*/, null/*certificate*/, verboseStream);
- }
- }
-
- /**
- * Creates a new instance.
- *
- * This creates a new builder that will create the specified output file, using the two
- * mandatory given input files.
- *
- * Optional {@link PrivateKey} and {@link X509Certificate} can be provided to sign the APK.
- *
- * An optional {@link PrintStream} can also be provided for verbose output. If null, there will
- * be no output.
- *
- * @param apkFile the file to create
- * @param resFile the file representing the packaged resource file.
- * @param dexFile the file representing the dex file. This can be null for apk with no code.
- * @param key the private key used to sign the package. Can be null.
- * @param certificate the certificate used to sign the package. Can be null.
- * @param verboseStream the stream to which verbose output should go. If null, verbose mode
- * is not enabled.
- * @throws ApkCreationException
- */
- public ApkBuilder(File apkFile, File resFile, File dexFile, PrivateKey key,
- X509Certificate certificate, PrintStream verboseStream) throws ApkCreationException {
- init(apkFile, resFile, dexFile, key, certificate, verboseStream);
- }
-
-
- /**
- * Constructor init method.
- *
- * @see #ApkBuilder(File, File, File, String, PrintStream)
- * @see #ApkBuilder(String, String, String, String, PrintStream)
- * @see #ApkBuilder(File, File, File, PrivateKey, X509Certificate, PrintStream)
- */
- private void init(File apkFile, File resFile, File dexFile, PrivateKey key,
- X509Certificate certificate, PrintStream verboseStream) throws ApkCreationException {
-
- try {
- checkOutputFile(mApkFile = apkFile);
- checkInputFile(mResFile = resFile);
- if (dexFile != null) {
- checkInputFile(mDexFile = dexFile);
- } else {
- mDexFile = null;
- }
- mVerboseStream = verboseStream;
-
- mBuilder = new SignedJarBuilder(
- new FileOutputStream(mApkFile, false /* append */), key,
- certificate);
-
- verbosePrintln("Packaging %s", mApkFile.getName());
-
- // add the resources
- addZipFile(mResFile);
-
- // add the class dex file at the root of the apk
- if (mDexFile != null) {
- addFile(mDexFile, SdkConstants.FN_APK_CLASSES_DEX);
- }
-
- } catch (ApkCreationException e) {
- if (mBuilder != null) {
- mBuilder.cleanUp();
- }
- throw e;
- } catch (Exception e) {
- if (mBuilder != null) {
- mBuilder.cleanUp();
- }
- throw new ApkCreationException(e);
- }
- }
-
- /**
- * Sets the debug mode. In debug mode, when native libraries are present, the packaging
- * will also include one or more copies of gdbserver in the final APK file.
- *
- * These are used for debugging native code, to ensure that gdbserver is accessible to the
- * application.
- *
- * There will be one version of gdbserver for each ABI supported by the application.
- *
- * the gbdserver files are placed in the libs/abi/ folders automatically by the NDK.
- *
- * @param debugMode the debug mode flag.
- */
- public void setDebugMode(boolean debugMode) {
- mDebugMode = debugMode;
- }
-
- /**
- * Adds a file to the APK at a given path
- * @param file the file to add
- * @param archivePath the path of the file inside the APK archive.
- * @throws ApkCreationException if an error occurred
- * @throws SealedApkException if the APK is already sealed.
- * @throws DuplicateFileException if a file conflicts with another already added to the APK
- * at the same location inside the APK archive.
- */
- @Override
- public void addFile(File file, String archivePath) throws ApkCreationException,
- SealedApkException, DuplicateFileException {
- if (mIsSealed) {
- throw new SealedApkException("APK is already sealed");
- }
-
- try {
- doAddFile(file, archivePath);
- } catch (DuplicateFileException e) {
- mBuilder.cleanUp();
- throw e;
- } catch (Exception e) {
- mBuilder.cleanUp();
- throw new ApkCreationException(e, "Failed to add %s", file);
- }
- }
-
- /**
- * Adds the content from a zip file.
- * All file keep the same path inside the archive.
- * @param zipFile the zip File.
- * @throws ApkCreationException if an error occurred
- * @throws SealedApkException if the APK is already sealed.
- * @throws DuplicateFileException if a file conflicts with another already added to the APK
- * at the same location inside the APK archive.
- */
- public void addZipFile(File zipFile) throws ApkCreationException, SealedApkException,
- DuplicateFileException {
- if (mIsSealed) {
- throw new SealedApkException("APK is already sealed");
- }
-
- try {
- verbosePrintln("%s:", zipFile);
-
- // reset the filter with this input.
- mNullFilter.reset(zipFile);
-
- // ask the builder to add the content of the file.
- FileInputStream fis = new FileInputStream(zipFile);
- mBuilder.writeZip(fis, mNullFilter);
- fis.close();
- } catch (DuplicateFileException e) {
- mBuilder.cleanUp();
- throw e;
- } catch (Exception e) {
- mBuilder.cleanUp();
- throw new ApkCreationException(e, "Failed to add %s", zipFile);
- }
- }
-
- /**
- * Adds the resources from a jar file.
- * @param jarFile the jar File.
- * @return a {@link JarStatus} object indicating if native libraries where found in
- * the jar file.
- * @throws ApkCreationException if an error occurred
- * @throws SealedApkException if the APK is already sealed.
- * @throws DuplicateFileException if a file conflicts with another already added to the APK
- * at the same location inside the APK archive.
- */
- public JarStatus addResourcesFromJar(File jarFile) throws ApkCreationException,
- SealedApkException, DuplicateFileException {
- if (mIsSealed) {
- throw new SealedApkException("APK is already sealed");
- }
-
- try {
- verbosePrintln("%s:", jarFile);
-
- // reset the filter with this input.
- mFilter.reset(jarFile);
-
- // ask the builder to add the content of the file, filtered to only let through
- // the java resources.
- FileInputStream fis = new FileInputStream(jarFile);
- mBuilder.writeZip(fis, mFilter);
- fis.close();
-
- // check if native libraries were found in the external library. This should
- // constitutes an error or warning depending on if they are in lib/
- return new JarStatusImpl(mFilter.getNativeLibs(), mFilter.getNativeLibsConflict());
- } catch (DuplicateFileException e) {
- mBuilder.cleanUp();
- throw e;
- } catch (Exception e) {
- mBuilder.cleanUp();
- throw new ApkCreationException(e, "Failed to add %s", jarFile);
- }
- }
-
- /**
- * Adds the resources from a source folder.
- * @param sourceFolder the source folder.
- * @throws ApkCreationException if an error occurred
- * @throws SealedApkException if the APK is already sealed.
- * @throws DuplicateFileException if a file conflicts with another already added to the APK
- * at the same location inside the APK archive.
- */
- public void addSourceFolder(File sourceFolder) throws ApkCreationException, SealedApkException,
- DuplicateFileException {
- if (mIsSealed) {
- throw new SealedApkException("APK is already sealed");
- }
-
- addSourceFolder(this, sourceFolder);
- }
-
- /**
- * Adds the resources from a source folder to a given {@link IArchiveBuilder}
- * @param sourceFolder the source folder.
- * @throws ApkCreationException if an error occurred
- * @throws DuplicateFileException if a file conflicts with another already added to the APK
- * at the same location inside the APK archive.
- */
- public static void addSourceFolder(IArchiveBuilder builder, File sourceFolder)
- throws ApkCreationException, DuplicateFileException {
- if (sourceFolder.isDirectory()) {
- try {
- // file is a directory, process its content.
- File[] files = sourceFolder.listFiles();
- for (File file : files) {
- processFileForResource(builder, file, null);
- }
- } catch (DuplicateFileException e) {
- throw e;
- } catch (Exception e) {
- throw new ApkCreationException(e, "Failed to add %s", sourceFolder);
- }
- } else {
- // not a directory? check if it's a file or doesn't exist
- if (sourceFolder.exists()) {
- throw new ApkCreationException("%s is not a folder", sourceFolder);
- } else {
- throw new ApkCreationException("%s does not exist", sourceFolder);
- }
- }
- }
-
- /**
- * Adds the native libraries from the top native folder.
- * The content of this folder must be the various ABI folders.
- *
- * This may or may not copy gdbserver into the apk based on whether the debug mode is set.
- *
- * @param nativeFolder the native folder.
- *
- * @throws ApkCreationException if an error occurred
- * @throws SealedApkException if the APK is already sealed.
- * @throws DuplicateFileException if a file conflicts with another already added to the APK
- * at the same location inside the APK archive.
- *
- * @see #setDebugMode(boolean)
- */
- public void addNativeLibraries(File nativeFolder)
- throws ApkCreationException, SealedApkException, DuplicateFileException {
- if (mIsSealed) {
- throw new SealedApkException("APK is already sealed");
- }
-
- if (nativeFolder.isDirectory() == false) {
- // not a directory? check if it's a file or doesn't exist
- if (nativeFolder.exists()) {
- throw new ApkCreationException("%s is not a folder", nativeFolder);
- } else {
- throw new ApkCreationException("%s does not exist", nativeFolder);
- }
- }
-
- File[] abiList = nativeFolder.listFiles();
-
- verbosePrintln("Native folder: %s", nativeFolder);
-
- if (abiList != null) {
- for (File abi : abiList) {
- if (abi.isDirectory()) { // ignore files
-
- File[] libs = abi.listFiles();
- if (libs != null) {
- for (File lib : libs) {
- // only consider files that are .so or, if in debug mode, that
- // are gdbserver executables
- if (lib.isFile() &&
- (PATTERN_NATIVELIB_EXT.matcher(lib.getName()).matches() ||
- PATTERN_BITCODELIB_EXT.matcher(lib.getName()).matches() ||
- (mDebugMode &&
- SdkConstants.FN_GDBSERVER.equals(
- lib.getName())))) {
- String path =
- SdkConstants.FD_APK_NATIVE_LIBS + "/" +
- abi.getName() + "/" + lib.getName();
-
- try {
- doAddFile(lib, path);
- } catch (IOException e) {
- mBuilder.cleanUp();
- throw new ApkCreationException(e, "Failed to add %s", lib);
- }
- }
- }
- }
- }
- }
- }
- }
-
- public void addNativeLibraries(List<FileEntry> entries) throws SealedApkException,
- DuplicateFileException, ApkCreationException {
- if (mIsSealed) {
- throw new SealedApkException("APK is already sealed");
- }
-
- for (FileEntry entry : entries) {
- try {
- doAddFile(entry.mFile, entry.mPath);
- } catch (IOException e) {
- mBuilder.cleanUp();
- throw new ApkCreationException(e, "Failed to add %s", entry.mFile);
- }
- }
- }
-
- public static final class FileEntry {
- public final File mFile;
- public final String mPath;
-
- FileEntry(File file, String path) {
- mFile = file;
- mPath = path;
- }
- }
-
- public static List<FileEntry> getNativeFiles(File nativeFolder, boolean debugMode)
- throws ApkCreationException {
-
- if (nativeFolder.isDirectory() == false) {
- // not a directory? check if it's a file or doesn't exist
- if (nativeFolder.exists()) {
- throw new ApkCreationException("%s is not a folder", nativeFolder);
- } else {
- throw new ApkCreationException("%s does not exist", nativeFolder);
- }
- }
-
- List<FileEntry> files = new ArrayList<FileEntry>();
-
- File[] abiList = nativeFolder.listFiles();
-
- if (abiList != null) {
- for (File abi : abiList) {
- if (abi.isDirectory()) { // ignore files
-
- File[] libs = abi.listFiles();
- if (libs != null) {
- for (File lib : libs) {
- // only consider files that are .so or, if in debug mode, that
- // are gdbserver executables
- if (lib.isFile() &&
- (PATTERN_NATIVELIB_EXT.matcher(lib.getName()).matches() ||
- PATTERN_BITCODELIB_EXT.matcher(lib.getName()).matches() ||
- (debugMode &&
- SdkConstants.FN_GDBSERVER.equals(
- lib.getName())))) {
- String path =
- SdkConstants.FD_APK_NATIVE_LIBS + "/" +
- abi.getName() + "/" + lib.getName();
-
- files.add(new FileEntry(lib, path));
- }
- }
- }
- }
- }
- }
-
- return files;
- }
-
-
-
- /**
- * Seals the APK, and signs it if necessary.
- * @throws ApkCreationException
- * @throws ApkCreationException if an error occurred
- * @throws SealedApkException if the APK is already sealed.
- */
- public void sealApk() throws ApkCreationException, SealedApkException {
- if (mIsSealed) {
- throw new SealedApkException("APK is already sealed");
- }
-
- // close and sign the application package.
- try {
- mBuilder.close();
- mIsSealed = true;
- } catch (Exception e) {
- throw new ApkCreationException(e, "Failed to seal APK");
- } finally {
- mBuilder.cleanUp();
- }
- }
-
- /**
- * Output a given message if the verbose mode is enabled.
- * @param format the format string for {@link String#format(String, Object...)}
- * @param args the string arguments
- */
- private void verbosePrintln(String format, Object... args) {
- if (mVerboseStream != null) {
- mVerboseStream.println(String.format(format, args));
- }
- }
-
- private void doAddFile(File file, String archivePath) throws DuplicateFileException,
- IOException {
- verbosePrintln("%1$s => %2$s", file, archivePath);
-
- File duplicate = checkFileForDuplicate(archivePath);
- if (duplicate != null) {
- throw new DuplicateFileException(archivePath, duplicate, file);
- }
-
- mAddedFiles.put(archivePath, file);
- mBuilder.writeFile(file, archivePath);
- }
-
- /**
- * Processes a {@link File} that could be an APK {@link File}, or a folder containing
- * java resources.
- *
- * @param file the {@link File} to process.
- * @param path the relative path of this file to the source folder.
- * Can be <code>null</code> to identify a root file.
- * @throws IOException
- * @throws DuplicateFileException if a file conflicts with another already added
- * to the APK at the same location inside the APK archive.
- * @throws SealedApkException if the APK is already sealed.
- * @throws ApkCreationException if an error occurred
- */
- private static void processFileForResource(IArchiveBuilder builder, File file, String path)
- throws IOException, DuplicateFileException, ApkCreationException, SealedApkException {
- if (file.isDirectory()) {
- // a directory? we check it
- if (checkFolderForPackaging(file.getName())) {
- // if it's valid, we append its name to the current path.
- if (path == null) {
- path = file.getName();
- } else {
- path = path + "/" + file.getName();
- }
-
- // and process its content.
- File[] files = file.listFiles();
- for (File contentFile : files) {
- processFileForResource(builder, contentFile, path);
- }
- }
- } else {
- // a file? we check it to make sure it should be added
- if (checkFileForPackaging(file.getName())) {
- // we append its name to the current path
- if (path == null) {
- path = file.getName();
- } else {
- path = path + "/" + file.getName();
- }
-
- // and add it to the apk
- builder.addFile(file, path);
- }
- }
- }
-
- /**
- * Checks if the given path in the APK archive has not already been used and if it has been,
- * then returns a {@link File} object for the source of the duplicate
- * @param archivePath the archive path to test.
- * @return A File object of either a file at the same location or an archive that contains a
- * file that was put at the same location.
- */
- private File checkFileForDuplicate(String archivePath) {
- return mAddedFiles.get(archivePath);
- }
-
- /**
- * Checks an output {@link File} object.
- * This checks the following:
- * - the file is not an existing directory.
- * - if the file exists, that it can be modified.
- * - if it doesn't exists, that a new file can be created.
- * @param file the File to check
- * @throws ApkCreationException If the check fails
- */
- private void checkOutputFile(File file) throws ApkCreationException {
- if (file.isDirectory()) {
- throw new ApkCreationException("%s is a directory!", file);
- }
-
- if (file.exists()) { // will be a file in this case.
- if (file.canWrite() == false) {
- throw new ApkCreationException("Cannot write %s", file);
- }
- } else {
- try {
- if (file.createNewFile() == false) {
- throw new ApkCreationException("Failed to create %s", file);
- }
- } catch (IOException e) {
- throw new ApkCreationException(
- "Failed to create '%1$ss': %2$s", file, e.getMessage());
- }
- }
- }
-
- /**
- * Checks an input {@link File} object.
- * This checks the following:
- * - the file is not an existing directory.
- * - that the file exists (if <var>throwIfDoesntExist</var> is <code>false</code>) and can
- * be read.
- * @param file the File to check
- * @throws FileNotFoundException if the file is not here.
- * @throws ApkCreationException If the file is a folder or a file that cannot be read.
- */
- private static void checkInputFile(File file) throws FileNotFoundException, ApkCreationException {
- if (file.isDirectory()) {
- throw new ApkCreationException("%s is a directory!", file);
- }
-
- if (file.exists()) {
- if (file.canRead() == false) {
- throw new ApkCreationException("Cannot read %s", file);
- }
- } else {
- throw new FileNotFoundException(String.format("%s does not exist", file));
- }
- }
-
- public static String getDebugKeystore() throws ApkCreationException {
- try {
- return DebugKeyProvider.getDefaultKeyStoreOsPath();
- } catch (Exception e) {
- throw new ApkCreationException(e, e.getMessage());
- }
- }
-
- /**
- * Checks whether a folder and its content is valid for packaging into the .apk as
- * standard Java resource.
- * @param folderName the name of the folder.
- */
- public static boolean checkFolderForPackaging(String folderName) {
- return folderName.equalsIgnoreCase("CVS") == false &&
- folderName.equalsIgnoreCase(".svn") == false &&
- folderName.equalsIgnoreCase("SCCS") == false &&
- folderName.equalsIgnoreCase("META-INF") == false &&
- folderName.startsWith("_") == false;
- }
-
- /**
- * Checks a file to make sure it should be packaged as standard resources.
- * @param fileName the name of the file (including extension)
- * @return true if the file should be packaged as standard java resources.
- */
- public static boolean checkFileForPackaging(String fileName) {
- String[] fileSegments = fileName.split("\\.");
- String fileExt = "";
- if (fileSegments.length > 1) {
- fileExt = fileSegments[fileSegments.length-1];
- }
-
- return checkFileForPackaging(fileName, fileExt);
- }
-
- /**
- * Checks a file to make sure it should be packaged as standard resources.
- * @param fileName the name of the file (including extension)
- * @param extension the extension of the file (excluding '.')
- * @return true if the file should be packaged as standard java resources.
- */
- public static boolean checkFileForPackaging(String fileName, String extension) {
- // ignore hidden files and backup files
- if (fileName.charAt(0) == '.' || fileName.charAt(fileName.length()-1) == '~') {
- return false;
- }
-
- return "aidl".equalsIgnoreCase(extension) == false && // Aidl files
- "rs".equalsIgnoreCase(extension) == false && // RenderScript files
- "rsh".equalsIgnoreCase(extension) == false && // RenderScript header files
- "d".equalsIgnoreCase(extension) == false && // Dependency files
- "java".equalsIgnoreCase(extension) == false && // Java files
- "scala".equalsIgnoreCase(extension) == false && // Scala files
- "class".equalsIgnoreCase(extension) == false && // Java class files
- "scc".equalsIgnoreCase(extension) == false && // VisualSourceSafe
- "swp".equalsIgnoreCase(extension) == false && // vi swap file
- "thumbs.db".equalsIgnoreCase(fileName) == false && // image index file
- "picasa.ini".equalsIgnoreCase(fileName) == false && // image index file
- "package.html".equalsIgnoreCase(fileName) == false && // Javadoc
- "overview.html".equalsIgnoreCase(fileName) == false; // Javadoc
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/build/ApkBuilderMain.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/build/ApkBuilderMain.java
deleted file mode 100644
index 805b74a..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/build/ApkBuilderMain.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.build;
-
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.util.ArrayList;
-import java.util.regex.Pattern;
-
-
-/**
- * Command line APK builder with signing support.
- */
-public final class ApkBuilderMain {
-
- private final static Pattern PATTERN_JAR_EXT = Pattern.compile("^.+\\.jar$",
- Pattern.CASE_INSENSITIVE);
-
- /**
- * Main method. This is meant to be called from the command line through an exec.
- * <p/>WARNING: this will call {@link System#exit(int)} if anything goes wrong.
- * @param args command line arguments.
- */
- public static void main(String[] args) {
- if (args.length < 1) {
- printUsageAndQuit();
- }
-
- System.err.println("\nTHIS TOOL IS DEPRECATED. See --help for more information.\n");
-
- try {
- File outApk = new File(args[0]);
-
- File dexFile = null;
- ArrayList<File> zipArchives = new ArrayList<File>();
- ArrayList<File> sourceFolders = new ArrayList<File>();
- ArrayList<File> jarFiles = new ArrayList<File>();
- ArrayList<File> nativeFolders = new ArrayList<File>();
-
- boolean verbose = false;
- boolean signed = true;
- boolean debug = false;
-
- int index = 1;
- do {
- String argument = args[index++];
-
- if ("-v".equals(argument)) {
- verbose = true;
-
- } else if ("-d".equals(argument)) {
- debug = true;
-
- } else if ("-u".equals(argument)) {
- signed = false;
-
- } else if ("-z".equals(argument)) {
- // quick check on the next argument.
- if (index == args.length) {
- printAndExit("Missing value for -z");
- }
-
- zipArchives.add(new File(args[index++]));
- } else if ("-f". equals(argument)) {
- if (dexFile != null) {
- // can't have more than one dex file.
- printAndExit("Can't have more than one dex file (-f)");
- }
- // quick check on the next argument.
- if (index == args.length) {
- printAndExit("Missing value for -f");
- }
-
- dexFile = new File(args[index++]);
- } else if ("-rf". equals(argument)) {
- // quick check on the next argument.
- if (index == args.length) {
- printAndExit("Missing value for -rf");
- }
-
- sourceFolders.add(new File(args[index++]));
- } else if ("-rj". equals(argument)) {
- // quick check on the next argument.
- if (index == args.length) {
- printAndExit("Missing value for -rj");
- }
-
- jarFiles.add(new File(args[index++]));
- } else if ("-nf".equals(argument)) {
- // quick check on the next argument.
- if (index == args.length) {
- printAndExit("Missing value for -nf");
- }
-
- nativeFolders.add(new File(args[index++]));
- } else if ("-storetype".equals(argument)) {
- // quick check on the next argument.
- if (index == args.length) {
- printAndExit("Missing value for -storetype");
- }
-
- // FIXME
- } else {
- printAndExit("Unknown argument: " + argument);
- }
- } while (index < args.length);
-
- if (zipArchives.size() == 0) {
- printAndExit("No zip archive, there must be one for the resources");
- }
-
- // create the builder with the basic files.
- ApkBuilder builder = new ApkBuilder(outApk, zipArchives.get(0), dexFile,
- signed ? ApkBuilder.getDebugKeystore() : null,
- verbose ? System.out : null);
- builder.setDebugMode(debug);
-
- // add the rest of the files.
- // first zip Archive was used in the constructor.
- for (int i = 1 ; i < zipArchives.size() ; i++) {
- builder.addZipFile(zipArchives.get(i));
- }
-
- for (File sourceFolder : sourceFolders) {
- builder.addSourceFolder(sourceFolder);
- }
-
- for (File jarFile : jarFiles) {
- if (jarFile.isDirectory()) {
- String[] filenames = jarFile.list(new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return PATTERN_JAR_EXT.matcher(name).matches();
- }
- });
-
- for (String filename : filenames) {
- builder.addResourcesFromJar(new File(jarFile, filename));
- }
- } else {
- builder.addResourcesFromJar(jarFile);
- }
- }
-
- for (File nativeFolder : nativeFolders) {
- builder.addNativeLibraries(nativeFolder);
- }
-
- // seal the apk
- builder.sealApk();
-
-
- } catch (ApkCreationException e) {
- printAndExit(e.getMessage());
- } catch (DuplicateFileException e) {
- printAndExit(String.format(
- "Found duplicate file for APK: %1$s\nOrigin 1: %2$s\nOrigin 2: %3$s",
- e.getArchivePath(), e.getFile1(), e.getFile2()));
- } catch (SealedApkException e) {
- printAndExit(e.getMessage());
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- private static void printUsageAndQuit() {
- // 80 cols marker: 01234567890123456789012345678901234567890123456789012345678901234567890123456789
- System.err.println("\n\n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
- System.err.println("THIS TOOL IS DEPRECATED and may stop working at any time!\n");
- System.err.println("If you wish to use apkbuilder for a custom build system, please look at the");
- System.err.println("com.android.sdklib.build.ApkBuilder which provides support for");
- System.err.println("recent build improvements including library projects.");
- System.err.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n\n");
- System.err.println("A command line tool to package an Android application from various sources.");
- System.err.println("Usage: apkbuilder <out archive> [-v][-u][-storetype STORE_TYPE] [-z inputzip]");
- System.err.println(" [-f inputfile] [-rf input-folder] [-rj -input-path]");
- System.err.println("");
- System.err.println(" -v Verbose.");
- System.err.println(" -d Debug Mode: Includes debug files in the APK file.");
- System.err.println(" -u Creates an unsigned package.");
- System.err.println(" -storetype Forces the KeyStore type. If ommited the default is used.");
- System.err.println("");
- System.err.println(" -z Followed by the path to a zip archive.");
- System.err.println(" Adds the content of the application package.");
- System.err.println("");
- System.err.println(" -f Followed by the path to a file.");
- System.err.println(" Adds the file to the application package.");
- System.err.println("");
- System.err.println(" -rf Followed by the path to a source folder.");
- System.err.println(" Adds the java resources found in that folder to the application");
- System.err.println(" package, while keeping their path relative to the source folder.");
- System.err.println("");
- System.err.println(" -rj Followed by the path to a jar file or a folder containing");
- System.err.println(" jar files.");
- System.err.println(" Adds the java resources found in the jar file(s) to the application");
- System.err.println(" package.");
- System.err.println("");
- System.err.println(" -nf Followed by the root folder containing native libraries to");
- System.err.println(" include in the application package.");
-
- System.exit(1);
- }
-
- private static void printAndExit(String... messages) {
- for (String message : messages) {
- System.err.println(message);
- }
- System.exit(1);
- }
-
- private ApkBuilderMain() {
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/build/ApkCreationException.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/build/ApkCreationException.java
deleted file mode 100644
index 2379915..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/build/ApkCreationException.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.build;
-
-/**
- * An exception thrown during packaging of an APK file.
- */
-public final class ApkCreationException extends Exception {
- private static final long serialVersionUID = 1L;
-
- public ApkCreationException(String format, Object... args) {
- super(String.format(format, args));
- }
-
- public ApkCreationException(Throwable cause, String format, Object... args) {
- super(String.format(format, args), cause);
- }
-
- public ApkCreationException(Throwable cause) {
- super(cause);
- }
-}
\ No newline at end of file
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/build/DuplicateFileException.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/build/DuplicateFileException.java
deleted file mode 100644
index ba53ba3..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/build/DuplicateFileException.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.build;
-
-import com.android.sdklib.internal.build.SignedJarBuilder.IZipEntryFilter.ZipAbortException;
-
-import java.io.File;
-
-/**
- * An exception thrown during packaging of an APK file.
- */
-public final class DuplicateFileException extends ZipAbortException {
- private static final long serialVersionUID = 1L;
- private final String mArchivePath;
- private final File mFile1;
- private final File mFile2;
-
- public DuplicateFileException(String archivePath, File file1, File file2) {
- super();
- mArchivePath = archivePath;
- mFile1 = file1;
- mFile2 = file2;
- }
-
- public String getArchivePath() {
- return mArchivePath;
- }
-
- public File getFile1() {
- return mFile1;
- }
-
- public File getFile2() {
- return mFile2;
- }
-
- @Override
- public String getMessage() {
- return "Duplicate files at the same path inside the APK";
- }
-}
\ No newline at end of file
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/build/IArchiveBuilder.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/build/IArchiveBuilder.java
deleted file mode 100644
index e2230e9..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/build/IArchiveBuilder.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.build;
-
-import java.io.File;
-
-public interface IArchiveBuilder {
-
- /**
- * Adds a file to the archive at a given path
- * @param file the file to add
- * @param archivePath the path of the file inside the APK archive.
- * @throws ApkCreationException if an error occurred
- * @throws SealedApkException if the APK is already sealed.
- * @throws DuplicateFileException if a file conflicts with another already added to the APK
- * at the same location inside the APK archive.
- */
- void addFile(File file, String archivePath) throws ApkCreationException,
- SealedApkException, DuplicateFileException;
-
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/build/JarListSanitizer.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/build/JarListSanitizer.java
deleted file mode 100644
index 4d1dcdb..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/build/JarListSanitizer.java
+++ /dev/null
@@ -1,479 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.build;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.io.PrintStream;
-import java.io.UnsupportedEncodingException;
-import java.security.MessageDigest;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Formatter;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * A Class to handle a list of jar files, finding and removing duplicates.
- *
- * Right now duplicates are based on:
- * - same filename
- * - same length
- * - same content: using sha1 comparison.
- *
- * The length/sha1 are kept in a cache and only updated if the library is changed.
- */
-public class JarListSanitizer {
-
- private static final byte[] sBuffer = new byte[4096];
- private static final String CACHE_FILENAME = "jarlist.cache";
- private static final Pattern READ_PATTERN = Pattern.compile("^(\\d+) (\\d+) ([0-9a-f]+) (.+)$");
-
- /**
- * Simple class holding the data regarding a jar dependency.
- *
- */
- private static final class JarEntity {
- private final File mFile;
- private final long mLastModified;
- private long mLength;
- private String mSha1;
-
- /**
- * Creates an entity from cached data.
- * @param path the file path
- * @param lastModified when it was last modified
- * @param length its length
- * @param sha1 its sha1
- */
- private JarEntity(String path, long lastModified, long length, String sha1) {
- mFile = new File(path);
- mLastModified = lastModified;
- mLength = length;
- mSha1 = sha1;
- }
-
- /**
- * Creates an entity from a {@link File}.
- * @param file the file.
- */
- private JarEntity(File file) {
- mFile = file;
- mLastModified = file.lastModified();
- mLength = file.length();
- }
-
- /**
- * Checks whether the {@link File#lastModified()} matches the cached value. If not, length
- * is updated and the sha1 is reset (but not recomputed, this is done on demand).
- * @return return whether the file was changed.
- */
- private boolean checkValidity() {
- if (mLastModified != mFile.lastModified()) {
- mLength = mFile.length();
- mSha1 = null;
- return true;
- }
-
- return false;
- }
-
- private File getFile() {
- return mFile;
- }
-
- private long getLastModified() {
- return mLastModified;
- }
-
- private long getLength() {
- return mLength;
- }
-
- /**
- * Returns the file's sha1, computing it if necessary.
- * @return the sha1
- * @throws Sha1Exception
- */
- private String getSha1() throws Sha1Exception {
- if (mSha1 == null) {
- mSha1 = JarListSanitizer.getSha1(mFile);
- }
- return mSha1;
- }
-
- private boolean hasSha1() {
- return mSha1 != null;
- }
- }
-
- /**
- * Exception used to indicate the sanitized list of jar dependency cannot be computed due
- * to inconsistency in duplicate jar files.
- */
- public static final class DifferentLibException extends Exception {
- private static final long serialVersionUID = 1L;
- private final String[] mDetails;
-
- public DifferentLibException(String message, String[] details) {
- super(message);
- mDetails = details;
- }
-
- public String[] getDetails() {
- return mDetails;
- }
- }
-
- /**
- * Exception to indicate a failure to check a jar file's content.
- */
- public static final class Sha1Exception extends Exception {
- private static final long serialVersionUID = 1L;
- private final File mJarFile;
-
- public Sha1Exception(File jarFile, Throwable cause) {
- super(cause);
- mJarFile = jarFile;
- }
-
- public File getJarFile() {
- return mJarFile;
- }
- }
-
- private final File mOut;
- private final PrintStream mOutStream;
-
- /**
- * Creates a sanitizer.
- * @param out the project output where the cache is to be stored.
- */
- public JarListSanitizer(File out) {
- mOut = out;
- mOutStream = System.out;
- }
-
- public JarListSanitizer(File out, PrintStream outStream) {
- mOut = out;
- mOutStream = outStream;
- }
-
- /**
- * Sanitize a given list of files
- * @param files the list to sanitize
- * @return a new list containing no duplicates.
- * @throws DifferentLibException
- * @throws Sha1Exception
- */
- public List<File> sanitize(Collection<File> files) throws DifferentLibException, Sha1Exception {
- List<File> results = new ArrayList<File>();
-
- // get the cache list.
- Map<String, JarEntity> jarList = getCachedJarList();
-
- boolean updateJarList = false;
-
- // clean it up of removed files.
- // use results as a temp storage to store the files to remove as we go through the map.
- for (JarEntity entity : jarList.values()) {
- if (entity.getFile().exists() == false) {
- results.add(entity.getFile());
- }
- }
-
- // the actual clean up.
- if (results.size() > 0) {
- for (File f : results) {
- jarList.remove(f.getAbsolutePath());
- }
-
- results.clear();
- updateJarList = true;
- }
-
- Map<String, List<JarEntity>> nameMap = new HashMap<String, List<JarEntity>>();
-
- // update the current jar list if needed, while building a 2ndary map based on
- // filename only.
- for (File file : files) {
- String path = file.getAbsolutePath();
- JarEntity entity = jarList.get(path);
-
- if (entity == null) {
- entity = new JarEntity(file);
- jarList.put(path, entity);
- updateJarList = true;
- } else {
- updateJarList |= entity.checkValidity();
- }
-
- String filename = file.getName();
- List<JarEntity> nameList = nameMap.get(filename);
- if (nameList == null) {
- nameList = new ArrayList<JarEntity>();
- nameMap.put(filename, nameList);
- }
- nameList.add(entity);
- }
-
- try {
- // now look for dups. Each name list can have more than one file but they must
- // have the same size/sha1
- for (Entry<String, List<JarEntity>> entry : nameMap.entrySet()) {
- List<JarEntity> list = entry.getValue();
- checkEntities(entry.getKey(), list);
-
- // if we are here, there's no issue. Add the first of the list to the results.
- results.add(list.get(0).getFile());
- }
-
- // special case for android-support-v4/13
- checkSupportLibs(nameMap, results);
- } finally {
- if (updateJarList) {
- writeJarList(nameMap);
- }
- }
-
- return results;
- }
-
- /**
- * Checks whether a given list of duplicates can be replaced by a single one.
- * @param filename the filename of the files
- * @param list the list of dup files
- * @throws DifferentLibException
- * @throws Sha1Exception
- */
- private void checkEntities(String filename, List<JarEntity> list)
- throws DifferentLibException, Sha1Exception {
- if (list.size() == 1) {
- return;
- }
-
- JarEntity baseEntity = list.get(0);
- long baseLength = baseEntity.getLength();
- String baseSha1 = baseEntity.getSha1();
-
- final int count = list.size();
- for (int i = 1; i < count ; i++) {
- JarEntity entity = list.get(i);
- if (entity.getLength() != baseLength || entity.getSha1().equals(baseSha1) == false) {
- throw new DifferentLibException("Jar mismatch! Fix your dependencies",
- getEntityDetails(filename, list));
- }
-
- }
- }
-
- /**
- * Checks for present of both support libraries in v4 and v13. If both are detected,
- * v4 is removed from <var>results</var>
- * @param nameMap the list of jar as a map of (filename, list of files).
- * @param results the current list of jar file set to be used. it's already been cleaned of
- * duplicates.
- */
- private void checkSupportLibs(Map<String, List<JarEntity>> nameMap, List<File> results) {
- List<JarEntity> v4 = nameMap.get("android-support-v4.jar");
- List<JarEntity> v13 = nameMap.get("android-support-v13.jar");
-
- if (v13 != null && v4 != null) {
- mOutStream.println("WARNING: Found both android-support-v4 and android-support-v13 in the dependency list.");
- mOutStream.println("Because v13 includes v4, using only v13.");
- results.remove(v4.get(0).getFile());
- }
- }
-
- private Map<String, JarEntity> getCachedJarList() {
- Map<String, JarEntity> cache = new HashMap<String, JarListSanitizer.JarEntity>();
-
- File cacheFile = new File(mOut, CACHE_FILENAME);
- if (cacheFile.exists() == false) {
- return cache;
- }
-
- BufferedReader reader = null;
- try {
- reader = new BufferedReader(new InputStreamReader(new FileInputStream(cacheFile),
- "UTF-8"));
-
- String line = null;
- while ((line = reader.readLine()) != null) {
- // skip comments
- if (line.charAt(0) == '#') {
- continue;
- }
-
- // get the data with a regexp
- Matcher m = READ_PATTERN.matcher(line);
- if (m.matches()) {
- String path = m.group(4);
-
- JarEntity entity = new JarEntity(
- path,
- Long.parseLong(m.group(1)),
- Long.parseLong(m.group(2)),
- m.group(3));
-
- cache.put(path, entity);
- }
- }
-
- } catch (FileNotFoundException e) {
- // won't happen, we check up front.
- } catch (UnsupportedEncodingException e) {
- // shouldn't happen, but if it does, we just won't have a cache.
- } catch (IOException e) {
- // shouldn't happen, but if it does, we just won't have a cache.
- } finally {
- if (reader != null) {
- try {
- reader.close();
- } catch (IOException e) {
- }
- }
- }
-
- return cache;
- }
-
- private void writeJarList(Map<String, List<JarEntity>> nameMap) {
- File cacheFile = new File(mOut, CACHE_FILENAME);
- OutputStreamWriter writer = null;
- try {
- writer = new OutputStreamWriter(
- new FileOutputStream(cacheFile), "UTF-8");
-
- writer.write("# cache for current jar dependecy. DO NOT EDIT.\n");
- writer.write("# format is <lastModified> <length> <SHA-1> <path>\n");
- writer.write("# Encoding is UTF-8\n");
-
- for (List<JarEntity> list : nameMap.values()) {
- // clean up the list of files that don't have a sha1.
- for (int i = 0 ; i < list.size() ; ) {
- JarEntity entity = list.get(i);
- if (entity.hasSha1()) {
- i++;
- } else {
- list.remove(i);
- }
- }
-
- if (list.size() > 1) {
- for (JarEntity entity : list) {
- writer.write(String.format("%d %d %s %s\n",
- entity.getLastModified(),
- entity.getLength(),
- entity.getSha1(),
- entity.getFile().getAbsolutePath()));
- }
- }
- }
- } catch (IOException e) {
- mOutStream.println("WARNING: unable to write jarlist cache file " +
- cacheFile.getAbsolutePath());
- } catch (Sha1Exception e) {
- // shouldn't happen here since we check that the sha1 is present first, meaning it's
- // already been computing.
- } finally {
- if (writer != null) {
- try {
- writer.close();
- } catch (IOException e) {
- }
- }
- }
- }
-
- private String[] getEntityDetails(String filename, List<JarEntity> list) throws Sha1Exception {
- ArrayList<String> result = new ArrayList<String>();
- result.add(
- String.format("Found %d versions of %s in the dependency list,",
- list.size(), filename));
- result.add("but not all the versions are identical (check is based on SHA-1 only at this time).");
- result.add("All versions of the libraries must be the same at this time.");
- result.add("Versions found are:");
- for (JarEntity entity : list) {
- result.add("Path: " + entity.getFile().getAbsolutePath());
- result.add("\tLength: " + entity.getLength());
- result.add("\tSHA-1: " + entity.getSha1());
- }
-
- return result.toArray(new String[result.size()]);
- }
-
- /**
- * Computes the sha1 of a file and returns it.
- * @param f the file to compute the sha1 for.
- * @return the sha1 value
- * @throws Sha1Exception if the sha1 value cannot be computed.
- */
- private static String getSha1(File f) throws Sha1Exception {
- synchronized (sBuffer) {
- FileInputStream fis = null;
- try {
- MessageDigest md = MessageDigest.getInstance("SHA-1");
-
- fis = new FileInputStream(f);
- while (true) {
- int length = fis.read(sBuffer);
- if (length > 0) {
- md.update(sBuffer, 0, length);
- } else {
- break;
- }
- }
-
- return byteArray2Hex(md.digest());
-
- } catch (Exception e) {
- throw new Sha1Exception(f, e);
- } finally {
- if (fis != null) {
- try {
- fis.close();
- } catch (IOException e) {
- // ignore
- }
- }
- }
- }
- }
-
- private static String byteArray2Hex(final byte[] hash) {
- Formatter formatter = new Formatter();
- try {
- for (byte b : hash) {
- formatter.format("%02x", b);
- }
- return formatter.toString();
- } finally {
- formatter.close();
- }
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/build/SealedApkException.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/build/SealedApkException.java
deleted file mode 100644
index 97f03bd..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/build/SealedApkException.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.build;
-
-/**
- * An exception thrown when trying to add files to a sealed APK.
- */
-public final class SealedApkException extends Exception {
- private static final long serialVersionUID = 1L;
-
- public SealedApkException(String format, Object... args) {
- super(String.format(format, args));
- }
-
- public SealedApkException(Throwable cause, String format, Object... args) {
- super(String.format(format, args), cause);
- }
-
- public SealedApkException(Throwable cause) {
- super(cause);
- }
-}
\ No newline at end of file
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Abi.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Abi.java
deleted file mode 100644
index 080ae75..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Abi.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.devices;
-
-import com.android.SdkConstants;
-
-public enum Abi {
- ARMEABI(SdkConstants.ABI_ARMEABI),
- ARMEABI_V7A(SdkConstants.ABI_ARMEABI_V7A),
- X86(SdkConstants.ABI_INTEL_ATOM),
- MIPS(SdkConstants.ABI_MIPS);
-
- private final String mValue;
-
- private Abi(String value) {
- mValue = value;
- }
-
- public static Abi getEnum(String value) {
- for (Abi a : values()) {
- if (a.mValue.equals(value)) {
- return a;
- }
- }
- return null;
- }
-
- @Override
- public String toString() {
- return mValue;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/BluetoothProfile.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/BluetoothProfile.java
deleted file mode 100644
index 536dcd8..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/BluetoothProfile.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.devices;
-
-public enum BluetoothProfile {
- A2DP("A2DP"),
- ATT("ATT"),
- AVRCP("AVRCP"),
- AVDTP("AVDTP"),
- BIP("BIP"),
- BPP("BPP"),
- CIP("CIP"),
- CTP("CTP"),
- DIP("DIP"),
- DUN("DUN"),
- FAX("FAX"),
- FTP("FTP"),
- GAVDP("GAVDP"),
- GAP("GAP"),
- GATT("GATT"),
- GOEP("GOEP"),
- HCRP("HCRP"),
- HDP("HDP"),
- HFP("HFP"),
- HID("HID"),
- HSP("HSP"),
- ICP("ICP"),
- LAP("LAP"),
- MAP("MAP"),
- OPP("OPP"),
- PAN("PAN"),
- PBA("PBA"),
- PBAP("PBAP"),
- SPP("SPP"),
- SDAP("SDAP"),
- SAP("SAP"),
- SIM("SIM"),
- rSAP("rSAP"),
- SYNCH("SYNCH"),
- VDP("VDP"),
- WAPB("WAPB");
-
-
- private final String mValue;
-
- private BluetoothProfile(String value) {
- mValue = value;
- }
-
- public static BluetoothProfile getEnum(String value) {
- for (BluetoothProfile bp : values()) {
- if (bp.mValue.equals(value)) {
- return bp;
- }
- }
- return null;
- }
-
- @Override
- public String toString() {
- return mValue;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/ButtonType.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/ButtonType.java
deleted file mode 100644
index 6776849..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/ButtonType.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.devices;
-
-public enum ButtonType {
- HARD("hard", "Hardware"),
- SOFT("soft", "Software");
-
- private final String mId;
- private final String mDescription;
-
- /**
- * Construct a {@link ButtonType}.
- *
- * @param id identifier for this button type. Persisted on disk when a user creates a device.
- * @param desc User friendly description
- */
- private ButtonType(String id, String desc) {
- mId = id;
- mDescription = desc;
- }
-
- public static ButtonType getEnum(String value) {
- for (ButtonType n : values()) {
- if (n.mId.equals(value)) {
- return n;
- }
- }
- return null;
- }
-
- @Override
- public String toString() {
- return mId;
- }
-
- public String getDescription() {
- return mDescription;
- }
-
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Camera.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Camera.java
deleted file mode 100644
index d7d33fe..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Camera.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.devices;
-
-public class Camera {
- private CameraLocation mLocation;
- private boolean mAutofocus;
- private boolean mFlash;
-
- /**
- * Creates a {@link Camera} with reasonable defaults.
- *
- * The resulting {@link Camera} with be on the {@link CameraLocation#BACK} with both autofocus
- * and flash.
- */
- public Camera() {
- this(CameraLocation.BACK, true, true);
- }
-
- /**
- * Creates a new {@link Camera} which describes an on device camera and it's features.
- * @param location The location of the {@link Camera} on the device. Either
- * {@link CameraLocation#FRONT} or {@link CameraLocation#BACK}.
- * @param autofocus Whether the {@link Camera} can auto-focus.
- * @param flash Whether the {@link Camera} has flash.
- */
- public Camera(CameraLocation location, boolean autofocus, boolean flash) {
- mLocation = location;
- mAutofocus = autofocus;
- mFlash = flash;
- }
-
- public CameraLocation getLocation() {
- return mLocation;
- }
-
- public void setLocation(CameraLocation cl) {
- mLocation = cl;
- }
-
- public boolean hasAutofocus() {
- return mAutofocus;
- }
-
- public void setAutofocus(boolean hasAutofocus) {
- mAutofocus = hasAutofocus;
- }
-
- public boolean hasFlash() {
- return mFlash;
- }
-
- public void setFlash(boolean flash) {
- mFlash = flash;
- }
-
- /**
- * Returns a copy of the object that shares no state with it,
- * but is initialized to equivalent values.
- *
- * @return A copy of the object.
- */
- public Camera deepCopy() {
- Camera c = new Camera();
- c.mLocation = mLocation;
- c.mAutofocus = mAutofocus;
- c.mFlash = mFlash;
- return c;
- }
-
- @Override
- public boolean equals(Object o) {
- if (o == this) {
- return true;
- }
- if (!(o instanceof Camera)) {
- return false;
- }
- Camera c = (Camera) o;
- return mLocation == c.mLocation
- && mAutofocus == c.hasAutofocus()
- && mFlash == c.hasFlash();
- }
-
- @Override
- public int hashCode() {
- int hash = 17;
- hash = 31 * hash + mLocation.ordinal();
- hash = 31 * hash + (mAutofocus ? 1 : 0);
- hash = 31 * hash + (mFlash ? 1 : 0);
- return hash;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/CameraLocation.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/CameraLocation.java
deleted file mode 100644
index 9a8554d..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/CameraLocation.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.devices;
-
-public enum CameraLocation {
- FRONT("front"),
- BACK("back");
-
- private final String mValue;
-
- private CameraLocation(String value) {
- mValue = value;
- }
-
- public static CameraLocation getEnum(String value) {
- for (CameraLocation l : values()) {
- if (l.mValue.equals(value)) {
- return l;
- }
- }
- return null;
- }
-
- @Override
- public String toString() {
- return mValue;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Device.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Device.java
deleted file mode 100644
index 762597e..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Device.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.devices;
-
-import com.android.dvlib.DeviceSchema;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Instances of this class contain the specifications for a device. Use the
- * {@link Builder} class to construct a Device object, or the
- * {@link DeviceParser} if constructing device objects from XML conforming to
- * the {@link DeviceSchema} standards.
- */
-public final class Device {
- /** Name of the device */
- private final String mName;
- /** Manufacturer of the device */
- private final String mManufacturer;
- /** A list of software capabilities, one for each API level range */
- private final List<Software> mSoftware;
- /** A list of phone states (landscape, portrait with keyboard out, etc.) */
- private final List<State> mState;
- /** Meta information such as icon files and device frames */
- private final Meta mMeta;
- /** Default state of the device */
- private final State mDefaultState;
-
- /**
- * Returns the name of the {@link Device}.
- *
- * @return The name of the {@link Device}.
- */
- public String getName() {
- return mName;
- }
-
- /**
- * Returns the manufacturer of the {@link Device}.
- *
- * @return The name of the manufacturer of the {@link Device}.
- */
- public String getManufacturer() {
- return mManufacturer;
- }
-
- /**
- * Returns all of the {@link Software} configurations of the {@link Device}.
- *
- * @return A list of all the {@link Software} configurations.
- */
- public List<Software> getAllSoftware() {
- return mSoftware;
- }
-
- /**
- * Returns all of the {@link State}s the {@link Device} can be in.
- *
- * @return A list of all the {@link State}s.
- */
- public List<State> getAllStates() {
- return mState;
- }
-
- /**
- * Returns the default {@link Hardware} configuration for the device. This
- * is really just a shortcut for getting the {@link Hardware} on the default
- * {@link State}
- *
- * @return The default {@link Hardware} for the device.
- */
- public Hardware getDefaultHardware() {
- return mDefaultState.getHardware();
- }
-
- /**
- * Returns the {@link Meta} object for the device, which contains meta
- * information about the device, such as the location of icons.
- *
- * @return The {@link Meta} object for the {@link Device}.
- */
- public Meta getMeta() {
- return mMeta;
- }
-
- /**
- * Returns the default {@link State} of the {@link Device}.
- *
- * @return The default {@link State} of the {@link Device}.
- */
- public State getDefaultState() {
- return mDefaultState;
- }
-
- /**
- * Returns the software configuration for the given API version.
- *
- * @param apiVersion
- * The API version requested.
- * @return The Software instance for the requested API version or null if
- * the API version is unsupported for this device.
- */
- public Software getSoftware(int apiVersion) {
- for (Software s : mSoftware) {
- if (apiVersion >= s.getMinSdkLevel() && apiVersion <= s.getMaxSdkLevel()) {
- return s;
- }
- }
- return null;
- }
-
- /**
- * Returns the state of the device with the given name.
- *
- * @param name
- * The name of the state requested.
- * @return The State object requested or null if there's no state with the
- * given name.
- */
- public State getState(String name) {
- for (State s : getAllStates()) {
- if (s.getName().equals(name)) {
- return s;
- }
- }
- return null;
- }
-
- public static class Builder {
- private String mName;
- private String mManufacturer;
- private final List<Software> mSoftware = new ArrayList<Software>();
- private final List<State> mState = new ArrayList<State>();
- private Meta mMeta;
- private State mDefaultState;
-
- public Builder() { }
-
- public Builder(Device d) {
- mName = d.getName();
- mManufacturer = d.getManufacturer();
- for (Software s : d.getAllSoftware()) {
- mSoftware.add(s.deepCopy());
- }
- for (State s : d.getAllStates()) {
- mState.add(s.deepCopy());
- }
- mSoftware.addAll(d.getAllSoftware());
- mState.addAll(d.getAllStates());
- mMeta = d.getMeta();
- mDefaultState = d.getDefaultState();
- }
-
- public void setName(String name) {
- mName = name;
- }
-
- public void setManufacturer(String manufacturer) {
- mManufacturer = manufacturer;
- }
-
- public void addSoftware(Software sw) {
- mSoftware.add(sw);
- }
-
- public void addAllSoftware(Collection<? extends Software> sw) {
- mSoftware.addAll(sw);
- }
-
- public void addState(State state) {
- mState.add(state);
- }
-
- public void addAllState(Collection<? extends State> states) {
- mState.addAll(states);
- }
-
- /**
- * Removes the first {@link State} with the given name
- * @param stateName The name of the {@link State} to remove.
- * @return Whether a {@link State} was removed or not.
- */
- public boolean removeState(String stateName) {
- for (int i = 0; i < mState.size(); i++) {
- if (stateName != null && stateName.equals(mState.get(i).getName())) {
- mState.remove(i);
- return true;
- }
- }
- return false;
- }
-
- public void setMeta(Meta meta) {
- mMeta = meta;
- }
-
- public Device build() {
- if (mSoftware.size() <= 0) {
- throw generateBuildException("Device software not configured");
- } else if (mState.size() <= 0) {
- throw generateBuildException("Device states not configured");
- }
-
- if (mMeta == null) {
- mMeta = new Meta();
- }
- for (State s : mState) {
- if (s.isDefaultState()) {
- mDefaultState = s;
- break;
- }
- }
- return new Device(this);
- }
-
- private IllegalStateException generateBuildException(String err) {
- String device = "";
- if (mManufacturer != null) {
- device = mManufacturer + " ";
- }
- if (mName != null) {
- device += mName;
- } else {
- device = "Unknown " + device +"Device";
- }
-
- return new IllegalStateException("Error building " + device + ": " +err);
- }
- }
-
- protected Device(Builder b) {
- mName = b.mName;
- mManufacturer = b.mManufacturer;
- mSoftware = Collections.unmodifiableList(b.mSoftware);
- mState = Collections.unmodifiableList(b.mState);
- mMeta = b.mMeta;
- mDefaultState = b.mDefaultState;
- }
-
- @Override
- public boolean equals(Object o) {
- if (o == this) {
- return true;
- }
- if (!(o instanceof Device)) {
- return false;
- }
- Device d = (Device) o;
- return mName.equals(d.getName())
- && mManufacturer.equals(d.getManufacturer())
- && mSoftware.equals(d.getAllSoftware())
- && mState.equals(d.getAllStates())
- && mMeta.equals(d.getMeta())
- && mDefaultState.equals(d.getDefaultState());
- }
-
- @Override
- /** A hash that's stable across JVM instances */
- public int hashCode() {
- int hash = 17;
- if (mName != null) {
- hash = 31 * hash + mName.hashCode();
- }
- if (mManufacturer != null) {
- hash = 31 * hash + mManufacturer.hashCode();
- }
- hash = 31 * hash + mSoftware.hashCode();
- hash = 31 * hash + mState.hashCode();
- hash = 31 * hash + mMeta.hashCode();
- hash = 31 * hash + mDefaultState.hashCode();
- return hash;
- }
-
- @Override
- public String toString() {
- return mName;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/DeviceManager.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/DeviceManager.java
deleted file mode 100644
index c17a4df..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/DeviceManager.java
+++ /dev/null
@@ -1,548 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.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;
-import com.android.resources.Keyboard;
-import com.android.resources.KeyboardState;
-import com.android.resources.Navigation;
-import com.android.sdklib.internal.avd.AvdManager;
-import com.android.sdklib.internal.avd.HardwareProperties;
-import com.android.sdklib.repository.PkgProps;
-import com.android.utils.ILogger;
-
-import org.xml.sax.SAXException;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactoryConfigurationError;
-
-/**
- * Manager class for interacting with {@link Device}s within the SDK
- */
-public class DeviceManager {
-
- 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;
- private List<Device> mVendorDevices;
- 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 {
- /**
- * The device exists unchanged from the given configuration
- */
- EXISTS,
- /**
- * A device exists with the given name and manufacturer, but has a different configuration
- */
- CHANGED,
- /**
- * There is no device with the given name and manufacturer
- */
- MISSING;
- }
-
- /**
- * 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;
- }
-
- /**
- * Interface implemented by objects which want to know when changes occur to the {@link Device}
- * lists.
- */
- public static interface DevicesChangedListener {
- /**
- * Called after one of the {@link Device} lists has been updated.
- */
- public void onDevicesChanged();
- }
-
- /**
- * Register a listener to be notified when the device lists are modified.
- *
- * @param listener The listener to add. Ignored if already registered.
- */
- public void registerListener(DevicesChangedListener listener) {
- if (listener != null) {
- synchronized (sListeners) {
- if (!sListeners.contains(listener)) {
- sListeners.add(listener);
- }
- }
- }
- }
-
- /**
- * Removes a listener from the notification list such that it will no longer receive
- * notifications when modifications to the {@link Device} list occur.
- *
- * @param listener The listener to remove.
- */
- public boolean unregisterListener(DevicesChangedListener listener) {
- synchronized (sListeners) {
- return sListeners.remove(listener);
- }
- }
-
- public DeviceStatus getDeviceStatus(String name, String manufacturer, int hashCode) {
- Device d = getDevice(name, manufacturer);
- if (d == null) {
- return DeviceStatus.MISSING;
- } else {
- return d.hashCode() == hashCode ? DeviceStatus.EXISTS : DeviceStatus.CHANGED;
- }
- }
-
- 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 the known {@link Device} list.
- *
- * @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(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();
- }
- }
-
- /**
- * Initializes the {@link Device}s packaged with the SDK.
- * @return True if the list has changed.
- */
- 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
- mLog.error(e, null);
- mDefaultDevices = new ArrayList<Device>();
- } catch (Exception e) {
- mLog.error(null, "Error reading default devices");
- mDefaultDevices = new ArrayList<Device>();
- }
- }
- }
- return false;
- }
-
- /**
- * Initializes all vendor-provided {@link Device}s.
- * @return True if the list has changed.
- */
- 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(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;
- }
- }
- }
- return false;
- }
-
- /**
- * Initializes all user-created {@link Device}s
- * @return True if the list has changed.
- */
- 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(),
- SdkConstants.FN_DEVICES_XML);
- if (userDevicesFile.exists()) {
- mUserDevices.addAll(DeviceParser.parse(userDevicesFile));
- return true;
- }
- } catch (AndroidLocationException e) {
- mLog.warning("Couldn't load user devices: %1$s", e.getMessage());
- } catch (SAXException e) {
- // Probably an old config file which we don't want to overwrite.
- if (userDevicesFile != null) {
- String base = userDevicesFile.getAbsoluteFile() + ".old";
- File renamedConfig = new File(base);
- int i = 0;
- while (renamedConfig.exists()) {
- renamedConfig = new File(base + '.' + (i++));
- }
- mLog.error(null, "Error parsing %1$s, backing up to %2$s",
- userDevicesFile.getAbsolutePath(),
- renamedConfig.getAbsolutePath());
- userDevicesFile.renameTo(renamedConfig);
- }
- } catch (ParserConfigurationException e) {
- mLog.error(null, "Error parsing %1$s",
- userDevicesFile == null ? "(null)" : userDevicesFile.getAbsolutePath());
- } catch (IOException e) {
- mLog.error(null, "Error parsing %1$s",
- userDevicesFile == null ? "(null)" : userDevicesFile.getAbsolutePath());
- }
- }
- }
- return false;
- }
-
- public void addUserDevice(Device d) {
- boolean changed = false;
- synchronized (mLock) {
- if (mUserDevices == null) {
- initUserDevices();
- assert mUserDevices != null;
- }
- if (mUserDevices != null) {
- mUserDevices.add(d);
- }
- changed = true;
- }
- if (changed) {
- notifyListeners();
- }
- }
-
- public void removeUserDevice(Device d) {
- synchronized (mLock) {
- if (mUserDevices == null) {
- initUserDevices();
- assert mUserDevices != null;
- }
- 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 (mLock) {
- if (mUserDevices == null) {
- initUserDevices();
- }
- removeUserDevice(d);
- addUserDevice(d);
- }
- }
-
- /**
- * Saves out the user devices to {@link SdkConstants#FN_DEVICES_XML} in
- * {@link AndroidLocation#getFolder()}.
- */
- public void saveUserDevices() {
- if (mUserDevices == null) {
- return;
- }
-
- File userDevicesFile = null;
- try {
- userDevicesFile = new File(AndroidLocation.getFolder(),
- SdkConstants.FN_DEVICES_XML);
- } catch (AndroidLocationException e) {
- mLog.warning("Couldn't find user directory: %1$s", e.getMessage());
- return;
- }
-
- if (mUserDevices.size() == 0) {
- userDevicesFile.delete();
- return;
- }
-
- synchronized (mLock) {
- if (mUserDevices.size() > 0) {
- try {
- DeviceWriter.writeToXml(new FileOutputStream(userDevicesFile), mUserDevices);
- } catch (FileNotFoundException e) {
- mLog.warning("Couldn't open file: %1$s", e.getMessage());
- } catch (ParserConfigurationException e) {
- mLog.warning("Error writing file: %1$s", e.getMessage());
- } catch (TransformerFactoryConfigurationError e) {
- mLog.warning("Error writing file: %1$s", e.getMessage());
- } catch (TransformerException e) {
- mLog.warning("Error writing file: %1$s", e.getMessage());
- }
- }
- }
- }
-
- /**
- * Returns hardware properties (defined in hardware.ini) as a {@link Map}.
- *
- * @param s The {@link State} from which to derive the hardware properties.
- * @return A {@link Map} of hardware properties.
- */
- public static Map<String, String> getHardwareProperties(State s) {
- Hardware hw = s.getHardware();
- Map<String, String> props = new HashMap<String, String>();
- props.put(HardwareProperties.HW_MAINKEYS,
- getBooleanVal(hw.getButtonType().equals(ButtonType.HARD)));
- props.put(HardwareProperties.HW_TRACKBALL,
- getBooleanVal(hw.getNav().equals(Navigation.TRACKBALL)));
- props.put(HardwareProperties.HW_KEYBOARD,
- getBooleanVal(hw.getKeyboard().equals(Keyboard.QWERTY)));
- props.put(HardwareProperties.HW_DPAD,
- getBooleanVal(hw.getNav().equals(Navigation.DPAD)));
-
- Set<Sensor> sensors = hw.getSensors();
- props.put(HardwareProperties.HW_GPS, getBooleanVal(sensors.contains(Sensor.GPS)));
- props.put(HardwareProperties.HW_BATTERY,
- getBooleanVal(hw.getChargeType().equals(PowerType.BATTERY)));
- props.put(HardwareProperties.HW_ACCELEROMETER,
- getBooleanVal(sensors.contains(Sensor.ACCELEROMETER)));
- props.put(HardwareProperties.HW_ORIENTATION_SENSOR,
- getBooleanVal(sensors.contains(Sensor.GYROSCOPE)));
- props.put(HardwareProperties.HW_AUDIO_INPUT, getBooleanVal(hw.hasMic()));
- props.put(HardwareProperties.HW_SDCARD, getBooleanVal(hw.getRemovableStorage().size() > 0));
- props.put(HardwareProperties.HW_LCD_DENSITY,
- Integer.toString(hw.getScreen().getPixelDensity().getDpiValue()));
- props.put(HardwareProperties.HW_PROXIMITY_SENSOR,
- getBooleanVal(sensors.contains(Sensor.PROXIMITY_SENSOR)));
- return props;
- }
-
- /**
- * Returns the hardware properties defined in
- * {@link AvdManager#HARDWARE_INI} as a {@link Map}.
- *
- * @param d The {@link Device} from which to derive the hardware properties.
- * @return A {@link Map} of hardware properties.
- */
- public static Map<String, String> getHardwareProperties(Device d) {
- Map<String, String> props = getHardwareProperties(d.getDefaultState());
- for (State s : d.getAllStates()) {
- if (s.getKeyState().equals(KeyboardState.HIDDEN)) {
- props.put("hw.keyboard.lid", getBooleanVal(true));
- }
- }
- props.put(AvdManager.AVD_INI_DEVICE_HASH, Integer.toString(d.hashCode()));
- props.put(AvdManager.AVD_INI_DEVICE_NAME, d.getName());
- props.put(AvdManager.AVD_INI_DEVICE_MANUFACTURER, d.getManufacturer());
- return props;
- }
-
- /**
- * Takes a boolean and returns the appropriate value for
- * {@link HardwareProperties}
- *
- * @param bool The boolean value to turn into the appropriate
- * {@link HardwareProperties} value.
- * @return {@code HardwareProperties#BOOLEAN_VALUES[0]} if true,
- * {@code HardwareProperties#BOOLEAN_VALUES[1]} otherwise.
- */
- private static String getBooleanVal(boolean bool) {
- if (bool) {
- return HardwareProperties.BOOLEAN_VALUES[0];
- }
- return HardwareProperties.BOOLEAN_VALUES[1];
- }
-
- private Collection<Device> loadDevices(File deviceXml) {
- try {
- return DeviceParser.parse(deviceXml);
- } catch (SAXException e) {
- mLog.error(null, "Error parsing %1$s", deviceXml.getAbsolutePath());
- } catch (ParserConfigurationException e) {
- mLog.error(null, "Error parsing %1$s", deviceXml.getAbsolutePath());
- } catch (IOException e) {
- mLog.error(null, "Error reading %1$s", deviceXml.getAbsolutePath());
- } catch (IllegalStateException e) {
- // The device builders can throw IllegalStateExceptions if
- // build gets called before everything is properly setup
- mLog.error(e, null);
- }
- return new ArrayList<Device>();
- }
-
- private void notifyListeners() {
- synchronized (sListeners) {
- for (DevicesChangedListener listener : sListeners) {
- listener.onDevicesChanged();
- }
- }
- }
-
- /* Returns all of DeviceProfiles in the extras/ folder */
- private List<File> getExtraDirs(File extrasFolder) {
- List<File> extraDirs = new ArrayList<File>();
- // All OEM provided device profiles are in
- // $SDK/extras/$VENDOR/$ITEM/devices.xml
- if (extrasFolder != null && extrasFolder.isDirectory()) {
- for (File vendor : extrasFolder.listFiles()) {
- if (vendor.isDirectory()) {
- for (File item : vendor.listFiles()) {
- if (item.isDirectory() && isDevicesExtra(item)) {
- extraDirs.add(item);
- }
- }
- }
- }
- }
-
- return extraDirs;
- }
-
- /*
- * Returns whether a specific folder for a specific vendor is a
- * DeviceProfiles folder
- */
- private boolean isDevicesExtra(File item) {
- File properties = new File(item, SdkConstants.FN_SOURCE_PROP);
- try {
- BufferedReader propertiesReader = new BufferedReader(new FileReader(properties));
- try {
- String line;
- while ((line = propertiesReader.readLine()) != null) {
- Matcher m = PATH_PROPERTY_PATTERN.matcher(line);
- if (m.matches()) {
- return true;
- }
- }
- } finally {
- propertiesReader.close();
- }
- } catch (IOException ignore) {
- }
- return false;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/DeviceParser.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/DeviceParser.java
deleted file mode 100644
index dd63af2..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/DeviceParser.java
+++ /dev/null
@@ -1,373 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.devices;
-
-import com.android.annotations.Nullable;
-import com.android.dvlib.DeviceSchema;
-import com.android.resources.Density;
-import com.android.resources.Keyboard;
-import com.android.resources.KeyboardState;
-import com.android.resources.Navigation;
-import com.android.resources.NavigationState;
-import com.android.resources.ScreenOrientation;
-import com.android.resources.ScreenRatio;
-import com.android.resources.ScreenSize;
-import com.android.resources.TouchScreen;
-import com.android.resources.UiMode;
-
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-import org.xml.sax.helpers.DefaultHandler;
-
-import java.awt.Point;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-public class DeviceParser {
-
- private static class DeviceHandler extends DefaultHandler {
- private final static String sSpaceRegex = "[\\s]+";
- private final List<Device> mDevices = new ArrayList<Device>();
- private final StringBuilder mStringAccumulator = new StringBuilder();
- private final File mParentFolder;
- private Meta mMeta;
- private Hardware mHardware;
- private Software mSoftware;
- private State mState;
- private Device.Builder mBuilder;
- private Camera mCamera;
- private Storage.Unit mUnit;
-
- public DeviceHandler(@Nullable File parentFolder) {
- mParentFolder = parentFolder;
- }
-
- public List<Device> getDevices() {
- return mDevices;
- }
-
- @Override
- public void startElement(String uri, String localName, String name, Attributes attributes)
- throws SAXException {
-
- if (DeviceSchema.NODE_DEVICE.equals(localName)) {
- // Reset everything
- mMeta = null;
- mHardware = null;
- mSoftware = null;
- mState = null;
- mCamera = null;
- mBuilder = new Device.Builder();
- } else if (DeviceSchema.NODE_META.equals(localName)) {
- mMeta = new Meta();
- } else if (DeviceSchema.NODE_HARDWARE.equals(localName)) {
- mHardware = new Hardware();
- } else if (DeviceSchema.NODE_SOFTWARE.equals(localName)) {
- mSoftware = new Software();
- } else if (DeviceSchema.NODE_STATE.equals(localName)) {
- mState = new State();
- // mState can embed a Hardware instance
- mHardware = mHardware.deepCopy();
- String defaultState = attributes.getValue(DeviceSchema.ATTR_DEFAULT);
- if ("true".equals(defaultState) || "1".equals(defaultState)) {
- mState.setDefaultState(true);
- }
- mState.setName(attributes.getValue(DeviceSchema.ATTR_NAME).trim());
- } else if (DeviceSchema.NODE_CAMERA.equals(localName)) {
- mCamera = new Camera();
- } else if (DeviceSchema.NODE_RAM.equals(localName)
- || DeviceSchema.NODE_INTERNAL_STORAGE.equals(localName)
- || DeviceSchema.NODE_REMOVABLE_STORAGE.equals(localName)) {
- mUnit = Storage.Unit.getEnum(attributes.getValue(DeviceSchema.ATTR_UNIT));
- } else if (DeviceSchema.NODE_FRAME.equals(localName)) {
- mMeta.setFrameOffsetLandscape(new Point());
- mMeta.setFrameOffsetPortrait(new Point());
- } else if (DeviceSchema.NODE_SCREEN.equals(localName)) {
- mHardware.setScreen(new Screen());
- }
- mStringAccumulator.setLength(0);
- }
-
- @Override
- public void characters(char[] ch, int start, int length) {
- mStringAccumulator.append(ch, start, length);
- }
-
- @Override
- public void endElement(String uri, String localName, String name) throws SAXException {
- if (DeviceSchema.NODE_DEVICE.equals(localName)) {
- mDevices.add(mBuilder.build());
- } else if (DeviceSchema.NODE_NAME.equals(localName)) {
- mBuilder.setName(getString(mStringAccumulator));
- } else if (DeviceSchema.NODE_MANUFACTURER.equals(localName)) {
- mBuilder.setManufacturer(getString(mStringAccumulator));
- } else if (DeviceSchema.NODE_META.equals(localName)) {
- mBuilder.setMeta(mMeta);
- } else if (DeviceSchema.NODE_SOFTWARE.equals(localName)) {
- mBuilder.addSoftware(mSoftware);
- } else if (DeviceSchema.NODE_STATE.equals(localName)) {
- mState.setHardware(mHardware);
- mBuilder.addState(mState);
- } else if (DeviceSchema.NODE_SIXTY_FOUR.equals(localName)) {
- mMeta.setIconSixtyFour(new File(mParentFolder, getString(mStringAccumulator)));
- } else if (DeviceSchema.NODE_SIXTEEN.equals(localName)) {
- mMeta.setIconSixteen(new File(mParentFolder, getString(mStringAccumulator)));
- } else if (DeviceSchema.NODE_PATH.equals(localName)) {
- mMeta.setFrame(new File(mParentFolder, mStringAccumulator.toString().trim()));
- } else if (DeviceSchema.NODE_PORTRAIT_X_OFFSET.equals(localName)) {
- mMeta.getFrameOffsetPortrait().x = getInteger(mStringAccumulator);
- } else if (DeviceSchema.NODE_PORTRAIT_Y_OFFSET.equals(localName)) {
- mMeta.getFrameOffsetPortrait().y = getInteger(mStringAccumulator);
- } else if (DeviceSchema.NODE_LANDSCAPE_X_OFFSET.equals(localName)) {
- mMeta.getFrameOffsetLandscape().x = getInteger(mStringAccumulator);
- } else if (DeviceSchema.NODE_LANDSCAPE_Y_OFFSET.equals(localName)) {
- mMeta.getFrameOffsetLandscape().y = getInteger(mStringAccumulator);
- } else if (DeviceSchema.NODE_SCREEN_SIZE.equals(localName)) {
- mHardware.getScreen().setSize(ScreenSize.getEnum(getString(mStringAccumulator)));
- } else if (DeviceSchema.NODE_DIAGONAL_LENGTH.equals(localName)) {
- mHardware.getScreen().setDiagonalLength(getDouble(mStringAccumulator));
- } else if (DeviceSchema.NODE_PIXEL_DENSITY.equals(localName)) {
- mHardware.getScreen().setPixelDensity(
- Density.getEnum(getString(mStringAccumulator)));
- } else if (DeviceSchema.NODE_SCREEN_RATIO.equals(localName)) {
- mHardware.getScreen().setRatio(
- ScreenRatio.getEnum(getString(mStringAccumulator)));
- } else if (DeviceSchema.NODE_X_DIMENSION.equals(localName)) {
- mHardware.getScreen().setXDimension(getInteger(mStringAccumulator));
- } else if (DeviceSchema.NODE_Y_DIMENSION.equals(localName)) {
- mHardware.getScreen().setYDimension(getInteger(mStringAccumulator));
- } else if (DeviceSchema.NODE_XDPI.equals(localName)) {
- mHardware.getScreen().setXdpi(getDouble(mStringAccumulator));
- } else if (DeviceSchema.NODE_YDPI.equals(localName)) {
- mHardware.getScreen().setYdpi(getDouble(mStringAccumulator));
- } else if (DeviceSchema.NODE_MULTITOUCH.equals(localName)) {
- mHardware.getScreen().setMultitouch(
- Multitouch.getEnum(getString(mStringAccumulator)));
- } else if (DeviceSchema.NODE_MECHANISM.equals(localName)) {
- mHardware.getScreen().setMechanism(
- TouchScreen.getEnum(getString(mStringAccumulator)));
- } else if (DeviceSchema.NODE_SCREEN_TYPE.equals(localName)) {
- mHardware.getScreen().setScreenType(
- ScreenType.getEnum(getString(mStringAccumulator)));
- } else if (DeviceSchema.NODE_NETWORKING.equals(localName)) {
- for (String n : getStringList(mStringAccumulator)) {
- Network net = Network.getEnum(n);
- if (net != null) {
- mHardware.addNetwork(net);
- }
- }
- } else if (DeviceSchema.NODE_SENSORS.equals(localName)) {
- for (String s : getStringList(mStringAccumulator)) {
- Sensor sens = Sensor.getEnum(s);
- if (sens != null) {
- mHardware.addSensor(sens);
- }
- }
- } else if (DeviceSchema.NODE_MIC.equals(localName)) {
- mHardware.setHasMic(getBool(mStringAccumulator));
- } else if (DeviceSchema.NODE_CAMERA.equals(localName)) {
- mHardware.addCamera(mCamera);
- mCamera = null;
- } else if (DeviceSchema.NODE_LOCATION.equals(localName)) {
- mCamera.setLocation(CameraLocation.getEnum(getString(mStringAccumulator)));
- } else if (DeviceSchema.NODE_AUTOFOCUS.equals(localName)) {
- mCamera.setFlash(getBool(mStringAccumulator));
- } else if (DeviceSchema.NODE_FLASH.equals(localName)) {
- mCamera.setFlash(getBool(mStringAccumulator));
- } else if (DeviceSchema.NODE_KEYBOARD.equals(localName)) {
- mHardware.setKeyboard(Keyboard.getEnum(getString(mStringAccumulator)));
- } else if (DeviceSchema.NODE_NAV.equals(localName)) {
- mHardware.setNav(Navigation.getEnum(getString(mStringAccumulator)));
- } else if (DeviceSchema.NODE_RAM.equals(localName)) {
- int val = getInteger(mStringAccumulator);
- mHardware.setRam(new Storage(val, mUnit));
- } else if (DeviceSchema.NODE_BUTTONS.equals(localName)) {
- mHardware.setButtonType(ButtonType.getEnum(getString(mStringAccumulator)));
- } else if (DeviceSchema.NODE_INTERNAL_STORAGE.equals(localName)) {
- for (String s : getStringList(mStringAccumulator)) {
- int val = Integer.parseInt(s);
- mHardware.addInternalStorage(new Storage(val, mUnit));
- }
- } else if (DeviceSchema.NODE_REMOVABLE_STORAGE.equals(localName)) {
- for (String s : getStringList(mStringAccumulator)) {
- if (s != null && !s.isEmpty()) {
- int val = Integer.parseInt(s);
- mHardware.addRemovableStorage(new Storage(val, mUnit));
- }
- }
- } else if (DeviceSchema.NODE_CPU.equals(localName)) {
- mHardware.setCpu(getString(mStringAccumulator));
- } else if (DeviceSchema.NODE_GPU.equals(localName)) {
- mHardware.setGpu(getString(mStringAccumulator));
- } else if (DeviceSchema.NODE_ABI.equals(localName)) {
- for (String s : getStringList(mStringAccumulator)) {
- Abi abi = Abi.getEnum(s);
- if (abi != null) {
- mHardware.addSupportedAbi(abi);
- }
- }
- } else if (DeviceSchema.NODE_DOCK.equals(localName)) {
- for (String s : getStringList(mStringAccumulator)) {
- UiMode d = UiMode.getEnum(s);
- if (d != null) {
- mHardware.addSupportedUiMode(d);
- }
- }
- } else if (DeviceSchema.NODE_POWER_TYPE.equals(localName)) {
- mHardware.setChargeType(PowerType.getEnum(getString(mStringAccumulator)));
- } else if (DeviceSchema.NODE_API_LEVEL.equals(localName)) {
- String val = getString(mStringAccumulator);
- // Can be one of 5 forms:
- // 1
- // 1-2
- // 1-
- // -2
- // -
- int index;
- if (val.charAt(0) == '-') {
- if (val.length() == 1) { // -
- mSoftware.setMinSdkLevel(0);
- mSoftware.setMaxSdkLevel(Integer.MAX_VALUE);
- } else { // -2
- // Remove the front dash and any whitespace between it
- // and the upper bound.
- val = val.substring(1).trim();
- mSoftware.setMinSdkLevel(0);
- mSoftware.setMaxSdkLevel(Integer.parseInt(val));
- }
- } else if ((index = val.indexOf('-')) > 0) {
- if (index == val.length() - 1) { // 1-
- // Strip the last dash and any whitespace between it and
- // the lower bound.
- val = val.substring(0, val.length() - 1).trim();
- mSoftware.setMinSdkLevel(Integer.parseInt(val));
- mSoftware.setMaxSdkLevel(Integer.MAX_VALUE);
- } else { // 1-2
- String min = val.substring(0, index).trim();
- String max = val.substring(index + 1);
- mSoftware.setMinSdkLevel(Integer.parseInt(min));
- mSoftware.setMaxSdkLevel(Integer.parseInt(max));
- }
- } else { // 1
- int apiLevel = Integer.parseInt(val);
- mSoftware.setMinSdkLevel(apiLevel);
- mSoftware.setMaxSdkLevel(apiLevel);
- }
- } else if (DeviceSchema.NODE_LIVE_WALLPAPER_SUPPORT.equals(localName)) {
- mSoftware.setLiveWallpaperSupport(getBool(mStringAccumulator));
- } else if (DeviceSchema.NODE_BLUETOOTH_PROFILES.equals(localName)) {
- for (String s : getStringList(mStringAccumulator)) {
- BluetoothProfile profile = BluetoothProfile.getEnum(s);
- if (profile != null) {
- mSoftware.addBluetoothProfile(profile);
- }
- }
- } else if (DeviceSchema.NODE_GL_VERSION.equals(localName)) {
- // Guaranteed to be in the form [\d]\.[\d]
- mSoftware.setGlVersion(getString(mStringAccumulator));
- } else if (DeviceSchema.NODE_GL_EXTENSIONS.equals(localName)) {
- mSoftware.addAllGlExtensions(getStringList(mStringAccumulator));
- } else if (DeviceSchema.NODE_DESCRIPTION.equals(localName)) {
- mState.setDescription(getString(mStringAccumulator));
- } else if (DeviceSchema.NODE_SCREEN_ORIENTATION.equals(localName)) {
- mState.setOrientation(ScreenOrientation.getEnum(getString(mStringAccumulator)));
- } else if (DeviceSchema.NODE_KEYBOARD_STATE.equals(localName)) {
- mState.setKeyState(KeyboardState.getEnum(getString(mStringAccumulator)));
- } else if (DeviceSchema.NODE_NAV_STATE.equals(localName)) {
- // We have an extra state in our XML for nonav that
- // NavigationState doesn't contain
- String navState = getString(mStringAccumulator);
- if (navState.equals("nonav")) {
- mState.setNavState(NavigationState.HIDDEN);
- } else {
- mState.setNavState(NavigationState.getEnum(getString(mStringAccumulator)));
- }
- } else if (DeviceSchema.NODE_STATUS_BAR.equals(localName)) {
- mSoftware.setStatusBar(getBool(mStringAccumulator));
- }
- }
-
- @Override
- public void error(SAXParseException e) throws SAXParseException {
- throw e;
- }
-
- private List<String> getStringList(StringBuilder stringAccumulator) {
- List<String> filteredStrings = new ArrayList<String>();
- for (String s : getString(mStringAccumulator).split(sSpaceRegex)) {
- if (s != null && !s.isEmpty()) {
- filteredStrings.add(s.trim());
- }
- }
- return filteredStrings;
- }
-
- private Boolean getBool(StringBuilder stringAccumulator) {
- String b = getString(stringAccumulator);
- return b.equalsIgnoreCase("true") || b.equalsIgnoreCase("1");
- }
-
- private double getDouble(StringBuilder stringAccumulator) {
- return Double.parseDouble(getString(stringAccumulator));
- }
-
- private String getString(StringBuilder stringAccumulator) {
- return stringAccumulator.toString().trim();
- }
-
- private int getInteger(StringBuilder stringAccumulator) {
- return Integer.parseInt(getString(stringAccumulator));
- }
-
- }
-
- private final static SAXParserFactory sParserFactory;
-
- static {
- sParserFactory = SAXParserFactory.newInstance();
- sParserFactory.setNamespaceAware(true);
- }
-
- public static List<Device> parse(File devicesFile) throws SAXException,
- ParserConfigurationException, IOException {
- SAXParser parser = getParser();
- DeviceHandler dHandler = new DeviceHandler(devicesFile.getAbsoluteFile().getParentFile());
- parser.parse(devicesFile, dHandler);
- return dHandler.getDevices();
- }
-
- public static List<Device> parse(InputStream devices) throws SAXException, IOException,
- ParserConfigurationException {
- SAXParser parser = getParser();
- DeviceHandler dHandler = new DeviceHandler(null);
- parser.parse(devices, dHandler);
- return dHandler.getDevices();
- }
-
- private static SAXParser getParser() throws ParserConfigurationException, SAXException {
- sParserFactory.setSchema(DeviceSchema.getSchema());
- return sParserFactory.newSAXParser();
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/DeviceWriter.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/DeviceWriter.java
deleted file mode 100644
index 11b1c6d..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/DeviceWriter.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.devices;
-
-import com.android.SdkConstants;
-import com.android.dvlib.DeviceSchema;
-import com.android.resources.UiMode;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import java.awt.Point;
-import java.io.OutputStream;
-import java.util.Collection;
-import java.util.Locale;
-
-import javax.xml.XMLConstants;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.TransformerFactoryConfigurationError;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
-public class DeviceWriter {
-
- public static final String LOCAL_NS = "d";
- public static final String PREFIX = LOCAL_NS + ":";
-
- /**
- * Writes the XML definition of the given {@link Collection} of {@link Device}s according to
- * {@link SdkConstants#NS_DEVICES_XSD} to the {@link OutputStream}.
- * Note that it is up to the caller to close the {@link OutputStream}.
- * @param out The {@link OutputStream} to write the resulting XML to.
- * @param devices The {@link Device}s from which to generate the XML.
- * @throws ParserConfigurationException
- * @throws TransformerFactoryConfigurationError
- * @throws TransformerException
- */
- public static void writeToXml(OutputStream out, Collection<Device> devices) throws
- ParserConfigurationException,
- TransformerFactoryConfigurationError,
- TransformerException {
- Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
- Element root = doc.createElement(PREFIX + DeviceSchema.NODE_DEVICES);
- root.setAttribute(XMLConstants.XMLNS_ATTRIBUTE + ":xsi",
- XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI);
- root.setAttribute(XMLConstants.XMLNS_ATTRIBUTE + ":" + LOCAL_NS, SdkConstants.NS_DEVICES_XSD);
- doc.appendChild(root);
-
- for (Device device : devices) {
- Element deviceNode = doc.createElement(PREFIX + DeviceSchema.NODE_DEVICE);
- root.appendChild(deviceNode);
-
- Element name = doc.createElement(PREFIX + DeviceSchema.NODE_NAME);
- name.appendChild(doc.createTextNode(device.getName()));
- deviceNode.appendChild(name);
-
- Element manufacturer = doc.createElement(PREFIX + DeviceSchema.NODE_MANUFACTURER);
- manufacturer.appendChild(doc.createTextNode(device.getManufacturer()));
- deviceNode.appendChild(manufacturer);
-
- deviceNode.appendChild(generateMetaNode(device.getMeta(), doc));
- deviceNode.appendChild(generateHardwareNode(device.getDefaultHardware(), doc));
- for (Software sw : device.getAllSoftware()) {
- deviceNode.appendChild(generateSoftwareNode(sw, doc));
- }
- for (State s : device.getAllStates()) {
- deviceNode.appendChild(generateStateNode(s, doc, device.getDefaultHardware()));
- }
- }
-
- Transformer tf = TransformerFactory.newInstance().newTransformer();
- tf.setOutputProperty(OutputKeys.INDENT, "yes");
- tf.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
- DOMSource source = new DOMSource(doc);
- StreamResult result = new StreamResult(out);
- tf.transform(source, result);
- }
-
- /* This returns the XML Element for the given instance of Meta */
- private static Node generateMetaNode(Meta meta, Document doc) {
- Element m = doc.createElement(PREFIX + DeviceSchema.NODE_META);
- if (meta.hasIconSixtyFour() || meta.hasIconSixteen()) {
- Element icons = doc.createElement(PREFIX + DeviceSchema.NODE_ICONS);
- m.appendChild(icons);
- if (meta.hasIconSixtyFour()) {
- addElement(doc, icons, DeviceSchema.NODE_SIXTY_FOUR,
- meta.getIconSixtyFour().getPath());
- }
- if (meta.hasIconSixteen()) {
- addElement(doc, icons, DeviceSchema.NODE_SIXTEEN, meta.getIconSixteen().getPath());
- }
- }
-
- if (meta.hasFrame()) {
- Element frame = doc.createElement(PREFIX + DeviceSchema.NODE_FRAME);
- addElement(doc, frame, DeviceSchema.NODE_PATH, meta.getFrame().getPath());
- Point offset = meta.getFrameOffsetPortrait();
- addElement(doc, frame, DeviceSchema.NODE_PORTRAIT_X_OFFSET, Integer.toString(offset.x));
- addElement(doc, frame, DeviceSchema.NODE_PORTRAIT_Y_OFFSET, Integer.toString(offset.y));
- offset = meta.getFrameOffsetLandscape();
- addElement(doc, frame, DeviceSchema.NODE_LANDSCAPE_X_OFFSET,
- Integer.toString(offset.x));
- addElement(doc, frame, DeviceSchema.NODE_LANDSCAPE_Y_OFFSET,
- Integer.toString(offset.y));
- }
-
- return m;
- }
-
- /* This returns the XML Element for the given instance of Hardware */
- private static Element generateHardwareNode(Hardware hw, Document doc) {
- Screen s = hw.getScreen();
- Element hardware = doc.createElement(PREFIX + DeviceSchema.NODE_HARDWARE);
- Element screen = doc.createElement(PREFIX + DeviceSchema.NODE_SCREEN);
- hardware.appendChild(screen);
-
- addElement(doc, screen, DeviceSchema.NODE_SCREEN_SIZE, s.getSize().getResourceValue());
- addElement(doc, screen, DeviceSchema.NODE_DIAGONAL_LENGTH,
- String.format(Locale.US, "%.2f",s.getDiagonalLength()));
- addElement(doc, screen, DeviceSchema.NODE_PIXEL_DENSITY,
- s.getPixelDensity().getResourceValue());
- addElement(doc, screen, DeviceSchema.NODE_SCREEN_RATIO, s.getRatio().getResourceValue());
-
- Element dimensions = doc.createElement(PREFIX + DeviceSchema.NODE_DIMENSIONS);
- screen.appendChild(dimensions);
-
- addElement(doc, dimensions, DeviceSchema.NODE_X_DIMENSION,
- Integer.toString(s.getXDimension()));
- addElement(doc, dimensions, DeviceSchema.NODE_Y_DIMENSION,
- Integer.toString(s.getYDimension()));
- addElement(doc, screen, DeviceSchema.NODE_XDPI, String.format(Locale.US,
- "%.2f", s.getXdpi()));
- addElement(doc, screen, DeviceSchema.NODE_YDPI, String.format(Locale.US,
- "%.2f", s.getYdpi()));
-
- Element touch = doc.createElement(PREFIX + DeviceSchema.NODE_TOUCH);
- screen.appendChild(touch);
-
- addElement(doc, touch, DeviceSchema.NODE_MULTITOUCH, s.getMultitouch().toString());
- addElement(doc, touch, DeviceSchema.NODE_MECHANISM, s.getMechanism().getResourceValue());
- addElement(doc, touch, DeviceSchema.NODE_SCREEN_TYPE, s.getScreenType().toString());
-
- addElement(doc, hardware, DeviceSchema.NODE_NETWORKING, hw.getNetworking());
- addElement(doc, hardware, DeviceSchema.NODE_SENSORS, hw.getSensors());
- addElement(doc, hardware, DeviceSchema.NODE_MIC, Boolean.toString(hw.hasMic()));
-
- for(Camera c : hw.getCameras()) {
- Element camera = doc.createElement(PREFIX + DeviceSchema.NODE_CAMERA);
- hardware.appendChild(camera);
- addElement(doc, camera, DeviceSchema.NODE_LOCATION, c.getLocation().toString());
- addElement(doc, camera, DeviceSchema.NODE_AUTOFOCUS,
- Boolean.toString(c.hasAutofocus()));
- addElement(doc, camera, DeviceSchema.NODE_FLASH, Boolean.toString(c.hasFlash()));
- }
-
- addElement(doc, hardware, DeviceSchema.NODE_KEYBOARD, hw.getKeyboard().getResourceValue());
- addElement(doc, hardware, DeviceSchema.NODE_NAV, hw.getNav().getResourceValue());
-
- Storage.Unit unit = hw.getRam().getApproriateUnits();
- Element ram = addElement(doc, hardware, DeviceSchema.NODE_RAM,
- Long.toString(hw.getRam().getSizeAsUnit(unit)));
- ram.setAttribute(DeviceSchema.ATTR_UNIT, unit.toString());
-
- addElement(doc, hardware, DeviceSchema.NODE_BUTTONS, hw.getButtonType().toString());
- addStorageElement(doc, hardware, DeviceSchema.NODE_INTERNAL_STORAGE,
- hw.getInternalStorage());
- addStorageElement(doc, hardware, DeviceSchema.NODE_REMOVABLE_STORAGE,
- hw.getRemovableStorage());
- addElement(doc, hardware, DeviceSchema.NODE_CPU, hw.getCpu());
- addElement(doc, hardware, DeviceSchema.NODE_GPU, hw.getGpu());
- addElement(doc, hardware, DeviceSchema.NODE_ABI, hw.getSupportedAbis());
-
- StringBuilder sb = new StringBuilder();
- for (UiMode u : hw.getSupportedUiModes()) {
- sb.append("\n" + u.getResourceValue());
- }
- addElement(doc, hardware, DeviceSchema.NODE_DOCK, sb.toString());
-
- addElement(doc, hardware, DeviceSchema.NODE_POWER_TYPE, hw.getChargeType().toString());
-
- return hardware;
- }
-
- /* This returns the XML Element for the given instance of Software */
- private static Element generateSoftwareNode(Software sw, Document doc) {
- Element software = doc.createElement(PREFIX + DeviceSchema.NODE_SOFTWARE);
-
- String apiVersion = "";
- if (sw.getMinSdkLevel() != 0) {
- apiVersion += Integer.toString(sw.getMinSdkLevel());
- }
- apiVersion += "-";
- if (sw.getMaxSdkLevel() != Integer.MAX_VALUE) {
- apiVersion += Integer.toString(sw.getMaxSdkLevel());
- }
- addElement(doc, software, DeviceSchema.NODE_API_LEVEL, apiVersion);
- addElement(doc, software, DeviceSchema.NODE_LIVE_WALLPAPER_SUPPORT,
- Boolean.toString(sw.hasLiveWallpaperSupport()));
- addElement(doc, software, DeviceSchema.NODE_BLUETOOTH_PROFILES, sw.getBluetoothProfiles());
- addElement(doc, software, DeviceSchema.NODE_GL_VERSION, sw.getGlVersion());
- addElement(doc, software, DeviceSchema.NODE_GL_EXTENSIONS, sw.getGlExtensions());
- addElement(doc, software, DeviceSchema.NODE_STATUS_BAR,
- Boolean.toString(sw.hasStatusBar()));
-
- return software;
- }
-
- /* This returns the XML Element for the given instance of State */
- private static Element generateStateNode(State s, Document doc, Hardware defaultHardware) {
- Element state = doc.createElement(PREFIX + DeviceSchema.NODE_STATE);
- state.setAttribute(DeviceSchema.ATTR_NAME, s.getName());
- if (s.isDefaultState()) {
- state.setAttribute(DeviceSchema.ATTR_DEFAULT, Boolean.toString(s.isDefaultState()));
- }
- addElement(doc, state, DeviceSchema.NODE_DESCRIPTION, s.getDescription());
- addElement(doc, state, DeviceSchema.NODE_SCREEN_ORIENTATION,
- s.getOrientation().getResourceValue());
- addElement(doc, state, DeviceSchema.NODE_KEYBOARD_STATE,
- s.getKeyState().getResourceValue());
- addElement(doc, state, DeviceSchema.NODE_NAV_STATE, s.getNavState().getResourceValue());
-
- // Only if the hardware is different do we want to append hardware values
- if (!s.getHardware().equals(defaultHardware)){
- // TODO: Only append nodes which are different from the default hardware
- Element hardware = generateHardwareNode(s.getHardware(), doc);
- NodeList children = hardware.getChildNodes();
- for (int i = 0 ; i < children.getLength(); i++) {
- Node child = children.item(i);
- state.appendChild(child);
- }
- }
- return state;
- }
-
- private static Element addElement(Document doc, Element parent, String tag, String content) {
- Element child = doc.createElement(PREFIX + tag);
- child.appendChild(doc.createTextNode(content));
- parent.appendChild(child);
- return child;
- }
-
- private static Element addElement(Document doc, Element parent, String tag,
- Collection<? extends Object> content) {
- StringBuilder sb = new StringBuilder();
- for (Object o : content) {
- sb.append("\n" + o.toString());
- }
- return addElement(doc, parent, tag, sb.toString());
- }
-
- /* This adds generates the XML for a Collection<Storage> and appends it to the parent. Note
- * that it picks the proper unit for the unit attribute and sets it on the node.
- */
- private static Element addStorageElement(Document doc, Element parent, String tag,
- Collection<Storage> content){
- Storage.Unit unit = Storage.Unit.TiB;
-
- // Get the lowest common unit (so if one piece of storage is 128KiB and another is 1MiB,
- // use KiB for units)
- for(Storage storage : content) {
- if(storage.getApproriateUnits().getNumberOfBytes() < unit.getNumberOfBytes()) {
- unit = storage.getApproriateUnits();
- }
- }
-
- StringBuilder sb = new StringBuilder();
- for(Storage storage : content) {
- sb.append("\n" + storage.getSizeAsUnit(unit));
- }
- Element storage = addElement(doc, parent, tag, sb.toString());
- storage.setAttribute(DeviceSchema.ATTR_UNIT, unit.toString());
- return storage;
- }
-
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Hardware.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Hardware.java
deleted file mode 100644
index b12f11d..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Hardware.java
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.devices;
-
-import com.android.resources.Keyboard;
-import com.android.resources.Navigation;
-import com.android.resources.UiMode;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-public class Hardware {
- private Screen mScreen;
- private Set<Network> mNetworking = new HashSet<Network>();
- private Set<Sensor> mSensors = new HashSet<Sensor>();
- private boolean mMic;
- private List<Camera> mCameras = new ArrayList<Camera>();
- private Keyboard mKeyboard;
- private Navigation mNav;
- private Storage mRam;
- private ButtonType mButtons;
- private List<Storage> mInternalStorage = new ArrayList<Storage>();
- private List<Storage> mRemovableStorage = new ArrayList<Storage>();
- private String mCpu;
- private String mGpu;
- private Set<Abi> mAbis = new HashSet<Abi>();
- private Set<UiMode> mUiModes = new HashSet<UiMode>();
- private PowerType mPluggedIn;
-
- public Set<Network> getNetworking() {
- return mNetworking;
- }
-
- public void addNetwork(Network n) {
- mNetworking.add(n);
- }
-
- public void addAllNetworks(Collection<Network> ns) {
- mNetworking.addAll(ns);
- }
-
- public Set<Sensor> getSensors() {
- return mSensors;
- }
-
- public void addSensor(Sensor sensor) {
- mSensors.add(sensor);
- }
-
- public void addAllSensors(Collection<Sensor> sensors) {
- mSensors.addAll(sensors);
- }
-
- public boolean hasMic() {
- return mMic;
- }
-
- public void setHasMic(boolean hasMic) {
- mMic = hasMic;
- }
-
- public List<Camera> getCameras() {
- return mCameras;
- }
-
- public void addCamera(Camera c) {
- mCameras.add(c);
- }
-
- public void addAllCameras(Collection<Camera> cs) {
- mCameras.addAll(cs);
- }
-
- public Camera getCamera(int i) {
- return mCameras.get(i);
- }
-
- public Camera getCamera(CameraLocation location) {
- for (Camera c : mCameras) {
- if (location.equals(c.getLocation())) {
- return c;
- }
- }
- return null;
- }
-
- public Keyboard getKeyboard() {
- return mKeyboard;
- }
-
- public void setKeyboard(Keyboard k) {
- mKeyboard = k;
- }
-
- public Navigation getNav() {
- return mNav;
- }
-
- public void setNav(Navigation n) {
- mNav = n;
- }
-
- public Storage getRam() {
- return mRam;
- }
-
- public void setRam(Storage ram) {
- mRam = ram;
- }
-
- public ButtonType getButtonType() {
- return mButtons;
- }
-
- public void setButtonType(ButtonType bt) {
- mButtons = bt;
- }
-
- public List<Storage> getInternalStorage() {
- return mInternalStorage;
- }
-
- public void addInternalStorage(Storage is) {
- mInternalStorage.add(is);
- }
-
- public void addAllInternalStorage(Collection<Storage> is) {
- mInternalStorage.addAll(is);
- }
-
- public List<Storage> getRemovableStorage() {
- return mRemovableStorage;
- }
-
- public void addRemovableStorage(Storage rs) {
- mRemovableStorage.add(rs);
- }
-
- public void addAllRemovableStorage(Collection<Storage> rs) {
- mRemovableStorage.addAll(rs);
- }
-
- public String getCpu() {
- return mCpu;
- }
-
- public void setCpu(String cpuName) {
- mCpu = cpuName;
- }
-
- public String getGpu() {
- return mGpu;
- }
-
- public void setGpu(String gpuName) {
- mGpu = gpuName;
- }
-
- public Set<Abi> getSupportedAbis() {
- return mAbis;
- }
-
- public void addSupportedAbi(Abi abi) {
- mAbis.add(abi);
- }
-
- public void addAllSupportedAbis(Collection<Abi> abis) {
- mAbis.addAll(abis);
- }
-
- public Set<UiMode> getSupportedUiModes() {
- return mUiModes;
- }
-
- public void addSupportedUiMode(UiMode uiMode) {
- mUiModes.add(uiMode);
- }
-
- public void addAllSupportedUiModes(Collection<UiMode> uiModes) {
- mUiModes.addAll(uiModes);
- }
-
- public PowerType getChargeType() {
- return mPluggedIn;
- }
-
- public void setChargeType(PowerType chargeType) {
- mPluggedIn = chargeType;
- }
-
- public Screen getScreen() {
- return mScreen;
- }
-
- public void setScreen(Screen s) {
- mScreen = s;
- }
-
- /**
- * Returns a copy of the object that shares no state with it,
- * but is initialized to equivalent values.
- *
- * @return A copy of the object.
- */
- public Hardware deepCopy() {
- Hardware hw = new Hardware();
- hw.mScreen = mScreen.deepCopy();
- hw.mNetworking = new HashSet<Network>(mNetworking);
- hw.mSensors = new HashSet<Sensor>(mSensors);
- // Get the constant boolean value
- hw.mMic = mMic;
- hw.mCameras = new ArrayList<Camera>();
- for (Camera c : mCameras) {
- hw.mCameras.add(c.deepCopy());
- }
- hw.mKeyboard = mKeyboard;
- hw.mNav = mNav;
- hw.mRam = mRam.deepCopy();
- hw.mButtons = mButtons;
- hw.mInternalStorage = new ArrayList<Storage>();
- for (Storage s : mInternalStorage) {
- hw.mInternalStorage.add(s.deepCopy());
- }
- hw.mRemovableStorage = new ArrayList<Storage>();
- for (Storage s : mRemovableStorage) {
- hw.mRemovableStorage.add(s.deepCopy());
- }
- hw.mCpu = mCpu;
- hw.mGpu = mGpu;
- hw.mAbis = new HashSet<Abi>(mAbis);
- hw.mUiModes = new HashSet<UiMode>(mUiModes);
- hw.mPluggedIn = mPluggedIn;
- return hw;
- }
-
- @Override
- public boolean equals(Object o) {
- if (o == this) {
- return true;
- }
- if (!(o instanceof Hardware)) {
- return false;
- }
- Hardware hw = (Hardware) o;
- return mScreen.equals(hw.getScreen())
- && mNetworking.equals(hw.getNetworking())
- && mSensors.equals(hw.getSensors())
- && mMic == hw.hasMic()
- && mCameras.equals(hw.getCameras())
- && mKeyboard == hw.getKeyboard()
- && mNav == hw.getNav()
- && mRam.equals(hw.getRam())
- && mButtons == hw.getButtonType()
- && mInternalStorage.equals(hw.getInternalStorage())
- && mRemovableStorage.equals(hw.getRemovableStorage())
- && mCpu.equals(hw.getCpu())
- && mGpu.equals(hw.getGpu())
- && mAbis.equals(hw.getSupportedAbis())
- && mUiModes.equals(hw.getSupportedUiModes())
- && mPluggedIn == hw.getChargeType();
-
- }
-
- @Override
- public int hashCode() {
- int hash = 17;
- hash = 31 * hash + mScreen.hashCode();
-
- // Since sets have no defined order, we need to hash them in such a way that order doesn't
- // matter.
- int temp = 0;
- for (Network n : mNetworking) {
- temp |= 1 << n.ordinal();
- }
- hash = 31 * hash + temp;
-
- temp = 0;
- for (Sensor s : mSensors) {
- temp |= 1 << s.ordinal();
- }
-
- hash = 31 * hash + temp;
- hash = 31 * hash + (mMic ? 1 : 0);
- hash = mCameras.hashCode();
- hash = 31 * hash + mKeyboard.ordinal();
- hash = 31 * hash + mNav.ordinal();
- hash = 31 * hash + mRam.hashCode();
- hash = 31 * hash + mButtons.ordinal();
- hash = 31 * hash + mInternalStorage.hashCode();
- hash = 31 * hash + mRemovableStorage.hashCode();
-
- for (Character c : mCpu.toCharArray()) {
- hash = 31 * hash + c;
- }
-
- for (Character c : mGpu.toCharArray()) {
- hash = 31 * hash + c;
- }
-
- temp = 0;
- for (Abi a : mAbis) {
- temp |= 1 << a.ordinal();
- }
- hash = 31 * hash + temp;
-
- temp = 0;
- for (UiMode ui : mUiModes) {
- temp |= 1 << ui.ordinal();
- }
- hash = 31 * hash + temp;
-
- return hash;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Meta.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Meta.java
deleted file mode 100644
index e69d2c3..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Meta.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.devices;
-
-import java.awt.Point;
-import java.io.File;
-
-public class Meta {
- private File mIconSixtyFour;
- private File mIconSixteen;
- private File mFrame;
- private Point mFrameOffsetLandscape;
- private Point mFrameOffsetPortrait;
-
- public File getIconSixtyFour() {
- return mIconSixtyFour;
- }
-
- public void setIconSixtyFour(File iconSixtyFour) {
- mIconSixtyFour = iconSixtyFour;
- }
-
- public boolean hasIconSixtyFour() {
- if (mIconSixtyFour != null && mIconSixtyFour.isFile()) {
- return true;
- } else {
- return false;
- }
- }
-
- public File getIconSixteen() {
- return mIconSixteen;
- }
-
- public void setIconSixteen(File iconSixteen) {
- mIconSixteen = iconSixteen;
- }
-
- public boolean hasIconSixteen() {
- if (mIconSixteen != null && mIconSixteen.isFile()) {
- return true;
- } else {
- return false;
- }
- }
-
- public File getFrame() {
- return mFrame;
- }
-
- public void setFrame(File frame) {
- mFrame = frame;
- }
-
- public boolean hasFrame() {
- if (mFrame != null && mFrame.isFile()) {
- return true;
- } else {
- return false;
- }
- }
-
- public Point getFrameOffsetLandscape() {
- return mFrameOffsetLandscape;
- }
-
- public void setFrameOffsetLandscape(Point offset) {
- mFrameOffsetLandscape = offset;
- }
-
- public Point getFrameOffsetPortrait() {
- return mFrameOffsetPortrait;
- }
-
- public void setFrameOffsetPortrait(Point offset) {
- mFrameOffsetPortrait = offset;
- }
-
- @Override
- public boolean equals(Object o) {
- if (o == this) {
- return true;
- }
- if (!(o instanceof Meta)) {
- return false;
- }
- Meta m = (Meta) o;
-
- // Note that any of the fields of either object can be null
- if (mIconSixtyFour != null && !mIconSixtyFour.equals(m.getIconSixtyFour())){
- return false;
- } else if (m.getIconSixtyFour() != null && !m.getIconSixtyFour().equals(mIconSixtyFour)) {
- return false;
- }
-
- if (mIconSixteen != null && !mIconSixteen.equals(m.getIconSixteen())){
- return false;
- } else if (m.getIconSixteen() != null && !m.getIconSixteen().equals(mIconSixteen)) {
- return false;
- }
-
- if (mFrame != null && !mFrame.equals(m.getFrame())) {
- return false;
- } else if (m.getFrame() != null && !m.getFrame().equals(mFrame)) {
- return false;
- }
-
- if (mFrameOffsetLandscape != null
- && !mFrameOffsetLandscape.equals(m.getFrameOffsetLandscape())){
- return false;
- } else if (m.getFrameOffsetLandscape() != null
- && !m.getFrameOffsetLandscape().equals(mFrameOffsetLandscape)){
- return false;
- }
-
-
- if (mFrameOffsetPortrait != null
- && !mFrameOffsetPortrait.equals(m.getFrameOffsetPortrait())){
- return false;
- } else if (m.getFrameOffsetPortrait() != null
- && !m.getFrameOffsetPortrait().equals(mFrameOffsetPortrait)){
- return false;
- }
-
- return true;
- }
-
- @Override
- public int hashCode() {
- int hash = 17;
- if(mIconSixteen != null){
- String path = mIconSixteen.getAbsolutePath();
- hash = 31 * hash + path.hashCode();
- }
- if(mIconSixtyFour != null){
- String path = mIconSixtyFour.getAbsolutePath();
- hash = 31 * hash + path.hashCode();
- }
- if(mFrame != null){
- String path = mFrame.getAbsolutePath();
- hash = 31 * hash + path.hashCode();
- }
- if(mFrameOffsetLandscape != null){
- hash = 31 * hash + mFrameOffsetLandscape.x;
- hash = 31 * hash + mFrameOffsetLandscape.y;
- }
- if(mFrameOffsetPortrait != null){
- hash = 31 * hash + mFrameOffsetPortrait.x;
- hash = 31 * hash + mFrameOffsetPortrait.y;
- }
- return hash;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Multitouch.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Multitouch.java
deleted file mode 100644
index bfd4618..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Multitouch.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.devices;
-
-public enum Multitouch {
- NONE("none"),
- BASIC("basic"),
- DISTINCT("distinct"),
- JAZZ_HANDS("jazz-hands");
-
- private final String mValue;
-
- private Multitouch(String value){
- mValue = value;
- }
-
- public static Multitouch getEnum(String val){
- for (Multitouch m : values()) {
- if (m.mValue.equals(val)) {
- return m;
- }
- }
- return null;
- }
-
- @Override
- public String toString() {
- return mValue;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Network.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Network.java
deleted file mode 100644
index df84b44..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Network.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.devices;
-
-public enum Network {
- BLUETOOTH("Bluetooth"),
- WIFI("Wifi"),
- NFC("NFC");
-
- private final String mValue;
-
- private Network(String value) {
- mValue = value;
- }
-
- public static Network getEnum(String value) {
- for (Network n : values()) {
- if (n.mValue.equals(value)) {
- return n;
- }
- }
- return null;
- }
-
- @Override
- public String toString(){
- return mValue;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/PowerType.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/PowerType.java
deleted file mode 100644
index e38ba28..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/PowerType.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.devices;
-
-public enum PowerType {
- PLUGGEDIN("plugged-in"),
- BATTERY("battery");
-
- private final String mValue;
-
- private PowerType(String value) {
- mValue = value;
- }
-
- public static PowerType getEnum(String value) {
- for (PowerType c : values()) {
- if (c.mValue.equals(value)) {
- return c;
- }
- }
- return null;
- }
-
- @Override
- public String toString() {
- return mValue;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Screen.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Screen.java
deleted file mode 100644
index a7f4334..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Screen.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.devices;
-
-import com.android.resources.Density;
-import com.android.resources.ScreenRatio;
-import com.android.resources.ScreenSize;
-import com.android.resources.TouchScreen;
-
-
-public class Screen {
- private ScreenSize mScreenSize;
- private double mDiagonalLength;
- private Density mPixelDensity;
- private ScreenRatio mScreenRatio;
- private int mXDimension;
- private int mYDimension;
- private double mXdpi;
- private double mYdpi;
- private Multitouch mMultitouch;
- private TouchScreen mMechanism;
- private ScreenType mScreenType;
-
- public ScreenSize getSize() {
- return mScreenSize;
- }
-
- public void setSize(ScreenSize s) {
- mScreenSize = s;
- }
-
- public double getDiagonalLength() {
- return mDiagonalLength;
- }
-
- public void setDiagonalLength(double diagonalLength) {
- mDiagonalLength = diagonalLength;
- }
-
- public Density getPixelDensity() {
- return mPixelDensity;
- }
-
- public void setPixelDensity(Density pDensity) {
- mPixelDensity = pDensity;
- }
-
- public ScreenRatio getRatio() {
- return mScreenRatio;
- }
-
- public void setRatio(ScreenRatio ratio) {
- mScreenRatio = ratio;
- }
-
- public int getXDimension() {
- return mXDimension;
- }
-
- public void setXDimension(int xDimension) {
- mXDimension = xDimension;
- }
-
- public int getYDimension() {
- return mYDimension;
- }
-
- public void setYDimension(int yDimension) {
- mYDimension = yDimension;
- }
-
- public double getXdpi() {
- return mXdpi;
- }
-
- public void setXdpi(double xdpi) {
- mXdpi = xdpi;
- }
-
- public double getYdpi() {
- return mYdpi;
- }
-
- public void setYdpi(double ydpi) {
- mYdpi = ydpi;
- }
-
- public Multitouch getMultitouch() {
- return mMultitouch;
- }
-
- public void setMultitouch(Multitouch m) {
- mMultitouch = m;
- }
-
- public TouchScreen getMechanism() {
- return mMechanism;
- }
-
- public void setMechanism(TouchScreen mechanism) {
- mMechanism = mechanism;
- }
-
- public ScreenType getScreenType() {
- return mScreenType;
- }
-
- public void setScreenType(ScreenType screenType) {
- mScreenType = screenType;
- }
-
- /**
- * Returns a copy of the object that shares no state with it,
- * but is initialized to equivalent values.
- *
- * @return A copy of the object.
- */
- public Screen deepCopy() {
- Screen s = new Screen();
- s.mScreenSize = mScreenSize;
- s.mDiagonalLength = mDiagonalLength;
- s.mPixelDensity = mPixelDensity;
- s.mScreenRatio = mScreenRatio;
- s.mXDimension = mXDimension;
- s.mYDimension = mYDimension;
- s.mXdpi = mXdpi;
- s.mYdpi = mYdpi;
- s.mMultitouch = mMultitouch;
- s.mMechanism = mMechanism;
- s.mScreenType = mScreenType;
- return s;
- }
-
- @Override
- public boolean equals(Object o) {
- if (o == this) {
- return true;
- }
- if (!(o instanceof Screen)) {
- return false;
- }
- Screen s = (Screen) o;
- return s.mScreenSize == mScreenSize
- && s.mDiagonalLength == mDiagonalLength
- && s.mPixelDensity == mPixelDensity
- && s.mScreenRatio == mScreenRatio
- && s.mXDimension == mXDimension
- && s.mYDimension == mYDimension
- && s.mXdpi == mXdpi
- && s.mYdpi == mYdpi
- && s.mMultitouch == mMultitouch
- && s.mMechanism == mMechanism
- && s.mScreenType == mScreenType;
- }
-
- @Override
- public int hashCode() {
- int hash = 17;
- hash = 31 * hash + mScreenSize.ordinal();
- long f = Double.doubleToLongBits(mDiagonalLength);
- hash = 31 * hash + (int) (f ^ (f >>> 32));
- hash = 31 * hash + mPixelDensity.ordinal();
- hash = 31 * hash + mScreenRatio.ordinal();
- hash = 31 * hash + mXDimension;
- hash = 31 * hash + mYDimension;
- f = Double.doubleToLongBits(mXdpi);
- hash = 31 * hash + (int) (f ^ (f >>> 32));
- f = Double.doubleToLongBits(mYdpi);
- hash = 31 * hash + (int) (f ^ (f >>> 32));
- hash = 31 * hash + mMultitouch.ordinal();
- hash = 31 * hash + mMechanism.ordinal();
- hash = 31 * hash + mScreenType.ordinal();
- return hash;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/ScreenType.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/ScreenType.java
deleted file mode 100644
index 21d6005..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/ScreenType.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.devices;
-
-public enum ScreenType {
- CAPACITIVE("capacitive"),
- RESISTIVE("resistive"),
- NOTOUCH("notouch");
-
- private final String mValue;
-
- private ScreenType(String value) {
- mValue = value;
- }
-
- public static ScreenType getEnum(String value) {
- for (ScreenType s : values()) {
- if (s.mValue.equals(value)) {
- return s;
- }
- }
- return null;
- }
-
- @Override
- public String toString() {
- return mValue;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Sensor.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Sensor.java
deleted file mode 100644
index 3fc3e14..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Sensor.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.devices;
-
-public enum Sensor {
- ACCELEROMETER("Accelerometer"),
- BAROMETER("Barometer"),
- COMPASS("Compass"),
- GPS("GPS"),
- GYROSCOPE("Gyroscope"),
- LIGHT_SENSOR("LightSensor"),
- PROXIMITY_SENSOR("ProximitySensor");
-
- private final String mValue;
-
- private Sensor(String value) {
- mValue = value;
- }
-
- public static Sensor getEnum(String value) {
- for (Sensor s : values()) {
- if (s.mValue.equals(value)) {
- return s;
- }
- }
- return null;
- }
-
- @Override
- public String toString(){
- return mValue;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Software.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Software.java
deleted file mode 100644
index ac66a73..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Software.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.devices;
-
-import java.util.Collection;
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-public class Software {
- private int mMinSdkLevel = 0;
- private int mMaxSdkLevel = Integer.MAX_VALUE;
- private boolean mLiveWallpaperSupport;
- private Set<BluetoothProfile> mBluetoothProfiles = new LinkedHashSet<BluetoothProfile>();
- private String mGlVersion;
- private Set<String> mGlExtensions = new LinkedHashSet<String>();
- private boolean mStatusBar;
-
- public int getMinSdkLevel() {
- return mMinSdkLevel;
- }
-
- public void setMinSdkLevel(int sdkLevel) {
- mMinSdkLevel = sdkLevel;
- }
-
- public int getMaxSdkLevel() {
- return mMaxSdkLevel;
- }
-
- public void setMaxSdkLevel(int sdkLevel) {
- mMaxSdkLevel = sdkLevel;
- }
-
- public boolean hasLiveWallpaperSupport() {
- return mLiveWallpaperSupport;
- }
-
- public void setLiveWallpaperSupport(boolean liveWallpaperSupport) {
- mLiveWallpaperSupport = liveWallpaperSupport;
- }
-
- public Set<BluetoothProfile> getBluetoothProfiles() {
- return mBluetoothProfiles;
- }
-
- public void addBluetoothProfile(BluetoothProfile bp) {
- mBluetoothProfiles.add(bp);
- }
-
- public void addAllBluetoothProfiles(Collection<BluetoothProfile> bps) {
- mBluetoothProfiles.addAll(bps);
- }
-
- public String getGlVersion() {
- return mGlVersion;
- }
-
- public void setGlVersion(String version) {
- mGlVersion = version;
- }
-
- public Set<String> getGlExtensions() {
- return mGlExtensions;
- }
-
- public void addGlExtension(String extension) {
- mGlExtensions.add(extension);
- }
-
- public void addAllGlExtensions(Collection<String> extensions) {
- mGlExtensions.addAll(extensions);
- }
-
- public void setStatusBar(boolean hasBar) {
- mStatusBar = hasBar;
- }
-
- public boolean hasStatusBar() {
- return mStatusBar;
- }
-
- public Software deepCopy() {
- Software s = new Software();
- s.setMinSdkLevel(getMinSdkLevel());
- s.setMaxSdkLevel(getMaxSdkLevel());
- s.setLiveWallpaperSupport(hasLiveWallpaperSupport());
- s.addAllBluetoothProfiles(getBluetoothProfiles());
- s.setGlVersion(getGlVersion());
- s.addAllGlExtensions(getGlExtensions());
- s.setStatusBar(hasStatusBar());
- return s;
- }
-
- @Override
- public boolean equals(Object o) {
- if (o == this) {
- return true;
- }
- if (!(o instanceof Software)) {
- return false;
- }
-
- Software sw = (Software) o;
- return mMinSdkLevel == sw.getMinSdkLevel()
- && mMaxSdkLevel == sw.getMaxSdkLevel()
- && mLiveWallpaperSupport == sw.hasLiveWallpaperSupport()
- && mBluetoothProfiles.equals(sw.getBluetoothProfiles())
- && mGlVersion.equals(sw.getGlVersion())
- && mGlExtensions.equals(sw.getGlExtensions())
- && mStatusBar == sw.hasStatusBar();
- }
-
- @Override
- /** A stable hash across JVM instances */
- public int hashCode() {
- int hash = 17;
- hash = 31 * hash + mMinSdkLevel;
- hash = 31 * hash + mMaxSdkLevel;
- hash = 31 * hash + (mLiveWallpaperSupport ? 1 : 0);
- for (BluetoothProfile bp : mBluetoothProfiles) {
- hash = 31 * hash + bp.ordinal();
- }
- if (mGlVersion != null) {
- hash = 31 * hash + mGlVersion.hashCode();
- }
- for (String glExtension : mGlExtensions) {
- if (glExtension != null) {
- hash = 31 * hash + glExtension.hashCode();
- }
- }
- hash = 31 * hash + (mStatusBar ? 1 : 0);
- return hash;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/State.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/State.java
deleted file mode 100644
index 42c43e7..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/State.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.devices;
-
-import com.android.resources.KeyboardState;
-import com.android.resources.NavigationState;
-import com.android.resources.ScreenOrientation;
-
-public class State {
- private boolean mDefaultState;
- private String mName;
- private String mDescription;
- private ScreenOrientation mOrientation;
- private KeyboardState mKeyState;
- private NavigationState mNavState;
- private Hardware mHardwareOverride;
-
- public boolean isDefaultState() {
- return mDefaultState;
- }
-
- public void setDefaultState(boolean defaultState) {
- mDefaultState = defaultState;
- }
-
- public String getName() {
- return mName;
- }
-
- public void setName(String name) {
- mName = name;
- }
-
- public String getDescription() {
- return mDescription;
- }
-
- public void setDescription(String description) {
- mDescription = description;
- }
-
- public ScreenOrientation getOrientation() {
- return mOrientation;
- }
-
- public void setOrientation(ScreenOrientation orientation) {
- mOrientation = orientation;
- }
-
- public KeyboardState getKeyState() {
- return mKeyState;
- }
-
- public void setKeyState(KeyboardState keyState) {
- mKeyState = keyState;
- }
-
- public NavigationState getNavState() {
- return mNavState;
- }
-
- public void setNavState(NavigationState navState) {
- mNavState = navState;
- }
-
- public Hardware getHardware() {
- return mHardwareOverride;
- }
-
- public void setHardware(Hardware hw) {
- mHardwareOverride = hw;
- }
-
- /**
- * Returns a copy of the object that shares no state with it,
- * but is initialized to equivalent values.
- *
- * @return A copy of the object.
- */
- public State deepCopy() {
- State s = new State();
- s.setDefaultState(isDefaultState());
- s.setName(getName());
- s.setDescription(getDescription());
- s.setOrientation(getOrientation());
- s.setKeyState(getKeyState());
- s.setNavState(getNavState());
- s.setHardware(getHardware().deepCopy());
- return s;
- }
-
- @Override
- public boolean equals(Object o) {
- if (o == this) {
- return true;
- }
- if (!(o instanceof State)) {
- return false;
- }
- State s = (State) o;
- return mDefaultState == s.isDefaultState()
- && mName.equals(s.getName())
- && mDescription.equals(s.getDescription())
- && mOrientation.equals(s.getOrientation())
- && mKeyState.equals(s.getKeyState())
- && mNavState.equals(s.getNavState())
- && mHardwareOverride.equals(s.getHardware());
- }
-
- @Override
- public int hashCode() {
- int hash = 17;
- hash = 31 * hash + (mDefaultState ? 1 : 0);
- if (mName != null) {
- hash = 31 * hash + mName.hashCode();
- }
- if (mDescription != null) {
- hash = 31 * hash + mDescription.hashCode();
- }
- hash = 31 * hash + mOrientation.ordinal();
- hash = 31 * hash + mKeyState.ordinal();
- hash = 31 * hash + mNavState.ordinal();
- hash = 31 * hash + mHardwareOverride.hashCode();
- return hash;
- }
-
- @Override
- public String toString() {
- return mName;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Storage.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Storage.java
deleted file mode 100644
index b30fe6e..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/Storage.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.devices;
-
-public class Storage {
- private long mNoBytes;
-
- public Storage(long amount, Unit unit){
- mNoBytes = amount * unit.getNumberOfBytes();
- }
-
- public Storage(long amount){
- this(amount, Unit.B);
- }
-
- /** Returns the amount of storage represented, in Bytes */
- public long getSize() {
- return getSizeAsUnit(Unit.B);
- }
-
- public Storage deepCopy() {
- return new Storage(mNoBytes);
- }
-
- /**
- * Return the amount of storage represented by the instance in the given unit
- * @param unit The unit of the result.
- * @return The size of the storage in the given unit.
- */
- public long getSizeAsUnit(Unit unit) {
- return mNoBytes / unit.getNumberOfBytes();
- }
-
- @Override
- public boolean equals(Object o) {
- if (o == this){
- return true;
- }
-
- if (!(o instanceof Storage)) {
- return false;
- }
-
- Storage s = (Storage) o;
- if (s.getSize() == this.getSize()) {
- return true;
- } else {
- return false;
- }
- }
-
- @Override
- public int hashCode() {
- int result = 17;
- return 31 * result + (int) (mNoBytes^(mNoBytes>>>32));
- }
-
- public enum Unit{
- B("B", 1),
- KiB("KiB", 1024),
- MiB("MiB", 1024 * 1024),
- GiB("GiB", 1024 * 1024 * 1024),
- TiB("TiB", 1024l * 1024l * 1024l * 1024l);
-
- private String mValue;
- /** The number of bytes needed to have one of the given unit */
- private long mNoBytes;
-
- private Unit(String val, long noBytes) {
- mValue = val;
- mNoBytes = noBytes;
- }
-
- public static Unit getEnum(String val) {
- for(Unit v : values()){
- if(v.mValue.equals(val)) {
- return v;
- }
- }
- return null;
- }
-
- public long getNumberOfBytes() {
- return mNoBytes;
- }
-
- @Override
- public String toString() {
- return mValue;
- }
- }
-
- /**
- * Finds the largest {@link Unit} which can display the storage value as a positive integer
- * with no loss of accuracy.
- * @return The most appropriate {@link Unit}.
- */
- public Unit getApproriateUnits() {
- Unit optimalUnit = Unit.B;
- for(Unit unit : Unit.values()) {
- if(mNoBytes % unit.getNumberOfBytes() == 0) {
- optimalUnit = unit;
- } else {
- break;
- }
- }
- return optimalUnit;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/devices.xml b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/devices.xml
deleted file mode 100644
index 9eacec2..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/devices/devices.xml
+++ /dev/null
@@ -1,1412 +0,0 @@
-<?xml version="1.0"?>
-<d:devices
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:d="http://schemas.android.com/sdk/devices/1">
-
- <d:device>
- <d:name>
- 2.7in QVGA
- </d:name>
- <d:manufacturer>
- Generic
- </d:manufacturer>
- <d:hardware>
- <d:screen>
- <d:screen-size>small</d:screen-size>
- <d:diagonal-length>2.7</d:diagonal-length>
- <d:pixel-density>ldpi</d:pixel-density>
- <d:screen-ratio>notlong</d:screen-ratio>
- <d:dimensions>
- <d:x-dimension>240</d:x-dimension>
- <d:y-dimension>320</d:y-dimension>
- </d:dimensions>
- <d:xdpi>145</d:xdpi>
- <d:ydpi>145</d:ydpi>
- <d:touch>
- <d:multitouch>distinct</d:multitouch>
- <d:mechanism>finger</d:mechanism>
- <d:screen-type>capacitive</d:screen-type>
- </d:touch>
- </d:screen>
- <d:networking>
- Bluetooth
- Wifi
- NFC
- </d:networking>
- <d:sensors>
- Accelerometer
- Barometer
- Gyroscope
- Compass
- GPS
- ProximitySensor
- </d:sensors>
- <d:mic>true</d:mic>
- <d:camera>
- <d:location>back</d:location>
- <d:autofocus>true</d:autofocus>
- <d:flash>true</d:flash>
- </d:camera>
- <d:keyboard>nokeys</d:keyboard>
- <d:nav>nonav</d:nav>
- <d:ram unit="MiB">512</d:ram>
- <d:buttons>hard</d:buttons>
- <d:internal-storage unit="GiB">8</d:internal-storage>
- <d:removable-storage unit="MiB"></d:removable-storage>
- <d:cpu>OMAP 9001</d:cpu>
- <d:gpu>Ultra Nexus 3D S++</d:gpu>
- <d:abi>
- armeabi
- armeabi-v7a
- mips
- x86
- </d:abi>
- <d:dock>
- car
- television
- desk
- </d:dock>
- <d:power-type>battery</d:power-type>
- </d:hardware>
-
- <d:software>
- <d:api-level>-</d:api-level>
- <d:live-wallpaper-support>true</d:live-wallpaper-support>
- <d:bluetooth-profiles />
- <d:gl-version>2.1</d:gl-version>
- <d:gl-extensions />
- <d:status-bar>true</d:status-bar>
- </d:software>
-
- <d:state name="Portrait" default="true">
- <d:description>The phone in portrait view</d:description>
- <d:screen-orientation>port</d:screen-orientation>
- <d:keyboard-state>keyssoft</d:keyboard-state>
- <d:nav-state>navhidden</d:nav-state>
- </d:state>
- <d:state name="Landscape">
- <d:description>The phone in landscape view</d:description>
- <d:screen-orientation>land</d:screen-orientation>
- <d:keyboard-state>keyssoft</d:keyboard-state>
- <d:nav-state>navhidden</d:nav-state>
- </d:state>
- </d:device>
-
- <d:device>
- <d:name>
- 2.7in QVGA slider
- </d:name>
- <d:manufacturer>
- Generic
- </d:manufacturer>
- <d:hardware>
- <d:screen>
- <d:screen-size>small</d:screen-size>
- <d:diagonal-length>2.7</d:diagonal-length>
- <d:pixel-density>ldpi</d:pixel-density>
- <d:screen-ratio>notlong</d:screen-ratio>
- <d:dimensions>
- <d:x-dimension>240</d:x-dimension>
- <d:y-dimension>320</d:y-dimension>
- </d:dimensions>
- <d:xdpi>145</d:xdpi>
- <d:ydpi>145</d:ydpi>
- <d:touch>
- <d:multitouch>distinct</d:multitouch>
- <d:mechanism>finger</d:mechanism>
- <d:screen-type>capacitive</d:screen-type>
- </d:touch>
- </d:screen>
- <d:networking>
- Bluetooth
- Wifi
- NFC
- </d:networking>
- <d:sensors>
- Accelerometer
- Barometer
- Gyroscope
- Compass
- GPS
- ProximitySensor
- </d:sensors>
- <d:mic>true</d:mic>
- <d:camera>
- <d:location>back</d:location>
- <d:autofocus>true</d:autofocus>
- <d:flash>true</d:flash>
- </d:camera>
- <d:keyboard>qwerty</d:keyboard>
- <d:nav>nonav</d:nav>
- <d:ram unit="MiB">512</d:ram>
- <d:buttons>hard</d:buttons>
- <d:internal-storage unit="GiB">8</d:internal-storage>
- <d:removable-storage unit="MiB"></d:removable-storage>
- <d:cpu>OMAP 9001</d:cpu>
- <d:gpu>Ultra Nexus 3D S++</d:gpu>
- <d:abi>
- armeabi
- armeabi-v7a
- mips
- x86
- </d:abi>
- <d:dock>
- car
- television
- desk
- </d:dock>
- <d:power-type>battery</d:power-type>
- </d:hardware>
-
- <d:software>
- <d:api-level>-</d:api-level>
- <d:live-wallpaper-support>true</d:live-wallpaper-support>
- <d:bluetooth-profiles />
- <d:gl-version>2.1</d:gl-version>
- <d:gl-extensions />
- <d:status-bar>true</d:status-bar>
- </d:software>
-
- <d:state name="Portrait" default="true">
- <d:description>The phone in portrait view</d:description>
- <d:screen-orientation>port</d:screen-orientation>
- <d:keyboard-state>keyssoft</d:keyboard-state>
- <d:nav-state>navhidden</d:nav-state>
- </d:state>
- <d:state name="Landscape, closed">
- <d:description>The phone in landscape view with the keyboard closed</d:description>
- <d:screen-orientation>land</d:screen-orientation>
- <d:keyboard-state>keyshidden</d:keyboard-state>
- <d:nav-state>navhidden</d:nav-state>
- </d:state>
- <d:state name="Landscape, open">
- <d:description>The phone in landscape view with the keyboard open</d:description>
- <d:screen-orientation>land</d:screen-orientation>
- <d:keyboard-state>keysexposed</d:keyboard-state>
- <d:nav-state>navexposed</d:nav-state>
- </d:state>
- </d:device>
-
- <d:device>
- <d:name>
- 3.2in HVGA slider (ADP1)
- </d:name>
- <d:manufacturer>
- Generic
- </d:manufacturer>
- <d:hardware>
- <d:screen>
- <d:screen-size>normal</d:screen-size>
- <d:diagonal-length>3.2</d:diagonal-length>
- <d:pixel-density>mdpi</d:pixel-density>
- <d:screen-ratio>notlong</d:screen-ratio>
- <d:dimensions>
- <d:x-dimension>320</d:x-dimension>
- <d:y-dimension>480</d:y-dimension>
- </d:dimensions>
- <d:xdpi>180.6</d:xdpi>
- <d:ydpi>182</d:ydpi>
- <d:touch>
- <d:multitouch>distinct</d:multitouch>
- <d:mechanism>finger</d:mechanism>
- <d:screen-type>capacitive</d:screen-type>
- </d:touch>
- </d:screen>
- <d:networking>
- Bluetooth
- Wifi
- NFC
- </d:networking>
- <d:sensors>
- Accelerometer
- Barometer
- Gyroscope
- Compass
- GPS
- ProximitySensor
- </d:sensors>
- <d:mic>true</d:mic>
- <d:camera>
- <d:location>back</d:location>
- <d:autofocus>true</d:autofocus>
- <d:flash>true</d:flash>
- </d:camera>
- <d:keyboard>qwerty</d:keyboard>
- <d:nav>nonav</d:nav>
- <d:ram unit="MiB">512</d:ram>
- <d:buttons>hard</d:buttons>
- <d:internal-storage unit="GiB">8</d:internal-storage>
- <d:removable-storage unit="MiB"></d:removable-storage>
- <d:cpu>OMAP 9001</d:cpu>
- <d:gpu>Ultra Nexus 3D S++</d:gpu>
- <d:abi>
- armeabi
- armeabi-v7a
- mips
- x86
- </d:abi>
- <d:dock>
- car
- television
- desk
- </d:dock>
- <d:power-type>battery</d:power-type>
- </d:hardware>
-
- <d:software>
- <d:api-level>-</d:api-level>
- <d:live-wallpaper-support>true</d:live-wallpaper-support>
- <d:bluetooth-profiles />
- <d:gl-version>2.1</d:gl-version>
- <d:gl-extensions />
- <d:status-bar>true</d:status-bar>
- </d:software>
-
- <d:state name="Portrait" default="true">
- <d:description>The phone in portrait view</d:description>
- <d:screen-orientation>port</d:screen-orientation>
- <d:keyboard-state>keyshidden</d:keyboard-state>
- <d:nav-state>navhidden</d:nav-state>
- </d:state>
- <d:state name="Landscape, closed">
- <d:description>The phone in landscape view with the keyboard closed</d:description>
- <d:screen-orientation>land</d:screen-orientation>
- <d:keyboard-state>keyshidden</d:keyboard-state>
- <d:nav-state>navhidden</d:nav-state>
- </d:state>
- <d:state name="Landscape, open">
- <d:description>The phone in landscape view with the keyboard open</d:description>
- <d:screen-orientation>land</d:screen-orientation>
- <d:keyboard-state>keysexposed</d:keyboard-state>
- <d:nav-state>navexposed</d:nav-state>
- </d:state>
- </d:device>
-
- <d:device>
- <d:name>
- 3.2in QVGA (ADP2)
- </d:name>
- <d:manufacturer>
- Generic
- </d:manufacturer>
- <d:hardware>
- <d:screen>
- <d:screen-size>normal</d:screen-size>
- <d:diagonal-length>3.2</d:diagonal-length>
- <d:pixel-density>mdpi</d:pixel-density>
- <d:screen-ratio>notlong</d:screen-ratio>
- <d:dimensions>
- <d:x-dimension>320</d:x-dimension>
- <d:y-dimension>480</d:y-dimension>
- </d:dimensions>
- <d:xdpi>180.6</d:xdpi>
- <d:ydpi>182</d:ydpi>
- <d:touch>
- <d:multitouch>distinct</d:multitouch>
- <d:mechanism>finger</d:mechanism>
- <d:screen-type>capacitive</d:screen-type>
- </d:touch>
- </d:screen>
- <d:networking>
- Bluetooth
- Wifi
- NFC
- </d:networking>
- <d:sensors>
- Accelerometer
- Barometer
- Gyroscope
- Compass
- GPS
- ProximitySensor
- </d:sensors>
- <d:mic>true</d:mic>
- <d:camera>
- <d:location>back</d:location>
- <d:autofocus>true</d:autofocus>
- <d:flash>true</d:flash>
- </d:camera>
- <d:keyboard>nokeys</d:keyboard>
- <d:nav>trackball</d:nav>
- <d:ram unit="MiB">512</d:ram>
- <d:buttons>hard</d:buttons>
- <d:internal-storage unit="GiB">8</d:internal-storage>
- <d:removable-storage unit="MiB"></d:removable-storage>
- <d:cpu>OMAP 9001</d:cpu>
- <d:gpu>Ultra Nexus 3D S++</d:gpu>
- <d:abi>
- armeabi
- armeabi-v7a
- mips
- x86
- </d:abi>
- <d:dock>
- car
- television
- desk
- </d:dock>
- <d:power-type>battery</d:power-type>
- </d:hardware>
-
- <d:software>
- <d:api-level>-</d:api-level>
- <d:live-wallpaper-support>true</d:live-wallpaper-support>
- <d:bluetooth-profiles />
- <d:gl-version>2.1</d:gl-version>
- <d:gl-extensions />
- <d:status-bar>true</d:status-bar>
- </d:software>
-
- <d:state name="Portrait" default="true">
- <d:description>The phone in portrait view</d:description>
- <d:screen-orientation>port</d:screen-orientation>
- <d:keyboard-state>keyssoft</d:keyboard-state>
- <d:nav-state>navexposed</d:nav-state>
- </d:state>
- <d:state name="Landscape">
- <d:description>The phone in landscape view</d:description>
- <d:screen-orientation>land</d:screen-orientation>
- <d:keyboard-state>keyssoft</d:keyboard-state>
- <d:nav-state>navexposed</d:nav-state>
- </d:state>
- </d:device>
-
- <d:device>
- <d:name>
- 3.3in WQVGA
- </d:name>
- <d:manufacturer>
- Generic
- </d:manufacturer>
- <d:hardware>
- <d:screen>
- <d:screen-size>normal</d:screen-size>
- <d:diagonal-length>3.3</d:diagonal-length>
- <d:pixel-density>ldpi</d:pixel-density>
- <d:screen-ratio>long</d:screen-ratio>
- <d:dimensions>
- <d:x-dimension>240</d:x-dimension>
- <d:y-dimension>400</d:y-dimension>
- </d:dimensions>
- <d:xdpi>141</d:xdpi>
- <d:ydpi>141</d:ydpi>
- <d:touch>
- <d:multitouch>distinct</d:multitouch>
- <d:mechanism>finger</d:mechanism>
- <d:screen-type>capacitive</d:screen-type>
- </d:touch>
- </d:screen>
- <d:networking>
- Bluetooth
- Wifi
- NFC
- </d:networking>
- <d:sensors>
- Accelerometer
- Barometer
- Gyroscope
- Compass
- GPS
- ProximitySensor
- </d:sensors>
- <d:mic>true</d:mic>
- <d:camera>
- <d:location>back</d:location>
- <d:autofocus>true</d:autofocus>
- <d:flash>true</d:flash>
- </d:camera>
- <d:keyboard>nokeys</d:keyboard>
- <d:nav>nonav</d:nav>
- <d:ram unit="MiB">512</d:ram>
- <d:buttons>hard</d:buttons>
- <d:internal-storage unit="GiB">8</d:internal-storage>
- <d:removable-storage unit="MiB"></d:removable-storage>
- <d:cpu>OMAP 9001</d:cpu>
- <d:gpu>Ultra Nexus 3D S++</d:gpu>
- <d:abi>
- armeabi
- armeabi-v7a
- mips
- x86
- </d:abi>
- <d:dock>
- car
- television
- desk
- </d:dock>
- <d:power-type>battery</d:power-type>
- </d:hardware>
-
- <d:software>
- <d:api-level>-</d:api-level>
- <d:live-wallpaper-support>true</d:live-wallpaper-support>
- <d:bluetooth-profiles />
- <d:gl-version>2.1</d:gl-version>
- <d:gl-extensions />
- <d:status-bar>true</d:status-bar>
- </d:software>
-
- <d:state name="Portrait" default="true">
- <d:description>The phone in portrait view</d:description>
- <d:screen-orientation>port</d:screen-orientation>
- <d:keyboard-state>keyssoft</d:keyboard-state>
- <d:nav-state>navhidden</d:nav-state>
- </d:state>
- <d:state name="Landscape">
- <d:description>The phone in landscape view</d:description>
- <d:screen-orientation>land</d:screen-orientation>
- <d:keyboard-state>keyssoft</d:keyboard-state>
- <d:nav-state>navhidden</d:nav-state>
- </d:state>
- </d:device>
- <d:device>
- <d:name>
- 3.4in WQVGA
- </d:name>
- <d:manufacturer>
- Generic
- </d:manufacturer>
- <d:hardware>
- <d:screen>
- <d:screen-size>normal</d:screen-size>
- <d:diagonal-length>3.4</d:diagonal-length>
- <d:pixel-density>ldpi</d:pixel-density>
- <d:screen-ratio>long</d:screen-ratio>
- <d:dimensions>
- <d:x-dimension>240</d:x-dimension>
- <d:y-dimension>432</d:y-dimension>
- </d:dimensions>
- <d:xdpi>145</d:xdpi>
- <d:ydpi>145</d:ydpi>
- <d:touch>
- <d:multitouch>distinct</d:multitouch>
- <d:mechanism>finger</d:mechanism>
- <d:screen-type>capacitive</d:screen-type>
- </d:touch>
- </d:screen>
- <d:networking>
- Bluetooth
- Wifi
- NFC
- </d:networking>
- <d:sensors>
- Accelerometer
- Barometer
- Gyroscope
- Compass
- GPS
- ProximitySensor
- </d:sensors>
- <d:mic>true</d:mic>
- <d:camera>
- <d:location>back</d:location>
- <d:autofocus>true</d:autofocus>
- <d:flash>true</d:flash>
- </d:camera>
- <d:keyboard>nokeys</d:keyboard>
- <d:nav>nonav</d:nav>
- <d:ram unit="MiB">512</d:ram>
- <d:buttons>hard</d:buttons>
- <d:internal-storage unit="GiB">8</d:internal-storage>
- <d:removable-storage unit="MiB"></d:removable-storage>
- <d:cpu>OMAP 9001</d:cpu>
- <d:gpu>Ultra Nexus 3D S++</d:gpu>
- <d:abi>
- armeabi
- armeabi-v7a
- mips
- x86
- </d:abi>
- <d:dock>
- car
- television
- desk
- </d:dock>
- <d:power-type>battery</d:power-type>
- </d:hardware>
-
- <d:software>
- <d:api-level>-</d:api-level>
- <d:live-wallpaper-support>true</d:live-wallpaper-support>
- <d:bluetooth-profiles />
- <d:gl-version>2.1</d:gl-version>
- <d:gl-extensions />
- <d:status-bar>true</d:status-bar>
- </d:software>
-
- <d:state name="Portrait" default="true">
- <d:description>The phone in portrait view</d:description>
- <d:screen-orientation>port</d:screen-orientation>
- <d:keyboard-state>keyssoft</d:keyboard-state>
- <d:nav-state>navhidden</d:nav-state>
- </d:state>
- <d:state name="Landscape">
- <d:description>The phone in landscape view</d:description>
- <d:screen-orientation>land</d:screen-orientation>
- <d:keyboard-state>keyssoft</d:keyboard-state>
- <d:nav-state>navhidden</d:nav-state>
- </d:state>
- </d:device>
-
- <d:device>
- <d:name>
- 3.7in WVGA (Nexus One)
- </d:name>
- <d:manufacturer>
- Generic
- </d:manufacturer>
- <d:hardware>
- <d:screen>
- <d:screen-size>normal</d:screen-size>
- <d:diagonal-length>3.4</d:diagonal-length>
- <d:pixel-density>hdpi</d:pixel-density>
- <d:screen-ratio>long</d:screen-ratio>
- <d:dimensions>
- <d:x-dimension>480</d:x-dimension>
- <d:y-dimension>800</d:y-dimension>
- </d:dimensions>
- <d:xdpi>254</d:xdpi>
- <d:ydpi>254</d:ydpi>
- <d:touch>
- <d:multitouch>distinct</d:multitouch>
- <d:mechanism>finger</d:mechanism>
- <d:screen-type>capacitive</d:screen-type>
- </d:touch>
- </d:screen>
- <d:networking>
- Bluetooth
- Wifi
- NFC
- </d:networking>
- <d:sensors>
- Accelerometer
- Barometer
- Gyroscope
- Compass
- GPS
- ProximitySensor
- </d:sensors>
- <d:mic>true</d:mic>
- <d:camera>
- <d:location>back</d:location>
- <d:autofocus>true</d:autofocus>
- <d:flash>true</d:flash>
- </d:camera>
- <d:keyboard>nokeys</d:keyboard>
- <d:nav>trackball</d:nav>
- <d:ram unit="MiB">512</d:ram>
- <d:buttons>hard</d:buttons>
- <d:internal-storage unit="GiB">8</d:internal-storage>
- <d:removable-storage unit="MiB"></d:removable-storage>
- <d:cpu>OMAP 9001</d:cpu>
- <d:gpu>Ultra Nexus 3D S++</d:gpu>
- <d:abi>
- armeabi
- armeabi-v7a
- mips
- x86
- </d:abi>
- <d:dock>
- car
- television
- desk
- </d:dock>
- <d:power-type>battery</d:power-type>
- </d:hardware>
-
- <d:software>
- <d:api-level>-</d:api-level>
- <d:live-wallpaper-support>true</d:live-wallpaper-support>
- <d:bluetooth-profiles />
- <d:gl-version>2.1</d:gl-version>
- <d:gl-extensions />
- <d:status-bar>true</d:status-bar>
- </d:software>
-
- <d:state name="Portrait" default="true">
- <d:description>The phone in portrait view</d:description>
- <d:screen-orientation>port</d:screen-orientation>
- <d:keyboard-state>keyssoft</d:keyboard-state>
- <d:nav-state>navexposed</d:nav-state>
- </d:state>
- <d:state name="Landscape">
- <d:description>The phone in landscape view</d:description>
- <d:screen-orientation>land</d:screen-orientation>
- <d:keyboard-state>keyssoft</d:keyboard-state>
- <d:nav-state>navexposed</d:nav-state>
- </d:state>
- </d:device>
-
- <d:device>
- <d:name>
- 3.7 FWVGA slider
- </d:name>
- <d:manufacturer>
- Generic
- </d:manufacturer>
- <d:hardware>
- <d:screen>
- <d:screen-size>normal</d:screen-size>
- <d:diagonal-length>3.7</d:diagonal-length>
- <d:pixel-density>hdpi</d:pixel-density>
- <d:screen-ratio>long</d:screen-ratio>
- <d:dimensions>
- <d:x-dimension>480</d:x-dimension>
- <d:y-dimension>854</d:y-dimension>
- </d:dimensions>
- <d:xdpi>265</d:xdpi>
- <d:ydpi>265</d:ydpi>
- <d:touch>
- <d:multitouch>distinct</d:multitouch>
- <d:mechanism>finger</d:mechanism>
- <d:screen-type>capacitive</d:screen-type>
- </d:touch>
- </d:screen>
- <d:networking>
- Bluetooth
- Wifi
- NFC
- </d:networking>
- <d:sensors>
- Accelerometer
- Barometer
- Gyroscope
- Compass
- GPS
- ProximitySensor
- </d:sensors>
- <d:mic>true</d:mic>
- <d:camera>
- <d:location>back</d:location>
- <d:autofocus>true</d:autofocus>
- <d:flash>true</d:flash>
- </d:camera>
- <d:keyboard>qwerty</d:keyboard>
- <d:nav>nonav</d:nav>
- <d:ram unit="MiB">512</d:ram>
- <d:buttons>hard</d:buttons>
- <d:internal-storage unit="GiB">8</d:internal-storage>
- <d:removable-storage unit="MiB"></d:removable-storage>
- <d:cpu>OMAP 9001</d:cpu>
- <d:gpu>Ultra Nexus 3D S++</d:gpu>
- <d:abi>
- armeabi
- armeabi-v7a
- mips
- x86
- </d:abi>
- <d:dock>
- car
- television
- desk
- </d:dock>
- <d:power-type>battery</d:power-type>
- </d:hardware>
-
- <d:software>
- <d:api-level>-</d:api-level>
- <d:live-wallpaper-support>true</d:live-wallpaper-support>
- <d:bluetooth-profiles />
- <d:gl-version>2.1</d:gl-version>
- <d:gl-extensions />
- <d:status-bar>true</d:status-bar>
- </d:software>
-
- <d:state name="Portrait" default="true">
- <d:description>The phone in portrait view</d:description>
- <d:screen-orientation>port</d:screen-orientation>
- <d:keyboard-state>keyshidden</d:keyboard-state>
- <d:nav-state>navhidden</d:nav-state>
- </d:state>
- <d:state name="Landscape, closed">
- <d:description>The phone in landscape view with the keyboard closed</d:description>
- <d:screen-orientation>land</d:screen-orientation>
- <d:keyboard-state>keyshidden</d:keyboard-state>
- <d:nav-state>navhidden</d:nav-state>
- </d:state>
- <d:state name="Landscape, open">
- <d:description>The phone in landscape view with the keyboard open</d:description>
- <d:screen-orientation>land</d:screen-orientation>
- <d:keyboard-state>keysexposed</d:keyboard-state>
- <d:nav-state>navexposed</d:nav-state>
- </d:state>
- </d:device>
-
- <d:device>
- <d:name>
- 4in WVGA (Nexus S)
- </d:name>
- <d:manufacturer>
- Generic
- </d:manufacturer>
- <d:hardware>
- <d:screen>
- <d:screen-size>normal</d:screen-size>
- <d:diagonal-length>4.0</d:diagonal-length>
- <d:pixel-density>hdpi</d:pixel-density>
- <d:screen-ratio>long</d:screen-ratio>
- <d:dimensions>
- <d:x-dimension>480</d:x-dimension>
- <d:y-dimension>800</d:y-dimension>
- </d:dimensions>
- <d:xdpi>235</d:xdpi>
- <d:ydpi>235</d:ydpi>
- <d:touch>
- <d:multitouch>distinct</d:multitouch>
- <d:mechanism>finger</d:mechanism>
- <d:screen-type>capacitive</d:screen-type>
- </d:touch>
- </d:screen>
- <d:networking>
- Bluetooth
- Wifi
- NFC
- </d:networking>
- <d:sensors>
- Accelerometer
- Barometer
- Gyroscope
- Compass
- GPS
- ProximitySensor
- </d:sensors>
- <d:mic>true</d:mic>
- <d:camera>
- <d:location>back</d:location>
- <d:autofocus>true</d:autofocus>
- <d:flash>true</d:flash>
- </d:camera>
- <d:keyboard>nokeys</d:keyboard>
- <d:nav>nonav</d:nav>
- <d:ram unit="MiB">512</d:ram>
- <d:buttons>hard</d:buttons>
- <d:internal-storage unit="GiB">8</d:internal-storage>
- <d:removable-storage unit="MiB"></d:removable-storage>
- <d:cpu>OMAP 9001</d:cpu>
- <d:gpu>Ultra Nexus 3D S++</d:gpu>
- <d:abi>
- armeabi
- armeabi-v7a
- mips
- x86
- </d:abi>
- <d:dock>
- car
- television
- desk
- </d:dock>
- <d:power-type>battery</d:power-type>
- </d:hardware>
-
- <d:software>
- <d:api-level>-</d:api-level>
- <d:live-wallpaper-support>true</d:live-wallpaper-support>
- <d:bluetooth-profiles />
- <d:gl-version>2.1</d:gl-version>
- <d:gl-extensions />
- <d:status-bar>true</d:status-bar>
- </d:software>
-
- <d:state name="Portrait" default="true">
- <d:description>The phone in portrait view</d:description>
- <d:screen-orientation>port</d:screen-orientation>
- <d:keyboard-state>keyssoft</d:keyboard-state>
- <d:nav-state>navhidden</d:nav-state>
- </d:state>
- <d:state name="Landscape">
- <d:description>The phone in landscape view</d:description>
- <d:screen-orientation>land</d:screen-orientation>
- <d:keyboard-state>keyssoft</d:keyboard-state>
- <d:nav-state>navhidden</d:nav-state>
- </d:state>
- </d:device>
-
- <d:device>
- <d:name>
- 4.65in 720p (Galaxy Nexus)
- </d:name>
- <d:manufacturer>
- Generic
- </d:manufacturer>
- <d:hardware>
- <d:screen>
- <d:screen-size>normal</d:screen-size>
- <d:diagonal-length>4.65</d:diagonal-length> <!-- In inches -->
- <d:pixel-density>xhdpi</d:pixel-density>
- <d:screen-ratio>long</d:screen-ratio>
- <d:dimensions>
- <d:x-dimension>720</d:x-dimension>
- <d:y-dimension>1280</d:y-dimension>
- </d:dimensions>
- <d:xdpi>316</d:xdpi>
- <d:ydpi>316</d:ydpi>
- <d:touch>
- <d:multitouch>jazz-hands</d:multitouch>
- <d:mechanism>finger</d:mechanism>
- <d:screen-type>capacitive</d:screen-type>
- </d:touch>
- </d:screen>
- <d:networking>
- Bluetooth
- Wifi
- NFC
- </d:networking>
- <d:sensors>
- Accelerometer
- Barometer
- Gyroscope
- Compass
- GPS
- ProximitySensor
- </d:sensors>
- <d:mic>true</d:mic>
- <d:camera>
- <d:location>front</d:location>
- <d:autofocus>true</d:autofocus>
- <d:flash>false</d:flash>
- </d:camera>
- <d:camera>
- <d:location>back</d:location>
- <d:autofocus>true</d:autofocus>
- <d:flash>true</d:flash>
- </d:camera>
- <d:keyboard>nokeys</d:keyboard>
- <d:nav>nonav</d:nav>
- <d:ram unit="GiB">1</d:ram>
- <d:buttons>soft</d:buttons>
- <d:internal-storage unit="GiB">16</d:internal-storage>
- <d:removable-storage unit="KiB"></d:removable-storage>
- <d:cpu>OMAP 4460</d:cpu> <!-- cpu type (Tegra3) freeform -->
- <d:gpu>PowerVR SGX540</d:gpu>
- <d:abi>
- armeabi
- armeabi-v7a
- </d:abi>
- <!--dock (car, desk, tv, none)-->
- <d:dock>
- car
- desk
- </d:dock>
- <!-- plugged in (never, charge, always) -->
- <d:power-type>battery</d:power-type>
- </d:hardware>
- <d:software>
- <d:api-level>14-</d:api-level>
- <d:live-wallpaper-support>true</d:live-wallpaper-support>
- <d:bluetooth-profiles>
- HSP
- HFP
- SPP
- A2DP
- AVRCP
- OPP
- PBAP
- GAVDP
- AVDTP
- HID
- HDP
- PAN
- </d:bluetooth-profiles>
- <d:gl-version>2.0</d:gl-version>
- <!--
- These can be gotten via
- javax.microedition.khronos.opengles.GL10.glGetString(GL10.GL_EXTENSIONS);
- -->
- <d:gl-extensions>
- GL_EXT_discard_framebuffer
- GL_EXT_multi_draw_arrays
- GL_EXT_shader_texture_lod
- GL_EXT_texture_format_BGRA8888
- GL_IMG_multisampled_render_to_texture
- GL_IMG_program_binary
- GL_IMG_read_format
- GL_IMG_shader_binary
- GL_IMG_texture_compression_pvrtc
- GL_IMG_texture_format_BGRA8888
- GL_IMG_texture_npot
- GL_OES_compressed_ETC1_RGB8_texture
- GL_OES_depth_texture
- GL_OES_depth24
- GL_OES_EGL_image
- GL_OES_EGL_image_external
- GL_OES_egl_sync
- GL_OES_element_index_uint
- GL_OES_fragment_precision_high
- GL_OES_get_program_binary
- GL_OES_mapbuffer
- GL_OES_packed_depth_stencil
- GL_OES_required_internalformat
- GL_OES_rgb8_rgba8
- GL_OES_standard_derivatives
- GL_OES_texture_float
- GL_OES_texture_half_float
- GL_OES_vertex_array_object
- GL_OES_vertex_half_float
- </d:gl-extensions>
- <d:status-bar>true</d:status-bar>
- </d:software>
- <d:state name="Portrait" default="true">
- <d:description>The phone in portrait view</d:description>
- <d:screen-orientation>port</d:screen-orientation>
- <d:keyboard-state>keyssoft</d:keyboard-state>
- <d:nav-state>nonav</d:nav-state>
- </d:state>
- <d:state name="Landscape">
- <d:description>The phone in landscape view</d:description>
- <d:screen-orientation>land</d:screen-orientation>
- <d:keyboard-state>keyssoft</d:keyboard-state>
- <d:nav-state>nonav</d:nav-state>
- </d:state>
- </d:device>
-
- <d:device>
- <d:name>
- 4.7in WXGA
- </d:name>
- <d:manufacturer>
- Generic
- </d:manufacturer>
- <d:hardware>
- <d:screen>
- <d:screen-size>normal</d:screen-size>
- <d:diagonal-length>4.7</d:diagonal-length>
- <d:pixel-density>xhdpi</d:pixel-density>
- <d:screen-ratio>long</d:screen-ratio>
- <d:dimensions>
- <d:x-dimension>1280</d:x-dimension>
- <d:y-dimension>720</d:y-dimension>
- </d:dimensions>
- <d:xdpi>320</d:xdpi>
- <d:ydpi>320</d:ydpi>
- <d:touch>
- <d:multitouch>distinct</d:multitouch>
- <d:mechanism>finger</d:mechanism>
- <d:screen-type>capacitive</d:screen-type>
- </d:touch>
- </d:screen>
- <d:networking>
- Bluetooth
- Wifi
- NFC
- </d:networking>
- <d:sensors>
- Accelerometer
- Barometer
- Gyroscope
- Compass
- GPS
- ProximitySensor
- </d:sensors>
- <d:mic>true</d:mic>
- <d:camera>
- <d:location>back</d:location>
- <d:autofocus>true</d:autofocus>
- <d:flash>true</d:flash>
- </d:camera>
- <d:keyboard>nokeys</d:keyboard>
- <d:nav>nonav</d:nav>
- <d:ram unit="MiB">512</d:ram>
- <d:buttons>hard</d:buttons>
- <d:internal-storage unit="GiB">8</d:internal-storage>
- <d:removable-storage unit="MiB"></d:removable-storage>
- <d:cpu>OMAP 9001</d:cpu>
- <d:gpu>Ultra Nexus 3D S++</d:gpu>
- <d:abi>
- armeabi
- armeabi-v7a
- mips
- x86
- </d:abi>
- <d:dock>
- car
- television
- desk
- </d:dock>
- <d:power-type>battery</d:power-type>
- </d:hardware>
-
- <d:software>
- <d:api-level>-</d:api-level>
- <d:live-wallpaper-support>true</d:live-wallpaper-support>
- <d:bluetooth-profiles />
- <d:gl-version>2.1</d:gl-version>
- <d:gl-extensions />
- <d:status-bar>true</d:status-bar>
- </d:software>
-
- <d:state name="Portrait" default="true">
- <d:description>The phone in portrait view</d:description>
- <d:screen-orientation>port</d:screen-orientation>
- <d:keyboard-state>keyssoft</d:keyboard-state>
- <d:nav-state>navhidden</d:nav-state>
- </d:state>
- <d:state name="Landscape">
- <d:description>The phone in landscape view</d:description>
- <d:screen-orientation>land</d:screen-orientation>
- <d:keyboard-state>keyssoft</d:keyboard-state>
- <d:nav-state>navhidden</d:nav-state>
- </d:state>
- </d:device>
-
- <d:device>
- <d:name>
- 5.1in WVGA
- </d:name>
- <d:manufacturer>
- Generic
- </d:manufacturer>
- <d:hardware>
- <d:screen>
- <d:screen-size>large</d:screen-size>
- <d:diagonal-length>5.1</d:diagonal-length>
- <d:pixel-density>mdpi</d:pixel-density>
- <d:screen-ratio>long</d:screen-ratio>
- <d:dimensions>
- <d:x-dimension>480</d:x-dimension>
- <d:y-dimension>800</d:y-dimension>
- </d:dimensions>
- <d:xdpi>183</d:xdpi>
- <d:ydpi>183</d:ydpi>
- <d:touch>
- <d:multitouch>distinct</d:multitouch>
- <d:mechanism>finger</d:mechanism>
- <d:screen-type>capacitive</d:screen-type>
- </d:touch>
- </d:screen>
- <d:networking>
- Bluetooth
- Wifi
- NFC
- </d:networking>
- <d:sensors>
- Accelerometer
- Barometer
- Gyroscope
- Compass
- GPS
- ProximitySensor
- </d:sensors>
- <d:mic>true</d:mic>
- <d:camera>
- <d:location>back</d:location>
- <d:autofocus>true</d:autofocus>
- <d:flash>true</d:flash>
- </d:camera>
- <d:keyboard>nokeys</d:keyboard>
- <d:nav>nonav</d:nav>
- <d:ram unit="MiB">512</d:ram>
- <d:buttons>hard</d:buttons>
- <d:internal-storage unit="GiB">8</d:internal-storage>
- <d:removable-storage unit="MiB"></d:removable-storage>
- <d:cpu>OMAP 9001</d:cpu>
- <d:gpu>Ultra Nexus 3D S++</d:gpu>
- <d:abi>
- armeabi
- armeabi-v7a
- mips
- x86
- </d:abi>
- <d:dock>
- car
- television
- desk
- </d:dock>
- <d:power-type>battery</d:power-type>
- </d:hardware>
-
- <d:software>
- <d:api-level>-</d:api-level>
- <d:live-wallpaper-support>true</d:live-wallpaper-support>
- <d:bluetooth-profiles />
- <d:gl-version>2.1</d:gl-version>
- <d:gl-extensions />
- <d:status-bar>true</d:status-bar>
- </d:software>
-
- <d:state name="Portrait" default="true">
- <d:description>The phone in portrait view</d:description>
- <d:screen-orientation>port</d:screen-orientation>
- <d:keyboard-state>keyssoft</d:keyboard-state>
- <d:nav-state>navhidden</d:nav-state>
- </d:state>
- <d:state name="Landscape">
- <d:description>The phone in landscape view</d:description>
- <d:screen-orientation>land</d:screen-orientation>
- <d:keyboard-state>keyssoft</d:keyboard-state>
- <d:nav-state>navhidden</d:nav-state>
- </d:state>
- </d:device>
-
- <d:device>
- <d:name>
- 5.4in FWVGA
- </d:name>
- <d:manufacturer>
- Generic
- </d:manufacturer>
- <d:hardware>
- <d:screen>
- <d:screen-size>large</d:screen-size>
- <d:diagonal-length>5.4</d:diagonal-length>
- <d:pixel-density>mdpi</d:pixel-density>
- <d:screen-ratio>long</d:screen-ratio>
- <d:dimensions>
- <d:x-dimension>480</d:x-dimension>
- <d:y-dimension>854</d:y-dimension>
- </d:dimensions>
- <d:xdpi>181</d:xdpi>
- <d:ydpi>181</d:ydpi>
- <d:touch>
- <d:multitouch>distinct</d:multitouch>
- <d:mechanism>finger</d:mechanism>
- <d:screen-type>capacitive</d:screen-type>
- </d:touch>
- </d:screen>
- <d:networking>
- Bluetooth
- Wifi
- NFC
- </d:networking>
- <d:sensors>
- Accelerometer
- Barometer
- Gyroscope
- Compass
- GPS
- ProximitySensor
- </d:sensors>
- <d:mic>true</d:mic>
- <d:camera>
- <d:location>back</d:location>
- <d:autofocus>true</d:autofocus>
- <d:flash>true</d:flash>
- </d:camera>
- <d:keyboard>nokeys</d:keyboard>
- <d:nav>nonav</d:nav>
- <d:ram unit="MiB">512</d:ram>
- <d:buttons>hard</d:buttons>
- <d:internal-storage unit="GiB">8</d:internal-storage>
- <d:removable-storage unit="MiB"></d:removable-storage>
- <d:cpu>OMAP 9001</d:cpu>
- <d:gpu>Ultra Nexus 3D S++</d:gpu>
- <d:abi>
- armeabi
- armeabi-v7a
- mips
- x86
- </d:abi>
- <d:dock>
- car
- television
- desk
- </d:dock>
- <d:power-type>battery</d:power-type>
- </d:hardware>
-
- <d:software>
- <d:api-level>-</d:api-level>
- <d:live-wallpaper-support>true</d:live-wallpaper-support>
- <d:bluetooth-profiles />
- <d:gl-version>2.1</d:gl-version>
- <d:gl-extensions />
- <d:status-bar>true</d:status-bar>
- </d:software>
-
- <d:state name="Portrait" default="true">
- <d:description>The phone in portrait view</d:description>
- <d:screen-orientation>port</d:screen-orientation>
- <d:keyboard-state>keyssoft</d:keyboard-state>
- <d:nav-state>navhidden</d:nav-state>
- </d:state>
- <d:state name="Landscape">
- <d:description>The phone in landscape view</d:description>
- <d:screen-orientation>land</d:screen-orientation>
- <d:keyboard-state>keyssoft</d:keyboard-state>
- <d:nav-state>navhidden</d:nav-state>
- </d:state>
- </d:device>
-
- <d:device>
- <d:name>
- 7in WSVGA (Tablet)
- </d:name>
- <d:manufacturer>
- Generic
- </d:manufacturer>
- <d:hardware>
- <d:screen>
- <d:screen-size>large</d:screen-size>
- <d:diagonal-length>7.0</d:diagonal-length>
- <d:pixel-density>mdpi</d:pixel-density>
- <d:screen-ratio>long</d:screen-ratio>
- <d:dimensions>
- <d:x-dimension>1024</d:x-dimension>
- <d:y-dimension>600</d:y-dimension>
- </d:dimensions>
- <d:xdpi>169</d:xdpi>
- <d:ydpi>169</d:ydpi>
- <d:touch>
- <d:multitouch>distinct</d:multitouch>
- <d:mechanism>finger</d:mechanism>
- <d:screen-type>capacitive</d:screen-type>
- </d:touch>
- </d:screen>
- <d:networking>
- Bluetooth
- Wifi
- NFC
- </d:networking>
- <d:sensors>
- Accelerometer
- Barometer
- Gyroscope
- Compass
- GPS
- ProximitySensor
- </d:sensors>
- <d:mic>true</d:mic>
- <d:camera>
- <d:location>front</d:location>
- <d:autofocus>true</d:autofocus>
- <d:flash>true</d:flash>
- </d:camera>
- <d:keyboard>nokeys</d:keyboard>
- <d:nav>nonav</d:nav>
- <d:ram unit="MiB">512</d:ram>
- <d:buttons>soft</d:buttons>
- <d:internal-storage unit="GiB">8</d:internal-storage>
- <d:removable-storage unit="MiB"></d:removable-storage>
- <d:cpu>OMAP 9001</d:cpu>
- <d:gpu>Ultra Nexus 3D S++</d:gpu>
- <d:abi>
- armeabi
- armeabi-v7a
- mips
- x86
- </d:abi>
- <d:dock>
- car
- television
- desk
- </d:dock>
- <d:power-type>battery</d:power-type>
- </d:hardware>
-
- <d:software>
- <d:api-level>-</d:api-level>
- <d:live-wallpaper-support>true</d:live-wallpaper-support>
- <d:bluetooth-profiles />
- <d:gl-version>2.1</d:gl-version>
- <d:gl-extensions />
- <d:status-bar>true</d:status-bar>
- </d:software>
-
- <d:state name="Portrait" default="true">
- <d:description>The phone in portrait view</d:description>
- <d:screen-orientation>port</d:screen-orientation>
- <d:keyboard-state>keyssoft</d:keyboard-state>
- <d:nav-state>navhidden</d:nav-state>
- </d:state>
- <d:state name="Landscape">
- <d:description>The phone in landscape view</d:description>
- <d:screen-orientation>land</d:screen-orientation>
- <d:keyboard-state>keyssoft</d:keyboard-state>
- <d:nav-state>navhidden</d:nav-state>
- </d:state>
- </d:device>
-
-
- <d:device>
- <d:name>
- 10.1in WXGA (Tablet)
- </d:name>
- <d:manufacturer>
- Generic
- </d:manufacturer>
- <d:hardware>
- <d:screen>
- <d:screen-size>xlarge</d:screen-size>
- <d:diagonal-length>10.1</d:diagonal-length>
- <d:pixel-density>mdpi</d:pixel-density>
- <d:screen-ratio>long</d:screen-ratio>
- <d:dimensions>
- <d:x-dimension>1280</d:x-dimension>
- <d:y-dimension>800</d:y-dimension>
- </d:dimensions>
- <d:xdpi>149</d:xdpi>
- <d:ydpi>149</d:ydpi>
- <d:touch>
- <d:multitouch>distinct</d:multitouch>
- <d:mechanism>finger</d:mechanism>
- <d:screen-type>capacitive</d:screen-type>
- </d:touch>
- </d:screen>
- <d:networking>
- Bluetooth
- Wifi
- NFC
- </d:networking>
- <d:sensors>
- Accelerometer
- Barometer
- Gyroscope
- Compass
- GPS
- ProximitySensor
- </d:sensors>
- <d:mic>true</d:mic>
- <d:camera>
- <d:location>front</d:location>
- <d:autofocus>true</d:autofocus>
- <d:flash>true</d:flash>
- </d:camera>
- <d:camera>
- <d:location>back</d:location>
- <d:autofocus>true</d:autofocus>
- <d:flash>true</d:flash>
- </d:camera>
- <d:keyboard>nokeys</d:keyboard>
- <d:nav>nonav</d:nav>
- <d:ram unit="MiB">512</d:ram>
- <d:buttons>soft</d:buttons>
- <d:internal-storage unit="GiB">8</d:internal-storage>
- <d:removable-storage unit="MiB"></d:removable-storage>
- <d:cpu>OMAP 9001</d:cpu>
- <d:gpu>Ultra Nexus 3D S++</d:gpu>
- <d:abi>
- armeabi
- armeabi-v7a
- mips
- x86
- </d:abi>
- <d:dock>
- car
- television
- desk
- </d:dock>
- <d:power-type>battery</d:power-type>
- </d:hardware>
-
- <d:software>
- <d:api-level>-</d:api-level>
- <d:live-wallpaper-support>true</d:live-wallpaper-support>
- <d:bluetooth-profiles />
- <d:gl-version>2.1</d:gl-version>
- <d:gl-extensions />
- <d:status-bar>true</d:status-bar>
- </d:software>
-
- <d:state name="Portrait" default="true">
- <d:description>The phone in portrait view</d:description>
- <d:screen-orientation>port</d:screen-orientation>
- <d:keyboard-state>keyssoft</d:keyboard-state>
- <d:nav-state>navhidden</d:nav-state>
- </d:state>
- <d:state name="Landscape">
- <d:description>The phone in landscape view</d:description>
- <d:screen-orientation>land</d:screen-orientation>
- <d:keyboard-state>keyssoft</d:keyboard-state>
- <d:nav-state>navhidden</d:nav-state>
- </d:state>
- </d:device>
-</d:devices>
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/avd/AvdInfo.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/avd/AvdInfo.java
deleted file mode 100755
index 83aa2ef..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/avd/AvdInfo.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.avd;
-
-import com.android.SdkConstants;
-import com.android.prefs.AndroidLocation.AndroidLocationException;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.devices.Device;
-
-import java.io.File;
-import java.util.Collections;
-import java.util.Map;
-
-/**
- * An immutable structure describing an Android Virtual Device.
- */
-public final class AvdInfo implements Comparable<AvdInfo> {
-
- /**
- * Status for an {@link AvdInfo}. Indicates whether or not this AVD is valid.
- */
- public static enum AvdStatus {
- /** No error */
- OK,
- /** Missing 'path' property in the ini file */
- ERROR_PATH,
- /** Missing config.ini file in the AVD data folder */
- ERROR_CONFIG,
- /** Missing 'target' property in the ini file */
- ERROR_TARGET_HASH,
- /** Target was not resolved from its hash */
- ERROR_TARGET,
- /** Unable to parse config.ini */
- ERROR_PROPERTIES,
- /** System Image folder in config.ini doesn't exist */
- ERROR_IMAGE_DIR,
- /** The {@link Device} this AVD is based on has changed from its original configuration*/
- ERROR_DEVICE_CHANGED,
- /** The {@link Device} this AVD is based on is no longer available */
- ERROR_DEVICE_MISSING;
- }
-
- private final String mName;
- private final File mIniFile;
- private final String mFolderPath;
- private final String mTargetHash;
- private final IAndroidTarget mTarget;
- private final String mAbiType;
- /** An immutable map of properties. This must not be modified. Map can be empty. Never null. */
- private final Map<String, String> mProperties;
- private final AvdStatus mStatus;
-
- /**
- * Creates a new valid AVD info. Values are immutable.
- * <p/>
- * Such an AVD is available and can be used.
- * The error string is set to null.
- *
- * @param name The name of the AVD (for display or reference)
- * @param iniFile The path to the config.ini file
- * @param folderPath The path to the data directory
- * @param targetHash the target hash
- * @param target The target. Can be null, if the target was not resolved.
- * @param abiType Name of the abi.
- * @param properties The property map. If null, an empty map will be created.
- */
- public AvdInfo(String name,
- File iniFile,
- String folderPath,
- String targetHash,
- IAndroidTarget target,
- String abiType,
- Map<String, String> properties) {
- this(name, iniFile, folderPath, targetHash, target, abiType, properties, AvdStatus.OK);
- }
-
- /**
- * Creates a new <em>invalid</em> AVD info. Values are immutable.
- * <p/>
- * Such an AVD is not complete and cannot be used.
- * The error string must be non-null.
- *
- * @param name The name of the AVD (for display or reference)
- * @param iniFile The path to the config.ini file
- * @param folderPath The path to the data directory
- * @param targetHash the target hash
- * @param target The target. Can be null, if the target was not resolved.
- * @param abiType Name of the abi.
- * @param properties The property map. If null, an empty map will be created.
- * @param status The {@link AvdStatus} of this AVD. Cannot be null.
- */
- public AvdInfo(String name,
- File iniFile,
- String folderPath,
- String targetHash,
- IAndroidTarget target,
- String abiType,
- Map<String, String> properties,
- AvdStatus status) {
- mName = name;
- mIniFile = iniFile;
- mFolderPath = folderPath;
- mTargetHash = targetHash;
- mTarget = target;
- mAbiType = abiType;
- mProperties = properties == null ? Collections.<String, String>emptyMap()
- : Collections.unmodifiableMap(properties);
- mStatus = status;
- }
-
- /** Returns the name of the AVD. */
- public String getName() {
- return mName;
- }
-
- /** Returns the path of the AVD data directory. */
- public String getDataFolderPath() {
- return mFolderPath;
- }
-
- /** Returns the processor type of the AVD. */
- public String getAbiType() {
- return mAbiType;
- }
-
- public String getCpuArch() {
- String cpuArch = mProperties.get(AvdManager.AVD_INI_CPU_ARCH);
- if (cpuArch != null) {
- return cpuArch;
- }
-
- // legacy
- return SdkConstants.CPU_ARCH_ARM;
- }
-
- public String getDeviceManufacturer() {
- String deviceManufacturer = mProperties.get(AvdManager.AVD_INI_DEVICE_MANUFACTURER);
- if (deviceManufacturer != null && !deviceManufacturer.isEmpty()) {
- return deviceManufacturer;
- }
-
- return "";
- }
-
- public String getDeviceName() {
- String deviceName = mProperties.get(AvdManager.AVD_INI_DEVICE_NAME);
- if (deviceName != null && !deviceName.isEmpty()) {
- return deviceName;
- }
-
- return "";
- }
-
- /** Convenience function to return a more user friendly name of the abi type. */
- public static String getPrettyAbiType(String raw) {
- String s = null;
- if (raw.equalsIgnoreCase(SdkConstants.ABI_ARMEABI)) {
- s = "ARM (" + SdkConstants.ABI_ARMEABI + ")";
-
- } else if (raw.equalsIgnoreCase(SdkConstants.ABI_ARMEABI_V7A)) {
- s = "ARM (" + SdkConstants.ABI_ARMEABI_V7A + ")";
-
- } else if (raw.equalsIgnoreCase(SdkConstants.ABI_INTEL_ATOM)) {
- s = "Intel Atom (" + SdkConstants.ABI_INTEL_ATOM + ")";
-
- } else if (raw.equalsIgnoreCase(SdkConstants.ABI_MIPS)) {
- s = "MIPS (" + SdkConstants.ABI_MIPS + ")";
-
- } else {
- s = raw + " (" + raw + ")";
- }
- return s;
- }
-
- /**
- * Returns the target hash string.
- */
- public String getTargetHash() {
- return mTargetHash;
- }
-
- /** Returns the target of the AVD, or <code>null</code> if it has not been resolved. */
- public IAndroidTarget getTarget() {
- return mTarget;
- }
-
- /** Returns the {@link AvdStatus} of the receiver. */
- public AvdStatus getStatus() {
- return mStatus;
- }
-
- /**
- * Helper method that returns the default AVD folder that would be used for a given
- * AVD name <em>if and only if</em> the AVD was created with the default choice.
- * <p/>
- * Callers must NOT use this to "guess" the actual folder from an actual AVD since
- * the purpose of the AVD .ini file is to be able to change this folder. Callers
- * should however use this to create a new {@link AvdInfo} to setup its data folder
- * to the default.
- * <p/>
- * The default is {@code getDefaultAvdFolder()/avdname.avd/}.
- * <p/>
- * For an actual existing AVD, callers must use {@link #getDataFolderPath()} instead.
- *
- * @param manager The AVD Manager, used to get the AVD storage path.
- * @param avdName The name of the desired AVD.
- * @throws AndroidLocationException if there's a problem getting android root directory.
- */
- public static File getDefaultAvdFolder(AvdManager manager, String avdName)
- throws AndroidLocationException {
- return new File(manager.getBaseAvdFolder(),
- avdName + AvdManager.AVD_FOLDER_EXTENSION);
- }
-
- /**
- * Helper method that returns the .ini {@link File} for a given AVD name.
- * <p/>
- * The default is {@code getDefaultAvdFolder()/avdname.ini}.
- *
- * @param manager The AVD Manager, used to get the AVD storage path.
- * @param avdName The name of the desired AVD.
- * @throws AndroidLocationException if there's a problem getting android root directory.
- */
- public static File getDefaultIniFile(AvdManager manager, String avdName)
- throws AndroidLocationException {
- String avdRoot = manager.getBaseAvdFolder();
- return new File(avdRoot, avdName + AvdManager.INI_EXTENSION);
- }
-
- /**
- * Returns the .ini {@link File} for this AVD.
- */
- public File getIniFile() {
- return mIniFile;
- }
-
- /**
- * Helper method that returns the Config {@link File} for a given AVD name.
- */
- public static File getConfigFile(String path) {
- return new File(path, AvdManager.CONFIG_INI);
- }
-
- /**
- * Returns the Config {@link File} for this AVD.
- */
- public File getConfigFile() {
- return getConfigFile(mFolderPath);
- }
-
- /**
- * Returns an unmodifiable map of properties for the AVD.
- * This can be empty but not null.
- * Callers must NOT try to modify this immutable map.
- */
- public Map<String, String> getProperties() {
- return mProperties;
- }
-
- /**
- * Returns the error message for the AVD or <code>null</code> if {@link #getStatus()}
- * returns {@link AvdStatus#OK}
- */
- public String getErrorMessage() {
- switch (mStatus) {
- case ERROR_PATH:
- return String.format("Missing AVD 'path' property in %1$s", getIniFile());
- case ERROR_CONFIG:
- return String.format("Missing config.ini file in %1$s", mFolderPath);
- case ERROR_TARGET_HASH:
- return String.format("Missing 'target' property in %1$s", getIniFile());
- case ERROR_TARGET:
- return String.format("Unknown target '%1$s' in %2$s",
- mTargetHash, getIniFile());
- case ERROR_PROPERTIES:
- return String.format("Failed to parse properties from %1$s",
- getConfigFile());
- case ERROR_IMAGE_DIR:
- return String.format(
- "Invalid value in image.sysdir. Run 'android update avd -n %1$s'",
- mName);
- case ERROR_DEVICE_CHANGED:
- return String.format("%1$s %2$s configuration has changed since AVD creation",
- mProperties.get(AvdManager.AVD_INI_DEVICE_MANUFACTURER),
- mProperties.get(AvdManager.AVD_INI_DEVICE_NAME));
- case ERROR_DEVICE_MISSING:
- return String.format("%1$s %2$s no longer exists as a device",
- mProperties.get(AvdManager.AVD_INI_DEVICE_MANUFACTURER),
- mProperties.get(AvdManager.AVD_INI_DEVICE_NAME));
- case OK:
- assert false;
- return null;
- }
-
- return null;
- }
-
- /**
- * Returns whether an emulator is currently running the AVD.
- */
- public boolean isRunning() {
- File f = new File(mFolderPath, "userdata-qemu.img.lock"); //$NON-NLS-1$
- return f.isFile();
- }
-
- /**
- * Compares this object with the specified object for order. Returns a
- * negative integer, zero, or a positive integer as this object is less
- * than, equal to, or greater than the specified object.
- *
- * @param o the Object to be compared.
- * @return a negative integer, zero, or a positive integer as this object is
- * less than, equal to, or greater than the specified object.
- */
- @Override
- public int compareTo(AvdInfo o) {
- // first handle possible missing targets (if the AVD failed to load for unresolved targets)
- if (mTarget == null && o != null && o.mTarget == null) {
- return 0;
- } if (mTarget == null) {
- return +1;
- } else if (o == null || o.mTarget == null) {
- return -1;
- }
-
- // then compare the targets
- int targetDiff = mTarget.compareTo(o.mTarget);
-
- if (targetDiff == 0) {
- // same target? compare on the avd name
- return mName.compareTo(o.mName);
- }
-
- return targetDiff;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/avd/AvdManager.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/avd/AvdManager.java
deleted file mode 100644
index eae4eea..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/avd/AvdManager.java
+++ /dev/null
@@ -1,1859 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.avd;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.io.FileWrapper;
-import com.android.io.IAbstractFile;
-import com.android.io.StreamException;
-import com.android.prefs.AndroidLocation;
-import com.android.prefs.AndroidLocation.AndroidLocationException;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.ISystemImage;
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.devices.DeviceManager;
-import com.android.sdklib.devices.DeviceManager.DeviceStatus;
-import com.android.sdklib.internal.avd.AvdInfo.AvdStatus;
-import com.android.sdklib.internal.project.ProjectProperties;
-import com.android.sdklib.util.GrabProcessOutput;
-import com.android.sdklib.util.GrabProcessOutput.IProcessOutput;
-import com.android.sdklib.util.GrabProcessOutput.Wait;
-import com.android.utils.ILogger;
-import com.android.utils.Pair;
-import com.google.common.base.Charsets;
-import com.google.common.io.Closeables;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.FileWriter;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.WeakHashMap;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Android Virtual Device Manager to manage AVDs.
- */
-public class AvdManager {
-
- /**
- * Exception thrown when something is wrong with a target path.
- */
- private static final class InvalidTargetPathException extends Exception {
- private static final long serialVersionUID = 1L;
-
- InvalidTargetPathException(String message) {
- super(message);
- }
- }
-
- private final static Pattern INI_LINE_PATTERN =
- Pattern.compile("^([a-zA-Z0-9._-]+)\\s*=\\s*(.*)\\s*$"); //$NON-NLS-1$
-
- public static final String AVD_FOLDER_EXTENSION = ".avd"; //$NON-NLS-1$
-
- /** Charset encoding used by the avd.ini/config.ini. */
- public static final String AVD_INI_ENCODING = "avd.ini.encoding"; //$NON-NLS-1$
-
- /**
- * The *absolute* path to the AVD folder (which contains the #CONFIG_INI file).
- */
- public static final String AVD_INFO_ABS_PATH = "path"; //$NON-NLS-1$
-
- /**
- * The path to the AVD folder (which contains the #CONFIG_INI file) relative to
- * the {@link AndroidLocation#FOLDER_DOT_ANDROID}. This information is written
- * in the avd ini <b>only</b> if the AVD folder is located under the .android path
- * (that is the relative that has no backward {@code ..} references).
- */
- public static final String AVD_INFO_REL_PATH = "path.rel"; //$NON-NLS-1$
-
- /**
- * The {@link IAndroidTarget#hashString()} of the AVD.
- */
- 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 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 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 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.
- */
- public static final String AVD_INI_DEVICE_MANUFACTURER = "hw.device.manufacturer"; //$NON-NLS-1$
-
- /**
- * AVD/config.ini key name representing the name of the device this avd was based on.
- */
- public static final String AVD_INI_DEVICE_NAME = "hw.device.name"; //$NON-NLS-1$
-
- /**
- * AVD/config.ini key name representing the SDK-relative path of the skin folder, if any,
- * or a 320x480 like constant for a numeric skin size.
- *
- * @see #NUMERIC_SKIN_SIZE
- */
- 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 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 static final String AVD_INI_SKIN_DYNAMIC = "skin.dynamic"; //$NON-NLS-1$
-
- /**
- * AVD/config.ini key name representing the path to the sdcard file.
- * If missing, the default name "sdcard.img" will be used for the sdcard, if there's such
- * a file.
- *
- * @see #SDCARD_IMG
- */
- 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.
- *
- * @see #SDCARD_SIZE_PATTERN
- * @see #parseSdcardSize(String, String[])
- */
- 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
- * the path to the platform system image if there's no add-on.
- * <p/>
- * The emulator looks at {@link #AVD_INI_IMAGES_1} before {@link #AVD_INI_IMAGES_2}.
- */
- 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 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 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 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 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 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 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 static final String AVD_INI_VM_HEAP_SIZE = "vm.heapSize";
-
- /**
- * AVD/config.ini key name representing the size of the data partition
- */
- 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 static final String AVD_INI_DEVICE_HASH = "hw.device.hash";
-
- /**
- * Pattern to match pixel-sized skin "names", e.g. "320x480".
- */
- public static final Pattern NUMERIC_SKIN_SIZE = Pattern.compile("([0-9]{2,})x([0-9]{2,})"); //$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$
-
- 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 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 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.
- */
-
- public static final long SDCARD_MIN_BYTE_SIZE = 9<<20;
- /**
- * Maximal size of an SDCard image file in bytes. Currently 1023 GiB.
- */
- 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 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 static final int SDCARD_SIZE_INVALID = -1;
- /** The sdcard string doesn't look like a size, it might be a path instead. */
- public static final int SDCARD_NOT_SIZE_PATTERN = -2;
-
- /** Regex used to validate characters that compose an AVD name. */
- 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 static final String CHARS_AVD_NAME = "a-z A-Z 0-9 . _ -"; //$NON-NLS-1$
-
- public static final String HARDWARE_INI = "hardware.ini"; //$NON-NLS-1$
-
- /**
- * Status returned by {@link AvdManager#isAvdNameConflicting(String)}.
- */
- public static enum AvdConflict {
- /** There is no known conflict for the given AVD name. */
- NO_CONFLICT,
- /** The AVD name conflicts with an existing valid AVD. */
- CONFLICT_EXISTING_AVD,
- /** The AVD name conflicts with an existing invalid AVD. */
- CONFLICT_INVALID_AVD,
- /**
- * The AVD name does not conflict with any known AVD however there are
- * files or directory that would cause a conflict if this were to be created.
- */
- CONFLICT_EXISTING_PATH,
- }
-
- // A map where the keys are the locations of the SDK and the values are the corresponding
- // AvdManagers. This prevents us from creating multiple AvdManagers for the same SDK and having
- // them get out of sync.
- private static final Map<String, AvdManager> mManagers =
- Collections.synchronizedMap(new WeakHashMap<String, AvdManager>());
-
- private final ArrayList<AvdInfo> mAllAvdList = new ArrayList<AvdInfo>();
- private AvdInfo[] mValidAvdList;
- private AvdInfo[] mBrokenAvdList;
- private final SdkManager mSdkManager;
-
- /**
- * 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.
- * This log object is not kept by this instance of AvdManager and each
- * method takes its own logger. The rationale is that the AvdManager
- * might be called from a variety of context, each with different
- * logging needs. Cannot be null.
- * @throws AndroidLocationException
- */
- protected AvdManager(SdkManager sdkManager, ILogger log) throws AndroidLocationException {
- mSdkManager = sdkManager;
- buildAvdList(mAllAvdList, log);
- }
-
- public static AvdManager getInstance(SdkManager sdkManager, ILogger log)
- throws AndroidLocationException {
- synchronized(mManagers) {
- AvdManager manager;
- if ((manager = mManagers.get(sdkManager.getLocation())) != null) {
- return manager;
- }
- manager = new AvdManager(sdkManager, log);
- mManagers.put(sdkManager.getLocation(), manager);
- return manager;
- }
- }
-
- /**
- * Returns the base folder where AVDs are created.
- *
- * @throws AndroidLocationException
- */
- public String getBaseAvdFolder() throws AndroidLocationException {
- assert AndroidLocation.getFolder().endsWith(File.separator);
- return AndroidLocation.getFolder() + AndroidLocation.FOLDER_AVD;
- }
-
- /**
- * Returns the {@link SdkManager} associated with the {@link AvdManager}.
- */
- public SdkManager getSdkManager() {
- return mSdkManager;
- }
-
- /**
- * Parse the sdcard string to decode the size.
- * Returns:
- * <ul>
- * <li> The size in bytes > 0 if the sdcard string is a valid size in the allowed range.
- * <li> {@link #SDCARD_SIZE_NOT_IN_RANGE} (0)
- * if the sdcard string is a valid size NOT in the allowed range.
- * <li> {@link #SDCARD_SIZE_INVALID} (-1)
- * if the sdcard string is number that fails to parse correctly.
- * <li> {@link #SDCARD_NOT_SIZE_PATTERN} (-2)
- * if the sdcard string is not a number, in which case it's probably a file path.
- * </ul>
- *
- * @param sdcard The sdcard string, which can be a file path, a size string or something else.
- * @param parsedStrings If non-null, an array of 2 strings. The first string will be
- * filled with the parsed numeric size and the second one will be filled with the
- * parsed suffix. This is filled even if the returned size is deemed out of range or
- * failed to parse. The values are null if the sdcard is not a size pattern.
- * @return A size in byte if > 0, or {@link #SDCARD_SIZE_NOT_IN_RANGE},
- * {@link #SDCARD_SIZE_INVALID} or {@link #SDCARD_NOT_SIZE_PATTERN} as error codes.
- */
- public static long parseSdcardSize(String sdcard, String[] parsedStrings) {
-
- if (parsedStrings != null) {
- assert parsedStrings.length == 2;
- parsedStrings[0] = null;
- parsedStrings[1] = null;
- }
-
- Matcher m = SDCARD_SIZE_PATTERN.matcher(sdcard);
- if (m.matches()) {
- if (parsedStrings != null) {
- assert parsedStrings.length == 2;
- parsedStrings[0] = m.group(1);
- parsedStrings[1] = m.group(2);
- }
-
- // get the sdcard values for checks
- try {
- long sdcardSize = Long.parseLong(m.group(1));
-
- String sdcardSizeModifier = m.group(2);
- if ("K".equals(sdcardSizeModifier)) { //$NON-NLS-1$
- sdcardSize <<= 10;
- } else if ("M".equals(sdcardSizeModifier)) { //$NON-NLS-1$
- sdcardSize <<= 20;
- } else if ("G".equals(sdcardSizeModifier)) { //$NON-NLS-1$
- sdcardSize <<= 30;
- }
-
- if (sdcardSize < SDCARD_MIN_BYTE_SIZE ||
- sdcardSize > SDCARD_MAX_BYTE_SIZE) {
- return SDCARD_SIZE_NOT_IN_RANGE;
- }
-
- return sdcardSize;
- } catch (NumberFormatException e) {
- // This could happen if the number is too large to fit in a long.
- return SDCARD_SIZE_INVALID;
- }
- }
-
- return SDCARD_NOT_SIZE_PATTERN;
- }
-
- /**
- * Returns all the existing AVDs.
- * @return a newly allocated array containing all the AVDs.
- */
- public AvdInfo[] getAllAvds() {
- synchronized (mAllAvdList) {
- return mAllAvdList.toArray(new AvdInfo[mAllAvdList.size()]);
- }
- }
-
- /**
- * Returns all the valid AVDs.
- * @return a newly allocated array containing all valid the AVDs.
- */
- public AvdInfo[] getValidAvds() {
- synchronized (mAllAvdList) {
- if (mValidAvdList == null) {
- ArrayList<AvdInfo> list = new ArrayList<AvdInfo>();
- for (AvdInfo avd : mAllAvdList) {
- if (avd.getStatus() == AvdStatus.OK) {
- list.add(avd);
- }
- }
-
- mValidAvdList = list.toArray(new AvdInfo[list.size()]);
- }
- return mValidAvdList;
- }
- }
-
- /**
- * Returns all the broken AVDs.
- * @return a newly allocated array containing all the broken AVDs.
- */
- public AvdInfo[] getBrokenAvds() {
- synchronized (mAllAvdList) {
- if (mBrokenAvdList == null) {
- ArrayList<AvdInfo> list = new ArrayList<AvdInfo>();
- for (AvdInfo avd : mAllAvdList) {
- if (avd.getStatus() != AvdStatus.OK) {
- list.add(avd);
- }
- }
- mBrokenAvdList = list.toArray(new AvdInfo[list.size()]);
- }
- return mBrokenAvdList;
- }
- }
-
- /**
- * Returns the {@link AvdInfo} matching the given <var>name</var>.
- * <p/>
- * The search is case-insensitive.
- *
- * @param name the name of the AVD to return
- * @param validAvdOnly if <code>true</code>, only look through the list of valid AVDs.
- * @return the matching AvdInfo or <code>null</code> if none were found.
- */
- public AvdInfo getAvd(String name, boolean validAvdOnly) {
-
- boolean ignoreCase = SdkConstants.currentPlatform() == SdkConstants.PLATFORM_WINDOWS;
-
- if (validAvdOnly) {
- for (AvdInfo info : getValidAvds()) {
- String name2 = info.getName();
- if (name2.equals(name) || (ignoreCase && name2.equalsIgnoreCase(name))) {
- return info;
- }
- }
- } else {
- synchronized (mAllAvdList) {
- for (AvdInfo info : mAllAvdList) {
- String name2 = info.getName();
- if (name2.equals(name) || (ignoreCase && name2.equalsIgnoreCase(name))) {
- return info;
- }
- }
- }
- }
-
- return null;
- }
-
- /**
- * Returns whether this AVD name would generate a conflict.
- *
- * @param name the name of the AVD to return
- * @return A pair of {@link AvdConflict} and the path or AVD name that conflicts.
- */
- public Pair<AvdConflict, String> isAvdNameConflicting(String name) {
-
- boolean ignoreCase = SdkConstants.currentPlatform() == SdkConstants.PLATFORM_WINDOWS;
-
- // Check whether we have a conflict with an existing or invalid AVD
- // known to the manager.
- synchronized (mAllAvdList) {
- for (AvdInfo info : mAllAvdList) {
- String name2 = info.getName();
- if (name2.equals(name) || (ignoreCase && name2.equalsIgnoreCase(name))) {
- if (info.getStatus() == AvdStatus.OK) {
- return Pair.of(AvdConflict.CONFLICT_EXISTING_AVD, name2);
- } else {
- return Pair.of(AvdConflict.CONFLICT_INVALID_AVD, name2);
- }
- }
- }
- }
-
- // No conflict with known AVDs.
- // Are some existing files/folders in the way of creating this AVD?
-
- try {
- File file = AvdInfo.getDefaultIniFile(this, name);
- if (file.exists()) {
- return Pair.of(AvdConflict.CONFLICT_EXISTING_PATH, file.getPath());
- }
-
- file = AvdInfo.getDefaultAvdFolder(this, name);
- if (file.exists()) {
- return Pair.of(AvdConflict.CONFLICT_EXISTING_PATH, file.getPath());
- }
-
- } catch (AndroidLocationException e) {
- // ignore
- }
-
-
- return Pair.of(AvdConflict.NO_CONFLICT, null);
- }
-
- /**
- * Reloads the AVD list.
- * @param log the log object to receive action logs. Cannot be null.
- * @throws AndroidLocationException if there was an error finding the location of the
- * AVD folder.
- */
- public void reloadAvds(ILogger log) throws AndroidLocationException {
- // build the list in a temp list first, in case the method throws an exception.
- // It's better than deleting the whole list before reading the new one.
- ArrayList<AvdInfo> allList = new ArrayList<AvdInfo>();
- buildAvdList(allList, log);
-
- synchronized (mAllAvdList) {
- mAllAvdList.clear();
- mAllAvdList.addAll(allList);
- mValidAvdList = mBrokenAvdList = null;
- }
- }
-
- /**
- * Creates a new AVD. It is expected that there is no existing AVD with this name already.
- *
- * @param avdFolder the data folder for the AVD. It will be created as needed.
- * Unless you want to locate it in a specific directory, the ideal default is
- * {@code AvdManager.AvdInfo.getAvdFolder}.
- * @param avdName the name of the AVD
- * @param target the target of the AVD
- * @param abiType the abi type of the AVD
- * @param skinName the name of the skin. Can be null. Must have been verified by caller.
- * @param sdcard the parameter value for the sdCard. Can be null. This is either a path to
- * an existing sdcard image or a sdcard size (\d+, \d+K, \dM).
- * @param hardwareConfig the hardware setup for the AVD. Can be null to use defaults.
- * @param createSnapshot If true copy a blank snapshot image into the AVD.
- * @param removePrevious If true remove any previous files.
- * @param editExisting If true, edit an existing AVD, changing only the minimum required.
- * This won't remove files unless required or unless {@code removePrevious} is set.
- * @param log the log object to receive action logs. Cannot be null.
- * @return The new {@link AvdInfo} in case of success (which has just been added to the
- * internal list) or null in case of failure.
- */
- public AvdInfo createAvd(
- File avdFolder,
- String avdName,
- IAndroidTarget target,
- String abiType,
- String skinName,
- String sdcard,
- Map<String,String> hardwareConfig,
- boolean createSnapshot,
- boolean removePrevious,
- boolean editExisting,
- ILogger log) {
- if (log == null) {
- throw new IllegalArgumentException("log cannot be null");
- }
-
- File iniFile = null;
- boolean needCleanup = false;
- try {
- if (avdFolder.exists()) {
- if (removePrevious) {
- // AVD already exists and removePrevious is set, try to remove the
- // directory's content first (but not the directory itself).
- try {
- deleteContentOf(avdFolder);
- } catch (SecurityException e) {
- log.error(e, "Failed to delete %1$s", avdFolder.getAbsolutePath());
- }
- } else if (!editExisting) {
- // AVD shouldn't already exist if removePrevious is false and
- // we're not editing an existing AVD.
- log.error(null,
- "Folder %1$s is in the way. Use --force if you want to overwrite.",
- avdFolder.getAbsolutePath());
- return null;
- }
- } else {
- // create the AVD folder.
- avdFolder.mkdir();
- // We're not editing an existing AVD.
- editExisting = false;
- }
-
- // actually write the ini file
- iniFile = createAvdIniFile(avdName, avdFolder, target, removePrevious);
-
- // writes the userdata.img in it.
-
- File userdataSrc = null;
-
- // Look for a system image in the add-on.
- // If we don't find one there, look in the base platform.
- ISystemImage systemImage = target.getSystemImage(abiType);
-
- if (systemImage != null) {
- File imageFolder = systemImage.getLocation();
- userdataSrc = new File(imageFolder, USERDATA_IMG);
- }
-
- if ((userdataSrc == null || !userdataSrc.exists()) && !target.isPlatform()) {
- // If we don't find a system-image in the add-on, look into the platform.
-
- systemImage = target.getParent().getSystemImage(abiType);
- if (systemImage != null) {
- File imageFolder = systemImage.getLocation();
- userdataSrc = new File(imageFolder, USERDATA_IMG);
- }
- }
-
- if (userdataSrc == null || !userdataSrc.exists()) {
- log.error(null,
- "Unable to find a '%1$s' file for ABI %2$s to copy into the AVD folder.",
- USERDATA_IMG,
- abiType);
- needCleanup = true;
- return null;
- }
-
- File userdataDest = new File(avdFolder, USERDATA_IMG);
-
- copyImageFile(userdataSrc, userdataDest);
-
- if (userdataDest.exists() == false) {
- log.error(null, "Unable to create '%1$s' file in the AVD folder.",
- userdataDest);
- needCleanup = true;
- return null;
- }
-
- // Config file.
- HashMap<String, String> values = new HashMap<String, String>();
-
- if (setImagePathProperties(target, abiType, values, log) == false) {
- log.error(null, "Failed to set image path properties in the AVD folder.");
- needCleanup = true;
- return null;
- }
-
- // Create the snapshot file
- if (createSnapshot) {
- File snapshotDest = new File(avdFolder, SNAPSHOTS_IMG);
- if (snapshotDest.isFile() && editExisting) {
- log.info("Snapshot image already present, was not changed.\n");
-
- } else {
- String toolsLib = mSdkManager.getLocation() + File.separator
- + SdkConstants.OS_SDK_TOOLS_LIB_EMULATOR_FOLDER;
- File snapshotBlank = new File(toolsLib, SNAPSHOTS_IMG);
- if (snapshotBlank.exists() == false) {
- log.error(null,
- "Unable to find a '%2$s%1$s' file to copy into the AVD folder.",
- SNAPSHOTS_IMG, toolsLib);
- needCleanup = true;
- return null;
- }
-
- copyImageFile(snapshotBlank, snapshotDest);
- }
- values.put(AVD_INI_SNAPSHOT_PRESENT, "true");
- }
-
- // Now the abi type
- values.put(AVD_INI_ABI_TYPE, abiType);
-
- // and the cpu arch.
- if (SdkConstants.ABI_ARMEABI.equals(abiType)) {
- values.put(AVD_INI_CPU_ARCH, SdkConstants.CPU_ARCH_ARM);
- } else if (SdkConstants.ABI_ARMEABI_V7A.equals(abiType)) {
- values.put(AVD_INI_CPU_ARCH, SdkConstants.CPU_ARCH_ARM);
- values.put(AVD_INI_CPU_MODEL, SdkConstants.CPU_MODEL_CORTEX_A8);
- } else if (SdkConstants.ABI_INTEL_ATOM.equals(abiType)) {
- values.put(AVD_INI_CPU_ARCH, SdkConstants.CPU_ARCH_INTEL_ATOM);
- } else if (SdkConstants.ABI_MIPS.equals(abiType)) {
- values.put(AVD_INI_CPU_ARCH, SdkConstants.CPU_ARCH_MIPS);
- } else {
- log.error(null,
- "ABI %1$s is not supported by this version of the SDK Tools", abiType);
- needCleanup = true;
- return null;
- }
-
- // Now the skin.
- if (skinName == null || skinName.length() == 0) {
- skinName = target.getDefaultSkin();
- }
-
- if (NUMERIC_SKIN_SIZE.matcher(skinName).matches()) {
- // Skin name is an actual screen resolution.
- // Set skin.name for display purposes in the AVD manager and
- // set skin.path for use by the emulator.
- values.put(AVD_INI_SKIN_NAME, skinName);
- values.put(AVD_INI_SKIN_PATH, skinName);
- } else {
- // get the path of the skin (relative to the SDK)
- // assume skin name is valid
- String skinPath = getSkinRelativePath(skinName, target, log);
- if (skinPath == null) {
- log.error(null, "Missing skinpath in the AVD folder.");
- needCleanup = true;
- return null;
- }
-
- values.put(AVD_INI_SKIN_PATH, skinPath);
- values.put(AVD_INI_SKIN_NAME, skinName);
- }
-
- if (sdcard != null && sdcard.length() > 0) {
- // Sdcard is possibly a size. In that case we create a file called 'sdcard.img'
- // in the AVD folder, and do not put any value in config.ini.
-
- long sdcardSize = parseSdcardSize(sdcard, null/*parsedStrings*/);
-
- if (sdcardSize == SDCARD_SIZE_NOT_IN_RANGE) {
- log.error(null, "SD Card size must be in the range 9 MiB..1023 GiB.");
- needCleanup = true;
- return null;
-
- } else if (sdcardSize == SDCARD_SIZE_INVALID) {
- log.error(null, "Unable to parse SD Card size");
- needCleanup = true;
- return null;
-
- } else if (sdcardSize == SDCARD_NOT_SIZE_PATTERN) {
- File sdcardFile = new File(sdcard);
- if (sdcardFile.isFile()) {
- // sdcard value is an external sdcard, so we put its path into the config.ini
- values.put(AVD_INI_SDCARD_PATH, sdcard);
- } else {
- log.error(null, "'%1$s' is not recognized as a valid sdcard value.\n"
- + "Value should be:\n" + "1. path to an sdcard.\n"
- + "2. size of the sdcard to create: <size>[K|M]", sdcard);
- needCleanup = true;
- return null;
- }
- } else {
- // create the sdcard.
- File sdcardFile = new File(avdFolder, SDCARD_IMG);
-
- boolean runMkSdcard = true;
- if (sdcardFile.exists()) {
- if (sdcardFile.length() == sdcardSize && editExisting) {
- // There's already an sdcard file with the right size and we're
- // not overriding it... so don't remove it.
- runMkSdcard = false;
- log.info("SD Card already present with same size, was not changed.\n");
- }
- }
-
- if (runMkSdcard) {
- String path = sdcardFile.getAbsolutePath();
-
- // execute mksdcard with the proper parameters.
- File toolsFolder = new File(mSdkManager.getLocation(),
- SdkConstants.FD_TOOLS);
- File mkSdCard = new File(toolsFolder, SdkConstants.mkSdCardCmdName());
-
- if (mkSdCard.isFile() == false) {
- log.error(null, "'%1$s' is missing from the SDK tools folder.",
- mkSdCard.getName());
- needCleanup = true;
- return null;
- }
-
- if (createSdCard(mkSdCard.getAbsolutePath(), sdcard, path, log) == false) {
- log.error(null, "Failed to create sdcard in the AVD folder.");
- needCleanup = true;
- return null; // mksdcard output has already been displayed, no need to
- // output anything else.
- }
- }
-
- // add a property containing the size of the sdcard for display purpose
- // only when the dev does 'android list avd'
- values.put(AVD_INI_SDCARD_SIZE, sdcard);
- }
- }
-
- // add the hardware config to the config file.
- // priority order is:
- // - values provided by the user
- // - values provided by the skin
- // - values provided by the target (add-on only).
- // In order to follow this priority, we'll add the lowest priority values first and then
- // override by higher priority values.
- // In the case of a platform with override values from the user, the skin value might
- // already be there, but it's ok.
-
- HashMap<String, String> finalHardwareValues = new HashMap<String, String>();
-
- FileWrapper targetHardwareFile = new FileWrapper(target.getLocation(),
- AvdManager.HARDWARE_INI);
- if (targetHardwareFile.isFile()) {
- Map<String, String> targetHardwareConfig = ProjectProperties.parsePropertyFile(
- targetHardwareFile, log);
-
- if (targetHardwareConfig != null) {
- finalHardwareValues.putAll(targetHardwareConfig);
- values.putAll(targetHardwareConfig);
- }
- }
-
- // get the hardware properties for this skin
- File skinFolder = getSkinPath(skinName, target);
- FileWrapper skinHardwareFile = new FileWrapper(skinFolder, AvdManager.HARDWARE_INI);
- if (skinHardwareFile.isFile()) {
- Map<String, String> skinHardwareConfig = ProjectProperties.parsePropertyFile(
- skinHardwareFile, log);
-
- if (skinHardwareConfig != null) {
- finalHardwareValues.putAll(skinHardwareConfig);
- values.putAll(skinHardwareConfig);
- }
- }
-
- // finally put the hardware provided by the user.
- if (hardwareConfig != null) {
- finalHardwareValues.putAll(hardwareConfig);
- values.putAll(hardwareConfig);
- }
-
- File configIniFile = new File(avdFolder, CONFIG_INI);
- writeIniFile(configIniFile, values);
-
- // Generate the log report first because we want to control where line breaks
- // are located when generating the hardware config list.
- StringBuilder report = new StringBuilder();
-
- if (target.isPlatform()) {
- if (editExisting) {
- report.append(String.format("Updated AVD '%1$s' based on %2$s",
- avdName, target.getName()));
- } else {
- report.append(String.format("Created AVD '%1$s' based on %2$s",
- avdName, target.getName()));
- }
- } else {
- if (editExisting) {
- report.append(String.format("Updated AVD '%1$s' based on %2$s (%3$s)", avdName,
- target.getName(), target.getVendor()));
- } else {
- report.append(String.format("Created AVD '%1$s' based on %2$s (%3$s)", avdName,
- target.getName(), target.getVendor()));
- }
- }
- report.append(String.format(", %s processor", AvdInfo.getPrettyAbiType(abiType)));
-
- // display the chosen hardware config
- if (finalHardwareValues.size() > 0) {
- report.append(",\nwith the following hardware config:\n");
- for (Entry<String, String> entry : finalHardwareValues.entrySet()) {
- report.append(String.format("%s=%s\n",entry.getKey(), entry.getValue()));
- }
- } else {
- report.append("\n");
- }
-
- log.info(report.toString());
-
- // create the AvdInfo object, and add it to the list
- AvdInfo newAvdInfo = new AvdInfo(
- avdName,
- iniFile,
- avdFolder.getAbsolutePath(),
- target.hashString(),
- target, abiType, values);
-
- AvdInfo oldAvdInfo = getAvd(avdName, false /*validAvdOnly*/);
-
- synchronized (mAllAvdList) {
- if (oldAvdInfo != null && (removePrevious || editExisting)) {
- mAllAvdList.remove(oldAvdInfo);
- }
- mAllAvdList.add(newAvdInfo);
- mValidAvdList = mBrokenAvdList = null;
- }
-
- if ((removePrevious || editExisting) &&
- newAvdInfo != null &&
- oldAvdInfo != null &&
- !oldAvdInfo.getDataFolderPath().equals(newAvdInfo.getDataFolderPath())) {
- log.warning("Removing previous AVD directory at %s",
- oldAvdInfo.getDataFolderPath());
- // Remove the old data directory
- File dir = new File(oldAvdInfo.getDataFolderPath());
- try {
- deleteContentOf(dir);
- dir.delete();
- } catch (SecurityException e) {
- log.error(e, "Failed to delete %1$s", dir.getAbsolutePath());
- }
- }
-
- return newAvdInfo;
- } catch (AndroidLocationException e) {
- log.error(e, null);
- } catch (IOException e) {
- log.error(e, null);
- } catch (SecurityException e) {
- log.error(e, null);
- } finally {
- if (needCleanup) {
- if (iniFile != null && iniFile.exists()) {
- iniFile.delete();
- }
-
- try {
- deleteContentOf(avdFolder);
- avdFolder.delete();
- } catch (SecurityException e) {
- log.error(e, "Failed to delete %1$s", avdFolder.getAbsolutePath());
- }
- }
- }
-
- return null;
- }
-
- /**
- * Copy the nominated file to the given destination.
- *
- * @throws FileNotFoundException
- * @throws IOException
- */
- private void copyImageFile(File source, File destination)
- throws FileNotFoundException, IOException {
- FileInputStream fis = new FileInputStream(source);
- FileOutputStream fos = new FileOutputStream(destination);
-
- byte[] buffer = new byte[4096];
- int count;
- while ((count = fis.read(buffer)) != -1) {
- fos.write(buffer, 0, count);
- }
-
- fos.close();
- fis.close();
- }
-
- /**
- * Returns the path to the target images folder as a relative path to the SDK, if the folder
- * is not empty. If the image folder is empty or does not exist, <code>null</code> is returned.
- * @throws InvalidTargetPathException if the target image folder is not in the current SDK.
- */
- private String getImageRelativePath(IAndroidTarget target, String abiType)
- throws InvalidTargetPathException {
-
- ISystemImage systemImage = target.getSystemImage(abiType);
- if (systemImage == null) {
- // ABI Type is unknown for target
- return null;
- }
-
- File folder = systemImage.getLocation();
- String imageFullPath = folder.getAbsolutePath();
-
- // make this path relative to the SDK location
- String sdkLocation = mSdkManager.getLocation();
- if (!imageFullPath.startsWith(sdkLocation)) {
- // this really really should not happen.
- assert false;
- throw new InvalidTargetPathException("Target location is not inside the SDK.");
- }
-
- if (folder.isDirectory()) {
- String[] list = folder.list(new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return IMAGE_NAME_PATTERN.matcher(name).matches();
- }
- });
-
- if (list.length > 0) {
- // Remove the SDK root path, e.g. /sdk/dir1/dir2 => /dir1/dir2
- imageFullPath = imageFullPath.substring(sdkLocation.length());
- // The path is relative, so it must not start with a file separator
- if (imageFullPath.charAt(0) == File.separatorChar) {
- imageFullPath = imageFullPath.substring(1);
- }
- // For compatibility with previous versions, we denote folders
- // by ending the path with file separator
- if (!imageFullPath.endsWith(File.separator)) {
- imageFullPath += File.separator;
- }
-
- return imageFullPath;
- }
- }
-
- return null;
- }
-
- /**
- * Returns the path to the skin, as a relative path to the SDK.
- * @param skinName The name of the skin to find. Case-sensitive.
- * @param target The target where to find the skin.
- * @param log the log object to receive action logs. Cannot be null.
- */
- public String getSkinRelativePath(String skinName, IAndroidTarget target, ILogger log) {
- if (log == null) {
- throw new IllegalArgumentException("log cannot be null");
- }
-
- // first look to see if the skin is in the target
- File skin = getSkinPath(skinName, target);
-
- // skin really does not exist!
- if (skin.exists() == false) {
- log.error(null, "Skin '%1$s' does not exist.", skinName);
- return null;
- }
-
- // get the skin path
- String path = skin.getAbsolutePath();
-
- // make this path relative to the SDK location
- String sdkLocation = mSdkManager.getLocation();
- if (path.startsWith(sdkLocation) == false) {
- // this really really should not happen.
- log.error(null, "Target location is not inside the SDK.");
- assert false;
- return null;
- }
-
- path = path.substring(sdkLocation.length());
- if (path.charAt(0) == File.separatorChar) {
- path = path.substring(1);
- }
- return path;
- }
-
- /**
- * Returns the full absolute OS path to a skin specified by name for a given target.
- * @param skinName The name of the skin to find. Case-sensitive.
- * @param target The target where to find the skin.
- * @return a {@link File} that may or may not actually exist.
- */
- public File getSkinPath(String skinName, IAndroidTarget target) {
- String path = target.getPath(IAndroidTarget.SKINS);
- File skin = new File(path, skinName);
-
- if (skin.exists() == false && target.isPlatform() == false) {
- target = target.getParent();
-
- path = target.getPath(IAndroidTarget.SKINS);
- skin = new File(path, skinName);
- }
-
- return skin;
- }
-
- /**
- * Creates the ini file for an AVD.
- *
- * @param name of the AVD.
- * @param avdFolder path for the data folder of the AVD.
- * @param target of the AVD.
- * @param removePrevious True if an existing ini file should be removed.
- * @throws AndroidLocationException if there's a problem getting android root directory.
- * @throws IOException if {@link File#getAbsolutePath()} fails.
- */
- private File createAvdIniFile(String name,
- File avdFolder,
- IAndroidTarget target,
- boolean removePrevious)
- throws AndroidLocationException, IOException {
- File iniFile = AvdInfo.getDefaultIniFile(this, name);
-
- if (removePrevious) {
- if (iniFile.isFile()) {
- iniFile.delete();
- } else if (iniFile.isDirectory()) {
- deleteContentOf(iniFile);
- iniFile.delete();
- }
- }
-
- String absPath = avdFolder.getAbsolutePath();
- String relPath = null;
- String androidPath = AndroidLocation.getFolder();
- if (absPath.startsWith(androidPath)) {
- // Compute the AVD path relative to the android path.
- assert androidPath.endsWith(File.separator);
- relPath = absPath.substring(androidPath.length());
- }
-
- HashMap<String, String> values = new HashMap<String, String>();
- if (relPath != null) {
- values.put(AVD_INFO_REL_PATH, relPath);
- }
- values.put(AVD_INFO_ABS_PATH, absPath);
- values.put(AVD_INFO_TARGET, target.hashString());
- writeIniFile(iniFile, values);
-
- return iniFile;
- }
-
- /**
- * Creates the ini file for an AVD.
- *
- * @param info of the AVD.
- * @throws AndroidLocationException if there's a problem getting android root directory.
- * @throws IOException if {@link File#getAbsolutePath()} fails.
- */
- private File createAvdIniFile(AvdInfo info) throws AndroidLocationException, IOException {
- return createAvdIniFile(info.getName(),
- new File(info.getDataFolderPath()),
- info.getTarget(),
- false /*removePrevious*/);
- }
-
- /**
- * Actually deletes the files of an existing AVD.
- * <p/>
- * This also remove it from the manager's list, The caller does not need to
- * call {@link #removeAvd(AvdInfo)} afterwards.
- * <p/>
- * This method is designed to somehow work with an unavailable AVD, that is an AVD that
- * could not be loaded due to some error. That means this method still tries to remove
- * the AVD ini file or its folder if it can be found. An error will be output if any of
- * these operations fail.
- *
- * @param avdInfo the information on the AVD to delete
- * @param log the log object to receive action logs. Cannot be null.
- * @return True if the AVD was deleted with no error.
- */
- public boolean deleteAvd(AvdInfo avdInfo, ILogger log) {
- try {
- boolean error = false;
-
- File f = avdInfo.getIniFile();
- if (f != null && f.exists()) {
- log.info("Deleting file %1$s\n", f.getCanonicalPath());
- if (!f.delete()) {
- log.error(null, "Failed to delete %1$s\n", f.getCanonicalPath());
- error = true;
- }
- }
-
- String path = avdInfo.getDataFolderPath();
- if (path != null) {
- f = new File(path);
- if (f.exists()) {
- log.info("Deleting folder %1$s\n", f.getCanonicalPath());
- if (deleteContentOf(f) == false || f.delete() == false) {
- log.error(null, "Failed to delete %1$s\n", f.getCanonicalPath());
- error = true;
- }
- }
- }
-
- removeAvd(avdInfo);
-
- if (error) {
- log.info("\nAVD '%1$s' deleted with errors. See errors above.\n",
- avdInfo.getName());
- } else {
- log.info("\nAVD '%1$s' deleted.\n", avdInfo.getName());
- return true;
- }
-
- } catch (IOException e) {
- log.error(e, null);
- } catch (SecurityException e) {
- log.error(e, null);
- }
- return false;
- }
-
- /**
- * Moves and/or rename an existing AVD and its files.
- * This also change it in the manager's list.
- * <p/>
- * The caller should make sure the name or path given are valid, do not exist and are
- * actually different than current values.
- *
- * @param avdInfo the information on the AVD to move.
- * @param newName the new name of the AVD if non null.
- * @param paramFolderPath the new data folder if non null.
- * @param log the log object to receive action logs. Cannot be null.
- * @return True if the move succeeded or there was nothing to do.
- * If false, this method will have had already output error in the log.
- */
- public boolean moveAvd(AvdInfo avdInfo, String newName, String paramFolderPath, ILogger log) {
-
- try {
- if (paramFolderPath != null) {
- File f = new File(avdInfo.getDataFolderPath());
- log.warning("Moving '%1$s' to '%2$s'.",
- avdInfo.getDataFolderPath(),
- paramFolderPath);
- if (!f.renameTo(new File(paramFolderPath))) {
- log.error(null, "Failed to move '%1$s' to '%2$s'.",
- avdInfo.getDataFolderPath(), paramFolderPath);
- return false;
- }
-
- // update AVD info
- AvdInfo info = new AvdInfo(
- avdInfo.getName(),
- avdInfo.getIniFile(),
- paramFolderPath,
- avdInfo.getTargetHash(),
- avdInfo.getTarget(),
- avdInfo.getAbiType(),
- avdInfo.getProperties());
- replaceAvd(avdInfo, info);
-
- // update the ini file
- createAvdIniFile(info);
- }
-
- if (newName != null) {
- File oldIniFile = avdInfo.getIniFile();
- File newIniFile = AvdInfo.getDefaultIniFile(this, newName);
-
- log.warning("Moving '%1$s' to '%2$s'.", oldIniFile.getPath(), newIniFile.getPath());
- if (!oldIniFile.renameTo(newIniFile)) {
- log.error(null, "Failed to move '%1$s' to '%2$s'.",
- oldIniFile.getPath(), newIniFile.getPath());
- return false;
- }
-
- // update AVD info
- AvdInfo info = new AvdInfo(
- newName,
- avdInfo.getIniFile(),
- avdInfo.getDataFolderPath(),
- avdInfo.getTargetHash(),
- avdInfo.getTarget(),
- avdInfo.getAbiType(),
- avdInfo.getProperties());
- replaceAvd(avdInfo, info);
- }
-
- log.info("AVD '%1$s' moved.\n", avdInfo.getName());
-
- } catch (AndroidLocationException e) {
- log.error(e, null);
- } catch (IOException e) {
- log.error(e, null);
- }
-
- // nothing to do or succeeded
- return true;
- }
-
- /**
- * Helper method to recursively delete a folder's content (but not the folder itself).
- *
- * @throws SecurityException like {@link File#delete()} does if file/folder is not writable.
- */
- private boolean deleteContentOf(File folder) throws SecurityException {
- File[] files = folder.listFiles();
- if (files != null) {
- for (File f : files) {
- if (f.isDirectory()) {
- if (deleteContentOf(f) == false) {
- return false;
- }
- }
- if (f.delete() == false) {
- return false;
- }
-
- }
- }
-
- return true;
- }
-
- /**
- * Returns a list of files that are potential AVD ini files.
- * <p/>
- * This lists the $HOME/.android/avd/<name>.ini files.
- * Such files are properties file than then indicate where the AVD folder is located.
- * <p/>
- * Note: the method is to be considered private. It is made protected so that
- * unit tests can easily override the AVD root.
- *
- * @return A new {@link File} array or null. The array might be empty.
- * @throws AndroidLocationException if there's a problem getting android root directory.
- */
- private File[] buildAvdFilesList() throws AndroidLocationException {
- File folder = new File(getBaseAvdFolder());
-
- // ensure folder validity.
- if (folder.isFile()) {
- throw new AndroidLocationException(
- String.format("%1$s is not a valid folder.", folder.getAbsolutePath()));
- } else if (folder.exists() == false) {
- // folder is not there, we create it and return
- folder.mkdirs();
- return null;
- }
-
- File[] avds = folder.listFiles(new FilenameFilter() {
- @Override
- public boolean accept(File parent, String name) {
- if (INI_NAME_PATTERN.matcher(name).matches()) {
- // check it's a file and not a folder
- boolean isFile = new File(parent, name).isFile();
- return isFile;
- }
-
- return false;
- }
- });
-
- return avds;
- }
-
- /**
- * Computes the internal list of available AVDs
- * @param allList the list to contain all the AVDs
- * @param log the log object to receive action logs. Cannot be null.
- *
- * @throws AndroidLocationException if there's a problem getting android root directory.
- */
- private void buildAvdList(ArrayList<AvdInfo> allList, ILogger log)
- throws AndroidLocationException {
- File[] avds = buildAvdFilesList();
- if (avds != null) {
- for (File avd : avds) {
- AvdInfo info = parseAvdInfo(avd, log);
- if (info != null) {
- allList.add(info);
- }
- }
- }
- }
-
- /**
- * Parses an AVD .ini file to create an {@link AvdInfo}.
- *
- * @param iniPath The path to the AVD .ini file
- * @param log the log object to receive action logs. Cannot be null.
- * @return A new {@link AvdInfo} with an {@link AvdStatus} indicating whether this AVD is
- * valid or not.
- */
- private AvdInfo parseAvdInfo(File iniPath, ILogger log) {
- Map<String, String> map = parseIniFile(
- new FileWrapper(iniPath),
- log);
-
- String avdPath = map.get(AVD_INFO_ABS_PATH);
- String targetHash = map.get(AVD_INFO_TARGET);
-
- if (!(new File(avdPath).isDirectory())) {
- // Try to fallback on the relative path, if present.
- String relPath = map.get(AVD_INFO_REL_PATH);
- if (relPath != null) {
- try {
- String androidPath = AndroidLocation.getFolder();
- File f = new File(androidPath, relPath);
- if (f.isDirectory()) {
- avdPath = f.getAbsolutePath();
- }
- } catch (AndroidLocationException ignore) {}
- }
- }
-
- IAndroidTarget target = null;
- FileWrapper configIniFile = null;
- Map<String, String> properties = null;
-
- if (targetHash != null) {
- target = mSdkManager.getTargetFromHashString(targetHash);
- }
-
- // load the AVD properties.
- if (avdPath != null) {
- configIniFile = new FileWrapper(avdPath, CONFIG_INI);
- }
-
- if (configIniFile != null) {
- if (!configIniFile.isFile()) {
- log.warning("Missing file '%1$s'.", configIniFile.getPath());
- } else {
- properties = parseIniFile(configIniFile, log);
- }
- }
-
- // get name
- String name = iniPath.getName();
- Matcher matcher = INI_NAME_PATTERN.matcher(iniPath.getName());
- if (matcher.matches()) {
- name = matcher.group(1);
- }
-
- // get abi type
- String abiType = properties == null ? null : properties.get(AVD_INI_ABI_TYPE);
- // for the avds created previously without enhancement, i.e. They are created based
- // on previous API Levels. They are supposed to have ARM processor type
- if (abiType == null) {
- abiType = SdkConstants.ABI_ARMEABI;
- }
-
- // check the image.sysdir are valid
- boolean validImageSysdir = true;
- if (properties != null) {
- String imageSysDir = properties.get(AVD_INI_IMAGES_1);
- if (imageSysDir != null) {
- File f = new File(mSdkManager.getLocation() + File.separator + imageSysDir);
- if (f.isDirectory() == false) {
- validImageSysdir = false;
- } else {
- imageSysDir = properties.get(AVD_INI_IMAGES_2);
- if (imageSysDir != null) {
- f = new File(mSdkManager.getLocation() + File.separator + imageSysDir);
- if (f.isDirectory() == false) {
- validImageSysdir = false;
- }
- }
- }
- }
- }
-
- // Get the device status if this AVD is associated with a device
- DeviceStatus deviceStatus = null;
- if (properties != null) {
- String deviceName = properties.get(AVD_INI_DEVICE_NAME);
- String deviceMfctr = properties.get(AVD_INI_DEVICE_MANUFACTURER);
- String hash = properties.get(AVD_INI_DEVICE_HASH);
- if (deviceName != null && deviceMfctr != null && hash != null) {
- int deviceHash = Integer.parseInt(hash);
- DeviceManager devMan = DeviceManager.createInstance(mSdkManager.getLocation(), log);
- deviceStatus = devMan.getDeviceStatus(deviceName, deviceMfctr, deviceHash);
- }
- }
-
-
- // TODO: What about missing sdcard, skins, etc?
-
- AvdStatus status;
-
- if (avdPath == null) {
- status = AvdStatus.ERROR_PATH;
- } else if (configIniFile == null) {
- status = AvdStatus.ERROR_CONFIG;
- } else if (targetHash == null) {
- status = AvdStatus.ERROR_TARGET_HASH;
- } else if (target == null) {
- status = AvdStatus.ERROR_TARGET;
- } else if (properties == null) {
- status = AvdStatus.ERROR_PROPERTIES;
- } else if (validImageSysdir == false) {
- status = AvdStatus.ERROR_IMAGE_DIR;
- } else if (deviceStatus == DeviceStatus.CHANGED) {
- status = AvdStatus.ERROR_DEVICE_CHANGED;
- } else if (deviceStatus == DeviceStatus.MISSING) {
- status = AvdStatus.ERROR_DEVICE_MISSING;
- } else {
- status = AvdStatus.OK;
- }
-
- AvdInfo info = new AvdInfo(
- name,
- iniPath,
- avdPath,
- targetHash,
- target,
- abiType,
- properties,
- status);
-
- return info;
- }
-
- /**
- * Writes a .ini file from a set of properties, using UTF-8 encoding.
- * The file should be read back later by {@link #parseIniFile(IAbstractFile, ILogger)}.
- *
- * @param iniFile The file to generate.
- * @param values THe properties to place in the ini file.
- * @throws IOException if {@link FileWriter} fails to open, write or close the file.
- */
- private static void writeIniFile(File iniFile, Map<String, String> values)
- throws IOException {
-
- Charset charset = Charsets.ISO_8859_1;
- OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(iniFile), charset);
-
- // Write down the charset used in case we want to use it later.
- writer.write(String.format("%1$s=%2$s\n", AVD_INI_ENCODING, charset.name()));
-
- for (Entry<String, String> entry : values.entrySet()) {
- writer.write(String.format("%1$s=%2$s\n", entry.getKey(), entry.getValue()));
- }
- writer.close();
- }
-
- /**
- * Parses a property file and returns a map of the content.
- * <p/>
- * If the file is not present, null is returned with no error messages sent to the log.
- * <p/>
- * Charset encoding will be either the system's default or the one specified by the
- * {@link #AVD_INI_ENCODING} key if present.
- *
- * @param propFile the property file to parse
- * @param log the ILogger object receiving warning/error from the parsing.
- * @return the map of (key,value) pairs, or null if the parsing failed.
- */
- private static Map<String, String> parseIniFile(
- @NonNull IAbstractFile propFile,
- @Nullable ILogger log) {
- return parseIniFileImpl(propFile, log, null /*charset*/);
- }
-
- /**
- * Implementation helper for the {@link #parseIniFile(IAbstractFile, ILogger)} method.
- * Don't call this one directly.
- *
- * @param propFile the property file to parse
- * @param log the ILogger object receiving warning/error from the parsing.
- * @param charset When a specific charset is specified, this will be used as-is.
- * When null, the default charset will first be used and if the key
- * {@link #AVD_INI_ENCODING} is found the parsing will restart using that specific
- * charset.
- * @return the map of (key,value) pairs, or null if the parsing failed.
- */
- private static Map<String, String> parseIniFileImpl(
- @NonNull IAbstractFile propFile,
- @Nullable ILogger log,
- @Nullable Charset charset) {
-
- BufferedReader reader = null;
- try {
- boolean canChangeCharset = false;
- if (charset == null) {
- canChangeCharset = false;
- charset = Charsets.ISO_8859_1;
- }
- reader = new BufferedReader(new InputStreamReader(propFile.getContents(), charset));
-
- String line = null;
- Map<String, String> map = new HashMap<String, String>();
- while ((line = reader.readLine()) != null) {
- line = line.trim();
- if (line.length() > 0 && line.charAt(0) != '#') {
-
- Matcher m = INI_LINE_PATTERN.matcher(line);
- if (m.matches()) {
- // Note: we do NOT escape values.
- String key = m.group(1);
- String value = m.group(2);
-
- // If we find the charset encoding and it's not the same one and
- // it's a valid one, re-read the file using that charset.
- if (canChangeCharset &&
- AVD_INI_ENCODING.equals(key) &&
- !charset.name().equals(value) &&
- Charset.isSupported(value)) {
- charset = Charset.forName(value);
- return parseIniFileImpl(propFile, log, charset);
- }
-
- map.put(key, value);
- } else {
- if (log != null) {
- log.warning("Error parsing '%1$s': \"%2$s\" is not a valid syntax",
- propFile.getOsLocation(),
- line);
- }
- return null;
- }
- }
- }
-
- return map;
- } catch (FileNotFoundException e) {
- // this should not happen since we usually test the file existence before
- // calling the method.
- // Return null below.
- } catch (IOException e) {
- if (log != null) {
- log.warning("Error parsing '%1$s': %2$s.",
- propFile.getOsLocation(),
- e.getMessage());
- }
- } catch (StreamException e) {
- if (log != null) {
- log.warning("Error parsing '%1$s': %2$s.",
- propFile.getOsLocation(),
- e.getMessage());
- }
- } finally {
- Closeables.closeQuietly(reader);
- }
-
- return null;
- }
-
- /**
- * Invokes the tool to create a new SD card image file.
- *
- * @param toolLocation The path to the mksdcard tool.
- * @param size The size of the new SD Card, compatible with {@link #SDCARD_SIZE_PATTERN}.
- * @param location The path of the new sdcard image file to generate.
- * @param log the log object to receive action logs. Cannot be null.
- * @return True if the sdcard could be created.
- */
- private boolean createSdCard(String toolLocation, String size, String location, ILogger log) {
- try {
- String[] command = new String[3];
- command[0] = toolLocation;
- command[1] = size;
- command[2] = location;
- Process process = Runtime.getRuntime().exec(command);
-
- final ArrayList<String> errorOutput = new ArrayList<String>();
- final ArrayList<String> stdOutput = new ArrayList<String>();
-
- int status = GrabProcessOutput.grabProcessOutput(
- process,
- Wait.WAIT_FOR_READERS,
- new IProcessOutput() {
- @Override
- public void out(@Nullable String line) {
- if (line != null) {
- stdOutput.add(line);
- }
- }
-
- @Override
- public void err(@Nullable String line) {
- if (line != null) {
- errorOutput.add(line);
- }
- }
- });
-
- if (status == 0) {
- return true;
- } else {
- for (String error : errorOutput) {
- log.error(null, error);
- }
- }
-
- } catch (InterruptedException e) {
- // pass, print error below
- } catch (IOException e) {
- // pass, print error below
- }
-
- log.error(null, "Failed to create the SD card.");
- return false;
- }
-
- /**
- * Removes an {@link AvdInfo} from the internal list.
- *
- * @param avdInfo The {@link AvdInfo} to remove.
- * @return true if this {@link AvdInfo} was present and has been removed.
- */
- public boolean removeAvd(AvdInfo avdInfo) {
- synchronized (mAllAvdList) {
- if (mAllAvdList.remove(avdInfo)) {
- mValidAvdList = mBrokenAvdList = null;
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * Updates an AVD with new path to the system image folders.
- * @param name the name of the AVD to update.
- * @param log the log object to receive action logs. Cannot be null.
- * @throws IOException
- */
- public void updateAvd(String name, ILogger log) throws IOException {
- // find the AVD to update. It should be be in the broken list.
- AvdInfo avd = null;
- synchronized (mAllAvdList) {
- for (AvdInfo info : mAllAvdList) {
- if (info.getName().equals(name)) {
- avd = info;
- break;
- }
- }
- }
-
- if (avd == null) {
- // not in the broken list, just return.
- log.error(null, "There is no Android Virtual Device named '%s'.", name);
- return;
- }
-
- updateAvd(avd, log);
- }
-
-
- /**
- * Updates an AVD with new path to the system image folders.
- * @param avd the AVD to update.
- * @param log the log object to receive action logs. Cannot be null.
- * @throws IOException
- */
- public void updateAvd(AvdInfo avd, ILogger log) throws IOException {
- // get the properties. This is a unmodifiable Map.
- Map<String, String> oldProperties = avd.getProperties();
-
- // create a new map
- Map<String, String> properties = new HashMap<String, String>();
- if (oldProperties != null) {
- properties.putAll(oldProperties);
- }
-
- AvdStatus status;
-
- // create the path to the new system images.
- if (setImagePathProperties(avd.getTarget(), avd.getAbiType(), properties, log)) {
- if (properties.containsKey(AVD_INI_IMAGES_1)) {
- log.info("Updated '%1$s' with value '%2$s'\n", AVD_INI_IMAGES_1,
- properties.get(AVD_INI_IMAGES_1));
- }
-
- if (properties.containsKey(AVD_INI_IMAGES_2)) {
- log.info("Updated '%1$s' with value '%2$s'\n", AVD_INI_IMAGES_2,
- properties.get(AVD_INI_IMAGES_2));
- }
-
- status = AvdStatus.OK;
- } else {
- log.error(null, "Unable to find non empty system images folders for %1$s",
- avd.getName());
- //FIXME: display paths to empty image folders?
- status = AvdStatus.ERROR_IMAGE_DIR;
- }
- updateAvd(avd, properties, status, log);
- }
-
- public void updateAvd(AvdInfo avd,
- Map<String, String> newProperties,
- AvdStatus status,
- ILogger log) throws IOException {
- // now write the config file
- File configIniFile = new File(avd.getDataFolderPath(), CONFIG_INI);
- writeIniFile(configIniFile, newProperties);
-
- // finally create a new AvdInfo for this unbroken avd and add it to the list.
- // instead of creating the AvdInfo object directly we reparse it, to detect other possible
- // errors
- // FIXME: We may want to create this AvdInfo by reparsing the AVD instead. This could detect other errors.
- AvdInfo newAvd = new AvdInfo(
- avd.getName(),
- avd.getIniFile(),
- avd.getDataFolderPath(),
- avd.getTargetHash(),
- avd.getTarget(),
- avd.getAbiType(),
- newProperties);
-
- replaceAvd(avd, newAvd);
- }
-
- /**
- * Sets the paths to the system images in a properties map.
- *
- * @param target the target in which to find the system images.
- * @param abiType the abi type of the avd to find
- * the architecture-dependent system images.
- * @param properties the properties in which to set the paths.
- * @param log the log object to receive action logs. Cannot be null.
- * @return true if success, false if some path are missing.
- */
- private boolean setImagePathProperties(IAndroidTarget target,
- String abiType,
- Map<String, String> properties,
- ILogger log) {
- properties.remove(AVD_INI_IMAGES_1);
- properties.remove(AVD_INI_IMAGES_2);
-
- try {
- String property = AVD_INI_IMAGES_1;
-
- // First the image folders of the target itself
- String imagePath = getImageRelativePath(target, abiType);
- if (imagePath != null) {
- properties.put(property, imagePath);
- property = AVD_INI_IMAGES_2;
- }
-
- // If the target is an add-on we need to add the Platform image as a backup.
- IAndroidTarget parent = target.getParent();
- if (parent != null) {
- imagePath = getImageRelativePath(parent, abiType);
- if (imagePath != null) {
- properties.put(property, imagePath);
- }
- }
-
- // we need at least one path!
- return properties.containsKey(AVD_INI_IMAGES_1);
- } catch (InvalidTargetPathException e) {
- log.error(e, e.getMessage());
- }
-
- return false;
- }
-
- /**
- * Replaces an old {@link AvdInfo} with a new one in the lists storing them.
- * @param oldAvd the {@link AvdInfo} to remove.
- * @param newAvd the {@link AvdInfo} to add.
- */
- private void replaceAvd(AvdInfo oldAvd, AvdInfo newAvd) {
- synchronized (mAllAvdList) {
- mAllAvdList.remove(oldAvd);
- mAllAvdList.add(newAvd);
- mValidAvdList = mBrokenAvdList = null;
- }
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/avd/HardwareProperties.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/avd/HardwareProperties.java
deleted file mode 100644
index 02241ef..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/avd/HardwareProperties.java
+++ /dev/null
@@ -1,303 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.avd;
-
-import com.android.utils.ILogger;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.Map;
-import java.util.TreeMap;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class HardwareProperties {
- /** AVD/config.ini key for whether hardware buttons are present. */
- public static final String HW_MAINKEYS = "hw.mainKeys";
-
- /** AVD/config.ini key indicating whether trackball is present. */
- public static final String HW_TRACKBALL = "hw.trackBall";
-
- /** AVD/config.ini key indicating whether qwerty keyboard is present. */
- public static final String HW_KEYBOARD = "hw.keyboard";
-
- /** AVD/config.ini key indicating whether dpad is present. */
- public static final String HW_DPAD = "hw.dPad";
-
- /** AVD/config.ini key indicating whether gps is present. */
- public static final String HW_GPS = "hw.gps";
-
- /** AVD/config.ini key indicating whether the device is running on battery. */
- public static final String HW_BATTERY = "hw.battery";
-
- /** AVD/config.ini key indicating whether accelerometer is present. */
- public static final String HW_ACCELEROMETER = "hw.accelerometer";
-
- /** AVD/config.ini key indicating whether gyroscope is present. */
- public static final String HW_ORIENTATION_SENSOR = "hw.sensors.orientation";
-
- /** AVD/config.ini key indicating whether h/w mic is present. */
- public static final String HW_AUDIO_INPUT = "hw.audioInput";
-
- /** AVD/config.ini key indicating whether sdcard is present. */
- public static final String HW_SDCARD = "hw.sdCard";
-
- /** AVD/config.ini key for LCD density. */
- public static final String HW_LCD_DENSITY = "hw.lcd.density";
-
- /** AVD/config.ini key indicating whether proximity sensor present. */
- public static final String HW_PROXIMITY_SENSOR = "hw.sensors.proximity";
-
-
- private final static Pattern PATTERN_PROP = Pattern.compile(
- "^([a-zA-Z0-9._-]+)\\s*=\\s*(.*)\\s*$");
-
- /** Property name in the generated avd config file; String; e.g. "hw.screen" */
- private final static String HW_PROP_NAME = "name"; //$NON-NLS-1$
- /** Property type, one of {@link HardwarePropertyType} */
- private final static String HW_PROP_TYPE = "type"; //$NON-NLS-1$
- /** Default value of the property. String matching the property type. */
- private final static String HW_PROP_DEFAULT = "default"; //$NON-NLS-1$
- /** User-visible name of the property. String. */
- private final static String HW_PROP_ABSTRACT = "abstract"; //$NON-NLS-1$
- /** User-visible description of the property. String. */
- private final static String HW_PROP_DESC = "description"; //$NON-NLS-1$
- /** Comma-separate values for a property of type "enum" */
- private final static String HW_PROP_ENUM = "enum"; //$NON-NLS-1$
-
- public final static String BOOLEAN_YES = "yes";
- public final static String BOOLEAN_NO = "no";
- public final static String[] BOOLEAN_VALUES = new String[] { BOOLEAN_YES, BOOLEAN_NO };
- public final static Pattern DISKSIZE_PATTERN = Pattern.compile("\\d+[MK]B"); //$NON-NLS-1$
-
- /** Represents the type of a hardware property value. */
- public enum HardwarePropertyType {
- INTEGER ("integer", false /*isEnum*/), //$NON-NLS-1$
- BOOLEAN ("boolean", false /*isEnum*/), //$NON-NLS-1$
- DISKSIZE ("diskSize", false /*isEnum*/), //$NON-NLS-1$
- STRING ("string", false /*isEnum*/), //$NON-NLS-1$
- INTEGER_ENUM("integer", true /*isEnum*/), //$NON-NLS-1$
- STRING_ENUM ("string", true /*isEnum*/); //$NON-NLS-1$
-
-
- private String mName;
- private boolean mIsEnum;
-
- HardwarePropertyType(String name, boolean isEnum) {
- mName = name;
- mIsEnum = isEnum;
- }
-
- /** Returns the name of the type (e.g. "string", "boolean", etc.) */
- public String getName() {
- return mName;
- }
-
- /** Indicates whether this type is an enum (e.g. "enum of strings"). */
- public boolean isEnum() {
- return mIsEnum;
- }
-
- /** Returns the internal HardwarePropertyType object matching the given type name. */
- public static HardwarePropertyType getEnum(String name, boolean isEnum) {
- for (HardwarePropertyType type : values()) {
- if (type.mName.equals(name) && type.mIsEnum == isEnum) {
- return type;
- }
- }
-
- return null;
- }
- }
-
- public static final class HardwareProperty {
- private String mName;
- private HardwarePropertyType mType;
- /** the string representation of the default value. can be null. */
- private String mDefault;
- /** the choices for an enum. Null if not an enum. */
- private String[] mEnum;
- private String mAbstract;
- private String mDescription;
-
- public HardwareProperty() {
- // initialize strings to sane defaults, as not all properties will be set from
- // the ini file
- mName = "";
- mDefault = "";
- mAbstract = "";
- mDescription = "";
- }
-
- /** Returns the hardware config name of the property, e.g. "hw.screen" */
- public String getName() {
- return mName;
- }
-
- /** Returns the property type, one of {@link HardwarePropertyType} */
- public HardwarePropertyType getType() {
- return mType;
- }
-
- /**
- * Returns the default value of the property.
- * String matching the property type.
- * Can be null.
- */
- public String getDefault() {
- return mDefault;
- }
-
- /** Returns the user-visible name of the property. */
- public String getAbstract() {
- return mAbstract;
- }
-
- /** Returns the user-visible description of the property. */
- public String getDescription() {
- return mDescription;
- }
-
- /** Returns the possible values for an enum property. Can be null. */
- public String[] getEnum() {
- return mEnum;
- }
-
- public boolean isValidForUi() {
- // don't display single string type for now.
- return mType != HardwarePropertyType.STRING || mType.isEnum();
- }
- }
-
- /**
- * Parses the hardware definition file.
- * @param file the property file to parse
- * @param log the ILogger object receiving warning/error from the parsing. Cannot be null.
- * @return the map of (key,value) pairs, or null if the parsing failed.
- */
- public static Map<String, HardwareProperty> parseHardwareDefinitions(File file, ILogger log) {
- BufferedReader reader = null;
- try {
- FileInputStream fis = new FileInputStream(file);
- reader = new BufferedReader(new InputStreamReader(fis));
-
- Map<String, HardwareProperty> map = new TreeMap<String, HardwareProperty>();
-
- String line = null;
- HardwareProperty prop = null;
- while ((line = reader.readLine()) != null) {
- if (line.length() > 0 && line.charAt(0) != '#') {
- Matcher m = PATTERN_PROP.matcher(line);
- if (m.matches()) {
- String key = m.group(1);
- String value = m.group(2);
-
- if (HW_PROP_NAME.equals(key)) {
- prop = new HardwareProperty();
- prop.mName = value;
- map.put(prop.mName, prop);
- }
-
- if (prop == null) {
- log.warning("Error parsing '%1$s': missing '%2$s'",
- file.getAbsolutePath(), HW_PROP_NAME);
- return null;
- }
-
- if (HW_PROP_TYPE.equals(key)) {
- // Note: we don't know yet whether this type is an enum.
- // This is indicated by the "enum = value" line that is parsed later.
- prop.mType = HardwarePropertyType.getEnum(value, false);
- assert (prop.mType != null);
- } else if (HW_PROP_DEFAULT.equals(key)) {
- prop.mDefault = value;
- } else if (HW_PROP_ABSTRACT.equals(key)) {
- prop.mAbstract = value;
- } else if (HW_PROP_DESC.equals(key)) {
- prop.mDescription = value;
- } else if (HW_PROP_ENUM.equals(key)) {
- if (!prop.mType.isEnum()) {
- // Change the type to an enum, if valid.
- prop.mType = HardwarePropertyType.getEnum(prop.mType.getName(),
- true);
- assert (prop.mType != null);
- }
-
- // Sanitize input: trim spaces, ignore empty entries.
- String[] v = value.split(",");
- int n = 0;
- for (int i = 0; i < v.length; i++) {
- String s = v[i] = v[i].trim();
- if (s.length() > 0) {
- n++;
- }
- }
- prop.mEnum = new String[n];
- n = 0;
- for (int i = 0; i < v.length; i++) {
- String s = v[i];
- if (s.length() > 0) {
- prop.mEnum[n++] = s;
- }
- }
- }
- } else {
- log.warning("Error parsing '%1$s': \"%2$s\" is not a valid syntax",
- file.getAbsolutePath(), line);
- return null;
- }
- }
- }
-
- return map;
- } catch (FileNotFoundException e) {
- // this should not happen since we usually test the file existence before
- // calling the method.
- // Return null below.
- } catch (IOException e) {
- log.warning("Error parsing '%1$s': %2$s.", file.getAbsolutePath(),
- e.getMessage());
- } finally {
- if (reader != null) {
- try {
- reader.close();
- } catch (IOException e) {
- // ignore
- }
- }
- }
-
- return null;
- }
-
- /**
- * Returns the index of <var>value</var> in {@link #BOOLEAN_VALUES}.
- */
- public static int getBooleanValueIndex(String value) {
- if (BOOLEAN_YES.equals(value)) {
- return 0;
- } else if (BOOLEAN_NO.equals(value)) {
- return 1;
- }
-
- return -1;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/build/BuildConfig.template b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/build/BuildConfig.template
deleted file mode 100644
index 0344b55..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/build/BuildConfig.template
+++ /dev/null
@@ -1,6 +0,0 @@
-/** Automatically generated file. DO NOT MODIFY */
-package #PACKAGE#;
-
-public final class BuildConfig {
- public final static boolean DEBUG = #DEBUG#;
-}
\ No newline at end of file
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/build/BuildConfigGenerator.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/build/BuildConfigGenerator.java
deleted file mode 100644
index 038975a..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/build/BuildConfigGenerator.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.build;
-
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-
-/**
- * Class able to generate a BuildConfig class in Android project.
- * The BuildConfig class contains constants related to the build target.
- */
-public class BuildConfigGenerator {
-
- public final static String BUILD_CONFIG_NAME = "BuildConfig.java";
-
- private final static String PH_PACKAGE = "#PACKAGE#";
- private final static String PH_DEBUG = "#DEBUG#";
-
- private final String mGenFolder;
- private final String mAppPackage;
- private final boolean mDebug;
-
- /**
- * Creates a generator
- * @param genFolder the gen folder of the project
- * @param appPackage the application package
- * @param debug whether it's a debug build
- */
- public BuildConfigGenerator(String genFolder, String appPackage, boolean debug) {
- mGenFolder = genFolder;
- mAppPackage = appPackage;
- mDebug = debug;
- }
-
- /**
- * Returns a File representing where the BuildConfig class will be.
- */
- public File getFolderPath() {
- File genFolder = new File(mGenFolder);
- return new File(genFolder, mAppPackage.replace('.', File.separatorChar));
- }
-
- public File getBuildConfigFile() {
- File folder = getFolderPath();
- return new File(folder, BUILD_CONFIG_NAME);
- }
-
- /**
- * Generates the BuildConfig class.
- */
- public void generate() throws IOException {
- String template = readEmbeddedTextFile("BuildConfig.template");
-
- Map<String, String> map = new HashMap<String, String>();
- map.put(PH_PACKAGE, mAppPackage);
- map.put(PH_DEBUG, Boolean.toString(mDebug));
-
- String content = replaceParameters(template, map);
-
- File pkgFolder = getFolderPath();
- if (pkgFolder.isDirectory() == false) {
- pkgFolder.mkdirs();
- }
-
- File buildConfigJava = new File(pkgFolder, BUILD_CONFIG_NAME);
- writeFile(buildConfigJava, content);
- }
-
- /**
- * Reads and returns the content of a text file embedded in the jar file.
- * @param filepath the file path to the text file
- * @return null if the file could not be read
- * @throws IOException
- */
- private String readEmbeddedTextFile(String filepath) throws IOException {
- InputStream is = BuildConfigGenerator.class.getResourceAsStream(filepath);
- if (is != null) {
- BufferedReader reader = new BufferedReader(new InputStreamReader(is));
-
- String line;
- StringBuilder total = new StringBuilder(reader.readLine());
- while ((line = reader.readLine()) != null) {
- total.append('\n');
- total.append(line);
- }
-
- return total.toString();
- }
-
- // this really shouldn't happen unless the sdklib packaging is broken.
- throw new IOException("BuildConfig template is missing!");
- }
-
- private void writeFile(File file, String content) throws IOException {
- FileOutputStream fos = null;
- try {
- fos = new FileOutputStream(file);
- InputStream source = new ByteArrayInputStream(content.getBytes("UTF-8"));
-
- byte[] buffer = new byte[1024];
- int count = 0;
- while ((count = source.read(buffer)) != -1) {
- fos.write(buffer, 0, count);
- }
- } finally {
- if (fos != null) {
- fos.close();
- }
- }
- }
-
- /**
- * Replaces placeholders found in a string with values.
- *
- * @param str the string to search for placeholders.
- * @param parameters a map of <placeholder, Value> to search for in the string
- * @return A new String object with the placeholder replaced by the values.
- */
- private String replaceParameters(String str, Map<String, String> parameters) {
-
- for (Entry<String, String> entry : parameters.entrySet()) {
- String value = entry.getValue();
- if (value != null) {
- str = str.replaceAll(entry.getKey(), value);
- }
- }
-
- return str;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/build/DebugKeyProvider.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/build/DebugKeyProvider.java
deleted file mode 100644
index 4f4af36..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/build/DebugKeyProvider.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.build;
-
-import com.android.prefs.AndroidLocation;
-import com.android.prefs.AndroidLocation.AndroidLocationException;
-
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.security.KeyStore;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.PrivateKey;
-import java.security.UnrecoverableEntryException;
-import java.security.UnrecoverableKeyException;
-import java.security.cert.Certificate;
-import java.security.cert.CertificateException;
-
-/**
- * A provider of a dummy key to sign Android application for debugging purpose.
- * <p/>This provider uses a custom keystore to create and store a key with a known password.
- */
-public class DebugKeyProvider {
-
- public interface IKeyGenOutput {
- public void out(String message);
- public void err(String message);
- }
-
- private static final String PASSWORD_STRING = "android";
- private static final char[] PASSWORD_CHAR = PASSWORD_STRING.toCharArray();
- private static final String DEBUG_ALIAS = "AndroidDebugKey";
-
- // Certificate CN value. This is a hard-coded value for the debug key.
- // Android Market checks against this value in order to refuse applications signed with
- // debug keys.
- private static final String CERTIFICATE_DESC = "CN=Android Debug,O=Android,C=US";
-
- private KeyStore.PrivateKeyEntry mEntry;
-
- public static class KeytoolException extends Exception {
- /** default serial uid */
- private static final long serialVersionUID = 1L;
- private String mJavaHome = null;
- private String mCommandLine = null;
-
- KeytoolException(String message) {
- super(message);
- }
-
- KeytoolException(String message, String javaHome, String commandLine) {
- super(message);
-
- mJavaHome = javaHome;
- mCommandLine = commandLine;
- }
-
- public String getJavaHome() {
- return mJavaHome;
- }
-
- public String getCommandLine() {
- return mCommandLine;
- }
- }
-
- /**
- * Creates a provider using a keystore at the given location.
- * <p/>The keystore, and a new random android debug key are created if they do not yet exist.
- * <p/>Password for the store/key is <code>android</code>, and the key alias is
- * <code>AndroidDebugKey</code>.
- * @param osKeyStorePath the OS path to the keystore, or <code>null</code> if the default one
- * is to be used.
- * @param storeType an optional keystore type, or <code>null</code> if the default is to
- * be used.
- * @param output an optional {@link IKeyGenOutput} object to get the stdout and stderr
- * of the keytool process call.
- * @throws KeytoolException If the creation of the debug key failed.
- * @throws AndroidLocationException
- */
- public DebugKeyProvider(String osKeyStorePath, String storeType, IKeyGenOutput output)
- throws KeyStoreException, NoSuchAlgorithmException, CertificateException,
- UnrecoverableEntryException, IOException, KeytoolException, AndroidLocationException {
-
- if (osKeyStorePath == null) {
- osKeyStorePath = getDefaultKeyStoreOsPath();
- }
-
- if (loadKeyEntry(osKeyStorePath, storeType) == false) {
- // create the store with the key
- createNewStore(osKeyStorePath, storeType, output);
- }
- }
-
- /**
- * Returns the OS path to the default debug keystore.
- *
- * @return The OS path to the default debug keystore.
- * @throws KeytoolException
- * @throws AndroidLocationException
- */
- public static String getDefaultKeyStoreOsPath()
- throws KeytoolException, AndroidLocationException {
- String folder = AndroidLocation.getFolder();
- if (folder == null) {
- throw new KeytoolException("Failed to get HOME directory!\n");
- }
- String osKeyStorePath = folder + "debug.keystore";
-
- return osKeyStorePath;
- }
-
- /**
- * Returns the debug {@link PrivateKey} to use to sign applications for debug purpose.
- * @return the private key or <code>null</code> if its creation failed.
- */
- @SuppressWarnings("unused") // the thrown Exceptions are not actually thrown
- public PrivateKey getDebugKey() throws KeyStoreException, NoSuchAlgorithmException,
- UnrecoverableKeyException, UnrecoverableEntryException {
- if (mEntry != null) {
- return mEntry.getPrivateKey();
- }
-
- return null;
- }
-
- /**
- * Returns the debug {@link Certificate} to use to sign applications for debug purpose.
- * @return the certificate or <code>null</code> if its creation failed.
- */
- @SuppressWarnings("unused") // the thrown Exceptions are not actually thrown
- public Certificate getCertificate() throws KeyStoreException, NoSuchAlgorithmException,
- UnrecoverableKeyException, UnrecoverableEntryException {
- if (mEntry != null) {
- return mEntry.getCertificate();
- }
-
- return null;
- }
-
- /**
- * Loads the debug key from the keystore.
- * @param osKeyStorePath the OS path to the keystore.
- * @param storeType an optional keystore type, or <code>null</code> if the default is to
- * be used.
- * @return <code>true</code> if success, <code>false</code> if the keystore does not exist.
- */
- private boolean loadKeyEntry(String osKeyStorePath, String storeType) throws KeyStoreException,
- NoSuchAlgorithmException, CertificateException, IOException,
- UnrecoverableEntryException {
- FileInputStream fis = null;
- try {
- KeyStore keyStore = KeyStore.getInstance(
- storeType != null ? storeType : KeyStore.getDefaultType());
- fis = new FileInputStream(osKeyStorePath);
- keyStore.load(fis, PASSWORD_CHAR);
- mEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry(
- DEBUG_ALIAS, new KeyStore.PasswordProtection(PASSWORD_CHAR));
- } catch (FileNotFoundException e) {
- return false;
- } finally {
- if (fis != null) {
- try {
- fis.close();
- } catch (IOException e) {
- // pass
- }
- }
- }
-
- return true;
- }
-
- /**
- * Creates a new store
- * @param osKeyStorePath the location of the store
- * @param storeType an optional keystore type, or <code>null</code> if the default is to
- * be used.
- * @param output an optional {@link IKeyGenOutput} object to get the stdout and stderr
- * of the keytool process call.
- * @throws KeyStoreException
- * @throws NoSuchAlgorithmException
- * @throws CertificateException
- * @throws UnrecoverableEntryException
- * @throws IOException
- * @throws KeytoolException
- */
- private void createNewStore(String osKeyStorePath, String storeType, IKeyGenOutput output)
- throws KeyStoreException, NoSuchAlgorithmException, CertificateException,
- UnrecoverableEntryException, IOException, KeytoolException {
-
- if (KeystoreHelper.createNewStore(osKeyStorePath, storeType, PASSWORD_STRING, DEBUG_ALIAS,
- PASSWORD_STRING, CERTIFICATE_DESC, 30 /* validity*/, output)) {
- loadKeyEntry(osKeyStorePath, storeType);
- }
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/build/KeystoreHelper.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/build/KeystoreHelper.java
deleted file mode 100644
index ba4ce8c..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/build/KeystoreHelper.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.build;
-
-import com.android.annotations.Nullable;
-import com.android.sdklib.internal.build.DebugKeyProvider.IKeyGenOutput;
-import com.android.sdklib.internal.build.DebugKeyProvider.KeytoolException;
-import com.android.sdklib.util.GrabProcessOutput;
-import com.android.sdklib.util.GrabProcessOutput.IProcessOutput;
-import com.android.sdklib.util.GrabProcessOutput.Wait;
-
-import java.io.File;
-import java.io.IOException;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.UnrecoverableEntryException;
-import java.security.cert.CertificateException;
-import java.util.ArrayList;
-
-/**
- * A Helper to create new keystore/key.
- */
-public final class KeystoreHelper {
-
- /**
- * Creates a new store
- * @param osKeyStorePath the location of the store
- * @param storeType an optional keystore type, or <code>null</code> if the default is to
- * be used.
- * @param output an optional {@link IKeyGenOutput} object to get the stdout and stderr
- * of the keytool process call.
- * @throws KeyStoreException
- * @throws NoSuchAlgorithmException
- * @throws CertificateException
- * @throws UnrecoverableEntryException
- * @throws IOException
- * @throws KeytoolException
- */
- public static boolean createNewStore(
- String osKeyStorePath,
- String storeType,
- String storePassword,
- String alias,
- String keyPassword,
- String description,
- int validityYears,
- final IKeyGenOutput output)
- throws KeyStoreException, NoSuchAlgorithmException, CertificateException,
- UnrecoverableEntryException, IOException, KeytoolException {
-
- // get the executable name of keytool depending on the platform.
- String os = System.getProperty("os.name");
-
- String keytoolCommand;
- if (os.startsWith("Windows")) {
- keytoolCommand = "keytool.exe";
- } else {
- keytoolCommand = "keytool";
- }
-
- String javaHome = System.getProperty("java.home");
-
- if (javaHome != null && javaHome.length() > 0) {
- keytoolCommand = javaHome + File.separator + "bin" + File.separator + keytoolCommand;
- }
-
- // create the command line to call key tool to build the key with no user input.
- ArrayList<String> commandList = new ArrayList<String>();
- commandList.add(keytoolCommand);
- commandList.add("-genkey");
- commandList.add("-alias");
- commandList.add(alias);
- commandList.add("-keyalg");
- commandList.add("RSA");
- commandList.add("-dname");
- commandList.add(description);
- commandList.add("-validity");
- commandList.add(Integer.toString(validityYears * 365));
- commandList.add("-keypass");
- commandList.add(keyPassword);
- commandList.add("-keystore");
- commandList.add(osKeyStorePath);
- commandList.add("-storepass");
- commandList.add(storePassword);
- if (storeType != null) {
- commandList.add("-storetype");
- commandList.add(storeType);
- }
-
- String[] commandArray = commandList.toArray(new String[commandList.size()]);
-
- // launch the command line process
- int result = 0;
- try {
- Process process = Runtime.getRuntime().exec(commandArray);
- result = GrabProcessOutput.grabProcessOutput(
- process,
- Wait.WAIT_FOR_READERS,
- new IProcessOutput() {
- @Override
- public void out(@Nullable String line) {
- if (line != null) {
- if (output != null) {
- output.out(line);
- } else {
- System.out.println(line);
- }
- }
- }
-
- @Override
- public void err(@Nullable String line) {
- if (line != null) {
- if (output != null) {
- output.err(line);
- } else {
- System.err.println(line);
- }
- }
- }
- });
- } catch (Exception e) {
- // create the command line as one string for debugging purposes
- StringBuilder builder = new StringBuilder();
- boolean firstArg = true;
- for (String arg : commandArray) {
- boolean hasSpace = arg.indexOf(' ') != -1;
-
- if (firstArg == true) {
- firstArg = false;
- } else {
- builder.append(' ');
- }
-
- if (hasSpace) {
- builder.append('"');
- }
-
- builder.append(arg);
-
- if (hasSpace) {
- builder.append('"');
- }
- }
-
- throw new KeytoolException("Failed to create key: " + e.getMessage(),
- javaHome, builder.toString());
- }
-
- if (result != 0) {
- return false;
- }
-
- return true;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/build/SignedJarBuilder.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/build/SignedJarBuilder.java
deleted file mode 100644
index 5044b45..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/build/SignedJarBuilder.java
+++ /dev/null
@@ -1,394 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.build;
-
-import com.android.sdklib.internal.build.SignedJarBuilder.IZipEntryFilter.ZipAbortException;
-
-import sun.misc.BASE64Encoder;
-import sun.security.pkcs.ContentInfo;
-import sun.security.pkcs.PKCS7;
-import sun.security.pkcs.SignerInfo;
-import sun.security.x509.AlgorithmId;
-import sun.security.x509.X500Name;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FilterOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.security.DigestOutputStream;
-import java.security.GeneralSecurityException;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.security.PrivateKey;
-import java.security.Signature;
-import java.security.SignatureException;
-import java.security.cert.X509Certificate;
-import java.util.Map;
-import java.util.jar.Attributes;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-import java.util.jar.JarOutputStream;
-import java.util.jar.Manifest;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
-/**
- * A Jar file builder with signature support.
- */
-public class SignedJarBuilder {
- private static final String DIGEST_ALGORITHM = "SHA1";
- private static final String DIGEST_ATTR = "SHA1-Digest";
- private static final String DIGEST_MANIFEST_ATTR = "SHA1-Digest-Manifest";
-
- /** Write to another stream and also feed it to the Signature object. */
- private static class SignatureOutputStream extends FilterOutputStream {
- private Signature mSignature;
- private int mCount = 0;
-
- public SignatureOutputStream(OutputStream out, Signature sig) {
- super(out);
- mSignature = sig;
- }
-
- @Override
- public void write(int b) throws IOException {
- try {
- mSignature.update((byte) b);
- } catch (SignatureException e) {
- throw new IOException("SignatureException: " + e);
- }
- super.write(b);
- mCount++;
- }
-
- @Override
- public void write(byte[] b, int off, int len) throws IOException {
- try {
- mSignature.update(b, off, len);
- } catch (SignatureException e) {
- throw new IOException("SignatureException: " + e);
- }
- super.write(b, off, len);
- mCount += len;
- }
-
- public int size() {
- return mCount;
- }
- }
-
- private JarOutputStream mOutputJar;
- private PrivateKey mKey;
- private X509Certificate mCertificate;
- private Manifest mManifest;
- private BASE64Encoder mBase64Encoder;
- private MessageDigest mMessageDigest;
-
- private byte[] mBuffer = new byte[4096];
-
- /**
- * Classes which implement this interface provides a method to check whether a file should
- * be added to a Jar file.
- */
- public interface IZipEntryFilter {
-
- /**
- * An exception thrown during packaging of a zip file into APK file.
- * This is typically thrown by implementations of
- * {@link IZipEntryFilter#checkEntry(String)}.
- */
- public static class ZipAbortException extends Exception {
- private static final long serialVersionUID = 1L;
-
- public ZipAbortException() {
- super();
- }
-
- public ZipAbortException(String format, Object... args) {
- super(String.format(format, args));
- }
-
- public ZipAbortException(Throwable cause, String format, Object... args) {
- super(String.format(format, args), cause);
- }
-
- public ZipAbortException(Throwable cause) {
- super(cause);
- }
- }
-
-
- /**
- * Checks a file for inclusion in a Jar archive.
- * @param archivePath the archive file path of the entry
- * @return <code>true</code> if the file should be included.
- * @throws ZipAbortException if writing the file should be aborted.
- */
- public boolean checkEntry(String archivePath) throws ZipAbortException;
- }
-
- /**
- * Creates a {@link SignedJarBuilder} with a given output stream, and signing information.
- * <p/>If either <code>key</code> or <code>certificate</code> is <code>null</code> then
- * the archive will not be signed.
- * @param out the {@link OutputStream} where to write the Jar archive.
- * @param key the {@link PrivateKey} used to sign the archive, or <code>null</code>.
- * @param certificate the {@link X509Certificate} used to sign the archive, or
- * <code>null</code>.
- * @throws IOException
- * @throws NoSuchAlgorithmException
- */
- public SignedJarBuilder(OutputStream out, PrivateKey key, X509Certificate certificate)
- throws IOException, NoSuchAlgorithmException {
- mOutputJar = new JarOutputStream(out);
- mOutputJar.setLevel(9);
- mKey = key;
- mCertificate = certificate;
-
- if (mKey != null && mCertificate != null) {
- mManifest = new Manifest();
- Attributes main = mManifest.getMainAttributes();
- main.putValue("Manifest-Version", "1.0");
- main.putValue("Created-By", "1.0 (Android)");
-
- mBase64Encoder = new BASE64Encoder();
- mMessageDigest = MessageDigest.getInstance(DIGEST_ALGORITHM);
- }
- }
-
- /**
- * Writes a new {@link File} into the archive.
- * @param inputFile the {@link File} to write.
- * @param jarPath the filepath inside the archive.
- * @throws IOException
- */
- public void writeFile(File inputFile, String jarPath) throws IOException {
- // Get an input stream on the file.
- FileInputStream fis = new FileInputStream(inputFile);
- try {
-
- // create the zip entry
- JarEntry entry = new JarEntry(jarPath);
- entry.setTime(inputFile.lastModified());
-
- writeEntry(fis, entry);
- } finally {
- // close the file stream used to read the file
- fis.close();
- }
- }
-
- /**
- * Copies the content of a Jar/Zip archive into the receiver archive.
- * <p/>An optional {@link IZipEntryFilter} allows to selectively choose which files
- * to copy over.
- * @param input the {@link InputStream} for the Jar/Zip to copy.
- * @param filter the filter or <code>null</code>
- * @throws IOException
- * @throws ZipAbortException if the {@link IZipEntryFilter} filter indicated that the write
- * must be aborted.
- */
- public void writeZip(InputStream input, IZipEntryFilter filter)
- throws IOException, ZipAbortException {
- ZipInputStream zis = new ZipInputStream(input);
-
- try {
- // loop on the entries of the intermediary package and put them in the final package.
- ZipEntry entry;
- while ((entry = zis.getNextEntry()) != null) {
- String name = entry.getName();
-
- // do not take directories or anything inside a potential META-INF folder.
- if (entry.isDirectory() || name.startsWith("META-INF/")) {
- continue;
- }
-
- // if we have a filter, we check the entry against it
- if (filter != null && filter.checkEntry(name) == false) {
- continue;
- }
-
- JarEntry newEntry;
-
- // Preserve the STORED method of the input entry.
- if (entry.getMethod() == JarEntry.STORED) {
- newEntry = new JarEntry(entry);
- } else {
- // Create a new entry so that the compressed len is recomputed.
- newEntry = new JarEntry(name);
- }
-
- writeEntry(zis, newEntry);
-
- zis.closeEntry();
- }
- } finally {
- zis.close();
- }
- }
-
- /**
- * Closes the Jar archive by creating the manifest, and signing the archive.
- * @throws IOException
- * @throws GeneralSecurityException
- */
- public void close() throws IOException, GeneralSecurityException {
- if (mManifest != null) {
- // write the manifest to the jar file
- mOutputJar.putNextEntry(new JarEntry(JarFile.MANIFEST_NAME));
- mManifest.write(mOutputJar);
-
- // CERT.SF
- Signature signature = Signature.getInstance("SHA1with" + mKey.getAlgorithm());
- signature.initSign(mKey);
- mOutputJar.putNextEntry(new JarEntry("META-INF/CERT.SF"));
- SignatureOutputStream out = new SignatureOutputStream(mOutputJar, signature);
- writeSignatureFile(out);
-
- // CERT.*
- mOutputJar.putNextEntry(new JarEntry("META-INF/CERT." + mKey.getAlgorithm()));
- writeSignatureBlock(signature, mCertificate, mKey);
-
- // close out at the end because it can also close mOutputJar.
- // (there's some timing issue here I think, because it's worked before with out
- // being closed after writing CERT.SF).
- out.close();
- }
-
- mOutputJar.close();
- mOutputJar = null;
- }
-
- /**
- * Clean up of the builder for interrupted workflow.
- * This does nothing if {@link #close()} was called successfully.
- */
- public void cleanUp() {
- if (mOutputJar != null) {
- try {
- mOutputJar.close();
- } catch (IOException e) {
- // pass
- }
- }
- }
-
- /**
- * Adds an entry to the output jar, and write its content from the {@link InputStream}
- * @param input The input stream from where to write the entry content.
- * @param entry the entry to write in the jar.
- * @throws IOException
- */
- private void writeEntry(InputStream input, JarEntry entry) throws IOException {
- // add the entry to the jar archive
- mOutputJar.putNextEntry(entry);
-
- // read the content of the entry from the input stream, and write it into the archive.
- int count;
- while ((count = input.read(mBuffer)) != -1) {
- mOutputJar.write(mBuffer, 0, count);
-
- // update the digest
- if (mMessageDigest != null) {
- mMessageDigest.update(mBuffer, 0, count);
- }
- }
-
- // close the entry for this file
- mOutputJar.closeEntry();
-
- if (mManifest != null) {
- // update the manifest for this entry.
- Attributes attr = mManifest.getAttributes(entry.getName());
- if (attr == null) {
- attr = new Attributes();
- mManifest.getEntries().put(entry.getName(), attr);
- }
- attr.putValue(DIGEST_ATTR, mBase64Encoder.encode(mMessageDigest.digest()));
- }
- }
-
- /** Writes a .SF file with a digest to the manifest. */
- private void writeSignatureFile(SignatureOutputStream out)
- throws IOException, GeneralSecurityException {
- Manifest sf = new Manifest();
- Attributes main = sf.getMainAttributes();
- main.putValue("Signature-Version", "1.0");
- main.putValue("Created-By", "1.0 (Android)");
-
- BASE64Encoder base64 = new BASE64Encoder();
- MessageDigest md = MessageDigest.getInstance(DIGEST_ALGORITHM);
- PrintStream print = new PrintStream(
- new DigestOutputStream(new ByteArrayOutputStream(), md),
- true, "UTF-8");
-
- // Digest of the entire manifest
- mManifest.write(print);
- print.flush();
- main.putValue(DIGEST_MANIFEST_ATTR, base64.encode(md.digest()));
-
- Map<String, Attributes> entries = mManifest.getEntries();
- for (Map.Entry<String, Attributes> entry : entries.entrySet()) {
- // Digest of the manifest stanza for this entry.
- print.print("Name: " + entry.getKey() + "\r\n");
- for (Map.Entry<Object, Object> att : entry.getValue().entrySet()) {
- print.print(att.getKey() + ": " + att.getValue() + "\r\n");
- }
- print.print("\r\n");
- print.flush();
-
- Attributes sfAttr = new Attributes();
- sfAttr.putValue(DIGEST_ATTR, base64.encode(md.digest()));
- sf.getEntries().put(entry.getKey(), sfAttr);
- }
-
- sf.write(out);
-
- // A bug in the java.util.jar implementation of Android platforms
- // up to version 1.6 will cause a spurious IOException to be thrown
- // if the length of the signature file is a multiple of 1024 bytes.
- // As a workaround, add an extra CRLF in this case.
- if ((out.size() % 1024) == 0) {
- out.write('\r');
- out.write('\n');
- }
- }
-
- /** Write the certificate file with a digital signature. */
- private void writeSignatureBlock(Signature signature, X509Certificate publicKey,
- PrivateKey privateKey)
- throws IOException, GeneralSecurityException {
- SignerInfo signerInfo = new SignerInfo(
- new X500Name(publicKey.getIssuerX500Principal().getName()),
- publicKey.getSerialNumber(),
- AlgorithmId.get(DIGEST_ALGORITHM),
- AlgorithmId.get(privateKey.getAlgorithm()),
- signature.sign());
-
- PKCS7 pkcs7 = new PKCS7(
- new AlgorithmId[] { AlgorithmId.get(DIGEST_ALGORITHM) },
- new ContentInfo(ContentInfo.DATA_OID, null),
- new X509Certificate[] { publicKey },
- new SignerInfo[] { signerInfo });
-
- pkcs7.encodeSignedData(mOutputJar);
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/build/SymbolLoader.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/build/SymbolLoader.java
deleted file mode 100644
index 3be729e..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/build/SymbolLoader.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.build;
-
-import com.google.common.base.Charsets;
-import com.google.common.collect.HashBasedTable;
-import com.google.common.collect.Table;
-import com.google.common.io.Files;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
-
-/**
- */
-public class SymbolLoader {
-
- private final File mSymbolFile;
- private Table<String, String, SymbolEntry> mSymbols;
-
- public static class SymbolEntry {
- private final String mName;
- private final String mType;
- private final String mValue;
-
- public SymbolEntry(String name, String type, String value) {
- mName = name;
- mType = type;
- mValue = value;
- }
-
- public String getValue() {
- return mValue;
- }
-
- public String getName() {
- return mName;
- }
-
- public String getType() {
- return mType;
- }
- }
-
- public SymbolLoader(File symbolFile) {
- mSymbolFile = symbolFile;
- }
-
- public void load() throws IOException {
- List<String> lines = Files.readLines(mSymbolFile, Charsets.UTF_8);
-
- mSymbols = HashBasedTable.create();
-
- String currentLine = "";
- try {
- for (String line : lines) {
- currentLine = line;
- // format is "<type> <class> <name> <value>"
- // don't want to split on space as value could contain spaces.
- int pos = line.indexOf(' ');
- String type = line.substring(0, pos);
- int pos2 = line.indexOf(' ', pos + 1);
- String className = line.substring(pos + 1, pos2);
- int pos3 = line.indexOf(' ', pos2 + 1);
- String name = line.substring(pos2 + 1, pos3);
- String value = line.substring(pos3 + 1);
-
- mSymbols.put(className, name, new SymbolEntry(name, type, value));
- }
- } catch (Exception e) {
- // Catch both ArrayIndexOutOfBoundsException and StringIndexOutOfBoundsException
- throw new IOException("File format error reading " + mSymbolFile.getAbsolutePath()
- + ": " + currentLine, e);
- }
- }
-
- Table<String, String, SymbolEntry> getSymbols() {
- return mSymbols;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/build/SymbolWriter.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/build/SymbolWriter.java
deleted file mode 100644
index 7411517..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/build/SymbolWriter.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.build;
-
-import com.android.SdkConstants;
-import com.android.sdklib.internal.build.SymbolLoader.SymbolEntry;
-import com.google.common.base.Charsets;
-import com.google.common.base.Splitter;
-import com.google.common.collect.Table;
-import com.google.common.io.Closeables;
-import com.google.common.io.Files;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.IOException;
-import java.util.Map;
-
-/**
- */
-public class SymbolWriter {
-
- private final String mOutFolder;
- private final String mPackageName;
- private final SymbolLoader mSymbols;
- private final SymbolLoader mValues;
-
- public SymbolWriter(String outFolder, String packageName, SymbolLoader symbols,
- SymbolLoader values) {
- mOutFolder = outFolder;
- mPackageName = packageName;
- mSymbols = symbols;
- mValues = values;
- }
-
- @SuppressWarnings("resource") // Eclipse does handle Closeables.closeQuietly; see E#381445
- public void write() throws IOException {
- Splitter splitter = Splitter.on('.');
- Iterable<String> folders = splitter.split(mPackageName);
- File file = new File(mOutFolder);
- for (String folder : folders) {
- file = new File(file, folder);
- }
- file.mkdirs();
- file = new File(file, SdkConstants.FN_RESOURCE_CLASS);
-
- BufferedWriter writer = null;
- try {
- writer = Files.newWriter(file, Charsets.UTF_8);
-
- writer.write("/* AUTO-GENERATED FILE. DO NOT MODIFY.\n");
- writer.write(" *\n");
- writer.write(" * This class was automatically generated by the\n");
- writer.write(" * aapt tool from the resource data it found. It\n");
- writer.write(" * should not be modified by hand.\n");
- writer.write(" */\n");
-
- writer.write("package ");
- writer.write(mPackageName);
- writer.write(";\n\npublic final class R {\n");
-
- Table<String, String, SymbolEntry> symbols = mSymbols.getSymbols();
- Table<String, String, SymbolEntry> values = mValues.getSymbols();
-
- for (String row : symbols.rowKeySet()) {
- writer.write("\tpublic static final class ");
- writer.write(row);
- writer.write(" {\n");
-
- for (Map.Entry<String, SymbolEntry> symbol : symbols.row(row).entrySet()) {
- // get the matching SymbolEntry from the values Table.
- SymbolEntry value = values.get(row, symbol.getKey());
- if (value != null) {
- writer.write("\t\tpublic static final ");
- writer.write(value.getType());
- writer.write(" ");
- writer.write(value.getName());
- writer.write(" = ");
- writer.write(value.getValue());
- writer.write(";\n");
- }
- }
-
- writer.write("\t}\n");
- }
-
- writer.write("}\n");
- } finally {
- Closeables.closeQuietly(writer);
- }
- }
-}
\ No newline at end of file
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/project/IPropertySource.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/project/IPropertySource.java
deleted file mode 100644
index 92bd6b9..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/project/IPropertySource.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.project;
-
-/**
- * A source able to return properties by name.
- *
- */
-public interface IPropertySource {
- String getProperty(String name);
- void debugPrint();
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/project/ProjectCreator.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/project/ProjectCreator.java
deleted file mode 100644
index 1fdea64..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/project/ProjectCreator.java
+++ /dev/null
@@ -1,1322 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.project;
-
-import com.android.SdkConstants;
-import com.android.io.FileWrapper;
-import com.android.io.FolderWrapper;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.internal.project.ProjectProperties.PropertyType;
-import com.android.utils.ILogger;
-import com.android.xml.AndroidManifest;
-import com.android.xml.AndroidXPathFactory;
-
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-/**
- * Creates the basic files needed to get an Android project up and running.
- */
-public class ProjectCreator {
-
- /** Version of the build.xml. Stored in version-tag */
- private final static int MIN_BUILD_VERSION_TAG = 1;
-
- /** Package path substitution string used in template files, i.e. "PACKAGE_PATH" */
- private final static String PH_JAVA_FOLDER = "PACKAGE_PATH";
- /** Package name substitution string used in template files, i.e. "PACKAGE" */
- private final static String PH_PACKAGE = "PACKAGE";
- /** Activity name substitution string used in template files, i.e. "ACTIVITY_NAME".
- * @deprecated This is only used for older templates. For new ones see
- * {@link #PH_ACTIVITY_ENTRY_NAME}, and {@link #PH_ACTIVITY_CLASS_NAME}. */
- @Deprecated
- private final static String PH_ACTIVITY_NAME = "ACTIVITY_NAME";
- /** Activity name substitution string used in manifest templates, i.e. "ACTIVITY_ENTRY_NAME".*/
- private final static String PH_ACTIVITY_ENTRY_NAME = "ACTIVITY_ENTRY_NAME";
- /** Activity name substitution string used in class templates, i.e. "ACTIVITY_CLASS_NAME".*/
- private final static String PH_ACTIVITY_CLASS_NAME = "ACTIVITY_CLASS_NAME";
- /** Activity FQ-name substitution string used in class templates, i.e. "ACTIVITY_FQ_NAME".*/
- private final static String PH_ACTIVITY_FQ_NAME = "ACTIVITY_FQ_NAME";
- /** Original Activity class name substitution string used in class templates, i.e.
- * "ACTIVITY_TESTED_CLASS_NAME".*/
- private final static String PH_ACTIVITY_TESTED_CLASS_NAME = "ACTIVITY_TESTED_CLASS_NAME";
- /** Project name substitution string used in template files, i.e. "PROJECT_NAME". */
- public final static String PH_PROJECT_NAME = "PROJECT_NAME";
- /** Application icon substitution string used in the manifest template */
- private final static String PH_ICON = "ICON";
- /** Version tag name substitution string used in template files, i.e. "VERSION_TAG". */
- private final static String PH_VERSION_TAG = "VERSION_TAG";
-
- /** The xpath to find a project name in an Ant build file. */
- private static final String XPATH_PROJECT_NAME = "/project/@name";
-
- /** Pattern for characters accepted in a project name. Since this will be used as a
- * directory name, we're being a bit conservative on purpose: dot and space cannot be used. */
- public static final Pattern RE_PROJECT_NAME = Pattern.compile("[a-zA-Z0-9_]+");
- /** List of valid characters for a project name. Used for display purposes. */
- public final static String CHARS_PROJECT_NAME = "a-z A-Z 0-9 _";
-
- /** Pattern for characters accepted in a package name. A package is list of Java identifier
- * separated by a dot. We need to have at least one dot (e.g. a two-level package name).
- * A Java identifier cannot start by a digit. */
- public static final Pattern RE_PACKAGE_NAME =
- Pattern.compile("[a-zA-Z_][a-zA-Z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z0-9_]*)+");
- /** List of valid characters for a project name. Used for display purposes. */
- public final static String CHARS_PACKAGE_NAME = "a-z A-Z 0-9 _";
-
- /** Pattern for characters accepted in an activity name, which is a Java identifier. */
- public static final Pattern RE_ACTIVITY_NAME =
- Pattern.compile("[a-zA-Z_][a-zA-Z0-9_]*");
- /** List of valid characters for a project name. Used for display purposes. */
- public final static String CHARS_ACTIVITY_NAME = "a-z A-Z 0-9 _";
-
-
- public enum OutputLevel {
- /** Silent mode. Project creation will only display errors. */
- SILENT,
- /** Normal mode. Project creation will display what's being done, display
- * error but not warnings. */
- NORMAL,
- /** Verbose mode. Project creation will display what's being done, errors and warnings. */
- VERBOSE;
- }
-
- /**
- * Exception thrown when a project creation fails, typically because a template
- * file cannot be written.
- */
- private static class ProjectCreateException extends Exception {
- /** default UID. This will not be serialized anyway. */
- private static final long serialVersionUID = 1L;
-
- @SuppressWarnings("unused")
- ProjectCreateException(String message) {
- super(message);
- }
-
- ProjectCreateException(Throwable t, String format, Object... args) {
- super(format != null ? String.format(format, args) : format, t);
- }
-
- ProjectCreateException(String format, Object... args) {
- super(String.format(format, args));
- }
- }
-
- /** The {@link OutputLevel} verbosity. */
- private final OutputLevel mLevel;
- /** Logger for errors and output. Cannot be null. */
- private final ILogger mLog;
- /** The OS path of the SDK folder. */
- private final String mSdkFolder;
- /** The {@link SdkManager} instance. */
- private final SdkManager mSdkManager;
-
- /**
- * Helper class to create android projects.
- *
- * @param sdkManager The {@link SdkManager} instance.
- * @param sdkFolder The OS path of the SDK folder.
- * @param level The {@link OutputLevel} verbosity.
- * @param log Logger for errors and output. Cannot be null.
- */
- public ProjectCreator(SdkManager sdkManager, String sdkFolder, OutputLevel level, ILogger log) {
- mSdkManager = sdkManager;
- mSdkFolder = sdkFolder;
- mLevel = level;
- mLog = log;
- }
-
- /**
- * Creates a new project.
- * <p/>
- * The caller should have already checked and sanitized the parameters.
- *
- * @param folderPath the folder of the project to create.
- * @param projectName the name of the project. The name must match the
- * {@link #RE_PROJECT_NAME} regex.
- * @param packageName the package of the project. The name must match the
- * {@link #RE_PACKAGE_NAME} regex.
- * @param activityEntry the activity of the project as it will appear in the manifest. Can be
- * null if no activity should be created. The name must match the
- * {@link #RE_ACTIVITY_NAME} regex.
- * @param target the project target.
- * @param library whether the project is a library.
- * @param pathToMainProject if non-null the project will be setup to test a main project
- * located at the given path.
- */
- public void createProject(String folderPath, String projectName,
- String packageName, String activityEntry, IAndroidTarget target, boolean library,
- String pathToMainProject) {
-
- // create project folder if it does not exist
- File projectFolder = checkNewProjectLocation(folderPath);
- if (projectFolder == null) {
- return;
- }
-
- try {
- boolean isTestProject = pathToMainProject != null;
-
- // first create the project properties.
-
- // location of the SDK goes in localProperty
- ProjectPropertiesWorkingCopy localProperties = ProjectProperties.create(folderPath,
- PropertyType.LOCAL);
- localProperties.setProperty(ProjectProperties.PROPERTY_SDK, mSdkFolder);
- localProperties.save();
-
- // target goes in project properties
- ProjectPropertiesWorkingCopy projectProperties = ProjectProperties.create(folderPath,
- PropertyType.PROJECT);
- projectProperties.setProperty(ProjectProperties.PROPERTY_TARGET, target.hashString());
- if (library) {
- projectProperties.setProperty(ProjectProperties.PROPERTY_LIBRARY, "true");
- }
- projectProperties.save();
-
- // create a ant.properties file with just the application package
- ProjectPropertiesWorkingCopy antProperties = ProjectProperties.create(folderPath,
- PropertyType.ANT);
-
- if (isTestProject) {
- antProperties.setProperty(ProjectProperties.PROPERTY_TESTED_PROJECT,
- pathToMainProject);
- }
-
- antProperties.save();
-
- // create the map for place-holders of values to replace in the templates
- final HashMap<String, String> keywords = new HashMap<String, String>();
-
- // create the required folders.
- // compute src folder path
- final String packagePath =
- stripString(packageName.replace(".", File.separator),
- File.separatorChar);
-
- // put this path in the place-holder map for project files that needs to list
- // files manually.
- keywords.put(PH_JAVA_FOLDER, packagePath);
- keywords.put(PH_PACKAGE, packageName);
- keywords.put(PH_VERSION_TAG, Integer.toString(MIN_BUILD_VERSION_TAG));
-
-
- // compute some activity related information
- String fqActivityName = null, activityPath = null, activityClassName = null;
- String originalActivityEntry = activityEntry;
- String originalActivityClassName = null;
- if (activityEntry != null) {
- if (isTestProject) {
- // append Test so that it doesn't collide with the main project activity.
- activityEntry += "Test";
-
- // get the classname from the original activity entry.
- int pos = originalActivityEntry.lastIndexOf('.');
- if (pos != -1) {
- originalActivityClassName = originalActivityEntry.substring(pos + 1);
- } else {
- originalActivityClassName = originalActivityEntry;
- }
- }
-
- // get the fully qualified name of the activity
- fqActivityName = AndroidManifest.combinePackageAndClassName(packageName,
- activityEntry);
-
- // get the activity path (replace the . to /)
- activityPath = stripString(fqActivityName.replace(".", File.separator),
- File.separatorChar);
-
- // remove the last segment, so that we only have the path to the activity, but
- // not the activity filename itself.
- activityPath = activityPath.substring(0,
- activityPath.lastIndexOf(File.separatorChar));
-
- // finally, get the class name for the activity
- activityClassName = fqActivityName.substring(fqActivityName.lastIndexOf('.') + 1);
- }
-
- // at this point we have the following for the activity:
- // activityEntry: this is the manifest entry. For instance .MyActivity
- // fqActivityName: full-qualified class name: com.foo.MyActivity
- // activityClassName: only the classname: MyActivity
- // originalActivityClassName: the classname of the activity being tested (if applicable)
-
- // Add whatever activity info is needed in the place-holder map.
- // Older templates only expect ACTIVITY_NAME to be the same (and unmodified for tests).
- if (target.getVersion().getApiLevel() < 4) { // legacy
- if (originalActivityEntry != null) {
- keywords.put(PH_ACTIVITY_NAME, originalActivityEntry);
- }
- } else {
- // newer templates make a difference between the manifest entries, classnames,
- // as well as the main and test classes.
- if (activityEntry != null) {
- keywords.put(PH_ACTIVITY_ENTRY_NAME, activityEntry);
- keywords.put(PH_ACTIVITY_CLASS_NAME, activityClassName);
- keywords.put(PH_ACTIVITY_FQ_NAME, fqActivityName);
- if (originalActivityClassName != null) {
- keywords.put(PH_ACTIVITY_TESTED_CLASS_NAME, originalActivityClassName);
- }
- }
- }
-
- // Take the project name from the command line if there's one
- if (projectName != null) {
- keywords.put(PH_PROJECT_NAME, projectName);
- } else {
- if (activityClassName != null) {
- // Use the activity class name as project name
- keywords.put(PH_PROJECT_NAME, activityClassName);
- } else {
- // We need a project name. Just pick up the basename of the project
- // directory.
- projectName = projectFolder.getName();
- keywords.put(PH_PROJECT_NAME, projectName);
- }
- }
-
- // create the source folder for the activity
- if (activityClassName != null) {
- String srcActivityFolderPath =
- SdkConstants.FD_SOURCES + File.separator + activityPath;
- File sourceFolder = createDirs(projectFolder, srcActivityFolderPath);
-
- String javaTemplate = isTestProject ? "java_tests_file.template"
- : "java_file.template";
- String activityFileName = activityClassName + ".java";
-
- installTargetTemplate(javaTemplate, new File(sourceFolder, activityFileName),
- keywords, target);
- } else {
- // we should at least create 'src'
- createDirs(projectFolder, SdkConstants.FD_SOURCES);
- }
-
- // create other useful folders
- File resourceFolder = createDirs(projectFolder, SdkConstants.FD_RESOURCES);
- createDirs(projectFolder, SdkConstants.FD_OUTPUT);
- createDirs(projectFolder, SdkConstants.FD_NATIVE_LIBS);
-
- if (isTestProject == false) {
- /* Make res files only for non test projects */
- File valueFolder = createDirs(resourceFolder, SdkConstants.FD_RES_VALUES);
- installTargetTemplate("strings.template", new File(valueFolder, "strings.xml"),
- keywords, target);
-
- File layoutFolder = createDirs(resourceFolder, SdkConstants.FD_RES_LAYOUT);
- installTargetTemplate("layout.template", new File(layoutFolder, "main.xml"),
- keywords, target);
-
- // create the icons
- if (installIcons(resourceFolder, target)) {
- keywords.put(PH_ICON, "android:icon=\"@drawable/ic_launcher\"");
- } else {
- keywords.put(PH_ICON, "");
- }
- }
-
- /* Make AndroidManifest.xml and build.xml files */
- String manifestTemplate = "AndroidManifest.template";
- if (isTestProject) {
- manifestTemplate = "AndroidManifest.tests.template";
- }
-
- installTargetTemplate(manifestTemplate,
- new File(projectFolder, SdkConstants.FN_ANDROID_MANIFEST_XML),
- keywords, target);
-
- installTemplate("build.template",
- new File(projectFolder, SdkConstants.FN_BUILD_XML),
- keywords);
-
- // install the proguard config file.
- installTemplate(SdkConstants.FN_PROJECT_PROGUARD_FILE,
- new File(projectFolder, SdkConstants.FN_PROJECT_PROGUARD_FILE),
- null /*keywords*/);
- } catch (Exception e) {
- mLog.error(e, null);
- }
- }
-
- private File checkNewProjectLocation(String folderPath) {
- File projectFolder = new File(folderPath);
- if (!projectFolder.exists()) {
-
- boolean created = false;
- Throwable t = null;
- try {
- created = projectFolder.mkdirs();
- } catch (Exception e) {
- t = e;
- }
-
- if (created) {
- println("Created project directory: %1$s", projectFolder);
- } else {
- mLog.error(t, "Could not create directory: %1$s", projectFolder);
- return null;
- }
- } else {
- Exception e = null;
- String error = null;
- try {
- String[] content = projectFolder.list();
- if (content == null) {
- error = "Project folder '%1$s' is not a directory.";
- } else if (content.length != 0) {
- error = "Project folder '%1$s' is not empty. Please consider using '%2$s update' instead.";
- }
- } catch (Exception e1) {
- e = e1;
- }
-
- if (e != null || error != null) {
- mLog.error(e, error, projectFolder, SdkConstants.androidCmdName());
- }
- }
- return projectFolder;
- }
-
- /**
- * Updates an existing project.
- * <p/>
- * Workflow:
- * <ul>
- * <li> Check AndroidManifest.xml is present (required)
- * <li> Check if there's a legacy properties file and convert it
- * <li> Check there's a project.properties with a target *or* --target was specified
- * <li> Update default.prop if --target was specified
- * <li> Refresh/create "sdk" in local.properties
- * <li> Build.xml: create if not present or if version-tag is found or not. version-tag:custom
- * prevent any overwrite. version-tag:[integer] will override. missing version-tag will query
- * the dev.
- * </ul>
- *
- * @param folderPath the folder of the project to update. This folder must exist.
- * @param target the project target. Can be null.
- * @param projectName The project name from --name. Can be null.
- * @param libraryPath the path to a library to add to the references. Can be null.
- * @return true if the project was successfully updated.
- */
- @SuppressWarnings("deprecation")
- public boolean updateProject(String folderPath, IAndroidTarget target, String projectName,
- String libraryPath) {
- // since this is an update, check the folder does point to a project
- FileWrapper androidManifest = checkProjectFolder(folderPath,
- SdkConstants.FN_ANDROID_MANIFEST_XML);
- if (androidManifest == null) {
- return false;
- }
-
- // get the parent folder.
- FolderWrapper projectFolder = (FolderWrapper) androidManifest.getParentFolder();
-
- boolean hasProguard = false;
-
- // Check there's a project.properties with a target *or* --target was specified
- IAndroidTarget originalTarget = null;
- boolean writeProjectProp = false;
- ProjectProperties props = ProjectProperties.load(projectFolder, PropertyType.PROJECT);
-
- if (props == null) {
- // no project.properties, try to load default.properties
- props = ProjectProperties.load(projectFolder, PropertyType.LEGACY_DEFAULT);
- writeProjectProp = true;
- }
-
- if (props != null) {
- String targetHash = props.getProperty(ProjectProperties.PROPERTY_TARGET);
- originalTarget = mSdkManager.getTargetFromHashString(targetHash);
-
- // if the project is already setup with proguard, we won't copy the proguard config.
- hasProguard = props.getProperty(ProjectProperties.PROPERTY_PROGUARD_CONFIG) != null;
- }
-
- if (originalTarget == null && target == null) {
- mLog.error(null,
- "The project either has no target set or the target is invalid.\n" +
- "Please provide a --target to the '%1$s update' command.",
- SdkConstants.androidCmdName());
- return false;
- }
-
- boolean saveProjectProps = false;
-
- ProjectPropertiesWorkingCopy propsWC = null;
-
- // Update default.prop if --target was specified
- if (target != null || writeProjectProp) {
- // we already attempted to load the file earlier, if that failed, create it.
- if (props == null) {
- propsWC = ProjectProperties.create(projectFolder, PropertyType.PROJECT);
- } else {
- propsWC = props.makeWorkingCopy(PropertyType.PROJECT);
- }
-
- // set or replace the target
- if (target != null) {
- propsWC.setProperty(ProjectProperties.PROPERTY_TARGET, target.hashString());
- }
- saveProjectProps = true;
- }
-
- if (libraryPath != null) {
- // At this point, the default properties already exists, either because they were
- // already there or because they were created with a new target
- if (propsWC == null) {
- assert props != null;
- propsWC = props.makeWorkingCopy();
- }
-
- // check the reference is valid
- File libProject = new File(libraryPath);
- String resolvedPath;
- if (libProject.isAbsolute() == false) {
- libProject = new File(projectFolder, libraryPath);
- try {
- resolvedPath = libProject.getCanonicalPath();
- } catch (IOException e) {
- mLog.error(e, "Unable to resolve path to library project: %1$s", libraryPath);
- return false;
- }
- } else {
- resolvedPath = libProject.getAbsolutePath();
- }
-
- println("Resolved location of library project to: %1$s", resolvedPath);
-
- // check the lib project exists
- if (checkProjectFolder(resolvedPath, SdkConstants.FN_ANDROID_MANIFEST_XML) == null) {
- mLog.error(null, "No Android Manifest at: %1$s", resolvedPath);
- return false;
- }
-
- // look for other references to figure out the index
- int index = 1;
- while (true) {
- String propName = ProjectProperties.PROPERTY_LIB_REF + Integer.toString(index);
- assert props != null;
- if (props == null) {
- // This should not happen yet SDK bug 20535 says it can, not sure how.
- break;
- }
- String ref = props.getProperty(propName);
- if (ref == null) {
- break;
- } else {
- index++;
- }
- }
-
- String propName = ProjectProperties.PROPERTY_LIB_REF + Integer.toString(index);
- propsWC.setProperty(propName, libraryPath);
- saveProjectProps = true;
- }
-
- // save the default props if needed.
- if (saveProjectProps) {
- try {
- assert propsWC != null;
- propsWC.save();
- if (writeProjectProp) {
- println("Updated and renamed %1$s to %2$s",
- PropertyType.LEGACY_DEFAULT.getFilename(),
- PropertyType.PROJECT.getFilename());
- } else {
- println("Updated %1$s", PropertyType.PROJECT.getFilename());
- }
- } catch (Exception e) {
- mLog.error(e, "Failed to write %1$s file in '%2$s'",
- PropertyType.PROJECT.getFilename(),
- folderPath);
- return false;
- }
-
- if (writeProjectProp) {
- // need to delete the default prop file.
- ProjectProperties.delete(projectFolder, PropertyType.LEGACY_DEFAULT);
- }
- }
-
- // Refresh/create "sdk" in local.properties
- // because the file may already exists and contain other values (like apk config),
- // we first try to load it.
- props = ProjectProperties.load(projectFolder, PropertyType.LOCAL);
- if (props == null) {
- propsWC = ProjectProperties.create(projectFolder, PropertyType.LOCAL);
- } else {
- propsWC = props.makeWorkingCopy();
- }
-
- // set or replace the sdk location.
- propsWC.setProperty(ProjectProperties.PROPERTY_SDK, mSdkFolder);
- try {
- propsWC.save();
- println("Updated %1$s", PropertyType.LOCAL.getFilename());
- } catch (Exception e) {
- mLog.error(e, "Failed to write %1$s file in '%2$s'",
- PropertyType.LOCAL.getFilename(),
- folderPath);
- return false;
- }
-
- // legacy: check if build.properties must be renamed to ant.properties.
- props = ProjectProperties.load(projectFolder, PropertyType.ANT);
- if (props == null) {
- props = ProjectProperties.load(projectFolder, PropertyType.LEGACY_BUILD);
- if (props != null) {
- try {
- // get a working copy with the new property type
- propsWC = props.makeWorkingCopy(PropertyType.ANT);
- propsWC.save();
-
- // delete the old file
- ProjectProperties.delete(projectFolder, PropertyType.LEGACY_BUILD);
-
- println("Renamed %1$s to %2$s",
- PropertyType.LEGACY_BUILD.getFilename(),
- PropertyType.ANT.getFilename());
- } catch (Exception e) {
- mLog.error(e, "Failed to write %1$s file in '%2$s'",
- PropertyType.ANT.getFilename(),
- folderPath);
- return false;
- }
- }
- }
-
- // Build.xml: create if not present or no <androidinit/> in it
- File buildXml = new File(projectFolder, SdkConstants.FN_BUILD_XML);
- boolean needsBuildXml = projectName != null || !buildXml.exists();
-
- // if it seems there's no need for a new build.xml, look for inside the file
- // to try to detect old ones that may need updating.
- if (!needsBuildXml) {
- // we are looking for version-tag: followed by either an integer or "custom".
- if (checkFileContainsRegexp(buildXml, "version-tag:\\s*custom") != null) { //$NON-NLS-1$
- println("%1$s: Found version-tag: custom. File will not be updated.",
- SdkConstants.FN_BUILD_XML);
- } else {
- Matcher m = checkFileContainsRegexp(buildXml, "version-tag:\\s*(\\d+)"); //$NON-NLS-1$
- if (m == null) {
- println("----------\n" +
- "%1$s: Failed to find version-tag string. File must be updated.\n" +
- "In order to not erase potential customizations, the file will not be automatically regenerated.\n" +
- "If no changes have been made to the file, delete it manually and run the command again.\n" +
- "If you have made customizations to the build process, the file must be manually updated.\n" +
- "It is recommended to:\n" +
- "\t* Copy current file to a safe location.\n" +
- "\t* Delete original file.\n" +
- "\t* Run command again to generate a new file.\n" +
- "\t* Port customizations to the new file, by looking at the new rules file\n" +
- "\t located at <SDK>/tools/ant/build.xml\n" +
- "\t* Update file to contain\n" +
- "\t version-tag: custom\n" +
- "\t to prevent file from being rewritten automatically by the SDK tools.\n" +
- "----------\n",
- SdkConstants.FN_BUILD_XML);
- } else {
- String versionStr = m.group(1);
- if (versionStr != null) {
- // can't fail due to regexp above.
- int version = Integer.parseInt(versionStr);
- if (version < MIN_BUILD_VERSION_TAG) {
- println("%1$s: Found version-tag: %2$d. Expected version-tag: %3$d: file must be updated.",
- SdkConstants.FN_BUILD_XML, version, MIN_BUILD_VERSION_TAG);
- needsBuildXml = true;
- }
- }
- }
- }
- }
-
- if (needsBuildXml) {
- // create the map for place-holders of values to replace in the templates
- final HashMap<String, String> keywords = new HashMap<String, String>();
-
- // put the current version-tag value
- keywords.put(PH_VERSION_TAG, Integer.toString(MIN_BUILD_VERSION_TAG));
-
- // if there was no project name on the command line, figure one out.
- if (projectName == null) {
- // otherwise, take it from the existing build.xml if it exists already.
- if (buildXml.exists()) {
- try {
- XPathFactory factory = XPathFactory.newInstance();
- XPath xpath = factory.newXPath();
-
- projectName = xpath.evaluate(XPATH_PROJECT_NAME,
- new InputSource(new FileInputStream(buildXml)));
- } catch (XPathExpressionException e) {
- // this is ok since we're going to recreate the file.
- mLog.error(e, "Unable to find existing project name from %1$s",
- SdkConstants.FN_BUILD_XML);
- } catch (FileNotFoundException e) {
- // can't happen since we check above.
- }
- }
-
- // if the project is still null, then we find another way.
- if (projectName == null) {
- extractPackageFromManifest(androidManifest, keywords);
- if (keywords.containsKey(PH_ACTIVITY_ENTRY_NAME)) {
- String activity = keywords.get(PH_ACTIVITY_ENTRY_NAME);
- // keep only the last segment if applicable
- int pos = activity.lastIndexOf('.');
- if (pos != -1) {
- activity = activity.substring(pos + 1);
- }
-
- // Use the activity as project name
- projectName = activity;
-
- println("No project name specified, using Activity name '%1$s'.\n" +
- "If you wish to change it, edit the first line of %2$s.",
- activity, SdkConstants.FN_BUILD_XML);
- } else {
- // We need a project name. Just pick up the basename of the project
- // directory.
- File projectCanonicalFolder = projectFolder;
- try {
- projectCanonicalFolder = projectCanonicalFolder.getCanonicalFile();
- } catch (IOException e) {
- // ignore, keep going
- }
-
- // Use the folder name as project name
- projectName = projectCanonicalFolder.getName();
-
- println("No project name specified, using project folder name '%1$s'.\n" +
- "If you wish to change it, edit the first line of %2$s.",
- projectName, SdkConstants.FN_BUILD_XML);
- }
- }
- }
-
- // put the project name in the map for replacement during the template installation.
- keywords.put(PH_PROJECT_NAME, projectName);
-
- if (mLevel == OutputLevel.VERBOSE) {
- println("Regenerating %1$s with project name %2$s",
- SdkConstants.FN_BUILD_XML,
- keywords.get(PH_PROJECT_NAME));
- }
-
- try {
- installTemplate("build.template", buildXml, keywords);
- } catch (ProjectCreateException e) {
- mLog.error(e, null);
- return false;
- }
- }
-
- if (hasProguard == false) {
- try {
- installTemplate(SdkConstants.FN_PROJECT_PROGUARD_FILE,
- // Write ProGuard config files with the extension .pro which
- // is what is used in the ProGuard documentation and samples
- new File(projectFolder, SdkConstants.FN_PROJECT_PROGUARD_FILE),
- null /*placeholderMap*/);
- } catch (ProjectCreateException e) {
- mLog.error(e, null);
- return false;
- }
- }
-
- return true;
- }
-
- /**
- * Updates a test project with a new path to the main (tested) project.
- * @param folderPath the path of the test project.
- * @param pathToMainProject the path to the main project, relative to the test project.
- */
- @SuppressWarnings("deprecation")
- public void updateTestProject(final String folderPath, final String pathToMainProject,
- final SdkManager sdkManager) {
- // since this is an update, check the folder does point to a project
- if (checkProjectFolder(folderPath, SdkConstants.FN_ANDROID_MANIFEST_XML) == null) {
- return;
- }
-
- // check the path to the main project is valid.
- File mainProject = new File(pathToMainProject);
- String resolvedPath;
- if (mainProject.isAbsolute() == false) {
- mainProject = new File(folderPath, pathToMainProject);
- try {
- resolvedPath = mainProject.getCanonicalPath();
- } catch (IOException e) {
- mLog.error(e, "Unable to resolve path to main project: %1$s", pathToMainProject);
- return;
- }
- } else {
- resolvedPath = mainProject.getAbsolutePath();
- }
-
- println("Resolved location of main project to: %1$s", resolvedPath);
-
- // check the main project exists
- if (checkProjectFolder(resolvedPath, SdkConstants.FN_ANDROID_MANIFEST_XML) == null) {
- mLog.error(null, "No Android Manifest at: %1$s", resolvedPath);
- return;
- }
-
- // now get the target from the main project
- ProjectProperties projectProp = ProjectProperties.load(resolvedPath, PropertyType.PROJECT);
- if (projectProp == null) {
- // legacy support for older file name.
- projectProp = ProjectProperties.load(resolvedPath, PropertyType.LEGACY_DEFAULT);
- if (projectProp == null) {
- mLog.error(null, "No %1$s at: %2$s", PropertyType.PROJECT.getFilename(),
- resolvedPath);
- return;
- }
- }
-
- String targetHash = projectProp.getProperty(ProjectProperties.PROPERTY_TARGET);
- if (targetHash == null) {
- mLog.error(null, "%1$s in the main project has no target property.",
- PropertyType.PROJECT.getFilename());
- return;
- }
-
- IAndroidTarget target = sdkManager.getTargetFromHashString(targetHash);
- if (target == null) {
- mLog.error(null, "Main project target %1$s is not a valid target.", targetHash);
- return;
- }
-
- // update test-project does not support the --name parameter, therefore the project
- // name should generally not be passed to updateProject().
- // However if build.xml does not exist then updateProject() will recreate it. In this
- // case we will need the project name.
- // To do this, we look for the parent project name and add "test" to it.
- // If the main project does not have a project name (yet), then the default behavior
- // will be used (look for activity and then folder name)
- String projectName = null;
- XPathFactory factory = XPathFactory.newInstance();
- XPath xpath = factory.newXPath();
-
- File testBuildXml = new File(folderPath, SdkConstants.FN_BUILD_XML);
- if (testBuildXml.isFile() == false) {
- File mainBuildXml = new File(resolvedPath, SdkConstants.FN_BUILD_XML);
- if (mainBuildXml.isFile()) {
- try {
- // get the name of the main project and add Test to it.
- String mainProjectName = xpath.evaluate(XPATH_PROJECT_NAME,
- new InputSource(new FileInputStream(mainBuildXml)));
- projectName = mainProjectName + "Test";
- } catch (XPathExpressionException e) {
- // it's ok, updateProject() will figure out a name automatically.
- // We do log the error though as the build.xml file may be broken.
- mLog.warning("Failed to parse %1$s.\n" +
- "File may not be valid. Consider running 'android update project' on the main project.",
- mainBuildXml.getPath());
- } catch (FileNotFoundException e) {
- // should not happen since we check first.
- }
- }
- }
-
- // now update the project as if it's a normal project
- if (updateProject(folderPath, target, projectName, null /*libraryPath*/) == false) {
- // error message has already been displayed.
- return;
- }
-
- // add the test project specific properties.
- // At this point, we know build.prop has been renamed ant.prop
- ProjectProperties antProps = ProjectProperties.load(folderPath, PropertyType.ANT);
- ProjectPropertiesWorkingCopy antWorkingCopy;
- if (antProps == null) {
- antWorkingCopy = ProjectProperties.create(folderPath, PropertyType.ANT);
- } else {
- antWorkingCopy = antProps.makeWorkingCopy();
- }
-
- // set or replace the path to the main project
- antWorkingCopy.setProperty(ProjectProperties.PROPERTY_TESTED_PROJECT, pathToMainProject);
- try {
- antWorkingCopy.save();
- println("Updated %1$s", PropertyType.ANT.getFilename());
- } catch (Exception e) {
- mLog.error(e, "Failed to write %1$s file in '%2$s'",
- PropertyType.ANT.getFilename(),
- folderPath);
- return;
- }
- }
-
- /**
- * Checks whether the give <var>folderPath</var> is a valid project folder, and returns
- * a {@link FileWrapper} to the required file.
- * <p/>This checks that the folder exists and contains an AndroidManifest.xml file in it.
- * <p/>Any error are output using {@link #mLog}.
- * @param folderPath the folder to check
- * @param requiredFilename the file name of the file that's required.
- * @return a {@link FileWrapper} to the AndroidManifest.xml file, or null otherwise.
- */
- private FileWrapper checkProjectFolder(String folderPath, String requiredFilename) {
- // project folder must exist and be a directory, since this is an update
- FolderWrapper projectFolder = new FolderWrapper(folderPath);
- if (!projectFolder.isDirectory()) {
- mLog.error(null, "Project folder '%1$s' is not a valid directory.",
- projectFolder);
- return null;
- }
-
- // Check AndroidManifest.xml is present
- FileWrapper requireFile = new FileWrapper(projectFolder, requiredFilename);
- if (!requireFile.isFile()) {
- mLog.error(null,
- "%1$s is not a valid project (%2$s not found).",
- folderPath, requiredFilename);
- return null;
- }
-
- return requireFile;
- }
-
- /**
- * Looks for a given regex in a file and returns the matcher if any line of the input file
- * contains the requested regexp.
- *
- * @param file the file to search.
- * @param regexp the regexp to search for.
- *
- * @return a Matcher or null if the regexp is not found.
- */
- private Matcher checkFileContainsRegexp(File file, String regexp) {
- Pattern p = Pattern.compile(regexp);
-
- BufferedReader in = null;
- try {
- in = new BufferedReader(new FileReader(file));
- String line;
-
- while ((line = in.readLine()) != null) {
- Matcher m = p.matcher(line);
- if (m.find()) {
- return m;
- }
- }
-
- in.close();
- } catch (Exception e) {
- // ignore
- } finally {
- if (in != null) {
- try {
- in.close();
- } catch (IOException e) {
- // ignore
- }
- }
- }
-
- return null;
- }
-
- /**
- * Extracts a "full" package & activity name from an AndroidManifest.xml.
- * <p/>
- * The keywords dictionary is always filed the package name under the key {@link #PH_PACKAGE}.
- * If an activity name can be found, it is filed under the key {@link #PH_ACTIVITY_ENTRY_NAME}.
- * When no activity is found, this key is not created.
- *
- * @param manifestFile The AndroidManifest.xml file
- * @param outKeywords Place where to put the out parameters: package and activity names.
- * @return True if the package/activity was parsed and updated in the keyword dictionary.
- */
- private boolean extractPackageFromManifest(File manifestFile,
- Map<String, String> outKeywords) {
- try {
- XPath xpath = AndroidXPathFactory.newXPath();
-
- InputSource source = new InputSource(new FileReader(manifestFile));
- String packageName = xpath.evaluate("/manifest/@package", source);
-
- source = new InputSource(new FileReader(manifestFile));
-
- // Select the "android:name" attribute of all <activity> nodes but only if they
- // contain a sub-node <intent-filter><action> with an "android:name" attribute which
- // is 'android.intent.action.MAIN' and an <intent-filter><category> with an
- // "android:name" attribute which is 'android.intent.category.LAUNCHER'
- String expression = String.format("/manifest/application/activity" +
- "[intent-filter/action/@%1$s:name='android.intent.action.MAIN' and " +
- "intent-filter/category/@%1$s:name='android.intent.category.LAUNCHER']" +
- "/@%1$s:name", AndroidXPathFactory.DEFAULT_NS_PREFIX);
-
- NodeList activityNames = (NodeList) xpath.evaluate(expression, source,
- XPathConstants.NODESET);
-
- // If we get here, both XPath expressions were valid so we're most likely dealing
- // with an actual AndroidManifest.xml file. The nodes may not have the requested
- // attributes though, if which case we should warn.
-
- if (packageName == null || packageName.length() == 0) {
- mLog.error(null,
- "Missing <manifest package=\"...\"> in '%1$s'",
- manifestFile.getName());
- return false;
- }
-
- // Get the first activity that matched earlier. If there is no activity,
- // activityName is set to an empty string and the generated "combined" name
- // will be in the form "package." (with a dot at the end).
- String activityName = "";
- if (activityNames.getLength() > 0) {
- activityName = activityNames.item(0).getNodeValue();
- }
-
- if (mLevel == OutputLevel.VERBOSE && activityNames.getLength() > 1) {
- println("WARNING: There is more than one activity defined in '%1$s'.\n" +
- "Only the first one will be used. If this is not appropriate, you need\n" +
- "to specify one of these values manually instead:",
- manifestFile.getName());
-
- for (int i = 0; i < activityNames.getLength(); i++) {
- String name = activityNames.item(i).getNodeValue();
- name = combinePackageActivityNames(packageName, name);
- println("- %1$s", name);
- }
- }
-
- if (activityName.length() == 0) {
- mLog.warning("Missing <activity %1$s:name=\"...\"> in '%2$s'.\n" +
- "No activity will be generated.",
- AndroidXPathFactory.DEFAULT_NS_PREFIX, manifestFile.getName());
- } else {
- outKeywords.put(PH_ACTIVITY_ENTRY_NAME, activityName);
- }
-
- outKeywords.put(PH_PACKAGE, packageName);
- return true;
-
- } catch (IOException e) {
- mLog.error(e, "Failed to read %1$s", manifestFile.getName());
- } catch (XPathExpressionException e) {
- Throwable t = e.getCause();
- mLog.error(t == null ? e : t,
- "Failed to parse %1$s",
- manifestFile.getName());
- }
-
- return false;
- }
-
- private String combinePackageActivityNames(String packageName, String activityName) {
- // Activity Name can have 3 forms:
- // - ".Name" means this is a class name in the given package name.
- // The full FQCN is thus packageName + ".Name"
- // - "Name" is an older variant of the former. Full FQCN is packageName + "." + "Name"
- // - "com.blah.Name" is a full FQCN. Ignore packageName and use activityName as-is.
- // To be valid, the package name should have at least two components. This is checked
- // later during the creation of the build.xml file, so we just need to detect there's
- // a dot but not at pos==0.
-
- int pos = activityName.indexOf('.');
- if (pos == 0) {
- return packageName + activityName;
- } else if (pos > 0) {
- return activityName;
- } else {
- return packageName + "." + activityName;
- }
- }
-
- /**
- * Installs a new file that is based on a template file provided by a given target.
- * Each match of each key from the place-holder map in the template will be replaced with its
- * corresponding value in the created file.
- *
- * @param templateName the name of to the template file
- * @param destFile the path to the destination file, relative to the project
- * @param placeholderMap a map of (place-holder, value) to create the file from the template.
- * @param target the Target of the project that will be providing the template.
- * @throws ProjectCreateException
- */
- private void installTargetTemplate(String templateName, File destFile,
- Map<String, String> placeholderMap, IAndroidTarget target)
- throws ProjectCreateException {
- // query the target for its template directory
- String templateFolder = target.getPath(IAndroidTarget.TEMPLATES);
- final String sourcePath = templateFolder + File.separator + templateName;
-
- installFullPathTemplate(sourcePath, destFile, placeholderMap);
- }
-
- /**
- * Installs a new file that is based on a template file provided by the tools folder.
- * Each match of each key from the place-holder map in the template will be replaced with its
- * corresponding value in the created file.
- *
- * @param templateName the name of to the template file
- * @param destFile the path to the destination file, relative to the project
- * @param placeholderMap a map of (place-holder, value) to create the file from the template.
- * @throws ProjectCreateException
- */
- public void installTemplate(String templateName, File destFile,
- Map<String, String> placeholderMap)
- throws ProjectCreateException {
- // query the target for its template directory
- String templateFolder = mSdkFolder + File.separator + SdkConstants.OS_SDK_TOOLS_LIB_FOLDER;
- final String sourcePath = templateFolder + File.separator + templateName;
-
- installFullPathTemplate(sourcePath, destFile, placeholderMap);
- }
-
- /**
- * Installs a new file that is based on a template.
- * Each match of each key from the place-holder map in the template will be replaced with its
- * corresponding value in the created file.
- *
- * @param sourcePath the full path to the source template file
- * @param destFile the destination file
- * @param placeholderMap a map of (place-holder, value) to create the file from the template.
- * @throws ProjectCreateException
- */
- private void installFullPathTemplate(String sourcePath, File destFile,
- Map<String, String> placeholderMap) throws ProjectCreateException {
-
- boolean existed = destFile.exists();
-
- try {
- BufferedWriter out = new BufferedWriter(new FileWriter(destFile));
- BufferedReader in = new BufferedReader(new FileReader(sourcePath));
- String line;
-
- while ((line = in.readLine()) != null) {
- if (placeholderMap != null) {
- for (Map.Entry<String, String> entry : placeholderMap.entrySet()) {
- line = line.replace(entry.getKey(), entry.getValue());
- }
- }
-
- out.write(line);
- out.newLine();
- }
-
- out.close();
- in.close();
- } catch (Exception e) {
- throw new ProjectCreateException(e, "Could not access %1$s: %2$s",
- destFile, e.getMessage());
- }
-
- println("%1$s file %2$s",
- existed ? "Updated" : "Added",
- destFile);
- }
-
- /**
- * Installs the project icons.
- * @param resourceFolder the resource folder
- * @param target the target of the project.
- * @return true if any icon was installed.
- */
- private boolean installIcons(File resourceFolder, IAndroidTarget target)
- throws ProjectCreateException {
- // query the target for its template directory
- String templateFolder = target.getPath(IAndroidTarget.TEMPLATES);
-
- boolean installedIcon = false;
-
- installedIcon |= installIcon(templateFolder, "ic_launcher_xhdpi.png", resourceFolder,
- "drawable-xhdpi");
- installedIcon |= installIcon(templateFolder, "ic_launcher_hdpi.png", resourceFolder,
- "drawable-hdpi");
- installedIcon |= installIcon(templateFolder, "ic_launcher_mdpi.png", resourceFolder,
- "drawable-mdpi");
- installedIcon |= installIcon(templateFolder, "ic_launcher_ldpi.png", resourceFolder,
- "drawable-ldpi");
-
- return installedIcon;
- }
-
- /**
- * Installs an Icon in the project.
- * @return true if the icon was installed.
- */
- private boolean installIcon(String templateFolder, String iconName, File resourceFolder,
- String folderName) throws ProjectCreateException {
- File icon = new File(templateFolder, iconName);
- if (icon.exists()) {
- File drawable = createDirs(resourceFolder, folderName);
- installBinaryFile(icon, new File(drawable, "ic_launcher.png"));
- return true;
- }
-
- return false;
- }
-
- /**
- * Installs a binary file
- * @param source the source file to copy
- * @param destination the destination file to write
- * @throws ProjectCreateException
- */
- private void installBinaryFile(File source, File destination) throws ProjectCreateException {
- byte[] buffer = new byte[8192];
-
- FileInputStream fis = null;
- FileOutputStream fos = null;
- try {
- fis = new FileInputStream(source);
- fos = new FileOutputStream(destination);
-
- int read;
- while ((read = fis.read(buffer)) != -1) {
- fos.write(buffer, 0, read);
- }
-
- } catch (FileNotFoundException e) {
- // shouldn't happen since we check before.
- } catch (IOException e) {
- throw new ProjectCreateException(e, "Failed to read binary file: %1$s",
- source.getAbsolutePath());
- } finally {
- if (fis != null) {
- try {
- fis.close();
- } catch (IOException e) {
- // ignore
- }
- }
- if (fos != null) {
- try {
- fos.close();
- } catch (IOException e) {
- // ignore
- }
- }
- }
-
- }
-
- /**
- * Prints a message unless silence is enabled.
- * <p/>
- * This is just a convenience wrapper around {@link ILogger#info(String, Object...)} from
- * {@link #mLog} after testing if output level is {@link OutputLevel#VERBOSE}.
- *
- * @param format Format for String.format
- * @param args Arguments for String.format
- */
- private void println(String format, Object... args) {
- if (mLevel != OutputLevel.SILENT) {
- if (!format.endsWith("\n")) {
- format += "\n";
- }
- mLog.info(format, args);
- }
- }
-
- /**
- * Creates a new folder, along with any parent folders that do not exists.
- *
- * @param parent the parent folder
- * @param name the name of the directory to create.
- * @throws ProjectCreateException
- */
- private File createDirs(File parent, String name) throws ProjectCreateException {
- final File newFolder = new File(parent, name);
- boolean existedBefore = true;
-
- if (!newFolder.exists()) {
- if (!newFolder.mkdirs()) {
- throw new ProjectCreateException("Could not create directory: %1$s", newFolder);
- }
- existedBefore = false;
- }
-
- if (newFolder.isDirectory()) {
- if (!newFolder.canWrite()) {
- throw new ProjectCreateException("Path is not writable: %1$s", newFolder);
- }
- } else {
- throw new ProjectCreateException("Path is not a directory: %1$s", newFolder);
- }
-
- if (!existedBefore) {
- try {
- println("Created directory %1$s", newFolder.getCanonicalPath());
- } catch (IOException e) {
- throw new ProjectCreateException(
- "Could not determine canonical path of created directory", e);
- }
- }
-
- return newFolder;
- }
-
- /**
- * Strips the string of beginning and trailing characters (multiple
- * characters will be stripped, example stripString("..test...", '.')
- * results in "test";
- *
- * @param s the string to strip
- * @param strip the character to strip from beginning and end
- * @return the stripped string or the empty string if everything is stripped.
- */
- private static String stripString(String s, char strip) {
- final int sLen = s.length();
- int newStart = 0, newEnd = sLen - 1;
-
- while (newStart < sLen && s.charAt(newStart) == strip) {
- newStart++;
- }
- while (newEnd >= 0 && s.charAt(newEnd) == strip) {
- newEnd--;
- }
-
- /*
- * newEnd contains a char we want, and substring takes end as being
- * exclusive
- */
- newEnd++;
-
- if (newStart >= sLen || newEnd < 0) {
- return "";
- }
-
- return s.substring(newStart, newEnd);
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/project/ProjectProperties.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/project/ProjectProperties.java
deleted file mode 100644
index 48acb56..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/project/ProjectProperties.java
+++ /dev/null
@@ -1,535 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.project;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.io.FolderWrapper;
-import com.android.io.IAbstractFile;
-import com.android.io.IAbstractFolder;
-import com.android.io.StreamException;
-import com.android.utils.ILogger;
-import com.google.common.io.Closeables;
-
-import java.io.BufferedReader;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Properties;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Class representing project properties for both ADT and Ant-based build.
- * <p/>The class is associated to a {@link PropertyType} that indicate which of the project
- * property file is represented.
- * <p/>To load an existing file, use {@link #load(IAbstractFolder, PropertyType)}.
- * <p/>The class is meant to be always in sync (or at least not newer) than the file it represents.
- * Once created, it can only be updated through {@link #reload()}
- *
- * <p/>The make modification or make new file, use a {@link ProjectPropertiesWorkingCopy} instance,
- * either through {@link #create(IAbstractFolder, PropertyType)} or through
- * {@link #makeWorkingCopy()}.
- *
- */
-public class ProjectProperties implements IPropertySource {
- protected final static Pattern PATTERN_PROP = Pattern.compile(
- "^([a-zA-Z0-9._-]+)\\s*=\\s*(.*)\\s*$");
-
- /** The property name for the project target */
- public final static String PROPERTY_TARGET = "target";
- /** The property name for the renderscript build target */
- public final static String PROPERTY_RS_TARGET = "renderscript.target";
-
- public final static String PROPERTY_LIBRARY = "android.library";
- public final static String PROPERTY_LIB_REF = "android.library.reference.";
- private final static String PROPERTY_LIB_REF_REGEX = "android.library.reference.\\d+";
-
- public final static String PROPERTY_PROGUARD_CONFIG = "proguard.config";
- public final static String PROPERTY_RULES_PATH = "layoutrules.jars";
-
- public final static String PROPERTY_SDK = "sdk.dir";
- // LEGACY - Kept so that we can actually remove it from local.properties.
- private final static String PROPERTY_SDK_LEGACY = "sdk-location";
-
- public final static String PROPERTY_SPLIT_BY_DENSITY = "split.density";
- public final static String PROPERTY_SPLIT_BY_ABI = "split.abi";
- public final static String PROPERTY_SPLIT_BY_LOCALE = "split.locale";
-
- public final static String PROPERTY_TESTED_PROJECT = "tested.project.dir";
-
- public final static String PROPERTY_BUILD_SOURCE_DIR = "source.dir";
- public final static String PROPERTY_BUILD_OUT_DIR = "out.dir";
-
- public final static String PROPERTY_PACKAGE = "package";
- public final static String PROPERTY_VERSIONCODE = "versionCode";
- public final static String PROPERTY_PROJECTS = "projects";
- public final static String PROPERTY_KEY_STORE = "key.store";
- public final static String PROPERTY_KEY_ALIAS = "key.alias";
-
- public static enum PropertyType {
- ANT(SdkConstants.FN_ANT_PROPERTIES, BUILD_HEADER, new String[] {
- PROPERTY_BUILD_SOURCE_DIR, PROPERTY_BUILD_OUT_DIR
- }, null),
- PROJECT(SdkConstants.FN_PROJECT_PROPERTIES, DEFAULT_HEADER, new String[] {
- PROPERTY_TARGET, PROPERTY_LIBRARY, PROPERTY_LIB_REF_REGEX,
- PROPERTY_KEY_STORE, PROPERTY_KEY_ALIAS, PROPERTY_PROGUARD_CONFIG,
- PROPERTY_RULES_PATH
- }, null),
- LOCAL(SdkConstants.FN_LOCAL_PROPERTIES, LOCAL_HEADER, new String[] {
- PROPERTY_SDK
- },
- new String[] { PROPERTY_SDK_LEGACY }),
- @Deprecated
- LEGACY_DEFAULT("default.properties", null, null, null),
- @Deprecated
- LEGACY_BUILD("build.properties", null, null, null);
-
-
- private final String mFilename;
- private final String mHeader;
- private final Set<String> mKnownProps;
- private final Set<String> mRemovedProps;
-
- /**
- * Returns the PropertyTypes ordered the same way Ant order them.
- */
- public static PropertyType[] getOrderedTypes() {
- return new PropertyType[] {
- PropertyType.LOCAL, PropertyType.ANT, PropertyType.PROJECT
- };
- }
-
- PropertyType(String filename, String header, String[] validProps, String[] removedProps) {
- mFilename = filename;
- mHeader = header;
- HashSet<String> s = new HashSet<String>();
- if (validProps != null) {
- s.addAll(Arrays.asList(validProps));
- }
- mKnownProps = Collections.unmodifiableSet(s);
-
- s = new HashSet<String>();
- if (removedProps != null) {
- s.addAll(Arrays.asList(removedProps));
- }
- mRemovedProps = Collections.unmodifiableSet(s);
-
- }
-
- public String getFilename() {
- return mFilename;
- }
-
- public String getHeader() {
- return mHeader;
- }
-
- /**
- * Returns whether a given property is known for the property type.
- */
- public boolean isKnownProperty(String name) {
- for (String propRegex : mKnownProps) {
- if (propRegex.equals(name) || Pattern.matches(propRegex, name)) {
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * Returns whether a given property should be removed for the property type.
- */
- public boolean isRemovedProperty(String name) {
- for (String propRegex : mRemovedProps) {
- if (propRegex.equals(name) || Pattern.matches(propRegex, name)) {
- return true;
- }
- }
-
- return false;
- }
- }
-
- private final static String LOCAL_HEADER =
-// 1-------10--------20--------30--------40--------50--------60--------70--------80
- "# This file is automatically generated by Android Tools.\n" +
- "# Do not modify this file -- YOUR CHANGES WILL BE ERASED!\n" +
- "#\n" +
- "# This file must *NOT* be checked into Version Control Systems,\n" +
- "# as it contains information specific to your local configuration.\n" +
- "\n";
-
- private final static String DEFAULT_HEADER =
-// 1-------10--------20--------30--------40--------50--------60--------70--------80
- "# This file is automatically generated by Android Tools.\n" +
- "# Do not modify this file -- YOUR CHANGES WILL BE ERASED!\n" +
- "#\n" +
- "# This file must be checked in Version Control Systems.\n" +
- "#\n" +
- "# To customize properties used by the Ant build system edit\n" +
- "# \"ant.properties\", and override values to adapt the script to your\n" +
- "# project structure.\n" +
- "#\n" +
- "# To enable ProGuard to shrink and obfuscate your code, uncomment this "
- + "(available properties: sdk.dir, user.home):\n" +
- // Note: always use / separators in the properties paths. Both Ant and
- // our ExportHelper will convert them properly according to the platform.
- "#" + PROPERTY_PROGUARD_CONFIG + "=${" + PROPERTY_SDK +"}/"
- + SdkConstants.FD_TOOLS + '/' + SdkConstants.FD_PROGUARD + '/'
- + SdkConstants.FN_ANDROID_PROGUARD_FILE + ':'
- + SdkConstants.FN_PROJECT_PROGUARD_FILE +'\n' +
- "\n";
-
- private final static String BUILD_HEADER =
-// 1-------10--------20--------30--------40--------50--------60--------70--------80
- "# This file is used to override default values used by the Ant build system.\n" +
- "#\n" +
- "# This file must be checked into Version Control Systems, as it is\n" +
- "# integral to the build system of your project.\n" +
- "\n" +
- "# This file is only used by the Ant script.\n" +
- "\n" +
- "# You can use this to override default values such as\n" +
- "# 'source.dir' for the location of your java source folder and\n" +
- "# 'out.dir' for the location of your output folder.\n" +
- "\n" +
- "# You can also use it define how the release builds are signed by declaring\n" +
- "# the following properties:\n" +
- "# 'key.store' for the location of your keystore and\n" +
- "# 'key.alias' for the name of the key to use.\n" +
- "# The password will be asked during the build when you use the 'release' target.\n" +
- "\n";
-
- protected final IAbstractFolder mProjectFolder;
- protected final Map<String, String> mProperties;
- protected final PropertyType mType;
-
- /**
- * Loads a project properties file and return a {@link ProjectProperties} object
- * containing the properties.
- *
- * @param projectFolderOsPath the project folder.
- * @param type One the possible {@link PropertyType}s.
- */
- public static ProjectProperties load(String projectFolderOsPath, PropertyType type) {
- IAbstractFolder wrapper = new FolderWrapper(projectFolderOsPath);
- return load(wrapper, type);
- }
-
- /**
- * Loads a project properties file and return a {@link ProjectProperties} object
- * containing the properties.
- *
- * @param projectFolder the project folder.
- * @param type One the possible {@link PropertyType}s.
- */
- public static ProjectProperties load(IAbstractFolder projectFolder, PropertyType type) {
- if (projectFolder.exists()) {
- IAbstractFile propFile = projectFolder.getFile(type.mFilename);
- if (propFile.exists()) {
- Map<String, String> map = parsePropertyFile(propFile, null /* log */);
- if (map != null) {
- return new ProjectProperties(projectFolder, map, type);
- }
- }
- }
- return null;
- }
-
- /**
- * Deletes a project properties file.
- *
- * @param projectFolder the project folder.
- * @param type One the possible {@link PropertyType}s.
- * @return true if success.
- */
- public static boolean delete(IAbstractFolder projectFolder, PropertyType type) {
- if (projectFolder.exists()) {
- IAbstractFile propFile = projectFolder.getFile(type.mFilename);
- if (propFile.exists()) {
- return propFile.delete();
- }
- }
-
- return false;
- }
-
- /**
- * Deletes a project properties file.
- *
- * @param projectFolderOsPath the project folder.
- * @param type One the possible {@link PropertyType}s.
- * @return true if success.
- */
- public static boolean delete(String projectFolderOsPath, PropertyType type) {
- IAbstractFolder wrapper = new FolderWrapper(projectFolderOsPath);
- return delete(wrapper, type);
- }
-
-
- /**
- * Creates a new project properties object, with no properties.
- * <p/>The file is not created until {@link ProjectPropertiesWorkingCopy#save()} is called.
- * @param projectFolderOsPath the project folder.
- * @param type the type of property file to create
- *
- * @see #createEmpty(String, PropertyType)
- */
- public static ProjectPropertiesWorkingCopy create(@NonNull String projectFolderOsPath,
- @NonNull PropertyType type) {
- // create and return a ProjectProperties with an empty map.
- IAbstractFolder folder = new FolderWrapper(projectFolderOsPath);
- return create(folder, type);
- }
-
- /**
- * Creates a new project properties object, with no properties.
- * <p/>The file is not created until {@link ProjectPropertiesWorkingCopy#save()} is called.
- * @param projectFolder the project folder.
- * @param type the type of property file to create
- *
- * @see #createEmpty(IAbstractFolder, PropertyType)
- */
- public static ProjectPropertiesWorkingCopy create(@NonNull IAbstractFolder projectFolder,
- @NonNull PropertyType type) {
- // create and return a ProjectProperties with an empty map.
- return new ProjectPropertiesWorkingCopy(projectFolder, new HashMap<String, String>(), type);
- }
-
- /**
- * Creates a new project properties object, with no properties.
- * <p/>Nothing can be added to it, unless a {@link ProjectPropertiesWorkingCopy} is created
- * first with {@link #makeWorkingCopy()}.
- * @param projectFolderOsPath the project folder.
- * @param type the type of property file to create
- *
- * @see #create(String, PropertyType)
- */
- public static ProjectProperties createEmpty(@NonNull String projectFolderOsPath,
- @NonNull PropertyType type) {
- // create and return a ProjectProperties with an empty map.
- IAbstractFolder folder = new FolderWrapper(projectFolderOsPath);
- return createEmpty(folder, type);
- }
-
- /**
- * Creates a new project properties object, with no properties.
- * <p/>Nothing can be added to it, unless a {@link ProjectPropertiesWorkingCopy} is created
- * first with {@link #makeWorkingCopy()}.
- * @param projectFolder the project folder.
- * @param type the type of property file to create
- *
- * @see #create(IAbstractFolder, PropertyType)
- */
- public static ProjectProperties createEmpty(@NonNull IAbstractFolder projectFolder,
- @NonNull PropertyType type) {
- // create and return a ProjectProperties with an empty map.
- return new ProjectProperties(projectFolder, new HashMap<String, String>(), type);
- }
-
- /**
- * Returns the location of this property file.
- */
- public IAbstractFile getFile() {
- return mProjectFolder.getFile(mType.mFilename);
- }
-
- /**
- * Creates and returns a copy of the current properties as a
- * {@link ProjectPropertiesWorkingCopy} that can be modified and saved.
- * @return a new instance of {@link ProjectPropertiesWorkingCopy}
- */
- public ProjectPropertiesWorkingCopy makeWorkingCopy() {
- return makeWorkingCopy(mType);
- }
-
- /**
- * Creates and returns a copy of the current properties as a
- * {@link ProjectPropertiesWorkingCopy} that can be modified and saved. This also allows
- * converting to a new type, by specifying a different {@link PropertyType}.
- *
- * @param type the {@link PropertyType} of the prop file to save.
- *
- * @return a new instance of {@link ProjectPropertiesWorkingCopy}
- */
- public ProjectPropertiesWorkingCopy makeWorkingCopy(PropertyType type) {
- // copy the current properties in a new map
- Map<String, String> propList = new HashMap<String, String>(mProperties);
-
- return new ProjectPropertiesWorkingCopy(mProjectFolder, propList, type);
- }
-
- /**
- * Returns the type of the property file.
- *
- * @see PropertyType
- */
- public PropertyType getType() {
- return mType;
- }
-
- /**
- * Returns the value of a property.
- * @param name the name of the property.
- * @return the property value or null if the property is not set.
- */
- @Override
- public synchronized String getProperty(String name) {
- return mProperties.get(name);
- }
-
- /**
- * Returns a set of the property keys. Unlike {@link Map#keySet()} this is not a view of the
- * map keys. Modifying the returned {@link Set} will not impact the underlying {@link Map}.
- */
- public synchronized Set<String> keySet() {
- return new HashSet<String>(mProperties.keySet());
- }
-
- /**
- * Reloads the properties from the underlying file.
- */
- public synchronized void reload() {
- if (mProjectFolder.exists()) {
- IAbstractFile propFile = mProjectFolder.getFile(mType.mFilename);
- if (propFile.exists()) {
- Map<String, String> map = parsePropertyFile(propFile, null /* log */);
- if (map != null) {
- mProperties.clear();
- mProperties.putAll(map);
- }
- }
- }
- }
-
- /**
- * Parses a property file (using UTF-8 encoding) and returns a map of the content.
- * <p/>
- * If the file is not present, null is returned with no error messages sent to the log.
- * <p/>
- * IMPORTANT: This method is now unfortunately used in multiple places to parse random
- * property files. This is NOT a safe practice since there is no corresponding method
- * to write property files unless you use {@link ProjectPropertiesWorkingCopy#save()}.
- * Code that writes INI or properties without at least using {@link #escape(String)} will
- * certainly not load back correct data. <br/>
- * Unless there's a strong legacy need to support existing files, new callers should
- * probably just use Java's {@link Properties} which has well defined semantics.
- * It's also a mistake to write/read property files using this code and expect it to
- * work with Java's {@link Properties} or external tools (e.g. ant) since there can be
- * differences in escaping and in character encoding.
- *
- * @param propFile the property file to parse
- * @param log the ILogger object receiving warning/error from the parsing.
- * @return the map of (key,value) pairs, or null if the parsing failed.
- */
- public static Map<String, String> parsePropertyFile(
- @NonNull IAbstractFile propFile,
- @Nullable ILogger log) {
- BufferedReader reader = null;
- try {
- reader = new BufferedReader(new InputStreamReader(propFile.getContents(),
- SdkConstants.INI_CHARSET));
-
- String line = null;
- Map<String, String> map = new HashMap<String, String>();
- while ((line = reader.readLine()) != null) {
- line = line.trim();
- if (line.length() > 0 && line.charAt(0) != '#') {
-
- Matcher m = PATTERN_PROP.matcher(line);
- if (m.matches()) {
- map.put(m.group(1), unescape(m.group(2)));
- } else {
- if (log != null) {
- log.warning("Error parsing '%1$s': \"%2$s\" is not a valid syntax",
- propFile.getOsLocation(),
- line);
- }
- return null;
- }
- }
- }
-
- return map;
- } catch (FileNotFoundException e) {
- // this should not happen since we usually test the file existence before
- // calling the method.
- // Return null below.
- } catch (IOException e) {
- if (log != null) {
- log.warning("Error parsing '%1$s': %2$s.",
- propFile.getOsLocation(),
- e.getMessage());
- }
- } catch (StreamException e) {
- if (log != null) {
- log.warning("Error parsing '%1$s': %2$s.",
- propFile.getOsLocation(),
- e.getMessage());
- }
- } finally {
- Closeables.closeQuietly(reader);
- }
-
- return null;
- }
-
- /**
- * Private constructor.
- * <p/>
- * Use {@link #load(String, PropertyType)} or {@link #create(String, PropertyType)}
- * to instantiate.
- */
- protected ProjectProperties(
- @NonNull IAbstractFolder projectFolder,
- @NonNull Map<String, String> map,
- @NonNull PropertyType type) {
- mProjectFolder = projectFolder;
- mProperties = map;
- mType = type;
- }
-
- private static String unescape(String value) {
- return value.replaceAll("\\\\\\\\", "\\\\");
- }
-
- protected static String escape(String value) {
- return value.replaceAll("\\\\", "\\\\\\\\");
- }
-
- @Override
- public void debugPrint() {
- System.out.println("DEBUG PROJECTPROPERTIES: " + mProjectFolder);
- System.out.println("type: " + mType);
- for (Entry<String, String> entry : mProperties.entrySet()) {
- System.out.println(entry.getKey() + " -> " + entry.getValue());
- }
- System.out.println("<<< DEBUG PROJECTPROPERTIES");
-
- }
-
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/project/ProjectPropertiesWorkingCopy.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/project/ProjectPropertiesWorkingCopy.java
deleted file mode 100644
index 0bb9bd6..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/project/ProjectPropertiesWorkingCopy.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.project;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.io.IAbstractFile;
-import com.android.io.IAbstractFolder;
-import com.android.io.StreamException;
-import com.google.common.io.Closeables;
-
-import java.io.BufferedReader;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.regex.Matcher;
-
-/**
- * A modifyable and saveable copy of a {@link ProjectProperties}.
- * <p/>This copy gives access to modification method such as {@link #setProperty(String, String)}
- * and {@link #removeProperty(String)}.
- *
- * To get access to an instance, use {@link ProjectProperties#makeWorkingCopy()} or
- * {@link ProjectProperties#create(IAbstractFolder, PropertyType)}.
- */
-public class ProjectPropertiesWorkingCopy extends ProjectProperties {
-
- private final static Map<String, String> COMMENT_MAP = new HashMap<String, String>();
- static {
-// 1-------10--------20--------30--------40--------50--------60--------70--------80
- COMMENT_MAP.put(PROPERTY_TARGET,
- "# Project target.\n");
- COMMENT_MAP.put(PROPERTY_SPLIT_BY_DENSITY,
- "# Indicates whether an apk should be generated for each density.\n");
- COMMENT_MAP.put(PROPERTY_SDK,
- "# location of the SDK. This is only used by Ant\n" +
- "# For customization when using a Version Control System, please read the\n" +
- "# header note.\n");
- COMMENT_MAP.put(PROPERTY_PACKAGE,
- "# Package of the application being exported\n");
- COMMENT_MAP.put(PROPERTY_VERSIONCODE,
- "# Major version code\n");
- COMMENT_MAP.put(PROPERTY_PROJECTS,
- "# List of the Android projects being used for the export.\n" +
- "# The list is made of paths that are relative to this project,\n" +
- "# using forward-slash (/) as separator, and are separated by colons (:).\n");
- }
-
-
- /**
- * Sets a new properties. If a property with the same name already exists, it is replaced.
- * @param name the name of the property.
- * @param value the value of the property.
- */
- public synchronized void setProperty(String name, String value) {
- mProperties.put(name, value);
- }
-
- /**
- * Removes a property and returns its previous value (or null if the property did not exist).
- * @param name the name of the property to remove.
- */
- public synchronized String removeProperty(String name) {
- return mProperties.remove(name);
- }
-
- /**
- * Merges all properties from the given file into the current properties.
- * <p/>
- * This emulates the Ant behavior: existing properties are <em>not</em> overridden.
- * Only new undefined properties become defined.
- * <p/>
- * Typical usage:
- * <ul>
- * <li>Create a ProjectProperties with {@code PropertyType#ANT}
- * <li>Merge in values using {@code PropertyType#PROJECT}
- * <li>The result is that this contains all the properties from default plus those
- * overridden by the build.properties file.
- * </ul>
- *
- * @param type One the possible {@link ProjectProperties.PropertyType}s.
- * @return this object, for chaining.
- */
- public synchronized ProjectPropertiesWorkingCopy merge(PropertyType type) {
- if (mProjectFolder.exists() && mType != type) {
- IAbstractFile propFile = mProjectFolder.getFile(type.getFilename());
- if (propFile.exists()) {
- Map<String, String> map = parsePropertyFile(propFile, null /* log */);
- if (map != null) {
- for (Entry<String, String> entry : map.entrySet()) {
- String key = entry.getKey();
- String value = entry.getValue();
- if (!mProperties.containsKey(key) && value != null) {
- mProperties.put(key, value);
- }
- }
- }
- }
- }
- return this;
- }
-
-
- /**
- * Saves the property file, using UTF-8 encoding.
- * @throws IOException
- * @throws StreamException
- */
- public synchronized void save() throws IOException, StreamException {
- IAbstractFile toSave = mProjectFolder.getFile(mType.getFilename());
-
- // write the whole file in a byte array before dumping it in the file. This
- // This is so that if the file already existing
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- OutputStreamWriter writer = new OutputStreamWriter(baos, SdkConstants.INI_CHARSET);
-
- if (toSave.exists()) {
- BufferedReader reader = new BufferedReader(new InputStreamReader(toSave.getContents(),
- SdkConstants.INI_CHARSET));
-
- // since we're reading the existing file and replacing values with new ones, or skipping
- // removed values, we need to record what properties have been visited, so that
- // we can figure later what new properties need to be added at the end of the file.
- Set<String> visitedProps = new HashSet<String>();
-
- String line = null;
- while ((line = reader.readLine()) != null) {
- // check if this is a line containing a property.
- if (line.length() > 0 && line.charAt(0) != '#') {
-
- Matcher m = PATTERN_PROP.matcher(line);
- if (m.matches()) {
- String key = m.group(1);
- String value = m.group(2);
-
- // record the prop
- visitedProps.add(key);
-
- // check if this property must be removed.
- if (mType.isRemovedProperty(key)) {
- value = null;
- } else if (mProperties.containsKey(key)) { // if the property still exists.
- // put the new value.
- value = mProperties.get(key);
- } else {
- // property doesn't exist. Check if it's a known property.
- // if it's a known one, we'll remove it, otherwise, leave it untouched.
- if (mType.isKnownProperty(key)) {
- value = null;
- }
- }
-
- // if the value is still valid, write it down.
- if (value != null) {
- writeValue(writer, key, value, false /*addComment*/);
- }
- } else {
- // the line was wrong, let's just ignore it so that it's removed from the
- // file.
- }
- } else {
- // non-property line: just write the line in the output as-is.
- writer.append(line).append('\n');
- }
- }
-
- // now add the new properties.
- for (Entry<String, String> entry : mProperties.entrySet()) {
- if (visitedProps.contains(entry.getKey()) == false) {
- String value = entry.getValue();
- if (value != null) {
- writeValue(writer, entry.getKey(), value, true /*addComment*/);
- }
- }
- }
-
- Closeables.closeQuietly(reader);
-
- } else {
- // new file, just write it all
-
- // write the header (can be null, for example for PropertyType.LEGACY_BUILD)
- if (mType.getHeader() != null) {
- writer.write(mType.getHeader());
- }
-
- // write the properties.
- for (Entry<String, String> entry : mProperties.entrySet()) {
- String value = entry.getValue();
- if (value != null) {
- writeValue(writer, entry.getKey(), value, true /*addComment*/);
- }
- }
- }
-
- writer.flush();
-
- // now put the content in the file.
- OutputStream filestream = toSave.getOutputStream();
- filestream.write(baos.toByteArray());
- filestream.flush();
- filestream.close();
- }
-
- private void writeValue(OutputStreamWriter writer, String key, String value,
- boolean addComment) throws IOException {
- if (addComment) {
- String comment = COMMENT_MAP.get(key);
- if (comment != null) {
- writer.write(comment);
- }
- }
-
- writer.write(String.format("%s=%s\n", key, escape(value)));
- }
-
- /**
- * Private constructor.
- * <p/>
- * Use {@link #load(String, PropertyType)} or {@link #create(String, PropertyType)}
- * to instantiate.
- */
- ProjectPropertiesWorkingCopy(IAbstractFolder projectFolder, Map<String, String> map,
- PropertyType type) {
- super(projectFolder, map, type);
- }
-
- @NonNull
- public ProjectProperties makeReadOnlyCopy() {
- // copy the current properties in a new map
- Map<String, String> propList = new HashMap<String, String>(mProperties);
-
- return new ProjectProperties(mProjectFolder, propList, mType);
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/AdbWrapper.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/AdbWrapper.java
deleted file mode 100755
index 8d4a0c2..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/AdbWrapper.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.SdkConstants;
-
-import java.io.File;
-import java.io.IOException;
-
-/**
- * A lightweight wrapper to start & stop ADB.
- * This is <b>specific</b> to the SDK Manager install process.
- */
-public class AdbWrapper {
-
- /*
- * Note: we could bring ddmlib in SdkManager for that purpose, however this allows us to
- * specialize the start/stop methods to our needs (e.g. a task monitor, etc.)
- */
-
- private final String mAdbOsLocation;
- private final ITaskMonitor mMonitor;
-
- /**
- * Creates a new lightweight ADB wrapper.
- *
- * @param osSdkPath The root OS path of the SDK. Cannot be null.
- * @param monitor A logger object. Cannot be null.
- */
- public AdbWrapper(String osSdkPath, ITaskMonitor monitor) {
- mMonitor = monitor;
-
- if (!osSdkPath.endsWith(File.separator)) {
- osSdkPath += File.separator;
- }
- mAdbOsLocation = osSdkPath + SdkConstants.OS_SDK_PLATFORM_TOOLS_FOLDER
- + SdkConstants.FN_ADB;
- }
-
- private void display(String format, Object...args) {
- mMonitor.log(format, args);
- }
-
- private void displayError(String format, Object...args) {
- mMonitor.logError(format, args);
- }
-
- /**
- * Starts the adb host side server.
- * @return true if success
- */
- public synchronized boolean startAdb() {
- if (mAdbOsLocation == null) {
- displayError("Error: missing path to ADB."); //$NON-NLS-1$
- return false;
- }
-
- Process proc;
- int status = -1;
-
- try {
- ProcessBuilder processBuilder = new ProcessBuilder(
- mAdbOsLocation,
- "start-server"); //$NON-NLS-1$
- proc = processBuilder.start();
- status = proc.waitFor();
-
- // Implementation note: normally on Windows we need to capture stderr/stdout
- // to make sure the process isn't blocked if it's output isn't read. However
- // in this case this happens to hang when reading stdout with no proper way
- // to properly close the streams. On the other hand the output from start
- // server is rather short and not very interesting so we just drop it.
-
- } catch (IOException ioe) {
- displayError("Unable to run 'adb': %1$s.", ioe.getMessage()); //$NON-NLS-1$
- // we'll return false;
- } catch (InterruptedException ie) {
- displayError("Unable to run 'adb': %1$s.", ie.getMessage()); //$NON-NLS-1$
- // we'll return false;
- }
-
- if (status != 0) {
- displayError(String.format(
- "Starting ADB server failed (code %d).", //$NON-NLS-1$
- status));
- return false;
- }
-
- display("Starting ADB server succeeded."); //$NON-NLS-1$
-
- return true;
- }
-
- /**
- * Stops the adb host side server.
- * @return true if success
- */
- public synchronized boolean stopAdb() {
- if (mAdbOsLocation == null) {
- displayError("Error: missing path to ADB."); //$NON-NLS-1$
- return false;
- }
-
- Process proc;
- int status = -1;
-
- try {
- String[] command = new String[2];
- command[0] = mAdbOsLocation;
- command[1] = "kill-server"; //$NON-NLS-1$
- proc = Runtime.getRuntime().exec(command);
- status = proc.waitFor();
-
- // See comment in startAdb about not needing/wanting to capture stderr/stdout.
- }
- catch (IOException ioe) {
- // we'll return false;
- }
- catch (InterruptedException ie) {
- // we'll return false;
- }
-
- // adb kill-server returns:
- // 0 if adb was running and was correctly killed.
- // 1 if adb wasn't running and thus wasn't killed.
- // This error case is not worth reporting.
-
- if (status != 0 && status != 1) {
- displayError(String.format(
- "Stopping ADB server failed (code %d).", //$NON-NLS-1$
- status));
- return false;
- }
-
- display("Stopping ADB server succeeded."); //$NON-NLS-1$
- return true;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/AddonsListFetcher.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/AddonsListFetcher.java
deleted file mode 100755
index ac7b5d0..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/AddonsListFetcher.java
+++ /dev/null
@@ -1,609 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.annotations.VisibleForTesting;
-import com.android.annotations.VisibleForTesting.Visibility;
-import com.android.sdklib.io.NonClosingInputStream;
-import com.android.sdklib.io.NonClosingInputStream.CloseBehavior;
-import com.android.sdklib.repository.SdkAddonsListConstants;
-import com.android.sdklib.repository.SdkRepoConstants;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.net.ssl.SSLKeyException;
-import javax.xml.XMLConstants;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.validation.Schema;
-import javax.xml.validation.SchemaFactory;
-import javax.xml.validation.Validator;
-
-/**
- * Fetches and loads an sdk-addons-list XML.
- * <p/>
- * Such an XML contains a simple list of add-ons site that are to be loaded by default by the
- * SDK Manager. <br/>
- * The XML must conform to the sdk-addons-list-N.xsd. <br/>
- * Constants used in the XML are defined in {@link SdkAddonsListConstants}.
- */
-public class AddonsListFetcher {
-
- public enum SiteType {
- ADDON_SITE,
- SYS_IMG_SITE
- }
-
- /**
- * An immutable structure representing an add-on site.
- */
- public static class Site {
- private final String mUrl;
- private final String mUiName;
- private final SiteType mType;
-
- private Site(String url, String uiName, SiteType type) {
- mType = type;
- mUrl = url.trim();
- mUiName = uiName;
- }
-
- public String getUrl() {
- return mUrl;
- }
-
- public String getUiName() {
- return mUiName;
- }
-
- public SiteType getType() {
- return mType;
- }
-
- /** Returns a debug string representation of this object. Not for user display. */
- @Override
- public String toString() {
- return String.format("<%1$s URL='%2$s' Name='%3$s'>", //$NON-NLS-1$
- mType, mUrl, mUiName);
- }
- }
-
- /**
- * Fetches the addons list from the given URL.
- *
- * @param url The URL of an XML file resource that conforms to the latest sdk-addons-list-N.xsd.
- * For the default operation, use {@link SdkAddonsListConstants#URL_ADDON_LIST}.
- * Cannot be null.
- * @param cache The {@link DownloadCache} instance to use. Cannot be null.
- * @param monitor A monitor to report errors. Cannot be null.
- * @return An array of {@link Site} on success (possibly empty), or null on error.
- */
- public Site[] fetch(String url, DownloadCache cache, ITaskMonitor monitor) {
-
- url = url == null ? "" : url.trim();
-
- monitor.setProgressMax(6);
- monitor.setDescription("Fetching %1$s", url);
- monitor.incProgress(1);
-
- Exception[] exception = new Exception[] { null };
- Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };
- String[] validationError = new String[] { null };
- Document validatedDoc = null;
- String validatedUri = null;
-
- String[] defaultNames = new String[SdkAddonsListConstants.NS_LATEST_VERSION];
- for (int version = SdkAddonsListConstants.NS_LATEST_VERSION, i = 0;
- version >= 1;
- version--, i++) {
- defaultNames[i] = SdkAddonsListConstants.getDefaultName(version);
- }
-
- InputStream xml = fetchXmlUrl(url, cache, monitor.createSubMonitor(1), exception);
- if (xml != null) {
- int version = getXmlSchemaVersion(xml);
- if (version == 0) {
- closeStream(xml);
- xml = null;
- }
- }
-
- String baseUrl = url;
- if (!baseUrl.endsWith("/")) { //$NON-NLS-1$
- int pos = baseUrl.lastIndexOf('/');
- if (pos > 0) {
- baseUrl = baseUrl.substring(0, pos + 1);
- }
- }
-
- // If we can't find the latest version, try earlier schema versions.
- if (xml == null && defaultNames.length > 0) {
- ITaskMonitor subMonitor = monitor.createSubMonitor(1);
- subMonitor.setProgressMax(defaultNames.length);
-
- for (String name : defaultNames) {
- String newUrl = baseUrl + name;
- if (newUrl.equals(url)) {
- continue;
- }
- xml = fetchXmlUrl(newUrl, cache, subMonitor.createSubMonitor(1), exception);
- if (xml != null) {
- int version = getXmlSchemaVersion(xml);
- if (version == 0) {
- closeStream(xml);
- xml = null;
- } else {
- url = newUrl;
- subMonitor.incProgress(
- subMonitor.getProgressMax() - subMonitor.getProgress());
- break;
- }
- }
- }
- } else {
- monitor.incProgress(1);
- }
-
- if (xml != null) {
- monitor.setDescription("Validate XML");
-
- // Explore the XML to find the potential XML schema version
- int version = getXmlSchemaVersion(xml);
-
- if (version >= 1 && version <= SdkAddonsListConstants.NS_LATEST_VERSION) {
- // This should be a version we can handle. Try to validate it
- // and report any error as invalid XML syntax,
-
- String uri = validateXml(xml, url, version, validationError, validatorFound);
- if (uri != null) {
- // Validation was successful
- validatedDoc = getDocument(xml, monitor);
- validatedUri = uri;
-
- }
- } else if (version > SdkAddonsListConstants.NS_LATEST_VERSION) {
- // The schema used is more recent than what is supported by this tool.
- // We don't have an upgrade-path support yet, so simply ignore the document.
- closeStream(xml);
- return null;
- }
- }
-
- // If any exception was handled during the URL fetch, display it now.
- if (exception[0] != null) {
- String reason = null;
- if (exception[0] instanceof FileNotFoundException) {
- // FNF has no useful getMessage, so we need to special handle it.
- reason = "File not found";
- } else if (exception[0] instanceof UnknownHostException &&
- exception[0].getMessage() != null) {
- // This has no useful getMessage yet could really use one
- reason = String.format("Unknown Host %1$s", exception[0].getMessage());
- } else if (exception[0] instanceof SSLKeyException) {
- // That's a common error and we have a pref for it.
- reason = "HTTPS SSL error. You might want to force download through HTTP in the settings.";
- } else if (exception[0].getMessage() != null) {
- reason = exception[0].getMessage();
- } else {
- // We don't know what's wrong. Let's give the exception class at least.
- reason = String.format("Unknown (%1$s)", exception[0].getClass().getName());
- }
-
- monitor.logError("Failed to fetch URL %1$s, reason: %2$s", url, reason);
- }
-
- if (validationError[0] != null) {
- monitor.logError("%s", validationError[0]); //$NON-NLS-1$
- }
-
- // Stop here if we failed to validate the XML. We don't want to load it.
- if (validatedDoc == null) {
- closeStream(xml);
- return null;
- }
-
- monitor.incProgress(1);
-
- Site[] result = null;
-
- if (xml != null) {
- monitor.setDescription("Parse XML");
- monitor.incProgress(1);
- result = parseAddonsList(validatedDoc, validatedUri, baseUrl, monitor);
- }
-
- // done
- monitor.incProgress(1);
-
- closeStream(xml);
- return result;
- }
-
- /**
- * Fetches the document at the given URL and returns it as a stream. Returns
- * null if anything wrong happens.
- *
- * @param urlString The URL to load, as a string.
- * @param monitor {@link ITaskMonitor} related to this URL.
- * @param outException If non null, where to store any exception that
- * happens during the fetch.
- * @see UrlOpener UrlOpener, which handles all URL logic.
- */
- private InputStream fetchXmlUrl(String urlString,
- DownloadCache cache,
- ITaskMonitor monitor,
- Exception[] outException) {
- try {
- InputStream xml = cache.openCachedUrl(urlString, monitor);
- if (xml != null) {
- xml.mark(500000);
- xml = new NonClosingInputStream(xml);
- ((NonClosingInputStream) xml).setCloseBehavior(CloseBehavior.RESET);
- }
- return xml;
- } catch (Exception e) {
- if (outException != null) {
- outException[0] = e;
- }
- }
-
- return null;
- }
-
- /**
- * Closes the stream, ignore any exception from InputStream.close().
- * If the stream is a NonClosingInputStream, sets it to CloseBehavior.CLOSE first.
- */
- private void closeStream(InputStream is) {
- if (is != null) {
- if (is instanceof NonClosingInputStream) {
- ((NonClosingInputStream) is).setCloseBehavior(CloseBehavior.CLOSE);
- }
- try {
- is.close();
- } catch (IOException ignore) {}
- }
- }
-
- /**
- * Manually parses the root element of the XML to extract the schema version
- * at the end of the xmlns:sdk="http://schemas.android.com/sdk/android/addons-list/$N"
- * declaration.
- *
- * @return 1..{@link SdkAddonsListConstants#NS_LATEST_VERSION} for a valid schema version
- * or 0 if no schema could be found.
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected int getXmlSchemaVersion(InputStream xml) {
- if (xml == null) {
- return 0;
- }
-
- // Get an XML document
- Document doc = null;
- try {
- assert xml.markSupported();
- xml.reset();
-
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- factory.setIgnoringComments(false);
- factory.setValidating(false);
-
- // Parse the old document using a non namespace aware builder
- factory.setNamespaceAware(false);
- DocumentBuilder builder = factory.newDocumentBuilder();
-
- // We don't want the default handler which prints errors to stderr.
- builder.setErrorHandler(new ErrorHandler() {
- @Override
- public void warning(SAXParseException e) throws SAXException {
- // pass
- }
- @Override
- public void fatalError(SAXParseException e) throws SAXException {
- throw e;
- }
- @Override
- public void error(SAXParseException e) throws SAXException {
- throw e;
- }
- });
-
- doc = builder.parse(xml);
-
- // Prepare a new document using a namespace aware builder
- factory.setNamespaceAware(true);
- builder = factory.newDocumentBuilder();
-
- } catch (Exception e) {
- // Failed to reset XML stream
- // Failed to get builder factor
- // Failed to create XML document builder
- // Failed to parse XML document
- // Failed to read XML document
- //--For debug--System.err.println("getXmlSchemaVersion exception: " + e.toString());
- }
-
- if (doc == null) {
- return 0;
- }
-
- // Check the root element is an XML with at least the following properties:
- // <sdk:sdk-addons-list
- // xmlns:sdk="http://schemas.android.com/sdk/android/addons-list/$N">
- //
- // Note that we don't have namespace support enabled, we just do it manually.
-
- Pattern nsPattern = Pattern.compile(SdkAddonsListConstants.NS_PATTERN);
-
- String prefix = null;
- for (Node child = doc.getFirstChild(); child != null; child = child.getNextSibling()) {
- if (child.getNodeType() == Node.ELEMENT_NODE) {
- prefix = null;
- String name = child.getNodeName();
- int pos = name.indexOf(':');
- if (pos > 0 && pos < name.length() - 1) {
- prefix = name.substring(0, pos);
- name = name.substring(pos + 1);
- }
- if (SdkAddonsListConstants.NODE_SDK_ADDONS_LIST.equals(name)) {
- NamedNodeMap attrs = child.getAttributes();
- String xmlns = "xmlns"; //$NON-NLS-1$
- if (prefix != null) {
- xmlns += ":" + prefix; //$NON-NLS-1$
- }
- Node attr = attrs.getNamedItem(xmlns);
- if (attr != null) {
- String uri = attr.getNodeValue();
- if (uri != null) {
- Matcher m = nsPattern.matcher(uri);
- if (m.matches()) {
- String version = m.group(1);
- try {
- return Integer.parseInt(version);
- } catch (NumberFormatException e) {
- return 0;
- }
- }
- }
- }
- }
- }
- }
-
- return 0;
- }
-
- /**
- * Validates this XML against one of the requested SDK Repository schemas.
- * If the XML was correctly validated, returns the schema that worked.
- * If it doesn't validate, returns null and stores the error in outError[0].
- * If we can't find a validator, returns null and set validatorFound[0] to false.
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected String validateXml(InputStream xml, String url, int version,
- String[] outError, Boolean[] validatorFound) {
-
- if (xml == null) {
- return null;
- }
-
- try {
- Validator validator = getValidator(version);
-
- if (validator == null) {
- validatorFound[0] = Boolean.FALSE;
- outError[0] = String.format(
- "XML verification failed for %1$s.\nNo suitable XML Schema Validator could be found in your Java environment. Please consider updating your version of Java.",
- url);
- return null;
- }
-
- validatorFound[0] = Boolean.TRUE;
-
- // Reset the stream if it supports that operation.
- assert xml.markSupported();
- xml.reset();
-
- // Validation throws a bunch of possible Exceptions on failure.
- validator.validate(new StreamSource(xml));
- return SdkAddonsListConstants.getSchemaUri(version);
-
- } catch (SAXParseException e) {
- outError[0] = String.format(
- "XML verification failed for %1$s.\nLine %2$d:%3$d, Error: %4$s",
- url,
- e.getLineNumber(),
- e.getColumnNumber(),
- e.toString());
-
- } catch (Exception e) {
- outError[0] = String.format(
- "XML verification failed for %1$s.\nError: %2$s",
- url,
- e.toString());
- }
- return null;
- }
-
- /**
- * Helper method that returns a validator for our XSD, or null if the current Java
- * implementation can't process XSD schemas.
- *
- * @param version The version of the XML Schema.
- * See {@link SdkAddonsListConstants#getXsdStream(int)}
- */
- private Validator getValidator(int version) throws SAXException {
- InputStream xsdStream = SdkAddonsListConstants.getXsdStream(version);
- SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
-
- if (factory == null) {
- return null;
- }
-
- // This may throw a SAX Exception if the schema itself is not a valid XSD
- Schema schema = factory.newSchema(new StreamSource(xsdStream));
-
- Validator validator = schema == null ? null : schema.newValidator();
-
- return validator;
- }
-
- /**
- * Takes an XML document as a string as parameter and returns a DOM for it.
- *
- * On error, returns null and prints a (hopefully) useful message on the monitor.
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected Document getDocument(InputStream xml, ITaskMonitor monitor) {
- try {
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- factory.setIgnoringComments(true);
- factory.setNamespaceAware(true);
-
- DocumentBuilder builder = factory.newDocumentBuilder();
- assert xml.markSupported();
- xml.reset();
- Document doc = builder.parse(new InputSource(xml));
-
- return doc;
- } catch (ParserConfigurationException e) {
- monitor.logError("Failed to create XML document builder");
-
- } catch (SAXException e) {
- monitor.logError("Failed to parse XML document");
-
- } catch (IOException e) {
- monitor.logError("Failed to read XML document");
- }
-
- return null;
- }
-
- /**
- * Parse all sites defined in the Addaons list XML and returns an array of sites.
- *
- * @param doc The XML DOM to parse.
- * @param nsUri The addons-list schema URI of the document.
- * @param baseUrl The base URL of the caller (e.g. where addons-list-N.xml was fetched from.)
- * @param monitor A non-null monitor to print to.
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected Site[] parseAddonsList(
- Document doc,
- String nsUri,
- String baseUrl,
- ITaskMonitor monitor) {
-
- String testBaseUrl = System.getenv("SDK_TEST_BASE_URL"); //$NON-NLS-1$
- if (testBaseUrl != null) {
- if (testBaseUrl.length() <= 0 || !testBaseUrl.endsWith("/")) { //$NON-NLS-1$
- testBaseUrl = null;
- }
- }
-
- Node root = getFirstChild(doc, nsUri, SdkAddonsListConstants.NODE_SDK_ADDONS_LIST);
- if (root != null) {
- ArrayList<Site> sites = new ArrayList<Site>();
-
- for (Node child = root.getFirstChild();
- child != null;
- child = child.getNextSibling()) {
- if (child.getNodeType() == Node.ELEMENT_NODE &&
- nsUri.equals(child.getNamespaceURI())) {
-
- String elementName = child.getLocalName();
- SiteType type = null;
-
- if (SdkAddonsListConstants.NODE_SYS_IMG_SITE.equals(elementName)) {
- type = SiteType.SYS_IMG_SITE;
-
- } else if (SdkAddonsListConstants.NODE_ADDON_SITE.equals(elementName)) {
- type = SiteType.ADDON_SITE;
- }
-
- // Not an addon-site nor a sys-img-site, don't process this.
- if (type == null) {
- continue;
- }
-
- Node url = getFirstChild(child, nsUri, SdkAddonsListConstants.NODE_URL);
- Node name = getFirstChild(child, nsUri, SdkAddonsListConstants.NODE_NAME);
-
- if (name != null && url != null) {
- String strUrl = url.getTextContent().trim();
- String strName = name.getTextContent().trim();
-
- if (testBaseUrl != null &&
- strUrl.startsWith(SdkRepoConstants.URL_GOOGLE_SDK_SITE)) {
- strUrl = testBaseUrl +
- strUrl.substring(SdkRepoConstants.URL_GOOGLE_SDK_SITE.length());
- } else if (!strUrl.startsWith("http://") && //$NON-NLS-1$
- !strUrl.startsWith("https://")) { //$NON-NLS-1$
- // This looks like a relative URL, add the fetcher's base URL to it.
- strUrl = baseUrl + strUrl;
- }
-
- if (strUrl.length() > 0 && strName.length() > 0) {
- sites.add(new Site(strUrl, strName, type));
- }
- }
- }
- }
-
- return sites.toArray(new Site[sites.size()]);
- }
-
- return null;
- }
-
- /**
- * Returns the first child element with the given XML local name.
- * If xmlLocalName is null, returns the very first child element.
- */
- private Node getFirstChild(Node node, String nsUri, String xmlLocalName) {
-
- for(Node child = node.getFirstChild(); child != null; child = child.getNextSibling()) {
- if (child.getNodeType() == Node.ELEMENT_NODE &&
- nsUri.equals(child.getNamespaceURI())) {
- if (xmlLocalName == null || child.getLocalName().equals(xmlLocalName)) {
- return child;
- }
- }
- }
-
- return null;
- }
-
-
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/CanceledByUserException.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/CanceledByUserException.java
deleted file mode 100755
index a0a74d8..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/CanceledByUserException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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;
-
-/**
- * Exception thrown by {@link DownloadCache} and {@link UrlOpener} when a user
- * cancels an HTTP Basic authentication or NTML authentication dialog.
- */
-public class CanceledByUserException extends Exception {
- private static final long serialVersionUID = -7669346110926032403L;
-
- public CanceledByUserException(String message) {
- super(message);
- }
-}
-
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/DownloadCache.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/DownloadCache.java
deleted file mode 100755
index e02023d..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/DownloadCache.java
+++ /dev/null
@@ -1,830 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-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.utils.Pair;
-
-import org.apache.http.Header;
-import org.apache.http.HttpHeaders;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.message.BasicHeader;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Locale;
-import java.util.Properties;
-import java.util.concurrent.atomic.AtomicInteger;
-
-
-/**
- * A simple cache for the XML resources handled by the SDK Manager.
- * <p/>
- * Callers should use {@link #openDirectUrl} to download "large files"
- * that should not be cached (like actual installation packages which are several MBs big)
- * and call {@link #openCachedUrl(String, ITaskMonitor)} to download small XML files.
- * <p/>
- * The cache can work in 3 different strategies (direct is a pass-through, fresh-cache is the
- * default and tries to update resources if they are older than 10 minutes by respecting
- * either ETag or Last-Modified, and finally server-cache is a strategy to always serve
- * cached entries if present.)
- */
-public class DownloadCache {
-
- /*
- * HTTP/1.1 references:
- * - Possible headers:
- * http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
- * - Rules about conditional requests:
- * http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.3.4
- * - Error codes:
- * http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html#sec6.1.1
- */
-
- private static final boolean DEBUG = System.getenv("SDKMAN_DEBUG_CACHE") != null; //$NON-NLS-1$
-
- /** Key for the Status-Code in the info properties. */
- private static final String KEY_STATUS_CODE = "Status-Code"; //$NON-NLS-1$
- /** Key for the URL in the info properties. */
- private static final String KEY_URL = "URL"; //$NON-NLS-1$
-
- /** Prefix of binary files stored in the {@link SdkConstants#FD_CACHE} directory. */
- private final static String BIN_FILE_PREFIX = "sdkbin"; //$NON-NLS-1$
- /** Prefix of meta info files stored in the {@link SdkConstants#FD_CACHE} directory. */
- private final static String INFO_FILE_PREFIX = "sdkinf"; //$NON-NLS-1$
- /* Revision suffixed to the prefix. */
- private final static String REV_FILE_PREFIX = "-1_"; //$NON-NLS-1$
-
- /**
- * Minimum time before we consider a cached entry is potentially stale.
- * Expressed in milliseconds.
- * <p/>
- * When using the {@link Strategy#FRESH_CACHE}, the cache will not try to refresh
- * a cached file if it's has been saved more recently than this time.
- * When using the direct mode or the serve mode, the cache either doesn't serve
- * cached files or always serves caches files so this expiration delay is not used.
- * <p/>
- * Default is 10 minutes.
- * <p/>
- * TODO: change for a dynamic preference later.
- */
- private final static long MIN_TIME_EXPIRED_MS = 10*60*1000;
- /**
- * Maximum time before we consider a cache entry to be stale.
- * Expressed in milliseconds.
- * <p/>
- * When using the {@link Strategy#FRESH_CACHE}, entries that have no ETag
- * or Last-Modified will be refreshed if their file timestamp is older than
- * this value.
- * <p/>
- * Default is 4 hours.
- * <p/>
- * TODO: change for a dynamic preference later.
- */
- private final static long MAX_TIME_EXPIRED_MS = 4*60*60*1000;
-
- /**
- * The maximum file size we'll cache for "small" files.
- * 640KB is more than enough and is already a stretch since these are read in memory.
- * (The actual typical size of the files handled here is in the 4-64KB range.)
- */
- private final static int MAX_SMALL_FILE_SIZE = 640 * 1024;
-
- /**
- * HTTP Headers that are saved in an info file.
- * For HTTP/1.1 header names, see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
- */
- private final static String[] INFO_HTTP_HEADERS = {
- HttpHeaders.LAST_MODIFIED,
- HttpHeaders.ETAG,
- HttpHeaders.CONTENT_LENGTH,
- HttpHeaders.DATE
- };
-
- private final Strategy mStrategy;
- private final File mCacheRoot;
-
- public enum Strategy {
- /**
- * Exclusively serves data from the cache. If files are available in the
- * cache, serve them as is (without trying to refresh them). If files are
- * not available, they are <em>not</em> fetched at all.
- */
- ONLY_CACHE,
- /**
- * If the files are available in the cache, serve them as-is, otherwise
- * download them and return the cached version. No expiration or refresh
- * is attempted if a file is in the cache.
- */
- SERVE_CACHE,
- /**
- * If the files are available in the cache, check if there's an update
- * (either using an e-tag check or comparing to the default time expiration).
- * If files have expired or are not in the cache then download them and return
- * the cached version.
- */
- FRESH_CACHE,
- /**
- * Disables caching. URLs are always downloaded and returned directly.
- * Downloaded streams aren't cached locally.
- */
- DIRECT
- }
-
- /** Creates a default instance of the URL cache */
- public DownloadCache(Strategy strategy) {
- mCacheRoot = initCacheRoot();
-
- // If this is defined in the environment, never use the cache. Useful for testing.
- if (System.getenv("SDKMAN_DISABLE_CACHE") != null) { //$NON-NLS-1$
- strategy = Strategy.DIRECT;
- }
-
- mStrategy = mCacheRoot == null ? Strategy.DIRECT : strategy;
- }
-
- public Strategy getStrategy() {
- return mStrategy;
- }
-
- public File getCacheRoot() {
- return mCacheRoot;
- }
-
- /**
- * Computes the size of the cached files.
- *
- * @return The sum of the byte size of the cached files.
- */
- public long getCurrentSize() {
- long size = 0;
-
- if (mCacheRoot != null) {
- File[] files = mCacheRoot.listFiles();
- if (files != null) {
- for (File f : files) {
- if (f.isFile()) {
- String name = f.getName();
- if (name.startsWith(BIN_FILE_PREFIX) ||
- name.startsWith(INFO_FILE_PREFIX)) {
- size += f.length();
- }
- }
- }
- }
- }
-
- return size;
- }
-
- /**
- * Removes all cached files from the cache directory.
- */
- public void clearCache() {
- if (mCacheRoot != null) {
- File[] files = mCacheRoot.listFiles();
- if (files != null) {
- for (File f : files) {
- if (f.isFile()) {
- String name = f.getName();
- if (name.startsWith(BIN_FILE_PREFIX) ||
- name.startsWith(INFO_FILE_PREFIX)) {
- f.delete();
- }
- }
- }
- }
- }
- }
-
- /**
- * Removes all obsolete cached files from the cache directory
- * that do not match the latest revision.
- */
- public void clearOldCache() {
- String prefix1 = BIN_FILE_PREFIX + REV_FILE_PREFIX;
- String prefix2 = INFO_FILE_PREFIX + REV_FILE_PREFIX;
- if (mCacheRoot != null) {
- File[] files = mCacheRoot.listFiles();
- if (files != null) {
- for (File f : files) {
- if (f.isFile()) {
- String name = f.getName();
- if (name.startsWith(BIN_FILE_PREFIX) ||
- name.startsWith(INFO_FILE_PREFIX)) {
- if (!name.startsWith(prefix1) && !name.startsWith(prefix2)) {
- f.delete();
- }
- }
- }
- }
- }
- }
- }
-
- /**
- * Returns the directory to be used as a cache.
- * Creates it if necessary.
- * Makes it possible to disable or override the cache location in unit tests.
- *
- * @return An existing directory to use as a cache root dir,
- * or null in case of error in which case the cache will be disabled.
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected File initCacheRoot() {
- try {
- File root = new File(AndroidLocation.getFolder());
- root = new File(root, SdkConstants.FD_CACHE);
- if (!root.exists()) {
- root.mkdirs();
- }
- return root;
- } catch (AndroidLocationException e) {
- // No root? Disable the cache.
- return null;
- }
- }
-
- /**
- * Does a direct download of the given URL using {@link UrlOpener}.
- * This does not check the download cache and does not attempt to cache the file.
- * Instead the HttpClient library returns a progressive download stream.
- * <p/>
- * For details on realm authentication and user/password handling,
- * check the underlying {@link UrlOpener#openUrl(String, boolean, ITaskMonitor, Header[])}
- * documentation.
- * <p/>
- * The resulting input stream may not support mark/reset.
- *
- * @param urlString the URL string to be opened.
- * @param headers An optional set of headers to pass when requesting the resource. Can be null.
- * @param monitor {@link ITaskMonitor} which is related to this URL
- * fetching.
- * @return Returns a pair with a {@link InputStream} and an {@link HttpResponse}.
- * The pair is never null.
- * The input stream can be null in case of error, although in general the
- * method will probably throw an exception instead.
- * The caller should look at the response code's status and only accept the
- * input stream if it's the desired code (e.g. 200 or 206).
- * @throws IOException Exception thrown when there are problems retrieving
- * the URL or its content.
- * @throws CanceledByUserException Exception thrown if the user cancels the
- * authentication dialog.
- */
- public Pair<InputStream, HttpResponse> openDirectUrl(
- @NonNull String urlString,
- @Nullable Header[] headers,
- @NonNull ITaskMonitor monitor)
- throws IOException, CanceledByUserException {
- if (DEBUG) {
- System.out.println(String.format("%s : Direct download", urlString)); //$NON-NLS-1$
- }
- return UrlOpener.openUrl(
- urlString,
- false /*needsMarkResetSupport*/,
- monitor,
- headers);
- }
-
- /**
- * This is a simplified convenience method that calls
- * {@link #openDirectUrl(String, Header[], ITaskMonitor)}
- * without passing any specific HTTP headers and returns the resulting input stream
- * and the HTTP status code.
- * See the original method's description for details on its behavior.
- * <p/>
- * {@link #openDirectUrl(String, Header[], ITaskMonitor)} can accept customized
- * HTTP headers to send with the requests and also returns the full HTTP
- * response -- status line with code and protocol and all headers.
- * <p/>
- * The resulting input stream may not support mark/reset.
- *
- * @param urlString the URL string to be opened.
- * @param monitor {@link ITaskMonitor} which is related to this URL
- * fetching.
- * @return Returns a pair with a {@link InputStream} and an HTTP status code.
- * The pair is never null.
- * The input stream can be null in case of error, although in general the
- * method will probably throw an exception instead.
- * The caller should look at the response code's status and only accept the
- * input stream if it's the desired code (e.g. 200 or 206).
- * @throws IOException Exception thrown when there are problems retrieving
- * the URL or its content.
- * @throws CanceledByUserException Exception thrown if the user cancels the
- * authentication dialog.
- * @see #openDirectUrl(String, Header[], ITaskMonitor)
- */
- public Pair<InputStream, Integer> openDirectUrl(
- @NonNull String urlString,
- @NonNull ITaskMonitor monitor)
- throws IOException, CanceledByUserException {
- if (DEBUG) {
- System.out.println(String.format("%s : Direct download", urlString)); //$NON-NLS-1$
- }
- Pair<InputStream, HttpResponse> result = UrlOpener.openUrl(
- urlString,
- false /*needsMarkResetSupport*/,
- monitor,
- null /*headers*/);
- return Pair.of(result.getFirst(), result.getSecond().getStatusLine().getStatusCode());
- }
-
- /**
- * Downloads a small file, typically XML manifests.
- * The current {@link Strategy} governs whether the file is served as-is
- * from the cache, potentially updated first or directly downloaded.
- * <p/>
- * For large downloads (e.g. installable archives) please do not invoke the
- * cache and instead use the {@link #openDirectUrl} method.
- * <p/>
- * For details on realm authentication and user/password handling,
- * check the underlying {@link UrlOpener#openUrl(String, boolean, ITaskMonitor, Header[])}
- * documentation.
- *
- * @param urlString the URL string to be opened.
- * @param monitor {@link ITaskMonitor} which is related to this URL
- * fetching.
- * @return Returns an {@link InputStream} holding the URL content.
- * Returns null if there's no content (e.g. resource not found.)
- * Returns null if the document is not cached and strategy is {@link Strategy#ONLY_CACHE}.
- * @throws IOException Exception thrown when there are problems retrieving
- * the URL or its content.
- * @throws CanceledByUserException Exception thrown if the user cancels the
- * authentication dialog.
- */
- public InputStream openCachedUrl(String urlString, ITaskMonitor monitor)
- throws IOException, CanceledByUserException {
- // Don't cache in direct mode.
- if (mStrategy == Strategy.DIRECT) {
- Pair<InputStream, HttpResponse> result = UrlOpener.openUrl(
- urlString,
- true /*needsMarkResetSupport*/,
- monitor,
- null /*headers*/);
- return result.getFirst();
- }
-
- File cached = new File(mCacheRoot, getCacheFilename(urlString));
- File info = new File(mCacheRoot, getInfoFilename(cached.getName()));
-
- boolean useCached = cached.exists();
-
- if (useCached && mStrategy == Strategy.FRESH_CACHE) {
- // Check whether the file should be served from the cache or
- // refreshed first.
-
- long cacheModifiedMs = cached.lastModified(); /* last mod time in epoch/millis */
- boolean checkCache = true;
-
- Properties props = readInfo(info);
- if (props == null) {
- // No properties, no chocolate for you.
- useCached = false;
- } else {
- long minExpiration = System.currentTimeMillis() - MIN_TIME_EXPIRED_MS;
- checkCache = cacheModifiedMs < minExpiration;
-
- if (!checkCache && DEBUG) {
- System.out.println(String.format(
- "%s : Too fresh [%,d ms], not checking yet.", //$NON-NLS-1$
- urlString, cacheModifiedMs - minExpiration));
- }
- }
-
- if (useCached && checkCache) {
- assert props != null;
-
- // Right now we only support 200 codes and will requery all 404s.
- String code = props.getProperty(KEY_STATUS_CODE, ""); //$NON-NLS-1$
- useCached = Integer.toString(HttpStatus.SC_OK).equals(code);
-
- if (!useCached && DEBUG) {
- System.out.println(String.format(
- "%s : cache disabled by code %s", //$NON-NLS-1$
- urlString, code));
- }
-
- if (useCached) {
- // Do we have a valid Content-Length? If so, it should match the file size.
- try {
- long length = Long.parseLong(props.getProperty(HttpHeaders.CONTENT_LENGTH,
- "-1")); //$NON-NLS-1$
- if (length >= 0) {
- useCached = length == cached.length();
-
- if (!useCached && DEBUG) {
- System.out.println(String.format(
- "%s : cache disabled by length mismatch %d, expected %d", //$NON-NLS-1$
- urlString, length, cached.length()));
- }
- }
- } catch (NumberFormatException ignore) {}
- }
-
- if (useCached) {
- // Do we have an ETag and/or a Last-Modified?
- String etag = props.getProperty(HttpHeaders.ETAG);
- String lastMod = props.getProperty(HttpHeaders.LAST_MODIFIED);
-
- if (etag != null || lastMod != null) {
- // Details on how to use them is defined at
- // http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.3.4
- // Bottom line:
- // - if there's an ETag, it should be used first with an
- // If-None-Match header. That's a strong comparison for HTTP/1.1 servers.
- // - otherwise use a Last-Modified if an If-Modified-Since header exists.
- // In this case, we place both and the rules indicates a spec-abiding
- // server should strongly match ETag and weakly the Modified-Since.
-
- // TODO there are some servers out there which report ETag/Last-Mod
- // yet don't honor them when presented with a precondition. In this
- // case we should identify it in the reply and invalidate ETag support
- // for these servers and instead fallback on the pure-timeout case below.
-
- AtomicInteger statusCode = new AtomicInteger(0);
- InputStream is = null;
- List<Header> headers = new ArrayList<Header>(2);
-
- if (etag != null) {
- headers.add(new BasicHeader(HttpHeaders.IF_NONE_MATCH, etag));
- }
-
- if (lastMod != null) {
- headers.add(new BasicHeader(HttpHeaders.IF_MODIFIED_SINCE, lastMod));
- }
-
- if (!headers.isEmpty()) {
- is = downloadAndCache(urlString, monitor, cached, info,
- headers.toArray(new Header[headers.size()]),
- statusCode);
- }
-
- if (is != null && statusCode.get() == HttpStatus.SC_OK) {
- // The resource was modified, the server said there was something
- // new, which has been cached. We can return that to the caller.
- return is;
- }
-
- // If we get here, we should have is == null and code
- // could be:
- // - 304 for not-modified -- same resource, still available, in
- // which case we'll use the cached one.
- // - 404 -- resource doesn't exist anymore in which case there's
- // no point in retrying.
- // - For any other code, just retry a download.
-
- if (is != null) {
- try {
- is.close();
- } catch (Exception ignore) {}
- is = null;
- }
-
- if (statusCode.get() == HttpStatus.SC_NOT_MODIFIED) {
- // Cached file was not modified.
- // Change its timestamp for the next MIN_TIME_EXPIRED_MS check.
- cached.setLastModified(System.currentTimeMillis());
-
- // At this point useCached==true so we'll return
- // the cached file below.
- } else {
- // URL fetch returned something other than 200 or 304.
- // For 404, we're done, no need to check the server again.
- // For all other codes, we'll retry a download below.
- useCached = false;
- if (statusCode.get() == HttpStatus.SC_NOT_FOUND) {
- return null;
- }
- }
- } else {
- // If we don't have an Etag nor Last-Modified, let's use a
- // basic file timestamp and compare to a 1 hour threshold.
-
- long maxExpiration = System.currentTimeMillis() - MAX_TIME_EXPIRED_MS;
- useCached = cacheModifiedMs >= maxExpiration;
-
- if (!useCached && DEBUG) {
- System.out.println(String.format(
- "[%1$s] cache disabled by timestamp %2$tD %2$tT < %3$tD %3$tT", //$NON-NLS-1$
- urlString, cacheModifiedMs, maxExpiration));
- }
- }
- }
- }
- }
-
- if (useCached) {
- // The caller needs an InputStream that supports the reset() operation.
- // The default FileInputStream does not, so load the file into a byte
- // array and return that.
- try {
- InputStream is = readCachedFile(cached);
- if (is != null) {
- if (DEBUG) {
- System.out.println(String.format("%s : Use cached file", urlString)); //$NON-NLS-1$
- }
-
- return is;
- }
- } catch (IOException ignore) {}
- }
-
- if (!useCached && mStrategy == Strategy.ONLY_CACHE) {
- // We don't have a document to serve from the cache.
- if (DEBUG) {
- System.out.println(String.format("%s : file not in cache", urlString)); //$NON-NLS-1$
- }
- return null;
- }
-
- // If we're not using the cache, try to remove the cache and download again.
- try {
- cached.delete();
- info.delete();
- } catch (SecurityException ignore) {}
-
- return downloadAndCache(urlString, monitor, cached, info,
- null /*headers*/, null /*statusCode*/);
- }
-
-
-
- // --------------
-
- private InputStream readCachedFile(File cached) throws IOException {
- InputStream is = null;
-
- int inc = 65536;
- int curr = 0;
- long len = cached.length();
- assert len < Integer.MAX_VALUE;
- if (len >= MAX_SMALL_FILE_SIZE) {
- // This is supposed to cache small files, not 2+ GB files.
- return null;
- }
- byte[] result = new byte[(int) (len > 0 ? len : inc)];
-
- try {
- is = new FileInputStream(cached);
-
- int n;
- while ((n = is.read(result, curr, result.length - curr)) != -1) {
- curr += n;
- if (curr == result.length) {
- byte[] temp = new byte[curr + inc];
- System.arraycopy(result, 0, temp, 0, curr);
- result = temp;
- }
- }
-
- return new ByteArrayInputStream(result, 0, curr);
-
- } finally {
- if (is != null) {
- try {
- is.close();
- } catch (IOException ignore) {}
- }
- }
- }
-
- /**
- * Download, cache and return as an in-memory byte stream.
- * The download is only done if the server returns 200/OK.
- * On success, store an info file next to the download with
- * a few headers.
- * <p/>
- * This method deletes the cached file and the info file ONLY if it
- * attempted a download and it failed to complete. It doesn't erase
- * anything if there's no download because the server returned a 404
- * or 304 or similar.
- *
- * @return An in-memory byte buffer input stream for the downloaded
- * and locally cached file, or null if nothing was downloaded
- * (including if it was a 304 Not-Modified status code.)
- */
- private InputStream downloadAndCache(
- String urlString,
- ITaskMonitor monitor,
- File cached,
- File info,
- @Nullable Header[] headers,
- @Nullable AtomicInteger outStatusCode)
- throws FileNotFoundException, IOException, CanceledByUserException {
- InputStream is = null;
- OutputStream os = null;
-
- int inc = 65536;
- int curr = 0;
- byte[] result = new byte[inc];
-
- try {
- Pair<InputStream, HttpResponse> r =
- UrlOpener.openUrl(urlString, true /*needsMarkResetSupport*/, monitor, headers);
-
- is = r.getFirst();
- HttpResponse response = r.getSecond();
-
- if (DEBUG) {
- System.out.println(String.format("%s : fetch: %s => %s", //$NON-NLS-1$
- urlString,
- headers == null ? "" : Arrays.toString(headers), //$NON-NLS-1$
- response.getStatusLine()));
- }
-
- int code = response.getStatusLine().getStatusCode();
-
- if (outStatusCode != null) {
- outStatusCode.set(code);
- }
-
- if (code != HttpStatus.SC_OK) {
- // Only a 200 response code makes sense here.
- // Even the other 20x codes should not apply, e.g. no content or partial
- // content are not statuses we want to handle and should never happen.
- // (see http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html#sec6.1.1 for list)
- return null;
- }
-
- os = new FileOutputStream(cached);
-
- int n;
- while ((n = is.read(result, curr, result.length - curr)) != -1) {
- if (os != null && n > 0) {
- os.write(result, curr, n);
- }
-
- curr += n;
-
- if (os != null && curr > MAX_SMALL_FILE_SIZE) {
- // If the file size exceeds our "small file size" threshold,
- // stop caching. We don't want to fill the disk.
- try {
- os.close();
- } catch (IOException ignore) {}
- try {
- cached.delete();
- info.delete();
- } catch (SecurityException ignore) {}
- os = null;
- }
- if (curr == result.length) {
- byte[] temp = new byte[curr + inc];
- System.arraycopy(result, 0, temp, 0, curr);
- result = temp;
- }
- }
-
- // Close the output stream, signaling it was stored properly.
- if (os != null) {
- try {
- os.close();
- os = null;
-
- saveInfo(urlString, response, info);
- } catch (IOException ignore) {}
- }
-
- return new ByteArrayInputStream(result, 0, curr);
-
- } finally {
- if (is != null) {
- try {
- is.close();
- } catch (IOException ignore) {}
- }
- if (os != null) {
- try {
- os.close();
- } catch (IOException ignore) {}
- // If we get here with the output stream not null, it means there
- // was an issue and we don't want to keep that file. We'll try to
- // delete it.
- try {
- cached.delete();
- info.delete();
- } catch (SecurityException ignore) {}
- }
- }
- }
-
- /**
- * Saves part of the HTTP Response to the info file.
- */
- private void saveInfo(String urlString, HttpResponse response, File info) throws IOException {
- Properties props = new Properties();
-
- // we don't need the status code & URL right now.
- // Save it in case we want to have it later (e.g. to differentiate 200 and 404.)
- props.setProperty(KEY_URL, urlString);
- props.setProperty(KEY_STATUS_CODE,
- Integer.toString(response.getStatusLine().getStatusCode()));
-
- for (String name : INFO_HTTP_HEADERS) {
- Header h = response.getFirstHeader(name);
- if (h != null) {
- props.setProperty(name, h.getValue());
- }
- }
-
- FileOutputStream os = null;
- try {
- os = new FileOutputStream(info);
- props.store(os, "## Meta data for SDK Manager cache. Do not modify."); //$NON-NLS-1$
- } finally {
- if (os != null) {
- os.close();
- }
- }
- }
-
- /**
- * Reads the info properties file.
- * @return The properties found or null if there's no file or it can't be read.
- */
- private Properties readInfo(File info) {
- if (info.exists()) {
- Properties props = new Properties();
-
- InputStream is = null;
- try {
- is = new FileInputStream(info);
- props.load(is);
- return props;
- } catch (IOException ignore) {
- } finally {
- if (is != null) {
- try {
- is.close();
- } catch (IOException ignore) {}
- }
- }
- }
- return null;
- }
-
- /**
- * Computes the cache filename for the given URL.
- * The filename uses the {@link #BIN_FILE_PREFIX}, the full URL string's hashcode and
- * a sanitized portion of the URL filename. The returned filename is never
- * more than 64 characters to ensure maximum file system compatibility.
- *
- * @param urlString The download URL.
- * @return A leaf filename for the cached download file.
- */
- private String getCacheFilename(String urlString) {
- String hash = String.format("%08x", urlString.hashCode());
-
- String leaf = urlString.toLowerCase(Locale.US);
- if (leaf.length() >= 2) {
- int index = urlString.lastIndexOf('/', leaf.length() - 2);
- leaf = urlString.substring(index + 1);
- }
-
- leaf = leaf.replaceAll("[^a-z0-9_-]+", "_");
- leaf = leaf.replaceAll("__+", "_");
-
- leaf = hash + '-' + leaf;
- String prefix = BIN_FILE_PREFIX + REV_FILE_PREFIX;
- int n = 64 - prefix.length();
- if (leaf.length() > n) {
- leaf = leaf.substring(0, n);
- }
-
- return prefix + leaf;
- }
-
- private String getInfoFilename(String cacheFilename) {
- return cacheFilename.replaceFirst(BIN_FILE_PREFIX, INFO_FILE_PREFIX);
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/IDescription.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/IDescription.java
deleted file mode 100755
index 7226360..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/IDescription.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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;
-
-/**
- * Interface for elements that can provide a description of themselves.
- */
-public interface IDescription {
-
- /**
- * Returns a description of the given element. Cannot be null.
- * <p/>
- * A description is a multi-line of text, typically much more
- * elaborate than what {@link Object#toString()} would provide.
- */
- public abstract String getShortDescription();
-
- /**
- * Returns a description of the given element. Cannot be null.
- * <p/>
- * A description is a multi-line of text, typically much more
- * elaborate than what {@link Object#toString()} would provide.
- */
- public abstract String getLongDescription();
-
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/ITask.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/ITask.java
deleted file mode 100755
index 5e561eb..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/ITask.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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;
-
-
-/**
- * A task that executes and can update a monitor to display its status.
- * The task will generally be run in a separate thread.
- */
-public interface ITask {
- public abstract void run(ITaskMonitor monitor);
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/ITaskFactory.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/ITaskFactory.java
deleted file mode 100755
index 959549b..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/ITaskFactory.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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;
-
-
-/**
- * A factory that can start and run new {@link ITask}s.
- */
-public interface ITaskFactory {
-
- /**
- * Starts a new task with a new {@link ITaskMonitor}.
- * <p/>
- * The task will execute in a thread and runs it own UI loop.
- * This means the task can perform UI operations using
- * {@code Display#asyncExec(Runnable)}.
- * <p/>
- * In either case, the method only returns when the task has finished.
- *
- * @param title The title of the task, displayed in the monitor if any.
- * @param task The task to run.
- */
- public abstract void start(String title, ITask task);
-
- /**
- * Starts a new task contributing to an already existing {@link ITaskMonitor}.
- * <p/>
- * To use this properly, you should use {@link ITaskMonitor#createSubMonitor(int)}
- * and give the sub-monitor to the new task with the number of work units you want
- * it to fill. The {@link #start} method will make sure to <em>fill</em> the progress
- * when the task is completed, in case the actual task did not.
- * <p/>
- * When a task is started from within a monitor, it reuses the thread
- * from the parent. Otherwise it starts a new thread and runs it own
- * UI loop. This means the task can perform UI operations using
- * {@code Display#asyncExec(Runnable)}.
- * <p/>
- * In either case, the method only returns when the task has finished.
- *
- * @param title The title of the task, displayed in the monitor if any.
- * @param parentMonitor The parent monitor. Can be null.
- * @param task The task to run and have it display on the monitor.
- */
- public abstract void start(String title, ITaskMonitor parentMonitor, ITask task);
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/ITaskMonitor.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/ITaskMonitor.java
deleted file mode 100755
index 74dd14a..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/ITaskMonitor.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.utils.ILogger;
-
-
-/**
- * A monitor interface for a {@link ITask}.
- * <p/>
- * Depending on the task factory that created the task, there might not be any UI
- * or it might not implement all the methods, in which case calling them would be
- * a no-op but is guaranteed not to crash.
- * <p/>
- * If the task runs in a non-UI worker thread, the task factory implementation
- * will take care of the update the UI in the correct thread. The task itself
- * must not have to deal with it.
- * <p/>
- * A monitor typically has 3 levels of text displayed: <br/>
- * - A <b>title</b> <em>may</em> be present on a task dialog, typically when a task
- * dialog is created. This is not covered by this monitor interface. <br/>
- * - A <b>description</b> displays prominent information on what the task
- * is currently doing. This is expected to vary over time, typically changing
- * with each sub-monitor, and typically only the last description is visible.
- * For example an updater would typically have descriptions such as "downloading",
- * "installing" and finally "done". This is set using {@link #setDescription}. <br/>
- * - A <b>verbose</b> optional log that can provide more information than the summary
- * description and is typically displayed in some kind of scrollable multi-line
- * text field so that the user can keep track of what happened. 3 levels are
- * provided: error, normal and verbose. An UI may hide the log till an error is
- * logged and/or might hide the verbose text unless a flag is checked by the user.
- * This is set using {@link #log}, {@link #logError} and {@link #logVerbose}.
- * <p/>
- * A monitor is also an {@link ILogger} implementation.
- */
-public interface ITaskMonitor extends ILogger {
-
- /**
- * Sets the description in the current task dialog.
- * This method can be invoked from a non-UI thread.
- */
- public void setDescription(String format, Object...args);
-
- /**
- * Logs a "normal" information line.
- * This method can be invoked from a non-UI thread.
- */
- public void log(String format, Object...args);
-
- /**
- * Logs an "error" information line.
- * This method can be invoked from a non-UI thread.
- */
- public void logError(String format, Object...args);
-
- /**
- * Logs a "verbose" information line, that is extra details which are typically
- * not that useful for the end-user and might be hidden until explicitly shown.
- * This method can be invoked from a non-UI thread.
- */
- public void logVerbose(String format, Object...args);
-
- /**
- * Sets the max value of the progress bar.
- * This method can be invoked from a non-UI thread.
- *
- * This method MUST be invoked once before using {@link #incProgress(int)} or
- * {@link #getProgress()} or {@link #createSubMonitor(int)}. Callers are
- * discouraged from using more than once -- implementations can either discard
- * the next calls or behave incoherently.
- */
- public void setProgressMax(int max);
-
- /**
- * Returns the max valie of the progress bar, as last set by {@link #setProgressMax(int)}.
- * Returns 0 if the max has never been set yet.
- */
- public int getProgressMax();
-
- /**
- * Increments the current value of the progress bar.
- * This method can be invoked from a non-UI thread.
- *
- * Callers MUST use setProgressMax before using this method.
- */
- public void incProgress(int delta);
-
- /**
- * Returns the current value of the progress bar,
- * between 0 and up to {@link #setProgressMax(int)} - 1.
- *
- * Callers MUST use setProgressMax before using this method.
- */
- public int getProgress();
-
- /**
- * Returns true if the user requested to cancel the operation.
- * It is up to the task thread to pool this and exit as soon
- * as possible.
- */
- public boolean isCancelRequested();
-
- /**
- * Creates a sub-monitor that will use up to tickCount on the progress bar.
- * tickCount must be 1 or more.
- */
- public ITaskMonitor createSubMonitor(int tickCount);
-
- /**
- * Display a yes/no question dialog box.
- *
- * Implementations MUST allow this to be called from any thread, e.g. by
- * making sure the dialog is opened synchronously in the ui thread.
- *
- * @param title The title of the dialog box
- * @param message The error message
- * @return true if YES was clicked.
- */
- public boolean displayPrompt(final String title, final String message);
-
- /**
- * Launch an interface which asks for user credentials. Implementations
- * MUST allow this to be called from any thread, e.g. by making sure the
- * dialog is opened synchronously in the UI thread.
- *
- * @param title The title of the dialog box.
- * @param message The message to be displayed as an instruction.
- * @return Returns the user provided credentials. Some fields may be blank if the user
- * did not provide any input.
- If operation is <b>canceled</b> by user the return value must be <b>null</b>.
- */
- public UserCredentials displayLoginCredentialsPrompt(String title, String message);
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/LocalSdkParser.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/LocalSdkParser.java
deleted file mode 100755
index 313819b..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/LocalSdkParser.java
+++ /dev/null
@@ -1,659 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.ISystemImage;
-import com.android.sdklib.ISystemImage.LocationType;
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.packages.AddonPackage;
-import com.android.sdklib.internal.repository.packages.DocPackage;
-import com.android.sdklib.internal.repository.packages.ExtraPackage;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.internal.repository.packages.PlatformPackage;
-import com.android.sdklib.internal.repository.packages.PlatformToolPackage;
-import com.android.sdklib.internal.repository.packages.SamplePackage;
-import com.android.sdklib.internal.repository.packages.SourcePackage;
-import com.android.sdklib.internal.repository.packages.SystemImagePackage;
-import com.android.sdklib.internal.repository.packages.ToolPackage;
-import com.android.utils.ILogger;
-import com.android.utils.Pair;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Properties;
-
-/**
- * Scans a local SDK to find which packages are currently installed.
- */
-public class LocalSdkParser {
-
- private Package[] mPackages;
-
- /** Parse all SDK folders. */
- public static final int PARSE_ALL = 0xFFFF;
- /** Parse the SDK/tools folder. */
- public static final int PARSE_TOOLS = 0x0001;
- /** Parse the SDK/platform-tools folder */
- public static final int PARSE_PLATFORM_TOOLS = 0x0002;
- /** Parse the SDK/docs folder. */
- public static final int PARSE_DOCS = 0x0004;
- /**
- * Equivalent to parsing the SDK/platforms folder but does so
- * by using the <em>valid</em> targets loaded by the {@link SdkManager}.
- * Parsing the platforms also parses the SDK/system-images folder.
- */
- public static final int PARSE_PLATFORMS = 0x0010;
- /**
- * Equivalent to parsing the SDK/addons folder but does so
- * by using the <em>valid</em> targets loaded by the {@link SdkManager}.
- */
- public static final int PARSE_ADDONS = 0x0020;
- /** Parse the SDK/samples folder.
- * Note: this will not detect samples located in the SDK/extras packages. */
- public static final int PARSE_SAMPLES = 0x0100;
- /** Parse the SDK/sources folder. */
- public static final int PARSE_SOURCES = 0x0200;
- /** Parse the SDK/extras folder. */
- public static final int PARSE_EXTRAS = 0x0400;
-
- public LocalSdkParser() {
- // pass
- }
-
- /**
- * Returns the packages found by the last call to {@link #parseSdk}.
- * <p/>
- * This returns initially returns null.
- * Once the parseSdk() method has been called, this returns a possibly empty but non-null array.
- */
- public Package[] getPackages() {
- return mPackages;
- }
-
- /**
- * Clear the internal packages list. After this call, {@link #getPackages()} will return
- * null till {@link #parseSdk} is called.
- */
- public void clearPackages() {
- mPackages = null;
- }
-
- /**
- * Scan the give SDK to find all the packages already installed at this location.
- * <p/>
- * Store the packages internally. You can use {@link #getPackages()} to retrieve them
- * at any time later.
- * <p/>
- * Equivalent to calling {@code parseSdk(..., PARSE_ALL, ...); }
- *
- * @param osSdkRoot The path to the SDK folder, typically {@code sdkManager.getLocation()}.
- * @param sdkManager An existing SDK manager to list current platforms and addons.
- * @param monitor A monitor to track progress. Cannot be null.
- * @return The packages found. Can be retrieved later using {@link #getPackages()}.
- */
- public @NonNull Package[] parseSdk(
- @NonNull String osSdkRoot,
- @NonNull SdkManager sdkManager,
- @NonNull ITaskMonitor monitor) {
- return parseSdk(osSdkRoot, sdkManager, PARSE_ALL, monitor);
- }
-
- /**
- * Scan the give SDK to find all the packages already installed at this location.
- * <p/>
- * Store the packages internally. You can use {@link #getPackages()} to retrieve them
- * at any time later.
- *
- * @param osSdkRoot The path to the SDK folder, typically {@code sdkManager.getLocation()}.
- * @param sdkManager An existing SDK manager to list current platforms and addons.
- * @param parseFilter Either {@link #PARSE_ALL} or an ORed combination of the other
- * {@code PARSE_} constants to indicate what should be parsed.
- * @param monitor A monitor to track progress. Cannot be null.
- * @return The packages found. Can be retrieved later using {@link #getPackages()}.
- */
- public @NonNull Package[] parseSdk(
- @NonNull String osSdkRoot,
- @NonNull SdkManager sdkManager,
- int parseFilter,
- @NonNull ITaskMonitor monitor) {
- ArrayList<Package> packages = new ArrayList<Package>();
- HashSet<File> visited = new HashSet<File>();
-
- monitor.setProgressMax(10);
-
- File dir = null;
- Package pkg = null;
-
- if ((parseFilter & PARSE_DOCS) != 0) {
- dir = new File(osSdkRoot, SdkConstants.FD_DOCS);
- pkg = scanDoc(dir, monitor);
- if (pkg != null) {
- packages.add(pkg);
- visited.add(dir);
- }
- }
- monitor.incProgress(1);
-
- if ((parseFilter & PARSE_TOOLS) != 0) {
- dir = new File(osSdkRoot, SdkConstants.FD_TOOLS);
- pkg = scanTools(dir, monitor);
- if (pkg != null) {
- packages.add(pkg);
- visited.add(dir);
- }
- }
- monitor.incProgress(1);
-
- if ((parseFilter & PARSE_PLATFORM_TOOLS) != 0) {
- dir = new File(osSdkRoot, SdkConstants.FD_PLATFORM_TOOLS);
- pkg = scanPlatformTools(dir, monitor);
- if (pkg != null) {
- packages.add(pkg);
- visited.add(dir);
- }
- }
- monitor.incProgress(1);
-
- // for platforms, add-ons and samples, rely on the SdkManager parser
- if ((parseFilter & (PARSE_ADDONS | PARSE_PLATFORMS)) != 0) {
- File samplesRoot = new File(osSdkRoot, SdkConstants.FD_SAMPLES);
-
- for(IAndroidTarget target : sdkManager.getTargets()) {
- Properties props = parseProperties(new File(target.getLocation(),
- SdkConstants.FN_SOURCE_PROP));
-
- try {
- pkg = null;
- if (target.isPlatform() && (parseFilter & PARSE_PLATFORMS) != 0) {
- pkg = PlatformPackage.create(target, props);
-
- if (samplesRoot.isDirectory()) {
- // Get the samples dir for a platform if it is located in the new
- // root /samples dir. We purposely ignore "old" samples that are
- // located under the platform dir.
- File samplesDir = new File(target.getPath(IAndroidTarget.SAMPLES));
- if (samplesDir.exists() &&
- samplesDir.getParentFile().equals(samplesRoot)) {
- Properties samplesProps = parseProperties(
- new File(samplesDir, SdkConstants.FN_SOURCE_PROP));
- if (samplesProps != null) {
- Package pkg2 = SamplePackage.create(target, samplesProps);
- packages.add(pkg2);
- }
- visited.add(samplesDir);
- }
- }
- } else if ((parseFilter & PARSE_ADDONS) != 0) {
- pkg = AddonPackage.create(target, props);
- }
-
- if (pkg != null) {
- for (ISystemImage systemImage : target.getSystemImages()) {
- if (systemImage.getLocationType() == LocationType.IN_SYSTEM_IMAGE) {
- File siDir = systemImage.getLocation();
- if (siDir.isDirectory()) {
- Properties siProps = parseProperties(
- new File(siDir, SdkConstants.FN_SOURCE_PROP));
- Package pkg2 = new SystemImagePackage(
- target.getVersion(),
- 0 /*rev*/, // this will use the one from siProps
- systemImage.getAbiType(),
- siProps,
- siDir.getAbsolutePath());
- packages.add(pkg2);
- visited.add(siDir);
- }
- }
- }
- }
-
- } catch (Exception e) {
- monitor.error(e, null);
- }
-
- if (pkg != null) {
- packages.add(pkg);
- visited.add(new File(target.getLocation()));
- }
- }
- }
- monitor.incProgress(1);
-
- if ((parseFilter & PARSE_PLATFORMS) != 0) {
- scanMissingSystemImages(sdkManager, visited, packages, monitor);
- }
- monitor.incProgress(1);
- if ((parseFilter & PARSE_ADDONS) != 0) {
- scanMissingAddons(sdkManager, visited, packages, monitor);
- }
- monitor.incProgress(1);
- if ((parseFilter & PARSE_SAMPLES) != 0) {
- scanMissingSamples(sdkManager, visited, packages, monitor);
- }
- monitor.incProgress(1);
- if ((parseFilter & PARSE_EXTRAS) != 0) {
- scanExtras(sdkManager, visited, packages, monitor);
- }
- monitor.incProgress(1);
- if ((parseFilter & PARSE_EXTRAS) != 0) {
- scanExtrasDirectory(osSdkRoot, visited, packages, monitor);
- }
- monitor.incProgress(1);
- if ((parseFilter & PARSE_SOURCES) != 0) {
- scanSources(sdkManager, visited, packages, monitor);
- }
- monitor.incProgress(1);
-
- Collections.sort(packages);
-
- mPackages = packages.toArray(new Package[packages.size()]);
- return mPackages;
- }
-
- /**
- * Find any directory in the /extras/vendors/path folders for extra packages.
- * This isn't a recursive search.
- */
- private void scanExtras(SdkManager sdkManager,
- HashSet<File> visited,
- ArrayList<Package> packages,
- ILogger log) {
- File root = new File(sdkManager.getLocation(), 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,
- ILogger log) {
- File root = new File(extrasRoot);
-
- if (!root.isDirectory()) {
- // This should not happen. It makes listFiles() return null so let's avoid it.
- return;
- }
-
- for (File dir : root.listFiles()) {
- if (dir.isDirectory() && !visited.contains(dir)) {
- Properties props = parseProperties(new File(dir, SdkConstants.FN_SOURCE_PROP));
- if (props != null) {
- try {
- Package pkg = ExtraPackage.create(
- null, //source
- props, //properties
- null, //vendor
- dir.getName(), //path
- 0, //revision
- null, //license
- null, //description
- null, //descUrl
- Os.getCurrentOs(), //archiveOs
- Arch.getCurrentArch(), //archiveArch
- dir.getPath() //archiveOsPath
- );
-
- packages.add(pkg);
- visited.add(dir);
- } catch (Exception e) {
- log.error(e, null);
- }
- }
- }
- }
- }
-
- /**
- * Find any other sub-directories under the /samples root that hasn't been visited yet
- * and assume they contain sample packages. This is <em>not</em> a recursive search.
- * <p/>
- * The use case is to find samples dirs under /samples when their target isn't loaded.
- */
- private void scanMissingSamples(SdkManager sdkManager,
- HashSet<File> visited,
- ArrayList<Package> packages,
- ILogger log) {
- File root = new File(sdkManager.getLocation());
- root = new File(root, SdkConstants.FD_SAMPLES);
-
- if (!root.isDirectory()) {
- // It makes listFiles() return null so let's avoid it.
- return;
- }
-
- for (File dir : root.listFiles()) {
- if (dir.isDirectory() && !visited.contains(dir)) {
- Properties props = parseProperties(new File(dir, SdkConstants.FN_SOURCE_PROP));
- if (props != null) {
- try {
- Package pkg = SamplePackage.create(dir.getAbsolutePath(), props);
- packages.add(pkg);
- visited.add(dir);
- } catch (Exception e) {
- log.error(e, null);
- }
- }
- }
- }
- }
-
- /**
- * The sdk manager only lists valid addons. However here we also want to find "broken"
- * addons, i.e. addons that failed to load for some reason.
- * <p/>
- * Find any other sub-directories under the /add-ons root that hasn't been visited yet
- * and assume they contain broken addons.
- */
- private void scanMissingAddons(SdkManager sdkManager,
- HashSet<File> visited,
- ArrayList<Package> packages,
- ILogger log) {
- File addons = new File(new File(sdkManager.getLocation()), SdkConstants.FD_ADDONS);
-
- File[] files = addons.listFiles();
- if (files == null) {
- return;
- }
-
- for (File dir : files) {
- if (dir.isDirectory() && !visited.contains(dir)) {
- Pair<Map<String, String>, String> infos =
- SdkManager.parseAddonProperties(dir, sdkManager.getTargets(), log);
- Properties sourceProps =
- parseProperties(new File(dir, SdkConstants.FN_SOURCE_PROP));
-
- Map<String, String> addonProps = infos.getFirst();
- String error = infos.getSecond();
- try {
- Package pkg = AddonPackage.createBroken(dir.getAbsolutePath(),
- sourceProps,
- addonProps,
- error);
- packages.add(pkg);
- visited.add(dir);
- } catch (Exception e) {
- log.error(e, null);
- }
- }
- }
- }
-
- /**
- * The sdk manager only lists valid system image via its addons or platform targets.
- * However here we also want to find "broken" system images, that is system images
- * that are located in the sdk/system-images folder but somehow not loaded properly.
- */
- private void scanMissingSystemImages(SdkManager sdkManager,
- HashSet<File> visited,
- ArrayList<Package> packages,
- ILogger log) {
- File siRoot = new File(sdkManager.getLocation(), SdkConstants.FD_SYSTEM_IMAGES);
-
- File[] files = siRoot.listFiles();
- if (files == null) {
- return;
- }
-
- // The system-images folder contains a list of platform folders.
- for (File platformDir : files) {
- if (platformDir.isDirectory() && !visited.contains(platformDir)) {
- visited.add(platformDir);
-
- // In the platform directory, we expect a list of abi folders
- File[] platformFiles = platformDir.listFiles();
- if (platformFiles != null) {
- for (File abiDir : platformFiles) {
- if (abiDir.isDirectory() && !visited.contains(abiDir)) {
- visited.add(abiDir);
-
- // Ignore empty directories
- File[] abiFiles = abiDir.listFiles();
- if (abiFiles != null && abiFiles.length > 0) {
- Properties props =
- parseProperties(new File(abiDir, SdkConstants.FN_SOURCE_PROP));
-
- try {
- Package pkg = SystemImagePackage.createBroken(abiDir, props);
- packages.add(pkg);
- } catch (Exception e) {
- log.error(e, null);
- }
- }
- }
- }
- }
- }
- }
- }
-
- /**
- * Scan the sources/folders and register valid as well as broken source packages.
- */
- private void scanSources(SdkManager sdkManager,
- HashSet<File> visited,
- ArrayList<Package> packages,
- ILogger log) {
- File srcRoot = new File(sdkManager.getLocation(), SdkConstants.FD_PKG_SOURCES);
-
- File[] subDirs = srcRoot.listFiles();
- if (subDirs == null) {
- return;
- }
-
- // The sources folder contains a list of platform folders.
- for (File platformDir : subDirs) {
- if (platformDir.isDirectory() && !visited.contains(platformDir)) {
- visited.add(platformDir);
-
- // Ignore empty directories
- File[] srcFiles = platformDir.listFiles();
- if (srcFiles != null && srcFiles.length > 0) {
- Properties props =
- parseProperties(new File(platformDir, SdkConstants.FN_SOURCE_PROP));
-
- try {
- Package pkg = SourcePackage.create(platformDir, props);
- packages.add(pkg);
- } catch (Exception e) {
- log.error(e, null);
- }
- }
- }
- }
- }
-
- /**
- * Try to find a tools package at the given location.
- * Returns null if not found.
- */
- private Package scanTools(File toolFolder, ILogger log) {
- // Can we find some properties?
- Properties props = parseProperties(new File(toolFolder, SdkConstants.FN_SOURCE_PROP));
-
- // We're not going to check that all tools are present. At the very least
- // we should expect to find android and an emulator adapted to the current OS.
- boolean hasEmulator = false;
- boolean hasAndroid = false;
- String android1 = SdkConstants.androidCmdName().replace(".bat", ".exe");
- String android2 = android1.indexOf('.') == -1 ? null : android1.replace(".exe", ".bat");
- File[] files = toolFolder.listFiles();
- if (files != null) {
- for (File file : files) {
- String name = file.getName();
- if (SdkConstants.FN_EMULATOR.equals(name)) {
- hasEmulator = true;
- }
- if (android1.equals(name) || (android2 != null && android2.equals(name))) {
- hasAndroid = true;
- }
- }
- }
-
- if (!hasAndroid || !hasEmulator) {
- return null;
- }
-
- // Create our package. use the properties if we found any.
- try {
- Package pkg = ToolPackage.create(
- null, //source
- props, //properties
- 0, //revision
- null, //license
- "Tools", //description
- null, //descUrl
- Os.getCurrentOs(), //archiveOs
- Arch.getCurrentArch(), //archiveArch
- toolFolder.getPath() //archiveOsPath
- );
-
- return pkg;
- } catch (Exception e) {
- log.error(e, null);
- }
- return null;
- }
-
- /**
- * Try to find a platform-tools package at the given location.
- * Returns null if not found.
- */
- private Package scanPlatformTools(File platformToolsFolder, ILogger log) {
- // Can we find some properties?
- Properties props = parseProperties(new File(platformToolsFolder,
- SdkConstants.FN_SOURCE_PROP));
-
- // We're not going to check that all tools are present. At the very least
- // we should expect to find adb, aidl, aapt and dx (adapted to the current OS).
-
- if (platformToolsFolder.listFiles() == null) {
- // ListFiles is null if the directory doesn't even exist.
- // Not going to find anything in there...
- return null;
- }
-
- // Create our package. use the properties if we found any.
- try {
- Package pkg = PlatformToolPackage.create(
- null, //source
- props, //properties
- 0, //revision
- null, //license
- "Platform Tools", //description
- null, //descUrl
- Os.getCurrentOs(), //archiveOs
- Arch.getCurrentArch(), //archiveArch
- platformToolsFolder.getPath() //archiveOsPath
- );
-
- return pkg;
- } catch (Exception e) {
- log.error(e, null);
- }
- return null;
- }
-
- /**
- * Try to find a docs package at the given location.
- * Returns null if not found.
- */
- private Package scanDoc(File docFolder, ILogger log) {
- // Can we find some properties?
- Properties props = parseProperties(new File(docFolder, SdkConstants.FN_SOURCE_PROP));
-
- // To start with, a doc folder should have an "index.html" to be acceptable.
- // We don't actually check the content of the file.
- if (new File(docFolder, "index.html").isFile()) {
- try {
- Package pkg = DocPackage.create(
- null, //source
- props, //properties
- 0, //apiLevel
- null, //codename
- 0, //revision
- null, //license
- null, //description
- null, //descUrl
- Os.getCurrentOs(), //archiveOs
- Arch.getCurrentArch(), //archiveArch
- docFolder.getPath() //archiveOsPath
- );
-
- return pkg;
- } catch (Exception e) {
- log.error(e, null);
- }
- }
-
- return null;
- }
-
- /**
- * Parses the given file as properties file if it exists.
- * Returns null if the file does not exist, cannot be parsed or has no properties.
- */
- private Properties parseProperties(File propsFile) {
- FileInputStream fis = null;
- try {
- if (propsFile.exists()) {
- fis = new FileInputStream(propsFile);
-
- Properties props = new Properties();
- props.load(fis);
-
- // To be valid, there must be at least one property in it.
- if (props.size() > 0) {
- return props;
- }
- }
-
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- if (fis != null) {
- try {
- fis.close();
- } catch (IOException e) {
- }
- }
- }
- return null;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/NullTaskMonitor.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/NullTaskMonitor.java
deleted file mode 100755
index f69e37d..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/NullTaskMonitor.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.annotations.NonNull;
-import com.android.utils.ILogger;
-import com.android.utils.NullLogger;
-
-
-/**
- * A no-op implementation of the {@link ITaskMonitor} interface.
- * <p/>
- * This can be passed to methods that require a monitor when the caller doesn't
- * have any UI to update or means to report tracked progress.
- * A custom {@link ILogger} is used. Clients could use {@link NullLogger} if
- * they really don't care about the logging either.
- */
-public class NullTaskMonitor implements ITaskMonitor {
-
- private final ILogger mLog;
-
- /**
- * Creates a no-op {@link ITaskMonitor} that defers logging to the specified
- * logger.
- * <p/>
- * This can be passed to methods that require a monitor when the caller doesn't
- * have any UI to update or means to report tracked progress.
- *
- * @param log An {@link ILogger}. Must not be null. Consider using {@link NullLogger}.
- */
- public NullTaskMonitor(ILogger log) {
- mLog = log;
- }
-
- @Override
- public void setDescription(String format, Object...args) {
- // pass
- }
-
- @Override
- public void log(String format, Object...args) {
- mLog.info(format, args);
- }
-
- @Override
- public void logError(String format, Object...args) {
- mLog.error(null /*throwable*/, format, args);
- }
-
- @Override
- public void logVerbose(String format, Object...args) {
- mLog.verbose(format, args);
- }
-
- @Override
- public void setProgressMax(int max) {
- // pass
- }
-
- @Override
- public int getProgressMax() {
- return 0;
- }
-
- @Override
- public void incProgress(int delta) {
- // pass
- }
-
- /** Always return 1. */
- @Override
- public int getProgress() {
- return 1;
- }
-
- /** Always return false. */
- @Override
- public boolean isCancelRequested() {
- return false;
- }
-
- @Override
- public ITaskMonitor createSubMonitor(int tickCount) {
- return this;
- }
-
- /** Always return false. */
- @Override
- public boolean displayPrompt(final String title, final String message) {
- return false;
- }
-
- /** Always return null. */
- @Override
- public UserCredentials displayLoginCredentialsPrompt(String title, String message) {
- return null;
- }
-
- // --- ILogger ---
-
- @Override
- public void error(Throwable t, String errorFormat, Object... args) {
- mLog.error(t, errorFormat, args);
- }
-
- @Override
- public void warning(@NonNull String warningFormat, Object... args) {
- mLog.warning(warningFormat, args);
- }
-
- @Override
- public void info(@NonNull String msgFormat, Object... args) {
- mLog.info(msgFormat, args);
- }
-
- @Override
- public void verbose(@NonNull String msgFormat, Object... args) {
- mLog.verbose(msgFormat, args);
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/SdkStats.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/SdkStats.java
deleted file mode 100755
index 0301b5e..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/SdkStats.java
+++ /dev/null
@@ -1,622 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.annotations.VisibleForTesting;
-import com.android.annotations.VisibleForTesting.Visibility;
-import com.android.sdklib.io.NonClosingInputStream;
-import com.android.sdklib.io.NonClosingInputStream.CloseBehavior;
-import com.android.sdklib.repository.SdkStatsConstants;
-import com.android.sdklib.util.SparseArray;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.UnknownHostException;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.net.ssl.SSLKeyException;
-import javax.xml.XMLConstants;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.validation.Schema;
-import javax.xml.validation.SchemaFactory;
-import javax.xml.validation.Validator;
-
-
-/**
- * Retrieves stats on platforms.
- * <p/>
- * This returns information stored on the repository in a different XML file
- * and isn't directly tied to the existence of the listed platforms.
- */
-public class SdkStats {
-
- public static class PlatformStatBase {
- private final int mApiLevel;
- private final String mVersionName;
- private final String mCodeName;
- private final float mShare;
-
- public PlatformStatBase(int apiLevel,
- String versionName,
- String codeName,
- float share) {
- mApiLevel = apiLevel;
- mVersionName = versionName;
- mCodeName = codeName;
- mShare = share;
- }
-
- /** The Android API Level for the platform. An int > 0. */
- public int getApiLevel() {
- return mApiLevel;
- }
-
- /** The official codename for this platform, for example "Cupcake". */
- public String getCodeName() {
- return mCodeName;
- }
-
- /** The official version name of this platform, for example "Android 1.5". */
- public String getVersionName() {
- return mVersionName;
- }
-
- /** An approximate share percentage of this platform and all the
- * platforms of lower API level. */
- public float getShare() {
- return mShare;
- }
-
- /** Returns a string representation of this object, for debugging purposes. */
- @Override
- public String toString() {
- return String.format("api=%d, code=%s, vers=%s, share=%.1f%%", //$NON-NLS-1$
- mApiLevel, mCodeName, mVersionName, mShare);
- }
- }
-
- public static class PlatformStat extends PlatformStatBase {
- private final float mAccumShare;
-
- public PlatformStat(int apiLevel,
- String versionName,
- String codeName,
- float share,
- float accumShare) {
- super(apiLevel, versionName, codeName, share);
- mAccumShare = accumShare;
- }
-
- public PlatformStat(PlatformStatBase base, float accumShare) {
- super(base.getApiLevel(),
- base.getVersionName(),
- base.getCodeName(),
- base.getShare());
- mAccumShare = accumShare;
- }
-
- /** The accumulated approximate share percentage of that platform. */
- public float getAccumShare() {
- return mAccumShare;
- }
-
- /** Returns a string representation of this object, for debugging purposes. */
- @Override
- public String toString() {
- return String.format("<Stat %s, accum=%.1f%%>", super.toString(), mAccumShare);
- }
- }
-
- private final SparseArray<PlatformStat> mStats = new SparseArray<SdkStats.PlatformStat>();
-
- public SdkStats() {
- }
-
- public SparseArray<PlatformStat> getStats() {
- return mStats;
- }
-
- public void load(DownloadCache cache, boolean forceHttp, ITaskMonitor monitor) {
-
- String url = SdkStatsConstants.URL_STATS;
-
- if (forceHttp) {
- url = url.replaceAll("https://", "http://"); //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- monitor.setProgressMax(5);
- monitor.setDescription("Fetching %1$s", url);
- monitor.incProgress(1);
-
- Exception[] exception = new Exception[] { null };
- Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };
- String[] validationError = new String[] { null };
- Document validatedDoc = null;
- String validatedUri = null;
-
- InputStream xml = fetchXmlUrl(url, cache, monitor.createSubMonitor(1), exception);
-
- if (xml != null) {
- monitor.setDescription("Validate XML");
-
- // Explore the XML to find the potential XML schema version
- int version = getXmlSchemaVersion(xml);
-
- if (version >= 1 && version <= SdkStatsConstants.NS_LATEST_VERSION) {
- // This should be a version we can handle. Try to validate it
- // and report any error as invalid XML syntax,
-
- String uri = validateXml(xml, url, version, validationError, validatorFound);
- if (uri != null) {
- // Validation was successful
- validatedDoc = getDocument(xml, monitor);
- validatedUri = uri;
-
- }
- } else if (version > SdkStatsConstants.NS_LATEST_VERSION) {
- // The schema used is more recent than what is supported by this tool.
- // We don't have an upgrade-path support yet, so simply ignore the document.
- closeStream(xml);
- return;
- }
- }
-
- // If any exception was handled during the URL fetch, display it now.
- if (exception[0] != null) {
- String reason = null;
- if (exception[0] instanceof FileNotFoundException) {
- // FNF has no useful getMessage, so we need to special handle it.
- reason = "File not found";
- } else if (exception[0] instanceof UnknownHostException &&
- exception[0].getMessage() != null) {
- // This has no useful getMessage yet could really use one
- reason = String.format("Unknown Host %1$s", exception[0].getMessage());
- } else if (exception[0] instanceof SSLKeyException) {
- // That's a common error and we have a pref for it.
- reason = "HTTPS SSL error. You might want to force download through HTTP in the settings.";
- } else if (exception[0].getMessage() != null) {
- reason = exception[0].getMessage();
- } else {
- // We don't know what's wrong. Let's give the exception class at least.
- reason = String.format("Unknown (%1$s)", exception[0].getClass().getName());
- }
-
- monitor.logError("Failed to fetch URL %1$s, reason: %2$s", url, reason);
- }
-
- if (validationError[0] != null) {
- monitor.logError("%s", validationError[0]); //$NON-NLS-1$
- }
-
- // Stop here if we failed to validate the XML. We don't want to load it.
- if (validatedDoc == null) {
- closeStream(xml);
- return;
- }
-
- monitor.incProgress(1);
-
- if (xml != null) {
- monitor.setDescription("Parse XML");
- monitor.incProgress(1);
- parseStatsDocument(validatedDoc, validatedUri, monitor);
- }
-
- // done
- monitor.incProgress(1);
- closeStream(xml);
- }
-
- /**
- * Fetches the document at the given URL and returns it as a stream. Returns
- * null if anything wrong happens.
- *
- * @param urlString The URL to load, as a string.
- * @param monitor {@link ITaskMonitor} related to this URL.
- * @param outException If non null, where to store any exception that
- * happens during the fetch.
- * @see UrlOpener UrlOpener, which handles all URL logic.
- */
- private InputStream fetchXmlUrl(String urlString,
- DownloadCache cache,
- ITaskMonitor monitor,
- Exception[] outException) {
- try {
- InputStream xml = cache.openCachedUrl(urlString, monitor);
- if (xml != null) {
- xml.mark(500000);
- xml = new NonClosingInputStream(xml);
- ((NonClosingInputStream) xml).setCloseBehavior(CloseBehavior.RESET);
- }
- return xml;
- } catch (Exception e) {
- if (outException != null) {
- outException[0] = e;
- }
- }
-
- return null;
- }
-
- /**
- * Closes the stream, ignore any exception from InputStream.close().
- * If the stream is a NonClosingInputStream, sets it to CloseBehavior.CLOSE first.
- */
- private void closeStream(InputStream is) {
- if (is != null) {
- if (is instanceof NonClosingInputStream) {
- ((NonClosingInputStream) is).setCloseBehavior(CloseBehavior.CLOSE);
- }
- try {
- is.close();
- } catch (IOException ignore) {}
- }
- }
-
- /**
- * Manually parses the root element of the XML to extract the schema version
- * at the end of the xmlns:sdk="http://schemas.android.com/sdk/android/addons-list/$N"
- * declaration.
- *
- * @return 1..{@link SdkStatsConstants#NS_LATEST_VERSION} for a valid schema version
- * or 0 if no schema could be found.
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected int getXmlSchemaVersion(InputStream xml) {
- if (xml == null) {
- return 0;
- }
-
- // Get an XML document
- Document doc = null;
- try {
- xml.reset();
-
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- factory.setIgnoringComments(false);
- factory.setValidating(false);
-
- // Parse the old document using a non namespace aware builder
- factory.setNamespaceAware(false);
- DocumentBuilder builder = factory.newDocumentBuilder();
-
- // We don't want the default handler which prints errors to stderr.
- builder.setErrorHandler(new ErrorHandler() {
- @Override
- public void warning(SAXParseException e) throws SAXException {
- // pass
- }
- @Override
- public void fatalError(SAXParseException e) throws SAXException {
- throw e;
- }
- @Override
- public void error(SAXParseException e) throws SAXException {
- throw e;
- }
- });
-
- doc = builder.parse(xml);
-
- // Prepare a new document using a namespace aware builder
- factory.setNamespaceAware(true);
- builder = factory.newDocumentBuilder();
-
- } catch (Exception e) {
- // Failed to reset XML stream
- // Failed to get builder factor
- // Failed to create XML document builder
- // Failed to parse XML document
- // Failed to read XML document
- }
-
- if (doc == null) {
- return 0;
- }
-
- // Check the root element is an XML with at least the following properties:
- // <sdk:sdk-addons-list
- // xmlns:sdk="http://schemas.android.com/sdk/android/addons-list/$N">
- //
- // Note that we don't have namespace support enabled, we just do it manually.
-
- Pattern nsPattern = Pattern.compile(SdkStatsConstants.NS_PATTERN);
-
- String prefix = null;
- for (Node child = doc.getFirstChild(); child != null; child = child.getNextSibling()) {
- if (child.getNodeType() == Node.ELEMENT_NODE) {
- prefix = null;
- String name = child.getNodeName();
- int pos = name.indexOf(':');
- if (pos > 0 && pos < name.length() - 1) {
- prefix = name.substring(0, pos);
- name = name.substring(pos + 1);
- }
- if (SdkStatsConstants.NODE_SDK_STATS.equals(name)) {
- NamedNodeMap attrs = child.getAttributes();
- String xmlns = "xmlns"; //$NON-NLS-1$
- if (prefix != null) {
- xmlns += ":" + prefix; //$NON-NLS-1$
- }
- Node attr = attrs.getNamedItem(xmlns);
- if (attr != null) {
- String uri = attr.getNodeValue();
- if (uri != null) {
- Matcher m = nsPattern.matcher(uri);
- if (m.matches()) {
- String version = m.group(1);
- try {
- return Integer.parseInt(version);
- } catch (NumberFormatException e) {
- return 0;
- }
- }
- }
- }
- }
- }
- }
-
- return 0;
- }
-
- /**
- * Validates this XML against one of the requested SDK Repository schemas.
- * If the XML was correctly validated, returns the schema that worked.
- * If it doesn't validate, returns null and stores the error in outError[0].
- * If we can't find a validator, returns null and set validatorFound[0] to false.
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected String validateXml(InputStream xml, String url, int version,
- String[] outError, Boolean[] validatorFound) {
-
- if (xml == null) {
- return null;
- }
-
- try {
- Validator validator = getValidator(version);
-
- if (validator == null) {
- validatorFound[0] = Boolean.FALSE;
- outError[0] = String.format(
- "XML verification failed for %1$s.\nNo suitable XML Schema Validator could be found in your Java environment. Please consider updating your version of Java.",
- url);
- return null;
- }
-
- validatorFound[0] = Boolean.TRUE;
-
- // Reset the stream if it supports that operation.
- xml.reset();
-
- // Validation throws a bunch of possible Exceptions on failure.
- validator.validate(new StreamSource(xml));
- return SdkStatsConstants.getSchemaUri(version);
-
- } catch (SAXParseException e) {
- outError[0] = String.format(
- "XML verification failed for %1$s.\nLine %2$d:%3$d, Error: %4$s",
- url,
- e.getLineNumber(),
- e.getColumnNumber(),
- e.toString());
-
- } catch (Exception e) {
- outError[0] = String.format(
- "XML verification failed for %1$s.\nError: %2$s",
- url,
- e.toString());
- }
- return null;
- }
-
- /**
- * Helper method that returns a validator for our XSD, or null if the current Java
- * implementation can't process XSD schemas.
- *
- * @param version The version of the XML Schema.
- * See {@link SdkStatsConstants#getXsdStream(int)}
- */
- private Validator getValidator(int version) throws SAXException {
- InputStream xsdStream = SdkStatsConstants.getXsdStream(version);
- try {
- SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
-
- if (factory == null) {
- return null;
- }
-
- // This may throw a SAX Exception if the schema itself is not a valid XSD
- Schema schema = factory.newSchema(new StreamSource(xsdStream));
-
- Validator validator = schema == null ? null : schema.newValidator();
-
- return validator;
- } finally {
- if (xsdStream != null) {
- try {
- xsdStream.close();
- } catch (IOException ignore) {}
- }
- }
- }
-
- /**
- * Takes an XML document as a string as parameter and returns a DOM for it.
- *
- * On error, returns null and prints a (hopefully) useful message on the monitor.
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected Document getDocument(InputStream xml, ITaskMonitor monitor) {
- try {
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- factory.setIgnoringComments(true);
- factory.setNamespaceAware(true);
-
- DocumentBuilder builder = factory.newDocumentBuilder();
- xml.reset();
- Document doc = builder.parse(new InputSource(xml));
-
- return doc;
- } catch (ParserConfigurationException e) {
- monitor.logError("Failed to create XML document builder");
-
- } catch (SAXException e) {
- monitor.logError("Failed to parse XML document");
-
- } catch (IOException e) {
- monitor.logError("Failed to read XML document");
- }
-
- return null;
- }
-
- /**
- * Parses all valid platforms found in the XML.
- * Changes the stats array returned by {@link #getStats()}
- * (also returns the value directly, useful for unti tests.)
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected SparseArray<PlatformStat> parseStatsDocument(
- Document doc,
- String nsUri,
- ITaskMonitor monitor) {
-
- String baseUrl = System.getenv("SDK_TEST_BASE_URL"); //$NON-NLS-1$
- if (baseUrl != null) {
- if (baseUrl.length() <= 0 || !baseUrl.endsWith("/")) { //$NON-NLS-1$
- baseUrl = null;
- }
- }
-
- SparseArray<PlatformStatBase> platforms = new SparseArray<SdkStats.PlatformStatBase>();
- int maxApi = 0;
-
- Node root = getFirstChild(doc, nsUri, SdkStatsConstants.NODE_SDK_STATS);
- if (root != null) {
- for (Node child = root.getFirstChild();
- child != null;
- child = child.getNextSibling()) {
- if (child.getNodeType() == Node.ELEMENT_NODE &&
- nsUri.equals(child.getNamespaceURI()) &&
- child.getLocalName().equals(SdkStatsConstants.NODE_PLATFORM)) {
-
- try {
- Node node = getFirstChild(child, nsUri, SdkStatsConstants.NODE_API_LEVEL);
- int apiLevel = Integer.parseInt(node.getTextContent().trim());
-
- if (apiLevel < 1) {
- // bad API level, ignore it.
- continue;
- }
-
- if (platforms.indexOfKey(apiLevel) >= 0) {
- // if we already loaded that API, ignore duplicates
- continue;
- }
-
- String codeName =
- getFirstChild(child, nsUri, SdkStatsConstants.NODE_CODENAME).
- getTextContent().trim();
- String versName =
- getFirstChild(child, nsUri, SdkStatsConstants.NODE_VERSION).
- getTextContent().trim();
-
- if (codeName == null || versName == null ||
- codeName.length() == 0 || versName.length() == 0) {
- // bad names. ignore.
- continue;
- }
-
- node = getFirstChild(child, nsUri, SdkStatsConstants.NODE_SHARE);
- float percent = Float.parseFloat(node.getTextContent().trim());
-
- if (percent < 0 || percent > 100) {
- // invalid percentage. ignore.
- continue;
- }
-
- PlatformStatBase p = new PlatformStatBase(
- apiLevel, versName, codeName, percent);
- platforms.put(apiLevel, p);
-
- maxApi = apiLevel > maxApi ? apiLevel : maxApi;
-
- } catch (Exception ignore) {
- // Error parsing this platform. Ignore it.
- continue;
- }
- }
- }
- }
-
- mStats.clear();
-
- // Compute cumulative share percents & fill in final map
- for (int api = 1; api <= maxApi; api++) {
- PlatformStatBase p = platforms.get(api);
- if (p == null) {
- continue;
- }
-
- float sum = p.getShare();
- for (int j = api + 1; j <= maxApi; j++) {
- PlatformStatBase pj = platforms.get(j);
- if (pj != null) {
- sum += pj.getShare();
- }
- }
-
- mStats.put(api, new PlatformStat(p, sum));
- }
-
- return mStats;
- }
-
- /**
- * Returns the first child element with the given XML local name.
- * If xmlLocalName is null, returns the very first child element.
- */
- private Node getFirstChild(Node node, String nsUri, String xmlLocalName) {
-
- for(Node child = node.getFirstChild(); child != null; child = child.getNextSibling()) {
- if (child.getNodeType() == Node.ELEMENT_NODE &&
- nsUri.equals(child.getNamespaceURI())) {
- if (xmlLocalName == null || child.getLocalName().equals(xmlLocalName)) {
- return child;
- }
- }
- }
-
- return null;
- }
-
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/UrlOpener.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/UrlOpener.java
deleted file mode 100644
index 52724c7..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/UrlOpener.java
+++ /dev/null
@@ -1,523 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.utils.Pair;
-
-import org.apache.http.Header;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.ProtocolVersion;
-import org.apache.http.auth.AuthScope;
-import org.apache.http.auth.AuthState;
-import org.apache.http.auth.Credentials;
-import org.apache.http.auth.NTCredentials;
-import org.apache.http.auth.params.AuthPNames;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.params.AuthPolicy;
-import org.apache.http.client.protocol.ClientContext;
-import org.apache.http.impl.client.DefaultHttpClient;
-import org.apache.http.impl.conn.ProxySelectorRoutePlanner;
-import org.apache.http.message.BasicHttpResponse;
-import org.apache.http.params.BasicHttpParams;
-import org.apache.http.params.HttpConnectionParams;
-import org.apache.http.params.HttpParams;
-import org.apache.http.protocol.BasicHttpContext;
-import org.apache.http.protocol.HttpContext;
-
-import java.io.BufferedInputStream;
-import java.io.ByteArrayInputStream;
-import java.io.FileNotFoundException;
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.HttpURLConnection;
-import java.net.Proxy;
-import java.net.ProxySelector;
-import java.net.URI;
-import java.net.URL;
-import java.net.URLConnection;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Properties;
-
-/**
- * This class holds static methods for downloading URL resources.
- * @see #openUrl(String, boolean, ITaskMonitor, Header[])
- * <p/>
- * Implementation detail: callers should use {@link DownloadCache} instead of this class.
- * {@link DownloadCache#openDirectUrl} is a direct pass-through to {@link UrlOpener} since
- * there's no caching. However from an implementation perspective it's still recommended
- * to pass down a {@link DownloadCache} instance, which will let us override the implementation
- * later on (for testing, for example.)
- */
-class UrlOpener {
-
- private static final boolean DEBUG =
- System.getenv("ANDROID_DEBUG_URL_OPENER") != null; //$NON-NLS-1$
-
- private static Map<String, UserCredentials> sRealmCache =
- new HashMap<String, UserCredentials>();
-
- /** Timeout to establish a connection, in milliseconds. */
- private static int sConnectionTimeoutMs;
- /** Timeout waiting for data on a socket, in milliseconds. */
- private static int sSocketTimeoutMs;
-
- static {
- if (DEBUG) {
- Properties props = System.getProperties();
- for (String key : new String[] {
- "http.proxyHost", //$NON-NLS-1$
- "http.proxyPort", //$NON-NLS-1$
- "https.proxyHost", //$NON-NLS-1$
- "https.proxyPort" }) { //$NON-NLS-1$
- String prop = props.getProperty(key);
- if (prop != null) {
- System.out.printf(
- "SdkLib.UrlOpener Java.Prop %s='%s'\n", //$NON-NLS-1$
- key, prop);
- }
- }
- }
-
- try {
- sConnectionTimeoutMs = Integer.parseInt(System.getenv("ANDROID_SDKMAN_CONN_TIMEOUT"));
- } catch (Exception ignore) {
- sConnectionTimeoutMs = 2 * 60 * 1000;
- }
-
- try {
- sSocketTimeoutMs = Integer.parseInt(System.getenv("ANDROID_SDKMAN_READ_TIMEOUT"));
- } catch (Exception ignore) {
- sSocketTimeoutMs = 1 * 60 * 1000;
- }
- }
-
- /**
- * This class cannot be instantiated.
- * @see #openUrl(String, boolean, ITaskMonitor, Header[])
- */
- private UrlOpener() {
- }
-
- /**
- * Opens a URL. It can be a simple URL or one which requires basic
- * authentication.
- * <p/>
- * Tries to access the given URL. If http response is either
- * {@code HttpStatus.SC_UNAUTHORIZED} or
- * {@code HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED}, asks for
- * login/password and tries to authenticate into proxy server and/or URL.
- * <p/>
- * This implementation relies on the Apache Http Client due to its
- * capabilities of proxy/http authentication. <br/>
- * Proxy configuration is determined by {@link ProxySelectorRoutePlanner} using the JVM proxy
- * settings by default.
- * <p/>
- * For more information see: <br/>
- * - {@code http://hc.apache.org/httpcomponents-client-ga/} <br/>
- * - {@code http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/conn/ProxySelectorRoutePlanner.html}
- * <p/>
- * There's a very simple realm cache implementation.
- * Login/Password for each realm are stored in a static {@link Map}.
- * Before asking the user the method verifies if the information is already
- * available in the memory cache.
- *
- * @param url the URL string to be opened.
- * @param needsMarkResetSupport Indicates the caller <em>must</em> have an input stream that
- * supports the mark/reset operations (as indicated by {@link InputStream#markSupported()}.
- * Implementation detail: If the original stream does not, it will be fetched and wrapped
- * into a {@link ByteArrayInputStream}. This can only work sanely if the resource is a
- * small file that can fit in memory. It also means the caller has no chance of showing
- * a meaningful download progress. If unsure, callers should set this to false.
- * @param monitor {@link ITaskMonitor} to output status.
- * @param headers An optional array of HTTP headers to use in the GET request.
- * @return Returns a {@link Pair} with {@code first} holding an {@link InputStream}
- * and {@code second} holding an {@link HttpResponse}.
- * The returned pair is never null and contains
- * at least a code; for http requests that provide them the response
- * also contains locale, headers and an status line.
- * The input stream can be null, especially in case of error.
- * The caller must only accept the stream if the response code is 200 or similar.
- * @throws IOException Exception thrown when there are problems retrieving
- * the URL or its content.
- * @throws CanceledByUserException Exception thrown if the user cancels the
- * authentication dialog.
- */
- static @NonNull Pair<InputStream, HttpResponse> openUrl(
- @NonNull String url,
- boolean needsMarkResetSupport,
- @NonNull ITaskMonitor monitor,
- @Nullable Header[] headers)
- throws IOException, CanceledByUserException {
-
- Exception fallbackOnJavaUrlConnect = null;
- Pair<InputStream, HttpResponse> result = null;
-
- try {
- result = openWithHttpClient(url, monitor, headers);
-
- } catch (UnknownHostException e) {
- // Host in unknown. No need to even retry with the Url object,
- // if it's broken, it's broken. It's already an IOException but
- // it could use a better message.
- throw new IOException("Unknown Host " + e.getMessage(), e);
-
- } catch (ClientProtocolException e) {
- // We get this when HttpClient fails to accept the current protocol,
- // e.g. when processing file:// URLs.
- fallbackOnJavaUrlConnect = e;
-
- } catch (IOException e) {
- throw e;
-
- } catch (CanceledByUserException e) {
- // HTTP Basic Auth or NTLM login was canceled by user.
- throw e;
-
- } catch (Exception e) {
- if (DEBUG) {
- System.out.printf("[HttpClient Error] %s : %s\n", url, e.toString());
- }
-
- fallbackOnJavaUrlConnect = e;
- }
-
- if (fallbackOnJavaUrlConnect != null) {
- // If the protocol is not supported by HttpClient (e.g. file:///),
- // revert to the standard java.net.Url.open.
-
- try {
- result = openWithUrl(url, headers);
- } catch (IOException e) {
- throw e;
- } catch (Exception e) {
- if (DEBUG && !fallbackOnJavaUrlConnect.equals(e)) {
- System.out.printf("[Url Error] %s : %s\n", url, e.toString());
- }
- }
- }
-
- // If the caller requires an InputStream that supports mark/reset, let's
- // make sure we have such a stream.
- if (result != null && needsMarkResetSupport) {
- InputStream is = result.getFirst();
- if (is != null) {
- if (!is.markSupported()) {
- try {
- // Consume the whole input stream and offer a byte array stream instead.
- // This can only work sanely if the resource is a small file that can
- // fit in memory. It also means the caller has no chance of showing
- // a meaningful download progress.
- InputStream is2 = toByteArrayInputStream(is);
- if (is2 != null) {
- result = Pair.of(is2, result.getSecond());
- try {
- is.close();
- } catch (Exception ignore) {}
- }
- } catch (Exception e3) {
- // Ignore. If this can't work, caller will fail later.
- }
- }
- }
- }
-
- if (result == null) {
- // Make up an error code if we don't have one already.
- HttpResponse outResponse = new BasicHttpResponse(
- new ProtocolVersion("HTTP", 1, 0), //$NON-NLS-1$
- HttpStatus.SC_METHOD_FAILURE, ""); //$NON-NLS-1$; // 420=Method Failure
- result = Pair.of(null, outResponse);
- }
-
- return result;
- }
-
- // ByteArrayInputStream is the duct tape of input streams.
- private static InputStream toByteArrayInputStream(InputStream is) throws IOException {
- int inc = 4096;
- int curr = 0;
- byte[] result = new byte[inc];
-
- int n;
- while ((n = is.read(result, curr, result.length - curr)) != -1) {
- curr += n;
- if (curr == result.length) {
- byte[] temp = new byte[curr + inc];
- System.arraycopy(result, 0, temp, 0, curr);
- result = temp;
- }
- }
-
- return new ByteArrayInputStream(result, 0, curr);
- }
-
- private static Pair<InputStream, HttpResponse> openWithUrl(
- String url,
- Header[] inHeaders) throws IOException {
- URL u = new URL(url);
-
- URLConnection c = u.openConnection();
-
- c.setConnectTimeout(sConnectionTimeoutMs);
- c.setReadTimeout(sSocketTimeoutMs);
-
- if (inHeaders != null) {
- for (Header header : inHeaders) {
- c.setRequestProperty(header.getName(), header.getValue());
- }
- }
-
- // Trigger the access to the resource
- // (at which point setRequestProperty can't be used anymore.)
- int code = 200;
-
- if (c instanceof HttpURLConnection) {
- code = ((HttpURLConnection) c).getResponseCode();
- }
-
- // Get the input stream. That can fail for a file:// that doesn't exist
- // in which case we set the response code to 404.
- // Also we need a buffered input stream since the caller need to use is.reset().
- InputStream is = null;
- try {
- is = new BufferedInputStream(c.getInputStream());
- } catch (Exception ignore) {
- if (is == null && code == 200) {
- code = 404;
- }
- }
-
- HttpResponse outResponse = new BasicHttpResponse(
- new ProtocolVersion(u.getProtocol(), 1, 0), // make up the protocol version
- code, ""); //$NON-NLS-1$;
-
- Map<String, List<String>> outHeaderMap = c.getHeaderFields();
-
- for (Entry<String, List<String>> entry : outHeaderMap.entrySet()) {
- String name = entry.getKey();
- if (name != null) {
- List<String> values = entry.getValue();
- if (!values.isEmpty()) {
- outResponse.setHeader(name, values.get(0));
- }
- }
- }
-
- return Pair.of(is, outResponse);
- }
-
- private static @NonNull Pair<InputStream, HttpResponse> openWithHttpClient(
- @NonNull String url,
- @NonNull ITaskMonitor monitor,
- Header[] inHeaders)
- throws IOException, ClientProtocolException, CanceledByUserException {
- UserCredentials result = null;
- String realm = null;
-
- HttpParams params = new BasicHttpParams();
- HttpConnectionParams.setConnectionTimeout(params, sConnectionTimeoutMs);
- HttpConnectionParams.setSoTimeout(params, sSocketTimeoutMs);
-
- // use the simple one
- final DefaultHttpClient httpClient = new DefaultHttpClient(params);
-
-
- // create local execution context
- HttpContext localContext = new BasicHttpContext();
- final HttpGet httpGet = new HttpGet(url);
- if (inHeaders != null) {
- for (Header header : inHeaders) {
- httpGet.addHeader(header);
- }
- }
-
- // retrieve local java configured network in case there is the need to
- // authenticate a proxy
- ProxySelectorRoutePlanner routePlanner = new ProxySelectorRoutePlanner(
- httpClient.getConnectionManager().getSchemeRegistry(),
- ProxySelector.getDefault());
- httpClient.setRoutePlanner(routePlanner);
-
- // Set preference order for authentication options.
- // In particular, we don't add AuthPolicy.SPNEGO, which is given preference over NTLM in
- // servers that support both, as it is more secure. However, we don't seem to handle it
- // very well, so we leave it off the list.
- // See http://hc.apache.org/httpcomponents-client-ga/tutorial/html/authentication.html for
- // more info.
- List<String> authpref = new ArrayList<String>();
- authpref.add(AuthPolicy.BASIC);
- authpref.add(AuthPolicy.DIGEST);
- authpref.add(AuthPolicy.NTLM);
- httpClient.getParams().setParameter(AuthPNames.PROXY_AUTH_PREF, authpref);
- httpClient.getParams().setParameter(AuthPNames.TARGET_AUTH_PREF, authpref);
-
- if (DEBUG) {
- try {
- URI uri = new URI(url);
- ProxySelector sel = routePlanner.getProxySelector();
- if (sel != null && uri.getScheme().startsWith("httP")) { //$NON-NLS-1$
- List<Proxy> list = sel.select(uri);
- System.out.printf(
- "SdkLib.UrlOpener:\n Connect to: %s\n Proxy List: %s\n", //$NON-NLS-1$
- url,
- list == null ? "(null)" : Arrays.toString(list.toArray()));//$NON-NLS-1$
- }
- } catch (Exception e) {
- System.out.printf(
- "SdkLib.UrlOpener: Failed to get proxy info for %s: %s\n", //$NON-NLS-1$
- url, e.toString());
- }
- }
-
- boolean trying = true;
- // loop while the response is being fetched
- while (trying) {
- // connect and get status code
- HttpResponse response = httpClient.execute(httpGet, localContext);
- int statusCode = response.getStatusLine().getStatusCode();
-
- if (DEBUG) {
- System.out.printf(" Status: %d\n", statusCode); //$NON-NLS-1$
- }
-
- // check whether any authentication is required
- AuthState authenticationState = null;
- if (statusCode == HttpStatus.SC_UNAUTHORIZED) {
- // Target host authentication required
- authenticationState = (AuthState) localContext
- .getAttribute(ClientContext.TARGET_AUTH_STATE);
- }
- if (statusCode == HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED) {
- // Proxy authentication required
- authenticationState = (AuthState) localContext
- .getAttribute(ClientContext.PROXY_AUTH_STATE);
- }
- if (statusCode == HttpStatus.SC_OK || statusCode == HttpStatus.SC_NOT_MODIFIED) {
- // in case the status is OK and there is a realm and result,
- // cache it
- if (realm != null && result != null) {
- sRealmCache.put(realm, result);
- }
- }
-
- // there is the need for authentication
- if (authenticationState != null) {
-
- // get scope and realm
- AuthScope authScope = authenticationState.getAuthScope();
-
- // If the current realm is different from the last one it means
- // a pass was performed successfully to the last URL, therefore
- // cache the last realm
- if (realm != null && !realm.equals(authScope.getRealm())) {
- sRealmCache.put(realm, result);
- }
-
- realm = authScope.getRealm();
-
- // in case there is cache for this Realm, use it to authenticate
- if (sRealmCache.containsKey(realm)) {
- result = sRealmCache.get(realm);
- } else {
- // since there is no cache, request for login and password
- result = monitor.displayLoginCredentialsPrompt("Site Authentication",
- "Please login to the following domain: " + realm +
- "\n\nServer requiring authentication:\n" + authScope.getHost());
- if (result == null) {
- throw new CanceledByUserException("User canceled login dialog.");
- }
- }
-
- // retrieve authentication data
- String user = result.getUserName();
- String password = result.getPassword();
- String workstation = result.getWorkstation();
- String domain = result.getDomain();
-
- // proceed in case there is indeed a user
- if (user != null && user.length() > 0) {
- Credentials credentials = new NTCredentials(user, password,
- workstation, domain);
- httpClient.getCredentialsProvider().setCredentials(authScope, credentials);
- trying = true;
- } else {
- trying = false;
- }
- } else {
- trying = false;
- }
-
- HttpEntity entity = response.getEntity();
-
- if (entity != null) {
- if (trying) {
- // in case another pass to the Http Client will be performed, close the entity.
- entity.getContent().close();
- } else {
- // since no pass to the Http Client is needed, retrieve the
- // entity's content.
-
- // Note: don't use something like a BufferedHttpEntity since it would consume
- // all content and store it in memory, resulting in an OutOfMemory exception
- // on a large download.
- InputStream is = new FilterInputStream(entity.getContent()) {
- @Override
- public void close() throws IOException {
- // Since Http Client is no longer needed, close it.
-
- // Bug #21167: we need to tell http client to shutdown
- // first, otherwise the super.close() would continue
- // downloading and not return till complete.
-
- httpClient.getConnectionManager().shutdown();
- super.close();
- }
- };
-
- HttpResponse outResponse = new BasicHttpResponse(response.getStatusLine());
- outResponse.setHeaders(response.getAllHeaders());
- outResponse.setLocale(response.getLocale());
-
- return Pair.of(is, outResponse);
- }
- } else if (statusCode == HttpStatus.SC_NOT_MODIFIED) {
- // It's ok to not have an entity (e.g. nothing to download) for a 304
- HttpResponse outResponse = new BasicHttpResponse(response.getStatusLine());
- outResponse.setHeaders(response.getAllHeaders());
- outResponse.setLocale(response.getLocale());
-
- return Pair.of(null, outResponse);
- }
- }
-
- // We get here if we did not succeed. Callers do not expect a null result.
- httpClient.getConnectionManager().shutdown();
- throw new FileNotFoundException(url);
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/UserCredentials.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/UserCredentials.java
deleted file mode 100644
index 16aed79..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/UserCredentials.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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;
-
-public class UserCredentials {
- private final String mUserName;
- private final String mPassword;
- private final String mWorkstation;
- private final String mDomain;
-
- public UserCredentials(String userName, String password, String workstation, String domain) {
- mUserName = userName;
- mPassword = password;
- mWorkstation = workstation;
- mDomain = domain;
- }
-
- public String getUserName() {
- return mUserName;
- }
-
- public String getPassword() {
- return mPassword;
- }
-
- public String getWorkstation() {
- return mWorkstation;
- }
-
- public String getDomain() {
- return mDomain;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/archives/Archive.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/archives/Archive.java
deleted file mode 100755
index 508911f..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/archives/Archive.java
+++ /dev/null
@@ -1,504 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.archives;
-
-import com.android.annotations.VisibleForTesting;
-import com.android.annotations.VisibleForTesting.Visibility;
-import com.android.sdklib.internal.repository.IDescription;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.io.FileOp;
-
-import java.io.File;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.Locale;
-import java.util.Properties;
-
-
-/**
- * A {@link Archive} is the base class for "something" that can be downloaded from
- * the SDK repository.
- * <p/>
- * A package has some attributes (revision, description) and a list of archives
- * which represent the downloadable bits.
- * <p/>
- * Packages are offered by a {@link SdkSource} (a download site).
- * The {@link ArchiveInstaller} takes care of downloading, unpacking and installing an archive.
- */
-public class Archive implements IDescription, Comparable<Archive> {
-
- private static final String PROP_OS = "Archive.Os"; //$NON-NLS-1$
- private static final String PROP_ARCH = "Archive.Arch"; //$NON-NLS-1$
-
- /** The checksum type. */
- public enum ChecksumType {
- /** A SHA1 checksum, represented as a 40-hex string. */
- SHA1("SHA-1"); //$NON-NLS-1$
-
- private final String mAlgorithmName;
-
- /**
- * Constructs a {@link ChecksumType} with the algorigth name
- * suitable for {@link MessageDigest#getInstance(String)}.
- * <p/>
- * These names are officially documented at
- * http://java.sun.com/javase/6/docs/technotes/guides/security/StandardNames.html#MessageDigest
- */
- private ChecksumType(String algorithmName) {
- mAlgorithmName = algorithmName;
- }
-
- /**
- * Returns a new {@link MessageDigest} instance for this checksum type.
- * @throws NoSuchAlgorithmException if this algorithm is not available.
- */
- public MessageDigest getMessageDigest() throws NoSuchAlgorithmException {
- return MessageDigest.getInstance(mAlgorithmName);
- }
- }
-
- /** The OS that this archive can be downloaded on. */
- public enum Os {
- ANY("Any"),
- LINUX("Linux"),
- MACOSX("MacOS X"),
- WINDOWS("Windows");
-
- private final String mUiName;
-
- private Os(String uiName) {
- mUiName = uiName;
- }
-
- /** Returns the UI name of the OS. */
- public String getUiName() {
- return mUiName;
- }
-
- /** Returns the XML name of the OS. */
- public String getXmlName() {
- return toString().toLowerCase(Locale.US);
- }
-
- /**
- * Returns the current OS as one of the {@link Os} enum values or null.
- */
- public static Os getCurrentOs() {
- String os = System.getProperty("os.name"); //$NON-NLS-1$
- if (os.startsWith("Mac")) { //$NON-NLS-1$
- return Os.MACOSX;
-
- } else if (os.startsWith("Windows")) { //$NON-NLS-1$
- return Os.WINDOWS;
-
- } else if (os.startsWith("Linux")) { //$NON-NLS-1$
- return Os.LINUX;
- }
-
- return null;
- }
-
- /** Returns true if this OS is compatible with the current one. */
- public boolean isCompatible() {
- if (this == ANY) {
- return true;
- }
-
- Os os = getCurrentOs();
- return this == os;
- }
- }
-
- /** The Architecture that this archive can be downloaded on. */
- public enum Arch {
- ANY("Any"),
- PPC("PowerPC"),
- X86("x86"),
- X86_64("x86_64");
-
- private final String mUiName;
-
- private Arch(String uiName) {
- mUiName = uiName;
- }
-
- /** Returns the UI name of the architecture. */
- public String getUiName() {
- return mUiName;
- }
-
- /** Returns the XML name of the architecture. */
- public String getXmlName() {
- return toString().toLowerCase(Locale.US);
- }
-
- /**
- * Returns the current architecture as one of the {@link Arch} enum values or null.
- */
- public static Arch getCurrentArch() {
- // Values listed from http://lopica.sourceforge.net/os.html
- String arch = System.getProperty("os.arch");
-
- if (arch.equalsIgnoreCase("x86_64") || arch.equalsIgnoreCase("amd64")) {
- return Arch.X86_64;
-
- } else if (arch.equalsIgnoreCase("x86")
- || arch.equalsIgnoreCase("i386")
- || arch.equalsIgnoreCase("i686")) {
- return Arch.X86;
-
- } else if (arch.equalsIgnoreCase("ppc") || arch.equalsIgnoreCase("PowerPC")) {
- return Arch.PPC;
- }
-
- return null;
- }
-
- /** Returns true if this architecture is compatible with the current one. */
- public boolean isCompatible() {
- if (this == ANY) {
- return true;
- }
-
- Arch arch = getCurrentArch();
- return this == arch;
- }
- }
-
- private final Os mOs;
- private final Arch mArch;
- private final String mUrl;
- private final long mSize;
- private final String mChecksum;
- private final ChecksumType mChecksumType = ChecksumType.SHA1;
- private final Package mPackage;
- private final String mLocalOsPath;
- private final boolean mIsLocal;
-
- /**
- * Creates a new remote archive.
- */
- public Archive(Package pkg, Os os, Arch arch, String url, long size, String checksum) {
- mPackage = pkg;
- mOs = os;
- mArch = arch;
- mUrl = url == null ? null : url.trim();
- mLocalOsPath = null;
- mSize = size;
- mChecksum = checksum;
- mIsLocal = false;
- }
-
- /**
- * Creates a new local archive.
- * Uses the properties from props first, if possible. Props can be null.
- */
- @VisibleForTesting(visibility=Visibility.PACKAGE)
- public Archive(Package pkg, Properties props, Os os, Arch arch, String localOsPath) {
- mPackage = pkg;
-
- mOs = props == null ? os : Os.valueOf( props.getProperty(PROP_OS, os.toString()));
- mArch = props == null ? arch : Arch.valueOf(props.getProperty(PROP_ARCH, arch.toString()));
-
- mUrl = null;
- mLocalOsPath = localOsPath;
- mSize = 0;
- mChecksum = "";
- mIsLocal = localOsPath != null;
- }
-
- /**
- * Save the properties of the current archive in the give {@link Properties} object.
- * These properties will later be give the constructor that takes a {@link Properties} object.
- */
- void saveProperties(Properties props) {
- props.setProperty(PROP_OS, mOs.toString());
- props.setProperty(PROP_ARCH, mArch.toString());
- }
-
- /**
- * Returns true if this is a locally installed archive.
- * Returns false if this is a remote archive that needs to be downloaded.
- */
- public boolean isLocal() {
- return mIsLocal;
- }
-
- /**
- * Returns the package that created and owns this archive.
- * It should generally not be null.
- */
- public Package getParentPackage() {
- return mPackage;
- }
-
- /**
- * Returns the archive size, an int > 0.
- * Size will be 0 if this a local installed folder of unknown size.
- */
- public long getSize() {
- return mSize;
- }
-
- /**
- * Returns the SHA1 archive checksum, as a 40-char hex.
- * Can be empty but not null for local installed folders.
- */
- public String getChecksum() {
- return mChecksum;
- }
-
- /**
- * Returns the checksum type, always {@link ChecksumType#SHA1} right now.
- */
- public ChecksumType getChecksumType() {
- return mChecksumType;
- }
-
- /**
- * Returns the download archive URL, either absolute or relative to the repository xml.
- * Always return null for a local installed folder.
- * @see #getLocalOsPath()
- */
- public String getUrl() {
- return mUrl;
- }
-
- /**
- * Returns the local OS folder where a local archive is installed.
- * Always return null for remote archives.
- * @see #getUrl()
- */
- public String getLocalOsPath() {
- return mLocalOsPath;
- }
-
- /**
- * Returns the archive {@link Os} enum.
- * Can be null for a local installed folder on an unknown OS.
- */
- public Os getOs() {
- return mOs;
- }
-
- /**
- * Returns the archive {@link Arch} enum.
- * Can be null for a local installed folder on an unknown architecture.
- */
- public Arch getArch() {
- return mArch;
- }
-
- /**
- * Generates a description for this archive of the OS/Arch supported by this archive.
- */
- public String getOsDescription() {
- String os;
- if (mOs == null) {
- os = "unknown OS";
- } else if (mOs == Os.ANY) {
- os = "any OS";
- } else {
- os = mOs.getUiName();
- }
-
- String arch = ""; //$NON-NLS-1$
- if (mArch != null && mArch != Arch.ANY) {
- arch = mArch.getUiName();
- }
-
- return String.format("%1$s%2$s%3$s",
- os,
- arch.length() > 0 ? " " : "", //$NON-NLS-2$
- arch);
- }
-
- /**
- * Returns the short description of the source, if not null.
- * Otherwise returns the default Object toString result.
- * <p/>
- * This is mostly helpful for debugging.
- * For UI display, use the {@link IDescription} interface.
- */
- @Override
- public String toString() {
- String s = getShortDescription();
- if (s != null) {
- return s;
- }
- return super.toString();
- }
-
- /**
- * Generates a short description for this archive.
- */
- @Override
- public String getShortDescription() {
- return String.format("Archive for %1$s", getOsDescription());
- }
-
- /**
- * Generates a longer description for this archive.
- */
- @Override
- public String getLongDescription() {
- return String.format("%1$s\n%2$s\n%3$s",
- getShortDescription(),
- getSizeDescription(),
- getSha1Description());
- }
-
- public String getSizeDescription() {
- long size = getSize();
- String sizeStr;
- if (size < 1024) {
- sizeStr = String.format("%d Bytes", size);
- } else if (size < 1024 * 1024) {
- sizeStr = String.format("%d KiB", Math.round(size / 1024.0));
- } else if (size < 1024 * 1024 * 1024) {
- sizeStr = String.format("%.1f MiB",
- Math.round(10.0 * size / (1024 * 1024.0))/ 10.0);
- } else {
- sizeStr = String.format("%.1f GiB",
- Math.round(10.0 * size / (1024 * 1024 * 1024.0))/ 10.0);
- }
-
- return String.format("Size: %1$s", sizeStr);
- }
-
- public String getSha1Description() {
- return String.format("SHA1: %1$s", getChecksum());
- }
-
- /**
- * Returns true if this archive can be installed on the current platform.
- */
- public boolean isCompatible() {
- return getOs().isCompatible() && getArch().isCompatible();
- }
-
- /**
- * Delete the archive folder if this is a local archive.
- */
- public void deleteLocal() {
- if (isLocal()) {
- new FileOp().deleteFileOrFolder(new File(getLocalOsPath()));
- }
- }
-
- /**
- * Archives are compared using their {@link Package} ordering.
- *
- * @see Package#compareTo(Package)
- */
- @Override
- public int compareTo(Archive rhs) {
- if (mPackage != null && rhs != null) {
- return mPackage.compareTo(rhs.getParentPackage());
- }
- return 0;
- }
-
- /**
- * Note: An {@link Archive}'s hash code does NOT depend on the parent {@link Package} hash code.
- * <p/>
- * {@inheritDoc}
- */
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((mArch == null) ? 0 : mArch.hashCode());
- result = prime * result + ((mChecksum == null) ? 0 : mChecksum.hashCode());
- result = prime * result + ((mChecksumType == null) ? 0 : mChecksumType.hashCode());
- result = prime * result + (mIsLocal ? 1231 : 1237);
- result = prime * result + ((mLocalOsPath == null) ? 0 : mLocalOsPath.hashCode());
- result = prime * result + ((mOs == null) ? 0 : mOs.hashCode());
- result = prime * result + (int) (mSize ^ (mSize >>> 32));
- result = prime * result + ((mUrl == null) ? 0 : mUrl.hashCode());
- return result;
- }
-
- /**
- * Note: An {@link Archive}'s equality does NOT depend on the parent {@link Package} equality.
- * <p/>
- * {@inheritDoc}
- */
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null) {
- return false;
- }
- if (!(obj instanceof Archive)) {
- return false;
- }
- Archive other = (Archive) obj;
- if (mArch == null) {
- if (other.mArch != null) {
- return false;
- }
- } else if (!mArch.equals(other.mArch)) {
- return false;
- }
- if (mChecksum == null) {
- if (other.mChecksum != null) {
- return false;
- }
- } else if (!mChecksum.equals(other.mChecksum)) {
- return false;
- }
- if (mChecksumType == null) {
- if (other.mChecksumType != null) {
- return false;
- }
- } else if (!mChecksumType.equals(other.mChecksumType)) {
- return false;
- }
- if (mIsLocal != other.mIsLocal) {
- return false;
- }
- if (mLocalOsPath == null) {
- if (other.mLocalOsPath != null) {
- return false;
- }
- } else if (!mLocalOsPath.equals(other.mLocalOsPath)) {
- return false;
- }
- if (mOs == null) {
- if (other.mOs != null) {
- return false;
- }
- } else if (!mOs.equals(other.mOs)) {
- return false;
- }
- if (mSize != other.mSize) {
- return false;
- }
- if (mUrl == null) {
- if (other.mUrl != null) {
- return false;
- }
- } else if (!mUrl.equals(other.mUrl)) {
- return false;
- }
- return true;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/archives/ArchiveInstaller.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/archives/ArchiveInstaller.java
deleted file mode 100755
index 75e8912..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/archives/ArchiveInstaller.java
+++ /dev/null
@@ -1,1167 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.archives;
-
-import com.android.SdkConstants;
-import com.android.annotations.Nullable;
-import com.android.annotations.VisibleForTesting;
-import com.android.annotations.VisibleForTesting.Visibility;
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.internal.repository.CanceledByUserException;
-import com.android.sdklib.internal.repository.DownloadCache;
-import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.io.FileOp;
-import com.android.sdklib.io.IFileOp;
-import com.android.sdklib.repository.RepoConstants;
-import com.android.sdklib.util.GrabProcessOutput;
-import com.android.sdklib.util.GrabProcessOutput.IProcessOutput;
-import com.android.sdklib.util.GrabProcessOutput.Wait;
-import com.android.utils.Pair;
-
-import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
-import org.apache.commons.compress.archivers.zip.ZipFile;
-import org.apache.http.Header;
-import org.apache.http.HttpHeaders;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.message.BasicHeader;
-
-import java.io.EOFException;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Properties;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.regex.Pattern;
-
-/**
- * Performs the work of installing a given {@link Archive}.
- */
-public class ArchiveInstaller {
-
- private static final String PROP_STATUS_CODE = "StatusCode"; //$NON-NLS-1$
- public static final String ENV_VAR_IGNORE_COMPAT = "ANDROID_SDK_IGNORE_COMPAT"; //$NON-NLS-1$
-
- public static final int NUM_MONITOR_INC = 100;
-
- /** The current {@link FileOp} to use. Never null. */
- private final IFileOp mFileOp;
-
- /**
- * Generates an {@link ArchiveInstaller} that relies on the default {@link FileOp}.
- */
- public ArchiveInstaller() {
- mFileOp = new FileOp();
- }
-
- /**
- * Generates an {@link ArchiveInstaller} that relies on the given {@link FileOp}.
- *
- * @param fileUtils An alternate version of {@link FileOp} to use for file operations.
- */
- protected ArchiveInstaller(IFileOp fileUtils) {
- mFileOp = fileUtils;
- }
-
- /** Returns current {@link FileOp} to use. Never null. */
- protected IFileOp getFileOp() {
- return mFileOp;
- }
-
- /**
- * Install this {@link ArchiveReplacement}s.
- * A "replacement" is composed of the actual new archive to install
- * (c.f. {@link ArchiveReplacement#getNewArchive()} and an <em>optional</em>
- * archive being replaced (c.f. {@link ArchiveReplacement#getReplaced()}.
- * In the case of a new install, the later should be null.
- * <p/>
- * The new archive to install will be skipped if it is incompatible.
- *
- * @return True if the archive was installed, false otherwise.
- */
- public boolean install(ArchiveReplacement archiveInfo,
- String osSdkRoot,
- boolean forceHttp,
- SdkManager sdkManager,
- DownloadCache cache,
- ITaskMonitor monitor) {
-
- Archive newArchive = archiveInfo.getNewArchive();
- Package pkg = newArchive.getParentPackage();
-
- String name = pkg.getShortDescription();
-
- if (newArchive.isLocal()) {
- // This should never happen.
- monitor.log("Skipping already installed archive: %1$s for %2$s",
- name,
- newArchive.getOsDescription());
- return false;
- }
-
- // In detail mode, give us a way to force install of incompatible archives.
- boolean checkIsCompatible = System.getenv(ENV_VAR_IGNORE_COMPAT) == null;
-
- if (checkIsCompatible && !newArchive.isCompatible()) {
- monitor.log("Skipping incompatible archive: %1$s for %2$s",
- name,
- newArchive.getOsDescription());
- return false;
- }
-
- Pair<File, File> files = downloadFile(newArchive, osSdkRoot, cache, monitor, forceHttp);
- File tmpFile = files == null ? null : files.getFirst();
- File propsFile = files == null ? null : files.getSecond();
- if (tmpFile != null) {
- // Unarchive calls the pre/postInstallHook methods.
- if (unarchive(archiveInfo, osSdkRoot, tmpFile, sdkManager, monitor)) {
- monitor.log("Installed %1$s", name);
- // Delete the temp archive if it exists, only on success
- mFileOp.deleteFileOrFolder(tmpFile);
- mFileOp.deleteFileOrFolder(propsFile);
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * Downloads an archive and returns the temp file with it.
- * Caller is responsible with deleting the temp file when done.
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected Pair<File, File> downloadFile(Archive archive,
- String osSdkRoot,
- DownloadCache cache,
- ITaskMonitor monitor,
- boolean forceHttp) {
-
- String pkgName = archive.getParentPackage().getShortDescription();
- monitor.setDescription("Downloading %1$s", pkgName);
- monitor.log("Downloading %1$s", pkgName);
-
- String link = archive.getUrl();
- if (!link.startsWith("http://") //$NON-NLS-1$
- && !link.startsWith("https://") //$NON-NLS-1$
- && !link.startsWith("ftp://")) { //$NON-NLS-1$
- // Make the URL absolute by prepending the source
- Package pkg = archive.getParentPackage();
- SdkSource src = pkg.getParentSource();
- if (src == null) {
- monitor.logError("Internal error: no source for archive %1$s", pkgName);
- return null;
- }
-
- // take the URL to the repository.xml and remove the last component
- // to get the base
- String repoXml = src.getUrl();
- int pos = repoXml.lastIndexOf('/');
- String base = repoXml.substring(0, pos + 1);
-
- link = base + link;
- }
-
- if (forceHttp) {
- link = link.replaceAll("https://", "http://"); //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- // Get the basename of the file we're downloading, i.e. the last component
- // of the URL
- int pos = link.lastIndexOf('/');
- String base = link.substring(pos + 1);
-
- // Rather than create a real temp file in the system, we simply use our
- // temp folder (in the SDK base folder) and use the archive name for the
- // download. This allows us to reuse or continue downloads.
-
- File tmpFolder = getTempFolder(osSdkRoot);
- if (!mFileOp.isDirectory(tmpFolder)) {
- if (mFileOp.isFile(tmpFolder)) {
- mFileOp.deleteFileOrFolder(tmpFolder);
- }
- if (!mFileOp.mkdirs(tmpFolder)) {
- monitor.logError("Failed to create directory %1$s", tmpFolder.getPath());
- return null;
- }
- }
- File tmpFile = new File(tmpFolder, base);
-
- // property file were we'll keep partial/resume information for reuse.
- File propsFile = new File(tmpFolder, base + ".inf"); //$NON-NLS-1$
-
- // if the file exists, check its checksum & size. Use it if complete
- if (mFileOp.exists(tmpFile)) {
- if (mFileOp.length(tmpFile) == archive.getSize()) {
- String chksum = ""; //$NON-NLS-1$
- try {
- chksum = fileChecksum(archive.getChecksumType().getMessageDigest(),
- tmpFile,
- monitor);
- } catch (NoSuchAlgorithmException e) {
- // Ignore.
- }
- if (chksum.equalsIgnoreCase(archive.getChecksum())) {
- // File is good, let's use it.
- return Pair.of(tmpFile, propsFile);
- } else {
- // The file has the right size but the wrong content.
- // Just remove it and this will trigger a full download below.
- mFileOp.deleteFileOrFolder(tmpFile);
- }
- }
- }
-
- Header[] resumeHeaders = preparePartialDownload(archive, tmpFile, propsFile);
-
- if (fetchUrl(archive, resumeHeaders, tmpFile, propsFile, link, pkgName, cache, monitor)) {
- // Fetching was successful, let's use this file.
- return Pair.of(tmpFile, propsFile);
- }
- return null;
- }
-
- /**
- * Prepares to do a partial/resume download.
- *
- * @param archive The archive we're trying to download.
- * @param tmpFile The destination file to download (e.g. something.zip)
- * @param propsFile A properties file generated by the last partial download (e.g. .zip.inf)
- * @return Null in case we should perform a full download, or a set of headers
- * to resume a partial download.
- */
- private Header[] preparePartialDownload(Archive archive, File tmpFile, File propsFile) {
- // We need both the destination file and its properties to do a resume.
- if (mFileOp.isFile(tmpFile) && mFileOp.isFile(propsFile)) {
- // The caller already checked the case were the destination file has the
- // right size _and_ checksum, so we know at this point one of them is wrong
- // here.
- // We can obviously only resume a file if its size is smaller than expected.
- if (mFileOp.length(tmpFile) < archive.getSize()) {
- Properties props = mFileOp.loadProperties(propsFile);
-
- List<Header> headers = new ArrayList<Header>(2);
- headers.add(new BasicHeader(HttpHeaders.RANGE,
- String.format("bytes=%d-", mFileOp.length(tmpFile))));
-
- // Don't use the properties if there's not at least a 200 or 206 code from
- // the last download.
- int status = 0;
- try {
- status = Integer.parseInt(props.getProperty(PROP_STATUS_CODE));
- } catch (Exception ignore) {}
-
- if (status == HttpStatus.SC_OK || status == HttpStatus.SC_PARTIAL_CONTENT) {
- // Do we have an ETag and/or a Last-Modified?
- String etag = props.getProperty(HttpHeaders.ETAG);
- String lastMod = props.getProperty(HttpHeaders.LAST_MODIFIED);
-
- if (etag != null && etag.length() > 0) {
- headers.add(new BasicHeader(HttpHeaders.IF_MATCH, etag));
- } else if (lastMod != null && lastMod.length() > 0) {
- headers.add(new BasicHeader(HttpHeaders.IF_MATCH, lastMod));
- }
-
- return headers.toArray(new Header[headers.size()]);
- }
- }
- }
-
- // Existing file is either of different size or content.
- // Remove the existing file and request a full download.
- mFileOp.deleteFileOrFolder(tmpFile);
- mFileOp.deleteFileOrFolder(propsFile);
-
- return null;
- }
-
- /**
- * Computes the SHA-1 checksum of the content of the given file.
- * Returns an empty string on error (rather than null).
- */
- private String fileChecksum(MessageDigest digester, File tmpFile, ITaskMonitor monitor) {
- InputStream is = null;
- try {
- is = new FileInputStream(tmpFile);
-
- byte[] buf = new byte[65536];
- int n;
-
- while ((n = is.read(buf)) >= 0) {
- if (n > 0) {
- digester.update(buf, 0, n);
- }
- }
-
- return getDigestChecksum(digester);
-
- } catch (FileNotFoundException e) {
- // The FNF message is just the URL. Make it a bit more useful.
- monitor.logError("File not found: %1$s", e.getMessage());
-
- } catch (Exception e) {
- monitor.logError("%1$s", e.getMessage()); //$NON-NLS-1$
-
- } finally {
- if (is != null) {
- try {
- is.close();
- } catch (IOException e) {
- // pass
- }
- }
- }
-
- return ""; //$NON-NLS-1$
- }
-
- /**
- * Returns the SHA-1 from a {@link MessageDigest} as an hex string
- * that can be compared with {@link Archive#getChecksum()}.
- */
- private String getDigestChecksum(MessageDigest digester) {
- int n;
- // Create an hex string from the digest
- byte[] digest = digester.digest();
- n = digest.length;
- String hex = "0123456789abcdef"; //$NON-NLS-1$
- char[] hexDigest = new char[n * 2];
- for (int i = 0; i < n; i++) {
- int b = digest[i] & 0x0FF;
- hexDigest[i*2 + 0] = hex.charAt(b >>> 4);
- hexDigest[i*2 + 1] = hex.charAt(b & 0x0f);
- }
-
- return new String(hexDigest);
- }
-
- /**
- * Actually performs the download.
- * Also computes the SHA1 of the file on the fly.
- * <p/>
- * Success is defined as downloading as many bytes as was expected and having the same
- * SHA1 as expected. Returns true on success or false if any of those checks fail.
- * <p/>
- * Increments the monitor by {@link #NUM_MONITOR_INC}.
- *
- * @param archive The archive we're trying to download.
- * @param resumeHeaders The headers to use for a partial resume, or null when fetching
- * a whole new file.
- * @param tmpFile The destination file to download (e.g. something.zip)
- * @param propsFile A properties file generated by the last partial download (e.g. .zip.inf)
- * @param urlString The URL as a string
- * @param pkgName The archive's package name, used for progress output.
- * @param cache The {@link DownloadCache} instance to use.
- * @param monitor The monitor to output the progress and errors.
- * @return True if we fetched the file successfully.
- * False if the download failed or was aborted.
- */
- private boolean fetchUrl(Archive archive,
- Header[] resumeHeaders,
- File tmpFile,
- File propsFile,
- String urlString,
- String pkgName,
- DownloadCache cache,
- ITaskMonitor monitor) {
-
- FileOutputStream os = null;
- InputStream is = null;
- int inc_remain = NUM_MONITOR_INC;
- try {
- Pair<InputStream, HttpResponse> result =
- cache.openDirectUrl(urlString, resumeHeaders, monitor);
-
- is = result.getFirst();
- HttpResponse resp = result.getSecond();
- int status = resp.getStatusLine().getStatusCode();
- if (status == HttpStatus.SC_NOT_FOUND) {
- throw new Exception("URL not found.");
- }
- if (is == null) {
- throw new Exception("No content.");
- }
-
-
- Properties props = new Properties();
- props.setProperty(PROP_STATUS_CODE, Integer.toString(status));
- if (resp.containsHeader(HttpHeaders.ETAG)) {
- props.setProperty(HttpHeaders.ETAG,
- resp.getFirstHeader(HttpHeaders.ETAG).getValue());
- }
- if (resp.containsHeader(HttpHeaders.LAST_MODIFIED)) {
- props.setProperty(HttpHeaders.LAST_MODIFIED,
- resp.getFirstHeader(HttpHeaders.LAST_MODIFIED).getValue());
- }
-
- mFileOp.saveProperties(propsFile, props, "## Android SDK Download."); //$NON-NLS-1$
-
- // On success, status can be:
- // - 206 (Partial content), if resumeHeaders is not null (we asked for a partial
- // download, and we get partial content for that download => we'll need to append
- // to the existing file.)
- // - 200 (OK) meaning we're getting whole new content from scratch. This can happen
- // even if resumeHeaders is not null (typically means the server has a new version
- // of the file to serve.) In this case we reset the file and write from scratch.
-
- boolean append = status == HttpStatus.SC_PARTIAL_CONTENT;
- if (status != HttpStatus.SC_OK && !(append && resumeHeaders != null)) {
- throw new Exception(String.format("Unexpected HTTP Status %1$d", status));
- }
- MessageDigest digester = archive.getChecksumType().getMessageDigest();
-
- if (append) {
- // Seed the digest with the existing content.
- InputStream temp = null;
- try {
- temp = new FileInputStream(tmpFile);
-
- byte[] buf = new byte[65536];
- int n;
-
- while ((n = temp.read(buf)) >= 0) {
- if (n > 0) {
- digester.update(buf, 0, n);
- }
- }
- } catch (Exception ignore) {
- } finally {
- if (temp != null) {
- try {
- temp.close();
- } catch (IOException ignore) {}
- }
- }
- }
-
- // Open the output stream in append for a resume, or reset for a full download.
- os = new FileOutputStream(tmpFile, append);
-
- byte[] buf = new byte[65536];
- int n;
-
- long total = 0;
- long size = archive.getSize();
- if (append) {
- long len = mFileOp.length(tmpFile);
- int percent = (int) (len * 100 / size);
- size -= len;
- monitor.logVerbose(
- "Resuming %1$s download at %2$d (%3$d%%)", pkgName, len, percent);
- }
- long inc = size / NUM_MONITOR_INC;
- long next_inc = inc;
-
- long startMs = System.currentTimeMillis();
- long nextMs = startMs + 2000; // start update after 2 seconds
-
- while ((n = is.read(buf)) >= 0) {
- if (n > 0) {
- os.write(buf, 0, n);
- digester.update(buf, 0, n);
- }
-
- long timeMs = System.currentTimeMillis();
-
- total += n;
- if (total >= next_inc) {
- monitor.incProgress(1);
- inc_remain--;
- next_inc += inc;
- }
-
- if (timeMs > nextMs) {
- long delta = timeMs - startMs;
- if (total > 0 && delta > 0) {
- // percent left to download
- int percent = (int) (100 * total / size);
- // speed in KiB/s
- float speed = (float)total / (float)delta * (1000.f / 1024.f);
- // time left to download the rest at the current KiB/s rate
- int timeLeft = (speed > 1e-3) ?
- (int)(((size - total) / 1024.0f) / speed) :
- 0;
- String timeUnit = "seconds";
- if (timeLeft > 120) {
- timeUnit = "minutes";
- timeLeft /= 60;
- }
-
- monitor.setDescription(
- "Downloading %1$s (%2$d%%, %3$.0f KiB/s, %4$d %5$s left)",
- pkgName,
- percent,
- speed,
- timeLeft,
- timeUnit);
- }
- nextMs = timeMs + 1000; // update every second
- }
-
- if (monitor.isCancelRequested()) {
- monitor.log("Download aborted by user at %1$d bytes.", total);
- return false;
- }
-
- }
-
- if (total != size) {
- monitor.logError(
- "Download finished with wrong size. Expected %1$d bytes, got %2$d bytes.",
- size, total);
- return false;
- }
-
- // Create an hex string from the digest
- String actual = getDigestChecksum(digester);
- String expected = archive.getChecksum();
- if (!actual.equalsIgnoreCase(expected)) {
- monitor.logError("Download finished with wrong checksum. Expected %1$s, got %2$s.",
- expected, actual);
- return false;
- }
-
- return true;
-
- } catch (CanceledByUserException e) {
- // HTTP Basic Auth or NTLM login was canceled by user.
- // Don't output an error in the log.
-
- } catch (FileNotFoundException e) {
- // The FNF message is just the URL. Make it a bit more useful.
- monitor.logError("URL not found: %1$s", e.getMessage());
-
- } catch (Exception e) {
- monitor.logError("Download interrupted: %1$s", e.getMessage()); //$NON-NLS-1$
-
- } finally {
- if (os != null) {
- try {
- os.close();
- } catch (IOException e) {
- // pass
- }
- }
-
- if (is != null) {
- try {
- is.close();
- } catch (IOException e) {
- // pass
- }
- }
- if (inc_remain > 0) {
- monitor.incProgress(inc_remain);
- }
- }
-
- return false;
- }
-
- /**
- * Install the given archive in the given folder.
- */
- private boolean unarchive(ArchiveReplacement archiveInfo,
- String osSdkRoot,
- File archiveFile,
- SdkManager sdkManager,
- ITaskMonitor monitor) {
- boolean success = false;
- Archive newArchive = archiveInfo.getNewArchive();
- Package pkg = newArchive.getParentPackage();
- String pkgName = pkg.getShortDescription();
- monitor.setDescription("Installing %1$s", pkgName);
- monitor.log("Installing %1$s", pkgName);
-
- // Ideally we want to always unzip in a temp folder which name depends on the package
- // type (e.g. addon, tools, etc.) and then move the folder to the destination folder.
- // If the destination folder exists, it will be renamed and deleted at the very
- // end if everything succeeded. This provides a nice atomic swap and should leave the
- // original folder untouched in case something wrong (e.g. program crash) in the
- // middle of the unzip operation.
- //
- // However that doesn't work on Windows, we always end up not being able to move the
- // new folder. There are actually 2 cases:
- // A- A process such as a the explorer is locking the *old* folder or a file inside
- // (e.g. adb.exe)
- // In this case we really shouldn't be tried to work around it and we need to let
- // the user know and let it close apps that access that folder.
- // B- A process is locking the *new* folder. Very often this turns to be a file indexer
- // or an anti-virus that is busy scanning the new folder that we just unzipped.
- //
- // So we're going to change the strategy:
- // 1- Try to move the old folder to a temp/old folder. This might fail in case of issue A.
- // Note: for platform-tools, we can try killing adb first.
- // If it still fails, we do nothing and ask the user to terminate apps that can be
- // locking that folder.
- // 2- Once the old folder is out of the way, we unzip the archive directly into the
- // optimal new location. We no longer unzip it in a temp folder and move it since we
- // know that's what fails in most of the cases.
- // 3- If the unzip fails, remove everything and try to restore the old folder by doing
- // a *copy* in place and not a folder move (which will likely fail too).
-
- String pkgKind = pkg.getClass().getSimpleName();
-
- File destFolder = null;
- File oldDestFolder = null;
-
- try {
- // -0- Compute destination directory and check install pre-conditions
-
- destFolder = pkg.getInstallFolder(osSdkRoot, sdkManager);
-
- if (destFolder == null) {
- // this should not seriously happen.
- monitor.log("Failed to compute installation directory for %1$s.", pkgName);
- return false;
- }
-
- if (!pkg.preInstallHook(newArchive, monitor, osSdkRoot, destFolder)) {
- monitor.log("Skipping archive: %1$s", pkgName);
- return false;
- }
-
- // -1- move old folder.
-
- if (mFileOp.exists(destFolder)) {
- // Create a new temp/old dir
- if (oldDestFolder == null) {
- oldDestFolder = getNewTempFolder(osSdkRoot, pkgKind, "old"); //$NON-NLS-1$
- }
- if (oldDestFolder == null) {
- // this should not seriously happen.
- monitor.logError("Failed to find a temp directory in %1$s.", osSdkRoot);
- return false;
- }
-
- // Try to move the current dest dir to the temp/old one. Tell the user if it failed.
- while(true) {
- if (!moveFolder(destFolder, oldDestFolder)) {
- monitor.logError("Failed to rename directory %1$s to %2$s.",
- destFolder.getPath(), oldDestFolder.getPath());
-
- if (SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_WINDOWS) {
- boolean tryAgain = true;
-
- tryAgain = windowsDestDirLocked(osSdkRoot, destFolder, monitor);
-
- if (tryAgain) {
- // loop, trying to rename the temp dir into the destination
- continue;
- } else {
- return false;
- }
- }
- }
- break;
- }
- }
-
- assert !mFileOp.exists(destFolder);
-
- // -2- Unzip new content directly in place.
-
- if (!mFileOp.mkdirs(destFolder)) {
- monitor.logError("Failed to create directory %1$s", destFolder.getPath());
- return false;
- }
-
- if (!unzipFolder(archiveInfo,
- archiveFile,
- destFolder,
- monitor)) {
- return false;
- }
-
- if (!generateSourceProperties(newArchive, destFolder)) {
- monitor.logError("Failed to generate source.properties in directory %1$s",
- destFolder.getPath());
- return false;
- }
-
- // In case of success, if we were replacing an archive
- // and the older one had a different path, remove it now.
- Archive oldArchive = archiveInfo.getReplaced();
- if (oldArchive != null && oldArchive.isLocal()) {
- String oldPath = oldArchive.getLocalOsPath();
- File oldFolder = oldPath == null ? null : new File(oldPath);
- if (oldFolder == null && oldArchive.getParentPackage() != null) {
- oldFolder = oldArchive.getParentPackage().getInstallFolder(
- osSdkRoot, sdkManager);
- }
- if (oldFolder != null && mFileOp.exists(oldFolder) &&
- !oldFolder.equals(destFolder)) {
- monitor.logVerbose("Removing old archive at %1$s", oldFolder.getAbsolutePath());
- mFileOp.deleteFileOrFolder(oldFolder);
- }
- }
-
- success = true;
- pkg.postInstallHook(newArchive, monitor, destFolder);
- return true;
-
- } finally {
- if (!success) {
- // In case of failure, we try to restore the old folder content.
- if (oldDestFolder != null) {
- restoreFolder(oldDestFolder, destFolder);
- }
-
- // We also call the postInstallHool with a null directory to give a chance
- // to the archive to cleanup after preInstallHook.
- pkg.postInstallHook(newArchive, monitor, null /*installDir*/);
- }
-
- // Cleanup if the unzip folder is still set.
- mFileOp.deleteFileOrFolder(oldDestFolder);
- }
- }
-
- private boolean windowsDestDirLocked(
- String osSdkRoot,
- File destFolder,
- final ITaskMonitor monitor) {
- String msg = null;
-
- assert SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_WINDOWS;
-
- File findLockExe = FileOp.append(
- osSdkRoot, SdkConstants.FD_TOOLS, SdkConstants.FD_LIB, SdkConstants.FN_FIND_LOCK);
-
- if (mFileOp.exists(findLockExe)) {
- try {
- final StringBuilder result = new StringBuilder();
- String command[] = new String[] {
- findLockExe.getAbsolutePath(),
- destFolder.getAbsolutePath()
- };
- Process process = Runtime.getRuntime().exec(command);
- int retCode = GrabProcessOutput.grabProcessOutput(
- process,
- Wait.WAIT_FOR_READERS,
- new IProcessOutput() {
- @Override
- public void out(@Nullable String line) {
- if (line != null) {
- result.append(line).append("\n");
- }
- }
-
- @Override
- public void err(@Nullable String line) {
- if (line != null) {
- monitor.logError("[find_lock] Error: %1$s", line);
- }
- }
- });
-
- if (retCode == 0 && result.length() > 0) {
- // TODO create a better dialog
-
- String found = result.toString().trim();
- monitor.logError("[find_lock] Directory locked by %1$s", found);
-
- TreeSet<String> apps = new TreeSet<String>(Arrays.asList(
- found.split(Pattern.quote(";")))); //$NON-NLS-1$
- StringBuilder appStr = new StringBuilder();
- for (String app : apps) {
- appStr.append("\n - ").append(app.trim()); //$NON-NLS-1$
- }
-
- msg = String.format(
- "-= Warning ! =-\n" +
- "The following processes: %1$s\n" +
- "are locking the following directory: \n" +
- " %2$s\n" +
- "Please close these applications so that the installation can continue.\n" +
- "When ready, press YES to try again.",
- appStr.toString(),
- destFolder.getPath());
- }
-
- } catch (Exception e) {
- monitor.error(e, "[find_lock failed]");
- }
-
-
- }
-
- if (msg == null) {
- // Old way: simply display a generic text and let user figure it out.
- msg = String.format(
- "-= Warning ! =-\n" +
- "A folder failed to be moved. On Windows this " +
- "typically means that a program is using that folder (for " +
- "example Windows Explorer or your anti-virus software.)\n" +
- "Please momentarily deactivate your anti-virus software or " +
- "close any running programs that may be accessing the " +
- "directory '%1$s'.\n" +
- "When ready, press YES to try again.",
- destFolder.getPath());
- }
-
- boolean tryAgain = monitor.displayPrompt("SDK Manager: failed to install", msg);
- return tryAgain;
- }
-
- /**
- * Tries to rename/move a folder.
- * <p/>
- * Contract:
- * <ul>
- * <li> When we start, oldDir must exist and be a directory. newDir must not exist. </li>
- * <li> On successful completion, oldDir must not exists.
- * newDir must exist and have the same content. </li>
- * <li> On failure completion, oldDir must have the same content as before.
- * newDir must not exist. </li>
- * </ul>
- * <p/>
- * The simple "rename" operation on a folder can typically fail on Windows for a variety
- * of reason, in fact as soon as a single process holds a reference on a directory. The
- * most common case are the Explorer, the system's file indexer, Tortoise SVN cache or
- * an anti-virus that are busy indexing a new directory having been created.
- *
- * @param oldDir The old location to move. It must exist and be a directory.
- * @param newDir The new location where to move. It must not exist.
- * @return True if the move succeeded. On failure, we try hard to not have touched the old
- * directory in order not to loose its content.
- */
- private boolean moveFolder(File oldDir, File newDir) {
- // This is a simple folder rename that works on Linux/Mac all the time.
- //
- // On Windows this might fail if an indexer is busy looking at a new directory
- // (e.g. right after we unzip our archive), so it fails let's be nice and give
- // it a bit of time to succeed.
- for (int i = 0; i < 5; i++) {
- if (mFileOp.renameTo(oldDir, newDir)) {
- return true;
- }
- try {
- Thread.sleep(500 /*ms*/);
- } catch (InterruptedException e) {
- // ignore
- }
- }
-
- return false;
- }
-
- /**
- * Unzips a zip file into the given destination directory.
- *
- * The archive file MUST have a unique "root" folder.
- * This root folder is skipped when unarchiving.
- */
- @SuppressWarnings("unchecked")
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected boolean unzipFolder(
- ArchiveReplacement archiveInfo,
- File archiveFile,
- File unzipDestFolder,
- ITaskMonitor monitor) {
-
- Archive newArchive = archiveInfo.getNewArchive();
- Package pkg = newArchive.getParentPackage();
- String pkgName = pkg.getShortDescription();
- long compressedSize = newArchive.getSize();
-
- ZipFile zipFile = null;
- try {
- zipFile = new ZipFile(archiveFile);
-
- // To advance the percent and the progress bar, we don't know the number of
- // items left to unzip. However we know the size of the archive and the size of
- // each uncompressed item. The zip file format overhead is negligible so that's
- // a good approximation.
- long incStep = compressedSize / NUM_MONITOR_INC;
- long incTotal = 0;
- long incCurr = 0;
- int lastPercent = 0;
-
- byte[] buf = new byte[65536];
-
- Enumeration<ZipArchiveEntry> entries = zipFile.getEntries();
- while (entries.hasMoreElements()) {
- ZipArchiveEntry entry = entries.nextElement();
-
- String name = entry.getName();
-
- // ZipFile entries should have forward slashes, but not all Zip
- // implementations can be expected to do that.
- name = name.replace('\\', '/');
-
- // Zip entries are always packages in a top-level directory
- // (e.g. docs/index.html). However we want to use our top-level
- // directory so we drop the first segment of the path name.
- int pos = name.indexOf('/');
- if (pos < 0 || pos == name.length() - 1) {
- continue;
- } else {
- name = name.substring(pos + 1);
- }
-
- File destFile = new File(unzipDestFolder, name);
-
- if (name.endsWith("/")) { //$NON-NLS-1$
- // Create directory if it doesn't exist yet. This allows us to create
- // empty directories.
- if (!mFileOp.isDirectory(destFile) && !mFileOp.mkdirs(destFile)) {
- monitor.logError("Failed to create directory %1$s",
- destFile.getPath());
- return false;
- }
- continue;
- } else if (name.indexOf('/') != -1) {
- // Otherwise it's a file in a sub-directory.
- // Make sure the parent directory has been created.
- File parentDir = destFile.getParentFile();
- if (!mFileOp.isDirectory(parentDir)) {
- if (!mFileOp.mkdirs(parentDir)) {
- monitor.logError("Failed to create directory %1$s",
- parentDir.getPath());
- return false;
- }
- }
- }
-
- FileOutputStream fos = null;
- long remains = entry.getSize();
- try {
- fos = new FileOutputStream(destFile);
-
- // Java bug 4040920: do not rely on the input stream EOF and don't
- // try to read more than the entry's size.
- InputStream entryContent = zipFile.getInputStream(entry);
- int n;
- while (remains > 0 &&
- (n = entryContent.read(
- buf, 0, (int) Math.min(remains, buf.length))) != -1) {
- remains -= n;
- if (n > 0) {
- fos.write(buf, 0, n);
- }
- }
- } catch (EOFException e) {
- monitor.logError("Error uncompressing file %s. Size: %d bytes, Unwritten: %d bytes.",
- entry.getName(), entry.getSize(), remains);
- throw e;
- } finally {
- if (fos != null) {
- fos.close();
- }
- }
-
- pkg.postUnzipFileHook(newArchive, monitor, mFileOp, destFile, entry);
-
- // Increment progress bar to match. We update only between files.
- for(incTotal += entry.getCompressedSize(); incCurr < incTotal; incCurr += incStep) {
- monitor.incProgress(1);
- }
-
- int percent = (int) (100 * incTotal / compressedSize);
- if (percent != lastPercent) {
- monitor.setDescription("Unzipping %1$s (%2$d%%)", pkgName, percent);
- lastPercent = percent;
- }
-
- if (monitor.isCancelRequested()) {
- return false;
- }
- }
-
- return true;
-
- } catch (IOException e) {
- monitor.logError("Unzip failed: %1$s", e.getMessage());
-
- } finally {
- if (zipFile != null) {
- try {
- zipFile.close();
- } catch (IOException e) {
- // pass
- }
- }
- }
-
- return false;
- }
-
- /**
- * Returns an unused temp folder path in the form of osBasePath/temp/prefix.suffixNNN.
- * <p/>
- * This does not actually <em>create</em> the folder. It just scan the base path for
- * a free folder name to use and returns the file to use to reference it.
- * <p/>
- * This operation is not atomic so there's no guarantee the folder can't get
- * created in between. This is however unlikely and the caller can assume the
- * returned folder does not exist yet.
- * <p/>
- * Returns null if no such folder can be found (e.g. if all candidates exist,
- * which is rather unlikely) or if the base temp folder cannot be created.
- */
- private File getNewTempFolder(String osBasePath, String prefix, String suffix) {
- File baseTempFolder = getTempFolder(osBasePath);
-
- if (!mFileOp.isDirectory(baseTempFolder)) {
- if (mFileOp.isFile(baseTempFolder)) {
- mFileOp.deleteFileOrFolder(baseTempFolder);
- }
- if (!mFileOp.mkdirs(baseTempFolder)) {
- return null;
- }
- }
-
- for (int i = 1; i < 100; i++) {
- File folder = new File(baseTempFolder,
- String.format("%1$s.%2$s%3$02d", prefix, suffix, i)); //$NON-NLS-1$
- if (!mFileOp.exists(folder)) {
- return folder;
- }
- }
- return null;
- }
-
- /**
- * Returns the single fixed "temp" folder used by the SDK Manager.
- * This folder is always at osBasePath/temp.
- * <p/>
- * This does not actually <em>create</em> the folder.
- */
- private File getTempFolder(String osBasePath) {
- File baseTempFolder = new File(osBasePath, RepoConstants.FD_TEMP);
- return baseTempFolder;
- }
-
- /**
- * Generates a source.properties in the destination folder that contains all the infos
- * relevant to this archive, this package and the source so that we can reload them
- * locally later.
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected boolean generateSourceProperties(Archive archive, File unzipDestFolder) {
- Properties props = new Properties();
-
- archive.saveProperties(props);
-
- Package pkg = archive.getParentPackage();
- if (pkg != null) {
- pkg.saveProperties(props);
- }
-
- return mFileOp.saveProperties(
- new File(unzipDestFolder, SdkConstants.FN_SOURCE_PROP),
- props,
- "## Android Tool: Source of this archive."); //$NON-NLS-1$
- }
-
- /**
- * Recursively restore srcFolder into destFolder by performing a copy of the file
- * content rather than rename/moves.
- *
- * @param srcFolder The source folder to restore.
- * @param destFolder The destination folder where to restore.
- * @return True if the folder was successfully restored, false if it was not at all or
- * only partially restored.
- */
- private boolean restoreFolder(File srcFolder, File destFolder) {
- boolean result = true;
-
- // Process sub-folders first
- File[] srcFiles = mFileOp.listFiles(srcFolder);
- if (srcFiles == null) {
- // Source does not exist. That is quite odd.
- return false;
- }
-
- if (mFileOp.isFile(destFolder)) {
- if (!mFileOp.delete(destFolder)) {
- // There's already a file in there where we want a directory and
- // we can't delete it. This is rather unexpected. Just give up on
- // that folder.
- return false;
- }
- } else if (!mFileOp.isDirectory(destFolder)) {
- mFileOp.mkdirs(destFolder);
- }
-
- // Get all the files and dirs of the current destination.
- // We are not going to clean up the destination first.
- // Instead we'll copy over and just remove any remaining files or directories.
- Set<File> destDirs = new HashSet<File>();
- Set<File> destFiles = new HashSet<File>();
- File[] files = mFileOp.listFiles(destFolder);
- if (files != null) {
- for (File f : files) {
- if (mFileOp.isDirectory(f)) {
- destDirs.add(f);
- } else {
- destFiles.add(f);
- }
- }
- }
-
- // First restore all source directories.
- for (File dir : srcFiles) {
- if (mFileOp.isDirectory(dir)) {
- File d = new File(destFolder, dir.getName());
- destDirs.remove(d);
- if (!restoreFolder(dir, d)) {
- result = false;
- }
- }
- }
-
- // Remove any remaining directories not processed above.
- for (File dir : destDirs) {
- mFileOp.deleteFileOrFolder(dir);
- }
-
- // Copy any source files over to the destination.
- for (File file : srcFiles) {
- if (mFileOp.isFile(file)) {
- File f = new File(destFolder, file.getName());
- destFiles.remove(f);
- try {
- mFileOp.copyFile(file, f);
- } catch (IOException e) {
- result = false;
- }
- }
- }
-
- // Remove any remaining files not processed above.
- for (File file : destFiles) {
- mFileOp.deleteFileOrFolder(file);
- }
-
- return result;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/archives/ArchiveReplacement.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/archives/ArchiveReplacement.java
deleted file mode 100755
index b6570db..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/archives/ArchiveReplacement.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.archives;
-
-import com.android.sdklib.internal.repository.IDescription;
-import com.android.sdklib.internal.repository.packages.Package;
-
-
-/**
- * Represents an archive that we want to install and the archive that it is
- * going to replace, if any.
- */
-public class ArchiveReplacement implements IDescription {
-
- private final Archive mNewArchive;
- private final Archive mReplaced;
-
- /**
- * Creates a new replacement where the {@code newArchive} will replace the
- * currently installed {@code replaced} archive.
- * When {@code newArchive} is not intended to replace anything (e.g. because
- * the user is installing a new package not present on her system yet), then
- * {@code replace} shall be null.
- *
- * @param newArchive A "new archive" to be installed. This is always an archive
- * that comes from a remote site. This <em>may</em> be null.
- * @param replaced An optional local archive that the new one will replace.
- * Can be null if this archive does not replace anything.
- */
- public ArchiveReplacement(Archive newArchive, Archive replaced) {
- mNewArchive = newArchive;
- mReplaced = replaced;
- }
-
- /**
- * Returns the "new archive" to be installed.
- * This <em>may</em> be null for missing archives.
- */
- public Archive getNewArchive() {
- return mNewArchive;
- }
-
- /**
- * Returns an optional local archive that the new one will replace.
- * Can be null if this archive does not replace anything.
- */
- public Archive getReplaced() {
- return mReplaced;
- }
-
- /**
- * Returns the long description of the parent package of the new archive, if not null.
- * Otherwise returns an empty string.
- */
- @Override
- public String getLongDescription() {
- if (mNewArchive != null) {
- Package p = mNewArchive.getParentPackage();
- if (p != null) {
- return p.getLongDescription();
- }
- }
- return "";
- }
-
- /**
- * Returns the short description of the parent package of the new archive, if not null.
- * Otherwise returns an empty string.
- */
- @Override
- public String getShortDescription() {
- if (mNewArchive != null) {
- Package p = mNewArchive.getParentPackage();
- if (p != null) {
- return p.getShortDescription();
- }
- }
- return "";
- }
-
- /**
- * Returns the short description of the parent package of the new archive, if not null.
- * Otherwise returns the default Object toString result.
- * <p/>
- * This is mostly helpful for debugging. For UI display, use the {@link IDescription}
- * interface.
- */
- @Override
- public String toString() {
- if (mNewArchive != null) {
- Package p = mNewArchive.getParentPackage();
- if (p != null) {
- return p.getShortDescription();
- }
- }
- return super.toString();
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/AddonPackage.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/AddonPackage.java
deleted file mode 100755
index a388f54..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/AddonPackage.java
+++ /dev/null
@@ -1,699 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.VisibleForTesting;
-import com.android.annotations.VisibleForTesting.Visibility;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.IAndroidTarget.IOptionalLibrary;
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.internal.repository.IDescription;
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.repository.PkgProps;
-import com.android.sdklib.repository.SdkAddonConstants;
-import com.android.sdklib.repository.SdkRepoConstants;
-import com.android.utils.Pair;
-
-import org.w3c.dom.Node;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Properties;
-
-/**
- * Represents an add-on XML node in an SDK repository.
- */
-public class AddonPackage extends MajorRevisionPackage
- implements IAndroidVersionProvider, IPlatformDependency,
- IExactApiLevelDependency, ILayoutlibVersion {
-
- private final String mVendorId;
- private final String mVendorDisplay;
- private final String mNameId;
- private final String mDisplayName;
- private final AndroidVersion mVersion;
-
- /**
- * The helper handling the layoutlib version.
- */
- private final LayoutlibVersionMixin mLayoutlibVersion;
-
- /** An add-on library. */
- public static class Lib {
- private final String mName;
- private final String mDescription;
-
- public Lib(String name, String description) {
- mName = name;
- mDescription = description;
- }
-
- public String getName() {
- return mName;
- }
-
- public String getDescription() {
- return mDescription;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((mDescription == null) ? 0 : mDescription.hashCode());
- result = prime * result + ((mName == null) ? 0 : mName.hashCode());
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null) {
- return false;
- }
- if (!(obj instanceof Lib)) {
- return false;
- }
- Lib other = (Lib) obj;
- if (mDescription == null) {
- if (other.mDescription != null) {
- return false;
- }
- } else if (!mDescription.equals(other.mDescription)) {
- return false;
- }
- if (mName == null) {
- if (other.mName != null) {
- return false;
- }
- } else if (!mName.equals(other.mName)) {
- return false;
- }
- return true;
- }
- }
-
- private final Lib[] mLibs;
-
- /**
- * Creates a new add-on package from the attributes and elements of the given XML node.
- * This constructor should throw an exception if the package cannot be created.
- *
- * @param source The {@link SdkSource} where this is loaded from.
- * @param packageNode The XML element being parsed.
- * @param nsUri The namespace URI of the originating XML document, to be able to deal with
- * parameters that vary according to the originating XML schema.
- * @param licenses The licenses loaded from the XML originating document.
- */
- public AddonPackage(
- SdkSource source,
- Node packageNode,
- String nsUri,
- Map<String,String> licenses) {
- super(source, packageNode, nsUri, licenses);
-
- // --- name id/display ---
- // addon-4.xsd introduces the name-id, name-display, vendor-id and vendor-display.
- // These are not optional but we still need to support a fallback for older addons
- // that only provide name and vendor. If the addon provides neither set of fields,
- // it will simply not work as expected.
-
- String nameId = PackageParserUtils.getXmlString(packageNode,
- SdkRepoConstants.NODE_NAME_ID);
- String nameDisp = PackageParserUtils.getXmlString(packageNode,
- SdkRepoConstants.NODE_NAME_DISPLAY);
- String name = PackageParserUtils.getXmlString(packageNode,
- SdkRepoConstants.NODE_NAME);
-
- // The old <name> is equivalent to the new <name-display>
- if (nameDisp.length() == 0) {
- nameDisp = name;
- }
-
- // For a missing id, we simply use a sanitized version of the display name
- if (nameId.length() == 0) {
- nameId = sanitizeDisplayToNameId(name.length() > 0 ? name : nameDisp);
- }
-
- assert nameId.length() > 0;
- assert nameDisp.length() > 0;
-
- mNameId = nameId.trim();
- mDisplayName = nameDisp.trim();
-
- // --- vendor id/display ---
- // Same processing for vendor id vs display
-
- String vendorId = PackageParserUtils.getXmlString(packageNode,
- SdkAddonConstants.NODE_VENDOR_ID);
- String vendorDisp = PackageParserUtils.getXmlString(packageNode,
- SdkAddonConstants.NODE_VENDOR_DISPLAY);
- String vendor = PackageParserUtils.getXmlString(packageNode,
- SdkAddonConstants.NODE_VENDOR);
-
- // The old <vendor> is equivalent to the new <vendor-display>
- if (vendorDisp.length() == 0) {
- vendorDisp = vendor;
- }
-
- // For a missing id, we simply use a sanitized version of the display vendor
- if (vendorId.length() == 0) {
- boolean hasVendor = vendor.length() > 0;
- vendorId = sanitizeDisplayToNameId(hasVendor ? vendor : vendorDisp);
- }
-
- assert vendorId.length() > 0;
- assert vendorDisp.length() > 0;
-
- mVendorId = vendorId.trim();
- mVendorDisplay = vendorDisp.trim();
-
- // --- other attributes
-
- int apiLevel =
- PackageParserUtils.getXmlInt(packageNode, SdkAddonConstants.NODE_API_LEVEL, 0);
- mVersion = new AndroidVersion(apiLevel, null /*codeName*/);
-
- mLibs = parseLibs(
- PackageParserUtils.findChildElement(packageNode, SdkAddonConstants.NODE_LIBS));
-
- mLayoutlibVersion = new LayoutlibVersionMixin(packageNode);
- }
-
- /**
- * Creates a new platform package based on an actual {@link IAndroidTarget} (which
- * {@link IAndroidTarget#isPlatform()} false) from the {@link SdkManager}.
- * This is used to list local SDK folders in which case there is one archive which
- * URL is the actual target location.
- * <p/>
- * By design, this creates a package with one and only one archive.
- */
- public static Package create(IAndroidTarget target, Properties props) {
- return new AddonPackage(target, props);
- }
-
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected AddonPackage(IAndroidTarget target, Properties props) {
- this(null /*source*/, target, props);
- }
-
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected AddonPackage(SdkSource source, IAndroidTarget target, Properties props) {
- super( source, //source
- props, //properties
- target.getRevision(), //revision
- null, //license
- target.getDescription(), //description
- null, //descUrl
- Os.getCurrentOs(), //archiveOs
- Arch.getCurrentArch(), //archiveArch
- target.getLocation() //archiveOsPath
- );
-
- // --- name id/display ---
- // addon-4.xsd introduces the name-id, name-display, vendor-id and vendor-display.
- // These are not optional but we still need to support a fallback for older addons
- // that only provide name and vendor. If the addon provides neither set of fields,
- // it will simply not work as expected.
-
- String nameId = getProperty(props, PkgProps.ADDON_NAME_ID, ""); //$NON-NLS-1$
- String nameDisp = getProperty(props, PkgProps.ADDON_NAME_DISPLAY, ""); //$NON-NLS-1$
- String name = getProperty(props, PkgProps.ADDON_NAME, target.getName());
-
- // The old <name> is equivalent to the new <name-display>
- if (nameDisp.length() == 0) {
- nameDisp = name;
- }
-
- // For a missing id, we simply use a sanitized version of the display name
- if (nameId.length() == 0) {
- nameId = sanitizeDisplayToNameId(name.length() > 0 ? name : nameDisp);
- }
-
- assert nameId.length() > 0;
- assert nameDisp.length() > 0;
-
- mNameId = nameId.trim();
- mDisplayName = nameDisp.trim();
-
- // --- vendor id/display ---
- // Same processing for vendor id vs display
-
- String vendorId = getProperty(props, PkgProps.ADDON_VENDOR_ID, ""); //$NON-NLS-1$
- String vendorDisp = getProperty(props, PkgProps.ADDON_VENDOR_DISPLAY, ""); //$NON-NLS-1$
- String vendor = getProperty(props, PkgProps.ADDON_VENDOR, target.getVendor());
-
- // The old <vendor> is equivalent to the new <vendor-display>
- if (vendorDisp.length() == 0) {
- vendorDisp = vendor;
- }
-
- // For a missing id, we simply use a sanitized version of the display vendor
- if (vendorId.length() == 0) {
- boolean hasVendor = vendor.length() > 0;
- vendorId = sanitizeDisplayToNameId(hasVendor ? vendor : vendorDisp);
- }
-
- assert vendorId.length() > 0;
- assert vendorDisp.length() > 0;
-
- mVendorId = vendorId.trim();
- mVendorDisplay = vendorDisp.trim();
-
- // --- other attributes
-
- mVersion = target.getVersion();
- mLayoutlibVersion = new LayoutlibVersionMixin(props);
-
- IOptionalLibrary[] optLibs = target.getOptionalLibraries();
- if (optLibs == null || optLibs.length == 0) {
- mLibs = new Lib[0];
- } else {
- mLibs = new Lib[optLibs.length];
- for (int i = 0; i < optLibs.length; i++) {
- mLibs[i] = new Lib(optLibs[i].getName(), optLibs[i].getDescription());
- }
- }
- }
-
- /**
- * Creates a broken addon which we know failed to load properly.
- *
- * @param archiveOsPath The absolute OS path of the addon folder.
- * @param sourceProps The properties parsed from the addon's source.properties. Can be null.
- * @param addonProps The properties parsed from the addon manifest (NOT the source.properties).
- * @param error The error indicating why this addon failed to be loaded.
- */
- public static Package createBroken(
- String archiveOsPath,
- Properties sourceProps,
- Map<String, String> addonProps,
- String error) {
- String name = getProperty(sourceProps,
- PkgProps.ADDON_NAME_DISPLAY,
- getProperty(sourceProps,
- PkgProps.ADDON_NAME,
- addonProps.get(SdkManager.ADDON_NAME)));
- String vendor = getProperty(sourceProps,
- PkgProps.ADDON_VENDOR_DISPLAY,
- getProperty(sourceProps,
- PkgProps.ADDON_VENDOR,
- addonProps.get(SdkManager.ADDON_VENDOR)));
- String api = addonProps.get(SdkManager.ADDON_API);
- String revision = addonProps.get(SdkManager.ADDON_REVISION);
-
- String shortDesc = String.format("%1$s by %2$s, Android API %3$s, revision %4$s [*]",
- name,
- vendor,
- api,
- revision);
-
- String longDesc = String.format(
- "%1$s\n" +
- "[*] Addon failed to load: %2$s",
- shortDesc,
- error);
-
- int apiLevel = IExactApiLevelDependency.API_LEVEL_INVALID;
-
- try {
- apiLevel = Integer.parseInt(api);
- } catch(NumberFormatException e) {
- // ignore
- }
-
- return new BrokenPackage(null/*props*/, shortDesc, longDesc,
- IMinApiLevelDependency.MIN_API_LEVEL_NOT_SPECIFIED,
- apiLevel,
- archiveOsPath);
- }
-
- @Override
- public int getExactApiLevel() {
- return mVersion.getApiLevel();
- }
-
- /**
- * Save the properties of the current packages in the given {@link Properties} object.
- * These properties will later be given to a constructor that takes a {@link Properties} object.
- */
- @Override
- public void saveProperties(Properties props) {
- super.saveProperties(props);
-
- mVersion.saveProperties(props);
- mLayoutlibVersion.saveProperties(props);
-
- props.setProperty(PkgProps.ADDON_NAME_ID, mNameId);
- props.setProperty(PkgProps.ADDON_NAME_DISPLAY, mDisplayName);
- props.setProperty(PkgProps.ADDON_VENDOR_ID, mVendorId);
- props.setProperty(PkgProps.ADDON_VENDOR_DISPLAY, mVendorDisplay);
- }
-
- /**
- * Parses a <libs> element.
- */
- private Lib[] parseLibs(Node libsNode) {
- ArrayList<Lib> libs = new ArrayList<Lib>();
-
- if (libsNode != null) {
- String nsUri = libsNode.getNamespaceURI();
- for(Node child = libsNode.getFirstChild();
- child != null;
- child = child.getNextSibling()) {
-
- if (child.getNodeType() == Node.ELEMENT_NODE &&
- nsUri.equals(child.getNamespaceURI()) &&
- SdkRepoConstants.NODE_LIB.equals(child.getLocalName())) {
- libs.add(parseLib(child));
- }
- }
- }
-
- return libs.toArray(new Lib[libs.size()]);
- }
-
- /**
- * Parses a <lib> element from a <libs> container.
- */
- private Lib parseLib(Node libNode) {
- return new Lib(PackageParserUtils.getXmlString(libNode, SdkRepoConstants.NODE_NAME),
- PackageParserUtils.getXmlString(libNode, SdkRepoConstants.NODE_DESCRIPTION));
- }
-
- /** Returns the vendor id, a string, for add-on packages. */
- public @NonNull String getVendorId() {
- return mVendorId;
- }
-
- /** Returns the vendor, a string for display purposes. */
- public @NonNull String getDisplayVendor() {
- return mVendorDisplay;
- }
-
- /** Returns the name id, a string, for add-on packages or for libraries. */
- public @NonNull String getNameId() {
- return mNameId;
- }
-
- /** Returns the name, a string for display purposes. */
- public @NonNull String getDisplayName() {
- return mDisplayName;
- }
-
- /**
- * Returns the version of the platform dependency of this package.
- * <p/>
- * An add-on has the same {@link AndroidVersion} as the platform it depends on.
- */
- @Override @NonNull
- public AndroidVersion getAndroidVersion() {
- return mVersion;
- }
-
- /** Returns the libs defined in this add-on. Can be an empty array but not null. */
- public @NonNull Lib[] getLibs() {
- return mLibs;
- }
-
- /**
- * Returns the layoutlib version.
- * <p/>
- * The first integer is the API of layoublib, which should be > 0.
- * It will be equal to {@link ILayoutlibVersion#LAYOUTLIB_API_NOT_SPECIFIED} (0)
- * if the layoutlib version isn't specified.
- * <p/>
- * The second integer is the revision for that given API. It is >= 0
- * and works as a minor revision number, incremented for the same API level.
- *
- * @since sdk-addon-2.xsd
- */
- @Override
- public @NonNull Pair<Integer, Integer> getLayoutlibVersion() {
- return mLayoutlibVersion.getLayoutlibVersion();
- }
-
- /**
- * Returns a string identifier to install this package from the command line.
- * For add-ons, we use "addon-vendor-name-N" where N is the base platform API.
- * <p/>
- * {@inheritDoc}
- */
- @Override
- public @NonNull String installId() {
- return encodeAddonName();
- }
-
- /**
- * Returns a description of this package that is suitable for a list display.
- * <p/>
- * {@inheritDoc}
- */
- @Override
- public String getListDescription() {
- return String.format("%1$s%2$s",
- getDisplayName(),
- isObsolete() ? " (Obsolete)" : "");
- }
-
- /**
- * Returns a short description for an {@link IDescription}.
- */
- @Override
- public String getShortDescription() {
- return String.format("%1$s, Android API %2$s, revision %3$s%4$s",
- getDisplayName(),
- mVersion.getApiString(),
- getRevision().toShortString(),
- isObsolete() ? " (Obsolete)" : "");
- }
-
- /**
- * Returns a long description for an {@link IDescription}.
- *
- * The long description is whatever the XML contains for the <description> field,
- * or the short description if the former is empty.
- */
- @Override
- public String getLongDescription() {
- String s = String.format("%1$s, Android API %2$s, revision %3$s%4$s\nBy %5$s",
- getDisplayName(),
- mVersion.getApiString(),
- getRevision().toShortString(),
- isObsolete() ? " (Obsolete)" : "", //$NON-NLS-2$
- getDisplayVendor());
-
- String d = getDescription();
- if (d != null && d.length() > 0) {
- s += '\n' + d;
- }
-
- s += String.format("\nRequires SDK Platform Android API %1$s",
- mVersion.getApiString());
- return s;
- }
-
- /**
- * Computes a potential installation folder if an archive of this package were
- * to be installed right away in the given SDK root.
- * <p/>
- * An add-on package is typically installed in SDK/add-ons/"addon-name"-"api-level".
- * The name needs to be sanitized to be acceptable as a directory name.
- * However if we can find a different directory under SDK/add-ons that already
- * has this add-ons installed, we'll use that one.
- *
- * @param osSdkRoot The OS path of the SDK root folder.
- * @param sdkManager An existing SDK manager to list current platforms and addons.
- * @return A new {@link File} corresponding to the directory to use to install this package.
- */
- @Override
- public File getInstallFolder(String osSdkRoot, SdkManager sdkManager) {
- File addons = new File(osSdkRoot, SdkConstants.FD_ADDONS);
-
- // First find if this add-on is already installed. If so, reuse the same directory.
- for (IAndroidTarget target : sdkManager.getTargets()) {
- if (!target.isPlatform() && target.getVersion().equals(mVersion)) {
- // Starting with addon-4.xsd, the addon source.properties differentiate
- // between ids and display strings. However the addon target which relies
- // on the manifest.ini does not so we need to cover both cases.
- // TODO fix when we get rid of manifest.ini for addons
- if ((target.getName().equals(getNameId()) &&
- target.getVendor().equals(getVendorId())) ||
- (target.getName().equals(getDisplayName()) &&
- target.getVendor().equals(getDisplayVendor()))) {
- return new File(target.getLocation());
- }
- }
- }
-
- // Compute a folder directory using the addon declared name and vendor strings.
- String name = encodeAddonName();
-
- for (int i = 0; i < 100; i++) {
- String name2 = i == 0 ? name : String.format("%s-%d", name, i); //$NON-NLS-1$
- File folder = new File(addons, name2);
- if (!folder.exists()) {
- return folder;
- }
- }
-
- // We shouldn't really get here. I mean, seriously, we tried hard enough.
- return null;
- }
-
- private String encodeAddonName() {
- String name = String.format("addon-%s-%s-%s", //$NON-NLS-1$
- getNameId(), getVendorId(), mVersion.getApiString());
- name = name.toLowerCase(Locale.US);
- name = name.replaceAll("[^a-z0-9_-]+", "_"); //$NON-NLS-1$ //$NON-NLS-2$
- name = name.replaceAll("_+", "_"); //$NON-NLS-1$ //$NON-NLS-2$
- return name;
- }
-
- /**
- * Computes a sanitized name-id based on an addon name-display.
- * This is used to provide compatibility with older addons that lacks the new fields.
- *
- * @param displayName A name-display field or a old-style name field.
- * @return A non-null sanitized name-id that fits in the {@code [a-zA-Z0-9_-]+} pattern.
- */
- private String sanitizeDisplayToNameId(String displayName) {
- String name = displayName.toLowerCase(Locale.US);
- name = name.replaceAll("[^a-z0-9_-]+", "_"); //$NON-NLS-1$ //$NON-NLS-2$
- name = name.replaceAll("_+", "_"); //$NON-NLS-1$ //$NON-NLS-2$
-
- // Trim leading and trailing underscores
- if (name.length() > 1) {
- name = name.replaceAll("^_+", ""); //$NON-NLS-1$ //$NON-NLS-2$
- }
- if (name.length() > 1) {
- name = name.replaceAll("_+$", ""); //$NON-NLS-1$ //$NON-NLS-2$
- }
- return name;
- }
-
- @Override
- public boolean sameItemAs(Package pkg) {
- if (pkg instanceof AddonPackage) {
- AddonPackage newPkg = (AddonPackage)pkg;
-
- // check they are the same add-on.
- if (getNameId().equals(newPkg.getNameId()) &&
- getAndroidVersion().equals(newPkg.getAndroidVersion())) {
- // Check the vendor-id field.
- if (getVendorId().equals(newPkg.getVendorId())) {
- return true;
- }
-
- // When loading addons from the v3 schema that only had a <vendor>
- // field, the vendor field has been converted to vendor-display so
- // as a transition mechanism we should test this also.
- // TODO: in a couple iterations of the SDK Manager, remove this check
- // and only compare using the vendor-id field.
- return getDisplayVendor().equals(newPkg.getDisplayVendor());
- }
- }
-
- return false;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = super.hashCode();
- result = prime * result + ((mLayoutlibVersion == null) ? 0 : mLayoutlibVersion.hashCode());
- result = prime * result + Arrays.hashCode(mLibs);
- result = prime * result + ((mDisplayName == null) ? 0 : mDisplayName.hashCode());
- result = prime * result + ((mVendorDisplay == null) ? 0 : mVendorDisplay.hashCode());
- result = prime * result + ((mVersion == null) ? 0 : mVersion.hashCode());
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (!super.equals(obj)) {
- return false;
- }
- if (!(obj instanceof AddonPackage)) {
- return false;
- }
- AddonPackage other = (AddonPackage) obj;
- if (mLayoutlibVersion == null) {
- if (other.mLayoutlibVersion != null) {
- return false;
- }
- } else if (!mLayoutlibVersion.equals(other.mLayoutlibVersion)) {
- return false;
- }
- if (!Arrays.equals(mLibs, other.mLibs)) {
- return false;
- }
- if (mNameId == null) {
- if (other.mNameId != null) {
- return false;
- }
- } else if (!mNameId.equals(other.mNameId)) {
- return false;
- }
- if (mVendorId == null) {
- if (other.mVendorId != null) {
- return false;
- }
- } else if (!mVendorId.equals(other.mVendorId)) {
- return false;
- }
- if (mVersion == null) {
- if (other.mVersion != null) {
- return false;
- }
- } else if (!mVersion.equals(other.mVersion)) {
- return false;
- }
- return true;
- }
-
- /**
- * For addon packages, we want to add vendor|name to the sorting key
- * <em>before<em/> the revision number.
- * <p/>
- * {@inheritDoc}
- */
- @Override
- protected String comparisonKey() {
- String s = super.comparisonKey();
- int pos = s.indexOf("|r:"); //$NON-NLS-1$
- assert pos > 0;
- s = s.substring(0, pos) +
- "|vid:" + getVendorId() + //$NON-NLS-1$
- "|nid:" + getNameId() + //$NON-NLS-1$
- s.substring(pos);
- return s;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/BrokenPackage.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/BrokenPackage.java
deleted file mode 100755
index e2c11a0..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/BrokenPackage.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.internal.repository.IDescription;
-import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-
-import java.io.File;
-import java.util.Properties;
-
-/**
- * Represents an SDK repository package that is incomplete.
- * It has a distinct icon and a specific error that is supposed to help the user on how to fix it.
- */
-public class BrokenPackage extends MajorRevisionPackage
- implements IExactApiLevelDependency, IMinApiLevelDependency {
-
- /**
- * The minimal API level required by this package, if > 0,
- * or {@link #MIN_API_LEVEL_NOT_SPECIFIED} if there is no such requirement.
- */
- private final int mMinApiLevel;
-
- /**
- * The exact API level required by this package, if > 0,
- * or {@link #API_LEVEL_INVALID} if there is no such requirement.
- */
- private final int mExactApiLevel;
-
- private final String mShortDescription;
- private final String mLongDescription;
-
- /**
- * Creates a new "broken" package that represents a package that we failed to load,
- * for whatever error indicated in {@code longDescription}.
- * There is also an <em>optional</em> API level dependency that can be specified.
- * <p/>
- * By design, this creates a package with one and only one archive.
- */
- BrokenPackage(Properties props,
- String shortDescription,
- String longDescription,
- int minApiLevel,
- int exactApiLevel,
- String archiveOsPath) {
- super( null, //source
- props, //properties
- 0, //revision will be taken from props
- null, //license
- longDescription, //description
- null, //descUrl
- Os.ANY, //archiveOs
- Arch.ANY, //archiveArch
- archiveOsPath //archiveOsPath
- );
- mShortDescription = shortDescription;
- mLongDescription = longDescription;
- mMinApiLevel = minApiLevel;
- mExactApiLevel = exactApiLevel;
- }
-
- /**
- * Save the properties of the current packages in the given {@link Properties} object.
- * These properties will later be given to a constructor that takes a {@link Properties} object.
- * <p/>
- * Base implementation override: We don't actually save properties for a broken package.
- */
- @Override
- public void saveProperties(Properties props) {
- // Nop. We don't actually save properties for a broken package.
- }
-
- /**
- * Returns the minimal API level required by this package, if > 0,
- * or {@link #MIN_API_LEVEL_NOT_SPECIFIED} if there is no such requirement.
- */
- @Override
- public int getMinApiLevel() {
- return mMinApiLevel;
- }
-
- /**
- * Returns the exact API level required by this package, if > 0,
- * or {@link #API_LEVEL_INVALID} if the value was missing.
- */
- @Override
- public int getExactApiLevel() {
- return mExactApiLevel;
- }
-
- /**
- * Returns a string identifier to install this package from the command line.
- * For broken packages, we return an empty string. These are not installable.
- * <p/>
- * {@inheritDoc}
- */
- @Override
- public String installId() {
- return ""; //$NON-NLS-1$
- }
-
- /**
- * Returns a description of this package that is suitable for a list display.
- * <p/>
- * {@inheritDoc}
- */
- @Override
- public String getListDescription() {
- return mShortDescription;
- }
-
- /**
- * Returns a short description for an {@link IDescription}.
- */
- @Override
- public String getShortDescription() {
- return mShortDescription;
- }
-
- /**
- * Returns a long description for an {@link IDescription}.
- *
- * The long description uses what was given to the constructor.
- * If it's missing, it will use whatever the XML contains for the <description> field,
- * or the short description if the former is empty.
- */
- @Override
- public String getLongDescription() {
-
- String s = mLongDescription;
- if (s != null && s.length() != 0) {
- return s;
- }
-
- s = getDescription();
- if (s != null && s.length() != 0) {
- return s;
- }
- return getShortDescription();
- }
-
- /**
- * We should not be attempting to install a broken package.
- *
- * {@inheritDoc}
- */
- @Override
- public File getInstallFolder(String osSdkRoot, SdkManager sdkManager) {
- // We should not be attempting to install a broken package.
- return null;
- }
-
- @Override
- public boolean sameItemAs(Package pkg) {
- if (pkg instanceof BrokenPackage) {
- return mShortDescription.equals(((BrokenPackage) pkg).mShortDescription) &&
- getDescription().equals(pkg.getDescription()) &&
- getMinApiLevel() == ((BrokenPackage) pkg).getMinApiLevel();
- }
-
- return false;
- }
-
- @Override
- public boolean preInstallHook(Archive archive,
- ITaskMonitor monitor,
- String osSdkRoot,
- File installFolder) {
- // Nothing specific to do.
- return super.preInstallHook(archive, monitor, osSdkRoot, installFolder);
- }
-
- /**
- * Computes a hash of the installed content (in case of successful install.)
- *
- * {@inheritDoc}
- */
- @Override
- public void postInstallHook(Archive archive, ITaskMonitor monitor, File installFolder) {
- // Nothing specific to do.
- super.postInstallHook(archive, monitor, installFolder);
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/DocPackage.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/DocPackage.java
deleted file mode 100755
index 927d361..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/DocPackage.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.internal.repository.IDescription;
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.repository.SdkRepoConstants;
-
-import org.w3c.dom.Node;
-
-import java.io.File;
-import java.util.Map;
-import java.util.Properties;
-
-/**
- * Represents a doc XML node in an SDK repository.
- * <p/>
- * Note that a doc package has a version and thus implements {@link IAndroidVersionProvider}.
- * However there is no mandatory dependency that limits installation so this does not
- * implement {@link IPlatformDependency}.
- */
-public class DocPackage extends MajorRevisionPackage implements IAndroidVersionProvider {
-
- private final AndroidVersion mVersion;
-
- /**
- * Creates a new doc package from the attributes and elements of the given XML node.
- * This constructor should throw an exception if the package cannot be created.
- *
- * @param source The {@link SdkSource} where this is loaded from.
- * @param packageNode The XML element being parsed.
- * @param nsUri The namespace URI of the originating XML document, to be able to deal with
- * parameters that vary according to the originating XML schema.
- * @param licenses The licenses loaded from the XML originating document.
- */
- public DocPackage(SdkSource source,
- Node packageNode,
- String nsUri,
- Map<String,String> licenses) {
- super(source, packageNode, nsUri, licenses);
-
- int apiLevel =
- PackageParserUtils.getXmlInt (packageNode, SdkRepoConstants.NODE_API_LEVEL, 0);
- String codeName =
- PackageParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_CODENAME);
- if (codeName.length() == 0) {
- codeName = null;
- }
- mVersion = new AndroidVersion(apiLevel, codeName);
- }
-
- /**
- * Manually create a new package with one archive and the given attributes.
- * This is used to create packages from local directories in which case there must be
- * one archive which URL is the actual target location.
- * <p/>
- * By design, this creates a package with one and only one archive.
- */
- public static Package create(SdkSource source,
- Properties props,
- int apiLevel,
- String codename,
- int revision,
- String license,
- String description,
- String descUrl,
- Os archiveOs,
- Arch archiveArch,
- String archiveOsPath) {
- return new DocPackage(source, props, apiLevel, codename, revision, license, description,
- descUrl, archiveOs, archiveArch, archiveOsPath);
- }
-
- private DocPackage(SdkSource source,
- Properties props,
- int apiLevel,
- String codename,
- int revision,
- String license,
- String description,
- String descUrl,
- Os archiveOs,
- Arch archiveArch,
- String archiveOsPath) {
- super(source,
- props,
- revision,
- license,
- description,
- descUrl,
- archiveOs,
- archiveArch,
- archiveOsPath);
- mVersion = new AndroidVersion(props, apiLevel, codename);
- }
-
- /**
- * Save the properties of the current packages in the given {@link Properties} object.
- * These properties will later be give the constructor that takes a {@link Properties} object.
- */
- @Override
- public void saveProperties(Properties props) {
- super.saveProperties(props);
-
- mVersion.saveProperties(props);
- }
-
- /**
- * Returns the version, for platform, add-on and doc packages.
- * Can be 0 if this is a local package of unknown api-level.
- */
- @Override @NonNull
- public AndroidVersion getAndroidVersion() {
- return mVersion;
- }
-
- /**
- * Returns a string identifier to install this package from the command line.
- * For docs, we use "doc-N" where N is the API or the preview codename.
- * <p/>
- * {@inheritDoc}
- */
- @Override
- public String installId() {
- return "doc-" + mVersion.getApiString(); //$NON-NLS-1$
- }
-
- /**
- * Returns a description of this package that is suitable for a list display.
- * <p/>
- * {@inheritDoc}
- */
- @Override
- public String getListDescription() {
- if (mVersion.isPreview()) {
- return String.format("Documentation for Android '%1$s' Preview SDK%2$s",
- mVersion.getCodename(),
- isObsolete() ? " (Obsolete)" : "");
- } else {
- return String.format("Documentation for Android SDK%2$s",
- mVersion.getApiLevel(),
- isObsolete() ? " (Obsolete)" : "");
- }
- }
-
- /**
- * Returns a short description for an {@link IDescription}.
- */
- @Override
- public String getShortDescription() {
- if (mVersion.isPreview()) {
- return String.format("Documentation for Android '%1$s' Preview SDK, revision %2$s%3$s",
- mVersion.getCodename(),
- getRevision().toShortString(),
- isObsolete() ? " (Obsolete)" : "");
- } else {
- return String.format("Documentation for Android SDK, API %1$d, revision %2$s%3$s",
- mVersion.getApiLevel(),
- getRevision().toShortString(),
- isObsolete() ? " (Obsolete)" : "");
- }
- }
-
- /**
- * Returns a long description for an {@link IDescription}.
- *
- * The long description is whatever the XML contains for the <description> field,
- * or the short description if the former is empty.
- */
- @Override
- public String getLongDescription() {
- String s = getDescription();
- if (s == null || s.length() == 0) {
- s = getShortDescription();
- }
-
- if (s.indexOf("revision") == -1) {
- s += String.format("\nRevision %1$s%2$s",
- getRevision().toShortString(),
- isObsolete() ? " (Obsolete)" : "");
- }
-
- return s;
- }
-
- /**
- * Computes a potential installation folder if an archive of this package were
- * to be installed right away in the given SDK root.
- * <p/>
- * A "doc" package should always be located in SDK/docs.
- *
- * @param osSdkRoot The OS path of the SDK root folder.
- * @param sdkManager An existing SDK manager to list current platforms and addons.
- * @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, SdkConstants.FD_DOCS);
- }
-
- /**
- * Consider doc packages to be the same if they cover the same API level,
- * regardless of their revision number.
- */
- @Override
- public boolean sameItemAs(Package pkg) {
- if (pkg instanceof DocPackage) {
- AndroidVersion rev2 = ((DocPackage) pkg).getAndroidVersion();
- return this.getAndroidVersion().equals(rev2);
- }
-
- return false;
- }
-
- /**
- * {@inheritDoc}
- * <hr>
- * Doc packages are a bit different since there can only be one doc installed at
- * the same time.
- * <p/>
- * We now consider that docs for different APIs are NOT updates, e.g. doc for API N+1
- * is no longer considered an update for doc API N.
- * However docs that have the same API version (API level + codename) are considered
- * updates if they have a higher revision number (so 15 rev 2 is an update for 15 rev 1,
- * but is not an update for 14 rev 1.)
- */
- @Override
- public UpdateInfo canBeUpdatedBy(Package replacementPackage) {
- // check they are the same kind of object
- if (!(replacementPackage instanceof DocPackage)) {
- return UpdateInfo.INCOMPATIBLE;
- }
-
- DocPackage replacementDoc = (DocPackage)replacementPackage;
-
- AndroidVersion replacementVersion = replacementDoc.getAndroidVersion();
-
- // Check if they're the same exact (api and codename)
- if (replacementVersion.equals(mVersion)) {
- // exact same version, so check the revision level
- if (replacementPackage.getRevision().compareTo(this.getRevision()) > 0) {
- return UpdateInfo.UPDATE;
- }
- } else {
- // not the same version? we check if they have the same api level and the new one
- // is a preview, in which case it's also an update (since preview have the api level
- // of the _previous_ version.)
- if (replacementVersion.getApiLevel() == mVersion.getApiLevel() &&
- replacementVersion.isPreview()) {
- return UpdateInfo.UPDATE;
- }
- }
-
- // not an upgrade but not incompatible either.
- return UpdateInfo.NOT_UPDATE;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = super.hashCode();
- result = prime * result + ((mVersion == null) ? 0 : mVersion.hashCode());
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (!super.equals(obj)) {
- return false;
- }
- if (!(obj instanceof DocPackage)) {
- return false;
- }
- DocPackage other = (DocPackage) obj;
- if (mVersion == null) {
- if (other.mVersion != null) {
- return false;
- }
- } else if (!mVersion.equals(other.mVersion)) {
- return false;
- }
- return true;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/ExtraPackage.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/ExtraPackage.java
deleted file mode 100755
index 78a2450..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/ExtraPackage.java
+++ /dev/null
@@ -1,751 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.SdkConstants;
-import com.android.annotations.Nullable;
-import com.android.annotations.VisibleForTesting;
-import com.android.annotations.VisibleForTesting.Visibility;
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.internal.repository.IDescription;
-import com.android.sdklib.internal.repository.LocalSdkParser;
-import com.android.sdklib.internal.repository.NullTaskMonitor;
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.repository.PkgProps;
-import com.android.sdklib.repository.RepoConstants;
-import com.android.utils.NullLogger;
-
-import org.w3c.dom.Node;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Map;
-import java.util.Properties;
-import java.util.regex.Pattern;
-
-/**
- * Represents a extra XML node in an SDK repository.
- */
-public class ExtraPackage extends MinToolsPackage
- implements IMinApiLevelDependency {
-
- /**
- * The extra display name. Used in the UI to represent the package. It can be anything.
- */
- private final String mDisplayName;
-
- /**
- * The vendor id name. It is a simple alphanumeric string [a-zA-Z0-9_-].
- */
- private final String mVendorId;
-
- /**
- * The vendor display name. Used in the UI to represent the vendor. It can be anything.
- */
- private final String mVendorDisplay;
-
- /**
- * The sub-folder name. It must be a non-empty single-segment path.
- */
- private final String mPath;
-
- /**
- * The optional old_paths, if any. If present, this is a list of old "path" values that
- * we'd like to migrate to the current "path" name for this extra.
- */
- private final String mOldPaths;
-
- /**
- * The minimal API level required by this extra package, if > 0,
- * or {@link #MIN_API_LEVEL_NOT_SPECIFIED} if there is no such requirement.
- */
- private final int mMinApiLevel;
-
- /**
- * The project-files listed by this extra package.
- * The array can be empty but not null.
- */
- private final String[] mProjectFiles;
-
- /**
- * Creates a new tool package from the attributes and elements of the given XML node.
- * This constructor should throw an exception if the package cannot be created.
- *
- * @param source The {@link SdkSource} where this is loaded from.
- * @param packageNode The XML element being parsed.
- * @param nsUri The namespace URI of the originating XML document, to be able to deal with
- * parameters that vary according to the originating XML schema.
- * @param licenses The licenses loaded from the XML originating document.
- */
- public ExtraPackage(
- SdkSource source,
- Node packageNode,
- String nsUri,
- Map<String,String> licenses) {
- super(source, packageNode, nsUri, licenses);
-
- mPath = PackageParserUtils.getXmlString(packageNode, RepoConstants.NODE_PATH);
-
- // Read name-display, vendor-display and vendor-id, introduced in addon-4.xsd.
- // These are not optional, they are mandatory in addon-4 but we still treat them
- // as optional so that we can fallback on using <vendor> which was the only one
- // defined in addon-3.xsd.
- String name =
- PackageParserUtils.getXmlString(packageNode, RepoConstants.NODE_NAME_DISPLAY);
- String vname =
- PackageParserUtils.getXmlString(packageNode, RepoConstants.NODE_VENDOR_DISPLAY);
- String vid =
- PackageParserUtils.getXmlString(packageNode, RepoConstants.NODE_VENDOR_ID);
-
- if (vid.length() == 0) {
- // If vid is missing, use the old <vendor> attribute.
- // Note that in a valid XML, vendor-id cannot be an empty string.
- // The only reason vid can be empty is when <vendor-id> is missing, which
- // happens in an addon-3 schema, in which case the old <vendor> needs to be used.
- String vendor = PackageParserUtils.getXmlString(packageNode, RepoConstants.NODE_VENDOR);
- vid = sanitizeLegacyVendor(vendor);
- if (vname.length() == 0) {
- vname = vendor;
- }
- }
- if (vname.length() == 0) {
- // The vendor-display name can be empty, in which case we use the vendor-id.
- vname = vid;
- }
- mVendorDisplay = vname.trim();
- mVendorId = vid.trim();
-
- if (name.length() == 0) {
- // If name is missing, use the <path> attribute as done in an addon-3 schema.
- name = getPrettyName();
- }
- mDisplayName = name.trim();
-
- mMinApiLevel = PackageParserUtils.getXmlInt(
- packageNode, RepoConstants.NODE_MIN_API_LEVEL, MIN_API_LEVEL_NOT_SPECIFIED);
-
- mProjectFiles = parseProjectFiles(
- PackageParserUtils.findChildElement(packageNode, RepoConstants.NODE_PROJECT_FILES));
-
- mOldPaths = PackageParserUtils.getXmlString(packageNode, RepoConstants.NODE_OLD_PATHS);
- }
-
- private String[] parseProjectFiles(Node projectFilesNode) {
- ArrayList<String> paths = new ArrayList<String>();
-
- if (projectFilesNode != null) {
- String nsUri = projectFilesNode.getNamespaceURI();
- for(Node child = projectFilesNode.getFirstChild();
- child != null;
- child = child.getNextSibling()) {
-
- if (child.getNodeType() == Node.ELEMENT_NODE &&
- nsUri.equals(child.getNamespaceURI()) &&
- RepoConstants.NODE_PATH.equals(child.getLocalName())) {
- String path = child.getTextContent();
- if (path != null) {
- path = path.trim();
- if (path.length() > 0) {
- paths.add(path);
- }
- }
- }
- }
- }
-
- return paths.toArray(new String[paths.size()]);
- }
-
- /**
- * Manually create a new package with one archive and the given attributes or properties.
- * This is used to create packages from local directories in which case there must be
- * one archive which URL is the actual target location.
- * <p/>
- * By design, this creates a package with one and only one archive.
- */
- public static Package create(SdkSource source,
- Properties props,
- String vendor,
- String path,
- int revision,
- String license,
- String description,
- String descUrl,
- Os archiveOs,
- Arch archiveArch,
- String archiveOsPath) {
- ExtraPackage ep = new ExtraPackage(source, props, vendor, path, revision, license,
- description, descUrl, archiveOs, archiveArch, archiveOsPath);
- return ep;
- }
-
- /**
- * Constructor used to create a mock {@link ExtraPackage}.
- * Most of the attributes here are optional.
- * When not defined, they will be extracted from the {@code props} properties.
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected ExtraPackage(SdkSource source,
- Properties props,
- String vendorId,
- String path,
- int revision,
- String license,
- String description,
- String descUrl,
- Os archiveOs,
- Arch archiveArch,
- String archiveOsPath) {
- super(source,
- props,
- revision,
- license,
- description,
- descUrl,
- archiveOs,
- archiveArch,
- archiveOsPath);
-
- // The path argument comes before whatever could be in the properties
- mPath = path != null ? path : getProperty(props, PkgProps.EXTRA_PATH, path);
-
- String name = getProperty(props, PkgProps.EXTRA_NAME_DISPLAY, ""); //$NON-NLS-1$
- String vname = getProperty(props, PkgProps.EXTRA_VENDOR_DISPLAY, ""); //$NON-NLS-1$
- String vid = vendorId != null ? vendorId :
- getProperty(props, PkgProps.EXTRA_VENDOR_ID, ""); //$NON-NLS-1$
-
- if (vid.length() == 0) {
- // If vid is missing, use the old <vendor> attribute.
- // <vendor> did not exist prior to schema repo-v3 and tools r8.
- String vendor = getProperty(props, PkgProps.EXTRA_VENDOR, ""); //$NON-NLS-1$
- vid = sanitizeLegacyVendor(vendor);
- if (vname.length() == 0) {
- vname = vendor;
- }
- }
- if (vname.length() == 0) {
- // The vendor-display name can be empty, in which case we use the vendor-id.
- vname = vid;
- }
- mVendorDisplay = vname.trim();
- mVendorId = vid.trim();
-
- if (name.length() == 0) {
- // If name is missing, use the <path> attribute as done in an addon-3 schema.
- name = getPrettyName();
- }
- mDisplayName = name.trim();
-
- mOldPaths = getProperty(props, PkgProps.EXTRA_OLD_PATHS, null);
-
- mMinApiLevel = getPropertyInt(props, PkgProps.EXTRA_MIN_API_LEVEL,
- MIN_API_LEVEL_NOT_SPECIFIED);
-
- String projectFiles = getProperty(props, PkgProps.EXTRA_PROJECT_FILES, null);
- ArrayList<String> filePaths = new ArrayList<String>();
- if (projectFiles != null && projectFiles.length() > 0) {
- for (String filePath : projectFiles.split(Pattern.quote(File.pathSeparator))) {
- filePath = filePath.trim();
- if (filePath.length() > 0) {
- filePaths.add(filePath);
- }
- }
- }
- mProjectFiles = filePaths.toArray(new String[filePaths.size()]);
- }
-
- /**
- * Save the properties of the current packages in the given {@link Properties} object.
- * These properties will later be give the constructor that takes a {@link Properties} object.
- */
- @Override
- public void saveProperties(Properties props) {
- super.saveProperties(props);
-
- props.setProperty(PkgProps.EXTRA_PATH, mPath);
- props.setProperty(PkgProps.EXTRA_NAME_DISPLAY, mDisplayName);
- props.setProperty(PkgProps.EXTRA_VENDOR_DISPLAY, mVendorDisplay);
- props.setProperty(PkgProps.EXTRA_VENDOR_ID, mVendorId);
-
- if (getMinApiLevel() != MIN_API_LEVEL_NOT_SPECIFIED) {
- props.setProperty(PkgProps.EXTRA_MIN_API_LEVEL, Integer.toString(getMinApiLevel()));
- }
-
- if (mProjectFiles.length > 0) {
- StringBuilder sb = new StringBuilder();
- for (int i = 0; i < mProjectFiles.length; i++) {
- if (i > 0) {
- sb.append(File.pathSeparatorChar);
- }
- sb.append(mProjectFiles[i]);
- }
- props.setProperty(PkgProps.EXTRA_PROJECT_FILES, sb.toString());
- }
-
- if (mOldPaths != null && mOldPaths.length() > 0) {
- props.setProperty(PkgProps.EXTRA_OLD_PATHS, mOldPaths);
- }
- }
-
- /**
- * Returns the minimal API level required by this extra package, if > 0,
- * or {@link #MIN_API_LEVEL_NOT_SPECIFIED} if there is no such requirement.
- */
- @Override
- public int getMinApiLevel() {
- return mMinApiLevel;
- }
-
- /**
- * The project-files listed by this extra package.
- * The array can be empty but not null.
- * <p/>
- * IMPORTANT: directory separators are NOT translated and may not match
- * the {@link File#separatorChar} of the current platform. It's up to the
- * user to adequately interpret the paths.
- * Similarly, no guarantee is made on the validity of the paths.
- * Users are expected to apply all usual sanity checks such as removing
- * "./" and "../" and making sure these paths don't reference files outside
- * of the installed archive.
- *
- * @since sdk-repository-4.xsd or sdk-addon-2.xsd
- */
- public String[] getProjectFiles() {
- return mProjectFiles;
- }
-
- /**
- * Returns the old_paths, a list of obsolete path names for the extra package.
- * <p/>
- * These can be used by the installer to migrate an extra package using one of the
- * old paths into the new path.
- * <p/>
- * These can also be used to recognize "old" renamed packages as the same as
- * the current one.
- *
- * @return A list of old paths. Can be empty but not null.
- */
- public String[] getOldPaths() {
- if (mOldPaths == null || mOldPaths.length() == 0) {
- return new String[0];
- }
- return mOldPaths.split(";"); //$NON-NLS-1$
- }
-
- /**
- * Returns the sanitized path folder name. It is a single-segment path.
- * <p/>
- * The package is installed in SDK/extras/vendor_name/path_name.
- */
- public String getPath() {
- // 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.
-
- // 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$
- }
-
- return path;
- }
-
- /**
- * Returns the vendor id.
- */
- public String getVendorId() {
- return mVendorId;
- }
-
- public String getVendorDisplay() {
- return mVendorDisplay;
- }
-
- public String getDisplayName() {
- return mDisplayName;
- }
-
- /** Transforms the legacy vendor name into a usable vendor id. */
- private String sanitizeLegacyVendor(String vendorDisplay) {
- // 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 (vendorDisplay != null && vendorDisplay.length() > 0) {
- String vendor = vendorDisplay.trim();
- // 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 ""; //$NON-NLS-1$
-
- }
-
- /**
- * Used to produce a suitable name-display based on the current {@link #mPath}
- * and {@link #mVendorDisplay} in addon-3 schemas.
- */
- private String getPrettyName() {
- 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 (mVendorDisplay != null && mVendorDisplay.length() > 0) {
- if (name.startsWith(mVendorDisplay + "-")) { //$NON-NLS-1$
- name = name.substring(mVendorDisplay.length() + 1);
- }
- }
-
- // 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) {
- name = "Unknown Extra";
- }
-
- if (mVendorDisplay != null && mVendorDisplay.length() > 0) {
- name = mVendorDisplay + " " + 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$
-
- return name;
- }
-
- /**
- * Returns a string identifier to install this package from the command line.
- * For extras, we use "extra-vendor-path".
- * <p/>
- * {@inheritDoc}
- */
- @Override
- public String installId() {
- return String.format("extra-%1$s-%2$s", //$NON-NLS-1$
- getVendorId(),
- getPath());
- }
-
- /**
- * Returns a description of this package that is suitable for a list display.
- * <p/>
- * {@inheritDoc}
- */
- @Override
- public String getListDescription() {
- String s = String.format("%1$s%2$s",
- getDisplayName(),
- isObsolete() ? " (Obsolete)" : ""); //$NON-NLS-2$
-
- return s;
- }
-
- /**
- * Returns a short description for an {@link IDescription}.
- */
- @Override
- public String getShortDescription() {
- String s = String.format("%1$s, revision %2$s%3$s",
- getDisplayName(),
- getRevision().toShortString(),
- isObsolete() ? " (Obsolete)" : ""); //$NON-NLS-2$
-
- return s;
- }
-
- /**
- * Returns a long description for an {@link IDescription}.
- *
- * The long description is whatever the XML contains for the <description> field,
- * or the short description if the former is empty.
- */
- @Override
- public String getLongDescription() {
- String s = String.format("%1$s, revision %2$s%3$s\nBy %4$s",
- getDisplayName(),
- getRevision().toShortString(),
- isObsolete() ? " (Obsolete)" : "", //$NON-NLS-2$
- getVendorDisplay());
-
- String d = getDescription();
- if (d != null && d.length() > 0) {
- s += '\n' + d;
- }
-
- if (!getMinToolsRevision().equals(MIN_TOOLS_REV_NOT_SPECIFIED)) {
- s += String.format("\nRequires tools revision %1$s",
- getMinToolsRevision().toShortString());
- }
-
- if (getMinApiLevel() != MIN_API_LEVEL_NOT_SPECIFIED) {
- s += String.format("\nRequires SDK Platform Android API %1$s", getMinApiLevel());
- }
-
- File localPath = getLocalArchivePath();
- if (localPath != null) {
- // For a local archive, also put the install path in the long description.
- // This should help users locate the extra on their drive.
- s += String.format("\nLocation: %1$s", localPath.getAbsolutePath());
- } else {
- // For a non-installed archive, indicate where it would be installed.
- s += String.format("\nInstall path: %1$s",
- getInstallSubFolder(null/*sdk root*/).getPath());
- }
-
- return s;
- }
-
- /**
- * Computes a potential installation folder if an archive of this package were
- * to be installed right away in the given SDK root.
- * <p/>
- * A "tool" package should always be located in SDK/tools.
- *
- * @param osSdkRoot The OS path of the SDK root folder. Must NOT be null.
- * @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) {
-
- // First find if this extra is already installed. If so, reuse the same directory.
- LocalSdkParser localParser = new LocalSdkParser();
- Package[] pkgs = localParser.parseSdk(
- osSdkRoot,
- sdkManager,
- LocalSdkParser.PARSE_EXTRAS,
- new NullTaskMonitor(NullLogger.getLogger()));
-
- for (Package pkg : pkgs) {
- if (sameItemAs(pkg) && pkg instanceof ExtraPackage) {
- File localPath = ((ExtraPackage) pkg).getLocalArchivePath();
- if (localPath != null) {
- return localPath;
- }
- }
- }
-
- return getInstallSubFolder(osSdkRoot);
- }
-
- /**
- * Computes the "sub-folder" install path, relative to the given SDK root.
- * For an extra package, this is generally ".../extra/vendor-id/path".
- *
- * @param osSdkRoot The OS path of the SDK root folder if known.
- * This CAN be null, in which case the path will start at /extra.
- * @return Either /extra/vendor/path or sdk-root/extra/vendor-id/path.
- */
- private File getInstallSubFolder(@Nullable String osSdkRoot) {
- // The /extras dir at the root of the SDK
- File path = new File(osSdkRoot, SdkConstants.FD_EXTRAS);
-
- String vendor = getVendorId();
- 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 and vendor
- if (pkg instanceof ExtraPackage) {
- ExtraPackage ep = (ExtraPackage) pkg;
-
- String[] epOldPaths = ep.getOldPaths();
- int lenEpOldPaths = epOldPaths.length;
- for (int indexEp = -1; indexEp < lenEpOldPaths; indexEp++) {
- if (sameVendorAndPath(
- mVendorId, mPath,
- ep.mVendorId, indexEp < 0 ? ep.mPath : epOldPaths[indexEp])) {
- return true;
- }
- }
-
- String[] thisOldPaths = getOldPaths();
- int lenThisOldPaths = thisOldPaths.length;
- for (int indexThis = -1; indexThis < lenThisOldPaths; indexThis++) {
- if (sameVendorAndPath(
- mVendorId, indexThis < 0 ? mPath : thisOldPaths[indexThis],
- ep.mVendorId, ep.mPath)) {
- return true;
- }
- }
- }
-
- return false;
- }
-
- private static boolean sameVendorAndPath(
- String thisVendor, String thisPath,
- String otherVendor, String otherPath) {
- // To be backward compatible, we need to support the old vendor-path form
- // in either the current or the remote package.
- //
- // The vendor test below needs to account for an old installed package
- // (e.g. with an install path of vendor-name) that has then been updated
- // in-place and thus when reloaded contains the vendor name in both the
- // path and the vendor attributes.
- if (otherPath != null && thisPath != null && thisVendor != null) {
- if (otherPath.equals(thisVendor + '-' + thisPath) &&
- (otherVendor == null ||
- otherVendor.length() == 0 ||
- otherVendor.equals(thisVendor))) {
- return true;
- }
- }
- if (thisPath != null && otherPath != null && otherVendor != null) {
- if (thisPath.equals(otherVendor + '-' + otherPath) &&
- (thisVendor == null ||
- thisVendor.length() == 0 ||
- thisVendor.equals(otherVendor))) {
- return true;
- }
- }
-
-
- if (thisPath != null && thisPath.equals(otherPath)) {
- if ((thisVendor == null && otherVendor == null) ||
- (thisVendor != null && thisVendor.equals(otherVendor))) {
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * For extra packages, we want to add vendor|path to the sorting key
- * <em>before<em/> the revision number.
- * <p/>
- * {@inheritDoc}
- */
- @Override
- protected String comparisonKey() {
- String s = super.comparisonKey();
- int pos = s.indexOf("|r:"); //$NON-NLS-1$
- assert pos > 0;
- s = s.substring(0, pos) +
- "|ve:" + getVendorId() + //$NON-NLS-1$
- "|pa:" + getPath() + //$NON-NLS-1$
- s.substring(pos);
- return s;
- }
-
- // ---
-
- /**
- * 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;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = super.hashCode();
- result = prime * result + mMinApiLevel;
- result = prime * result + ((mPath == null) ? 0 : mPath.hashCode());
- result = prime * result + Arrays.hashCode(mProjectFiles);
- result = prime * result + ((mVendorDisplay == null) ? 0 : mVendorDisplay.hashCode());
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (!super.equals(obj)) {
- return false;
- }
- if (!(obj instanceof ExtraPackage)) {
- return false;
- }
- ExtraPackage other = (ExtraPackage) obj;
- if (mMinApiLevel != other.mMinApiLevel) {
- return false;
- }
- if (mPath == null) {
- if (other.mPath != null) {
- return false;
- }
- } else if (!mPath.equals(other.mPath)) {
- return false;
- }
- if (!Arrays.equals(mProjectFiles, other.mProjectFiles)) {
- return false;
- }
- if (mVendorDisplay == null) {
- if (other.mVendorDisplay != null) {
- return false;
- }
- } else if (!mVendorDisplay.equals(other.mVendorDisplay)) {
- return false;
- }
- return true;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/FullRevision.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/FullRevision.java
deleted file mode 100755
index 715028e..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/FullRevision.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.annotations.NonNull;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-
-/**
- * Package multi-part revision number composed of a tuple
- * (major.minor.micro) and an optional preview revision
- * (the lack of a preview number indicates it's not a preview
- * but a final package.)
- *
- * @see MajorRevision
- */
-public class FullRevision implements Comparable<FullRevision> {
-
- public static final int MISSING_MAJOR_REV = 0;
- public static final int IMPLICIT_MINOR_REV = 0;
- public static final int IMPLICIT_MICRO_REV = 0;
- public static final int NOT_A_PREVIEW = 0;
-
- private final static Pattern FULL_REVISION_PATTERN =
- // 1=major 2=minor 3=micro 4=preview
- Pattern.compile("\\s*([0-9]+)(?:\\.([0-9]+)(?:\\.([0-9]+))?)?\\s*(?:rc([0-9]+))?\\s*");
-
- private final int mMajor;
- private final int mMinor;
- private final int mMicro;
- private final int mPreview;
-
- public FullRevision(int major) {
- this(major, 0, 0);
- }
-
- public FullRevision(int major, int minor, int micro) {
- this(major, minor, micro, NOT_A_PREVIEW);
- }
-
- public FullRevision(int major, int minor, int micro, int preview) {
- mMajor = major;
- mMinor = minor;
- mMicro = micro;
- mPreview = preview;
- }
-
- public int getMajor() {
- return mMajor;
- }
-
- public int getMinor() {
- return mMinor;
- }
-
- public int getMicro() {
- return mMicro;
- }
-
- public boolean isPreview() {
- return mPreview > NOT_A_PREVIEW;
- }
-
- public int getPreview() {
- return mPreview;
- }
-
- /**
- * Parses a string of format "major.minor.micro rcPreview" and returns
- * a new {@link FullRevision} for it. All the fields except major are
- * optional.
- * <p/>
- * The parsing is equivalent to the pseudo-BNF/regexp:
- * <pre>
- * Major/Minor/Micro/Preview := [0-9]+
- * Revision := Major ('.' Minor ('.' Micro)? )? \s* ('rc'Preview)?
- * </pre>
- *
- * @param revision A non-null revision to parse.
- * @return A new non-null {@link FullRevision}.
- * @throws NumberFormatException if the parsing failed.
- */
- public static @NonNull FullRevision parseRevision(@NonNull String revision)
- throws NumberFormatException {
-
- if (revision == null) {
- throw new NumberFormatException("revision is <null>"); //$NON-NLS-1$
- }
-
- Throwable cause = null;
- try {
- Matcher m = FULL_REVISION_PATTERN.matcher(revision);
- if (m != null && m.matches()) {
- int major = Integer.parseInt(m.group(1));
- String s = m.group(2);
- int minor = s == null ? IMPLICIT_MINOR_REV : Integer.parseInt(s);
- s = m.group(3);
- int micro = s == null ? IMPLICIT_MICRO_REV : Integer.parseInt(s);
- s = m.group(4);
- int preview = s == null ? NOT_A_PREVIEW : Integer.parseInt(s);
-
- return new FullRevision(major, minor, micro, preview);
- }
- } catch (Throwable t) {
- cause = t;
- }
-
- NumberFormatException n = new NumberFormatException(
- "Invalid full revision: " + revision); //$NON-NLS-1$
- n.initCause(cause);
- throw n;
- }
-
- /**
- * Returns the version in a fixed format major.minor.micro
- * with an optional "rc preview#". For example it would
- * return "18.0.0", "18.1.0" or "18.1.2 rc5".
- */
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append(mMajor)
- .append('.').append(mMinor)
- .append('.').append(mMicro);
-
- if (mPreview != NOT_A_PREVIEW) {
- sb.append(" rc").append(mPreview);
- }
-
- return sb.toString();
- }
-
- /**
- * Returns the version in a dynamic format "major.minor.micro rc#".
- * This is similar to {@link #toString()} except it omits minor, micro
- * or preview versions when they are zero.
- * For example it would return "18 rc1" instead of "18.0.0 rc1",
- * or "18.1 rc2" instead of "18.1.0 rc2".
- */
- public String toShortString() {
- StringBuilder sb = new StringBuilder();
- sb.append(mMajor);
- if (mMinor > 0 || mMicro > 0) {
- sb.append('.').append(mMinor);
- }
- if (mMicro > 0) {
- sb.append('.').append(mMicro);
- }
- if (mPreview != NOT_A_PREVIEW) {
- sb.append(" rc").append(mPreview);
- }
-
- return sb.toString();
- }
-
- /**
- * Returns the version number as an integer array, in the form
- * [major, minor, micro] or [major, minor, micro, preview].
- *
- * This is useful to initialize an instance of
- * {@code org.apache.tools.ant.util.DeweyDecimal} using a
- * {@link FullRevision}.
- *
- * @param includePreview If true the output will contain 4 fields
- * to include the preview number (even if 0.) If false the output
- * will contain only 3 fields (major, minor and micro.)
- * @return A new int array, never null, with either 3 or 4 fields.
- */
- public int[] toIntArray(boolean includePreview) {
- int size = includePreview ? 4 : 3;
- int[] result = new int[size];
- result[0] = mMajor;
- result[1] = mMinor;
- result[2] = mMicro;
- if (result.length > 3) {
- result[3] = mPreview;
- }
- return result;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + mMajor;
- result = prime * result + mMinor;
- result = prime * result + mMicro;
- result = prime * result + mPreview;
- return result;
- }
-
- @Override
- public boolean equals(Object rhs) {
- if (this == rhs) {
- return true;
- }
- if (rhs == null) {
- return false;
- }
- if (!(rhs instanceof FullRevision)) {
- return false;
- }
- FullRevision other = (FullRevision) rhs;
- if (mMajor != other.mMajor) {
- return false;
- }
- if (mMinor != other.mMinor) {
- return false;
- }
- if (mMicro != other.mMicro) {
- return false;
- }
- if (mPreview != other.mPreview) {
- return false;
- }
- return true;
- }
-
- /**
- * Trivial comparison of a version, e.g 17.1.2 < 18.0.0.
- *
- * Note that preview/release candidate are released before their final version,
- * so "18.0.0 rc1" comes below "18.0.0". The best way to think of it as if the
- * lack of preview number was "+inf":
- * "18.1.2 rc5" => "18.1.2.5" so its less than "18.1.2.+INF" but more than "18.1.1.0"
- * and more than "18.1.2.4"
- */
- @Override
- public int compareTo(FullRevision rhs) {
- int delta = mMajor - rhs.mMajor;
- if (delta != 0) {
- return delta;
- }
-
- delta = mMinor - rhs.mMinor;
- if (delta != 0) {
- return delta;
- }
-
- delta = mMicro - rhs.mMicro;
- if (delta != 0) {
- return delta;
- }
-
- int p1 = mPreview == NOT_A_PREVIEW ? Integer.MAX_VALUE : mPreview;
- int p2 = rhs.mPreview == NOT_A_PREVIEW ? Integer.MAX_VALUE : rhs.mPreview;
- delta = p1 - p2;
- return delta;
- }
-
-
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/FullRevisionPackage.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/FullRevisionPackage.java
deleted file mode 100755
index 88827f5..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/FullRevisionPackage.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.repository.PkgProps;
-import com.android.sdklib.repository.SdkRepoConstants;
-
-import org.w3c.dom.Node;
-
-import java.util.Map;
-import java.util.Properties;
-
-/**
- * Represents a package in an SDK repository that has a {@link FullRevision},
- * which is a multi-part revision number (major.minor.micro) and an optional preview revision.
- */
-public abstract class FullRevisionPackage extends Package
- implements IFullRevisionProvider {
-
- private final FullRevision mPreviewVersion;
-
- /**
- * Creates a new package from the attributes and elements of the given XML node.
- * This constructor should throw an exception if the package cannot be created.
- *
- * @param source The {@link SdkSource} where this is loaded from.
- * @param packageNode The XML element being parsed.
- * @param nsUri The namespace URI of the originating XML document, to be able to deal with
- * parameters that vary according to the originating XML schema.
- * @param licenses The licenses loaded from the XML originating document.
- */
- FullRevisionPackage(SdkSource source,
- Node packageNode,
- String nsUri,
- Map<String,String> licenses) {
- super(source, packageNode, nsUri, licenses);
-
- mPreviewVersion = PackageParserUtils.parseFullRevisionElement(
- PackageParserUtils.findChildElement(packageNode, SdkRepoConstants.NODE_REVISION));
- }
-
- /**
- * Manually create a new package with one archive and the given attributes.
- * This is used to create packages from local directories in which case there must be
- * one archive which URL is the actual target location.
- * <p/>
- * Properties from props are used first when possible, e.g. if props is non null.
- * <p/>
- * By design, this creates a package with one and only one archive.
- */
- public FullRevisionPackage(
- SdkSource source,
- Properties props,
- int revision,
- String license,
- String description,
- String descUrl,
- Os archiveOs,
- Arch archiveArch,
- String archiveOsPath) {
- super(source, props, revision, license, description, descUrl,
- archiveOs, archiveArch, archiveOsPath);
-
- String revStr = getProperty(props, PkgProps.PKG_REVISION, null);
-
- FullRevision rev = null;
- if (revStr != null) {
- try {
- rev = FullRevision.parseRevision(revStr);
- } catch (NumberFormatException ignore) {}
- }
- if (rev == null) {
- rev = new FullRevision(revision);
- }
-
- mPreviewVersion = rev;
- }
-
- @Override
- public FullRevision getRevision() {
- return mPreviewVersion;
- }
-
- @Override
- public void saveProperties(Properties props) {
- super.saveProperties(props);
- props.setProperty(PkgProps.PKG_REVISION, mPreviewVersion.toShortString());
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = super.hashCode();
- result = prime * result + ((mPreviewVersion == null) ? 0 : mPreviewVersion.hashCode());
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (!super.equals(obj)) {
- return false;
- }
- if (!(obj instanceof FullRevisionPackage)) {
- return false;
- }
- FullRevisionPackage other = (FullRevisionPackage) obj;
- if (mPreviewVersion == null) {
- if (other.mPreviewVersion != null) {
- return false;
- }
- } else if (!mPreviewVersion.equals(other.mPreviewVersion)) {
- return false;
- }
- return true;
- }
-
- /**
- * Computes whether the given package is a suitable update for the current package.
- * <p/>
- * A specific case here is that a release package can update a preview, whereas
- * a preview can only update another preview.
- * <p/>
- * {@inheritDoc}
- */
- @Override
- public UpdateInfo canBeUpdatedBy(Package replacementPackage) {
- if (replacementPackage == null) {
- return UpdateInfo.INCOMPATIBLE;
- }
-
- // check they are the same item, ignoring the preview bit.
- if (!sameItemAs(replacementPackage, true /*ignorePreviews*/)) {
- return UpdateInfo.INCOMPATIBLE;
- }
-
- // a preview cannot update a non-preview
- if (!getRevision().isPreview() && replacementPackage.getRevision().isPreview()) {
- return UpdateInfo.INCOMPATIBLE;
- }
-
- // check revision number
- if (replacementPackage.getRevision().compareTo(this.getRevision()) > 0) {
- return UpdateInfo.UPDATE;
- }
-
- // not an upgrade but not incompatible either.
- return UpdateInfo.NOT_UPDATE;
- }
-
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/IAndroidVersionProvider.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/IAndroidVersionProvider.java
deleted file mode 100755
index 14d6214..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/IAndroidVersionProvider.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.annotations.NonNull;
-import com.android.sdklib.AndroidVersion;
-
-/**
- * Interface for packages that provide an {@link AndroidVersion}.
- * <p/>
- * Note that {@link IPlatformDependency} is a similar interface, but with a different semantic.
- * The {@link IPlatformDependency} denotes that a given package can only be installed if the
- * requested platform is present, whereas this interface denotes that the given package simply
- * has a version, which is not necessarily a dependency.
- */
-public interface IAndroidVersionProvider {
-
- /**
- * Returns the android version, for platform, add-on and doc packages.
- * Can be 0 if this is a local package of unknown api-level.
- */
- public abstract @NonNull AndroidVersion getAndroidVersion();
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/IExactApiLevelDependency.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/IExactApiLevelDependency.java
deleted file mode 100755
index eaeccdb..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/IExactApiLevelDependency.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.repository.RepoConstants;
-
-/**
- * Interface used to decorate a {@link Package} that has a dependency
- * on a specific API level, e.g. which XML has a {@code <api-level>} element.
- * <p/>
- * For example an add-on package requires a platform with an exact API level to be installed
- * at the same time.
- * This is not the same as {@link IMinApiLevelDependency} which requests that a platform with at
- * least the requested API level be present or installed at the same time.
- * <p/>
- * Such package requires the {@code <api-level>} element. It is not an optional
- * property, however it can be invalid.
- */
-public interface IExactApiLevelDependency {
-
- /**
- * The value of {@link #getExactApiLevel()} when the {@link RepoConstants#NODE_API_LEVEL}
- * was not specified in the XML source.
- */
- public static final int API_LEVEL_INVALID = 0;
-
- /**
- * Returns the exact API level required by this package, if > 0,
- * or {@link #API_LEVEL_INVALID} if the value was missing.
- * <p/>
- * This attribute is mandatory and should not be normally missing.
- * It can only happen when dealing with an invalid repository XML.
- */
- public abstract int getExactApiLevel();
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/IFullRevisionProvider.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/IFullRevisionProvider.java
deleted file mode 100755
index e4ec292..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/IFullRevisionProvider.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-
-
-/**
- * Interface for packages that provide a {@link FullRevision},
- * which is a multi-part revision number (major.minor.micro) and an optional preview revision.
- * <p/>
- * This interface is a tag. It indicates that {@link Package#getRevision()} returns a
- * {@link FullRevision} instead of a limited {@link MajorRevision}. <br/>
- * The preview version number is available via {@link Package#getRevision()}.
- */
-public interface IFullRevisionProvider {
-
- /**
- * Returns whether the give package represents the same item as the current package.
- * <p/>
- * Two packages are considered the same if they represent the same thing, except for the
- * revision number.
- * @param pkg the package to compare
- * @param ignorePreviews true if 2 packages should be considered the same even if one
- * is a preview and the other one is not.
- * @return true if the item are the same.
- */
- public abstract boolean sameItemAs(Package pkg, boolean ignorePreviews);
-
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/ILayoutlibVersion.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/ILayoutlibVersion.java
deleted file mode 100755
index 39c1dc2..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/ILayoutlibVersion.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.utils.Pair;
-
-/**
- * Interface used to decorate a {@link Package} that provides a version for layout lib.
- */
-public interface ILayoutlibVersion {
-
- public static final int LAYOUTLIB_API_NOT_SPECIFIED = 0;
- public static final int LAYOUTLIB_REV_NOT_SPECIFIED = 0;
-
- /**
- * Returns the layoutlib version. Mandatory starting with repository XSD rev 4.
- * <p/>
- * The first integer is the API of layoublib, which should be > 0.
- * It will be equal to {@link #LAYOUTLIB_API_NOT_SPECIFIED} (0) if the layoutlib
- * version isn't specified.
- * <p/>
- * The second integer is the revision for that given API. It is >= 0
- * and works as a minor revision number, incremented for the same API level.
- *
- * @since sdk-repository-4.xsd
- */
- public Pair<Integer, Integer> getLayoutlibVersion();
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/IMinApiLevelDependency.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/IMinApiLevelDependency.java
deleted file mode 100755
index 8baafe9..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/IMinApiLevelDependency.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.repository.SdkRepoConstants;
-
-/**
- * Interface used to decorate a {@link Package} that has a dependency
- * on a minimal API level, e.g. which XML has a <code><min-api-level></code> element.
- * <p/>
- * A package that has this dependency can only be installed if a platform with at least the
- * requested API level is present or installed at the same time.
- */
-public interface IMinApiLevelDependency {
-
- /**
- * The value of {@link #getMinApiLevel()} when the {@link SdkRepoConstants#NODE_MIN_API_LEVEL}
- * was not specified in the XML source.
- */
- public static final int MIN_API_LEVEL_NOT_SPECIFIED = 0;
-
- /**
- * Returns the minimal API level required by this package, if > 0,
- * or {@link #MIN_API_LEVEL_NOT_SPECIFIED} if there is no such requirement.
- */
- public abstract int getMinApiLevel();
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/IMinPlatformToolsDependency.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/IMinPlatformToolsDependency.java
deleted file mode 100755
index d17b800..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/IMinPlatformToolsDependency.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.repository.SdkRepoConstants;
-
-/**
- * Interface used to decorate a {@link Package} that has a dependency
- * on a minimal platform-tools revision, e.g. which XML has a
- * <code><min-platform-tools-rev></code> element.
- * <p/>
- * A package that has this dependency can only be installed if the requested platform-tools
- * revision is present or installed at the same time.
- */
-public interface IMinPlatformToolsDependency {
-
- /**
- * The value of {@link #getMinPlatformToolsRevision()} when the
- * {@link SdkRepoConstants#NODE_MIN_PLATFORM_TOOLS_REV} was not specified in the XML source.
- * Since this is a required attribute in the XML schema, it can only happen when dealing
- * with an invalid repository XML.
- */
- public static final FullRevision MIN_PLATFORM_TOOLS_REV_INVALID =
- new FullRevision(FullRevision.MISSING_MAJOR_REV);
-
- /**
- * The minimal revision of the tools package required by this package if > 0,
- * or {@link #MIN_PLATFORM_TOOLS_REV_INVALID} if the value was missing.
- * <p/>
- * This attribute is mandatory and should not be normally missing.
- * It can only happen when dealing with an invalid repository XML.
- */
- public abstract FullRevision getMinPlatformToolsRevision();
-
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/IMinToolsDependency.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/IMinToolsDependency.java
deleted file mode 100755
index 064f1d3..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/IMinToolsDependency.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.repository.SdkRepoConstants;
-
-/**
- * Interface used to decorate a {@link Package} that has a dependency
- * on a minimal tools revision, e.g. which XML has a <code><min-tools-rev></code> element.
- * <p/>
- * A package that has this dependency can only be installed if the requested tools revision
- * is present or installed at the same time.
- */
-public interface IMinToolsDependency {
-
- /**
- * The value of {@link #getMinToolsRevision()} when the
- * {@link SdkRepoConstants#NODE_MIN_TOOLS_REV} was not specified in the XML source.
- */
- public static final FullRevision MIN_TOOLS_REV_NOT_SPECIFIED =
- new FullRevision(FullRevision.MISSING_MAJOR_REV);
-
- /**
- * The minimal revision of the tools package required by this extra package if > 0,
- * or {@link #MIN_TOOLS_REV_NOT_SPECIFIED} if there is no such requirement.
- */
- public abstract FullRevision getMinToolsRevision();
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/IPlatformDependency.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/IPlatformDependency.java
deleted file mode 100755
index 9665528..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/IPlatformDependency.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.AndroidVersion;
-
-/**
- * Interface used to decorate a {@link Package} that has a dependency
- * on a specific platform (API level and/or code name).
- * <p/>
- * A package that has this dependency can only be installed if a platform with at least the
- * requested API level is present or installed at the same time.
- * <p/>
- * Note that although this interface looks like {@link IAndroidVersionProvider}, it does
- * not convey the same semantic since {@link IAndroidVersionProvider} does <em>not</em>
- * imply any dependency being a limiting factor as far as installation is concerned.
- */
-public interface IPlatformDependency {
-
- /** Returns the version of the platform dependency of this package. */
- AndroidVersion getAndroidVersion();
-
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/LayoutlibVersionMixin.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/LayoutlibVersionMixin.java
deleted file mode 100755
index ab9a31e..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/LayoutlibVersionMixin.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.repository.PkgProps;
-import com.android.sdklib.repository.RepoConstants;
-import com.android.utils.Pair;
-
-import org.w3c.dom.Node;
-
-import java.util.Properties;
-
-/**
- * Helper class to handle the layoutlib version provided by a package.
- */
-public class LayoutlibVersionMixin implements ILayoutlibVersion {
-
- /**
- * The layoutlib version.
- * The first integer is the API of layoublib, which should be > 0.
- * It will be equal to {@link #LAYOUTLIB_API_NOT_SPECIFIED} (0) if the layoutlib
- * version isn't specified.
- * The second integer is the revision for that given API. It is >= 0
- * and works as a minor revision number, incremented for the same API level.
- */
- private final Pair<Integer, Integer> mLayoutlibVersion;
-
- /**
- * Parses an XML node to process the {@code <layoutlib>} element.
- *
- * The layoutlib element is new in the XSD rev 4, so we need to cope with it missing
- * in earlier XMLs.
- */
- public LayoutlibVersionMixin(Node pkgNode) {
-
- int api = LAYOUTLIB_API_NOT_SPECIFIED;
- int rev = LAYOUTLIB_REV_NOT_SPECIFIED;
-
- Node layoutlibNode =
- PackageParserUtils.findChildElement(pkgNode, RepoConstants.NODE_LAYOUT_LIB);
-
- if (layoutlibNode != null) {
- api = PackageParserUtils.getXmlInt(layoutlibNode, RepoConstants.NODE_API, 0);
- rev = PackageParserUtils.getXmlInt(layoutlibNode, RepoConstants.NODE_REVISION, 0);
- }
-
- mLayoutlibVersion = Pair.of(api, rev);
- }
-
- /**
- * Parses the layoutlib version optionally available in the given {@link Properties}.
- */
- public LayoutlibVersionMixin(Properties props) {
- int layoutlibApi = Package.getPropertyInt(props, PkgProps.LAYOUTLIB_API,
- LAYOUTLIB_API_NOT_SPECIFIED);
- int layoutlibRev = Package.getPropertyInt(props, PkgProps.LAYOUTLIB_REV,
- LAYOUTLIB_REV_NOT_SPECIFIED);
- mLayoutlibVersion = Pair.of(layoutlibApi, layoutlibRev);
- }
-
- /**
- * Stores the layoutlib version in the given {@link Properties}.
- */
- void saveProperties(Properties props) {
- if (mLayoutlibVersion.getFirst().intValue() != LAYOUTLIB_API_NOT_SPECIFIED) {
- props.setProperty(PkgProps.LAYOUTLIB_API, mLayoutlibVersion.getFirst().toString());
- props.setProperty(PkgProps.LAYOUTLIB_REV, mLayoutlibVersion.getSecond().toString());
- }
- }
-
- /**
- * Returns the layoutlib version.
- * <p/>
- * The first integer is the API of layoublib, which should be > 0.
- * It will be equal to {@link #LAYOUTLIB_API_NOT_SPECIFIED} (0) if the layoutlib
- * version isn't specified.
- * <p/>
- * The second integer is the revision for that given API. It is >= 0
- * and works as a minor revision number, incremented for the same API level.
- *
- * @since sdk-repository-4.xsd and sdk-addon-2.xsd
- */
- @Override
- public Pair<Integer, Integer> getLayoutlibVersion() {
- return mLayoutlibVersion;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((mLayoutlibVersion == null) ? 0 : mLayoutlibVersion.hashCode());
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null) {
- return false;
- }
- if (!(obj instanceof LayoutlibVersionMixin)) {
- return false;
- }
- LayoutlibVersionMixin other = (LayoutlibVersionMixin) obj;
- if (mLayoutlibVersion == null) {
- if (other.mLayoutlibVersion != null) {
- return false;
- }
- } else if (!mLayoutlibVersion.equals(other.mLayoutlibVersion)) {
- return false;
- }
- return true;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/MajorRevision.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/MajorRevision.java
deleted file mode 100755
index ad33ed4..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/MajorRevision.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.annotations.NonNull;
-
-
-/**
- * Package revision number composed of a <em>single</em> major revision.
- * <p/>
- * Contrary to a {@link FullRevision}, a {@link MajorRevision} does not
- * provide minor, micro and preview revision numbers -- these are all
- * set to zero.
- */
-public class MajorRevision extends FullRevision {
-
- public MajorRevision(int major) {
- super(major, 0, 0);
- }
-
- @Override
- public String toString() {
- return super.toShortString();
- }
-
- /**
- * Parses a single-integer string and returns a new {@link MajorRevision} for it.
- *
- * @param revision A non-null revision to parse.
- * @return A new non-null {@link MajorRevision}.
- * @throws NumberFormatException if the parsing failed.
- */
- public static @NonNull MajorRevision parseRevision(@NonNull String revision)
- throws NumberFormatException {
-
- if (revision == null) {
- throw new NumberFormatException("revision is <null>"); //$NON-NLS-1$
- }
-
- return new MajorRevision(Integer.parseInt(revision.trim()));
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/MajorRevisionPackage.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/MajorRevisionPackage.java
deleted file mode 100755
index 4591297..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/MajorRevisionPackage.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.repository.PkgProps;
-import com.android.sdklib.repository.SdkRepoConstants;
-
-import org.w3c.dom.Node;
-
-import java.util.Map;
-import java.util.Properties;
-
-/**
- * Represents a package in an SDK repository that has a {@link MajorRevision},
- * which is a single major revision number (not minor, micro or previews).
- */
-public abstract class MajorRevisionPackage extends Package {
-
- private final MajorRevision mRevision;
-
- /**
- * Creates a new package from the attributes and elements of the given XML node.
- * This constructor should throw an exception if the package cannot be created.
- *
- * @param source The {@link SdkSource} where this is loaded from.
- * @param packageNode The XML element being parsed.
- * @param nsUri The namespace URI of the originating XML document, to be able to deal with
- * parameters that vary according to the originating XML schema.
- * @param licenses The licenses loaded from the XML originating document.
- */
- MajorRevisionPackage(SdkSource source,
- Node packageNode,
- String nsUri,
- Map<String,String> licenses) {
- super(source, packageNode, nsUri, licenses);
-
- mRevision = new MajorRevision(
- PackageParserUtils.getXmlInt(packageNode, SdkRepoConstants.NODE_REVISION, 0));
- }
-
- /**
- * Manually create a new package with one archive and the given attributes.
- * This is used to create packages from local directories in which case there must be
- * one archive which URL is the actual target location.
- * <p/>
- * Properties from props are used first when possible, e.g. if props is non null.
- * <p/>
- * By design, this creates a package with one and only one archive.
- */
- public MajorRevisionPackage(
- SdkSource source,
- Properties props,
- int revision,
- String license,
- String description,
- String descUrl,
- Os archiveOs,
- Arch archiveArch,
- String archiveOsPath) {
- super(source, props, revision, license, description, descUrl,
- archiveOs, archiveArch, archiveOsPath);
-
- String revStr = getProperty(props, PkgProps.PKG_REVISION, null);
-
- MajorRevision rev = null;
- if (revStr != null) {
- try {
- rev = MajorRevision.parseRevision(revStr);
- } catch (NumberFormatException ignore) {}
- }
- if (rev == null) {
- rev = new MajorRevision(revision);
- }
-
- mRevision = rev;
- }
-
- /**
- * Returns the revision, an int > 0, for all packages (platform, add-on, tool, doc).
- * Can be 0 if this is a local package of unknown revision.
- */
- @Override
- public FullRevision getRevision() {
- return mRevision;
- }
-
-
- @Override
- public void saveProperties(Properties props) {
- super.saveProperties(props);
- props.setProperty(PkgProps.PKG_REVISION, mRevision.toString());
- }
-
- @Override
- public UpdateInfo canBeUpdatedBy(Package replacementPackage) {
- if (replacementPackage == null) {
- return UpdateInfo.INCOMPATIBLE;
- }
-
- // check they are the same item.
- if (!sameItemAs(replacementPackage)) {
- return UpdateInfo.INCOMPATIBLE;
- }
-
- // check revision number
- if (replacementPackage.getRevision().compareTo(this.getRevision()) > 0) {
- return UpdateInfo.UPDATE;
- }
-
- // not an upgrade but not incompatible either.
- return UpdateInfo.NOT_UPDATE;
- }
-
-
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/MinToolsPackage.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/MinToolsPackage.java
deleted file mode 100755
index a608a3c..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/MinToolsPackage.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.repository.PkgProps;
-import com.android.sdklib.repository.SdkRepoConstants;
-
-import org.w3c.dom.Node;
-
-import java.util.Map;
-import java.util.Properties;
-
-/**
- * Represents an XML node in an SDK repository that has a min-tools-rev requirement.
- */
-public abstract class MinToolsPackage extends MajorRevisionPackage implements IMinToolsDependency {
-
- /**
- * The minimal revision of the tools package required by this extra package, if > 0,
- * or {@link #MIN_TOOLS_REV_NOT_SPECIFIED} if there is no such requirement.
- */
- private final FullRevision mMinToolsRevision;
-
- /**
- * Creates a new package from the attributes and elements of the given XML node.
- * This constructor should throw an exception if the package cannot be created.
- *
- * @param source The {@link SdkSource} where this is loaded from.
- * @param packageNode The XML element being parsed.
- * @param nsUri The namespace URI of the originating XML document, to be able to deal with
- * parameters that vary according to the originating XML schema.
- * @param licenses The licenses loaded from the XML originating document.
- */
- MinToolsPackage(SdkSource source, Node packageNode, String nsUri, Map<String,String> licenses) {
- super(source, packageNode, nsUri, licenses);
-
- mMinToolsRevision = PackageParserUtils.parseFullRevisionElement(
- PackageParserUtils.findChildElement(packageNode, SdkRepoConstants.NODE_MIN_TOOLS_REV));
- }
-
- /**
- * Manually create a new package with one archive and the given attributes.
- * This is used to create packages from local directories in which case there must be
- * one archive which URL is the actual target location.
- * <p/>
- * Properties from props are used first when possible, e.g. if props is non null.
- * <p/>
- * By design, this creates a package with one and only one archive.
- */
- public MinToolsPackage(
- SdkSource source,
- Properties props,
- int revision,
- String license,
- String description,
- String descUrl,
- Os archiveOs,
- Arch archiveArch,
- String archiveOsPath) {
- super(source, props, revision, license, description, descUrl,
- archiveOs, archiveArch, archiveOsPath);
-
- String revStr = getProperty(props, PkgProps.MIN_TOOLS_REV, null);
-
- FullRevision rev = MIN_TOOLS_REV_NOT_SPECIFIED;
- if (revStr != null) {
- try {
- rev = FullRevision.parseRevision(revStr);
- } catch (NumberFormatException ignore) {}
- }
-
- mMinToolsRevision = rev;
- }
-
- /**
- * The minimal revision of the tools package required by this extra package, if > 0,
- * or {@link #MIN_TOOLS_REV_NOT_SPECIFIED} if there is no such requirement.
- */
- @Override
- public FullRevision getMinToolsRevision() {
- return mMinToolsRevision;
- }
-
- @Override
- public void saveProperties(Properties props) {
- super.saveProperties(props);
-
- if (!getMinToolsRevision().equals(MIN_TOOLS_REV_NOT_SPECIFIED)) {
- props.setProperty(PkgProps.MIN_TOOLS_REV, getMinToolsRevision().toShortString());
- }
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = super.hashCode();
- result = prime * result + ((mMinToolsRevision == null) ? 0 : mMinToolsRevision.hashCode());
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (!super.equals(obj)) {
- return false;
- }
- if (!(obj instanceof MinToolsPackage)) {
- return false;
- }
- MinToolsPackage other = (MinToolsPackage) obj;
- if (mMinToolsRevision == null) {
- if (other.mMinToolsRevision != null) {
- return false;
- }
- } else if (!mMinToolsRevision.equals(other.mMinToolsRevision)) {
- return false;
- }
- return true;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/Package.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/Package.java
deleted file mode 100755
index feab109..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/Package.java
+++ /dev/null
@@ -1,823 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.annotations.VisibleForTesting;
-import com.android.annotations.VisibleForTesting.Visibility;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.internal.repository.IDescription;
-import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.sources.SdkAddonSource;
-import com.android.sdklib.internal.repository.sources.SdkRepoSource;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.io.IFileOp;
-import com.android.sdklib.repository.PkgProps;
-import com.android.sdklib.repository.SdkAddonConstants;
-import com.android.sdklib.repository.SdkRepoConstants;
-
-import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
-import org.w3c.dom.Node;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Map;
-import java.util.Properties;
-
-/**
- * A {@link Package} is the base class for "something" that can be downloaded from
- * the SDK repository.
- * <p/>
- * A package has some attributes (revision, description) and a list of archives
- * which represent the downloadable bits.
- * <p/>
- * Packages are contained by a {@link SdkSource} (a download site).
- * <p/>
- * Derived classes must implement the {@link IDescription} methods.
- */
-public abstract class Package implements IDescription, Comparable<Package> {
-
- private final String mObsolete;
- private final String mLicense;
- private final String mDescription;
- private final String mDescUrl;
- private final String mReleaseNote;
- private final String mReleaseUrl;
- private final Archive[] mArchives;
- private final SdkSource mSource;
-
-
- // figure if we'll need to set the unix permissions
- private static final boolean sUsingUnixPerm =
- SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_DARWIN ||
- SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_LINUX;
-
-
- /**
- * Enum for the result of {@link Package#canBeUpdatedBy(Package)}. This used so that we can
- * differentiate between a package that is totally incompatible, and one that is the same item
- * but just not an update.
- * @see #canBeUpdatedBy(Package)
- */
- public static enum UpdateInfo {
- /** Means that the 2 packages are not the same thing */
- INCOMPATIBLE,
- /** Means that the 2 packages are the same thing but one does not upgrade the other.
- * </p>
- * TODO: this name is confusing. We need to dig deeper. */
- NOT_UPDATE,
- /** Means that the 2 packages are the same thing, and one is the upgrade of the other */
- UPDATE;
- }
-
- /**
- * Creates a new package from the attributes and elements of the given XML node.
- * This constructor should throw an exception if the package cannot be created.
- *
- * @param source The {@link SdkSource} where this is loaded from.
- * @param packageNode The XML element being parsed.
- * @param nsUri The namespace URI of the originating XML document, to be able to deal with
- * parameters that vary according to the originating XML schema.
- * @param licenses The licenses loaded from the XML originating document.
- */
- Package(SdkSource source, Node packageNode, String nsUri, Map<String,String> licenses) {
- mSource = source;
- mDescription =
- PackageParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_DESCRIPTION);
- mDescUrl =
- PackageParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_DESC_URL);
- mReleaseNote =
- PackageParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_RELEASE_NOTE);
- mReleaseUrl =
- PackageParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_RELEASE_URL);
- mObsolete =
- PackageParserUtils.getOptionalXmlString(packageNode, SdkRepoConstants.NODE_OBSOLETE);
-
- mLicense = parseLicense(packageNode, licenses);
- mArchives = parseArchives(
- PackageParserUtils.findChildElement(packageNode, SdkRepoConstants.NODE_ARCHIVES));
- }
-
- /**
- * Manually create a new package with one archive and the given attributes.
- * This is used to create packages from local directories in which case there must be
- * one archive which URL is the actual target location.
- * <p/>
- * Properties from props are used first when possible, e.g. if props is non null.
- * <p/>
- * By design, this creates a package with one and only one archive.
- */
- public Package(
- SdkSource source,
- Properties props,
- int revision,
- String license,
- String description,
- String descUrl,
- Os archiveOs,
- Arch archiveArch,
- String archiveOsPath) {
-
- if (description == null) {
- description = "";
- }
- if (descUrl == null) {
- descUrl = "";
- }
-
- mLicense = getProperty(props, PkgProps.PKG_LICENSE, license);
- mDescription = getProperty(props, PkgProps.PKG_DESC, description);
- mDescUrl = getProperty(props, PkgProps.PKG_DESC_URL, descUrl);
- mReleaseNote = getProperty(props, PkgProps.PKG_RELEASE_NOTE, ""); //$NON-NLS-1$
- mReleaseUrl = getProperty(props, PkgProps.PKG_RELEASE_URL, ""); //$NON-NLS-1$
- mObsolete = getProperty(props, PkgProps.PKG_OBSOLETE, null);
-
- // If source is null and we can find a source URL in the properties, generate
- // a dummy source just to store the URL. This allows us to easily remember where
- // a package comes from.
- String srcUrl = getProperty(props, PkgProps.PKG_SOURCE_URL, null);
- if (props != null && source == null && srcUrl != null) {
- // Both Addon and Extra packages can come from an addon source.
- // For Extras, we can tell by looking at the source URL.
- if (this instanceof AddonPackage ||
- ((this instanceof ExtraPackage) &&
- srcUrl.endsWith(SdkAddonConstants.URL_DEFAULT_FILENAME))) {
- source = new SdkAddonSource(srcUrl, null /*uiName*/);
- } else {
- source = new SdkRepoSource(srcUrl, null /*uiName*/);
- }
- }
- mSource = source;
-
- assert archiveOsPath != null;
- mArchives = initializeArchives(props, archiveOs, archiveArch, archiveOsPath);
- }
-
- /**
- * Called by the constructor to get the initial {@link #mArchives} array.
- * <p/>
- * This is invoked by the local-package constructor and allows mock testing
- * classes to override the archives created.
- * This is an <em>implementation</em> details and clients must <em>not</em>
- * rely on this.
- *
- * @return Always return a non-null array. The array may be empty.
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected Archive[] initializeArchives(
- Properties props,
- Os archiveOs,
- Arch archiveArch,
- String archiveOsPath) {
- return new Archive[] {
- new Archive(this,
- props,
- archiveOs,
- archiveArch,
- archiveOsPath) };
- }
-
- /**
- * Utility method that returns a property from a {@link Properties} object.
- * Returns the default value if props is null or if the property is not defined.
- *
- * @param props The {@link Properties} to search into.
- * If null, the default value is returned.
- * @param propKey The name of the property. Must not be null.
- * @param defaultValue The default value to return if {@code props} is null or if the
- * key is not found. Can be null.
- * @return The string value of the given key in the properties, or null if the key
- * isn't found or if {@code props} is null.
- */
- @Nullable
- static String getProperty(
- @Nullable Properties props,
- @NonNull String propKey,
- @Nullable String defaultValue) {
- if (props == null) {
- return defaultValue;
- }
- return props.getProperty(propKey, defaultValue);
- }
-
- /**
- * Utility method that returns an integer property from a {@link Properties} object.
- * Returns the default value if props is null or if the property is not defined or
- * cannot be parsed to an integer.
- *
- * @param props The {@link Properties} to search into.
- * If null, the default value is returned.
- * @param propKey The name of the property. Must not be null.
- * @param defaultValue The default value to return if {@code props} is null or if the
- * key is not found. Can be null.
- * @return The integer value of the given key in the properties, or the {@code defaultValue}.
- */
- static int getPropertyInt(
- @Nullable Properties props,
- @NonNull String propKey,
- int defaultValue) {
- String s = props != null ? props.getProperty(propKey, null) : null;
- if (s != null) {
- try {
- return Integer.parseInt(s);
- } catch (Exception ignore) {}
- }
- return defaultValue;
- }
-
- /**
- * Save the properties of the current packages in the given {@link Properties} object.
- * These properties will later be give the constructor that takes a {@link Properties} object.
- */
- public void saveProperties(Properties props) {
- if (mLicense != null && mLicense.length() > 0) {
- props.setProperty(PkgProps.PKG_LICENSE, mLicense);
- }
- if (mDescription != null && mDescription.length() > 0) {
- props.setProperty(PkgProps.PKG_DESC, mDescription);
- }
- if (mDescUrl != null && mDescUrl.length() > 0) {
- props.setProperty(PkgProps.PKG_DESC_URL, mDescUrl);
- }
-
- if (mReleaseNote != null && mReleaseNote.length() > 0) {
- props.setProperty(PkgProps.PKG_RELEASE_NOTE, mReleaseNote);
- }
- if (mReleaseUrl != null && mReleaseUrl.length() > 0) {
- props.setProperty(PkgProps.PKG_RELEASE_URL, mReleaseUrl);
- }
- if (mObsolete != null) {
- props.setProperty(PkgProps.PKG_OBSOLETE, mObsolete);
- }
- if (mSource != null) {
- props.setProperty(PkgProps.PKG_SOURCE_URL, mSource.getUrl());
- }
- }
-
- /**
- * Parses the uses-licence node of this package, if any, and returns the license
- * definition if there's one. Returns null if there's no uses-license element or no
- * license of this name defined.
- */
- private String parseLicense(Node packageNode, Map<String, String> licenses) {
- Node usesLicense =
- PackageParserUtils.findChildElement(packageNode, SdkRepoConstants.NODE_USES_LICENSE);
- if (usesLicense != null) {
- Node ref = usesLicense.getAttributes().getNamedItem(SdkRepoConstants.ATTR_REF);
- if (ref != null) {
- String licenseRef = ref.getNodeValue();
- return licenses.get(licenseRef);
- }
- }
- return null;
- }
-
- /**
- * Parses an XML node to process the <archives> element.
- * Always return a non-null array. The array may be empty.
- */
- private Archive[] parseArchives(Node archivesNode) {
- ArrayList<Archive> archives = new ArrayList<Archive>();
-
- if (archivesNode != null) {
- String nsUri = archivesNode.getNamespaceURI();
- for(Node child = archivesNode.getFirstChild();
- child != null;
- child = child.getNextSibling()) {
-
- if (child.getNodeType() == Node.ELEMENT_NODE &&
- nsUri.equals(child.getNamespaceURI()) &&
- SdkRepoConstants.NODE_ARCHIVE.equals(child.getLocalName())) {
- archives.add(parseArchive(child));
- }
- }
- }
-
- return archives.toArray(new Archive[archives.size()]);
- }
-
- /**
- * Parses one <archive> element from an <archives> container.
- */
- private Archive parseArchive(Node archiveNode) {
- Archive a = new Archive(
- this,
- (Os) PackageParserUtils.getEnumAttribute(
- archiveNode, SdkRepoConstants.ATTR_OS, Os.values(), null),
- (Arch) PackageParserUtils.getEnumAttribute(
- archiveNode, SdkRepoConstants.ATTR_ARCH, Arch.values(), Arch.ANY),
- PackageParserUtils.getXmlString(archiveNode, SdkRepoConstants.NODE_URL),
- PackageParserUtils.getXmlLong (archiveNode, SdkRepoConstants.NODE_SIZE, 0),
- PackageParserUtils.getXmlString(archiveNode, SdkRepoConstants.NODE_CHECKSUM)
- );
-
- return a;
- }
-
- /**
- * Returns the source that created (and owns) this package. Can be null.
- */
- public SdkSource getParentSource() {
- return mSource;
- }
-
- /**
- * Returns true if the package is deemed obsolete, that is it contains an
- * actual <code><obsolete></code> element.
- */
- public boolean isObsolete() {
- return mObsolete != null;
- }
-
- /**
- * Returns the revision, an int > 0, for all packages (platform, add-on, tool, doc).
- * Can be 0 if this is a local package of unknown revision.
- */
- public abstract FullRevision getRevision();
-
- /**
- * Returns the optional description for all packages (platform, add-on, tool, doc) or
- * for a lib. It is null if the element has not been specified in the repository XML.
- */
- public String getLicense() {
- return mLicense;
- }
-
- /**
- * Returns the optional description for all packages (platform, add-on, tool, doc) or
- * for a lib. Can be empty but not null.
- */
- public String getDescription() {
- return mDescription;
- }
-
- /**
- * Returns the optional description URL for all packages (platform, add-on, tool, doc).
- * Can be empty but not null.
- */
- public String getDescUrl() {
- return mDescUrl;
- }
-
- /**
- * Returns the optional release note for all packages (platform, add-on, tool, doc) or
- * for a lib. Can be empty but not null.
- */
- public String getReleaseNote() {
- return mReleaseNote;
- }
-
- /**
- * Returns the optional release note URL for all packages (platform, add-on, tool, doc).
- * Can be empty but not null.
- */
- public String getReleaseNoteUrl() {
- return mReleaseUrl;
- }
-
- /**
- * Returns the archives defined in this package.
- * Can be an empty array but not null.
- */
- public Archive[] getArchives() {
- return mArchives;
- }
-
- /**
- * Returns true if this package contains the exact given archive.
- * Important: This compares object references, not object equality.
- */
- public boolean hasArchive(Archive archive) {
- for (Archive a : mArchives) {
- if (a == archive) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Returns whether the {@link Package} has at least one {@link Archive} compatible with
- * the host platform.
- */
- public boolean hasCompatibleArchive() {
- for (Archive archive : mArchives) {
- if (archive.isCompatible()) {
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * Returns a short, reasonably unique string identifier that can be used
- * to identify this package when installing from the command-line interface.
- * {@code 'android list sdk'} will show these IDs and then in turn they can
- * be provided to {@code 'android update sdk --no-ui --filter'} to select
- * some specific packages.
- * <p/>
- * The identifiers must have the following properties: <br/>
- * - They must contain only simple alphanumeric characters. <br/>
- * - Commas, whitespace and any special character that could be obviously problematic
- * to a shell interface should be avoided (so dash/underscore are OK, but things
- * like colon, pipe or dollar should be avoided.) <br/>
- * - The name must be consistent across calls and reasonably unique for the package
- * type. Collisions can occur but should be rare. <br/>
- * - Different package types should have a clearly different name pattern. <br/>
- * - The revision number should not be included, as this would prevent updates
- * from being automated (which is the whole point.) <br/>
- * - It must remain reasonably human readable. <br/>
- * - If no such id can exist (for example for a local package that cannot be installed)
- * then an empty string should be returned. Don't return null.
- * <p/>
- * Important: This is <em>not</em> a strong unique identifier for the package.
- * If you need a strong unique identifier, you should use {@link #comparisonKey()}
- * and the {@link Comparable} interface.
- */
- public abstract String installId();
-
- /**
- * Returns the short description of the source, if not null.
- * Otherwise returns the default Object toString result.
- * <p/>
- * This is mostly helpful for debugging.
- * For UI display, use the {@link IDescription} interface.
- */
- @Override
- public String toString() {
- String s = getShortDescription();
- if (s != null) {
- return s;
- }
- return super.toString();
- }
-
- /**
- * Returns a description of this package that is suitable for a list display.
- * Should not be empty. Must never be null.
- * <p/>
- * Note that this is the "base" name for the package
- * with no specific revision nor API mentionned.
- * In contrast, {@link #getShortDescription()} should be used if you want more details
- * such as the package revision number or the API, if applicable.
- */
- public abstract String getListDescription();
-
- /**
- * Returns a short description for an {@link IDescription}.
- * Can be empty but not null.
- */
- @Override
- public abstract String getShortDescription();
-
- /**
- * Returns a long description for an {@link IDescription}.
- * Can be empty but not null.
- */
- @Override
- public String getLongDescription() {
- StringBuilder sb = new StringBuilder();
-
- String s = getDescription();
- if (s != null) {
- sb.append(s);
- }
- if (sb.length() > 0) {
- sb.append("\n");
- }
-
- sb.append(String.format("Revision %1$s%2$s",
- getRevision().toShortString(),
- isObsolete() ? " (Obsolete)" : ""));
-
- s = getDescUrl();
- if (s != null && s.length() > 0) {
- sb.append(String.format("\n\nMore information at %1$s", s));
- }
-
- s = getReleaseNote();
- if (s != null && s.length() > 0) {
- sb.append("\n\nRelease note:\n").append(s);
- }
-
- s = getReleaseNoteUrl();
- if (s != null && s.length() > 0) {
- sb.append("\nRelease note URL: ").append(s);
- }
-
- return sb.toString();
- }
-
- /**
- * A package is local (that is 'installed locally') if it contains a single
- * archive that is local. If not local, it's a remote package, only available
- * on a remote source for download and installation.
- */
- public boolean isLocal() {
- return mArchives.length == 1 && mArchives[0].isLocal();
- }
-
- /**
- * Computes a potential installation folder if an archive of this package were
- * to be installed right away in the given SDK root.
- * <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. <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.
- * @return A new {@link File} corresponding to the directory to use to install this package.
- */
- public abstract File getInstallFolder(String osSdkRoot, SdkManager sdkManager);
-
- /**
- * Hook called right before an archive is installed. The archive has already
- * been downloaded successfully and will be installed in the directory specified by
- * <var>installFolder</var> when this call returns.
- * <p/>
- * The hook lets the package decide if installation of this specific archive should
- * 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.
- * @param osSdkRoot The OS path of the SDK root folder.
- * @param installFolder The folder where the archive will be installed. Note that this
- * is <em>not</em> the folder where the archive was temporary
- * unzipped. The installFolder, if it exists, contains the old
- * archive that will soon be replaced by the new one.
- * @return True if installing this archive shall continue, false if it should be skipped.
- */
- public boolean preInstallHook(Archive archive, ITaskMonitor monitor,
- String osSdkRoot, File installFolder) {
- // Nothing to do in base class.
- return true;
- }
-
- /**
- * Hook called right after a file has been unzipped (during an install).
- * <p/>
- * The base class implementation makes sure to properly adjust set executable
- * permission on Linux and MacOS system if the zip entry was marked as +x.
- *
- * @param archive The archive that is being installed.
- * @param monitor The {@link ITaskMonitor} to display errors.
- * @param fileOp The {@link IFileOp} used by the archive installer.
- * @param unzippedFile The file that has just been unzipped in the install temp directory.
- * @param zipEntry The {@link ZipArchiveEntry} that has just been unzipped.
- */
- public void postUnzipFileHook(
- Archive archive,
- ITaskMonitor monitor,
- IFileOp fileOp,
- File unzippedFile,
- ZipArchiveEntry zipEntry) {
-
- // if needed set the permissions.
- if (sUsingUnixPerm && fileOp.isFile(unzippedFile)) {
- // get the mode and test if it contains the executable bit
- int mode = zipEntry.getUnixMode();
- if ((mode & 0111) != 0) {
- try {
- fileOp.setExecutablePermission(unzippedFile);
- } catch (IOException ignore) {}
- }
- }
-
- }
-
- /**
- * Hook called right after an archive has been installed.
- *
- * @param archive The archive that has been installed.
- * @param monitor The {@link ITaskMonitor} to display errors.
- * @param installFolder The folder where the archive was successfully installed.
- * Null if the installation failed, in case the archive needs to
- * do some cleanup after <code>preInstallHook</code>.
- */
- public void postInstallHook(Archive archive, ITaskMonitor monitor, File installFolder) {
- // Nothing to do in base class.
- }
-
- /**
- * Returns whether the give package represents the same item as the current package.
- * <p/>
- * Two packages are considered the same if they represent the same thing, except for the
- * revision number.
- * @param pkg the package to compare.
- * @return true if the item as equivalent.
- */
- public abstract boolean sameItemAs(Package pkg);
-
- /**
- * Computes whether the given package is a suitable update for the current package.
- * <p/>
- * An update is just that: a new package that supersedes the current one. If the new
- * package does not represent the same item or if it has the same or lower revision as the
- * current one, it's not an update.
- *
- * @param replacementPackage The potential replacement package.
- * @return One of the {@link UpdateInfo} values.
- *
- * @see #sameItemAs(Package)
- */
- public abstract UpdateInfo canBeUpdatedBy(Package replacementPackage);
-
- /**
- * Returns an ordering <b>suitable for display</b> like this: <br/>
- * - Tools <br/>
- * - Platform-Tools <br/>
- * - Docs. <br/>
- * - Platform n preview <br/>
- * - Platform n <br/>
- * - Platform n-1 <br/>
- * - Samples packages <br/>
- * - Add-on based on n preview <br/>
- * - 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/>
- * The order done here is suitable for display, and this may not be the appropriate
- * order when comparing whether packages are equal or of greater revision -- if you need
- * to compare revisions, then use {@link #getRevision()}{@code .compareTo(rev)} directly.
- * <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.
- * <p/>
- * <em>Important</em>: Derived classes should consider overriding {@link #comparisonKey()}
- * instead of this method.
- */
- @Override
- public int compareTo(Package other) {
- String s1 = this.comparisonKey();
- String s2 = other.comparisonKey();
-
- int r = s1.compareTo(s2);
- return r;
- }
-
- /**
- * Computes a comparison key for each package used by {@link #compareTo(Package)}.
- * The key is a string.
- * The base package class return a string that encodes the package type,
- * the revision number and the platform version, if applicable, in the form:
- * <pre>
- * t:N|v:NNNN.P|r:NNNN|
- * </pre>
- * All fields must start by a "letter colon" prefix and end with a vertical pipe (|, ASCII 124).
- * <p/>
- * The string format <em>may</em> change between releases and clients should not
- * store them outside of the session or expect them to be consistent between
- * different releases. They are purely an internal implementation details of the
- * {@link #compareTo(Package)} method.
- * <p/>
- * Derived classes should get the string from the super class and then append
- * or <em>insert</em> their own |-separated content.
- * For example an extra vendor name & path can be inserted before the revision
- * number, since it has more sorting weight.
- */
- protected String comparisonKey() {
-
- StringBuilder sb = new StringBuilder();
-
- sb.append("t:"); //$NON-NLS-1$
- if (this instanceof ToolPackage) {
- sb.append(0);
- } else if (this instanceof PlatformToolPackage) {
- sb.append(1);
- } else if (this instanceof DocPackage) {
- sb.append(2);
- } else if (this instanceof PlatformPackage) {
- sb.append(3);
- } else if (this instanceof SamplePackage) {
- sb.append(4);
- } else if (this instanceof SystemImagePackage) {
- sb.append(5);
- } else if (this instanceof AddonPackage) {
- sb.append(6);
- } else {
- // extras and everything else
- sb.append(9);
- }
-
-
- // We insert the package version here because it is more important
- // than the revision number.
- // In the list display, we want package version to be sorted
- // top-down, so we'll use 10k-api as the sorting key. The day we
- // reach 10k APIs, we'll need to revisit this.
- sb.append("|v:"); //$NON-NLS-1$
- if (this instanceof IAndroidVersionProvider) {
- AndroidVersion v = ((IAndroidVersionProvider) this).getAndroidVersion();
-
- sb.append(String.format("%1$04d.%2$d", //$NON-NLS-1$
- 10000 - v.getApiLevel(),
- v.isPreview() ? 1 : 0
- ));
- }
-
- // Append revision number
- sb.append("|r:"); //$NON-NLS-1$
- FullRevision rev = getRevision();
- sb.append(rev.getMajor()).append('.')
- .append(rev.getMinor()).append('.')
- .append(rev.getMicro()).append('.');
- // Hack: When comparing packages for installation purposes, we want to treat
- // "final releases" packages as more important than rc/preview packages.
- // However like for the API level above, when sorting for list display purposes
- // we want the final release package listed before its rc/preview packages.
- if (rev.isPreview()) {
- sb.append(rev.getPreview());
- } else {
- sb.append('0'); // 0=Final (!preview), to make "18.0" < "18.1" (18 Final < 18 RC1)
- }
-
- sb.append('|');
- return sb.toString();
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + Arrays.hashCode(mArchives);
- result = prime * result + ((mObsolete == null) ? 0 : mObsolete.hashCode());
- result = prime * result + getRevision().hashCode();
- result = prime * result + ((mSource == null) ? 0 : mSource.hashCode());
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null) {
- return false;
- }
- if (!(obj instanceof Package)) {
- return false;
- }
- Package other = (Package) obj;
- if (!Arrays.equals(mArchives, other.mArchives)) {
- return false;
- }
- if (mObsolete == null) {
- if (other.mObsolete != null) {
- return false;
- }
- } else if (!mObsolete.equals(other.mObsolete)) {
- return false;
- }
- if (!getRevision().equals(other.getRevision())) {
- return false;
- }
- if (mSource == null) {
- if (other.mSource != null) {
- return false;
- }
- } else if (!mSource.equals(other.mSource)) {
- return false;
- }
- return true;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/PackageParserUtils.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/PackageParserUtils.java
deleted file mode 100755
index a6986e1..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/PackageParserUtils.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.repository.SdkRepoConstants;
-
-import org.w3c.dom.Node;
-
-/**
- * Misc utilities to help extracting elements and attributes out of an XML document.
- */
-public class PackageParserUtils {
-
- /**
- * Parses a full revision element such as <revision> or <min-tools-rev>.
- * This supports both the single-integer format as well as the full revision
- * format with major/minor/micro/preview sub-elements.
- *
- * @param revisionNode The node to parse.
- * @return A new {@link FullRevision}. If parsing failed, major is set to
- * {@link FullRevision#MISSING_MAJOR_REV}.
- */
- public static FullRevision parseFullRevisionElement(Node revisionNode) {
- // This needs to support two modes:
- // - For repository XSD >= 7, <revision> contains sub-elements such as <major> or <minor>.
- // - Otherwise for repository XSD < 7, <revision> contains an integer.
- // The <major> element is mandatory, so it's easy to distinguish between both cases.
- int major = FullRevision.MISSING_MAJOR_REV,
- minor = FullRevision.IMPLICIT_MINOR_REV,
- micro = FullRevision.IMPLICIT_MICRO_REV,
- preview = FullRevision.NOT_A_PREVIEW;
-
- if (revisionNode != null) {
- if (PackageParserUtils.findChildElement(revisionNode,
- SdkRepoConstants.NODE_MAJOR_REV) != null) {
- // <revision> has a <major> sub-element, so it's a repository XSD >= 7.
- major = PackageParserUtils.getXmlInt(revisionNode,
- SdkRepoConstants.NODE_MAJOR_REV, FullRevision.MISSING_MAJOR_REV);
- minor = PackageParserUtils.getXmlInt(revisionNode,
- SdkRepoConstants.NODE_MINOR_REV, FullRevision.IMPLICIT_MINOR_REV);
- micro = PackageParserUtils.getXmlInt(revisionNode,
- SdkRepoConstants.NODE_MICRO_REV, FullRevision.IMPLICIT_MICRO_REV);
- preview = PackageParserUtils.getXmlInt(revisionNode,
- SdkRepoConstants.NODE_PREVIEW, FullRevision.NOT_A_PREVIEW);
- } else {
- try {
- String majorStr = revisionNode.getTextContent().trim();
- major = Integer.parseInt(majorStr);
- } catch (Exception e) {
- }
- }
- }
-
- return new FullRevision(major, minor, micro, preview);
- }
-
- /**
- * Returns the first child element with the given XML local name.
- * If xmlLocalName is null, returns the very first child element.
- */
- public static Node findChildElement(Node node, String xmlLocalName) {
- if (node != null) {
- String nsUri = node.getNamespaceURI();
- for(Node child = node.getFirstChild(); child != null; child = child.getNextSibling()) {
- if (child.getNodeType() == Node.ELEMENT_NODE &&
- nsUri.equals(child.getNamespaceURI())) {
- if (xmlLocalName == null || xmlLocalName.equals(child.getLocalName())) {
- return child;
- }
- }
- }
- }
- return null;
- }
-
- /**
- * Retrieves the value of that XML element as a string.
- * Returns an empty string whether the element is missing or empty,
- * so you can't tell the difference.
- * <p/>
- * Note: use {@link #getOptionalXmlString(Node, String)} if you need to know when the
- * element is missing versus empty.
- *
- * @param node The XML <em>parent</em> node to parse.
- * @param xmlLocalName The XML local name to find in the parent node.
- * @return The text content of the element. Returns an empty string whether the element
- * is missing or empty, so you can't tell the difference.
- */
- public static String getXmlString(Node node, String xmlLocalName) {
- Node child = findChildElement(node, xmlLocalName);
-
- return child == null ? "" : child.getTextContent(); //$NON-NLS-1$
- }
-
- /**
- * Retrieves the value of that XML element as a string.
- * Returns null when the element is missing, so you can tell between a missing element
- * and an empty one.
- * <p/>
- * Note: use {@link #getXmlString(Node, String)} if you don't need to know when the
- * element is missing versus empty.
- *
- * @param node The XML <em>parent</em> node to parse.
- * @param xmlLocalName The XML local name to find in the parent node.
- * @return The text content of the element. Returns null when the element is missing.
- * Returns an empty string whether the element is present but empty.
- */
- public static String getOptionalXmlString(Node node, String xmlLocalName) {
- Node child = findChildElement(node, xmlLocalName);
-
- return child == null ? null : child.getTextContent(); //$NON-NLS-1$
- }
-
- /**
- * Retrieves the value of that XML element as an integer.
- * Returns the default value when the element is missing or is not an integer.
- */
- public static int getXmlInt(Node node, String xmlLocalName, int defaultValue) {
- String s = getXmlString(node, xmlLocalName);
- try {
- return Integer.parseInt(s);
- } catch (NumberFormatException e) {
- return defaultValue;
- }
- }
-
- /**
- * Retrieves the value of that XML element as a long.
- * Returns the default value when the element is missing or is not an integer.
- */
- public static long getXmlLong(Node node, String xmlLocalName, long defaultValue) {
- String s = getXmlString(node, xmlLocalName);
- try {
- return Long.parseLong(s);
- } catch (NumberFormatException e) {
- return defaultValue;
- }
- }
-
- /**
- * Retrieve an attribute which value must match one of the given enums using a
- * case-insensitive name match.
- *
- * Returns defaultValue if the attribute does not exist or its value does not match
- * the given enum values.
- */
- public static Object getEnumAttribute(
- Node archiveNode,
- String attrName,
- Object[] values,
- Object defaultValue) {
-
- Node attr = archiveNode.getAttributes().getNamedItem(attrName);
- if (attr != null) {
- String found = attr.getNodeValue();
- for (Object value : values) {
- if (value.toString().equalsIgnoreCase(found)) {
- return value;
- }
- }
- }
-
- return defaultValue;
- }
-
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/PlatformPackage.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/PlatformPackage.java
deleted file mode 100755
index 71d91ef..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/PlatformPackage.java
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.VisibleForTesting;
-import com.android.annotations.VisibleForTesting.Visibility;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.internal.repository.IDescription;
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.repository.PkgProps;
-import com.android.sdklib.repository.SdkRepoConstants;
-import com.android.utils.Pair;
-
-import org.w3c.dom.Node;
-
-import java.io.File;
-import java.util.Map;
-import java.util.Properties;
-
-/**
- * Represents a platform XML node in an SDK repository.
- */
-public class PlatformPackage extends MinToolsPackage
- implements IAndroidVersionProvider, ILayoutlibVersion {
-
- /** The package version, for platform, add-on and doc packages. */
- private final AndroidVersion mVersion;
-
- /** The version, a string, for platform packages. */
- private final String mVersionName;
-
- /** The ABI of the system-image included in this platform. Can be null but not empty. */
- private final String mIncludedAbi;
-
- /** The helper handling the layoutlib version. */
- private final LayoutlibVersionMixin mLayoutlibVersion;
-
- /**
- * Creates a new platform package from the attributes and elements of the given XML node.
- * This constructor should throw an exception if the package cannot be created.
- *
- * @param source The {@link SdkSource} where this is loaded from.
- * @param packageNode The XML element being parsed.
- * @param nsUri The namespace URI of the originating XML document, to be able to deal with
- * parameters that vary according to the originating XML schema.
- * @param licenses The licenses loaded from the XML originating document.
- */
- public PlatformPackage(
- SdkSource source,
- Node packageNode,
- String nsUri,
- Map<String,String> licenses) {
- super(source, packageNode, nsUri, licenses);
-
- mVersionName =
- PackageParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_VERSION);
-
- int apiLevel =
- PackageParserUtils.getXmlInt (packageNode, SdkRepoConstants.NODE_API_LEVEL, 0);
- String codeName =
- PackageParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_CODENAME);
- if (codeName.length() == 0) {
- codeName = null;
- }
- mVersion = new AndroidVersion(apiLevel, codeName);
-
- mIncludedAbi = PackageParserUtils.getOptionalXmlString(packageNode,
- SdkRepoConstants.NODE_ABI_INCLUDED);
-
- mLayoutlibVersion = new LayoutlibVersionMixin(packageNode);
- }
-
- /**
- * Creates a new platform package based on an actual {@link IAndroidTarget} (which
- * must have {@link IAndroidTarget#isPlatform()} true) from the {@link SdkManager}.
- * This is used to list local SDK folders in which case there is one archive which
- * URL is the actual target location.
- * <p/>
- * By design, this creates a package with one and only one archive.
- */
- public static Package create(IAndroidTarget target, Properties props) {
- return new PlatformPackage(target, props);
- }
-
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected PlatformPackage(IAndroidTarget target, Properties props) {
- this(null /*source*/, target, props);
- }
-
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected PlatformPackage(SdkSource source, IAndroidTarget target, Properties props) {
- super( source, //source
- props, //properties
- target.getRevision(), //revision
- null, //license
- target.getDescription(), //description
- null, //descUrl
- Os.getCurrentOs(), //archiveOs
- Arch.getCurrentArch(), //archiveArch
- target.getLocation() //archiveOsPath
- );
-
- mVersion = target.getVersion();
- mVersionName = target.getVersionName();
- mLayoutlibVersion = new LayoutlibVersionMixin(props);
- mIncludedAbi = props == null ? null : props.getProperty(PkgProps.PLATFORM_INCLUDED_ABI);
- }
-
- /**
- * Save the properties of the current packages in the given {@link Properties} object.
- * These properties will later be given to a constructor that takes a {@link Properties} object.
- */
- @Override
- public void saveProperties(Properties props) {
- super.saveProperties(props);
-
- mVersion.saveProperties(props);
- mLayoutlibVersion.saveProperties(props);
-
- if (mVersionName != null) {
- props.setProperty(PkgProps.PLATFORM_VERSION, mVersionName);
- }
-
- if (mIncludedAbi != null) {
- props.setProperty(PkgProps.PLATFORM_INCLUDED_ABI, mIncludedAbi);
- }
-
- }
-
- /** Returns the version, a string, for platform packages. */
- public String getVersionName() {
- return mVersionName;
- }
-
- /** Returns the package version, for platform, add-on and doc packages. */
- @Override @NonNull
- public AndroidVersion getAndroidVersion() {
- return mVersion;
- }
-
- /**
- * Returns the ABI of the system-image included in this platform.
- *
- * @return Null if the platform does not include any system-image.
- * Otherwise should be a valid non-empty ABI string (e.g. "x86" or "armeabi-v7a").
- */
- public String getIncludedAbi() {
- return mIncludedAbi;
- }
-
- /**
- * Returns the layoutlib version. Mandatory starting with repository XSD rev 4.
- * <p/>
- * The first integer is the API of layoublib, which should be > 0.
- * It will be equal to {@link ILayoutlibVersion#LAYOUTLIB_API_NOT_SPECIFIED} (0)
- * if the layoutlib version isn't specified.
- * <p/>
- * The second integer is the revision for that given API. It is >= 0
- * and works as a minor revision number, incremented for the same API level.
- *
- * @since sdk-repository-4.xsd
- */
- @Override
- public Pair<Integer, Integer> getLayoutlibVersion() {
- return mLayoutlibVersion.getLayoutlibVersion();
- }
-
- /**
- * Returns a string identifier to install this package from the command line.
- * For platforms, we use "android-N" where N is the API or the preview codename.
- * <p/>
- * {@inheritDoc}
- */
- @Override
- public String installId() {
- return "android-" + mVersion.getApiString(); //$NON-NLS-1$
- }
-
- /**
- * Returns a description of this package that is suitable for a list display.
- * <p/>
- * {@inheritDoc}
- */
- @Override
- public String getListDescription() {
- String s;
-
- if (mVersion.isPreview()) {
- s = String.format("SDK Platform Android %1$s Preview%2$s",
- getVersionName(),
- isObsolete() ? " (Obsolete)" : ""); //$NON-NLS-2$
- } else {
- s = String.format("SDK Platform Android %1$s%2$s",
- getVersionName(),
- isObsolete() ? " (Obsolete)" : ""); //$NON-NLS-2$
- }
-
- return s;
- }
-
- /**
- * Returns a short description for an {@link IDescription}.
- */
- @Override
- public String getShortDescription() {
- String s;
-
- if (mVersion.isPreview()) {
- s = String.format("SDK Platform Android %1$s Preview, revision %2$s%3$s",
- getVersionName(),
- getRevision().toShortString(),
- isObsolete() ? " (Obsolete)" : ""); //$NON-NLS-2$
- } else {
- s = String.format("SDK Platform Android %1$s, API %2$d, revision %3$s%4$s",
- getVersionName(),
- mVersion.getApiLevel(),
- getRevision().toShortString(),
- isObsolete() ? " (Obsolete)" : ""); //$NON-NLS-2$
- }
-
- return s;
- }
-
- /**
- * Returns a long description for an {@link IDescription}.
- *
- * The long description is whatever the XML contains for the <description> field,
- * or the short description if the former is empty.
- */
- @Override
- public String getLongDescription() {
- String s = getDescription();
- if (s == null || s.length() == 0) {
- s = getShortDescription();
- }
-
- if (s.indexOf("revision") == -1) {
- s += String.format("\nRevision %1$s%2$s",
- getRevision().toShortString(),
- isObsolete() ? " (Obsolete)" : "");
- }
-
- return s;
- }
-
- /**
- * Computes a potential installation folder if an archive of this package were
- * to be installed right away in the given SDK root.
- * <p/>
- * A platform package is typically installed in SDK/platforms/android-"version".
- * However if we can find a different directory under SDK/platform that already
- * has this platform version installed, we'll use that one.
- *
- * @param osSdkRoot The OS path of the SDK root folder.
- * @param sdkManager An existing SDK manager to list current platforms and addons.
- * @return A new {@link File} corresponding to the directory to use to install this package.
- */
- @Override
- public File getInstallFolder(String osSdkRoot, SdkManager sdkManager) {
-
- // First find if this platform is already installed. If so, reuse the same directory.
- for (IAndroidTarget target : sdkManager.getTargets()) {
- if (target.isPlatform() && target.getVersion().equals(mVersion)) {
- return new File(target.getLocation());
- }
- }
-
- File platforms = new File(osSdkRoot, SdkConstants.FD_PLATFORMS);
- File folder = new File(platforms,
- String.format("android-%s", getAndroidVersion().getApiString())); //$NON-NLS-1$
-
- return folder;
- }
-
- @Override
- public boolean sameItemAs(Package pkg) {
- if (pkg instanceof PlatformPackage) {
- PlatformPackage newPkg = (PlatformPackage)pkg;
-
- // check they are the same version.
- return newPkg.getAndroidVersion().equals(this.getAndroidVersion());
- }
-
- return false;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = super.hashCode();
- result = prime * result +
- ((mLayoutlibVersion == null) ? 0 : mLayoutlibVersion.hashCode());
- result = prime * result + ((mVersion == null) ? 0 : mVersion.hashCode());
- result = prime * result + ((mVersionName == null) ? 0 : mVersionName.hashCode());
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (!super.equals(obj)) {
- return false;
- }
- if (!(obj instanceof PlatformPackage)) {
- return false;
- }
- PlatformPackage other = (PlatformPackage) obj;
- if (mLayoutlibVersion == null) {
- if (other.mLayoutlibVersion != null) {
- return false;
- }
- } else if (!mLayoutlibVersion.equals(other.mLayoutlibVersion)) {
- return false;
- }
- if (mVersion == null) {
- if (other.mVersion != null) {
- return false;
- }
- } else if (!mVersion.equals(other.mVersion)) {
- return false;
- }
- if (mVersionName == null) {
- if (other.mVersionName != null) {
- return false;
- }
- } else if (!mVersionName.equals(other.mVersionName)) {
- return false;
- }
- return true;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/PlatformToolPackage.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/PlatformToolPackage.java
deleted file mode 100755
index c46e940..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/PlatformToolPackage.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.SdkConstants;
-import com.android.annotations.VisibleForTesting;
-import com.android.annotations.VisibleForTesting.Visibility;
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.internal.repository.AdbWrapper;
-import com.android.sdklib.internal.repository.IDescription;
-import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-
-import org.w3c.dom.Node;
-
-import java.io.File;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-
-/**
- * Represents a platform-tool XML node in an SDK repository.
- */
-public class PlatformToolPackage extends FullRevisionPackage {
-
- /** The value returned by {@link PlatformToolPackage#installId()}. */
- public static final String INSTALL_ID = "platform-tools"; //$NON-NLS-1$
- /** The value returned by {@link PlatformToolPackage#installId()}. */
- public static final String INSTALL_ID_PREVIEW = "platform-tools-preview"; //$NON-NLS-1$
-
- /**
- * Creates a new platform-tool package from the attributes and elements of the given XML node.
- * This constructor should throw an exception if the package cannot be created.
- *
- * @param source The {@link SdkSource} where this is loaded from.
- * @param packageNode The XML element being parsed.
- * @param nsUri The namespace URI of the originating XML document, to be able to deal with
- * parameters that vary according to the originating XML schema.
- * @param licenses The licenses loaded from the XML originating document.
- */
- public PlatformToolPackage(SdkSource source, Node packageNode,
- String nsUri, Map<String,String> licenses) {
- super(source, packageNode, nsUri, licenses);
- }
-
- /**
- * Manually create a new package with one archive and the given attributes or properties.
- * This is used to create packages from local directories in which case there must be
- * one archive which URL is the actual target location.
- * <p/>
- * By design, this creates a package with one and only one archive.
- */
- public static Package create(
- SdkSource source,
- Properties props,
- int revision,
- String license,
- String description,
- String descUrl,
- Os archiveOs,
- Arch archiveArch,
- String archiveOsPath) {
-
- PlatformToolPackage ptp = new PlatformToolPackage(source, props, revision, license,
- description, descUrl, archiveOs, archiveArch, archiveOsPath);
-
- File platformToolsFolder = new File(archiveOsPath);
- String error = null;
- if (!platformToolsFolder.isDirectory()) {
- error = "platform-tools folder is missing";
- } else {
- File[] files = platformToolsFolder.listFiles();
- if (files == null || files.length == 0) {
- error = "platform-tools folder is empty";
- } else {
- Set<String> names = new HashSet<String>();
- for (File file : files) {
- names.add(file.getName());
- }
- for (String name : new String[] { SdkConstants.FN_ADB,
- SdkConstants.FN_AAPT,
- SdkConstants.FN_AIDL,
- SdkConstants.FN_DX } ) {
- if (!names.contains(name)) {
- if (error == null) {
- error = "platform-tools folder is missing ";
- } else {
- error += ", ";
- }
- error += name;
- }
- }
- }
- }
-
- if (error != null) {
- String shortDesc = ptp.getShortDescription() + " [*]"; //$NON-NLS-1$
-
- String longDesc = String.format(
- "Broken Platform-Tools Package: %1$s\n" +
- "[*] Package cannot be used due to error: %2$s",
- description,
- error);
-
- BrokenPackage ba = new BrokenPackage(props, shortDesc, longDesc,
- IMinApiLevelDependency.MIN_API_LEVEL_NOT_SPECIFIED,
- IExactApiLevelDependency.API_LEVEL_INVALID,
- archiveOsPath);
- return ba;
- }
-
-
- return ptp;
- }
-
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected PlatformToolPackage(
- SdkSource source,
- Properties props,
- int revision,
- String license,
- String description,
- String descUrl,
- Os archiveOs,
- Arch archiveArch,
- String archiveOsPath) {
- super(source,
- props,
- revision,
- license,
- description,
- descUrl,
- archiveOs,
- archiveArch,
- archiveOsPath);
- }
-
- /**
- * Returns a string identifier to install this package from the command line.
- * For platform-tools, we use "platform-tools" or "platform-tools-preview" since
- * this package type is unique.
- * <p/>
- * {@inheritDoc}
- */
- @Override
- public String installId() {
- if (getRevision().isPreview()) {
- return INSTALL_ID_PREVIEW;
- } else {
- return INSTALL_ID;
- }
- }
-
- /**
- * Returns a description of this package that is suitable for a list display.
- * <p/>
- * {@inheritDoc}
- */
- @Override
- public String getListDescription() {
- return String.format("Android SDK Platform-tools%1$s",
- isObsolete() ? " (Obsolete)" : "");
- }
-
- /**
- * Returns a short description for an {@link IDescription}.
- */
- @Override
- public String getShortDescription() {
- return String.format("Android SDK Platform-tools, revision %1$s%2$s",
- getRevision().toShortString(),
- isObsolete() ? " (Obsolete)" : "");
- }
-
- /** Returns a long description for an {@link IDescription}. */
- @Override
- public String getLongDescription() {
- String s = getDescription();
- if (s == null || s.length() == 0) {
- s = getShortDescription();
- }
-
- if (s.indexOf("revision") == -1) {
- s += String.format("\nRevision %1$s%2$s",
- getRevision().toShortString(),
- isObsolete() ? " (Obsolete)" : "");
- }
-
- return s;
- }
-
- /**
- * Computes a potential installation folder if an archive of this package were
- * to be installed right away in the given SDK root.
- * <p/>
- * A "tool" package should always be located in SDK/tools.
- *
- * @param osSdkRoot The OS path of the SDK root folder.
- * @param sdkManager An existing SDK manager to list current platforms and addons.
- * @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, SdkConstants.FD_PLATFORM_TOOLS);
- }
-
- /**
- * Check whether 2 platform-tool packages are the same <em>and</em> have the
- * same preview bit.
- */
- @Override
- public boolean sameItemAs(Package pkg) {
- return sameItemAs(pkg, false /*ignorePreviews*/);
- }
-
- @Override
- public boolean sameItemAs(Package pkg, boolean ignorePreviews) {
- // only one platform-tool package so any platform-tool package is the same item.
- if (pkg instanceof PlatformToolPackage) {
- if (ignorePreviews) {
- return true;
- } else {
- // however previews can only match previews by default, unless we ignore that check.
- return ((PlatformToolPackage) pkg).getRevision().isPreview() ==
- getRevision().isPreview();
- }
- }
- return false;
- }
-
- /**
- * Hook called right before an archive is installed.
- * This is used here to stop ADB before trying to replace the platform-tool package.
- *
- * @param archive The archive that will be installed
- * @param monitor The {@link ITaskMonitor} to display errors.
- * @param osSdkRoot The OS path of the SDK root folder.
- * @param installFolder The folder where the archive will be installed. Note that this
- * is <em>not</em> the folder where the archive was temporary
- * unzipped. The installFolder, if it exists, contains the old
- * archive that will soon be replaced by the new one.
- * @return True if installing this archive shall continue, false if it should be skipped.
- */
- @Override
- public boolean preInstallHook(Archive archive, ITaskMonitor monitor,
- String osSdkRoot, File installFolder) {
- AdbWrapper aw = new AdbWrapper(osSdkRoot, monitor);
- aw.stopAdb();
- return super.preInstallHook(archive, monitor, osSdkRoot, installFolder);
- }
-
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/SamplePackage.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/SamplePackage.java
deleted file mode 100755
index 06eabb9..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/SamplePackage.java
+++ /dev/null
@@ -1,536 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.AndroidVersion.AndroidVersionException;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.internal.repository.IDescription;
-import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.io.IFileOp;
-import com.android.sdklib.repository.PkgProps;
-import com.android.sdklib.repository.SdkRepoConstants;
-
-import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
-import org.w3c.dom.Node;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.Map;
-import java.util.Properties;
-
-/**
- * Represents a sample XML node in an SDK repository.
- */
-public class SamplePackage extends MinToolsPackage
- implements IAndroidVersionProvider, IMinApiLevelDependency {
-
- /** The matching platform version. */
- private final AndroidVersion mVersion;
-
- /**
- * The minimal API level required by this extra package, if > 0,
- * or {@link #MIN_API_LEVEL_NOT_SPECIFIED} if there is no such requirement.
- */
- private final int mMinApiLevel;
-
- /**
- * Creates a new sample package from the attributes and elements of the given XML node.
- * This constructor should throw an exception if the package cannot be created.
- *
- * @param source The {@link SdkSource} where this is loaded from.
- * @param packageNode The XML element being parsed.
- * @param nsUri The namespace URI of the originating XML document, to be able to deal with
- * parameters that vary according to the originating XML schema.
- * @param licenses The licenses loaded from the XML originating document.
- */
- public SamplePackage(SdkSource source,
- Node packageNode,
- String nsUri,
- Map<String,String> licenses) {
- super(source, packageNode, nsUri, licenses);
-
- int apiLevel =
- PackageParserUtils.getXmlInt (packageNode, SdkRepoConstants.NODE_API_LEVEL, 0);
- String codeName =
- PackageParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_CODENAME);
- if (codeName.length() == 0) {
- codeName = null;
- }
- mVersion = new AndroidVersion(apiLevel, codeName);
-
- mMinApiLevel = PackageParserUtils.getXmlInt(packageNode,
- SdkRepoConstants.NODE_MIN_API_LEVEL,
- MIN_API_LEVEL_NOT_SPECIFIED);
- }
-
- /**
- * Creates a new sample package based on an actual {@link IAndroidTarget} (which
- * must have {@link IAndroidTarget#isPlatform()} true) from the {@link SdkManager}.
- * <p/>
- * The target <em>must</em> have an existing sample directory that uses the /samples
- * root form rather than the old form where the samples dir was located under the
- * platform dir.
- * <p/>
- * This is used to list local SDK folders in which case there is one archive which
- * URL is the actual samples path location.
- * <p/>
- * By design, this creates a package with one and only one archive.
- */
- public static Package create(IAndroidTarget target, Properties props) {
- return new SamplePackage(target, props);
- }
-
- private SamplePackage(IAndroidTarget target, Properties props) {
- super( null, //source
- props, //properties
- 0, //revision will be taken from props
- null, //license
- null, //description
- null, //descUrl
- Os.ANY, //archiveOs
- Arch.ANY, //archiveArch
- target.getPath(IAndroidTarget.SAMPLES) //archiveOsPath
- );
-
- mVersion = target.getVersion();
-
- mMinApiLevel = getPropertyInt(props, PkgProps.SAMPLE_MIN_API_LEVEL,
- MIN_API_LEVEL_NOT_SPECIFIED);
- }
-
- /**
- * Creates a new sample package from an actual directory path and previously
- * saved properties.
- * <p/>
- * This is used to list local SDK folders in which case there is one archive which
- * URL is the actual samples path location.
- * <p/>
- * By design, this creates a package with one and only one archive.
- *
- * @throws AndroidVersionException if the {@link AndroidVersion} can't be restored
- * from properties.
- */
- public static Package create(String archiveOsPath, Properties props)
- throws AndroidVersionException {
- return new SamplePackage(archiveOsPath, props);
- }
-
- private SamplePackage(String archiveOsPath, Properties props) throws AndroidVersionException {
- super(null, //source
- props, //properties
- 0, //revision will be taken from props
- null, //license
- null, //description
- null, //descUrl
- Os.ANY, //archiveOs
- Arch.ANY, //archiveArch
- archiveOsPath //archiveOsPath
- );
-
- mVersion = new AndroidVersion(props);
-
- mMinApiLevel = getPropertyInt(props, PkgProps.SAMPLE_MIN_API_LEVEL,
- MIN_API_LEVEL_NOT_SPECIFIED);
- }
-
- /**
- * Save the properties of the current packages in the given {@link Properties} object.
- * These properties will later be given to a constructor that takes a {@link Properties} object.
- */
- @Override
- public void saveProperties(Properties props) {
- super.saveProperties(props);
-
- mVersion.saveProperties(props);
-
- if (getMinApiLevel() != MIN_API_LEVEL_NOT_SPECIFIED) {
- props.setProperty(PkgProps.SAMPLE_MIN_API_LEVEL, Integer.toString(getMinApiLevel()));
- }
- }
-
- /**
- * Returns the minimal API level required by this extra package, if > 0,
- * or {@link #MIN_API_LEVEL_NOT_SPECIFIED} if there is no such requirement.
- */
- @Override
- public int getMinApiLevel() {
- return mMinApiLevel;
- }
-
- /** Returns the matching platform version. */
- @Override @NonNull
- public AndroidVersion getAndroidVersion() {
- return mVersion;
- }
-
- /**
- * Returns a string identifier to install this package from the command line.
- * For samples, we use "sample-N" where N is the API or the preview codename.
- * <p/>
- * {@inheritDoc}
- */
- @Override
- public String installId() {
- return "sample-" + mVersion.getApiString(); //$NON-NLS-1$
- }
-
- /**
- * Returns a description of this package that is suitable for a list display.
- * <p/>
- * {@inheritDoc}
- */
- @Override
- public String getListDescription() {
- String s = String.format("Samples for SDK API %1$s%2$s%3$s",
- mVersion.getApiString(),
- mVersion.isPreview() ? " Preview" : "",
- isObsolete() ? " (Obsolete)" : "");
- return s;
- }
-
- /**
- * Returns a short description for an {@link IDescription}.
- */
- @Override
- public String getShortDescription() {
- String s = String.format("Samples for SDK API %1$s%2$s, revision %3$s%4$s",
- mVersion.getApiString(),
- mVersion.isPreview() ? " Preview" : "",
- getRevision().toShortString(),
- isObsolete() ? " (Obsolete)" : "");
- return s;
- }
-
- /**
- * Returns a long description for an {@link IDescription}.
- *
- * The long description is whatever the XML contains for the <description> field,
- * or the short description if the former is empty.
- */
- @Override
- public String getLongDescription() {
- String s = getDescription();
- if (s == null || s.length() == 0) {
- s = getShortDescription();
- }
-
- if (s.indexOf("revision") == -1) {
- s += String.format("\nRevision %1$s%2$s",
- getRevision().toShortString(),
- isObsolete() ? " (Obsolete)" : "");
- }
-
- return s;
- }
-
- /**
- * Computes a potential installation folder if an archive of this package were
- * to be installed right away in the given SDK root.
- * <p/>
- * A sample package is typically installed in SDK/samples/android-"version".
- * However if we can find a different directory that already has this sample
- * version installed, we'll use that one.
- *
- * @param osSdkRoot The OS path of the SDK root folder.
- * @param sdkManager An existing SDK manager to list current platforms and addons.
- * @return A new {@link File} corresponding to the directory to use to install this package.
- */
- @Override
- public File getInstallFolder(String osSdkRoot, SdkManager sdkManager) {
-
- // The /samples dir at the root of the SDK
- File samplesRoot = new File(osSdkRoot, SdkConstants.FD_SAMPLES);
-
- // 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)) {
- String p = target.getPath(IAndroidTarget.SAMPLES);
- File f = new File(p);
- if (f.isDirectory()) {
- // 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 folder = new File(samplesRoot,
- String.format("android-%s", getAndroidVersion().getApiString())); //$NON-NLS-1$
-
- for (int n = 1; folder.exists(); n++) {
- // Keep trying till we find an unused directory.
- folder = new File(samplesRoot,
- String.format("android-%s_%d", getAndroidVersion().getApiString(), n)); //$NON-NLS-1$
- }
-
- return folder;
- }
-
- @Override
- public boolean sameItemAs(Package pkg) {
- if (pkg instanceof SamplePackage) {
- SamplePackage newPkg = (SamplePackage)pkg;
-
- // check they are the same version.
- return newPkg.getAndroidVersion().equals(this.getAndroidVersion());
- }
-
- return false;
- }
-
- /**
- * Makes sure the base /samples folder exists before installing.
- *
- * {@inheritDoc}
- */
- @Override
- public boolean preInstallHook(Archive archive,
- ITaskMonitor monitor,
- String osSdkRoot,
- File installFolder) {
-
- if (installFolder != null && installFolder.isDirectory()) {
- // Get the hash computed during the last installation
- String storedHash = readContentHash(installFolder);
- if (storedHash != null && storedHash.length() > 0) {
-
- // Get the hash of the folder now
- String currentHash = computeContentHash(installFolder);
-
- if (!storedHash.equals(currentHash)) {
- // The hashes differ. The content was modified.
- // Ask the user if we should still wipe the old samples.
-
- String pkgName = archive.getParentPackage().getShortDescription();
-
- String msg = String.format(
- "-= Warning ! =-\n" +
- "You are about to replace the content of the folder:\n " +
- " %1$s\n" +
- "by the new package:\n" +
- " %2$s.\n" +
- "\n" +
- "However it seems that the content of the existing samples " +
- "has been modified since it was last installed. Are you sure " +
- "you want to DELETE the existing samples? This cannot be undone.\n" +
- "Please select YES to delete the existing sample and replace them " +
- "by the new ones.\n" +
- "Please select NO to skip this package. You can always install it later.",
- installFolder.getAbsolutePath(),
- pkgName);
-
- // Returns true if we can wipe & replace.
- return monitor.displayPrompt("SDK Manager: overwrite samples?", msg);
- }
- }
- }
-
- // The default is to allow installation
- return super.preInstallHook(archive, monitor, osSdkRoot, installFolder);
- }
-
- /**
- * Computes a hash of the installed content (in case of successful install.)
- *
- * {@inheritDoc}
- */
- @Override
- public void postInstallHook(Archive archive, ITaskMonitor monitor, File installFolder) {
- super.postInstallHook(archive, monitor, installFolder);
-
- if (installFolder != null) {
- String h = computeContentHash(installFolder);
- saveContentHash(installFolder, h);
- }
- }
-
- /**
- * Set all the files from a sample package as read-only so that
- * users don't end up modifying sources by mistake in Eclipse
- * (samples are copied if using the NPW > Create from sample.)
- */
- @Override
- public void postUnzipFileHook(
- Archive archive,
- ITaskMonitor monitor,
- IFileOp fileOp,
- File unzippedFile,
- ZipArchiveEntry zipEntry) {
- super.postUnzipFileHook(archive, monitor, fileOp, unzippedFile, zipEntry);
-
- if (fileOp.isFile(unzippedFile) &&
- !SdkConstants.FN_SOURCE_PROP.equals(unzippedFile.getName())) {
- fileOp.setReadOnly(unzippedFile);
- }
- }
-
- /**
- * Reads the hash from the properties file, if it exists.
- * Returns null if something goes wrong, e.g. there's no property file or
- * it doesn't contain our hash. Returns an empty string if the hash wasn't
- * correctly computed last time by {@link #saveContentHash(File, String)}.
- */
- private String readContentHash(File folder) {
- Properties props = new Properties();
-
- FileInputStream fis = null;
- try {
- File f = new File(folder, SdkConstants.FN_CONTENT_HASH_PROP);
- if (f.isFile()) {
- fis = new FileInputStream(f);
- props.load(fis);
- return props.getProperty("content-hash", null); //$NON-NLS-1$
- }
- } catch (Exception e) {
- // ignore
- } finally {
- if (fis != null) {
- try {
- fis.close();
- } catch (IOException e) {
- }
- }
- }
-
- return null;
- }
-
- /**
- * Saves the hash using a properties file
- */
- private void saveContentHash(File folder, String hash) {
- Properties props = new Properties();
-
- props.setProperty("content-hash", hash == null ? "" : hash); //$NON-NLS-1$ //$NON-NLS-2$
-
- FileOutputStream fos = null;
- try {
- File f = new File(folder, SdkConstants.FN_CONTENT_HASH_PROP);
- fos = new FileOutputStream(f);
- props.store( fos, "## Android - hash of this archive."); //$NON-NLS-1$
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- if (fos != null) {
- try {
- fos.close();
- } catch (IOException e) {
- }
- }
- }
- }
-
- /**
- * Computes a hash of the files names and sizes installed in the folder
- * using the SHA-1 digest.
- * Returns null if the digest algorithm is not available.
- */
- private String computeContentHash(File installFolder) {
- MessageDigest md = null;
- try {
- // SHA-1 is a standard algorithm.
- // http://java.sun.com/j2se/1.4.2/docs/guide/security/CryptoSpec.html#AppB
- md = MessageDigest.getInstance("SHA-1"); //$NON-NLS-1$
- } catch (NoSuchAlgorithmException e) {
- // We're unlikely to get there unless this JVM is not spec conforming
- // in which case there won't be any hash available.
- }
-
- if (md != null) {
- hashDirectoryContent(installFolder, md);
- return getDigestHexString(md);
- }
-
- return null;
- }
-
- /**
- * Computes a hash of the *content* of this directory. The hash only uses
- * the files names and the file sizes.
- */
- private void hashDirectoryContent(File folder, MessageDigest md) {
- if (folder == null || md == null || !folder.isDirectory()) {
- return;
- }
-
- for (File f : folder.listFiles()) {
- if (f.isDirectory()) {
- hashDirectoryContent(f, md);
-
- } else {
- String name = f.getName();
-
- // Skip the file we use to store the content hash
- if (name == null || SdkConstants.FN_CONTENT_HASH_PROP.equals(name)) {
- continue;
- }
-
- try {
- md.update(name.getBytes("UTF-8")); //$NON-NLS-1$
- } catch (UnsupportedEncodingException e) {
- // There is no valid reason for UTF-8 to be unsupported. Ignore.
- }
- try {
- long len = f.length();
- md.update((byte) (len & 0x0FF));
- md.update((byte) ((len >> 8) & 0x0FF));
- md.update((byte) ((len >> 16) & 0x0FF));
- md.update((byte) ((len >> 24) & 0x0FF));
-
- } catch (SecurityException e) {
- // Might happen if file is not readable. Ignore.
- }
- }
- }
- }
-
- /**
- * Returns a digest as an hex string.
- */
- private String getDigestHexString(MessageDigest digester) {
- // Create an hex string from the digest
- byte[] digest = digester.digest();
- int n = digest.length;
- String hex = "0123456789abcdef"; //$NON-NLS-1$
- char[] hexDigest = new char[n * 2];
- for (int i = 0; i < n; i++) {
- int b = digest[i] & 0x0FF;
- hexDigest[i*2 + 0] = hex.charAt(b >>> 4);
- hexDigest[i*2 + 1] = hex.charAt(b & 0x0f);
- }
-
- return new String(hexDigest);
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/SourcePackage.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/SourcePackage.java
deleted file mode 100755
index fb38f40..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/SourcePackage.java
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.VisibleForTesting;
-import com.android.annotations.VisibleForTesting.Visibility;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.AndroidVersion.AndroidVersionException;
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.internal.repository.IDescription;
-import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.io.IFileOp;
-import com.android.sdklib.repository.SdkRepoConstants;
-
-import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
-import org.w3c.dom.Node;
-
-import java.io.File;
-import java.util.Map;
-import java.util.Properties;
-
-/**
- * Represents a source XML node in an SDK repository.
- * <p/>
- * Note that a source package has a version and thus implements {@link IAndroidVersionProvider}.
- * However there is no mandatory dependency that limits installation so this does not
- * implement {@link IPlatformDependency}.
- */
-public class SourcePackage extends MajorRevisionPackage implements IAndroidVersionProvider {
-
- /** The package version, for platform, add-on and doc packages. */
- private final AndroidVersion mVersion;
-
- /**
- * Creates a new source package from the attributes and elements of the given XML node.
- * This constructor should throw an exception if the package cannot be created.
- *
- * @param source The {@link SdkSource} where this is loaded from.
- * @param packageNode The XML element being parsed.
- * @param nsUri The namespace URI of the originating XML document, to be able to deal with
- * parameters that vary according to the originating XML schema.
- * @param licenses The licenses loaded from the XML originating document.
- */
- public SourcePackage(SdkSource source,
- Node packageNode,
- String nsUri,
- Map<String,String> licenses) {
- super(source, packageNode, nsUri, licenses);
-
- int apiLevel =
- PackageParserUtils.getXmlInt(packageNode, SdkRepoConstants.NODE_API_LEVEL, 0);
- String codeName =
- PackageParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_CODENAME);
- if (codeName.length() == 0) {
- codeName = null;
- }
- mVersion = new AndroidVersion(apiLevel, codeName);
- }
-
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected SourcePackage(
- AndroidVersion platformVersion,
- int revision,
- Properties props,
- String localOsPath) {
- this(null /*source*/, platformVersion, revision, props, localOsPath);
- }
-
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected SourcePackage(
- SdkSource source,
- AndroidVersion platformVersion,
- int revision,
- Properties props,
- String localOsPath) {
- super( source, //source
- props, //properties
- revision, //revision
- null, //license
- null, //description
- null, //descUrl
- Os.getCurrentOs(), //archiveOs
- Arch.getCurrentArch(), //archiveArch
- localOsPath //archiveOsPath
- );
- mVersion = platformVersion;
- }
-
- /**
- * Creates either a valid {@link SourcePackage} or a {@link BrokenPackage}.
- * <p/>
- * If the source directory contains valid properties, this creates a new {@link SourcePackage}
- * with the android version listed in the properties.
- * Otherwise returns a new {@link BrokenPackage} with some explanation on what failed.
- *
- * @param srcDir The SDK/sources/android-N folder
- * @param props The properties located in {@code srcDir} or null if not found.
- * @return A new {@link SourcePackage} or a new {@link BrokenPackage}.
- */
- public static Package create(File srcDir, Properties props) {
- AndroidVersion version = null;
- String error = null;
-
- // Try to load the android version from the sources.props.
- // If we don't find them, it would explain why this package is broken.
- if (props == null) {
- error = String.format("Missing file %1$s", SdkConstants.FN_SOURCE_PROP);
- } else {
- try {
- 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, srcDir.getAbsolutePath());
- } catch (AndroidVersionException e) {
- error = String.format("Invalid file %1$s: %2$s",
- SdkConstants.FN_SOURCE_PROP,
- e.getMessage());
- }
- }
-
- if (version == null) {
- try {
- // Try to parse the first number out of the platform folder name.
- // This is just a wild guess in case we can create a broken package using that info.
- String platform = srcDir.getParentFile().getName();
- platform = platform.replaceAll("[^0-9]+", " ").trim(); //$NON-NLS-1$ //$NON-NLS-2$
- int pos = platform.indexOf(' ');
- if (pos >= 0) {
- platform = platform.substring(0, pos);
- }
- int apiLevel = Integer.parseInt(platform);
- version = new AndroidVersion(apiLevel, null /*codename*/);
- } catch (Exception ignore) {
- }
- }
-
- StringBuilder sb = new StringBuilder("Broken Source Package");
- if (version != null) {
- sb.append(String.format(", API %1$s", version.getApiString()));
- }
-
- String shortDesc = sb.toString();
-
- if (error != null) {
- sb.append('\n').append(error);
- }
-
- String longDesc = sb.toString();
-
- return new BrokenPackage(props, shortDesc, longDesc,
- IMinApiLevelDependency.MIN_API_LEVEL_NOT_SPECIFIED,
- version==null ? IExactApiLevelDependency.API_LEVEL_INVALID : version.getApiLevel(),
- srcDir.getAbsolutePath());
- }
-
- /**
- * Save the properties of the current packages in the given {@link Properties} object.
- * These properties will later be given to a constructor that takes a {@link Properties} object.
- */
- @Override
- public void saveProperties(Properties props) {
- super.saveProperties(props);
- mVersion.saveProperties(props);
- }
-
- /**
- * Returns the android version of this package.
- */
- @Override @NonNull
- public AndroidVersion getAndroidVersion() {
- return mVersion;
- }
-
- /**
- * Returns a string identifier to install this package from the command line.
- * For sources, we use "source-N" where N is the API or the preview codename.
- * <p/>
- * {@inheritDoc}
- */
- @Override
- public String installId() {
- return "source-" + mVersion.getApiString(); //$NON-NLS-1$
- }
-
- /**
- * Returns a description of this package that is suitable for a list display.
- * <p/>
- * {@inheritDoc}
- */
- @Override
- public String getListDescription() {
- if (mVersion.isPreview()) {
- return String.format("Sources for Android '%1$s' Preview SDK%2$s",
- mVersion.getCodename(),
- isObsolete() ? " (Obsolete)" : "");
- } else {
- return String.format("Sources for Android SDK%2$s",
- mVersion.getApiLevel(),
- isObsolete() ? " (Obsolete)" : "");
- }
- }
-
- /**
- * Returns a short description for an {@link IDescription}.
- */
- @Override
- public String getShortDescription() {
- if (mVersion.isPreview()) {
- return String.format("Sources for Android '%1$s' Preview SDK, revision %2$s%3$s",
- mVersion.getCodename(),
- getRevision().toShortString(),
- isObsolete() ? " (Obsolete)" : "");
- } else {
- return String.format("Sources for Android SDK, API %1$d, revision %2$s%3$s",
- mVersion.getApiLevel(),
- getRevision().toShortString(),
- isObsolete() ? " (Obsolete)" : "");
- }
- }
-
- /**
- * Returns a long description for an {@link IDescription}.
- *
- * The long description is whatever the XML contains for the {@code description} field,
- * or the short description if the former is empty.
- */
- @Override
- public String getLongDescription() {
- String s = getDescription();
- if (s == null || s.length() == 0) {
- s = getShortDescription();
- }
-
- if (s.indexOf("revision") == -1) {
- s += String.format("\nRevision %1$s%2$s",
- getRevision().toShortString(),
- isObsolete() ? " (Obsolete)" : "");
- }
-
- return s;
- }
-
- /**
- * Computes a potential installation folder if an archive of this package were
- * to be installed right away in the given SDK root.
- * <p/>
- * A sources package is typically installed in SDK/sources/platform.
- *
- * @param osSdkRoot The OS path of the SDK root folder.
- * @param sdkManager An existing SDK manager to list current platforms and addons.
- * @return A new {@link File} corresponding to the directory to use to install this package.
- */
- @Override
- public File getInstallFolder(String osSdkRoot, SdkManager sdkManager) {
- File folder = new File(osSdkRoot, SdkConstants.FD_PKG_SOURCES);
- folder = new File(folder, "android-" + mVersion.getApiString()); //$NON-NLS-1$
- return folder;
- }
-
- /**
- * Set all the files from a source package as read-only
- * so that users don't end up modifying sources by mistake in Eclipse.
- */
- @Override
- public void postUnzipFileHook(
- Archive archive,
- ITaskMonitor monitor,
- IFileOp fileOp,
- File unzippedFile,
- ZipArchiveEntry zipEntry) {
- super.postUnzipFileHook(archive, monitor, fileOp, unzippedFile, zipEntry);
-
- if (fileOp.isFile(unzippedFile) &&
- !SdkConstants.FN_SOURCE_PROP.equals(unzippedFile.getName())) {
- fileOp.setReadOnly(unzippedFile);
- }
- }
-
- @Override
- public boolean sameItemAs(Package pkg) {
- if (pkg instanceof SourcePackage) {
- SourcePackage newPkg = (SourcePackage)pkg;
-
- // check they are the same version.
- return getAndroidVersion().equals(newPkg.getAndroidVersion());
- }
-
- return false;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = super.hashCode();
- result = prime * result + ((mVersion == null) ? 0 : mVersion.hashCode());
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (!super.equals(obj)) {
- return false;
- }
- if (!(obj instanceof SourcePackage)) {
- return false;
- }
- SourcePackage other = (SourcePackage) obj;
- if (mVersion == null) {
- if (other.mVersion != null) {
- return false;
- }
- } else if (!mVersion.equals(other.mVersion)) {
- return false;
- }
- return true;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/SystemImagePackage.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/SystemImagePackage.java
deleted file mode 100755
index 69335a5..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/SystemImagePackage.java
+++ /dev/null
@@ -1,379 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.android.annotations.VisibleForTesting;
-import com.android.annotations.VisibleForTesting.Visibility;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.AndroidVersion.AndroidVersionException;
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.SystemImage;
-import com.android.sdklib.internal.repository.IDescription;
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.repository.PkgProps;
-import com.android.sdklib.repository.SdkRepoConstants;
-
-import org.w3c.dom.Node;
-
-import java.io.File;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Properties;
-
-/**
- * Represents a system-image XML node in an SDK repository.
- */
-public class SystemImagePackage extends MajorRevisionPackage
- implements IAndroidVersionProvider, IPlatformDependency {
-
- /** The package version, for platform, add-on and doc packages. */
- private final AndroidVersion mVersion;
-
- /** The ABI of the system-image. Must not be null nor empty. */
- private final String mAbi;
-
- /**
- * Creates a new system-image package from the attributes and elements of the given XML node.
- * This constructor should throw an exception if the package cannot be created.
- *
- * @param source The {@link SdkSource} where this is loaded from.
- * @param packageNode The XML element being parsed.
- * @param nsUri The namespace URI of the originating XML document, to be able to deal with
- * parameters that vary according to the originating XML schema.
- * @param licenses The licenses loaded from the XML originating document.
- */
- public SystemImagePackage(SdkSource source,
- Node packageNode,
- String nsUri,
- Map<String,String> licenses) {
- super(source, packageNode, nsUri, licenses);
-
- int apiLevel =
- PackageParserUtils.getXmlInt(packageNode, SdkRepoConstants.NODE_API_LEVEL, 0);
- String codeName =
- PackageParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_CODENAME);
- if (codeName.length() == 0) {
- codeName = null;
- }
- mVersion = new AndroidVersion(apiLevel, codeName);
-
- mAbi = PackageParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_ABI);
- }
-
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- public SystemImagePackage(
- AndroidVersion platformVersion,
- int revision,
- String abi,
- Properties props,
- String localOsPath) {
- this(null /*source*/, platformVersion, revision, abi, props, localOsPath);
- }
-
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected SystemImagePackage(
- SdkSource source,
- AndroidVersion platformVersion,
- int revision,
- String abi,
- Properties props,
- String localOsPath) {
- super( source, //source
- props, //properties
- revision, //revision
- null, //license
- null, //description
- null, //descUrl
- Os.getCurrentOs(), //archiveOs
- Arch.getCurrentArch(), //archiveArch
- localOsPath //archiveOsPath
- );
- mVersion = platformVersion;
- if (abi == null && props != null) {
- abi = props.getProperty(PkgProps.SYS_IMG_ABI);
- }
- assert abi != null : "To use this SystemImagePackage constructor you must pass an ABI as a parameter or as a PROP_ABI property";
- mAbi = abi;
- }
-
- /**
- * Creates a {@link BrokenPackage} representing a system image that failed to load
- * with the regular {@link SdkManager} workflow.
- *
- * @param abiDir The SDK/system-images/android-N/abi folder
- * @param props The properties located in {@code abiDir} or null if not found.
- * @return A new {@link BrokenPackage} that represents this installed package.
- */
- public static Package createBroken(File abiDir, Properties props) {
- AndroidVersion version = null;
- String abiType = abiDir.getName();
- String error = null;
-
- // Try to load the android version & ABI from the sources.props.
- // If we don't find them, it would explain why this package is broken.
- if (props == null) {
- error = String.format("Missing file %1$s", SdkConstants.FN_SOURCE_PROP);
- } else {
- try {
- version = new AndroidVersion(props);
-
- String abi = props.getProperty(PkgProps.SYS_IMG_ABI);
- if (abi != null) {
- abiType = abi;
- } else {
- error = String.format("Invalid file %1$s: Missing property %2$s",
- SdkConstants.FN_SOURCE_PROP,
- PkgProps.SYS_IMG_ABI);
- }
- } catch (AndroidVersionException e) {
- error = String.format("Invalid file %1$s: %2$s",
- SdkConstants.FN_SOURCE_PROP,
- e.getMessage());
- }
- }
-
- if (version == null) {
- try {
- // Try to parse the first number out of the platform folder name.
- String platform = abiDir.getParentFile().getName();
- platform = platform.replaceAll("[^0-9]+", " ").trim(); //$NON-NLS-1$ //$NON-NLS-2$
- int pos = platform.indexOf(' ');
- if (pos >= 0) {
- platform = platform.substring(0, pos);
- }
- int apiLevel = Integer.parseInt(platform);
- version = new AndroidVersion(apiLevel, null /*codename*/);
- } catch (Exception ignore) {
- }
- }
-
- StringBuilder sb = new StringBuilder(
- String.format("Broken %1$s System Image", getAbiDisplayNameInternal(abiType)));
- if (version != null) {
- sb.append(String.format(", API %1$s", version.getApiString()));
- }
-
- String shortDesc = sb.toString();
-
- if (error != null) {
- sb.append('\n').append(error);
- }
-
- String longDesc = sb.toString();
-
- return new BrokenPackage(props, shortDesc, longDesc,
- IMinApiLevelDependency.MIN_API_LEVEL_NOT_SPECIFIED,
- version==null ? IExactApiLevelDependency.API_LEVEL_INVALID : version.getApiLevel(),
- abiDir.getAbsolutePath());
- }
-
- /**
- * Save the properties of the current packages in the given {@link Properties} object.
- * These properties will later be given to a constructor that takes a {@link Properties} object.
- */
- @Override
- public void saveProperties(Properties props) {
- super.saveProperties(props);
-
- mVersion.saveProperties(props);
- props.setProperty(PkgProps.SYS_IMG_ABI, mAbi);
- }
-
- /** Returns the ABI of the system-image. Cannot be null nor empty. */
- public String getAbi() {
- return mAbi;
- }
-
- /** Returns a display-friendly name for the ABI of the system-image. */
- public String getAbiDisplayName() {
- return getAbiDisplayNameInternal(mAbi);
- }
-
- private static String getAbiDisplayNameInternal(String abi) {
- return abi.replace("armeabi", "ARM EABI") //$NON-NLS-1$ //$NON-NLS-2$
- .replace("x86", "Intel x86 Atom") //$NON-NLS-1$ //$NON-NLS-2$
- .replace("mips", "MIPS") //$NON-NLS-1$ //$NON-NLS-2$
- .replace("-", " "); //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- /**
- * Returns the version of the platform dependency of this package.
- * <p/>
- * A system-image has the same {@link AndroidVersion} as the platform it depends on.
- */
- @Override @NonNull
- public AndroidVersion getAndroidVersion() {
- return mVersion;
- }
-
- /**
- * Returns a string identifier to install this package from the command line.
- * For system images, we use "sysimg-N" where N is the API or the preview codename.
- * <p/>
- * {@inheritDoc}
- */
- @Override
- public String installId() {
- return "sysimg-" + mVersion.getApiString(); //$NON-NLS-1$
- }
-
- /**
- * Returns a description of this package that is suitable for a list display.
- * <p/>
- * {@inheritDoc}
- */
- @Override
- public String getListDescription() {
- return String.format("%1$s System Image%2$s",
- getAbiDisplayName(),
- isObsolete() ? " (Obsolete)" : "");
- }
-
- /**
- * Returns a short description for an {@link IDescription}.
- */
- @Override
- public String getShortDescription() {
- return String.format("%1$s System Image, Android API %2$s, revision %3$s%4$s",
- getAbiDisplayName(),
- mVersion.getApiString(),
- getRevision().toShortString(),
- isObsolete() ? " (Obsolete)" : "");
- }
-
- /**
- * Returns a long description for an {@link IDescription}.
- *
- * The long description is whatever the XML contains for the {@code description} field,
- * or the short description if the former is empty.
- */
- @Override
- public String getLongDescription() {
- String s = getDescription();
- if (s == null || s.length() == 0) {
- s = getShortDescription();
- }
-
- if (s.indexOf("revision") == -1) {
- s += String.format("\nRevision %1$s%2$s",
- getRevision().toShortString(),
- isObsolete() ? " (Obsolete)" : "");
- }
-
- s += String.format("\nRequires SDK Platform Android API %1$s",
- mVersion.getApiString());
- return s;
- }
-
- /**
- * Computes a potential installation folder if an archive of this package were
- * to be installed right away in the given SDK root.
- * <p/>
- * A system-image package is typically installed in SDK/systems/platform/abi.
- * The name needs to be sanitized to be acceptable as a directory name.
- *
- * @param osSdkRoot The OS path of the SDK root folder.
- * @param sdkManager An existing SDK manager to list current platforms and addons.
- * @return A new {@link File} corresponding to the directory to use to install this package.
- */
- @Override
- public File getInstallFolder(String osSdkRoot, SdkManager sdkManager) {
- File folder = new File(osSdkRoot, SdkConstants.FD_SYSTEM_IMAGES);
- folder = new File(folder, SystemImage.ANDROID_PREFIX + mVersion.getApiString());
-
- // Computes a folder directory using the sanitized abi string.
- String abi = mAbi;
- abi = abi.toLowerCase(Locale.US);
- abi = abi.replaceAll("[^a-z0-9_-]+", "_"); //$NON-NLS-1$ //$NON-NLS-2$
- abi = abi.replaceAll("_+", "_"); //$NON-NLS-1$ //$NON-NLS-2$
-
- folder = new File(folder, abi);
- return folder;
- }
-
- @Override
- public boolean sameItemAs(Package pkg) {
- if (pkg instanceof SystemImagePackage) {
- SystemImagePackage newPkg = (SystemImagePackage)pkg;
-
- // check they are the same abi and version.
- return getAbi().equals(newPkg.getAbi()) &&
- getAndroidVersion().equals(newPkg.getAndroidVersion());
- }
-
- return false;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = super.hashCode();
- result = prime * result + ((mAbi == null) ? 0 : mAbi.hashCode());
- result = prime * result + ((mVersion == null) ? 0 : mVersion.hashCode());
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (!super.equals(obj)) {
- return false;
- }
- if (!(obj instanceof SystemImagePackage)) {
- return false;
- }
- SystemImagePackage other = (SystemImagePackage) obj;
- if (mAbi == null) {
- if (other.mAbi != null) {
- return false;
- }
- } else if (!mAbi.equals(other.mAbi)) {
- return false;
- }
- if (mVersion == null) {
- if (other.mVersion != null) {
- return false;
- }
- } else if (!mVersion.equals(other.mVersion)) {
- return false;
- }
- return true;
- }
-
- /**
- * For sys img packages, we want to add abi to the sorting key
- * <em>before<em/> the revision number.
- * <p/>
- * {@inheritDoc}
- */
- @Override
- protected String comparisonKey() {
- String s = super.comparisonKey();
- int pos = s.indexOf("|r:"); //$NON-NLS-1$
- assert pos > 0;
- s = s.substring(0, pos) +
- "|abi:" + getAbiDisplayName() + //$NON-NLS-1$
- s.substring(pos);
- return s;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/ToolPackage.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/ToolPackage.java
deleted file mode 100755
index 8084c6b..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/packages/ToolPackage.java
+++ /dev/null
@@ -1,373 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.SdkConstants;
-import com.android.annotations.Nullable;
-import com.android.annotations.VisibleForTesting;
-import com.android.annotations.VisibleForTesting.Visibility;
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.internal.repository.IDescription;
-import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.repository.PkgProps;
-import com.android.sdklib.repository.SdkRepoConstants;
-import com.android.sdklib.util.GrabProcessOutput;
-import com.android.sdklib.util.GrabProcessOutput.IProcessOutput;
-import com.android.sdklib.util.GrabProcessOutput.Wait;
-
-import org.w3c.dom.Node;
-
-import java.io.File;
-import java.util.Map;
-import java.util.Properties;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Represents a tool XML node in an SDK repository.
- */
-public class ToolPackage extends FullRevisionPackage implements IMinPlatformToolsDependency {
-
- /** The value returned by {@link ToolPackage#installId()}. */
- public static final String INSTALL_ID = "tools"; //$NON-NLS-1$
- /** The value returned by {@link ToolPackage#installId()}. */
- private static final String INSTALL_ID_PREVIEW = "tools-preview"; //$NON-NLS-1$
-
- /**
- * The minimal revision of the platform-tools package required by this package
- * or {@link #MIN_PLATFORM_TOOLS_REV_INVALID} if the value was missing.
- */
- private final FullRevision mMinPlatformToolsRevision;
-
- /**
- * Creates a new tool package from the attributes and elements of the given XML node.
- * This constructor should throw an exception if the package cannot be created.
- *
- * @param source The {@link SdkSource} where this is loaded from.
- * @param packageNode The XML element being parsed.
- * @param nsUri The namespace URI of the originating XML document, to be able to deal with
- * parameters that vary according to the originating XML schema.
- * @param licenses The licenses loaded from the XML originating document.
- */
- public ToolPackage(SdkSource source,
- Node packageNode,
- String nsUri,
- Map<String,String> licenses) {
- super(source, packageNode, nsUri, licenses);
-
- mMinPlatformToolsRevision = PackageParserUtils.parseFullRevisionElement(
- PackageParserUtils.findChildElement(packageNode,
- SdkRepoConstants.NODE_MIN_PLATFORM_TOOLS_REV));
-
- if (mMinPlatformToolsRevision.equals(MIN_PLATFORM_TOOLS_REV_INVALID)) {
- // This revision number is mandatory starting with sdk-repository-3.xsd
- // and did not exist before. Complain if the URI has level >= 3.
-
- boolean needRevision = false;
-
- Pattern nsPattern = Pattern.compile(SdkRepoConstants.NS_PATTERN);
- Matcher m = nsPattern.matcher(nsUri);
- if (m.matches()) {
- String version = m.group(1);
- try {
- needRevision = Integer.parseInt(version) >= 3;
- } catch (NumberFormatException e) {
- // ignore. needRevision defaults to false
- }
- }
-
- if (needRevision) {
- throw new IllegalArgumentException(
- String.format("Missing %1$s element in %2$s package",
- SdkRepoConstants.NODE_MIN_PLATFORM_TOOLS_REV,
- SdkRepoConstants.NODE_PLATFORM_TOOL));
- }
- }
- }
-
- /**
- * Manually create a new package with one archive and the given attributes or properties.
- * This is used to create packages from local directories in which case there must be
- * one archive which URL is the actual target location.
- * <p/>
- * By design, this creates a package with one and only one archive.
- */
- public static Package create(
- SdkSource source,
- Properties props,
- int revision,
- String license,
- String description,
- String descUrl,
- Os archiveOs,
- Arch archiveArch,
- String archiveOsPath) {
- return new ToolPackage(source, props, revision, license, description,
- descUrl, archiveOs, archiveArch, archiveOsPath);
- }
-
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected ToolPackage(
- SdkSource source,
- Properties props,
- int revision,
- String license,
- String description,
- String descUrl,
- Os archiveOs,
- Arch archiveArch,
- String archiveOsPath) {
- super(source,
- props,
- revision,
- license,
- description,
- descUrl,
- archiveOs,
- archiveArch,
- archiveOsPath);
-
- String revStr = getProperty(props, PkgProps.MIN_PLATFORM_TOOLS_REV, null);
-
- FullRevision rev = MIN_PLATFORM_TOOLS_REV_INVALID;
- if (revStr != null) {
- try {
- rev = FullRevision.parseRevision(revStr);
- } catch (NumberFormatException ignore) {}
- }
-
- mMinPlatformToolsRevision = rev;
- }
-
- /**
- * The minimal revision of the tools package required by this package if > 0,
- * or {@link #MIN_PLATFORM_TOOLS_REV_INVALID} if the value was missing.
- * <p/>
- * This attribute is mandatory and should not be normally missing.
- */
- @Override
- public FullRevision getMinPlatformToolsRevision() {
- return mMinPlatformToolsRevision;
- }
-
- /**
- * Returns a string identifier to install this package from the command line.
- * For tools, we use "tools" or "tools-preview" since this package is unique.
- * <p/>
- * {@inheritDoc}
- */
- @Override
- public String installId() {
- if (getRevision().isPreview()) {
- return INSTALL_ID_PREVIEW;
- } else {
- return INSTALL_ID;
- }
- }
-
- /**
- * Returns a description of this package that is suitable for a list display.
- * <p/>
- * {@inheritDoc}
- */
- @Override
- public String getListDescription() {
- return String.format("Android SDK Tools%1$s",
- isObsolete() ? " (Obsolete)" : "");
- }
-
- /**
- * Returns a short description for an {@link IDescription}.
- */
- @Override
- public String getShortDescription() {
- return String.format("Android SDK Tools, revision %1$s%2$s",
- getRevision().toShortString(),
- isObsolete() ? " (Obsolete)" : "");
- }
-
- /** Returns a long description for an {@link IDescription}. */
- @Override
- public String getLongDescription() {
- String s = getDescription();
- if (s == null || s.length() == 0) {
- s = getShortDescription();
- }
-
- if (s.indexOf("revision") == -1) {
- s += String.format("\nRevision %1$s%2$s",
- getRevision().toShortString(),
- isObsolete() ? " (Obsolete)" : "");
- }
-
- return s;
- }
-
- /**
- * Computes a potential installation folder if an archive of this package were
- * to be installed right away in the given SDK root.
- * <p/>
- * A "tool" package should always be located in SDK/tools.
- *
- * @param osSdkRoot The OS path of the SDK root folder.
- * @param sdkManager An existing SDK manager to list current platforms and addons.
- * @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, SdkConstants.FD_TOOLS);
- }
-
- /**
- * Check whether 2 tool packages are the same <em>and</em> have the
- * same preview bit.
- */
- @Override
- public boolean sameItemAs(Package pkg) {
- // Only one tool package so any tool package is the same item
- return sameItemAs(pkg, false /*ignorePreviews*/);
- }
-
- @Override
- public boolean sameItemAs(Package pkg, boolean ignorePreviews) {
- // only one tool package so any tool package is the same item.
- if (pkg instanceof ToolPackage) {
- if (ignorePreviews) {
- return true;
- } else {
- // however previews can only match previews by default, unless we ignore that check.
- return ((ToolPackage) pkg).getRevision().isPreview() ==
- getRevision().isPreview();
- }
- }
- return false;
- }
-
- @Override
- public void saveProperties(Properties props) {
- super.saveProperties(props);
-
- if (!getMinPlatformToolsRevision().equals(MIN_PLATFORM_TOOLS_REV_INVALID)) {
- props.setProperty(PkgProps.MIN_PLATFORM_TOOLS_REV,
- getMinPlatformToolsRevision().toShortString());
- }
- }
-
- /**
- * The tool package executes tools/lib/post_tools_install[.bat|.sh]
- * {@inheritDoc}
- */
- @Override
- public void postInstallHook(Archive archive, final ITaskMonitor monitor, File installFolder) {
- super.postInstallHook(archive, monitor, installFolder);
-
- if (installFolder == null) {
- return;
- }
-
- File libDir = new File(installFolder, SdkConstants.FD_LIB);
- if (!libDir.isDirectory()) {
- return;
- }
-
- String scriptName = "post_tools_install"; //$NON-NLS-1$
- String shell = ""; //$NON-NLS-1$
- if (SdkConstants.currentPlatform() == SdkConstants.PLATFORM_WINDOWS) {
- shell = "cmd.exe /c "; //$NON-NLS-1$
- scriptName += ".bat"; //$NON-NLS-1$
- } else {
- scriptName += ".sh"; //$NON-NLS-1$
- }
-
- File scriptFile = new File(libDir, scriptName);
- if (!scriptFile.isFile()) {
- return;
- }
-
- int status = -1;
-
- try {
- Process proc = Runtime.getRuntime().exec(
- shell + scriptName, // command
- null, // environment
- libDir); // working dir
-
- final String tag = scriptName;
- status = GrabProcessOutput.grabProcessOutput(
- proc,
- Wait.WAIT_FOR_PROCESS,
- new IProcessOutput() {
- @Override
- public void out(@Nullable String line) {
- if (line != null) {
- monitor.log("[%1$s] %2$s", tag, line);
- }
- }
-
- @Override
- public void err(@Nullable String line) {
- if (line != null) {
- monitor.logError("[%1$s] Error: %2$s", tag, line);
- }
- }
- });
-
- } catch (Exception e) {
- monitor.logError("Exception: %s", e.toString());
- }
-
- if (status != 0) {
- monitor.logError("Failed to execute %s", scriptName);
- return;
- }
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = super.hashCode();
- result = prime * result
- + ((mMinPlatformToolsRevision == null) ? 0 : mMinPlatformToolsRevision.hashCode());
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (!super.equals(obj)) {
- return false;
- }
- if (!(obj instanceof ToolPackage)) {
- return false;
- }
- ToolPackage other = (ToolPackage) obj;
- if (mMinPlatformToolsRevision == null) {
- if (other.mMinPlatformToolsRevision != null) {
- return false;
- }
- } else if (!mMinPlatformToolsRevision.equals(other.mMinPlatformToolsRevision)) {
- return false;
- }
- return true;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/sources/SdkAddonSource.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/sources/SdkAddonSource.java
deleted file mode 100755
index 98bfc5a..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/sources/SdkAddonSource.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sources;
-
-import com.android.annotations.Nullable;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.repository.SdkAddonConstants;
-
-import org.w3c.dom.Document;
-
-import java.io.InputStream;
-
-
-/**
- * An sdk-addon source, i.e. a download site for addons and extra packages.
- * A repository describes one or more {@link Package}s available for download.
- */
-public class SdkAddonSource extends SdkSource {
-
- /**
- * Constructs a new source for the given repository URL.
- * @param url The source URL. Cannot be null. If the URL ends with a /, the default
- * addon.xml filename will be appended automatically.
- * @param uiName The UI-visible name of the source. Can be null.
- */
- public SdkAddonSource(String url, String uiName) {
- super(url, uiName);
- }
-
- /**
- * Returns true if this is an addon source.
- * We only load addons and extras from these sources.
- */
- @Override
- public boolean isAddonSource() {
- return true;
- }
-
- /**
- * Returns true if this is a system-image source.
- * We only load system-images from these sources.
- */
- @Override
- public boolean isSysImgSource() {
- return false;
- }
-
-
- @Override
- protected String[] getDefaultXmlFileUrls() {
- return new String[] { SdkAddonConstants.URL_DEFAULT_FILENAME };
- }
-
- @Override
- protected int getNsLatestVersion() {
- return SdkAddonConstants.NS_LATEST_VERSION;
- }
-
- @Override
- protected String getNsUri() {
- return SdkAddonConstants.NS_URI;
- }
-
- @Override
- protected String getNsPattern() {
- return SdkAddonConstants.NS_PATTERN;
- }
-
- @Override
- protected String getSchemaUri(int version) {
- return SdkAddonConstants.getSchemaUri(version);
- }
-
- @Override
- protected String getRootElementName() {
- return SdkAddonConstants.NODE_SDK_ADDON;
- }
-
- @Override
- protected InputStream getXsdStream(int version) {
- return SdkAddonConstants.getXsdStream(version);
- }
-
- /**
- * This kind of schema does not support forward-evolution of the <tool> element.
- *
- * @param xml The input XML stream. Can be null.
- * @return Always null.
- * @null This implementation always return null.
- */
- @Override
- protected Document findAlternateToolsXml(@Nullable InputStream xml) {
- return null;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/sources/SdkRepoSource.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/sources/SdkRepoSource.java
deleted file mode 100755
index 09913ed..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/sources/SdkRepoSource.java
+++ /dev/null
@@ -1,524 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sources;
-
-import com.android.annotations.Nullable;
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.internal.repository.packages.PackageParserUtils;
-import com.android.sdklib.repository.RepoConstants;
-import com.android.sdklib.repository.SdkRepoConstants;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-import org.xml.sax.ErrorHandler;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.regex.Pattern;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-
-/**
- * An sdk-repository source, i.e. a download site.
- * A repository describes one or more {@link Package}s available for download.
- */
-public class SdkRepoSource extends SdkSource {
-
- /**
- * Constructs a new source for the given repository URL.
- * @param url The source URL. Cannot be null. If the URL ends with a /, the default
- * repository.xml filename will be appended automatically.
- * @param uiName The UI-visible name of the source. Can be null.
- */
- public SdkRepoSource(String url, String uiName) {
- super(url, uiName);
- }
-
- /**
- * Returns true if this is an addon source.
- * We only load addons and extras from these sources.
- */
- @Override
- public boolean isAddonSource() {
- return false;
- }
-
- /**
- * Returns true if this is a system-image source.
- * We only load system-images from these sources.
- */
- @Override
- public boolean isSysImgSource() {
- return false;
- }
-
- private static String[] sDefaults = null; // lazily allocated in getDefaultXmlFileUrls
-
- @Override
- protected String[] getDefaultXmlFileUrls() {
- if (sDefaults == null) {
- sDefaults = new String[SdkRepoConstants.NS_LATEST_VERSION
- - SdkRepoConstants.NS_SERVER_MIN_VERSION
- + 2];
- int k = 0;
- for (int i = SdkRepoConstants.NS_LATEST_VERSION;
- i >= SdkRepoConstants.NS_SERVER_MIN_VERSION;
- i--) {
- sDefaults[k++] = String.format(SdkRepoConstants.URL_FILENAME_PATTERN, i);
- }
- sDefaults[k++] = SdkRepoConstants.URL_DEFAULT_FILENAME;
- assert k == sDefaults.length;
- }
-
- return sDefaults;
- }
-
- @Override
- protected int getNsLatestVersion() {
- return SdkRepoConstants.NS_LATEST_VERSION;
- }
-
- @Override
- protected String getNsUri() {
- return SdkRepoConstants.NS_URI;
- }
-
- @Override
- protected String getNsPattern() {
- return SdkRepoConstants.NS_PATTERN;
- }
-
- @Override
- protected String getSchemaUri(int version) {
- return SdkRepoConstants.getSchemaUri(version);
- }
-
- @Override
- protected String getRootElementName() {
- return SdkRepoConstants.NODE_SDK_REPOSITORY;
- }
-
- @Override
- protected InputStream getXsdStream(int version) {
- return SdkRepoConstants.getXsdStream(version);
- }
-
- /**
- * The purpose of this method is to support forward evolution of our schema.
- * <p/>
- * At this point, we know that xml does not point to any schema that this version of
- * the tool knows how to process, so it's not one of the possible 1..N versions of our
- * XSD schema.
- * <p/>
- * We thus try to interpret the byte stream as a possible XML stream. It may not be
- * one at all in the first place. If it looks anything line an XML schema, we try to
- * find its <tool> and the <platform-tools> elements. If we find any,
- * we recreate a suitable document that conforms to what we expect from our XSD schema
- * with only those elements.
- * <p/>
- * To be valid, the <tool> and the <platform-tools> elements must have at
- * least one <archive> compatible with this platform.
- * <p/>
- * Starting the sdk-repository schema v3, <tools> has a <min-platform-tools-rev>
- * node, so technically the corresponding XML schema will be usable only if there's a
- * <platform-tools> with the request revision number. We don't enforce that here, as
- * this is done at install time.
- * <p/>
- * If we don't find anything suitable, we drop the whole thing.
- *
- * @param xml The input XML stream. Can be null.
- * @return Either a new XML document conforming to our schema with at least one <tool>
- * and <platform-tools> element or null.
- * @throws IOException if InputStream.reset() fails
- * @null Can return null on failure.
- */
- @Override
- protected Document findAlternateToolsXml(@Nullable InputStream xml) throws IOException {
- return findAlternateToolsXml(xml, null /*errorHandler*/);
- }
-
- /**
- * An alternate version of {@link #findAlternateToolsXml(InputStream)} that allows
- * the caller to specify the XML error handler. The default from the underlying Java
- * XML Xerces parser will dump to stdout/stderr, which is not convenient during unit tests.
- *
- * @param xml The input XML stream. Can be null.
- * @param errorHandler An optional XML error handler. If null, the default will be used.
- * @return Either a new XML document conforming to our schema with at least one <tool>
- * and <platform-tools> element or null.
- * @throws IOException if InputStream.reset() fails
- * @null Can return null on failure.
- * @see #findAlternateToolsXml(InputStream) findAlternateToolsXml() provides more details.
- */
- protected Document findAlternateToolsXml(
- @Nullable InputStream xml,
- @Nullable ErrorHandler errorHandler)
- throws IOException {
- if (xml == null) {
- return null;
- }
-
- // Reset the stream if it supports that operation.
- assert xml.markSupported();
- xml.reset();
-
- // Get an XML document
-
- Document oldDoc = null;
- Document newDoc = null;
- try {
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- factory.setIgnoringComments(false);
- factory.setValidating(false);
-
- // Parse the old document using a non namespace aware builder
- factory.setNamespaceAware(false);
- DocumentBuilder builder = factory.newDocumentBuilder();
-
- if (errorHandler != null) {
- builder.setErrorHandler(errorHandler);
- }
-
- oldDoc = builder.parse(xml);
-
- // Prepare a new document using a namespace aware builder
- factory.setNamespaceAware(true);
- builder = factory.newDocumentBuilder();
- newDoc = builder.newDocument();
-
- } catch (Exception e) {
- // Failed to get builder factor
- // Failed to create XML document builder
- // Failed to parse XML document
- // Failed to read XML document
- }
-
- if (oldDoc == null || newDoc == null) {
- return null;
- }
-
-
- // Check the root element is an XML with at least the following properties:
- // <sdk:sdk-repository
- // xmlns:sdk="http://schemas.android.com/sdk/android/repository/$N">
- //
- // Note that we don't have namespace support enabled, we just do it manually.
-
- Pattern nsPattern = Pattern.compile(getNsPattern());
-
- Node oldRoot = null;
- String prefix = null;
- for (Node child = oldDoc.getFirstChild(); child != null; child = child.getNextSibling()) {
- if (child.getNodeType() == Node.ELEMENT_NODE) {
- prefix = null;
- String name = child.getNodeName();
- int pos = name.indexOf(':');
- if (pos > 0 && pos < name.length() - 1) {
- prefix = name.substring(0, pos);
- name = name.substring(pos + 1);
- }
- if (SdkRepoConstants.NODE_SDK_REPOSITORY.equals(name)) {
- NamedNodeMap attrs = child.getAttributes();
- String xmlns = "xmlns"; //$NON-NLS-1$
- if (prefix != null) {
- xmlns += ":" + prefix; //$NON-NLS-1$
- }
- Node attr = attrs.getNamedItem(xmlns);
- if (attr != null) {
- String uri = attr.getNodeValue();
- if (uri != null && nsPattern.matcher(uri).matches()) {
- oldRoot = child;
- break;
- }
- }
- }
- }
- }
-
- // we must have found the root node, and it must have an XML namespace prefix.
- if (oldRoot == null || prefix == null || prefix.length() == 0) {
- return null;
- }
-
- final String ns = getNsUri();
- Element newRoot = newDoc.createElementNS(ns, getRootElementName());
- newRoot.setPrefix(prefix);
- newDoc.appendChild(newRoot);
- int numTool = 0;
-
- // Find any inner <tool> or <platform-tool> nodes and extract their required parameters
-
- String[] elementNames = {
- SdkRepoConstants.NODE_TOOL,
- SdkRepoConstants.NODE_PLATFORM_TOOL,
- SdkRepoConstants.NODE_LICENSE
- };
-
- Element element = null;
- while ((element = findChild(oldRoot, element, prefix, elementNames)) != null) {
- boolean isElementValid = false;
-
- String name = element.getLocalName();
- if (name == null) {
- name = element.getNodeName();
-
- int pos = name.indexOf(':');
- if (pos > 0 && pos < name.length() - 1) {
- name = name.substring(pos + 1);
- }
- }
-
- // To be valid, the tool or platform-tool element must have:
- // - a <revision> element with a number
- // - a <min-platform-tools-rev> element with a number for a <tool> element
- // - an <archives> element with one or more <archive> elements inside
- // - one of the <archive> elements must have an "os" and "arch" attributes
- // compatible with the current platform. Only keep the first such element found.
- // - the <archive> element must contain a <size>, a <checksum> and a <url>.
- // - none of the above for a license element
-
- if (SdkRepoConstants.NODE_LICENSE.equals(name)) {
- isElementValid = true;
-
- } else {
- try {
- Node revision = findChild(element, null, prefix, RepoConstants.NODE_REVISION);
- Node archives = findChild(element, null, prefix, RepoConstants.NODE_ARCHIVES);
-
- if (revision == null || archives == null) {
- continue;
- }
-
- // check revision contains a number
- try {
- String content = revision.getTextContent();
- content = content.trim();
- int rev = Integer.parseInt(content);
- if (rev < 1) {
- continue;
- }
- } catch (NumberFormatException ignore) {
- continue;
- }
-
- if (SdkRepoConstants.NODE_TOOL.equals(name)) {
- Node minPTRev = findChild(element, null, prefix,
- RepoConstants.NODE_MIN_PLATFORM_TOOLS_REV);
-
- if (minPTRev == null) {
- continue;
- }
-
- // check min-platform-tools-rev contains a number
- try {
- String content = minPTRev.getTextContent();
- content = content.trim();
- int rev = Integer.parseInt(content);
- if (rev < 1) {
- continue;
- }
- } catch (NumberFormatException ignore) {
- continue;
- }
- }
-
- Node archive = null;
- while ((archive = findChild(archives,
- archive,
- prefix,
- RepoConstants.NODE_ARCHIVE)) != null) {
- try {
- Os os = (Os) PackageParserUtils.getEnumAttribute(archive,
- RepoConstants.ATTR_OS,
- Os.values(),
- null /*default*/);
- Arch arch = (Arch) PackageParserUtils.getEnumAttribute(archive,
- RepoConstants.ATTR_ARCH,
- Arch.values(),
- Arch.ANY);
- if (os == null || !os.isCompatible() ||
- arch == null || !arch.isCompatible()) {
- continue;
- }
-
- Node node = findChild(archive, null, prefix, RepoConstants.NODE_URL);
- String url = node == null ? null : node.getTextContent().trim();
- if (url == null || url.length() == 0) {
- continue;
- }
-
- node = findChild(archive, null, prefix, RepoConstants.NODE_SIZE);
- long size = 0;
- try {
- size = Long.parseLong(node.getTextContent());
- } catch (Exception e) {
- // pass
- }
- if (size < 1) {
- continue;
- }
-
- node = findChild(archive, null, prefix, RepoConstants.NODE_CHECKSUM);
- // double check that the checksum element contains a type=sha1 attribute
- if (node == null) {
- continue;
- }
- NamedNodeMap attrs = node.getAttributes();
- Node typeNode = attrs.getNamedItem(RepoConstants.ATTR_TYPE);
- if (typeNode == null ||
- !RepoConstants.ATTR_TYPE.equals(typeNode.getNodeName()) ||
- !RepoConstants.SHA1_TYPE.equals(typeNode.getNodeValue())) {
- continue;
- }
- String sha1 = node == null ? null : node.getTextContent().trim();
- if (sha1 == null ||
- sha1.length() != RepoConstants.SHA1_CHECKSUM_LEN) {
- continue;
- }
-
- isElementValid = true;
-
- } catch (Exception ignore1) {
- // pass
- }
- } // while <archive>
- } catch (Exception ignore2) {
- // For debugging it is useful to re-throw the exception.
- // For end-users, not so much. It would be nice to make it
- // happen automatically during unit tests.
- if (System.getenv("TESTING") != null) {
- throw new RuntimeException(ignore2);
- }
- }
- }
-
- if (isElementValid) {
- duplicateNode(newRoot, element, SdkRepoConstants.NS_URI, prefix);
- numTool++;
- }
- } // while <tool>
-
- return numTool > 0 ? newDoc : null;
- }
-
- /**
- * Helper method used by {@link #findAlternateToolsXml(InputStream)} to find a given
- * element child in a root XML node.
- */
- private Element findChild(Node rootNode, Node after, String prefix, String[] nodeNames) {
- for (int i = 0; i < nodeNames.length; i++) {
- if (nodeNames[i].indexOf(':') < 0) {
- nodeNames[i] = prefix + ":" + nodeNames[i];
- }
- }
- Node child = after == null ? rootNode.getFirstChild() : after.getNextSibling();
- for(; child != null; child = child.getNextSibling()) {
- if (child.getNodeType() != Node.ELEMENT_NODE) {
- continue;
- }
- for (String nodeName : nodeNames) {
- if (nodeName.equals(child.getNodeName())) {
- return (Element) child;
- }
- }
- }
- return null;
- }
-
- /**
- * Helper method used by {@link #findAlternateToolsXml(InputStream)} to find a given
- * element child in a root XML node.
- */
- private Node findChild(Node rootNode, Node after, String prefix, String nodeName) {
- return findChild(rootNode, after, prefix, new String[] { nodeName });
- }
-
- /**
- * Helper method used by {@link #findAlternateToolsXml(InputStream)} to duplicate a node
- * and attach it to the given root in the new document.
- */
- private Element duplicateNode(Element newRootNode, Element oldNode,
- String namespaceUri, String prefix) {
- // The implementation here is more or less equivalent to
- //
- // newRoot.appendChild(newDoc.importNode(oldNode, deep=true))
- //
- // except we can't just use importNode() since we need to deal with the fact
- // that the old document is not namespace-aware yet the new one is.
-
- Document newDoc = newRootNode.getOwnerDocument();
- Element newNode = null;
-
- String nodeName = oldNode.getNodeName();
- int pos = nodeName.indexOf(':');
- if (pos > 0 && pos < nodeName.length() - 1) {
- nodeName = nodeName.substring(pos + 1);
- newNode = newDoc.createElementNS(namespaceUri, nodeName);
- newNode.setPrefix(prefix);
- } else {
- newNode = newDoc.createElement(nodeName);
- }
-
- newRootNode.appendChild(newNode);
-
- // Merge in all the attributes
- NamedNodeMap attrs = oldNode.getAttributes();
- for (int i = 0; i < attrs.getLength(); i++) {
- Attr attr = (Attr) attrs.item(i);
- Attr newAttr = null;
-
- String attrName = attr.getNodeName();
- pos = attrName.indexOf(':');
- if (pos > 0 && pos < attrName.length() - 1) {
- attrName = attrName.substring(pos + 1);
- newAttr = newDoc.createAttributeNS(namespaceUri, attrName);
- newAttr.setPrefix(prefix);
- } else {
- newAttr = newDoc.createAttribute(attrName);
- }
-
- newAttr.setNodeValue(attr.getNodeValue());
-
- if (pos > 0) {
- newNode.getAttributes().setNamedItemNS(newAttr);
- } else {
- newNode.getAttributes().setNamedItem(newAttr);
- }
- }
-
- // Merge all child elements and texts
- for (Node child = oldNode.getFirstChild(); child != null; child = child.getNextSibling()) {
- if (child.getNodeType() == Node.ELEMENT_NODE) {
- duplicateNode(newNode, (Element) child, namespaceUri, prefix);
-
- } else if (child.getNodeType() == Node.TEXT_NODE) {
- Text newText = newDoc.createTextNode(child.getNodeValue());
- newNode.appendChild(newText);
- }
- }
-
- return newNode;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/sources/SdkSource.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/sources/SdkSource.java
deleted file mode 100755
index 2558e71..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/sources/SdkSource.java
+++ /dev/null
@@ -1,991 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sources;
-
-import com.android.annotations.Nullable;
-import com.android.annotations.VisibleForTesting;
-import com.android.annotations.VisibleForTesting.Visibility;
-import com.android.sdklib.internal.repository.CanceledByUserException;
-import com.android.sdklib.internal.repository.DownloadCache;
-import com.android.sdklib.internal.repository.IDescription;
-import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.packages.AddonPackage;
-import com.android.sdklib.internal.repository.packages.DocPackage;
-import com.android.sdklib.internal.repository.packages.ExtraPackage;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.internal.repository.packages.PlatformPackage;
-import com.android.sdklib.internal.repository.packages.PlatformToolPackage;
-import com.android.sdklib.internal.repository.packages.SamplePackage;
-import com.android.sdklib.internal.repository.packages.SourcePackage;
-import com.android.sdklib.internal.repository.packages.SystemImagePackage;
-import com.android.sdklib.internal.repository.packages.ToolPackage;
-import com.android.sdklib.io.NonClosingInputStream;
-import com.android.sdklib.io.NonClosingInputStream.CloseBehavior;
-import com.android.sdklib.repository.RepoConstants;
-import com.android.sdklib.repository.SdkAddonConstants;
-import com.android.sdklib.repository.SdkRepoConstants;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.net.ssl.SSLKeyException;
-import javax.xml.XMLConstants;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.validation.Schema;
-import javax.xml.validation.SchemaFactory;
-import javax.xml.validation.Validator;
-
-/**
- * An sdk-addon or sdk-repository source, i.e. a download site.
- * It may be a full repository or an add-on only repository.
- * A repository describes one or {@link Package}s available for download.
- */
-public abstract class SdkSource implements IDescription, Comparable<SdkSource> {
-
- private String mUrl;
-
- private Package[] mPackages;
- private String mDescription;
- private String mFetchError;
- private final String mUiName;
-
- private static final SdkSourceProperties sSourcesProps = new SdkSourceProperties();
-
- /**
- * Constructs a new source for the given repository URL.
- * @param url The source URL. Cannot be null. If the URL ends with a /, the default
- * repository.xml filename will be appended automatically.
- * @param uiName The UI-visible name of the source. Can be null.
- */
- public SdkSource(String url, String uiName) {
-
- // URLs should not be null and should not have whitespace.
- if (url == null) {
- url = "";
- }
- url = url.trim();
-
- // if the URL ends with a /, it must be "directory" resource,
- // in which case we automatically add the default file that will
- // 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$
- String[] names = getDefaultXmlFileUrls();
- if (names.length > 0) {
- url += names[0];
- }
- }
-
- if (uiName == null) {
- uiName = sSourcesProps.getProperty(SdkSourceProperties.KEY_NAME, url, null);
- } else {
- sSourcesProps.setProperty(SdkSourceProperties.KEY_NAME, url, uiName);
- }
-
- mUrl = url;
- mUiName = uiName;
- setDefaultDescription();
- }
-
- /**
- * Returns true if this is an addon source.
- * We only load addons and extras from these sources.
- */
- public abstract boolean isAddonSource();
-
- /**
- * Returns true if this is a system-image source.
- * We only load system-images from these sources.
- */
- public abstract boolean isSysImgSource();
-
-
- /**
- * 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();
-
- /** Returns SdkRepoConstants.NS_URI or SdkAddonConstants.NS_URI. */
- protected abstract String getNsUri();
-
- /** Returns SdkRepoConstants.NS_PATTERN or SdkAddonConstants.NS_PATTERN. */
- protected abstract String getNsPattern();
-
- /** Returns SdkRepoConstants.getSchemaUri() or SdkAddonConstants.getSchemaUri(). */
- protected abstract String getSchemaUri(int version);
-
- /* Returns SdkRepoConstants.NODE_SDK_REPOSITORY or SdkAddonConstants.NODE_SDK_ADDON. */
- protected abstract String getRootElementName();
-
- /** Returns SdkRepoConstants.getXsdStream() or SdkAddonConstants.getXsdStream(). */
- protected abstract InputStream getXsdStream(int version);
-
- /**
- * In case we fail to load an XML, examine the XML to see if it matches a <b>future</b>
- * schema that as at least a <code>tools</code> node that we could load to update the
- * SDK Manager.
- *
- * @param xml The input XML stream. Can be null.
- * @return Null on failure, otherwise returns an XML DOM with just the tools we
- * need to update this SDK Manager.
- * @null Can return null on failure.
- */
- protected abstract Document findAlternateToolsXml(@Nullable InputStream xml)
- throws IOException;
-
- /**
- * Two repo source are equal if they have the same URL.
- */
- @Override
- public boolean equals(Object obj) {
- if (obj instanceof SdkSource) {
- SdkSource rs = (SdkSource) obj;
- return rs.getUrl().equals(this.getUrl());
- }
- return false;
- }
-
- @Override
- public int hashCode() {
- return mUrl.hashCode();
- }
-
- /**
- * Implementation of the {@link Comparable} interface.
- * Simply compares the URL using the string's default ordering.
- */
- @Override
- public int compareTo(SdkSource rhs) {
- return this.getUrl().compareTo(rhs.getUrl());
- }
-
- /**
- * Returns the UI-visible name of the source. Can be null.
- */
- public String getUiName() {
- return mUiName;
- }
-
- /** Returns the URL of the XML file for this source. */
- public String getUrl() {
- return mUrl;
- }
-
- /**
- * Returns the list of known packages found by the last call to load().
- * This is null when the source hasn't been loaded yet -- caller should
- * then call {@link #load} to load the packages.
- */
- public Package[] getPackages() {
- return mPackages;
- }
-
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected void setPackages(Package[] packages) {
- mPackages = packages;
-
- if (mPackages != null) {
- // Order the packages.
- Arrays.sort(mPackages, null);
- }
- }
-
- /**
- * Clear the internal packages list. After this call, {@link #getPackages()} will return
- * null till load() is called.
- */
- public void clearPackages() {
- setPackages(null);
- }
-
- /**
- * Indicates if the source is enabled.
- * <p/>
- * A 3rd-party add-on source can be disabled by the user to prevent from loading it.
- *
- * @return True if the source is enabled (default is true).
- */
- public boolean isEnabled() {
- // A URL is enabled if it's not in the disabled list.
- return sSourcesProps.getProperty(SdkSourceProperties.KEY_DISABLED, mUrl, null) == null;
- }
-
- /**
- * Changes whether the source is marked as enabled.
- * <p/>
- * When <em>changing</em> the enable state, the current package list is purged
- * and the next {@code load} will either return an empty list (if disabled) or
- * the actual package list (if enabled.)
- *
- * @param enabled True for the source to be enabled (can be loaded), false otherwise.
- */
- public void setEnabled(boolean enabled) {
- if (enabled != isEnabled()) {
- // First we clear the current package list, which will force the
- // next load() to actually set the package list as desired.
- clearPackages();
-
- sSourcesProps.setProperty(SdkSourceProperties.KEY_DISABLED, mUrl,
- enabled ? null /*remove*/ : "disabled"); //$NON-NLS-1$
- }
- }
-
- /**
- * Returns the short description of the source, if not null.
- * Otherwise returns the default Object toString result.
- * <p/>
- * This is mostly helpful for debugging.
- * For UI display, use the {@link IDescription} interface.
- */
- @Override
- public String toString() {
- String s = getShortDescription();
- if (s != null) {
- return s;
- }
- return super.toString();
- }
-
- @Override
- public String getShortDescription() {
-
- if (mUiName != null && mUiName.length() > 0) {
-
- String host = "malformed URL";
-
- try {
- URL u = new URL(mUrl);
- host = u.getHost();
- } catch (MalformedURLException e) {
- }
-
- return String.format("%1$s (%2$s)", mUiName, host);
-
- }
- return mUrl;
- }
-
- @Override
- public String getLongDescription() {
- // Note: in a normal workflow, mDescription is filled by setDefaultDescription().
- // However for packages made by unit tests or such, this can be null.
- return mDescription == null ? "" : mDescription; //$NON-NLS-1$
- }
-
- /**
- * Returns the last fetch error description.
- * If there was no error, returns null.
- */
- public String getFetchError() {
- return mFetchError;
- }
-
- /**
- * Tries to fetch the repository index for the given URL and updates the package list.
- * When a source is disabled, this create an empty non-null package list.
- * <p/>
- * Callers can get the package list using {@link #getPackages()} after this. It will be
- * null in case of error, in which case {@link #getFetchError()} can be used to an
- * error message.
- */
- public void load(DownloadCache cache, ITaskMonitor monitor, boolean forceHttp) {
-
- setDefaultDescription();
- monitor.setProgressMax(7);
-
- if (!isEnabled()) {
- setPackages(new Package[0]);
- mDescription += "\nSource is disabled.";
- monitor.incProgress(7);
- return;
- }
-
- String url = mUrl;
- if (forceHttp) {
- url = url.replaceAll("https://", "http://"); //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- monitor.setDescription("Fetching URL: %1$s", url);
- monitor.incProgress(1);
-
- mFetchError = null;
- Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };
- String[] validationError = new String[] { null };
- Exception[] exception = new Exception[] { null };
- Document validatedDoc = null;
- boolean usingAlternateXml = false;
- boolean usingAlternateUrl = false;
- String validatedUri = null;
-
- String[] defaultNames = getDefaultXmlFileUrls();
- String firstDefaultName = defaultNames.length > 0 ? defaultNames[0] : "";
-
- InputStream xml = fetchXmlUrl(url, cache, monitor.createSubMonitor(1), exception);
- if (xml != null) {
- int version = getXmlSchemaVersion(xml);
- if (version == 0) {
- closeStream(xml);
- 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 = fetchXmlUrl(newUrl, cache, subMonitor.createSubMonitor(1), exception);
- if (xml != null) {
- int version = getXmlSchemaVersion(xml);
- if (version == 0) {
- closeStream(xml);
- 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(firstDefaultName)
- && !(exception[0] instanceof CanceledByUserException)) {
- if (!url.endsWith("/")) { //$NON-NLS-1$
- url += "/"; //$NON-NLS-1$
- }
- url += firstDefaultName;
-
- xml = fetchXmlUrl(url, cache, 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);
-
- ITaskMonitor subMonitor = monitor.createSubMonitor(2);
- subMonitor.setProgressMax(2);
- for (int tryOtherUrl = 0; tryOtherUrl < 2; tryOtherUrl++) {
- // Explore the XML to find the potential XML schema version
- int version = getXmlSchemaVersion(xml);
-
- if (version >= 1 && version <= getNsLatestVersion()) {
- // This should be a version we can handle. Try to validate it
- // and report any error as invalid XML syntax,
-
- String uri = validateXml(xml, url, version, validationError, validatorFound);
- if (uri != null) {
- // Validation was successful
- validatedDoc = getDocument(xml, monitor);
- validatedUri = uri;
-
- if (usingAlternateUrl && validatedDoc != null) {
- // If the second tentative succeeded, indicate it in the console
- // with the URL that worked.
- monitor.log("Repository found at %1$s", url);
-
- // Keep the modified URL
- mUrl = url;
- }
- } else if (validatorFound[0].equals(Boolean.FALSE)) {
- // Validation failed because this JVM lacks a proper XML Validator
- mFetchError = validationError[0];
- } else {
- // We got a validator but validation failed. We know there's
- // what looks like a suitable root element with a suitable XMLNS
- // so it must be a genuine error of an XML not conforming to the schema.
- }
- } else if (version > getNsLatestVersion()) {
- // The schema used is more recent than what is supported by this tool.
- // Tell the user to upgrade, pointing him to the right version of the tool
- // package.
-
- try {
- validatedDoc = findAlternateToolsXml(xml);
- } catch (IOException e) {
- // Failed, will be handled below.
- }
- if (validatedDoc != null) {
- validationError[0] = null; // remove error from XML validation
- validatedUri = getNsUri();
- usingAlternateXml = true;
- }
-
- } else if (version < 1 && tryOtherUrl == 0 && !usingAlternateUrl) {
- // This is obviously not one of our documents.
- mFetchError = String.format(
- "Failed to validate the XML for the repository at URL '%1$s'",
- url);
-
- // 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(firstDefaultName)) {
- if (!url.endsWith("/")) { //$NON-NLS-1$
- url += "/"; //$NON-NLS-1$
- }
- url += firstDefaultName;
-
- closeStream(xml);
- xml = fetchXmlUrl(url, cache, subMonitor.createSubMonitor(1),
- null /* outException */);
- subMonitor.incProgress(1);
- // Loop to try the alternative document
- if (xml != null) {
- usingAlternateUrl = true;
- continue;
- }
- }
- } else if (version < 1 && usingAlternateUrl && mFetchError == null) {
- // The alternate URL is obviously not a valid XML either.
- // We only report the error if we failed to produce one earlier.
- mFetchError = String.format(
- "Failed to validate the XML for the repository at URL '%1$s'",
- url);
- }
-
- // If we get here either we succeeded or we ran out of alternatives.
- break;
- }
- }
-
- // If any exception was handled during the URL fetch, display it now.
- if (exception[0] != null) {
- mFetchError = "Failed to fetch URL";
-
- String reason = null;
- if (exception[0] instanceof FileNotFoundException) {
- // FNF has no useful getMessage, so we need to special handle it.
- reason = "File not found";
- mFetchError += ": " + reason;
- } else if (exception[0] instanceof SSLKeyException) {
- // That's a common error and we have a pref for it.
- reason = "HTTPS SSL error. You might want to force download through HTTP in the settings.";
- mFetchError += ": HTTPS SSL error";
- } else if (exception[0].getMessage() != null) {
- reason =
- exception[0].getClass().getSimpleName().replace("Exception", "") //$NON-NLS-1$ //$NON-NLS-2$
- + ' '
- + exception[0].getMessage();
- } else {
- reason = exception[0].toString();
- }
-
- monitor.logError("Failed to fetch URL %1$s, reason: %2$s", url, reason);
- }
-
- if (validationError[0] != null) {
- monitor.logError("%s", validationError[0]); //$NON-NLS-1$
- }
-
- // Stop here if we failed to validate the XML. We don't want to load it.
- if (validatedDoc == null) {
- return;
- }
-
- if (usingAlternateXml) {
- // We found something using the "alternate" XML schema (that is the one made up
- // to support schema upgrades). That means the user can only install the tools
- // and needs to upgrade them before it download more stuff.
-
- // Is the manager running from inside ADT?
- // We check that com.android.ide.eclipse.adt.AdtPlugin exists using reflection.
-
- boolean isADT = false;
- try {
- Class<?> adt = Class.forName("com.android.ide.eclipse.adt.AdtPlugin"); //$NON-NLS-1$
- isADT = (adt != null);
- } catch (ClassNotFoundException e) {
- // pass
- }
-
- String info;
- if (isADT) {
- info = "This repository requires a more recent version of ADT. Please update the Eclipse Android plugin.";
- mDescription = "This repository requires a more recent version of ADT, the Eclipse Android plugin.\nYou must update it before you can see other new packages.";
-
- } else {
- info = "This repository requires a more recent version of the Tools. Please update.";
- mDescription = "This repository requires a more recent version of the Tools.\nYou must update it before you can see other new packages.";
- }
-
- mFetchError = mFetchError == null ? info : mFetchError + ". " + info;
- }
-
- monitor.incProgress(1);
-
- if (xml != null) {
- monitor.setDescription("Parse XML: %1$s", url);
- monitor.incProgress(1);
- parsePackages(validatedDoc, validatedUri, monitor);
- if (mPackages == null || mPackages.length == 0) {
- mDescription += "\nNo packages found.";
- } else if (mPackages.length == 1) {
- mDescription += "\nOne package found.";
- } else {
- mDescription += String.format("\n%1$d packages found.", mPackages.length);
- }
- }
-
- // done
- monitor.incProgress(1);
- closeStream(xml);
- }
-
- private void setDefaultDescription() {
- if (isAddonSource()) {
- String desc = "";
-
- if (mUiName != null) {
- desc += "Add-on Provider: " + mUiName;
- desc += "\n";
- }
- desc += "Add-on URL: " + mUrl;
-
- mDescription = desc;
- } else {
- mDescription = String.format("SDK Source: %1$s", mUrl);
- }
- }
-
- /**
- * Fetches the document at the given URL and returns it as a string. Returns
- * null if anything wrong happens and write errors to the monitor.
- *
- * @param urlString The URL to load, as a string.
- * @param monitor {@link ITaskMonitor} related to this URL.
- * @param outException If non null, where to store any exception that
- * happens during the fetch.
- */
- private InputStream fetchXmlUrl(String urlString,
- DownloadCache cache,
- ITaskMonitor monitor,
- Exception[] outException) {
- try {
- InputStream xml = cache.openCachedUrl(urlString, monitor);
- if (xml != null) {
- xml.mark(500000);
- xml = new NonClosingInputStream(xml);
- ((NonClosingInputStream) xml).setCloseBehavior(CloseBehavior.RESET);
- }
- return xml;
- } catch (Exception e) {
- if (outException != null) {
- outException[0] = e;
- }
- }
-
- return null;
- }
-
- /**
- * Closes the stream, ignore any exception from InputStream.close().
- * If the stream is a NonClosingInputStream, sets it to CloseBehavior.CLOSE first.
- */
- private void closeStream(InputStream is) {
- if (is != null) {
- if (is instanceof NonClosingInputStream) {
- ((NonClosingInputStream) is).setCloseBehavior(CloseBehavior.CLOSE);
- }
- try {
- is.close();
- } catch (IOException ignore) {}
- }
- }
-
- /**
- * Validates this XML against one of the requested SDK Repository schemas.
- * If the XML was correctly validated, returns the schema that worked.
- * If it doesn't validate, returns null and stores the error in outError[0].
- * If we can't find a validator, returns null and set validatorFound[0] to false.
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected String validateXml(InputStream xml, String url, int version,
- String[] outError, Boolean[] validatorFound) {
-
- if (xml == null) {
- return null;
- }
-
- try {
- Validator validator = getValidator(version);
-
- if (validator == null) {
- validatorFound[0] = Boolean.FALSE;
- outError[0] = String.format(
- "XML verification failed for %1$s.\nNo suitable XML Schema Validator could be found in your Java environment. Please consider updating your version of Java.",
- url);
- return null;
- }
-
- validatorFound[0] = Boolean.TRUE;
-
- // Reset the stream if it supports that operation.
- assert xml.markSupported();
- xml.reset();
-
- // Validation throws a bunch of possible Exceptions on failure.
- validator.validate(new StreamSource(xml));
- return getSchemaUri(version);
-
- } catch (SAXParseException e) {
- outError[0] = String.format(
- "XML verification failed for %1$s.\nLine %2$d:%3$d, Error: %4$s",
- url,
- e.getLineNumber(),
- e.getColumnNumber(),
- e.toString());
-
- } catch (Exception e) {
- outError[0] = String.format(
- "XML verification failed for %1$s.\nError: %2$s",
- url,
- e.toString());
- }
- return null;
- }
-
- /**
- * Manually parses the root element of the XML to extract the schema version
- * at the end of the xmlns:sdk="http://schemas.android.com/sdk/android/repository/$N"
- * declaration.
- *
- * @return 1..{@link SdkRepoConstants#NS_LATEST_VERSION} for a valid schema version
- * or 0 if no schema could be found.
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected int getXmlSchemaVersion(InputStream xml) {
- if (xml == null) {
- return 0;
- }
-
- // Get an XML document
- Document doc = null;
- try {
- assert xml.markSupported();
- xml.reset();
-
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- factory.setIgnoringComments(false);
- factory.setValidating(false);
-
- // Parse the old document using a non namespace aware builder
- factory.setNamespaceAware(false);
- DocumentBuilder builder = factory.newDocumentBuilder();
-
- // We don't want the default handler which prints errors to stderr.
- builder.setErrorHandler(new ErrorHandler() {
- @Override
- public void warning(SAXParseException e) throws SAXException {
- // pass
- }
- @Override
- public void fatalError(SAXParseException e) throws SAXException {
- throw e;
- }
- @Override
- public void error(SAXParseException e) throws SAXException {
- throw e;
- }
- });
-
- doc = builder.parse(xml);
-
- // Prepare a new document using a namespace aware builder
- factory.setNamespaceAware(true);
- builder = factory.newDocumentBuilder();
-
- } catch (Exception e) {
- // Failed to reset XML stream
- // Failed to get builder factor
- // Failed to create XML document builder
- // Failed to parse XML document
- // Failed to read XML document
- }
-
- if (doc == null) {
- return 0;
- }
-
- // Check the root element is an XML with at least the following properties:
- // <sdk:sdk-repository
- // xmlns:sdk="http://schemas.android.com/sdk/android/repository/$N">
- //
- // Note that we don't have namespace support enabled, we just do it manually.
-
- Pattern nsPattern = Pattern.compile(getNsPattern());
-
- String prefix = null;
- for (Node child = doc.getFirstChild(); child != null; child = child.getNextSibling()) {
- if (child.getNodeType() == Node.ELEMENT_NODE) {
- prefix = null;
- String name = child.getNodeName();
- int pos = name.indexOf(':');
- if (pos > 0 && pos < name.length() - 1) {
- prefix = name.substring(0, pos);
- name = name.substring(pos + 1);
- }
- if (getRootElementName().equals(name)) {
- NamedNodeMap attrs = child.getAttributes();
- String xmlns = "xmlns"; //$NON-NLS-1$
- if (prefix != null) {
- xmlns += ":" + prefix; //$NON-NLS-1$
- }
- Node attr = attrs.getNamedItem(xmlns);
- if (attr != null) {
- String uri = attr.getNodeValue();
- if (uri != null) {
- Matcher m = nsPattern.matcher(uri);
- if (m.matches()) {
- String version = m.group(1);
- try {
- return Integer.parseInt(version);
- } catch (NumberFormatException e) {
- return 0;
- }
- }
- }
- }
- }
- }
- }
-
- return 0;
- }
-
- /**
- * Helper method that returns a validator for our XSD, or null if the current Java
- * implementation can't process XSD schemas.
- *
- * @param version The version of the XML Schema.
- * See {@link SdkRepoConstants#getXsdStream(int)}
- */
- private Validator getValidator(int version) throws SAXException {
- InputStream xsdStream = getXsdStream(version);
- SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
-
- if (factory == null) {
- return null;
- }
-
- // This may throw a SAX Exception if the schema itself is not a valid XSD
- Schema schema = factory.newSchema(new StreamSource(xsdStream));
-
- Validator validator = schema == null ? null : schema.newValidator();
-
- // We don't want the default handler, which by default dumps errors to stderr.
- validator.setErrorHandler(new ErrorHandler() {
- @Override
- public void warning(SAXParseException e) throws SAXException {
- // pass
- }
- @Override
- public void fatalError(SAXParseException e) throws SAXException {
- throw e;
- }
- @Override
- public void error(SAXParseException e) throws SAXException {
- throw e;
- }
- });
-
- return validator;
- }
-
- /**
- * Parse all packages defined in the SDK Repository XML and creates
- * a new mPackages array with them.
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected boolean parsePackages(Document doc, String nsUri, ITaskMonitor monitor) {
-
- Node root = getFirstChild(doc, nsUri, getRootElementName());
- if (root != null) {
-
- ArrayList<Package> packages = new ArrayList<Package>();
-
- // Parse license definitions
- HashMap<String, String> licenses = new HashMap<String, String>();
- for (Node child = root.getFirstChild();
- child != null;
- child = child.getNextSibling()) {
- if (child.getNodeType() == Node.ELEMENT_NODE &&
- nsUri.equals(child.getNamespaceURI()) &&
- child.getLocalName().equals(RepoConstants.NODE_LICENSE)) {
- Node id = child.getAttributes().getNamedItem(RepoConstants.ATTR_ID);
- if (id != null) {
- licenses.put(id.getNodeValue(), child.getTextContent());
- }
- }
- }
-
- // Parse packages
- for (Node child = root.getFirstChild();
- child != null;
- child = child.getNextSibling()) {
- if (child.getNodeType() == Node.ELEMENT_NODE &&
- nsUri.equals(child.getNamespaceURI())) {
- String name = child.getLocalName();
- Package p = null;
-
- try {
- // We can load addon and extra packages from all sources, either
- // internal or user sources.
- if (SdkAddonConstants.NODE_ADD_ON.equals(name)) {
- p = new AddonPackage(this, child, nsUri, licenses);
-
- } else if (SdkAddonConstants.NODE_EXTRA.equals(name)) {
- p = new ExtraPackage(this, child, nsUri, licenses);
-
- } else if (!isAddonSource()) {
- // We only load platform, doc and tool packages from internal
- // sources, never from user sources.
- if (SdkRepoConstants.NODE_PLATFORM.equals(name)) {
- p = new PlatformPackage(this, child, nsUri, licenses);
- } else if (SdkRepoConstants.NODE_DOC.equals(name)) {
- p = new DocPackage(this, child, nsUri, licenses);
- } else if (SdkRepoConstants.NODE_TOOL.equals(name)) {
- p = new ToolPackage(this, child, nsUri, licenses);
- } else if (SdkRepoConstants.NODE_PLATFORM_TOOL.equals(name)) {
- p = new PlatformToolPackage(this, child, nsUri, licenses);
- } else if (SdkRepoConstants.NODE_SAMPLE.equals(name)) {
- p = new SamplePackage(this, child, nsUri, licenses);
- } else if (SdkRepoConstants.NODE_SYSTEM_IMAGE.equals(name)) {
- p = new SystemImagePackage(this, child, nsUri, licenses);
- } else if (SdkRepoConstants.NODE_SOURCE.equals(name)) {
- p = new SourcePackage(this, child, nsUri, licenses);
- }
- }
-
- if (p != null) {
- packages.add(p);
- monitor.logVerbose("Found %1$s", p.getShortDescription());
- }
- } catch (Exception e) {
- // Ignore invalid packages
- monitor.logError("Ignoring invalid %1$s element: %2$s", name, e.toString());
- }
- }
- }
-
- setPackages(packages.toArray(new Package[packages.size()]));
-
- return true;
- }
-
- return false;
- }
-
- /**
- * Returns the first child element with the given XML local name.
- * If xmlLocalName is null, returns the very first child element.
- */
- private Node getFirstChild(Node node, String nsUri, String xmlLocalName) {
-
- for(Node child = node.getFirstChild(); child != null; child = child.getNextSibling()) {
- if (child.getNodeType() == Node.ELEMENT_NODE &&
- nsUri.equals(child.getNamespaceURI())) {
- if (xmlLocalName == null || child.getLocalName().equals(xmlLocalName)) {
- return child;
- }
- }
- }
-
- return null;
- }
-
- /**
- * Takes an XML document as a string as parameter and returns a DOM for it.
- *
- * On error, returns null and prints a (hopefully) useful message on the monitor.
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected Document getDocument(InputStream xml, ITaskMonitor monitor) {
- try {
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- factory.setIgnoringComments(true);
- factory.setNamespaceAware(true);
-
- DocumentBuilder builder = factory.newDocumentBuilder();
- assert xml.markSupported();
- xml.reset();
- Document doc = builder.parse(new InputSource(xml));
-
- return doc;
- } catch (ParserConfigurationException e) {
- monitor.logError("Failed to create XML document builder");
-
- } catch (SAXException e) {
- monitor.logError("Failed to parse XML document");
-
- } catch (IOException e) {
- monitor.logError("Failed to read XML document");
- }
-
- return null;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/sources/SdkSourceCategory.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/sources/SdkSourceCategory.java
deleted file mode 100755
index 5272cd5..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/sources/SdkSourceCategory.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sources;
-
-import com.android.sdklib.internal.repository.IDescription;
-
-
-/**
- * The category of a given {@link SdkSource} (which represents a download site).
- */
-public enum SdkSourceCategory implements IDescription {
-
- /**
- * The default canonical and official Android repository.
- */
- ANDROID_REPO("Android Repository", true),
-
- /**
- * Repositories contributed by the SDK_UPDATER_URLS env var,
- * only used for local debugging.
- */
- GETENV_REPOS("Custom Repositories", false),
-
- /**
- * All third-party add-ons fetched from the Android repository.
- */
- ADDONS_3RD_PARTY("Third party Add-ons", true),
-
- /**
- * All add-ons contributed locally by the user via the "Add Add-on Site" button.
- */
- USER_ADDONS("User Add-ons", false),
-
- /**
- * Add-ons contributed by the SDK_UPDATER_USER_URLS env var,
- * only used for local debugging.
- */
- GETENV_ADDONS("Custom Add-ons", false);
-
-
- private final String mUiName;
- private final boolean mAlwaysDisplay;
-
- private SdkSourceCategory(String uiName, boolean alwaysDisplay) {
- mUiName = uiName;
- mAlwaysDisplay = alwaysDisplay;
- }
-
- /**
- * Returns the UI-visible name of the cateogry. Displayed in the available package tree.
- * Cannot be null nor empty.
- */
- public String getUiName() {
- return mUiName;
- }
-
- /**
- * True if this category must always be displayed by the available package tree, even
- * if empty.
- * When false, the category must not be displayed when empty.
- */
- public boolean getAlwaysDisplay() {
- return mAlwaysDisplay;
- }
-
- @Override
- public String getLongDescription() {
- return getUiName();
- }
-
- @Override
- public String getShortDescription() {
- return getUiName();
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/sources/SdkSourceProperties.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/sources/SdkSourceProperties.java
deleted file mode 100755
index cdd428f..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/sources/SdkSourceProperties.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sources;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.annotations.VisibleForTesting;
-import com.android.annotations.VisibleForTesting.Visibility;
-import com.android.prefs.AndroidLocation;
-import com.android.prefs.AndroidLocation.AndroidLocationException;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Properties;
-
-/**
- * Properties for individual sources which are persisted by a local settings file.
- * <p/>
- * All instances of {@link SdkSourceProperties} share the same singleton storage.
- * The persisted setting file is loaded as necessary, however callers must persist
- * it at some point by calling {@link #save()}.
- */
-public class SdkSourceProperties {
-
- /**
- * An internal file version number, in case we want to change the format later.
- */
- private static final String KEY_VERSION = "@version@"; //$NON-NLS-1$
- /**
- * The last known UI name of the source.
- */
- public static final String KEY_NAME = "@name@"; //$NON-NLS-1$
- /**
- * A non-null string if the source is disabled. Null if the source is enabled.
- */
- public static final String KEY_DISABLED = "@disabled@"; //$NON-NLS-1$
-
- private static final Properties sSourcesProperties = new Properties();
- private static final String SRC_FILENAME = "sites-settings.cfg"; //$NON-NLS-1$
-
- private static boolean sModified = false;
-
- public SdkSourceProperties() {
- }
-
- public void save() {
- synchronized (sSourcesProperties) {
- if (sModified && !sSourcesProperties.isEmpty()) {
- saveLocked();
- sModified = false;
- }
- }
- }
-
- /**
- * Retrieves a property for the given source URL and the given key type.
- * <p/>
- * Implementation detail: this loads the persistent settings file as needed.
- *
- * @param key The kind of property to retrieve for that source URL.
- * @param sourceUrl The source URL.
- * @param defaultValue The default value to return, if the property isn't found. Can be null.
- * @return The non-null string property for the key/sourceUrl or the default value.
- */
- @Nullable
- public String getProperty(@NonNull String key,
- @NonNull String sourceUrl,
- @Nullable String defaultValue) {
- String value = defaultValue;
-
- synchronized (sSourcesProperties) {
- if (sSourcesProperties.isEmpty()) {
- loadLocked();
- }
-
- value = sSourcesProperties.getProperty(key + sourceUrl, defaultValue);
- }
-
- return value;
- }
-
- /**
- * Sets or remove a property for the given source URL and the given key type.
- * <p/>
- * Implementation detail: this does <em>not</em> save the persistent settings file.
- * Somehow the caller will need to call the {@link #save()} method later.
- *
- * @param key The kind of property to retrieve for that source URL.
- * @param sourceUrl The source URL.
- * @param value The new value to set (if non null) or null to remove an existing property.
- */
- public void setProperty(String key, String sourceUrl, String value) {
- synchronized (sSourcesProperties) {
- if (sSourcesProperties.isEmpty()) {
- loadLocked();
- }
-
- key += sourceUrl;
-
- String old = sSourcesProperties.getProperty(key);
- if (value == null) {
- if (old != null) {
- sSourcesProperties.remove(key);
- sModified = true;
- }
- } else if (old == null || !old.equals(value)) {
- sSourcesProperties.setProperty(key, value);
- sModified = true;
- }
- }
- }
-
- /**
- * Returns an internal string representation of the underlying Properties map,
- * sorted by ascending keys. Useful for debugging and testing purposes only.
- */
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder("<SdkSourceProperties"); //$NON-NLS-1$
- synchronized (sSourcesProperties) {
- List<Object> keys = Collections.list(sSourcesProperties.keys());
- Collections.sort(keys, new Comparator<Object>() {
- @Override
- public int compare(Object o1, Object o2) {
- return o1.toString().compareTo(o2.toString());
- }});
-
- for (Object key : keys) {
- sb.append('\n').append(key)
- .append(" = ").append(sSourcesProperties.get(key)); //$NON-NLS-1$
- }
- }
- sb.append('>');
- return sb.toString();
- }
-
- /** Load state from persistent file. Expects sSourcesProperties to be synchronized. */
- private void loadLocked() {
- // Load state from persistent file
- if (loadProperties()) {
- // If it lacks our magic version key, don't use it
- if (sSourcesProperties.getProperty(KEY_VERSION) == null) {
- sSourcesProperties.clear();
- }
-
- sModified = false;
- }
-
- if (sSourcesProperties.isEmpty()) {
- // Nothing was loaded. Initialize the storage with a version
- // identified. This isn't currently checked back, but we might
- // want it later if we decide to change the way this works.
- // The version key is choosen on purpose to not match any valid URL.
- sSourcesProperties.setProperty(KEY_VERSION, "1"); //$NON-NLS-1$ //$NON-NLS-2$
- }
- }
-
- /**
- * Load properties from default file. Extracted so that it can be mocked in tests.
- *
- * @return True if actually loaded the file. False if there was an IO error or no
- * file and nothing was loaded.
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected boolean loadProperties() {
- try {
- String folder = AndroidLocation.getFolder();
- File f = new File(folder, SRC_FILENAME);
- if (f.exists()) {
- FileInputStream fis = null;
- try {
- fis = new FileInputStream(f);
- sSourcesProperties.load(fis);
- } catch (IOException ignore) {
- // nop
- } finally {
- if (fis != null) {
- try {
- fis.close();
- } catch (IOException ignore) {}
- }
- }
-
- return true;
- }
- } catch (AndroidLocationException ignore) {
- // nop
- }
- return false;
- }
-
- /**
- * Save file to disk. Expects sSourcesProperties to be synchronized.
- * Made accessible for testing purposes.
- * For public usage, please use {@link #save()} instead.
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected void saveLocked() {
- // Persist it to the file
- FileOutputStream fos = null;
- try {
- String folder = AndroidLocation.getFolder();
- File f = new File(folder, SRC_FILENAME);
-
- fos = new FileOutputStream(f);
-
- sSourcesProperties.store(fos,"## Sites Settings for Android SDK Manager");//$NON-NLS-1$
-
- } catch (AndroidLocationException ignore) {
- // nop
- } catch (IOException ignore) {
- // nop
- } finally {
- if (fos != null) {
- try {
- fos.close();
- } catch (IOException ignore) {}
- }
- }
- }
-
- /** Empty current property list. Made accessible for testing purposes. */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected void clear() {
- synchronized (sSourcesProperties) {
- sSourcesProperties.clear();
- sModified = false;
- }
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/sources/SdkSources.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/sources/SdkSources.java
deleted file mode 100755
index c89df5e..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/sources/SdkSources.java
+++ /dev/null
@@ -1,429 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sources;
-
-import com.android.prefs.AndroidLocation;
-import com.android.prefs.AndroidLocation.AndroidLocationException;
-import com.android.sdklib.repository.SdkSysImgConstants;
-import com.android.utils.ILogger;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.EnumMap;
-import java.util.Iterator;
-import java.util.Properties;
-import java.util.Map.Entry;
-
-/**
- * A list of sdk-repository and sdk-addon sources, sorted by {@link SdkSourceCategory}.
- */
-public class SdkSources {
-
- private static final String KEY_COUNT = "count";
-
- private static final String KEY_SRC = "src";
-
- private static final String SRC_FILENAME = "repositories.cfg"; //$NON-NLS-1$
-
- private final EnumMap<SdkSourceCategory, ArrayList<SdkSource>> mSources =
- new EnumMap<SdkSourceCategory, ArrayList<SdkSource>>(SdkSourceCategory.class);
-
- private ArrayList<Runnable> mChangeListeners; // lazily initialized
-
-
- public SdkSources() {
- }
-
- /**
- * Adds a new source to the Sources list.
- * <p/>
- * Implementation detail: {@link SdkSources} doesn't invoke {@link #notifyChangeListeners()}
- * directly. Callers who use {@code add()} are responsible for notifying the listeners once
- * they are done modifying the sources list. The intent is to notify the listeners only once
- * at the end, not for every single addition.
- */
- public void add(SdkSourceCategory category, SdkSource source) {
- synchronized (mSources) {
- ArrayList<SdkSource> list = mSources.get(category);
- if (list == null) {
- list = new ArrayList<SdkSource>();
- mSources.put(category, list);
- }
-
- list.add(source);
- }
- }
-
- /**
- * Removes a source from the Sources list.
- * <p/>
- * Callers who remove entries are responsible for notifying the listeners using
- * {@link #notifyChangeListeners()} once they are done modifying the sources list.
- */
- public void remove(SdkSource source) {
- synchronized (mSources) {
- Iterator<Entry<SdkSourceCategory, ArrayList<SdkSource>>> it =
- mSources.entrySet().iterator();
- while (it.hasNext()) {
- Entry<SdkSourceCategory, ArrayList<SdkSource>> entry = it.next();
- ArrayList<SdkSource> list = entry.getValue();
-
- if (list.remove(source)) {
- if (list.isEmpty()) {
- // remove the entry since the source list became empty
- it.remove();
- }
- }
- }
- }
- }
-
- /**
- * Removes all the sources in the given category.
- * <p/>
- * Callers who remove entries are responsible for notifying the listeners using
- * {@link #notifyChangeListeners()} once they are done modifying the sources list.
- */
- public void removeAll(SdkSourceCategory category) {
- synchronized (mSources) {
- mSources.remove(category);
- }
- }
-
- /**
- * Returns a set of all categories that must be displayed. This includes all
- * categories that are to be always displayed as well as all categories which
- * have at least one source.
- * Might return a empty array, but never returns null.
- */
- public SdkSourceCategory[] getCategories() {
- ArrayList<SdkSourceCategory> cats = new ArrayList<SdkSourceCategory>();
-
- for (SdkSourceCategory cat : SdkSourceCategory.values()) {
- if (cat.getAlwaysDisplay()) {
- cats.add(cat);
- } else {
- synchronized (mSources) {
- ArrayList<SdkSource> list = mSources.get(cat);
- if (list != null && !list.isEmpty()) {
- cats.add(cat);
- }
- }
- }
- }
-
- return cats.toArray(new SdkSourceCategory[cats.size()]);
- }
-
- /**
- * Returns a new array of sources attached to the given category.
- * Might return an empty array, but never returns null.
- */
- public SdkSource[] getSources(SdkSourceCategory category) {
- synchronized (mSources) {
- ArrayList<SdkSource> list = mSources.get(category);
- if (list == null) {
- return new SdkSource[0];
- } else {
- return list.toArray(new SdkSource[list.size()]);
- }
- }
- }
-
- /**
- * Returns an array of the sources across all categories. This is never null.
- */
- public SdkSource[] getAllSources() {
- synchronized (mSources) {
- int n = 0;
-
- for (ArrayList<SdkSource> list : mSources.values()) {
- n += list.size();
- }
-
- SdkSource[] sources = new SdkSource[n];
-
- int i = 0;
- for (ArrayList<SdkSource> list : mSources.values()) {
- for (SdkSource source : list) {
- sources[i++] = source;
- }
- }
-
- return sources;
- }
- }
-
- /**
- * Each source keeps a local cache of whatever it loaded recently.
- * This calls {@link SdkSource#clearPackages()} on all the available sources,
- * and the next call to {@link SdkSource#getPackages()} will actually reload
- * the remote package list.
- */
- public void clearAllPackages() {
- synchronized (mSources) {
- for (ArrayList<SdkSource> list : mSources.values()) {
- for (SdkSource source : list) {
- source.clearPackages();
- }
- }
- }
- }
-
- /**
- * Returns the category of a given source, or null if the source is unknown.
- * <p/>
- * Note that this method uses object identity to find a given source, and does
- * not identify sources by their URL like {@link #hasSourceUrl(SdkSource)} does.
- * <p/>
- * The search is O(N), which should be acceptable on the expectedly small source list.
- */
- public SdkSourceCategory getCategory(SdkSource source) {
- if (source != null) {
- synchronized (mSources) {
- for (Entry<SdkSourceCategory, ArrayList<SdkSource>> entry : mSources.entrySet()) {
- if (entry.getValue().contains(source)) {
- return entry.getKey();
- }
- }
- }
- }
- return null;
- }
-
- /**
- * Returns true if there's already a similar source in the sources list
- * under any category.
- * <p/>
- * Important: The match is NOT done on object identity.
- * Instead, this searches for a <em>similar</em> source, based on
- * {@link SdkSource#equals(Object)} which compares the source URLs.
- * <p/>
- * The search is O(N), which should be acceptable on the expectedly small source list.
- */
- public boolean hasSourceUrl(SdkSource source) {
- synchronized (mSources) {
- for (ArrayList<SdkSource> list : mSources.values()) {
- for (SdkSource s : list) {
- if (s.equals(source)) {
- return true;
- }
- }
- }
- return false;
- }
- }
-
- /**
- * Returns true if there's already a similar source in the sources list
- * under the specified category.
- * <p/>
- * Important: The match is NOT done on object identity.
- * Instead, this searches for a <em>similar</em> source, based on
- * {@link SdkSource#equals(Object)} which compares the source URLs.
- * <p/>
- * The search is O(N), which should be acceptable on the expectedly small source list.
- */
- public boolean hasSourceUrl(SdkSourceCategory category, SdkSource source) {
- synchronized (mSources) {
- ArrayList<SdkSource> list = mSources.get(category);
- if (list != null) {
- for (SdkSource s : list) {
- if (s.equals(source)) {
- return true;
- }
- }
- }
- return false;
- }
- }
-
- /**
- * Loads all user sources. This <em>replaces</em> all existing user sources
- * by the ones from the property file.
- * <p/>
- * This calls {@link #notifyChangeListeners()} at the end of the operation.
- */
- public void loadUserAddons(ILogger log) {
- // Implementation detail: synchronize on the sources list to make sure that
- // a- the source list doesn't change while we load/save it, and most important
- // b- to make sure it's not being saved while loaded or the reverse.
- // In most cases we do these operation from the UI thread so it's not really
- // that necessary. This is more a protection in case of someone calls this
- // from a worker thread by mistake.
- synchronized (mSources) {
- // Remove all existing user sources
- removeAll(SdkSourceCategory.USER_ADDONS);
-
- // Load new user sources from property file
- FileInputStream fis = null;
- try {
- String folder = AndroidLocation.getFolder();
- File f = new File(folder, SRC_FILENAME);
- if (f.exists()) {
- fis = new FileInputStream(f);
-
- Properties props = new Properties();
- props.load(fis);
-
- int count = Integer.parseInt(props.getProperty(KEY_COUNT, "0"));
-
- for (int i = 0; i < count; i++) {
- String url = props.getProperty(String.format("%s%02d", KEY_SRC, i)); //$NON-NLS-1$
- if (url != null) {
- // FIXME: this code originally only dealt with add-on XML sources.
- // Now we'd like it to deal with system-image sources too, but we
- // don't know which kind of object it is (at least not without
- // trying to fetch it.) As a temporary workaround, just take a
- // guess based on the leaf URI name. However ideally what we can
- // simply do is add a checkbox "is system-image XML" in the user
- // dialog and pass this info down here. Another alternative is to
- // make a "dynamic" source object that tries to guess its type once
- // the URI has been fetched.
- SdkSource s;
- if (url.endsWith(SdkSysImgConstants.URL_DEFAULT_FILENAME)) {
- s = new SdkSysImgSource(url, null/*uiName*/);
- } else {
- s = new SdkAddonSource(url, null/*uiName*/);
- }
- if (!hasSourceUrl(s)) {
- add(SdkSourceCategory.USER_ADDONS, s);
- }
- }
- }
- }
-
- } catch (NumberFormatException e) {
- log.error(e, null);
-
- } catch (AndroidLocationException e) {
- log.error(e, null);
-
- } catch (IOException e) {
- log.error(e, null);
-
- } finally {
- if (fis != null) {
- try {
- fis.close();
- } catch (IOException e) {
- }
- }
- }
- }
- notifyChangeListeners();
- }
-
- /**
- * Saves all the user sources.
- * @param log Logger. Cannot be null.
- */
- public void saveUserAddons(ILogger log) {
- // See the implementation detail note in loadUserAddons() about the synchronization.
- synchronized (mSources) {
- FileOutputStream fos = null;
- try {
- String folder = AndroidLocation.getFolder();
- File f = new File(folder, SRC_FILENAME);
-
- fos = new FileOutputStream(f);
-
- Properties props = new Properties();
-
- int count = 0;
- for (SdkSource s : getSources(SdkSourceCategory.USER_ADDONS)) {
- props.setProperty(String.format("%s%02d", KEY_SRC, count), //$NON-NLS-1$
- s.getUrl());
- count++;
- }
- props.setProperty(KEY_COUNT, Integer.toString(count));
-
- props.store( fos, "## User Sources for Android SDK Manager"); //$NON-NLS-1$
-
- } catch (AndroidLocationException e) {
- log.error(e, null);
-
- } catch (IOException e) {
- log.error(e, null);
-
- } finally {
- if (fos != null) {
- try {
- fos.close();
- } catch (IOException e) {
- }
- }
- }
- }
- }
-
- /**
- * Adds a listener that will be notified when the sources list has changed.
- *
- * @param changeListener A non-null listener to add. Ignored if already present.
- * @see SdkSources#notifyChangeListeners()
- */
- public void addChangeListener(Runnable changeListener) {
- assert changeListener != null;
- if (mChangeListeners == null) {
- mChangeListeners = new ArrayList<Runnable>();
- }
- synchronized (mChangeListeners) {
- if (changeListener != null && !mChangeListeners.contains(changeListener)) {
- mChangeListeners.add(changeListener);
- }
- }
- }
-
- /**
- * Removes a listener from the list of listeners to notify when the sources change.
- *
- * @param changeListener A listener to remove. Ignored if not previously added.
- */
- public void removeChangeListener(Runnable changeListener) {
- if (mChangeListeners != null && changeListener != null) {
- synchronized (mChangeListeners) {
- mChangeListeners.remove(changeListener);
- }
- }
- }
-
- /**
- * Invoke all the registered change listeners, if any.
- * <p/>
- * This <em>may</em> be called from a worker thread, in which case the runnable
- * should take care of only updating UI from a main thread.
- */
- public void notifyChangeListeners() {
- if (mChangeListeners == null) {
- return;
- }
- synchronized (mChangeListeners) {
- for (Runnable runnable : mChangeListeners) {
- try {
- runnable.run();
- } catch (Throwable ignore) {
- assert ignore == null :
- "A SdkSource.ChangeListener failed with an exception: " + ignore.toString();
- }
- }
- }
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/sources/SdkSysImgSource.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/sources/SdkSysImgSource.java
deleted file mode 100755
index 7909bff..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/internal/repository/sources/SdkSysImgSource.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sources;
-
-import com.android.annotations.Nullable;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.repository.SdkSysImgConstants;
-
-import org.w3c.dom.Document;
-
-import java.io.InputStream;
-
-
-/**
- * An sdk-sys-img source, i.e. a download site for system-image packages.
- * A repository describes one or more {@link Package}s available for download.
- */
-public class SdkSysImgSource extends SdkSource {
-
- /**
- * Constructs a new source for the given repository URL.
- * @param url The source URL. Cannot be null. If the URL ends with a /, the default
- * sys-img.xml filename will be appended automatically.
- * @param uiName The UI-visible name of the source. Can be null.
- */
- public SdkSysImgSource(String url, String uiName) {
- super(url, uiName);
- }
-
- /**
- * Returns true if this is an addon source.
- * We only load addons and extras from these sources.
- */
- @Override
- public boolean isAddonSource() {
- return false;
- }
-
- /**
- * Returns true if this is a system-image source.
- * We only load system-images from these sources.
- */
- @Override
- public boolean isSysImgSource() {
- return true;
- }
-
-
- @Override
- protected String[] getDefaultXmlFileUrls() {
- return new String[] { SdkSysImgConstants.URL_DEFAULT_FILENAME };
- }
-
- @Override
- protected int getNsLatestVersion() {
- return SdkSysImgConstants.NS_LATEST_VERSION;
- }
-
- @Override
- protected String getNsUri() {
- return SdkSysImgConstants.NS_URI;
- }
-
- @Override
- protected String getNsPattern() {
- return SdkSysImgConstants.NS_PATTERN;
- }
-
- @Override
- protected String getSchemaUri(int version) {
- return SdkSysImgConstants.getSchemaUri(version);
- }
-
- @Override
- protected String getRootElementName() {
- return SdkSysImgConstants.NODE_SDK_SYS_IMG;
- }
-
- @Override
- protected InputStream getXsdStream(int version) {
- return SdkSysImgConstants.getXsdStream(version);
- }
-
- /**
- * This kind of schema does not support forward-evolution of the <tool> element.
- *
- * @param xml The input XML stream. Can be null.
- * @return Always null.
- * @null This implementation always return null.
- */
- @Override
- protected Document findAlternateToolsXml(@Nullable InputStream xml) {
- return null;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/io/FileOp.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/io/FileOp.java
deleted file mode 100755
index f9793cc..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/io/FileOp.java
+++ /dev/null
@@ -1,382 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.io;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-import com.google.common.io.Closeables;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Arrays;
-import java.util.Properties;
-
-
-/**
- * Wraps some common {@link File} operations on files and folders.
- * <p/>
- * This makes it possible to override/mock/stub some file operations in unit tests.
- */
-public class FileOp implements IFileOp {
-
- /**
- * Reflection method for File.setExecutable(boolean, boolean). Only present in Java 6.
- */
- private static Method sFileSetExecutable = null;
-
- /**
- * Parameters to call File.setExecutable through reflection.
- */
- private final static Object[] sFileSetExecutableParams = new Object[] {
- Boolean.TRUE, Boolean.FALSE };
-
- // static initialization of sFileSetExecutable.
- static {
- try {
- sFileSetExecutable = File.class.getMethod("setExecutable", //$NON-NLS-1$
- boolean.class, boolean.class);
-
- } catch (SecurityException e) {
- // do nothing we'll use chdmod instead
- } catch (NoSuchMethodException e) {
- // do nothing we'll use chdmod instead
- }
- }
-
- /**
- * Appends the given {@code segments} to the {@code base} file.
- *
- * @param base A base file, non-null.
- * @param segments Individual folder or filename segments to append to the base file.
- * @return A new file representing the concatenation of the base path with all the segments.
- */
- public static File append(File base, String...segments) {
- for (String segment : segments) {
- base = new File(base, segment);
- }
- return base;
- }
-
- /**
- * Appends the given {@code segments} to the {@code base} file.
- *
- * @param base A base file path, non-empty and non-null.
- * @param segments Individual folder or filename segments to append to the base path.
- * @return A new file representing the concatenation of the base path with all the segments.
- */
- public static File append(String base, String...segments) {
- return append(new File(base), segments);
- }
-
- /**
- * Helper to delete a file or a directory.
- * For a directory, recursively deletes all of its content.
- * Files that cannot be deleted right away are marked for deletion on exit.
- * It's ok for the file or folder to not exist at all.
- * The argument can be null.
- */
- @Override
- public void deleteFileOrFolder(File fileOrFolder) {
- if (fileOrFolder != null) {
- if (isDirectory(fileOrFolder)) {
- // Must delete content recursively first
- File[] files = fileOrFolder.listFiles();
- if (files != null) {
- for (File item : files) {
- deleteFileOrFolder(item);
- }
- }
- }
-
- // Don't try to delete it if it doesn't exist.
- if (!exists(fileOrFolder)) {
- return;
- }
-
- if (SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_WINDOWS) {
- // Trying to delete a resource on windows might fail if there's a file
- // indexer locking the resource. Generally retrying will be enough to
- // make it work.
- //
- // Try for half a second before giving up.
-
- for (int i = 0; i < 5; i++) {
- if (fileOrFolder.delete()) {
- return;
- }
-
- try {
- Thread.sleep(100 /*ms*/);
- } catch (InterruptedException e) {
- // Ignore.
- }
- }
-
- fileOrFolder.deleteOnExit();
-
- } else {
- // On Linux or Mac, just straight deleting it should just work.
-
- if (!fileOrFolder.delete()) {
- fileOrFolder.deleteOnExit();
- }
- }
- }
- }
-
- /**
- * Sets the executable Unix permission (+x) on a file or folder.
- * <p/>
- * This attempts to use File#setExecutable through reflection if
- * it's available.
- * If this is not available, this invokes a chmod exec instead,
- * so there is no guarantee of it being fast.
- * <p/>
- * Caller must make sure to not invoke this under Windows.
- *
- * @param file The file to set permissions on.
- * @throws IOException If an I/O error occurs
- */
- @Override
- public void setExecutablePermission(File file) throws IOException {
-
- if (sFileSetExecutable != null) {
- try {
- sFileSetExecutable.invoke(file, sFileSetExecutableParams);
- return;
- } catch (IllegalArgumentException e) {
- // we'll run chmod below
- } catch (IllegalAccessException e) {
- // we'll run chmod below
- } catch (InvocationTargetException e) {
- // we'll run chmod below
- }
- }
-
- Runtime.getRuntime().exec(new String[] {
- "chmod", "+x", file.getAbsolutePath() //$NON-NLS-1$ //$NON-NLS-2$
- });
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setReadOnly(File file) {
- file.setReadOnly();
- }
-
- /**
- * Copies a binary file.
- *
- * @param source the source file to copy.
- * @param dest the destination file to write.
- * @throws FileNotFoundException if the source file doesn't exist.
- * @throws IOException if there's a problem reading or writing the file.
- */
- @Override
- public void copyFile(File source, File dest) throws IOException {
- byte[] buffer = new byte[8192];
-
- FileInputStream fis = null;
- FileOutputStream fos = null;
- try {
- fis = new FileInputStream(source);
- fos = new FileOutputStream(dest);
-
- int read;
- while ((read = fis.read(buffer)) != -1) {
- fos.write(buffer, 0, read);
- }
-
- } finally {
- if (fis != null) {
- try {
- fis.close();
- } catch (IOException e) {
- // Ignore.
- }
- }
- if (fos != null) {
- try {
- fos.close();
- } catch (IOException e) {
- // Ignore.
- }
- }
- }
- }
-
- /**
- * Checks whether 2 binary files are the same.
- *
- * @param source the source file to copy
- * @param destination the destination file to write
- * @throws FileNotFoundException if the source files don't exist.
- * @throws IOException if there's a problem reading the files.
- */
- @Override
- public boolean isSameFile(File source, File destination) throws IOException {
-
- if (source.length() != destination.length()) {
- return false;
- }
-
- FileInputStream fis1 = null;
- FileInputStream fis2 = null;
-
- try {
- fis1 = new FileInputStream(source);
- fis2 = new FileInputStream(destination);
-
- byte[] buffer1 = new byte[8192];
- byte[] buffer2 = new byte[8192];
-
- int read1;
- while ((read1 = fis1.read(buffer1)) != -1) {
- int read2 = 0;
- while (read2 < read1) {
- int n = fis2.read(buffer2, read2, read1 - read2);
- if (n == -1) {
- break;
- }
- }
-
- if (read2 != read1) {
- return false;
- }
-
- if (!Arrays.equals(buffer1, buffer2)) {
- return false;
- }
- }
- } finally {
- if (fis2 != null) {
- try {
- fis2.close();
- } catch (IOException e) {
- // ignore
- }
- }
- if (fis1 != null) {
- try {
- fis1.close();
- } catch (IOException e) {
- // ignore
- }
- }
- }
-
- return true;
- }
-
- /** Invokes {@link File#isFile()} on the given {@code file}. */
- @Override
- public boolean isFile(File file) {
- return file.isFile();
- }
-
- /** Invokes {@link File#isDirectory()} on the given {@code file}. */
- @Override
- public boolean isDirectory(File file) {
- return file.isDirectory();
- }
-
- /** Invokes {@link File#exists()} on the given {@code file}. */
- @Override
- public boolean exists(File file) {
- return file.exists();
- }
-
- /** Invokes {@link File#length()} on the given {@code file}. */
- @Override
- public long length(File file) {
- return file.length();
- }
-
- /**
- * Invokes {@link File#delete()} on the given {@code file}.
- * Note: for a recursive folder version, consider {@link #deleteFileOrFolder(File)}.
- */
- @Override
- public boolean delete(File file) {
- return file.delete();
- }
-
- /** Invokes {@link File#mkdirs()} on the given {@code file}. */
- @Override
- public boolean mkdirs(File file) {
- return file.mkdirs();
- }
-
- /** Invokes {@link File#listFiles()} on the given {@code file}. */
- @Override
- public File[] listFiles(File file) {
- return file.listFiles();
- }
-
- /** Invokes {@link File#renameTo(File)} on the given files. */
- @Override
- public boolean renameTo(File oldFile, File newFile) {
- return oldFile.renameTo(newFile);
- }
-
- /** Creates a new {@link FileOutputStream} for the given {@code file}. */
- @Override
- public OutputStream newFileOutputStream(File file) throws FileNotFoundException {
- return new FileOutputStream(file);
- }
-
- @SuppressWarnings("resource") // Eclipse doesn't understand Closeables.closeQuietly
- @Override
- public @NonNull Properties loadProperties(@NonNull File file) {
- Properties props = new Properties();
- FileInputStream fis = null;
- try {
- fis = new FileInputStream(file);
- props.load(fis);
- } catch (IOException ignore) {
- } finally {
- Closeables.closeQuietly(fis);
- }
- return props;
- }
-
- @SuppressWarnings("resource") // Eclipse doesn't understand Closeables.closeQuietly
- @Override
- public boolean saveProperties(@NonNull File file, @NonNull Properties props,
- @NonNull String comments) {
- OutputStream fos = null;
- try {
- fos = newFileOutputStream(file);
-
- props.store(fos, comments);
- return true;
- } catch (IOException ignore) {
- } finally {
- Closeables.closeQuietly(fos);
- }
-
- return false;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/io/IFileOp.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/io/IFileOp.java
deleted file mode 100755
index 5b131d5..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/io/IFileOp.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.io;
-
-import com.android.annotations.NonNull;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Properties;
-
-
-/**
- * Wraps some common {@link File} operations on files and folders.
- * <p/>
- * This makes it possible to override/mock/stub some file operations in unit tests.
- */
-public interface IFileOp {
-
- /**
- * Helper to delete a file or a directory.
- * For a directory, recursively deletes all of its content.
- * Files that cannot be deleted right away are marked for deletion on exit.
- * It's ok for the file or folder to not exist at all.
- * The argument can be null.
- */
- public abstract void deleteFileOrFolder(File fileOrFolder);
-
- /**
- * Sets the executable Unix permission (+x) on a file or folder.
- * <p/>
- * This attempts to use File#setExecutable through reflection if
- * it's available.
- * If this is not available, this invokes a chmod exec instead,
- * so there is no guarantee of it being fast.
- * <p/>
- * Caller must make sure to not invoke this under Windows.
- *
- * @param file The file to set permissions on.
- * @throws IOException If an I/O error occurs
- */
- public abstract void setExecutablePermission(File file) throws IOException;
-
- /**
- * Sets the file or directory as read-only.
- *
- * @param file The file or directory to set permissions on.
- */
- public abstract void setReadOnly(File file);
-
- /**
- * Copies a binary file.
- *
- * @param source the source file to copy.
- * @param dest the destination file to write.
- * @throws FileNotFoundException if the source file doesn't exist.
- * @throws IOException if there's a problem reading or writing the file.
- */
- public abstract void copyFile(File source, File dest) throws IOException;
-
- /**
- * Checks whether 2 binary files are the same.
- *
- * @param source the source file to copy
- * @param destination the destination file to write
- * @throws FileNotFoundException if the source files don't exist.
- * @throws IOException if there's a problem reading the files.
- */
- public abstract boolean isSameFile(File source, File destination)
- throws IOException;
-
- /** Invokes {@link File#exists()} on the given {@code file}. */
- public abstract boolean exists(File file);
-
- /** Invokes {@link File#isFile()} on the given {@code file}. */
- public abstract boolean isFile(File file);
-
- /** Invokes {@link File#isDirectory()} on the given {@code file}. */
- public abstract boolean isDirectory(File file);
-
- /** Invokes {@link File#length()} on the given {@code file}. */
- public abstract long length(File file);
-
- /**
- * Invokes {@link File#delete()} on the given {@code file}.
- * Note: for a recursive folder version, consider {@link #deleteFileOrFolder(File)}.
- */
- public abstract boolean delete(File file);
-
- /** Invokes {@link File#mkdirs()} on the given {@code file}. */
- public abstract boolean mkdirs(File file);
-
- /** Invokes {@link File#listFiles()} on the given {@code file}. */
- public abstract File[] listFiles(File file);
-
- /** Invokes {@link File#renameTo(File)} on the given files. */
- public abstract boolean renameTo(File oldDir, File newDir);
-
- /** Creates a new {@link FileOutputStream} for the given {@code file}. */
- public abstract OutputStream newFileOutputStream(File file) throws FileNotFoundException;
-
- /**
- * Load {@link Properties} from a file. Returns an empty property set on error.
- *
- * @param file A non-null file to load from. File may not exist.
- * @return A new {@link Properties} with the properties loaded from the file,
- * or an empty property set in case of error.
- */
- public @NonNull Properties loadProperties(@NonNull File file);
-
- /**
- * Saves (write, store) the given {@link Properties} into the given {@link File}.
- *
- * @param file A non-null file to write to.
- * @param props The properties to write.
- * @param comments A non-null description of the properly list, written in the file.
- * @return True if the properties could be saved, false otherwise.
- */
- public boolean saveProperties(
- @NonNull File file,
- @NonNull Properties props,
- @NonNull String comments);
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/io/NonClosingInputStream.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/io/NonClosingInputStream.java
deleted file mode 100755
index 470b706..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/io/NonClosingInputStream.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.io;
-
-import com.android.annotations.NonNull;
-
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-
-/**
- * Wraps an {@link InputStream} to change its closing behavior:
- * this makes it possible to ignore close operations or have them perform a
- * {@link InputStream#reset()} instead (if supported by the underlying stream)
- * or plain ignored.
- */
-public class NonClosingInputStream extends FilterInputStream {
-
- private final InputStream mInputStream;
- private CloseBehavior mCloseBehavior = CloseBehavior.CLOSE;
-
- public enum CloseBehavior {
- /**
- * The behavior of {@link NonClosingInputStream#close()} is to close the
- * underlying input stream. This is the default.
- */
- CLOSE,
- /**
- * The behavior of {@link NonClosingInputStream#close()} is to ignore the
- * close request and do nothing.
- */
- IGNORE,
- /**
- * The behavior of {@link NonClosingInputStream#close()} is to call
- * {@link InputStream#reset()} on the underlying stream. This will
- * only succeed if the underlying stream supports it, e.g. it must
- * have {@link InputStream#markSupported()} return true <em>and</em>
- * the caller should have called {@link InputStream#mark(int)} at some
- * point before.
- */
- RESET
- }
-
- /**
- * Wraps an existing stream into this filtering stream.
- * @param in A non-null input stream.
- */
- public NonClosingInputStream(@NonNull InputStream in) {
- super(in);
- mInputStream = in;
- }
-
- /**
- * Returns the current {@link CloseBehavior}.
- * @return the current {@link CloseBehavior}. Never null.
- */
- public @NonNull CloseBehavior getCloseBehavior() {
- return mCloseBehavior;
- }
-
- /**
- * Changes the current {@link CloseBehavior}.
- *
- * @param closeBehavior A new non-null {@link CloseBehavior}.
- * @return Self for chaining.
- */
- public NonClosingInputStream setCloseBehavior(@NonNull CloseBehavior closeBehavior) {
- mCloseBehavior = closeBehavior;
- return this;
- }
-
- /**
- * Performs the requested {@code close()} operation, depending on the current
- * {@link CloseBehavior}.
- */
- @Override
- public void close() throws IOException {
- switch (mCloseBehavior) {
- case IGNORE:
- break;
- case RESET:
- mInputStream.reset();
- break;
- case CLOSE:
- mInputStream.close();
- break;
- }
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/PkgProps.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/PkgProps.java
deleted file mode 100755
index 68d7119..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/PkgProps.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * 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.repository;
-
-
-
-/**
- * Public constants used by the repository when saving {@code source.properties}
- * files in local packages.
- * <p/>
- * These constants are public and part of the SDK Manager public API.
- * Once published we can't change them arbitrarily since various parts
- * of our build process depend on them.
- */
-public class PkgProps {
-
- // Base Package
- public static final String PKG_REVISION = "Pkg.Revision"; //$NON-NLS-1$
- public static final String PKG_LICENSE = "Pkg.License"; //$NON-NLS-1$
- public static final String PKG_DESC = "Pkg.Desc"; //$NON-NLS-1$
- public static final String PKG_DESC_URL = "Pkg.DescUrl"; //$NON-NLS-1$
- public static final String PKG_RELEASE_NOTE = "Pkg.RelNote"; //$NON-NLS-1$
- public static final String PKG_RELEASE_URL = "Pkg.RelNoteUrl"; //$NON-NLS-1$
- public static final String PKG_SOURCE_URL = "Pkg.SourceUrl"; //$NON-NLS-1$
- public static final String PKG_OBSOLETE = "Pkg.Obsolete"; //$NON-NLS-1$
-
- // AndroidVersion
-
- public static final String VERSION_API_LEVEL = "AndroidVersion.ApiLevel";//$NON-NLS-1$
- /** Code name of the platform if the platform is not final */
- public static final String VERSION_CODENAME = "AndroidVersion.CodeName";//$NON-NLS-1$
-
-
- // AddonPackage
-
- public static final String ADDON_NAME = "Addon.Name"; //$NON-NLS-1$
- public static final String ADDON_NAME_ID = "Addon.NameId"; //$NON-NLS-1$
- public static final String ADDON_NAME_DISPLAY = "Addon.NameDisplay"; //$NON-NLS-1$
-
- public static final String ADDON_VENDOR = "Addon.Vendor"; //$NON-NLS-1$
- public static final String ADDON_VENDOR_ID = "Addon.VendorId"; //$NON-NLS-1$
- public static final String ADDON_VENDOR_DISPLAY = "Addon.VendorDisplay"; //$NON-NLS-1$
-
- // DocPackage
-
- // ExtraPackage
-
- public static final String EXTRA_PATH = "Extra.Path"; //$NON-NLS-1$
- public static final String EXTRA_OLD_PATHS = "Extra.OldPaths"; //$NON-NLS-1$
- public static final String EXTRA_MIN_API_LEVEL = "Extra.MinApiLevel"; //$NON-NLS-1$
- public static final String EXTRA_PROJECT_FILES = "Extra.ProjectFiles"; //$NON-NLS-1$
- public static final String EXTRA_VENDOR = "Extra.Vendor"; //$NON-NLS-1$
- public static final String EXTRA_VENDOR_ID = "Extra.VendorId"; //$NON-NLS-1$
- public static final String EXTRA_VENDOR_DISPLAY = "Extra.VendorDisplay"; //$NON-NLS-1$
- public static final String EXTRA_NAME_DISPLAY = "Extra.NameDisplay"; //$NON-NLS-1$
-
- // ILayoutlibVersion
-
- public static final String LAYOUTLIB_API = "Layoutlib.Api"; //$NON-NLS-1$
- public static final String LAYOUTLIB_REV = "Layoutlib.Revision"; //$NON-NLS-1$
-
- // MinToolsPackage
-
- public static final String MIN_TOOLS_REV = "Platform.MinToolsRev"; //$NON-NLS-1$
-
- // PlatformPackage
-
- public static final String PLATFORM_VERSION = "Platform.Version"; //$NON-NLS-1$
- /** Code name of the platform. This has no bearing on the package being a preview or not. */
- public static final String PLATFORM_CODENAME = "Platform.CodeName"; //$NON-NLS-1$
- public static final String PLATFORM_INCLUDED_ABI = "Platform.Included.Abi"; //$NON-NLS-1$
-
- // ToolPackage
-
- public static final String MIN_PLATFORM_TOOLS_REV = "Platform.MinPlatformToolsRev";//$NON-NLS-1$
-
-
- // SamplePackage
-
- public static final String SAMPLE_MIN_API_LEVEL = "Sample.MinApiLevel"; //$NON-NLS-1$
-
- // SystemImagePackage
-
- public static final String SYS_IMG_ABI = "SystemImage.Abi"; //$NON-NLS-1$
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/README.txt b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/README.txt
deleted file mode 100755
index e6e0f63..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/README.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-This directory contains the XML Schemas (XSD) used by the Android SDK Repository.
-
-The repository exports all the packages that compose the SDK as well as
-various manifest that define what is available in the repository.
-The XML schemas available here allows clients to validate the manifests.
-
-TODO:
-- overview of schemas
-- principles of design
-- principles of evolution vs revision numbers
-- naming convention
-- using by "make sdk_repo"
-
-
-Naming Convention
------------------
-
-Repository schemas are named sdk-type-N.xsd where
-- type is either addon, addons-list or repository.
-- N is the schema revision number, starting at 1 and increment with each revision.
-
-Schemas can also be named -sdk-type-N.xsd.
-The dash prefix means this schema is a *future* schema that is not yet
-used in production. This allows the repository to test future schemas
-before they are deployed.
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/RepoConstants.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/RepoConstants.java
deleted file mode 100755
index 3fdfc91..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/RepoConstants.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright (C) 2010 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.repository;
-
-import java.io.InputStream;
-
-
-
-/**
- * Public constants common to the sdk-repository and sdk-addon XML Schemas.
- */
-public class RepoConstants {
-
- /** The license definition. */
- public static final String NODE_LICENSE = "license"; //$NON-NLS-1$
- /** The optional uses-license for all packages or for a lib. */
- public static final String NODE_USES_LICENSE = "uses-license"; //$NON-NLS-1$
- /** The revision, an int > 0, for all packages. */
- public static final String NODE_REVISION = "revision"; //$NON-NLS-1$
- /** The optional description for all packages or for a lib. */
- public static final String NODE_DESCRIPTION = "description"; //$NON-NLS-1$
- /** The optional description URL for all packages. */
- public static final String NODE_DESC_URL = "desc-url"; //$NON-NLS-1$
- /** The optional release note for all packages. */
- public static final String NODE_RELEASE_NOTE = "release-note"; //$NON-NLS-1$
- /** The optional release note URL for all packages. */
- public static final String NODE_RELEASE_URL = "release-url"; //$NON-NLS-1$
- /** The optional obsolete qualifier for all packages. */
- public static final String NODE_OBSOLETE = "obsolete"; //$NON-NLS-1$
- /** The optional project-files provided by extra packages. */
- public static final String NODE_PROJECT_FILES = "project-files"; //$NON-NLS-1$
-
- /** A system-image package. */
- public static final String NODE_SYSTEM_IMAGE = "system-image"; //$NON-NLS-1$
-
- /* An included-ABI element for a system-image package. */
- public static final String NODE_ABI_INCLUDED = "included-abi"; //$NON-NLS-1$
- /* An ABI element for a system-image package. */
- public static final String NODE_ABI = "abi"; //$NON-NLS-1$
-
- /** The optional minimal tools revision required by platform & extra packages. */
- public static final String NODE_MIN_TOOLS_REV = "min-tools-rev"; //$NON-NLS-1$
- /** The optional minimal platform-tools revision required by tool packages. */
- public static final String NODE_MIN_PLATFORM_TOOLS_REV = "min-platform-tools-rev"; //$NON-NLS-1$
- /** The optional minimal API level required by extra packages. */
- public static final String NODE_MIN_API_LEVEL = "min-api-level"; //$NON-NLS-1$
-
- /** The version, a string, for platform packages. */
- public static final String NODE_VERSION = "version"; //$NON-NLS-1$
- /** The api-level, an int > 0, for platform, add-on and doc packages. */
- public static final String NODE_API_LEVEL = "api-level"; //$NON-NLS-1$
- /** The codename, a string, for platform packages. */
- public static final String NODE_CODENAME = "codename"; //$NON-NLS-1$
- /** The *old* vendor, a string, for add-on and extra packages.
- * Replaced by {@link #NODE_VENDOR_DISPLAY} and {@link #NODE_VENDOR_ID} in addon-v4.xsd. */
- public static final String NODE_VENDOR = "vendor"; //$NON-NLS-1$
- /** The vendor display string, for add-on and extra packages. */
- public static final String NODE_VENDOR_DISPLAY = "vendor-display"; //$NON-NLS-1$
- /** The unique vendor id string, for add-on and extra packages. */
- public static final String NODE_VENDOR_ID = "vendor-id"; //$NON-NLS-1$
- /** The name, a string, for add-on packages or for libraries.
- * Replaced by {@link #NODE_NAME_DISPLAY} and {@link #NODE_NAME_ID} in addon-v4.xsd. */
- public static final String NODE_NAME = "name"; //$NON-NLS-1$
- /** The name display string, for add-on packages or for libraries. */
- public static final String NODE_NAME_DISPLAY = "name-display"; //$NON-NLS-1$
- /** The unique name id string, for add-on packages or for libraries. */
- public static final String NODE_NAME_ID = "name-id"; //$NON-NLS-1$
-
-
- /** A layoutlib package. */
- public static final String NODE_LAYOUT_LIB = "layoutlib"; //$NON-NLS-1$
- /** The API integer for a layoutlib element. */
- public static final String NODE_API = "api"; //$NON-NLS-1$
-
- /** The libs container, optional for an add-on. */
- public static final String NODE_LIBS = "libs"; //$NON-NLS-1$
- /** A lib element in a libs container. */
- public static final String NODE_LIB = "lib"; //$NON-NLS-1$
-
- /** The path segment, a string, for extra packages. */
- public static final String NODE_PATH = "path"; //$NON-NLS-1$
-
- /** The old_path segments, a string, for extra packages. */
- public static final String NODE_OLD_PATHS = "old-paths"; //$NON-NLS-1$
-
- /** The archives container, for all packages. */
- public static final String NODE_ARCHIVES = "archives"; //$NON-NLS-1$
- /** An archive element, for the archives container. */
- public static final String NODE_ARCHIVE = "archive"; //$NON-NLS-1$
-
- /** An archive size, an int > 0. */
- public static final String NODE_SIZE = "size"; //$NON-NLS-1$
- /** A sha1 archive checksum, as a 40-char hex. */
- public static final String NODE_CHECKSUM = "checksum"; //$NON-NLS-1$
- /** A download archive URL, either absolute or relative to the repository xml. */
- public static final String NODE_URL = "url"; //$NON-NLS-1$
-
- /** An archive checksum type, mandatory. */
- public static final String ATTR_TYPE = "type"; //$NON-NLS-1$
- /** An archive OS attribute, mandatory. */
- public static final String ATTR_OS = "os"; //$NON-NLS-1$
- /** An optional archive Architecture attribute. */
- public static final String ATTR_ARCH = "arch"; //$NON-NLS-1$
-
- /** A license definition ID. */
- public static final String ATTR_ID = "id"; //$NON-NLS-1$
- /** A license reference. */
- public static final String ATTR_REF = "ref"; //$NON-NLS-1$
-
- /** Type of a sha1 checksum. */
- public static final String SHA1_TYPE = "sha1"; //$NON-NLS-1$
-
- /** Length of a string representing a SHA1 checksum; always 40 characters long. */
- public static final int SHA1_CHECKSUM_LEN = 40;
-
- /**
- * Temporary folder used to hold downloads and extract archives during installation.
- * This folder will be located in the SDK.
- */
- public static final String FD_TEMP = "temp"; //$NON-NLS-1$
-
- /**
- * Returns a stream to the requested XML Schema.
- * This is an internal helper. Users of the library should call
- * {@link SdkRepoConstants#getXsdStream(String, int)} or
- * {@link SdkAddonConstants#getXsdStream(String, int)}.
- *
- * @param rootElement The root of the filename of the XML schema.
- * This is by convention the same as the root element declared by the schema.
- * @param version The XML schema revision number, an integer >= 1.
- * @return An {@link InputStream} object for the local XSD file or
- * null if there is no schema for the requested version.
- * @see SdkRepoConstants#getXsdStream(int)
- * @see SdkAddonConstants#getXsdStream(int)
- */
- protected static InputStream getXsdStream(String rootElement, int version) {
- String filename = String.format("%1$s-%2$d.xsd", rootElement, version); //$NON-NLS-1$
-
- InputStream stream = null;
- try {
- stream = RepoConstants.class.getResourceAsStream(filename);
- } catch (Exception e) {
- // Some implementations seem to return null on failure,
- // others throw an exception. We want to return null.
- }
- if (stream == null) {
- // Try the alternate schemas that are not published yet.
- // This allows us to internally test with new schemas before the
- // public repository uses it.
- filename = String.format("-%1$s-%2$d.xsd", rootElement, version); //$NON-NLS-1$
- try {
- stream = RepoConstants.class.getResourceAsStream(filename);
- } catch (Exception e) {
- // Some implementations seem to return null on failure,
- // others throw an exception. We want to return null.
- }
- }
-
- return stream;
- }
-
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/SdkAddonConstants.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/SdkAddonConstants.java
deleted file mode 100755
index 4af2276..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/SdkAddonConstants.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2010 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.repository;
-
-
-import com.android.sdklib.internal.repository.sources.SdkSource;
-
-import java.io.InputStream;
-
-/**
- * Public constants for the sdk-addon XML Schema.
- */
-public class SdkAddonConstants extends RepoConstants {
-
- /**
- * The default name looked for by {@link SdkSource} when trying to load an
- * sdk-addon XML if the URL doesn't match an existing resource.
- */
- public static final String URL_DEFAULT_FILENAME = "addon.xml"; //$NON-NLS-1$
-
- /** The base of our sdk-addon XML namespace. */
- private static final String NS_BASE =
- "http://schemas.android.com/sdk/android/addon/"; //$NON-NLS-1$
-
- /**
- * The pattern of our sdk-addon XML namespace.
- * Matcher's group(1) is the schema version (integer).
- */
- public static final String NS_PATTERN = NS_BASE + "([1-9][0-9]*)"; //$NON-NLS-1$
-
- /**
- * The latest version of the sdk-addon 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-addon XML. */
- public static final String NS_URI = getSchemaUri(NS_LATEST_VERSION);
-
- /** The root sdk-addon element */
- public static final String NODE_SDK_ADDON = "sdk-addon"; //$NON-NLS-1$
-
- /** An add-on package. */
- public static final String NODE_ADD_ON = "add-on"; //$NON-NLS-1$
-
- /** An extra package. */
- public static final String NODE_EXTRA = "extra"; //$NON-NLS-1$
-
- /**
- * List of possible nodes in a repository XML. Used to populate options automatically
- * in the no-GUI mode.
- */
- public static final String[] NODES = {
- NODE_ADD_ON,
- NODE_EXTRA
- };
-
- /**
- * Returns a stream to the requested {@code sdk-addon} XML Schema.
- *
- * @param version Between 1 and {@link #NS_LATEST_VERSION}, included.
- * @return An {@link InputStream} object for the local XSD file or
- * null if there is no schema for the requested version.
- */
- public static InputStream getXsdStream(int version) {
- return getXsdStream(NODE_SDK_ADDON, version);
- }
-
- /**
- * Returns the URI of the sdk-addon schema for the given version number.
- * @param version Between 1 and {@link #NS_LATEST_VERSION} included.
- */
- public static String getSchemaUri(int version) {
- return String.format(NS_BASE + "%d", version); //$NON-NLS-1$
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/SdkAddonsListConstants.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/SdkAddonsListConstants.java
deleted file mode 100755
index 4f6b897..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/SdkAddonsListConstants.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2010 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.repository;
-
-
-import java.io.InputStream;
-
-/**
- * Public constants for the sdk-addons-list XML Schema.
- */
-public class SdkAddonsListConstants {
-
- /** The base of our sdk-addons-list XML namespace. */
- private static final String NS_BASE =
- "http://schemas.android.com/sdk/android/addons-list/"; //$NON-NLS-1$
-
- /**
- * The pattern of our sdk-addons-list XML namespace.
- * Matcher's group(1) is the schema version (integer).
- */
- public static final String NS_PATTERN = NS_BASE + "([1-9][0-9]*)"; //$NON-NLS-1$
-
- /** The latest version of the sdk-addons-list XML Schema.
- * Valid version numbers are between 1 and this number, included. */
- public static final int NS_LATEST_VERSION = 2;
-
- /** The XML namespace of the latest sdk-addons-list XML. */
- public static final String NS_URI = getSchemaUri(NS_LATEST_VERSION);
-
-
- /** The canonical URL filename for addons-list XML files. */
- public static final String URL_DEFAULT_FILENAME = getDefaultName(NS_LATEST_VERSION);
-
- /** The URL where to find the official addons list fle. */
- public static final String URL_ADDON_LIST =
- SdkRepoConstants.URL_GOOGLE_SDK_SITE + URL_DEFAULT_FILENAME;
-
-
-
- /** The root sdk-addons-list element */
- public static final String NODE_SDK_ADDONS_LIST = "sdk-addons-list"; //$NON-NLS-1$
-
- /** An add-on site. */
- public static final String NODE_ADDON_SITE = "addon-site"; //$NON-NLS-1$
-
- /** A system image site. */
- public static final String NODE_SYS_IMG_SITE = "sys-img-site"; //$NON-NLS-1$
-
- /** The UI-visible name of the add-on site. */
- public static final String NODE_NAME = "name"; //$NON-NLS-1$
-
- /**
- * The URL of the site.
- * <p/>
- * This can be either the exact URL of the an XML resource conforming
- * to the latest sdk-addon-N.xsd schema, or it can be the URL of a
- * 'directory', in which case the manager will look for a resource
- * named 'addon.xml' at this location.
- * <p/>
- * Examples:
- * <pre>
- * http://www.example.com/android/my_addons.xml
- * or
- * http://www.example.com/android/
- * </pre>
- * In the second example, the manager will actually look for
- * http://www.example.com/android/addon.xml
- */
- public static final String NODE_URL = "url"; //$NON-NLS-1$
-
- /**
- * Returns a stream to the requested sdk-addon XML Schema.
- *
- * @param version Between 1 and {@link #NS_LATEST_VERSION}, included.
- * @return An {@link InputStream} object for the local XSD file or
- * null if there is no schema for the requested version.
- */
- public static InputStream getXsdStream(int version) {
- String filename = String.format("sdk-addons-list-%d.xsd", version); //$NON-NLS-1$
- return SdkAddonsListConstants.class.getResourceAsStream(filename);
- }
-
- /**
- * Returns the URI of the sdk-addon schema for the given version number.
- * @param version Between 1 and {@link #NS_LATEST_VERSION} included.
- */
- public static String getSchemaUri(int version) {
- return String.format(NS_BASE + "%d", version); //$NON-NLS-1$
- }
-
- public static String getDefaultName(int version) {
- return String.format("addons_list-%1$d.xml", version); //$NON-NLS-1$
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/SdkRepoConstants.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/SdkRepoConstants.java
deleted file mode 100755
index 48c9b25..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/SdkRepoConstants.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (C) 2009 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.repository;
-
-
-import com.android.sdklib.internal.repository.sources.SdkSource;
-
-import java.io.InputStream;
-
-/**
- * Public constants for the sdk-repository XML Schema.
- */
-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 = 7;
-
- /**
- * The min version of the sdk-repository XML Schema we'll try to load.
- * When looking for a repository-N.xml on the server, we'll check from
- * {@link #NS_LATEST_VERSION} down to this revision.
- * We only introduced the "repository-N.xml" pattern start with revision
- * 5, so we know that <em>our</em> server will never contain a repository
- * XML with a schema version lower than this one.
- */
- public static final int NS_SERVER_MIN_VERSION = 5;
-
- /**
- * The URL of the official Google sdk-repository site.
- * The URL ends with a /, allowing easy concatenation.
- * */
- public static final String URL_GOOGLE_SDK_SITE =
- "https://dl-ssl.google.com/android/repository/"; //$NON-NLS-1$
-
- /**
- * The default name looked for by {@link SdkSource} when trying to load an
- * 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
- * an sdk-repository XML that is specific to a given XSD revision.
- * <p/>
- * This must be used with {@link String#format(String, Object...)} with
- * one integer parameter between 1 and {@link #NS_LATEST_VERSION}.
- */
- public static final String URL_FILENAME_PATTERN = "repository-%1$d.xml"; //$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$
-
- /**
- * The pattern of our sdk-repository XML namespace.
- * Matcher's group(1) is the schema version (integer).
- */
- public static final String NS_PATTERN = NS_BASE + "([1-9][0-9]*)"; //$NON-NLS-1$
-
- /** The XML namespace of the latest sdk-repository XML. */
- public static final String NS_URI = getSchemaUri(NS_LATEST_VERSION);
-
- /** The root sdk-repository element */
- public static final String NODE_SDK_REPOSITORY = "sdk-repository"; //$NON-NLS-1$
-
- /* The major revision for tool and platform-tool package
- * (the full revision number is revision.minor.micro + preview#.)
- * Mandatory int > 0. 0 when missing, which should not happen in
- * a valid document. */
- public static final String NODE_MAJOR_REV = "major"; //$NON-NLS-1$
- /* The minor revision for tool and platform-tool package
- * (the full revision number is revision.minor.micro + preview#.)
- * Optional int >= 0. Implied to be 0 when missing. */
- public static final String NODE_MINOR_REV = "minor"; //$NON-NLS-1$
- /* The micro revision for tool and platform-tool package
- * (the full revision number is revision.minor.micro + preview#.)
- * Optional int >= 0. Implied to be 0 when missing. */
- public static final String NODE_MICRO_REV = "micro"; //$NON-NLS-1$
- /* The preview revision for tool and platform-tool package.
- * Int > 0, only present for "preview / release candidate" packages. */
- public static final String NODE_PREVIEW = "preview"; //$NON-NLS-1$
-
- /** A platform package. */
- public static final String NODE_PLATFORM = "platform"; //$NON-NLS-1$
- /** A tool package. */
- public static final String NODE_TOOL = "tool"; //$NON-NLS-1$
- /** A platform-tool package. */
- public static final String NODE_PLATFORM_TOOL = "platform-tool"; //$NON-NLS-1$
- /** A doc package. */
- public static final String NODE_DOC = "doc"; //$NON-NLS-1$
- /** A sample package. */
- public static final String NODE_SAMPLE = "sample"; //$NON-NLS-1$
- /** A source package. */
- public static final String NODE_SOURCE = "source"; //$NON-NLS-1$
-
-
- /**
- * List of possible nodes in a repository XML. Used to populate options automatically
- * in the no-GUI mode.
- */
- public static final String[] NODES = {
- NODE_PLATFORM,
- NODE_SYSTEM_IMAGE,
- NODE_TOOL,
- NODE_PLATFORM_TOOL,
- NODE_DOC,
- NODE_SAMPLE,
- NODE_SOURCE,
- };
-
- /**
- * Returns a stream to the requested {@code sdk-repository} XML Schema.
- *
- * @param version Between 1 and {@link #NS_LATEST_VERSION}, included.
- * @return An {@link InputStream} object for the local XSD file or
- * null if there is no schema for the requested version.
- */
- public static InputStream getXsdStream(int version) {
- return getXsdStream(NODE_SDK_REPOSITORY, version);
- }
-
- /**
- * Returns the URI of the SDK Repository schema for the given version number.
- * @param version Between 1 and {@link #NS_LATEST_VERSION} included.
- */
- public static String getSchemaUri(int version) {
- return String.format(NS_BASE + "%d", version); //$NON-NLS-1$
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/SdkStatsConstants.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/SdkStatsConstants.java
deleted file mode 100755
index 22f8aa2..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/SdkStatsConstants.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2012 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.repository;
-
-
-import java.io.InputStream;
-
-/**
- * Public constants for the sdk-stats XML Schema.
- */
-public class SdkStatsConstants {
-
- /** The canonical URL filename for addons-list XML files. */
- public static final String URL_DEFAULT_FILENAME = "stats-1.xml"; //$NON-NLS-1$
-
- /** The URL where to find the official addons list fle. */
- public static final String URL_STATS =
- SdkRepoConstants.URL_GOOGLE_SDK_SITE + URL_DEFAULT_FILENAME;
-
- /** The base of our sdk-addons-list XML namespace. */
- private static final String NS_BASE =
- "http://schemas.android.com/sdk/android/stats/"; //$NON-NLS-1$
-
- /**
- * The pattern of our sdk-stats XML namespace.
- * Matcher's group(1) is the schema version (integer).
- */
- public static final String NS_PATTERN = NS_BASE + "([1-9][0-9]*)"; //$NON-NLS-1$
-
- /** The latest version of the sdk-stats XML Schema.
- * Valid version numbers are between 1 and this number, included. */
- public static final int NS_LATEST_VERSION = 1;
-
- /** The XML namespace of the latest sdk-stats XML. */
- public static final String NS_URI = getSchemaUri(NS_LATEST_VERSION);
-
- /** The root sdk-stats element */
- public static final String NODE_SDK_STATS = "sdk-stats"; //$NON-NLS-1$
-
- /** A platform stat. */
- public static final String NODE_PLATFORM = "platform"; //$NON-NLS-1$
-
- /** The Android API Level for the platform. An int > 0. */
- public static final String NODE_API_LEVEL = "api-level"; //$NON-NLS-1$
-
- /** The official codename for this platform, for example "Cupcake". */
- public static final String NODE_CODENAME = "codename"; //$NON-NLS-1$
-
- /** The official version name of this platform, for example "Android 1.5". */
- public static final String NODE_VERSION = "version"; //$NON-NLS-1$
-
- /**
- * The <em>approximate</em> share percentage of that platform.
- * See the caveat in sdk-stats-1.xsd about value freshness and accuracy.
- */
- public static final String NODE_SHARE = "share"; //$NON-NLS-1$
-
- /**
- * Returns a stream to the requested sdk-stats XML Schema.
- *
- * @param version Between 1 and {@link #NS_LATEST_VERSION}, included.
- * @return An {@link InputStream} object for the local XSD file or
- * null if there is no schema for the requested version.
- */
- public static InputStream getXsdStream(int version) {
- String filename = String.format("sdk-stats-%d.xsd", version); //$NON-NLS-1$
- return SdkStatsConstants.class.getResourceAsStream(filename);
- }
-
- /**
- * Returns the URI of the sdk-stats schema for the given version number.
- * @param version Between 1 and {@link #NS_LATEST_VERSION} included.
- */
- public static String getSchemaUri(int version) {
- return String.format(NS_BASE + "%d", version); //$NON-NLS-1$
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/SdkSysImgConstants.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/SdkSysImgConstants.java
deleted file mode 100755
index ba3017f..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/SdkSysImgConstants.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2012 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.repository;
-
-
-import com.android.sdklib.internal.repository.sources.SdkSource;
-
-import java.io.InputStream;
-
-/**
- * Public constants for the sdk-sys-img XML Schema.
- */
-public class SdkSysImgConstants extends RepoConstants {
-
- /**
- * The default name looked for by {@link SdkSource} when trying to load an
- * sdk-sys-img XML if the URL doesn't match an existing resource.
- */
- public static final String URL_DEFAULT_FILENAME = "sys-img.xml"; //$NON-NLS-1$
-
- /** The base of our sdk-sys-img XML namespace. */
- private static final String NS_BASE =
- "http://schemas.android.com/sdk/android/sys-img/"; //$NON-NLS-1$
-
- /**
- * The pattern of our sdk-sys-img XML namespace.
- * Matcher's group(1) is the schema version (integer).
- */
- public static final String NS_PATTERN = NS_BASE + "([1-9][0-9]*)"; //$NON-NLS-1$
-
- /**
- * The latest version of the sdk-sys-img XML Schema.
- * Valid version numbers are between 1 and this number, included.
- */
- public static final int NS_LATEST_VERSION = 1;
-
- /** The XML namespace of the latest sdk-sys-img XML. */
- public static final String NS_URI = getSchemaUri(NS_LATEST_VERSION);
-
- /** The root sdk-sys-img element */
- public static final String NODE_SDK_SYS_IMG = "sdk-sys-img"; //$NON-NLS-1$
-
- /**
- * List of possible nodes in a repository XML. Used to populate options automatically
- * in the no-GUI mode.
- */
- public static final String[] NODES = {
- NODE_SYSTEM_IMAGE,
- };
-
- /**
- * Returns a stream to the requested {@code sdk-sys-img} XML Schema.
- *
- * @param version Between 1 and {@link #NS_LATEST_VERSION}, included.
- * @return An {@link InputStream} object for the local XSD file or
- * null if there is no schema for the requested version.
- */
- public static InputStream getXsdStream(int version) {
- return getXsdStream(NODE_SDK_SYS_IMG, version);
- }
-
- /**
- * Returns the URI of the sdk-sys-img schema for the given version number.
- * @param version Between 1 and {@link #NS_LATEST_VERSION} included.
- */
- public static String getSchemaUri(int version) {
- return String.format(NS_BASE + "%d", version); //$NON-NLS-1$
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-addon-1.xsd b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-addon-1.xsd
deleted file mode 100755
index 1d53313..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-addon-1.xsd
+++ /dev/null
@@ -1,295 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<xsd:schema
- targetNamespace="http://schemas.android.com/sdk/android/addon/1"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:sdk="http://schemas.android.com/sdk/android/addon/1"
- elementFormDefault="qualified"
- attributeFormDefault="unqualified"
- version="1">
-
- <!-- The repository contains a collection of downloadable items known as
- "packages". Each package has a type and various attributes and contains
- a list of file "archives" that can be downloaded for specific OSes.
-
- An Android Addon repository is a web site that contains an "addon.xml"
- file that conforms to this XML Schema.
-
- History:
- - v1 is used by the SDK Updater in Tools r8. It is split out of the
- main SDK Repository XML Schema and can only contain <addon> and
- <extra> packages.
- -->
-
- <xsd:element name="sdk-addon" type="sdk:repositoryType" />
-
- <xsd:complexType name="repositoryType">
- <xsd:annotation>
- <xsd:documentation>
- The repository contains a collection of downloadable packages.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:choice minOccurs="0" maxOccurs="unbounded">
- <xsd:element name="add-on" type="sdk:addonType" />
- <xsd:element name="extra" type="sdk:extraType" />
- <xsd:element name="license" type="sdk:licenseType" />
- </xsd:choice>
- </xsd:complexType>
-
- <!-- The definition of an SDK Add-on package. -->
-
- <xsd:complexType name="addonType">
- <xsd:annotation>
- <xsd:documentation>An SDK add-on package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The name of the add-on. -->
- <xsd:element name="name" type="xsd:normalizedString" />
- <!-- The vendor of the add-on. -->
- <xsd:element name="vendor" type="xsd:normalizedString" />
- <!-- The Android API Level for the add-on. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- Note: Add-ons do not support 'codename' (a.k.a. API previews). -->
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
-
- <!-- An add-on can declare 0 or more libraries. -->
-
- <xsd:element name="libs">
- <xsd:complexType>
- <xsd:sequence minOccurs="0" maxOccurs="unbounded">
- <xsd:element name="lib">
- <xsd:complexType>
- <xsd:all>
- <!-- The name of the library. -->
- <xsd:element name="name" type="xsd:normalizedString" />
- <!-- The optional description of this add-on library. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
- </xsd:element>
- </xsd:sequence>
- </xsd:complexType>
- </xsd:element>
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK extra package. This kind of package is for
- "free" content. Such packages are installed in SDK/vendor/path.
- -->
-
- <xsd:complexType name="extraType" >
- <xsd:annotation>
- <xsd:documentation>
- An SDK extra package. This kind of package is for "free" content.
- Such packages are installed in SDK/vendor/path.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:all>
-
- <!-- The install path top folder name. It must not be empty.
- The segments "add-ons", "docs", "platforms", "platform-tools", "temp"
- and "tools" are reserved and cannot be used.
- -->
- <xsd:element name="vendor" type="sdk:segmentType" />
-
- <!-- The install path sub-folder name. It must not be empty. -->
- <xsd:element name="path" type="sdk:segmentType" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
- <!-- The minimal revision of tools required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-tools-rev" type="xsd:positiveInteger" minOccurs="0" />
- <!-- The minimal API level required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-api-level" type="xsd:positiveInteger" minOccurs="0" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of a path segment used by the extra element. -->
-
- <xsd:simpleType name="segmentType">
- <xsd:annotation>
- <xsd:documentation>
- One path segment for the install path of an extra element.
- It must be a single-segment path. It must not be empty.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:pattern value="[a-zA-Z0-9_]+"/>
- </xsd:restriction>
- </xsd:simpleType>
-
-
- <!-- The definition of a license to be referenced by the uses-license element. -->
-
- <xsd:complexType name="licenseType">
- <xsd:annotation>
- <xsd:documentation>
- A license definition. Such a license must be used later as a reference
- using a uses-license element in one of the package elements.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:simpleContent>
- <xsd:extension base="xsd:string">
- <xsd:attribute name="id" type="xsd:ID" />
- <xsd:attribute name="type" type="xsd:token" fixed="text" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-
- <!-- Type describing the license used by a package.
- The license MUST be defined using a license node and referenced
- using the ref attribute of the license element inside a package.
- -->
-
- <xsd:complexType name="usesLicenseType">
- <xsd:annotation>
- <xsd:documentation>
- Describes the license used by a package. The license MUST be defined
- using a license node and referenced using the ref attribute of the
- license element inside a package.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="ref" type="xsd:IDREF" />
- </xsd:complexType>
-
-
- <!-- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository elements and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- -->
-
- <xsd:complexType name="archivesType">
- <xsd:annotation>
- <xsd:documentation>
- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository packages and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence minOccurs="1" maxOccurs="unbounded">
- <!-- One archive file -->
- <xsd:element name="archive">
- <xsd:complexType>
- <!-- Properties of the archive file -->
- <xsd:all>
- <!-- The size in bytes of the archive to download. -->
- <xsd:element name="size" type="xsd:positiveInteger" />
- <!-- The checksum of the archive file. -->
- <xsd:element name="checksum" type="sdk:checksumType" />
- <!-- The URL is an absolute URL if it starts with http://, https://
- or ftp://. Otherwise it is relative to the parent directory that
- contains this repository.xml -->
- <xsd:element name="url" type="xsd:token" />
- </xsd:all>
-
- <!-- Attributes that identify the OS and architecture -->
- <xsd:attribute name="os" use="required">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="linux" />
- <xsd:enumeration value="macosx" />
- <xsd:enumeration value="windows" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- <xsd:attribute name="arch" use="optional">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="ppc" />
- <xsd:enumeration value="x86" />
- <xsd:enumeration value="x86_64" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- </xsd:complexType>
- </xsd:element>
- </xsd:sequence>
- </xsd:complexType>
-
-
- <!-- The definition of a file checksum -->
-
- <xsd:simpleType name="sha1Number">
- <xsd:annotation>
- <xsd:documentation>A SHA1 checksum.</xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:string">
- <xsd:pattern value="([0-9a-fA-F]){40}"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:complexType name="checksumType">
- <xsd:annotation>
- <xsd:documentation>A file checksum, currently only SHA1.</xsd:documentation>
- </xsd:annotation>
- <xsd:simpleContent>
- <xsd:extension base="sdk:sha1Number">
- <xsd:attribute name="type" type="xsd:token" fixed="sha1" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-</xsd:schema>
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-addon-2.xsd b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-addon-2.xsd
deleted file mode 100755
index 27fae8b..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-addon-2.xsd
+++ /dev/null
@@ -1,361 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<xsd:schema
- targetNamespace="http://schemas.android.com/sdk/android/addon/2"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:sdk="http://schemas.android.com/sdk/android/addon/2"
- elementFormDefault="qualified"
- attributeFormDefault="unqualified"
- version="1">
-
- <!-- The repository contains a collection of downloadable items known as
- "packages". Each package has a type and various attributes and contains
- a list of file "archives" that can be downloaded for specific OSes.
-
- An Android Addon repository is a web site that contains an "addon.xml"
- file that conforms to this XML Schema.
-
- History:
- - v1 is used by the SDK Updater in Tools r8. It is split out of the
- main SDK Repository XML Schema and can only contain <addon> and
- <extra> packages.
-
- - v2 is used by the SDK Updater in Tools r12.
- - <extra> element now has a <project-files> element that contains 1 or
- or more <path>, each indicating the relative path of a file that this package
- can contribute to installed projects.
- - <addon> element now has an optional <layoutlib> that indicates the API
- and revision of the layout library for this particular add-on, if any.
- -->
-
- <xsd:element name="sdk-addon" type="sdk:repositoryType" />
-
- <xsd:complexType name="repositoryType">
- <xsd:annotation>
- <xsd:documentation>
- The repository contains a collection of downloadable packages.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:choice minOccurs="0" maxOccurs="unbounded">
- <xsd:element name="add-on" type="sdk:addonType" />
- <xsd:element name="extra" type="sdk:extraType" />
- <xsd:element name="license" type="sdk:licenseType" />
- </xsd:choice>
- </xsd:complexType>
-
- <!-- The definition of an SDK Add-on package. -->
-
- <xsd:complexType name="addonType">
- <xsd:annotation>
- <xsd:documentation>An SDK add-on package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The name of the add-on. -->
- <xsd:element name="name" type="xsd:normalizedString" />
- <!-- The vendor of the add-on. -->
- <xsd:element name="vendor" type="xsd:normalizedString" />
- <!-- The Android API Level for the add-on. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- Note: Add-ons do not support 'codenames' (a.k.a. API previews). -->
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
-
- <!-- An add-on can declare 0 or more libraries.
- This element is mandatory but it can be empty.
- -->
-
- <xsd:element name="libs">
- <xsd:complexType>
- <xsd:sequence minOccurs="0" maxOccurs="unbounded">
- <xsd:element name="lib">
- <xsd:complexType>
- <xsd:all>
- <!-- The name of the library. -->
- <xsd:element name="name" type="xsd:normalizedString" />
- <!-- The optional description of this add-on library. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
- </xsd:element>
- </xsd:sequence>
- </xsd:complexType>
- </xsd:element>
-
- <!-- optional elements -->
-
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
-
- <!-- Optional information on the layoutlib packaged in this platform. -->
- <xsd:element name="layoutlib" type="sdk:layoutlibType" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of a layout library used by an addon. -->
-
- <xsd:complexType name="layoutlibType" >
- <xsd:annotation>
- <xsd:documentation>
- Version information for a layoutlib included in an addon.
- .</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The layoutlib API level, an int > 0,
- incremented with each new incompatible lib. -->
- <xsd:element name="api" type="xsd:positiveInteger" />
- <!-- The incremental minor revision for that API, e.g. in case of bug fixes.
- Optional. An int >= 0, assumed to be 0 if the element is missing. -->
- <xsd:element name="revision" type="xsd:nonNegativeInteger" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK extra package. This kind of package is for
- "free" content. Such packages are installed in SDK/vendor/path.
-
- Important implementation detail: this element is duplicated in the
- sdk-repository-N.xsd schema and must be kept in sync there. This is
- simpler than trying to use some kind of of include or to request
- that clients use a third XML schema for common parts.
- -->
-
- <xsd:complexType name="extraType" >
- <xsd:annotation>
- <xsd:documentation>
- An SDK extra package. This kind of package is for "free" content.
- Such packages are installed in SDK/vendor/path.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:all>
-
- <!-- The install path top folder name. It must not be empty.
- The segments "add-ons", "docs", "platforms", "platform-tools", "temp"
- and "tools" are reserved and cannot be used.
- -->
- <xsd:element name="vendor" type="sdk:segmentType" />
-
- <!-- The install path sub-folder name. It must not be empty. -->
- <xsd:element name="path" type="sdk:segmentType" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
-
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- optional elements -->
-
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- The minimal revision of tools required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-tools-rev" type="xsd:positiveInteger" minOccurs="0" />
- <!-- The minimal API level required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-api-level" type="xsd:positiveInteger" minOccurs="0" />
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
-
- <!-- A list of project files contributed by this package. Optional. -->
- <xsd:element name="project-files" type="sdk:projectFilesType" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of a path segment used by the extra element. -->
-
- <xsd:simpleType name="segmentType">
- <xsd:annotation>
- <xsd:documentation>
- One path segment for the install path of an extra element.
- It must be a single-segment path. It must not be empty.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:pattern value="[a-zA-Z0-9_]+"/>
- </xsd:restriction>
- </xsd:simpleType>
-
-
- <!-- The definition of a license to be referenced by the uses-license element. -->
-
- <xsd:complexType name="licenseType">
- <xsd:annotation>
- <xsd:documentation>
- A license definition. Such a license must be used later as a reference
- using a uses-license element in one of the package elements.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:simpleContent>
- <xsd:extension base="xsd:string">
- <xsd:attribute name="id" type="xsd:ID" />
- <xsd:attribute name="type" type="xsd:token" fixed="text" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-
- <!-- Type describing the license used by a package.
- The license MUST be defined using a license node and referenced
- using the ref attribute of the license element inside a package.
- -->
-
- <xsd:complexType name="usesLicenseType">
- <xsd:annotation>
- <xsd:documentation>
- Describes the license used by a package. The license MUST be defined
- using a license node and referenced using the ref attribute of the
- license element inside a package.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="ref" type="xsd:IDREF" />
- </xsd:complexType>
-
-
- <!-- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository elements and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- -->
-
- <xsd:complexType name="archivesType">
- <xsd:annotation>
- <xsd:documentation>
- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository packages and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence minOccurs="1" maxOccurs="unbounded">
- <!-- One archive file -->
- <xsd:element name="archive">
- <xsd:complexType>
- <!-- Properties of the archive file -->
- <xsd:all>
- <!-- The size in bytes of the archive to download. -->
- <xsd:element name="size" type="xsd:positiveInteger" />
- <!-- The checksum of the archive file. -->
- <xsd:element name="checksum" type="sdk:checksumType" />
- <!-- The URL is an absolute URL if it starts with http://, https://
- or ftp://. Otherwise it is relative to the parent directory that
- contains this repository.xml -->
- <xsd:element name="url" type="xsd:token" />
- </xsd:all>
-
- <!-- Attributes that identify the OS and architecture -->
- <xsd:attribute name="os" use="required">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="linux" />
- <xsd:enumeration value="macosx" />
- <xsd:enumeration value="windows" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- <xsd:attribute name="arch" use="optional">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="ppc" />
- <xsd:enumeration value="x86" />
- <xsd:enumeration value="x86_64" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- </xsd:complexType>
- </xsd:element>
- </xsd:sequence>
- </xsd:complexType>
-
-
- <!-- A collection of file paths available in an <extra> package
- that can be installed in an Android project.
- If present, the <project-files> collection must contain at least one path.
- Each path is relative to the root directory of the package.
- -->
-
- <xsd:complexType name="projectFilesType">
- <xsd:annotation>
- <xsd:documentation>
- A collection of file paths available in an <extra> package
- that can be installed in an Android project.
- If present, the <project-files> collection must contain at least one path.
- Each path is relative to the root directory of the package.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence minOccurs="1" maxOccurs="unbounded">
- <!-- One JAR Path, relative to the root folder of the package. -->
- <xsd:element name="path" type="xsd:string" />
- </xsd:sequence>
- </xsd:complexType>
-
-
- <!-- The definition of a file checksum -->
-
- <xsd:simpleType name="sha1Number">
- <xsd:annotation>
- <xsd:documentation>A SHA1 checksum.</xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:string">
- <xsd:pattern value="([0-9a-fA-F]){40}"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:complexType name="checksumType">
- <xsd:annotation>
- <xsd:documentation>A file checksum, currently only SHA1.</xsd:documentation>
- </xsd:annotation>
- <xsd:simpleContent>
- <xsd:extension base="sdk:sha1Number">
- <xsd:attribute name="type" type="xsd:token" fixed="sha1" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-</xsd:schema>
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-addon-3.xsd b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-addon-3.xsd
deleted file mode 100755
index ccd00c2..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-addon-3.xsd
+++ /dev/null
@@ -1,381 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<xsd:schema
- targetNamespace="http://schemas.android.com/sdk/android/addon/3"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:sdk="http://schemas.android.com/sdk/android/addon/3"
- elementFormDefault="qualified"
- attributeFormDefault="unqualified"
- version="1">
-
- <!-- The repository contains a collection of downloadable items known as
- "packages". Each package has a type and various attributes and contains
- a list of file "archives" that can be downloaded for specific OSes.
-
- An Android Addon repository is a web site that contains an "addon.xml"
- file that conforms to this XML Schema.
-
- History:
- - v1 is used by the SDK Updater in Tools r8. It is split out of the
- main SDK Repository XML Schema and can only contain <addon> and
- <extra> packages.
-
- - v2 is used by the SDK Updater in Tools r12.
- - <extra> element now has a <project-files> element that contains 1 or
- or more <path>, each indicating the relative path of a file that this package
- can contribute to installed projects.
- - <addon> element now has an optional <layoutlib> that indicates the API
- and revision of the layout library for this particular add-on, if any.
-
- - v3 is used by the SDK Updater in Tools R14:
- - <extra> now has an <old-paths> element, a ;-separated list of old paths that
- should be detected and migrated to the new <path> for that package.
- -->
-
- <xsd:element name="sdk-addon" type="sdk:repositoryType" />
-
- <xsd:complexType name="repositoryType">
- <xsd:annotation>
- <xsd:documentation>
- The repository contains a collection of downloadable packages.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:choice minOccurs="0" maxOccurs="unbounded">
- <xsd:element name="add-on" type="sdk:addonType" />
- <xsd:element name="extra" type="sdk:extraType" />
- <xsd:element name="license" type="sdk:licenseType" />
- </xsd:choice>
- </xsd:complexType>
-
- <!-- The definition of an SDK Add-on package. -->
-
- <xsd:complexType name="addonType">
- <xsd:annotation>
- <xsd:documentation>An SDK add-on package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The name of the add-on. -->
- <xsd:element name="name" type="xsd:normalizedString" />
- <!-- The vendor of the add-on. -->
- <xsd:element name="vendor" type="xsd:normalizedString" />
- <!-- The Android API Level for the add-on. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- Note: Add-ons do not support 'codenames' (a.k.a. API previews). -->
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
-
- <!-- An add-on can declare 0 or more libraries.
- This element is mandatory but it can be empty.
- -->
-
- <xsd:element name="libs">
- <xsd:complexType>
- <xsd:sequence minOccurs="0" maxOccurs="unbounded">
- <xsd:element name="lib">
- <xsd:complexType>
- <xsd:all>
- <!-- The name of the library. -->
- <xsd:element name="name" type="xsd:normalizedString" />
- <!-- The optional description of this add-on library. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
- </xsd:element>
- </xsd:sequence>
- </xsd:complexType>
- </xsd:element>
-
- <!-- optional elements -->
-
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
-
- <!-- Optional information on the layoutlib packaged in this platform. -->
- <xsd:element name="layoutlib" type="sdk:layoutlibType" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of a layout library used by an addon. -->
-
- <xsd:complexType name="layoutlibType" >
- <xsd:annotation>
- <xsd:documentation>
- Version information for a layoutlib included in an addon.
- .</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The layoutlib API level, an int > 0,
- incremented with each new incompatible lib. -->
- <xsd:element name="api" type="xsd:positiveInteger" />
- <!-- The incremental minor revision for that API, e.g. in case of bug fixes.
- Optional. An int >= 0, assumed to be 0 if the element is missing. -->
- <xsd:element name="revision" type="xsd:nonNegativeInteger" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK extra package. This kind of package is for
- "free" content. Such packages are installed in SDK/vendor/path.
-
- Important implementation detail: this element is duplicated in the
- sdk-repository-N.xsd schema and must be kept in sync there. This is
- simpler than trying to use some kind of of include or to request
- that clients use a third XML schema for common parts.
- -->
-
- <xsd:complexType name="extraType" >
- <xsd:annotation>
- <xsd:documentation>
- An SDK extra package. This kind of package is for "free" content.
- Such packages are installed in SDK/vendor/path.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:all>
-
- <!-- The install path top folder name. It must not be empty.
- The segments "add-ons", "docs", "platforms", "platform-tools", "temp"
- and "tools" are reserved and cannot be used.
- -->
- <xsd:element name="vendor" type="sdk:segmentType" />
-
- <!-- The install path sub-folder name. It must not be empty. -->
- <xsd:element name="path" type="sdk:segmentType" />
-
- <!-- A semi-colon separated list of "obsolete" path names which are equivalent
- to the current 'path' name. When a package is seen using an old-paths' name,
- the package manager will try to upgrade it to the new path. -->
- <xsd:element name="old-paths" type="sdk:segmentListType" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
-
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- optional elements -->
-
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- The minimal revision of tools required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-tools-rev" type="xsd:positiveInteger" minOccurs="0" />
- <!-- The minimal API level required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-api-level" type="xsd:positiveInteger" minOccurs="0" />
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
-
- <!-- A list of project files contributed by this package. Optional. -->
- <xsd:element name="project-files" type="sdk:projectFilesType" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of a path segment used by the extra element. -->
-
- <xsd:simpleType name="segmentType">
- <xsd:annotation>
- <xsd:documentation>
- One path segment for the install path of an extra element.
- It must be a single-segment path. It must not be empty.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:pattern value="[a-zA-Z0-9_]+"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:simpleType name="segmentListType">
- <xsd:annotation>
- <xsd:documentation>
- A semi-colon separated list of a segmentTypes.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:pattern value="[a-zA-Z0-9_;]+"/>
- </xsd:restriction>
- </xsd:simpleType>
-
-
- <!-- The definition of a license to be referenced by the uses-license element. -->
-
- <xsd:complexType name="licenseType">
- <xsd:annotation>
- <xsd:documentation>
- A license definition. Such a license must be used later as a reference
- using a uses-license element in one of the package elements.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:simpleContent>
- <xsd:extension base="xsd:string">
- <xsd:attribute name="id" type="xsd:ID" />
- <xsd:attribute name="type" type="xsd:token" fixed="text" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-
- <!-- Type describing the license used by a package.
- The license MUST be defined using a license node and referenced
- using the ref attribute of the license element inside a package.
- -->
-
- <xsd:complexType name="usesLicenseType">
- <xsd:annotation>
- <xsd:documentation>
- Describes the license used by a package. The license MUST be defined
- using a license node and referenced using the ref attribute of the
- license element inside a package.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="ref" type="xsd:IDREF" />
- </xsd:complexType>
-
-
- <!-- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository elements and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- -->
-
- <xsd:complexType name="archivesType">
- <xsd:annotation>
- <xsd:documentation>
- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository packages and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence minOccurs="1" maxOccurs="unbounded">
- <!-- One archive file -->
- <xsd:element name="archive">
- <xsd:complexType>
- <!-- Properties of the archive file -->
- <xsd:all>
- <!-- The size in bytes of the archive to download. -->
- <xsd:element name="size" type="xsd:positiveInteger" />
- <!-- The checksum of the archive file. -->
- <xsd:element name="checksum" type="sdk:checksumType" />
- <!-- The URL is an absolute URL if it starts with http://, https://
- or ftp://. Otherwise it is relative to the parent directory that
- contains this repository.xml -->
- <xsd:element name="url" type="xsd:token" />
- </xsd:all>
-
- <!-- Attributes that identify the OS and architecture -->
- <xsd:attribute name="os" use="required">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="linux" />
- <xsd:enumeration value="macosx" />
- <xsd:enumeration value="windows" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- <xsd:attribute name="arch" use="optional">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="ppc" />
- <xsd:enumeration value="x86" />
- <xsd:enumeration value="x86_64" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- </xsd:complexType>
- </xsd:element>
- </xsd:sequence>
- </xsd:complexType>
-
-
- <!-- A collection of file paths available in an <extra> package
- that can be installed in an Android project.
- If present, the <project-files> collection must contain at least one path.
- Each path is relative to the root directory of the package.
- -->
-
- <xsd:complexType name="projectFilesType">
- <xsd:annotation>
- <xsd:documentation>
- A collection of file paths available in an <extra> package
- that can be installed in an Android project.
- If present, the <project-files> collection must contain at least one path.
- Each path is relative to the root directory of the package.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence minOccurs="1" maxOccurs="unbounded">
- <!-- One JAR Path, relative to the root folder of the package. -->
- <xsd:element name="path" type="xsd:string" />
- </xsd:sequence>
- </xsd:complexType>
-
-
- <!-- The definition of a file checksum -->
-
- <xsd:simpleType name="sha1Number">
- <xsd:annotation>
- <xsd:documentation>A SHA1 checksum.</xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:string">
- <xsd:pattern value="([0-9a-fA-F]){40}"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:complexType name="checksumType">
- <xsd:annotation>
- <xsd:documentation>A file checksum, currently only SHA1.</xsd:documentation>
- </xsd:annotation>
- <xsd:simpleContent>
- <xsd:extension base="sdk:sha1Number">
- <xsd:attribute name="type" type="xsd:token" fixed="sha1" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-</xsd:schema>
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-addon-4.xsd b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-addon-4.xsd
deleted file mode 100755
index c31efbf..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-addon-4.xsd
+++ /dev/null
@@ -1,417 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<xsd:schema
- targetNamespace="http://schemas.android.com/sdk/android/addon/4"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:sdk="http://schemas.android.com/sdk/android/addon/4"
- elementFormDefault="qualified"
- attributeFormDefault="unqualified"
- version="1">
-
- <!-- The repository contains a collection of downloadable items known as
- "packages". Each package has a type and various attributes and contains
- a list of file "archives" that can be downloaded for specific OSes.
-
- An Android Addon repository is a web site that contains an "addon.xml"
- file that conforms to this XML Schema.
-
- History:
- - v1 is used by the SDK Updater in Tools r8. It is split out of the
- main SDK Repository XML Schema and can only contain <addon> and
- <extra> packages.
-
- - v2 is used by the SDK Updater in Tools r12.
- - <extra> element now has a <project-files> element that contains 1 or
- or more <path>, each indicating the relative path of a file that this package
- can contribute to installed projects.
- - <addon> element now has an optional <layoutlib> that indicates the API
- and revision of the layout library for this particular add-on, if any.
-
- - v3 is used by the SDK Manager in Tools r14:
- - <extra> now has an <old-paths> element, a ;-separated list of old paths that
- should be detected and migrated to the new <path> for that package.
-
- - v4 is used by the SDK Manager in Tools r18:
- - <extra> and <addon> are not in the Repository XSD v6 anymore.
- - <extra> get a new field <name-display>, which is used by the SDK Manager to
- customize the name of the extra in the list display. The single <vendor>
- field becomes <vendor-id> and <vendor-display>, the id being used internally
- and the display in the UI.
- - <addon> does the same, where <name> is replaced by <name-id> and <name-display>
- and <vendor> is replaced by <vendor-id> and <vendor-display>.
- -->
-
- <xsd:element name="sdk-addon" type="sdk:repositoryType" />
-
- <xsd:complexType name="repositoryType">
- <xsd:annotation>
- <xsd:documentation>
- The repository contains a collection of downloadable packages.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:choice minOccurs="0" maxOccurs="unbounded">
- <xsd:element name="add-on" type="sdk:addonType" />
- <xsd:element name="extra" type="sdk:extraType" />
- <xsd:element name="license" type="sdk:licenseType" />
- </xsd:choice>
- </xsd:complexType>
-
- <!-- The definition of an SDK Add-on package. -->
-
- <xsd:complexType name="addonType">
- <xsd:annotation>
- <xsd:documentation>An SDK add-on package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The internal name id of the add-on. Must be unique per vendor. -->
- <xsd:element name="name-id" type="sdk:idType" />
- <!-- The displayed name of the add-on. -->
- <xsd:element name="name-display" type="xsd:normalizedString" />
-
- <!-- The internal vendor id of the add-on. Must be unique amongst vendors. -->
- <xsd:element name="vendor-id" type="sdk:idType" />
- <!-- The displayed vendor name of the add-on. -->
- <xsd:element name="vendor-display" type="xsd:normalizedString" />
-
- <!-- The Android API Level for the add-on. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- Note: Add-ons do not support 'codenames' (a.k.a. API previews). -->
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
-
- <!-- An add-on can declare 0 or more libraries.
- This element is mandatory but it can be empty.
- -->
-
- <xsd:element name="libs">
- <xsd:complexType>
- <xsd:sequence minOccurs="0" maxOccurs="unbounded">
- <xsd:element name="lib">
- <xsd:complexType>
- <xsd:all>
- <!-- The name of the library. -->
- <xsd:element name="name" type="xsd:normalizedString" />
- <!-- The optional description of this add-on library. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
- </xsd:element>
- </xsd:sequence>
- </xsd:complexType>
- </xsd:element>
-
- <!-- optional elements -->
-
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
-
- <!-- An optional element indicating the package is a beta/preview.
- When present, it indicates the release-candidate number.
- When the element is absent, it indicates this is a released package.
- DEPRECATED. TODO remove in sdk-addon-5. -->
- <xsd:element name="beta-rc" type="xsd:positiveInteger" minOccurs="0" />
-
- <!-- Optional information on the layoutlib packaged in this platform. -->
- <xsd:element name="layoutlib" type="sdk:layoutlibType" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <xsd:simpleType name="idType">
- <xsd:annotation>
- <xsd:documentation>
- An ID string for an addon/extra name-id or vendor-id
- can only be simple alphanumeric string.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:pattern value="[a-zA-Z0-9_-]+"/>
- </xsd:restriction>
- </xsd:simpleType>
-
-
- <!-- The definition of a layout library used by an addon. -->
-
- <xsd:complexType name="layoutlibType" >
- <xsd:annotation>
- <xsd:documentation>
- Version information for a layoutlib included in an addon.
- .</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The layoutlib API level, an int > 0,
- incremented with each new incompatible lib. -->
- <xsd:element name="api" type="xsd:positiveInteger" />
- <!-- The incremental minor revision for that API, e.g. in case of bug fixes.
- Optional. An int >= 0, assumed to be 0 if the element is missing. -->
- <xsd:element name="revision" type="xsd:nonNegativeInteger" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK extra package. This kind of package is for
- "free" content. Such packages are installed in SDK/extras/vendor/path.
- -->
-
- <xsd:complexType name="extraType" >
- <xsd:annotation>
- <xsd:documentation>
- An SDK extra package. This kind of package is for "free" content.
- Such packages are installed in SDK/vendor/path.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The displayed name of the extra. -->
- <xsd:element name="name-display" type="xsd:normalizedString" />
-
- <!-- The internal vendor id of the extra. Must be unique amongst vendors. -->
- <xsd:element name="vendor-id" type="sdk:idType" />
- <!-- The displayed vendor name of the extra. -->
- <xsd:element name="vendor-display" type="xsd:normalizedString" />
-
- <!-- The install path sub-folder name. It must not be empty. -->
- <xsd:element name="path" type="sdk:segmentType" />
-
- <!-- A semi-colon separated list of "obsolete" path names which are equivalent
- to the current 'path' name. When a package is seen using an old-paths' name,
- the package manager will try to upgrade it to the new path. -->
- <xsd:element name="old-paths" type="sdk:segmentListType" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
-
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- optional elements -->
-
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- The minimal revision of tools required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-tools-rev" type="xsd:positiveInteger" minOccurs="0" />
- <!-- The minimal API level required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-api-level" type="xsd:positiveInteger" minOccurs="0" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
-
- <!-- An optional element indicating the package is a beta/preview.
- When present, it indicates the release-candidate number.
- When the element is absent, it indicates this is a released package. -->
- <xsd:element name="beta-rc" type="xsd:positiveInteger" minOccurs="0" />
-
- <!-- A list of project files contributed by this package. Optional. -->
- <xsd:element name="project-files" type="sdk:projectFilesType" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of a path segment used by the extra element. -->
-
- <xsd:simpleType name="segmentType">
- <xsd:annotation>
- <xsd:documentation>
- One path segment for the install path of an extra element.
- It must be a single-segment path. It must not be empty.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:pattern value="[a-zA-Z0-9_]+"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:simpleType name="segmentListType">
- <xsd:annotation>
- <xsd:documentation>
- A semi-colon separated list of a segmentTypes.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:pattern value="[a-zA-Z0-9_;]+"/>
- </xsd:restriction>
- </xsd:simpleType>
-
-
- <!-- The definition of a license to be referenced by the uses-license element. -->
-
- <xsd:complexType name="licenseType">
- <xsd:annotation>
- <xsd:documentation>
- A license definition. Such a license must be used later as a reference
- using a uses-license element in one of the package elements.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:simpleContent>
- <xsd:extension base="xsd:string">
- <xsd:attribute name="id" type="xsd:ID" />
- <xsd:attribute name="type" type="xsd:token" fixed="text" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-
- <!-- Type describing the license used by a package.
- The license MUST be defined using a license node and referenced
- using the ref attribute of the license element inside a package.
- -->
-
- <xsd:complexType name="usesLicenseType">
- <xsd:annotation>
- <xsd:documentation>
- Describes the license used by a package. The license MUST be defined
- using a license node and referenced using the ref attribute of the
- license element inside a package.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="ref" type="xsd:IDREF" />
- </xsd:complexType>
-
-
- <!-- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository elements and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- -->
-
- <xsd:complexType name="archivesType">
- <xsd:annotation>
- <xsd:documentation>
- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository packages and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence minOccurs="1" maxOccurs="unbounded">
- <!-- One archive file -->
- <xsd:element name="archive">
- <xsd:complexType>
- <!-- Properties of the archive file -->
- <xsd:all>
- <!-- The size in bytes of the archive to download. -->
- <xsd:element name="size" type="xsd:positiveInteger" />
- <!-- The checksum of the archive file. -->
- <xsd:element name="checksum" type="sdk:checksumType" />
- <!-- The URL is an absolute URL if it starts with http://, https://
- or ftp://. Otherwise it is relative to the parent directory that
- contains this repository.xml -->
- <xsd:element name="url" type="xsd:token" />
- </xsd:all>
-
- <!-- Attributes that identify the OS and architecture -->
- <xsd:attribute name="os" use="required">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="linux" />
- <xsd:enumeration value="macosx" />
- <xsd:enumeration value="windows" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- <xsd:attribute name="arch" use="optional">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="ppc" />
- <xsd:enumeration value="x86" />
- <xsd:enumeration value="x86_64" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- </xsd:complexType>
- </xsd:element>
- </xsd:sequence>
- </xsd:complexType>
-
-
- <!-- A collection of file paths available in an <extra> package
- that can be installed in an Android project.
- If present, the <project-files> collection must contain at least one path.
- Each path is relative to the root directory of the package.
- -->
-
- <xsd:complexType name="projectFilesType">
- <xsd:annotation>
- <xsd:documentation>
- A collection of file paths available in an <extra> package
- that can be installed in an Android project.
- If present, the <project-files> collection must contain at least one path.
- Each path is relative to the root directory of the package.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence minOccurs="1" maxOccurs="unbounded">
- <!-- One JAR Path, relative to the root folder of the package. -->
- <xsd:element name="path" type="xsd:string" />
- </xsd:sequence>
- </xsd:complexType>
-
-
- <!-- The definition of a file checksum -->
-
- <xsd:simpleType name="sha1Number">
- <xsd:annotation>
- <xsd:documentation>A SHA1 checksum.</xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:string">
- <xsd:pattern value="([0-9a-fA-F]){40}"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:complexType name="checksumType">
- <xsd:annotation>
- <xsd:documentation>A file checksum, currently only SHA1.</xsd:documentation>
- </xsd:annotation>
- <xsd:simpleContent>
- <xsd:extension base="sdk:sha1Number">
- <xsd:attribute name="type" type="xsd:token" fixed="sha1" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-</xsd:schema>
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-addon-5.xsd b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-addon-5.xsd
deleted file mode 100755
index 546b00d..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-addon-5.xsd
+++ /dev/null
@@ -1,442 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<xsd:schema
- targetNamespace="http://schemas.android.com/sdk/android/addon/5"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:sdk="http://schemas.android.com/sdk/android/addon/5"
- elementFormDefault="qualified"
- attributeFormDefault="unqualified"
- version="1">
-
- <!-- The repository contains a collection of downloadable items known as
- "packages". Each package has a type and various attributes and contains
- a list of file "archives" that can be downloaded for specific OSes.
-
- An Android Addon repository is a web site that contains an "addon.xml"
- file that conforms to this XML Schema.
-
- History:
- - v1 is used by the SDK Updater in Tools r8. It is split out of the
- main SDK Repository XML Schema and can only contain <addon> and
- <extra> packages.
-
- - v2 is used by the SDK Updater in Tools r12.
- - <extra> element now has a <project-files> element that contains 1 or
- or more <path>, each indicating the relative path of a file that this package
- can contribute to installed projects.
- - <addon> element now has an optional <layoutlib> that indicates the API
- and revision of the layout library for this particular add-on, if any.
-
- - v3 is used by the SDK Manager in Tools r14:
- - <extra> now has an <old-paths> element, a ;-separated list of old paths that
- should be detected and migrated to the new <path> for that package.
-
- - v4 is used by the SDK Manager in Tools r18:
- - <extra> and <addon> are not in the Repository XSD v6 anymore.
- - <extra> get a new field <name-display>, which is used by the SDK Manager to
- customize the name of the extra in the list display. The single <vendor>
- field becomes <vendor-id> and <vendor-display>, the id being used internally
- and the display in the UI.
- - <addon> does the same, where <name> is replaced by <name-id> and <name-display>
- and <vendor> is replaced by <vendor-id> and <vendor-display>.
-
- - v5 is used by the SDK Manager in Tools r20:
- - The <beta-rc> element is no longer supported. It was never implemented anyway.
- - For <tool> and <platform-tool> packages, the <revision> element becomes a
- a "full revision" element with <major>, <minor>, <micro> and <preview> sub-elements.
- - <min-tools-rev> for <extra> becomes a full revision element.
- -->
-
- <xsd:element name="sdk-addon" type="sdk:repositoryType" />
-
- <xsd:complexType name="repositoryType">
- <xsd:annotation>
- <xsd:documentation>
- The repository contains a collection of downloadable packages.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:choice minOccurs="0" maxOccurs="unbounded">
- <xsd:element name="add-on" type="sdk:addonType" />
- <xsd:element name="extra" type="sdk:extraType" />
- <xsd:element name="license" type="sdk:licenseType" />
- </xsd:choice>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK Add-on package. -->
-
- <xsd:complexType name="addonType">
- <xsd:annotation>
- <xsd:documentation>An SDK add-on package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The internal name id of the add-on. Must be unique per vendor. -->
- <xsd:element name="name-id" type="sdk:idType" />
- <!-- The displayed name of the add-on. -->
- <xsd:element name="name-display" type="xsd:normalizedString" />
-
- <!-- The internal vendor id of the add-on. Must be unique amongst vendors. -->
- <xsd:element name="vendor-id" type="sdk:idType" />
- <!-- The displayed vendor name of the add-on. -->
- <xsd:element name="vendor-display" type="xsd:normalizedString" />
-
- <!-- The Android API Level for the add-on. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- Note: Add-ons do not support 'codenames' (a.k.a. API previews). -->
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
-
- <!-- An add-on can declare 0 or more libraries.
- This element is mandatory but it can be empty.
- -->
-
- <xsd:element name="libs">
- <xsd:complexType>
- <xsd:sequence minOccurs="0" maxOccurs="unbounded">
- <xsd:element name="lib">
- <xsd:complexType>
- <xsd:all>
- <!-- The name of the library. -->
- <xsd:element name="name" type="xsd:normalizedString" />
- <!-- The optional description of this add-on library. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
- </xsd:element>
- </xsd:sequence>
- </xsd:complexType>
- </xsd:element>
-
- <!-- optional elements -->
-
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
-
- <!-- Optional information on the layoutlib packaged in this platform. -->
- <xsd:element name="layoutlib" type="sdk:layoutlibType" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <xsd:simpleType name="idType">
- <xsd:annotation>
- <xsd:documentation>
- An ID string for an addon/extra name-id or vendor-id
- can only be simple alphanumeric string.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:pattern value="[a-zA-Z0-9_-]+"/>
- </xsd:restriction>
- </xsd:simpleType>
-
-
- <!-- The definition of a layout library used by an addon. -->
-
- <xsd:complexType name="layoutlibType" >
- <xsd:annotation>
- <xsd:documentation>
- Version information for a layoutlib included in an addon.
- .</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The layoutlib API level, an int > 0,
- incremented with each new incompatible lib. -->
- <xsd:element name="api" type="xsd:positiveInteger" />
- <!-- The incremental minor revision for that API, e.g. in case of bug fixes.
- Optional. An int >= 0, assumed to be 0 if the element is missing. -->
- <xsd:element name="revision" type="xsd:nonNegativeInteger" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK extra package. This kind of package is for
- "free" content. Such packages are installed in SDK/extras/vendor/path.
- -->
-
- <xsd:complexType name="extraType" >
- <xsd:annotation>
- <xsd:documentation>
- An SDK extra package. This kind of package is for "free" content.
- Such packages are installed in SDK/vendor/path.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The displayed name of the extra. -->
- <xsd:element name="name-display" type="xsd:normalizedString" />
-
- <!-- The internal vendor id of the extra. Must be unique amongst vendors. -->
- <xsd:element name="vendor-id" type="sdk:idType" />
- <!-- The displayed vendor name of the extra. -->
- <xsd:element name="vendor-display" type="xsd:normalizedString" />
-
- <!-- The install path sub-folder name. It must not be empty. -->
- <xsd:element name="path" type="sdk:segmentType" />
-
- <!-- A semi-colon separated list of "obsolete" path names which are equivalent
- to the current 'path' name. When a package is seen using an old-paths' name,
- the package manager will try to upgrade it to the new path. -->
- <xsd:element name="old-paths" type="sdk:segmentListType" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
-
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- optional elements -->
-
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- The minimal revision of tools required by this package.
- Optional. If present, must be a revision element. -->
- <xsd:element name="min-tools-rev" type="sdk:revisionType" minOccurs="0" />
- <!-- The minimal API level required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-api-level" type="xsd:positiveInteger" minOccurs="0" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
-
- <!-- A list of project files contributed by this package. Optional. -->
- <xsd:element name="project-files" type="sdk:projectFilesType" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- A full revision, with a major.minor.micro and an optional preview number.
- The major number is mandatory, the other elements are optional.
- -->
-
- <xsd:complexType name="revisionType">
- <xsd:annotation>
- <xsd:documentation>
- A full revision, with a major.minor.micro and an
- optional preview number. The major number is mandatory.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The major revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="major" type="xsd:positiveInteger" />
- <!-- The minor revision, an int >= 0, incremented each time a new
- minor package is generated. Assumed to be 0 if missing. -->
- <xsd:element name="minor" type="xsd:nonNegativeInteger" minOccurs="0" />
- <!-- The micro revision, an int >= 0, incremented each time a new
- buf fix is generated. Assumed to be 0 if missing. -->
- <xsd:element name="micro" type="xsd:nonNegativeInteger" minOccurs="0" />
- <!-- The preview/release candidate revision, an int > 0,
- incremented each time a new preview is generated.
- Not present for final releases. -->
- <xsd:element name="preview" type="xsd:positiveInteger" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of a path segment used by the extra element. -->
-
- <xsd:simpleType name="segmentType">
- <xsd:annotation>
- <xsd:documentation>
- One path segment for the install path of an extra element.
- It must be a single-segment path. It must not be empty.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:pattern value="[a-zA-Z0-9_]+"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:simpleType name="segmentListType">
- <xsd:annotation>
- <xsd:documentation>
- A semi-colon separated list of a segmentTypes.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:pattern value="[a-zA-Z0-9_;]+"/>
- </xsd:restriction>
- </xsd:simpleType>
-
-
- <!-- The definition of a license to be referenced by the uses-license element. -->
-
- <xsd:complexType name="licenseType">
- <xsd:annotation>
- <xsd:documentation>
- A license definition. Such a license must be used later as a reference
- using a uses-license element in one of the package elements.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:simpleContent>
- <xsd:extension base="xsd:string">
- <xsd:attribute name="id" type="xsd:ID" />
- <xsd:attribute name="type" type="xsd:token" fixed="text" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-
- <!-- Type describing the license used by a package.
- The license MUST be defined using a license node and referenced
- using the ref attribute of the license element inside a package.
- -->
-
- <xsd:complexType name="usesLicenseType">
- <xsd:annotation>
- <xsd:documentation>
- Describes the license used by a package. The license MUST be defined
- using a license node and referenced using the ref attribute of the
- license element inside a package.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="ref" type="xsd:IDREF" />
- </xsd:complexType>
-
-
- <!-- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository elements and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- -->
-
- <xsd:complexType name="archivesType">
- <xsd:annotation>
- <xsd:documentation>
- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository packages and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence minOccurs="1" maxOccurs="unbounded">
- <!-- One archive file -->
- <xsd:element name="archive">
- <xsd:complexType>
- <!-- Properties of the archive file -->
- <xsd:all>
- <!-- The size in bytes of the archive to download. -->
- <xsd:element name="size" type="xsd:positiveInteger" />
- <!-- The checksum of the archive file. -->
- <xsd:element name="checksum" type="sdk:checksumType" />
- <!-- The URL is an absolute URL if it starts with http://, https://
- or ftp://. Otherwise it is relative to the parent directory that
- contains this repository.xml -->
- <xsd:element name="url" type="xsd:token" />
- </xsd:all>
-
- <!-- Attributes that identify the OS and architecture -->
- <xsd:attribute name="os" use="required">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="linux" />
- <xsd:enumeration value="macosx" />
- <xsd:enumeration value="windows" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- <xsd:attribute name="arch" use="optional">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="ppc" />
- <xsd:enumeration value="x86" />
- <xsd:enumeration value="x86_64" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- </xsd:complexType>
- </xsd:element>
- </xsd:sequence>
- </xsd:complexType>
-
-
- <!-- A collection of file paths available in an <extra> package
- that can be installed in an Android project.
- If present, the <project-files> collection must contain at least one path.
- Each path is relative to the root directory of the package.
- -->
-
- <xsd:complexType name="projectFilesType">
- <xsd:annotation>
- <xsd:documentation>
- A collection of file paths available in an <extra> package
- that can be installed in an Android project.
- If present, the <project-files> collection must contain at least one path.
- Each path is relative to the root directory of the package.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence minOccurs="1" maxOccurs="unbounded">
- <!-- One JAR Path, relative to the root folder of the package. -->
- <xsd:element name="path" type="xsd:string" />
- </xsd:sequence>
- </xsd:complexType>
-
-
- <!-- The definition of a file checksum -->
-
- <xsd:simpleType name="sha1Number">
- <xsd:annotation>
- <xsd:documentation>A SHA1 checksum.</xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:string">
- <xsd:pattern value="([0-9a-fA-F]){40}"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:complexType name="checksumType">
- <xsd:annotation>
- <xsd:documentation>A file checksum, currently only SHA1.</xsd:documentation>
- </xsd:annotation>
- <xsd:simpleContent>
- <xsd:extension base="sdk:sha1Number">
- <xsd:attribute name="type" type="xsd:token" fixed="sha1" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-</xsd:schema>
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-addons-list-1.xsd b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-addons-list-1.xsd
deleted file mode 100755
index 176fb60..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-addons-list-1.xsd
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<xsd:schema
- targetNamespace="http://schemas.android.com/sdk/android/addons-list/1"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:sa1="http://schemas.android.com/sdk/android/addons-list/1"
- elementFormDefault="qualified"
- attributeFormDefault="unqualified"
- version="1">
-
- <!--
- A simple list of add-ons sites that is loaded by default by the SDK Manager.
- -->
-
- <xsd:element name="sdk-addons-list" type="sa1:addonsListType" />
-
- <xsd:complexType name="addonsListType">
- <xsd:annotation>
- <xsd:documentation>
- A simple list of add-ons site.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:choice minOccurs="0" maxOccurs="unbounded">
- <xsd:element name="addon-site" type="sa1:addonSiteType" />
- </xsd:choice>
- </xsd:complexType>
-
- <!-- The definition of an Add-on Site. -->
-
- <xsd:complexType name="addonSiteType">
- <xsd:annotation>
- <xsd:documentation>An SDK add-on site.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The URL of the site.
-
- This can be either the exact URL of the an XML resource conforming
- to the latest sdk-addon-N.xsd schema, or it can be the URL of a
- 'directory', in which case the manager will look for a resource
- named 'addon.xml' at this location.
-
- Examples:
- http://www.example.com/android/my_addons.xml
- or
- http://www.example.com/android/
-
- In the second example, the manager will actually look for:
- http://www.example.com/android/addon.xml
- -->
- <xsd:element name="url" type="xsd:token" />
-
- <!-- The UI-visible name of the add-on. -->
- <xsd:element name="name" type="xsd:normalizedString" />
- </xsd:all>
- </xsd:complexType>
-
-</xsd:schema>
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-addons-list-2.xsd b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-addons-list-2.xsd
deleted file mode 100755
index dde7214..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-addons-list-2.xsd
+++ /dev/null
@@ -1,106 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<xsd:schema
- targetNamespace="http://schemas.android.com/sdk/android/addons-list/2"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:sa1="http://schemas.android.com/sdk/android/addons-list/2"
- elementFormDefault="qualified"
- attributeFormDefault="unqualified"
- version="1">
-
- <!--
- A simple list of add-ons sites that is loaded by default by the SDK Manager.
-
- - v1: Defines <addon-site>
- - v2: Adds support for <sys-img-site>
- -->
-
- <xsd:element name="sdk-addons-list" type="sa1:addonsListType" />
-
- <xsd:complexType name="addonsListType">
- <xsd:annotation>
- <xsd:documentation>
- A simple list of add-ons site.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:choice minOccurs="0" maxOccurs="unbounded">
- <xsd:element name="addon-site" type="sa1:addonSiteType" />
- <xsd:element name="sys-img-site" type="sa1:sysImgSiteType" />
- </xsd:choice>
- </xsd:complexType>
-
- <!-- The definition of an Add-on Site. -->
-
- <xsd:complexType name="addonSiteType">
- <xsd:annotation>
- <xsd:documentation>An SDK add-on site.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The URL of the site.
-
- This can be either the exact URL of the an XML resource conforming
- to the latest sdk-addon-N.xsd schema, or it can be the URL of a
- 'directory', in which case the manager will look for a resource
- named 'addon.xml' at this location.
-
- Examples:
- http://www.example.com/android/my_addons.xml
- or
- http://www.example.com/android/
-
- In the second example, the manager will actually look for:
- http://www.example.com/android/addon.xml
- -->
- <xsd:element name="url" type="xsd:token" />
-
- <!-- The UI-visible name of the add-on site. -->
- <xsd:element name="name" type="xsd:normalizedString" />
-
- </xsd:all>
- </xsd:complexType>
-
- <!-- The definition of an Sys-Img Site. -->
-
- <xsd:complexType name="sysImgSiteType">
- <xsd:annotation>
- <xsd:documentation>An SDK sys-img site.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The URL of the site.
-
- This can be either the exact URL of the an XML resource conforming
- to the latest sdk-sys-img-N.xsd schema, or it can be the URL of a
- 'directory', in which case the manager will look for a resource
- named 'sysimg.xml' at this location.
-
- Examples:
- http://www.example.com/android/my_sys_img.xml
- or
- http://www.example.com/android/
-
- In the second example, the manager will actually look for:
- http://www.example.com/android/sysimg.xml
- -->
- <xsd:element name="url" type="xsd:token" />
-
- <!-- The UI-visible name of the sys-img site. -->
- <xsd:element name="name" type="xsd:normalizedString" />
-
- </xsd:all>
- </xsd:complexType>
-
-</xsd:schema>
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-repository-1.xsd b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-repository-1.xsd
deleted file mode 100755
index 38ec309..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-repository-1.xsd
+++ /dev/null
@@ -1,381 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<xsd:schema
- targetNamespace="http://schemas.android.com/sdk/android/repository/1"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:sdk="http://schemas.android.com/sdk/android/repository/1"
- elementFormDefault="qualified"
- attributeFormDefault="unqualified"
- version="1">
-
- <!-- The repository contains a collection of downloadable items known as
- "packages". Each package has a type and various attributes and contains
- a list of file "archives" that can be downloaded for specific OSes.
-
- An Android SDK repository is a web site that contains a "repository.xml"
- file that conforms to this XML Schema.
-
- History:
- - v1 is used by the SDK Updater in Tools r3 and Tools r4.
- -->
-
- <xsd:element name="sdk-repository">
- <xsd:annotation>
- <xsd:documentation>
- The repository contains collections of downloadable packages.
- </xsd:documentation>
- </xsd:annotation>
-
- <xsd:complexType>
- <xsd:choice minOccurs="0" maxOccurs="unbounded">
-
- <!-- The definition of an SDK platform package. -->
-
- <xsd:element name="platform">
- <xsd:annotation>
- <xsd:documentation>An SDK platform package.</xsd:documentation>
- </xsd:annotation>
- <xsd:complexType>
- <xsd:all>
- <!-- The Android platform version. It is string such as "1.0". -->
- <xsd:element name="version" type="xsd:normalizedString" />
- <!-- The Android API Level for the platform. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this platform, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:licenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
- <!-- The minimal revision of tools required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-tools-rev" type="xsd:positiveInteger" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
- </xsd:element>
-
-
- <!-- The definition of an SDK Add-on package. -->
-
- <xsd:element name="add-on">
- <xsd:annotation>
- <xsd:documentation>An SDK add-on package.</xsd:documentation>
- </xsd:annotation>
- <xsd:complexType>
- <xsd:all>
- <!-- The name of the add-on. -->
- <xsd:element name="name" type="xsd:normalizedString" />
- <!-- The vendor of the add-on. -->
- <xsd:element name="vendor" type="xsd:normalizedString" />
- <!-- The Android API Level for the add-on. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- Note: Add-ons do not support 'codename' (a.k.a. API previews). -->
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:licenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- An add-on can declare 0 or more libraries. -->
-
- <xsd:element name="libs">
- <xsd:complexType>
- <xsd:sequence minOccurs="0" maxOccurs="unbounded">
- <xsd:element name="lib">
- <xsd:complexType>
- <xsd:all>
- <!-- The name of the library. -->
- <xsd:element name="name" type="xsd:normalizedString" />
- <!-- The optional description of this add-on library. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
- </xsd:element>
- </xsd:sequence>
- </xsd:complexType>
- </xsd:element>
- </xsd:all>
- </xsd:complexType>
- </xsd:element>
-
-
- <!-- The definition of an SDK tool package. -->
-
- <xsd:element name="tool">
- <xsd:annotation>
- <xsd:documentation>An SDK tool package.</xsd:documentation>
- </xsd:annotation>
- <xsd:complexType>
- <xsd:all>
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:licenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
- </xsd:all>
- </xsd:complexType>
- </xsd:element>
-
-
- <!-- The definition of an SDK doc package. -->
-
- <xsd:element name="doc">
- <xsd:annotation>
- <xsd:documentation>An SDK doc package.</xsd:documentation>
- </xsd:annotation>
- <xsd:complexType>
- <xsd:all>
- <!-- The Android API Level for the documentation. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this doc, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:licenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
- </xsd:all>
- </xsd:complexType>
- </xsd:element>
-
-
- <!-- The definition of an SDK extra package. This kind of package is for
- "free" content and specifies in which fixed root directory it must be
- installed.
- -->
-
- <xsd:element name="extra">
- <xsd:annotation>
- <xsd:documentation>
- An SDK extra package. This kind of package is for "free"
- content and specifies in which fixed root directory it must be
- installed.
- The paths "add-ons", "platforms", "tools" and "docs" are
- reserved and cannot be used.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:complexType>
- <xsd:all>
- <!-- The install folder name. It must be a single-segment path.
- The paths "add-ons", "platforms", "tools" and "docs" are
- reserved and cannot be used.
- -->
- <xsd:element name="path">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:pattern value="[^/\\]+"/>
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:element>
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:licenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
- <!-- The minimal revision of tools required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-tools-rev" type="xsd:positiveInteger" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
- </xsd:element>
-
-
-
- <!-- The definition of a license to be referenced by the uses-license element. -->
-
- <xsd:element name="license">
- <xsd:annotation>
- <xsd:documentation>
- A license definition. Such a license must be used later as a reference
- using a uses-license element in one of the package elements.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:complexType>
- <xsd:simpleContent>
- <xsd:extension base="xsd:string">
- <xsd:attribute name="id" type="xsd:ID" />
- <xsd:attribute name="type" type="xsd:token" fixed="text" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
- </xsd:element>
- </xsd:choice>
- </xsd:complexType>
- </xsd:element>
-
-
- <!-- Type describing the license used by a package.
- The license MUST be defined using a license node and referenced
- using the ref attribute of the license element inside a package.
- -->
-
- <xsd:complexType name="licenseType">
- <xsd:annotation>
- <xsd:documentation>
- Describes the license used by a package. The license MUST be defined
- using a license node and referenced using the ref attribute of the
- license element inside a package.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="ref" type="xsd:IDREF" />
- </xsd:complexType>
-
-
- <!-- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository elements and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- -->
-
- <xsd:complexType name="archivesType">
- <xsd:annotation>
- <xsd:documentation>
- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository packages and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence minOccurs="1" maxOccurs="unbounded">
- <!-- One archive file -->
- <xsd:element name="archive">
- <xsd:complexType>
- <!-- Properties of the archive file -->
- <xsd:all>
- <!-- The size in bytes of the archive to download. -->
- <xsd:element name="size" type="xsd:positiveInteger" />
- <!-- The checksum of the archive file. -->
- <xsd:element name="checksum" type="sdk:checksumType" />
- <!-- The URL is an absolute URL if it starts with http://, https://
- or ftp://. Otherwise it is relative to the parent directory that
- contains this repository.xml -->
- <xsd:element name="url" type="xsd:token" />
- </xsd:all>
-
- <!-- Attributes that identify the OS and architecture -->
- <xsd:attribute name="os" use="required">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="linux" />
- <xsd:enumeration value="macosx" />
- <xsd:enumeration value="windows" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- <xsd:attribute name="arch" use="optional">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="ppc" />
- <xsd:enumeration value="x86" />
- <xsd:enumeration value="x86_64" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- </xsd:complexType>
- </xsd:element>
- </xsd:sequence>
- </xsd:complexType>
-
-
- <!-- The definition of a file checksum -->
-
- <xsd:simpleType name="sha1Number">
- <xsd:annotation>
- <xsd:documentation>A SHA1 checksum.</xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:string">
- <xsd:pattern value="([0-9a-fA-F]){40}"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:complexType name="checksumType">
- <xsd:annotation>
- <xsd:documentation>A file checksum, currently only SHA1.</xsd:documentation>
- </xsd:annotation>
- <xsd:simpleContent>
- <xsd:extension base="sdk:sha1Number">
- <xsd:attribute name="type" type="xsd:token" fixed="sha1" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-
-</xsd:schema>
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-repository-2.xsd b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-repository-2.xsd
deleted file mode 100755
index ecadc3f..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-repository-2.xsd
+++ /dev/null
@@ -1,438 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<xsd:schema
- targetNamespace="http://schemas.android.com/sdk/android/repository/2"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:sr2="http://schemas.android.com/sdk/android/repository/2"
- elementFormDefault="qualified"
- attributeFormDefault="unqualified"
- version="1">
-
- <!-- The repository contains a collection of downloadable items known as
- "packages". Each package has a type and various attributes and contains
- a list of file "archives" that can be downloaded for specific OSes.
-
- An Android SDK repository is a web site that contains a "repository.xml"
- file that conforms to this XML Schema.
-
- History:
- - v1 is used by the SDK Updater in Tools r3 and r4.
- - v2 is used by the SDK Updater in Tools r5:
- - new <sample> repository type.
- - new <obsolete> in all repository types.
- -->
-
- <xsd:element name="sdk-repository" type="sr2:repositoryType" />
-
- <xsd:complexType name="repositoryType">
- <xsd:annotation>
- <xsd:documentation>
- The repository contains a collection of downloadable packages.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:choice minOccurs="0" maxOccurs="unbounded">
- <xsd:element name="platform" type="sr2:platformType" />
- <xsd:element name="add-on" type="sr2:addonType" />
- <xsd:element name="tool" type="sr2:toolType" />
- <xsd:element name="doc" type="sr2:docType" />
- <xsd:element name="sample" type="sr2:sampleType" />
- <xsd:element name="extra" type="sr2:extraType" />
- <xsd:element name="license" type="sr2:licenseType" />
- </xsd:choice>
- </xsd:complexType>
-
- <!-- The definition of an SDK platform package. -->
-
- <xsd:complexType name="platformType">
- <xsd:annotation>
- <xsd:documentation>An SDK platform package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The Android platform version. It is string such as "1.0". -->
- <xsd:element name="version" type="xsd:normalizedString" />
- <!-- The Android API Level for the platform. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this platform, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sr2:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sr2:archivesType" />
- <!-- The minimal revision of tools required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-tools-rev" type="xsd:positiveInteger" minOccurs="0" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK Add-on package. -->
-
- <xsd:complexType name="addonType">
- <xsd:annotation>
- <xsd:documentation>An SDK add-on package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The name of the add-on. -->
- <xsd:element name="name" type="xsd:normalizedString" />
- <!-- The vendor of the add-on. -->
- <xsd:element name="vendor" type="xsd:normalizedString" />
- <!-- The Android API Level for the add-on. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- Note: Add-ons do not support 'codename' (a.k.a. API previews). -->
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sr2:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sr2:archivesType" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
-
- <!-- An add-on can declare 0 or more libraries. -->
-
- <xsd:element name="libs">
- <xsd:complexType>
- <xsd:sequence minOccurs="0" maxOccurs="unbounded">
- <xsd:element name="lib">
- <xsd:complexType>
- <xsd:all>
- <!-- The name of the library. -->
- <xsd:element name="name" type="xsd:normalizedString" />
- <!-- The optional description of this add-on library. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
- </xsd:element>
- </xsd:sequence>
- </xsd:complexType>
- </xsd:element>
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK tool package. -->
-
- <xsd:complexType name="toolType" >
- <xsd:annotation>
- <xsd:documentation>An SDK tool package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sr2:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sr2:archivesType" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK doc package. -->
-
- <xsd:complexType name="docType" >
- <xsd:annotation>
- <xsd:documentation>An SDK doc package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The Android API Level for the documentation. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this doc, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sr2:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sr2:archivesType" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK sample package. -->
-
- <xsd:complexType name="sampleType" >
- <xsd:annotation>
- <xsd:documentation>An SDK sample package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The Android API Level for the documentation. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this doc, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sr2:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sr2:archivesType" />
- <!-- The minimal revision of tools required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-tools-rev" type="xsd:positiveInteger" minOccurs="0" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK extra package. This kind of package is for
- "free" content and specifies in which fixed root directory it must be
- installed.
- -->
-
- <xsd:complexType name="extraType" >
- <xsd:annotation>
- <xsd:documentation>
- An SDK extra package. This kind of package is for "free"
- content and specifies in which fixed root directory it must be
- installed.
- The paths "add-ons", "platforms", "tools" and "docs" are
- reserved and cannot be used.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The install folder name. It must be a single-segment path.
- The paths "add-ons", "platforms", "tools" and "docs" are
- reserved and cannot be used.
- -->
- <xsd:element name="path">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:pattern value="[^/\\]+"/>
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:element>
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sr2:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sr2:archivesType" />
- <!-- The minimal revision of tools required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-tools-rev" type="xsd:positiveInteger" minOccurs="0" />
- <!-- The minimal API level required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-api-level" type="xsd:positiveInteger" minOccurs="0" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of a license to be referenced by the uses-license element. -->
-
- <xsd:complexType name="licenseType">
- <xsd:annotation>
- <xsd:documentation>
- A license definition. Such a license must be used later as a reference
- using a uses-license element in one of the package elements.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:simpleContent>
- <xsd:extension base="xsd:string">
- <xsd:attribute name="id" type="xsd:ID" />
- <xsd:attribute name="type" type="xsd:token" fixed="text" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-
- <!-- Type describing the license used by a package.
- The license MUST be defined using a license node and referenced
- using the ref attribute of the license element inside a package.
- -->
-
- <xsd:complexType name="usesLicenseType">
- <xsd:annotation>
- <xsd:documentation>
- Describes the license used by a package. The license MUST be defined
- using a license node and referenced using the ref attribute of the
- license element inside a package.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="ref" type="xsd:IDREF" />
- </xsd:complexType>
-
-
- <!-- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository elements and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- -->
-
- <xsd:complexType name="archivesType">
- <xsd:annotation>
- <xsd:documentation>
- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository packages and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence minOccurs="1" maxOccurs="unbounded">
- <!-- One archive file -->
- <xsd:element name="archive">
- <xsd:complexType>
- <!-- Properties of the archive file -->
- <xsd:all>
- <!-- The size in bytes of the archive to download. -->
- <xsd:element name="size" type="xsd:positiveInteger" />
- <!-- The checksum of the archive file. -->
- <xsd:element name="checksum" type="sr2:checksumType" />
- <!-- The URL is an absolute URL if it starts with http://, https://
- or ftp://. Otherwise it is relative to the parent directory that
- contains this repository.xml -->
- <xsd:element name="url" type="xsd:token" />
- </xsd:all>
-
- <!-- Attributes that identify the OS and architecture -->
- <xsd:attribute name="os" use="required">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="linux" />
- <xsd:enumeration value="macosx" />
- <xsd:enumeration value="windows" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- <xsd:attribute name="arch" use="optional">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="ppc" />
- <xsd:enumeration value="x86" />
- <xsd:enumeration value="x86_64" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- </xsd:complexType>
- </xsd:element>
- </xsd:sequence>
- </xsd:complexType>
-
-
- <!-- The definition of a file checksum -->
-
- <xsd:simpleType name="sha1Number">
- <xsd:annotation>
- <xsd:documentation>A SHA1 checksum.</xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:string">
- <xsd:pattern value="([0-9a-fA-F]){40}"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:complexType name="checksumType">
- <xsd:annotation>
- <xsd:documentation>A file checksum, currently only SHA1.</xsd:documentation>
- </xsd:annotation>
- <xsd:simpleContent>
- <xsd:extension base="sr2:sha1Number">
- <xsd:attribute name="type" type="xsd:token" fixed="sha1" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-</xsd:schema>
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-repository-3.xsd b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-repository-3.xsd
deleted file mode 100755
index 75d8541..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-repository-3.xsd
+++ /dev/null
@@ -1,436 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<xsd:schema
- targetNamespace="http://schemas.android.com/sdk/android/repository/3"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:sdk="http://schemas.android.com/sdk/android/repository/3"
- elementFormDefault="qualified"
- attributeFormDefault="unqualified"
- version="1">
-
- <!-- The repository contains a collection of downloadable items known as
- "packages". Each package has a type and various attributes and contains
- a list of file "archives" that can be downloaded for specific OSes.
-
- An Android SDK repository is a web site that contains a "repository.xml"
- file that conforms to this XML Schema.
-
- History:
- - v1 is used by the SDK Updater in Tools r3 and r4.
-
- - v2 is used by the SDK Updater in Tools r5:
- - It introduces a new <sample> repository type. Previously samples
- were included in the <platform> packages. Instead this package is used
- and and the samples are installed in $SDK/samples.
- - All repository types have a new <obsolete> node. It works as a marker
- to indicate the package is obsolete and should not be selected by default.
- The UI also hides these out by default.
-
- - v3 is used by the SDK Updater in Tools r8:
- - It introduces a new <platform-tool> repository type. Previously platform-specific
- tools were included in the <platform> packages. Instead this package is used
- and platform-specific tools are installed in $SDK/platform-tools
- - There's a new element <min-platform-tools-rev> in <tool>. The tool package now
- requires that at least some minimal version of <platform-tool> be installed.
- - It removes the <addon> repository type, which is now in its own XML Schema.
- -->
-
- <xsd:element name="sdk-repository" type="sdk:repositoryType" />
-
- <xsd:complexType name="repositoryType">
- <xsd:annotation>
- <xsd:documentation>
- The repository contains a collection of downloadable packages.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:choice minOccurs="0" maxOccurs="unbounded">
- <xsd:element name="platform" type="sdk:platformType" />
- <xsd:element name="tool" type="sdk:toolType" />
- <xsd:element name="platform-tool" type="sdk:platformToolType" />
- <xsd:element name="doc" type="sdk:docType" />
- <xsd:element name="sample" type="sdk:sampleType" />
- <xsd:element name="extra" type="sdk:extraType" />
- <xsd:element name="license" type="sdk:licenseType" />
- </xsd:choice>
- </xsd:complexType>
-
- <!-- The definition of an SDK platform package. -->
-
- <xsd:complexType name="platformType">
- <xsd:annotation>
- <xsd:documentation>An SDK platform package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The Android platform version. It is string such as "1.0". -->
- <xsd:element name="version" type="xsd:normalizedString" />
- <!-- The Android API Level for the platform. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this platform, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
- <!-- The minimal revision of tools required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-tools-rev" type="xsd:positiveInteger" minOccurs="0" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK tool package. -->
-
- <xsd:complexType name="toolType" >
- <xsd:annotation>
- <xsd:documentation>An SDK tool package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
-
- <!-- The minimal revision of platform-tools required by this package.
- Mandatory. Must be an int > 0. -->
- <xsd:element name="min-platform-tools-rev" type="xsd:positiveInteger" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK platform-tool package. -->
-
- <xsd:complexType name="platformToolType" >
- <xsd:annotation>
- <xsd:documentation>An SDK platform-tool package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK doc package. -->
-
- <xsd:complexType name="docType" >
- <xsd:annotation>
- <xsd:documentation>An SDK doc package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The Android API Level for the documentation. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this doc, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK sample package. -->
-
- <xsd:complexType name="sampleType" >
- <xsd:annotation>
- <xsd:documentation>An SDK sample package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The Android API Level for the documentation. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this doc, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
- <!-- The minimal revision of tools required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-tools-rev" type="xsd:positiveInteger" minOccurs="0" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK extra package. This kind of package is for
- "free" content. Such packages are installed in SDK/vendor/path.
- -->
-
- <xsd:complexType name="extraType" >
- <xsd:annotation>
- <xsd:documentation>
- An SDK extra package. This kind of package is for "free" content.
- Such packages are installed in SDK/vendor/path.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:all>
-
- <!-- The install path top folder name.
- The segments "add-ons", "docs", "platforms", "platform-tools", "temp"
- and "tools" are reserved and cannot be used.
- -->
- <xsd:element name="vendor" type="sdk:segmentType" />
-
- <!-- The install path sub-folder name. -->
- <xsd:element name="path" type="sdk:segmentType" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
- <!-- The minimal revision of tools required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-tools-rev" type="xsd:positiveInteger" minOccurs="0" />
- <!-- The minimal API level required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-api-level" type="xsd:positiveInteger" minOccurs="0" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of a path segment used by the extra element. -->
-
- <xsd:simpleType name="segmentType">
- <xsd:annotation>
- <xsd:documentation>
- One path segment for the install path of an extra element.
- It must be a single-segment path.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:pattern value="[a-zA-Z0-9_]+"/>
- </xsd:restriction>
- </xsd:simpleType>
-
-
- <!-- The definition of a license to be referenced by the uses-license element. -->
-
- <xsd:complexType name="licenseType">
- <xsd:annotation>
- <xsd:documentation>
- A license definition. Such a license must be used later as a reference
- using a uses-license element in one of the package elements.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:simpleContent>
- <xsd:extension base="xsd:string">
- <xsd:attribute name="id" type="xsd:ID" />
- <xsd:attribute name="type" type="xsd:token" fixed="text" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-
- <!-- Type describing the license used by a package.
- The license MUST be defined using a license node and referenced
- using the ref attribute of the license element inside a package.
- -->
-
- <xsd:complexType name="usesLicenseType">
- <xsd:annotation>
- <xsd:documentation>
- Describes the license used by a package. The license MUST be defined
- using a license node and referenced using the ref attribute of the
- license element inside a package.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="ref" type="xsd:IDREF" />
- </xsd:complexType>
-
-
- <!-- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository elements and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- -->
-
- <xsd:complexType name="archivesType">
- <xsd:annotation>
- <xsd:documentation>
- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository packages and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence minOccurs="1" maxOccurs="unbounded">
- <!-- One archive file -->
- <xsd:element name="archive">
- <xsd:complexType>
- <!-- Properties of the archive file -->
- <xsd:all>
- <!-- The size in bytes of the archive to download. -->
- <xsd:element name="size" type="xsd:positiveInteger" />
- <!-- The checksum of the archive file. -->
- <xsd:element name="checksum" type="sdk:checksumType" />
- <!-- The URL is an absolute URL if it starts with http://, https://
- or ftp://. Otherwise it is relative to the parent directory that
- contains this repository.xml -->
- <xsd:element name="url" type="xsd:token" />
- </xsd:all>
-
- <!-- Attributes that identify the OS and architecture -->
- <xsd:attribute name="os" use="required">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="linux" />
- <xsd:enumeration value="macosx" />
- <xsd:enumeration value="windows" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- <xsd:attribute name="arch" use="optional">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="ppc" />
- <xsd:enumeration value="x86" />
- <xsd:enumeration value="x86_64" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- </xsd:complexType>
- </xsd:element>
- </xsd:sequence>
- </xsd:complexType>
-
-
- <!-- The definition of a file checksum -->
-
- <xsd:simpleType name="sha1Number">
- <xsd:annotation>
- <xsd:documentation>A SHA1 checksum.</xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:string">
- <xsd:pattern value="([0-9a-fA-F]){40}"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:complexType name="checksumType">
- <xsd:annotation>
- <xsd:documentation>A file checksum, currently only SHA1.</xsd:documentation>
- </xsd:annotation>
- <xsd:simpleContent>
- <xsd:extension base="sdk:sha1Number">
- <xsd:attribute name="type" type="xsd:token" fixed="sha1" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-</xsd:schema>
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-repository-4.xsd b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-repository-4.xsd
deleted file mode 100755
index 9b14772..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-repository-4.xsd
+++ /dev/null
@@ -1,500 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<xsd:schema
- targetNamespace="http://schemas.android.com/sdk/android/repository/4"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:sdk="http://schemas.android.com/sdk/android/repository/4"
- elementFormDefault="qualified"
- attributeFormDefault="unqualified"
- version="1">
-
- <!-- The repository contains a collection of downloadable items known as
- "packages". Each package has a type and various attributes and contains
- a list of file "archives" that can be downloaded for specific OSes.
-
- An Android SDK repository is a web site that contains a "repository.xml"
- file that conforms to this XML Schema.
-
- History:
- - v1 is used by the SDK Updater in Tools r3 and r4.
-
- - v2 is used by the SDK Updater in Tools r5:
- - It introduces a new <sample> repository type. Previously samples
- were included in the <platform> packages. Instead this package is used
- and and the samples are installed in $SDK/samples.
- - All repository types have a new <obsolete> node. It works as a marker
- to indicate the package is obsolete and should not be selected by default.
- The UI also hides these out by default.
-
- - v3 is used by the SDK Updater in Tools r8:
- - It introduces a new <platform-tool> repository type. Previously platform-specific
- tools were included in the <platform> packages. Instead this package is used
- and platform-specific tools are installed in $SDK/platform-tools
- - There's a new element <min-platform-tools-rev> in <tool>. The tool package now
- requires that at least some minimal version of <platform-tool> be installed.
- - It removes the <addon> repository type, which is now in its own XML Schema.
-
- - v4 is used by the SDK Updater in Tools r12:
- - <extra> element now has a <project-files> element that contains 1 or
- or more <path>, each indicating the relative path of a file that this package
- can contribute to installed projects.
- - <platform> element now has a mandatory <layoutlib> that indicates the API
- and revision of that layout library for this particular platform.
- -->
-
- <xsd:element name="sdk-repository" type="sdk:repositoryType" />
-
- <xsd:complexType name="repositoryType">
- <xsd:annotation>
- <xsd:documentation>
- The repository contains a collection of downloadable packages.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:choice minOccurs="0" maxOccurs="unbounded">
- <xsd:element name="platform" type="sdk:platformType" />
- <xsd:element name="tool" type="sdk:toolType" />
- <xsd:element name="platform-tool" type="sdk:platformToolType" />
- <xsd:element name="doc" type="sdk:docType" />
- <xsd:element name="sample" type="sdk:sampleType" />
- <xsd:element name="extra" type="sdk:extraType" />
- <xsd:element name="license" type="sdk:licenseType" />
- </xsd:choice>
- </xsd:complexType>
-
- <!-- The definition of an SDK platform package. -->
-
- <xsd:complexType name="platformType">
- <xsd:annotation>
- <xsd:documentation>An SDK platform package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The Android platform version. It is string such as "1.0". -->
- <xsd:element name="version" type="xsd:normalizedString" />
- <!-- The Android API Level for the platform. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this platform, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
-
- <!-- Information on the layoutlib packaged in this platform. -->
- <xsd:element name="layoutlib" type="sdk:layoutlibType" />
-
- <!-- optional elements -->
-
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
- <!-- The minimal revision of tools required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-tools-rev" type="xsd:positiveInteger" minOccurs="0" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of a layout library used by a platform. -->
-
- <xsd:complexType name="layoutlibType" >
- <xsd:annotation>
- <xsd:documentation>
- Version information for a layoutlib included in a platform.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The layoutlib API level, an int > 0,
- incremented with each new incompatible lib. -->
- <xsd:element name="api" type="xsd:positiveInteger" />
- <!-- The incremental minor revision for that API, e.g. in case of bug fixes.
- Optional. An int >= 0, assumed to be 0 if the element is missing. -->
- <xsd:element name="revision" type="xsd:nonNegativeInteger" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK tool package. -->
-
- <xsd:complexType name="toolType" >
- <xsd:annotation>
- <xsd:documentation>An SDK tool package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
-
- <!-- The minimal revision of platform-tools required by this package.
- Mandatory. Must be an int > 0. -->
- <xsd:element name="min-platform-tools-rev" type="xsd:positiveInteger" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK platform-tool package. -->
-
- <xsd:complexType name="platformToolType" >
- <xsd:annotation>
- <xsd:documentation>An SDK platform-tool package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK doc package. -->
-
- <xsd:complexType name="docType" >
- <xsd:annotation>
- <xsd:documentation>An SDK doc package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The Android API Level for the documentation. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this doc, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK sample package. -->
-
- <xsd:complexType name="sampleType" >
- <xsd:annotation>
- <xsd:documentation>An SDK sample package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The Android API Level for the documentation. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this doc, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
- <!-- The minimal revision of tools required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-tools-rev" type="xsd:positiveInteger" minOccurs="0" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK extra package. This kind of package is for
- "free" content. Such packages are installed in SDK/vendor/path.
-
- Important implementation detail: this element is duplicated in the
- sdk-addon-N.xsd schema and must be kept in sync there. This is
- simpler than trying to use some kind of of include or to request
- that clients use a third XML schema for common parts.
- -->
-
- <xsd:complexType name="extraType" >
- <xsd:annotation>
- <xsd:documentation>
- An SDK extra package. This kind of package is for "free" content.
- Such packages are installed in SDK/vendor/path.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:all>
-
- <!-- The install path top folder name.
- The segments "add-ons", "docs", "platforms", "platform-tools", "temp"
- and "tools" are reserved and cannot be used.
- -->
- <xsd:element name="vendor" type="sdk:segmentType" />
-
- <!-- The install path sub-folder name. -->
- <xsd:element name="path" type="sdk:segmentType" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
-
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- optional elements -->
-
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- The minimal revision of tools required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-tools-rev" type="xsd:positiveInteger" minOccurs="0" />
- <!-- The minimal API level required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-api-level" type="xsd:positiveInteger" minOccurs="0" />
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
-
- <!-- A list of project files contributed by this package. Optional. -->
- <xsd:element name="project-files" type="sdk:projectFilesType" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of a path segment used by the extra element. -->
-
- <xsd:simpleType name="segmentType">
- <xsd:annotation>
- <xsd:documentation>
- One path segment for the install path of an extra element.
- It must be a single-segment path.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:pattern value="[a-zA-Z0-9_]+"/>
- </xsd:restriction>
- </xsd:simpleType>
-
-
- <!-- The definition of a license to be referenced by the uses-license element. -->
-
- <xsd:complexType name="licenseType">
- <xsd:annotation>
- <xsd:documentation>
- A license definition. Such a license must be used later as a reference
- using a uses-license element in one of the package elements.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:simpleContent>
- <xsd:extension base="xsd:string">
- <xsd:attribute name="id" type="xsd:ID" />
- <xsd:attribute name="type" type="xsd:token" fixed="text" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-
- <!-- Type describing the license used by a package.
- The license MUST be defined using a license node and referenced
- using the ref attribute of the license element inside a package.
- -->
-
- <xsd:complexType name="usesLicenseType">
- <xsd:annotation>
- <xsd:documentation>
- Describes the license used by a package. The license MUST be defined
- using a license node and referenced using the ref attribute of the
- license element inside a package.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="ref" type="xsd:IDREF" />
- </xsd:complexType>
-
-
- <!-- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository elements and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- -->
-
- <xsd:complexType name="archivesType">
- <xsd:annotation>
- <xsd:documentation>
- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository packages and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence minOccurs="1" maxOccurs="unbounded">
- <!-- One archive file -->
- <xsd:element name="archive">
- <xsd:complexType>
- <!-- Properties of the archive file -->
- <xsd:all>
- <!-- The size in bytes of the archive to download. -->
- <xsd:element name="size" type="xsd:positiveInteger" />
- <!-- The checksum of the archive file. -->
- <xsd:element name="checksum" type="sdk:checksumType" />
- <!-- The URL is an absolute URL if it starts with http://, https://
- or ftp://. Otherwise it is relative to the parent directory that
- contains this repository.xml -->
- <xsd:element name="url" type="xsd:token" />
- </xsd:all>
-
- <!-- Attributes that identify the OS and architecture -->
- <xsd:attribute name="os" use="required">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="linux" />
- <xsd:enumeration value="macosx" />
- <xsd:enumeration value="windows" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- <xsd:attribute name="arch" use="optional">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="ppc" />
- <xsd:enumeration value="x86" />
- <xsd:enumeration value="x86_64" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- </xsd:complexType>
- </xsd:element>
- </xsd:sequence>
- </xsd:complexType>
-
-
- <!-- A collection of file paths available in an <extra> package
- that can be installed in an Android project.
- If present, the <project-files> collection must contain at least one path.
- Each path is relative to the root directory of the package.
- -->
-
- <xsd:complexType name="projectFilesType">
- <xsd:annotation>
- <xsd:documentation>
- A collection of file paths available in an <extra> package
- that can be installed in an Android project.
- If present, the <project-files> collection must contain at least one path.
- Each path is relative to the root directory of the package.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence minOccurs="1" maxOccurs="unbounded">
- <!-- One JAR Path, relative to the root folder of the package. -->
- <xsd:element name="path" type="xsd:string" />
- </xsd:sequence>
- </xsd:complexType>
-
-
- <!-- The definition of a file checksum -->
-
- <xsd:simpleType name="sha1Number">
- <xsd:annotation>
- <xsd:documentation>A SHA1 checksum.</xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:string">
- <xsd:pattern value="([0-9a-fA-F]){40}"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:complexType name="checksumType">
- <xsd:annotation>
- <xsd:documentation>A file checksum, currently only SHA1.</xsd:documentation>
- </xsd:annotation>
- <xsd:simpleContent>
- <xsd:extension base="sdk:sha1Number">
- <xsd:attribute name="type" type="xsd:token" fixed="sha1" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-</xsd:schema>
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-repository-5.xsd b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-repository-5.xsd
deleted file mode 100755
index ae8275f..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-repository-5.xsd
+++ /dev/null
@@ -1,624 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<xsd:schema
- targetNamespace="http://schemas.android.com/sdk/android/repository/5"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:sdk="http://schemas.android.com/sdk/android/repository/5"
- elementFormDefault="qualified"
- attributeFormDefault="unqualified"
- version="1">
-
- <!-- The repository contains a collection of downloadable items known as
- "packages". Each package has a type and various attributes and contains
- a list of file "archives" that can be downloaded for specific OSes.
-
- An Android SDK repository is a web site that contains a "repository.xml"
- file that conforms to this XML Schema.
-
- History:
- - v1 is used by the SDK Updater in Tools r3 and r4.
-
- - v2 is used by the SDK Updater in Tools r5:
- - It introduces a new <sample> repository type. Previously samples
- were included in the <platform> packages. Instead this package is used
- and and the samples are installed in $SDK/samples.
- - All repository types have a new <obsolete> node. It works as a marker
- to indicate the package is obsolete and should not be selected by default.
- The UI also hides these out by default.
-
- - v3 is used by the SDK Updater in Tools r8:
- - It introduces a new <platform-tool> repository type. Previously platform-specific
- tools were included in the <platform> packages. Instead this package is used
- and platform-specific tools are installed in $SDK/platform-tools
- - There's a new element <min-platform-tools-rev> in <tool>. The tool package now
- requires that at least some minimal version of <platform-tool> be installed.
- - It removes the <addon> repository type, which is now in its own XML Schema.
-
- - v4 is used by the SDK Updater in Tools r12:
- - <extra> element now has a <project-files> element that contains 1 or
- or more <path>, each indicating the relative path of a file that this package
- can contribute to installed projects.
- - <platform> element now has a mandatory <layoutlib> that indicates the API
- and revision of that layout library for this particular platform.
-
- - v5 is used by the SDK Updater in Tools R14:
- - <extra> now has an <old-paths> element, a ;-separated list of old paths that
- should be detected and migrated to the new <path> for that package.
- - <platform> has a new optional <abi-included> that describes the ABI of the
- system image included in the platform, if any.
- - New <system-image> package type, to store system images outside of <platform>s.
- - New <source> package type.
- -->
-
- <xsd:element name="sdk-repository" type="sdk:repositoryType" />
-
- <xsd:complexType name="repositoryType">
- <xsd:annotation>
- <xsd:documentation>
- The repository contains a collection of downloadable packages.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:choice minOccurs="0" maxOccurs="unbounded">
- <xsd:element name="platform" type="sdk:platformType" />
- <xsd:element name="system-image" type="sdk:systemImageType" />
- <xsd:element name="source" type="sdk:sourceType" />
- <xsd:element name="tool" type="sdk:toolType" />
- <xsd:element name="platform-tool" type="sdk:platformToolType" />
- <xsd:element name="doc" type="sdk:docType" />
- <xsd:element name="sample" type="sdk:sampleType" />
- <xsd:element name="extra" type="sdk:extraType" />
- <xsd:element name="license" type="sdk:licenseType" />
- </xsd:choice>
- </xsd:complexType>
-
- <!-- The definition of an SDK platform package. -->
-
- <xsd:complexType name="platformType">
- <xsd:annotation>
- <xsd:documentation>An SDK platform package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The Android platform version. It is string such as "1.0". -->
- <xsd:element name="version" type="xsd:normalizedString" />
- <!-- The Android API Level for the platform. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this platform, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
-
- <!-- Information on the layoutlib packaged in this platform. -->
- <xsd:element name="layoutlib" type="sdk:layoutlibType" />
-
- <!-- optional elements -->
-
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
- <!-- The minimal revision of tools required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-tools-rev" type="xsd:positiveInteger" minOccurs="0" />
-
- <!-- The ABI of the system image *included* in this platform, if any.
- When the field is present, it means the platform already embeds one
- system image. A platform can also have any number of external
- <system-image> associated with it. -->
- <xsd:element name="included-abi" type="sdk:abiType" minOccurs="0" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of a layout library used by a platform. -->
-
- <xsd:complexType name="layoutlibType" >
- <xsd:annotation>
- <xsd:documentation>
- Version information for a layoutlib included in a platform.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The layoutlib API level, an int > 0,
- incremented with each new incompatible lib. -->
- <xsd:element name="api" type="xsd:positiveInteger" />
- <!-- The incremental minor revision for that API, e.g. in case of bug fixes.
- Optional. An int >= 0, assumed to be 0 if the element is missing. -->
- <xsd:element name="revision" type="xsd:nonNegativeInteger" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of a system image used by a platform. -->
-
- <xsd:complexType name="systemImageType" >
- <xsd:annotation>
- <xsd:documentation>
- System Image for a platform.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- api-level + codename identifies the platform to which this system image belongs. -->
-
- <!-- The Android API Level for the platform. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this platform, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
-
- <!-- The ABI of the system emulated by this image. -->
- <xsd:element name="abi" type="sdk:abiType" />
-
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
-
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
- </xsd:all>
- </xsd:complexType>
-
- <!-- The definition of the ABI supported by a platform's system image. -->
-
- <xsd:simpleType name="abiType">
- <xsd:annotation>
- <xsd:documentation>The ABI of a platform's system image.</xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="armeabi" />
- <xsd:enumeration value="armeabi-v7a" />
- <xsd:enumeration value="x86" />
- </xsd:restriction>
- </xsd:simpleType>
-
-
- <!-- The definition of a source package. -->
-
- <xsd:complexType name="sourceType" >
- <xsd:annotation>
- <xsd:documentation>
- Sources for a platform.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- api-level + codename identifies the platform to which this source belongs. -->
-
- <!-- The Android API Level for the platform. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this platform, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
-
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
-
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK tool package. -->
-
- <xsd:complexType name="toolType" >
- <xsd:annotation>
- <xsd:documentation>An SDK tool package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
-
- <!-- The minimal revision of platform-tools required by this package.
- Mandatory. Must be an int > 0. -->
- <xsd:element name="min-platform-tools-rev" type="xsd:positiveInteger" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK platform-tool package. -->
-
- <xsd:complexType name="platformToolType" >
- <xsd:annotation>
- <xsd:documentation>An SDK platform-tool package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK doc package. -->
-
- <xsd:complexType name="docType" >
- <xsd:annotation>
- <xsd:documentation>An SDK doc package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The Android API Level for the documentation. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this doc, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK sample package. -->
-
- <xsd:complexType name="sampleType" >
- <xsd:annotation>
- <xsd:documentation>An SDK sample package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The Android API Level for the documentation. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this doc, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
- <!-- The minimal revision of tools required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-tools-rev" type="xsd:positiveInteger" minOccurs="0" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK extra package. This kind of package is for
- "free" content. Such packages are installed in SDK/vendor/path.
-
- Important implementation detail: this element is duplicated in the
- sdk-addon-N.xsd schema and must be kept in sync there. This is
- simpler than trying to use some kind of of include or to request
- that clients use a third XML schema for common parts.
- -->
-
- <xsd:complexType name="extraType" >
- <xsd:annotation>
- <xsd:documentation>
- An SDK extra package. This kind of package is for "free" content.
- Such packages are installed in SDK/vendor/path.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:all>
-
- <!-- The install path top folder name.
- The segments "add-ons", "docs", "platforms", "platform-tools", "temp"
- and "tools" are reserved and cannot be used.
- -->
- <xsd:element name="vendor" type="sdk:segmentType" />
-
- <!-- The install path sub-folder name. -->
- <xsd:element name="path" type="sdk:segmentType" />
-
- <!-- A semi-colon separated list of "obsolete" path names which are equivalent
- to the current 'path' name. When a package is seen using an old-paths' name,
- the package manager will try to upgrade it to the new path. -->
- <xsd:element name="old-paths" type="sdk:segmentListType" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
-
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- optional elements -->
-
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- The minimal revision of tools required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-tools-rev" type="xsd:positiveInteger" minOccurs="0" />
- <!-- The minimal API level required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-api-level" type="xsd:positiveInteger" minOccurs="0" />
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
-
- <!-- A list of project files contributed by this package. Optional. -->
- <xsd:element name="project-files" type="sdk:projectFilesType" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of a path segment used by the extra element. -->
-
- <xsd:simpleType name="segmentType">
- <xsd:annotation>
- <xsd:documentation>
- One path segment for the install path of an extra element.
- It must be a single-segment path.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:pattern value="[a-zA-Z0-9_]+"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:simpleType name="segmentListType">
- <xsd:annotation>
- <xsd:documentation>
- A semi-colon separated list of a segmentTypes.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:pattern value="[a-zA-Z0-9_;]+"/>
- </xsd:restriction>
- </xsd:simpleType>
-
-
- <!-- The definition of a license to be referenced by the uses-license element. -->
-
- <xsd:complexType name="licenseType">
- <xsd:annotation>
- <xsd:documentation>
- A license definition. Such a license must be used later as a reference
- using a uses-license element in one of the package elements.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:simpleContent>
- <xsd:extension base="xsd:string">
- <xsd:attribute name="id" type="xsd:ID" />
- <xsd:attribute name="type" type="xsd:token" fixed="text" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-
- <!-- Type describing the license used by a package.
- The license MUST be defined using a license node and referenced
- using the ref attribute of the license element inside a package.
- -->
-
- <xsd:complexType name="usesLicenseType">
- <xsd:annotation>
- <xsd:documentation>
- Describes the license used by a package. The license MUST be defined
- using a license node and referenced using the ref attribute of the
- license element inside a package.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="ref" type="xsd:IDREF" />
- </xsd:complexType>
-
-
- <!-- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository elements and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- -->
-
- <xsd:complexType name="archivesType">
- <xsd:annotation>
- <xsd:documentation>
- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository packages and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence minOccurs="1" maxOccurs="unbounded">
- <!-- One archive file -->
- <xsd:element name="archive">
- <xsd:complexType>
- <!-- Properties of the archive file -->
- <xsd:all>
- <!-- The size in bytes of the archive to download. -->
- <xsd:element name="size" type="xsd:positiveInteger" />
- <!-- The checksum of the archive file. -->
- <xsd:element name="checksum" type="sdk:checksumType" />
- <!-- The URL is an absolute URL if it starts with http://, https://
- or ftp://. Otherwise it is relative to the parent directory that
- contains this repository.xml -->
- <xsd:element name="url" type="xsd:token" />
- </xsd:all>
-
- <!-- Attributes that identify the OS and architecture -->
- <xsd:attribute name="os" use="required">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="linux" />
- <xsd:enumeration value="macosx" />
- <xsd:enumeration value="windows" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- <xsd:attribute name="arch" use="optional">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="ppc" />
- <xsd:enumeration value="x86" />
- <xsd:enumeration value="x86_64" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- </xsd:complexType>
- </xsd:element>
- </xsd:sequence>
- </xsd:complexType>
-
-
- <!-- A collection of file paths available in an <extra> package
- that can be installed in an Android project.
- If present, the <project-files> collection must contain at least one path.
- Each path is relative to the root directory of the package.
- -->
-
- <xsd:complexType name="projectFilesType">
- <xsd:annotation>
- <xsd:documentation>
- A collection of file paths available in an <extra> package
- that can be installed in an Android project.
- If present, the <project-files> collection must contain at least one path.
- Each path is relative to the root directory of the package.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence minOccurs="1" maxOccurs="unbounded">
- <!-- One JAR Path, relative to the root folder of the package. -->
- <xsd:element name="path" type="xsd:string" />
- </xsd:sequence>
- </xsd:complexType>
-
-
- <!-- The definition of a file checksum -->
-
- <xsd:simpleType name="sha1Number">
- <xsd:annotation>
- <xsd:documentation>A SHA1 checksum.</xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:string">
- <xsd:pattern value="([0-9a-fA-F]){40}"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:complexType name="checksumType">
- <xsd:annotation>
- <xsd:documentation>A file checksum, currently only SHA1.</xsd:documentation>
- </xsd:annotation>
- <xsd:simpleContent>
- <xsd:extension base="sdk:sha1Number">
- <xsd:attribute name="type" type="xsd:token" fixed="sha1" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-</xsd:schema>
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-repository-6.xsd b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-repository-6.xsd
deleted file mode 100755
index bccce69..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-repository-6.xsd
+++ /dev/null
@@ -1,608 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<xsd:schema
- targetNamespace="http://schemas.android.com/sdk/android/repository/6"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:sdk="http://schemas.android.com/sdk/android/repository/6"
- elementFormDefault="qualified"
- attributeFormDefault="unqualified"
- version="1">
-
- <!-- The repository contains a collection of downloadable items known as
- "packages". Each package has a type and various attributes and contains
- a list of file "archives" that can be downloaded for specific OSes.
-
- An Android SDK repository is a web site that contains a "repository.xml"
- file that conforms to this XML Schema.
-
- History:
- - v1 is used by the SDK Updater in Tools r3 and r4.
-
- - v2 is used by the SDK Updater in Tools r5:
- - It introduces a new <sample> repository type. Previously samples
- were included in the <platform> packages. Instead this package is used
- and and the samples are installed in $SDK/samples.
- - All repository types have a new <obsolete> node. It works as a marker
- to indicate the package is obsolete and should not be selected by default.
- The UI also hides these out by default.
-
- - v3 is used by the SDK Updater in Tools r8:
- - It introduces a new <platform-tool> repository type. Previously platform-specific
- tools were included in the <platform> packages. Instead this package is used
- and platform-specific tools are installed in $SDK/platform-tools
- - There's a new element <min-platform-tools-rev> in <tool>. The tool package now
- requires that at least some minimal version of <platform-tool> be installed.
- - It removes the <addon> repository type, which is now in its own XML Schema.
-
- - v4 is used by the SDK Updater in Tools r12:
- - <extra> element now has a <project-files> element that contains 1 or
- or more <path>, each indicating the relative path of a file that this package
- can contribute to installed projects.
- - <platform> element now has a mandatory <layoutlib> that indicates the API
- and revision of that layout library for this particular platform.
-
- - v5 is used by the SDK Manager in Tools r14:
- - <extra> now has an <old-paths> element, a ;-separated list of old paths that
- should be detected and migrated to the new <path> for that package.
- - <platform> has a new optional <abi-included> that describes the ABI of the
- system image included in the platform, if any.
- - New <system-image> package type, to store system images outside of <platform>s.
- - New <source> package type.
-
- - v6 is used by the SDK Manager in Tools r18:
- - <extra> packages are removed. They are served only by the addon XML.
- - <platform>, <system-image>, <source>, <tool>, <platform-tool>, <doc>
- and <sample> get a new optional field <beta-rc> which can be used to indicate
- the package is a Beta Release Candidate and not a final release.
- -->
-
- <xsd:element name="sdk-repository" type="sdk:repositoryType" />
-
- <xsd:complexType name="repositoryType">
- <xsd:annotation>
- <xsd:documentation>
- The repository contains a collection of downloadable packages.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:choice minOccurs="0" maxOccurs="unbounded">
- <xsd:element name="platform" type="sdk:platformType" />
- <xsd:element name="system-image" type="sdk:systemImageType" />
- <xsd:element name="source" type="sdk:sourceType" />
- <xsd:element name="tool" type="sdk:toolType" />
- <xsd:element name="platform-tool" type="sdk:platformToolType" />
- <xsd:element name="doc" type="sdk:docType" />
- <xsd:element name="sample" type="sdk:sampleType" />
- <xsd:element name="license" type="sdk:licenseType" />
- </xsd:choice>
- </xsd:complexType>
-
- <!-- The definition of an SDK platform package. -->
-
- <xsd:complexType name="platformType">
- <xsd:annotation>
- <xsd:documentation>An SDK platform package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The Android platform version. It is string such as "1.0". -->
- <xsd:element name="version" type="xsd:normalizedString" />
- <!-- The Android API Level for the platform. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this platform, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
-
- <!-- Information on the layoutlib packaged in this platform. -->
- <xsd:element name="layoutlib" type="sdk:layoutlibType" />
-
- <!-- optional elements -->
-
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
- <!-- The minimal revision of tools required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-tools-rev" type="xsd:positiveInteger" minOccurs="0" />
-
- <!-- The ABI of the system image *included* in this platform, if any.
- When the field is present, it means the platform already embeds one
- system image. A platform can also have any number of external
- <system-image> associated with it. -->
- <xsd:element name="included-abi" type="sdk:abiType" minOccurs="0" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
-
- <!-- An optional element indicating the package is a beta/preview.
- When present, it indicates the release-candidate number.
- When the element is absent, it indicates this is a released package. -->
- <xsd:element name="beta-rc" type="xsd:positiveInteger" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of a layout library used by a platform. -->
-
- <xsd:complexType name="layoutlibType" >
- <xsd:annotation>
- <xsd:documentation>
- Version information for a layoutlib included in a platform.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The layoutlib API level, an int > 0,
- incremented with each new incompatible lib. -->
- <xsd:element name="api" type="xsd:positiveInteger" />
- <!-- The incremental minor revision for that API, e.g. in case of bug fixes.
- Optional. An int >= 0, assumed to be 0 if the element is missing. -->
- <xsd:element name="revision" type="xsd:nonNegativeInteger" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of a system image used by a platform. -->
-
- <xsd:complexType name="systemImageType" >
- <xsd:annotation>
- <xsd:documentation>
- System Image for a platform.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- api-level + codename identifies the platform to which this system image belongs. -->
-
- <!-- The Android API Level for the platform. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this platform, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
-
- <!-- The ABI of the system emulated by this image. -->
- <xsd:element name="abi" type="sdk:abiType" />
-
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
-
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
-
- <!-- An optional element indicating the package is a beta/preview.
- When present, it indicates the release-candidate number.
- When the element is absent, it indicates this is a released package. -->
- <xsd:element name="beta-rc" type="xsd:positiveInteger" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
- <!-- The definition of the ABI supported by a platform's system image. -->
-
- <xsd:simpleType name="abiType">
- <xsd:annotation>
- <xsd:documentation>The ABI of a platform's system image.</xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="armeabi" />
- <xsd:enumeration value="armeabi-v7a" />
- <xsd:enumeration value="x86" />
- <xsd:enumeration value="mips" />
- </xsd:restriction>
- </xsd:simpleType>
-
-
- <!-- The definition of a source package. -->
-
- <xsd:complexType name="sourceType" >
- <xsd:annotation>
- <xsd:documentation>
- Sources for a platform.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- api-level + codename identifies the platform to which this source belongs. -->
-
- <!-- The Android API Level for the platform. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this platform, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
-
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
-
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
-
- <!-- An optional element indicating the package is a beta/preview.
- When present, it indicates the release-candidate number.
- When the element is absent, it indicates this is a released package. -->
- <xsd:element name="beta-rc" type="xsd:positiveInteger" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK tool package. -->
-
- <xsd:complexType name="toolType" >
- <xsd:annotation>
- <xsd:documentation>An SDK tool package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- The minimal revision of platform-tools required by this package.
- Mandatory. Must be an int > 0. -->
- <xsd:element name="min-platform-tools-rev" type="xsd:positiveInteger" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
-
- <!-- An optional element indicating the package is a beta/preview.
- When present, it indicates the release-candidate number.
- When the element is absent, it indicates this is a released package. -->
- <xsd:element name="beta-rc" type="xsd:positiveInteger" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK platform-tool package. -->
-
- <xsd:complexType name="platformToolType" >
- <xsd:annotation>
- <xsd:documentation>An SDK platform-tool package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
-
- <!-- An optional element indicating the package is a beta/preview.
- When present, it indicates the release-candidate number.
- When the element is absent, it indicates this is a released package. -->
- <xsd:element name="beta-rc" type="xsd:positiveInteger" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK doc package. -->
-
- <xsd:complexType name="docType" >
- <xsd:annotation>
- <xsd:documentation>An SDK doc package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The Android API Level for the documentation. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this doc, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
-
- <!-- An optional element indicating the package is a beta/preview.
- When present, it indicates the release-candidate number.
- When the element is absent, it indicates this is a released package. -->
- <xsd:element name="beta-rc" type="xsd:positiveInteger" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK sample package. -->
-
- <xsd:complexType name="sampleType" >
- <xsd:annotation>
- <xsd:documentation>An SDK sample package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The Android API Level for the documentation. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this doc, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
- <!-- The minimal revision of tools required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-tools-rev" type="xsd:positiveInteger" minOccurs="0" />
-
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
-
- <!-- An optional element indicating the package is a beta/preview.
- When present, it indicates the release-candidate number.
- When the element is absent, it indicates this is a released package. -->
- <xsd:element name="beta-rc" type="xsd:positiveInteger" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of a path segment used by the extra element. -->
-
- <xsd:simpleType name="segmentType">
- <xsd:annotation>
- <xsd:documentation>
- One path segment for the install path of an extra element.
- It must be a single-segment path.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:pattern value="[a-zA-Z0-9_]+"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:simpleType name="segmentListType">
- <xsd:annotation>
- <xsd:documentation>
- A semi-colon separated list of a segmentTypes.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:pattern value="[a-zA-Z0-9_;]+"/>
- </xsd:restriction>
- </xsd:simpleType>
-
-
- <!-- The definition of a license to be referenced by the uses-license element. -->
-
- <xsd:complexType name="licenseType">
- <xsd:annotation>
- <xsd:documentation>
- A license definition. Such a license must be used later as a reference
- using a uses-license element in one of the package elements.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:simpleContent>
- <xsd:extension base="xsd:string">
- <xsd:attribute name="id" type="xsd:ID" />
- <xsd:attribute name="type" type="xsd:token" fixed="text" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-
- <!-- Type describing the license used by a package.
- The license MUST be defined using a license node and referenced
- using the ref attribute of the license element inside a package.
- -->
-
- <xsd:complexType name="usesLicenseType">
- <xsd:annotation>
- <xsd:documentation>
- Describes the license used by a package. The license MUST be defined
- using a license node and referenced using the ref attribute of the
- license element inside a package.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="ref" type="xsd:IDREF" />
- </xsd:complexType>
-
-
- <!-- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository elements and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- -->
-
- <xsd:complexType name="archivesType">
- <xsd:annotation>
- <xsd:documentation>
- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository packages and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence minOccurs="1" maxOccurs="unbounded">
- <!-- One archive file -->
- <xsd:element name="archive">
- <xsd:complexType>
- <!-- Properties of the archive file -->
- <xsd:all>
- <!-- The size in bytes of the archive to download. -->
- <xsd:element name="size" type="xsd:positiveInteger" />
- <!-- The checksum of the archive file. -->
- <xsd:element name="checksum" type="sdk:checksumType" />
- <!-- The URL is an absolute URL if it starts with http://, https://
- or ftp://. Otherwise it is relative to the parent directory that
- contains this repository.xml -->
- <xsd:element name="url" type="xsd:token" />
- </xsd:all>
-
- <!-- Attributes that identify the OS and architecture -->
- <xsd:attribute name="os" use="required">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="linux" />
- <xsd:enumeration value="macosx" />
- <xsd:enumeration value="windows" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- <xsd:attribute name="arch" use="optional">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="ppc" />
- <xsd:enumeration value="x86" />
- <xsd:enumeration value="x86_64" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- </xsd:complexType>
- </xsd:element>
- </xsd:sequence>
- </xsd:complexType>
-
-
- <!-- A collection of file paths available in an <extra> package
- that can be installed in an Android project.
- If present, the <project-files> collection must contain at least one path.
- Each path is relative to the root directory of the package.
- -->
-
- <xsd:complexType name="projectFilesType">
- <xsd:annotation>
- <xsd:documentation>
- A collection of file paths available in an <extra> package
- that can be installed in an Android project.
- If present, the <project-files> collection must contain at least one path.
- Each path is relative to the root directory of the package.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence minOccurs="1" maxOccurs="unbounded">
- <!-- One JAR Path, relative to the root folder of the package. -->
- <xsd:element name="path" type="xsd:string" />
- </xsd:sequence>
- </xsd:complexType>
-
-
- <!-- The definition of a file checksum -->
-
- <xsd:simpleType name="sha1Number">
- <xsd:annotation>
- <xsd:documentation>A SHA1 checksum.</xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:string">
- <xsd:pattern value="([0-9a-fA-F]){40}"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:complexType name="checksumType">
- <xsd:annotation>
- <xsd:documentation>A file checksum, currently only SHA1.</xsd:documentation>
- </xsd:annotation>
- <xsd:simpleContent>
- <xsd:extension base="sdk:sha1Number">
- <xsd:attribute name="type" type="xsd:token" fixed="sha1" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-</xsd:schema>
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-repository-7.xsd b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-repository-7.xsd
deleted file mode 100755
index ea18070..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-repository-7.xsd
+++ /dev/null
@@ -1,612 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<xsd:schema
- targetNamespace="http://schemas.android.com/sdk/android/repository/7"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:sdk="http://schemas.android.com/sdk/android/repository/7"
- elementFormDefault="qualified"
- attributeFormDefault="unqualified"
- version="1">
-
- <!-- The repository contains a collection of downloadable items known as
- "packages". Each package has a type and various attributes and contains
- a list of file "archives" that can be downloaded for specific OSes.
-
- An Android SDK repository is a web site that contains a "repository.xml"
- file that conforms to this XML Schema.
-
- History:
- - v1 is used by the SDK Updater in Tools r3 and r4.
-
- - v2 is used by the SDK Updater in Tools r5:
- - It introduces a new <sample> repository type. Previously samples
- were included in the <platform> packages. Instead this package is used
- and and the samples are installed in $SDK/samples.
- - All repository types have a new <obsolete> node. It works as a marker
- to indicate the package is obsolete and should not be selected by default.
- The UI also hides these out by default.
-
- - v3 is used by the SDK Updater in Tools r8:
- - It introduces a new <platform-tool> repository type. Previously platform-specific
- tools were included in the <platform> packages. Instead this package is used
- and platform-specific tools are installed in $SDK/platform-tools
- - There's a new element <min-platform-tools-rev> in <tool>. The tool package now
- requires that at least some minimal version of <platform-tool> be installed.
- - It removes the <addon> repository type, which is now in its own XML Schema.
-
- - v4 is used by the SDK Updater in Tools r12:
- - <extra> element now has a <project-files> element that contains 1 or
- or more <path>, each indicating the relative path of a file that this package
- can contribute to installed projects.
- - <platform> element now has a mandatory <layoutlib> that indicates the API
- and revision of that layout library for this particular platform.
-
- - v5 is used by the SDK Manager in Tools r14:
- - <extra> now has an <old-paths> element, a ;-separated list of old paths that
- should be detected and migrated to the new <path> for that package.
- - <platform> has a new optional <abi-included> that describes the ABI of the
- system image included in the platform, if any.
- - New <system-image> package type, to store system images outside of <platform>s.
- - New <source> package type.
-
- - v6 is used by the SDK Manager in Tools r18:
- - <extra> packages are removed. They are served only by the addon XML.
- - <platform>, <system-image>, <source>, <tool>, <platform-tool>, <doc>
- and <sample> get a new optional field <beta-rc> which can be used to indicate
- the package is a Beta Release Candidate and not a final release.
-
- - v7 is used by the SDK Manager in Tools r20:
- - For <tool> and <platform-tool> packages, the <revision> element becomes a
- a "full revision" element with <major>, <minor>, <micro> and <preview> sub-elements.
- - The <beta-rc> element is no longer supported, it is replaced by
- <revision> -> <preview> and is only for <tool> and <platform-tool> packages.
- - <min-tools-rev> and <min-platform-tools-rev> also become a full revision element.
- -->
-
- <xsd:element name="sdk-repository" type="sdk:repositoryType" />
-
- <xsd:complexType name="repositoryType">
- <xsd:annotation>
- <xsd:documentation>
- The repository contains a collection of downloadable packages.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:choice minOccurs="0" maxOccurs="unbounded">
- <xsd:element name="platform" type="sdk:platformType" />
- <xsd:element name="system-image" type="sdk:systemImageType" />
- <xsd:element name="source" type="sdk:sourceType" />
- <xsd:element name="tool" type="sdk:toolType" />
- <xsd:element name="platform-tool" type="sdk:platformToolType" />
- <xsd:element name="doc" type="sdk:docType" />
- <xsd:element name="sample" type="sdk:sampleType" />
- <xsd:element name="license" type="sdk:licenseType" />
- </xsd:choice>
- </xsd:complexType>
-
- <!-- The definition of an SDK platform package. -->
-
- <xsd:complexType name="platformType">
- <xsd:annotation>
- <xsd:documentation>An SDK platform package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The Android platform version. It is string such as "1.0". -->
- <xsd:element name="version" type="xsd:normalizedString" />
- <!-- The Android API Level for the platform. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this platform, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
-
- <!-- Information on the layoutlib packaged in this platform. -->
- <xsd:element name="layoutlib" type="sdk:layoutlibType" />
-
- <!-- optional elements -->
-
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
- <!-- The minimal revision of tools required by this package.
- Optional. If present, must be a revision element. -->
- <xsd:element name="min-tools-rev" type="sdk:revisionType" minOccurs="0" />
-
- <!-- The ABI of the system image *included* in this platform, if any.
- When the field is present, it means the platform already embeds one
- system image. A platform can also have any number of external
- <system-image> associated with it. -->
- <xsd:element name="included-abi" type="sdk:abiType" minOccurs="0" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of a layout library used by a platform. -->
-
- <xsd:complexType name="layoutlibType" >
- <xsd:annotation>
- <xsd:documentation>
- Version information for a layoutlib included in a platform.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The layoutlib API level, an int > 0,
- incremented with each new incompatible lib. -->
- <xsd:element name="api" type="xsd:positiveInteger" />
- <!-- The incremental minor revision for that API, e.g. in case of bug fixes.
- Optional. An int >= 0, assumed to be 0 if the element is missing. -->
- <xsd:element name="revision" type="xsd:nonNegativeInteger" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of a system image used by a platform. -->
-
- <xsd:complexType name="systemImageType" >
- <xsd:annotation>
- <xsd:documentation>
- System Image for a platform.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- api-level + codename identifies the platform to which this system image belongs. -->
-
- <!-- The Android API Level for the platform. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this platform, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
-
- <!-- The ABI of the system emulated by this image. -->
- <xsd:element name="abi" type="sdk:abiType" />
-
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
-
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of the ABI supported by a platform's system image. -->
-
- <xsd:simpleType name="abiType">
- <xsd:annotation>
- <xsd:documentation>The ABI of a platform's system image.</xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="armeabi" />
- <xsd:enumeration value="armeabi-v7a" />
- <xsd:enumeration value="x86" />
- <xsd:enumeration value="mips" />
- </xsd:restriction>
- </xsd:simpleType>
-
-
- <!-- The definition of a source package. -->
-
- <xsd:complexType name="sourceType" >
- <xsd:annotation>
- <xsd:documentation>
- Sources for a platform.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- api-level + codename identifies the platform to which this source belongs. -->
-
- <!-- The Android API Level for the platform. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this platform, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
-
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
-
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK tool package. -->
-
- <xsd:complexType name="toolType" >
- <xsd:annotation>
- <xsd:documentation>An SDK tool package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The full revision (major.minor.micro.preview), incremented each
- time a new package is generated. -->
- <xsd:element name="revision" type="sdk:revisionType" />
-
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- The minimal revision of platform-tools required by this package.
- Mandatory. Must be a revision element. -->
- <xsd:element name="min-platform-tools-rev" type="sdk:revisionType" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK platform-tool package. -->
-
- <xsd:complexType name="platformToolType" >
- <xsd:annotation>
- <xsd:documentation>An SDK platform-tool package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The full revision (major.minor.micro.preview), incremented each
- time a new package is generated. -->
- <xsd:element name="revision" type="sdk:revisionType" />
-
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK doc package. -->
-
- <xsd:complexType name="docType" >
- <xsd:annotation>
- <xsd:documentation>An SDK doc package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The Android API Level for the documentation. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this doc, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of an SDK sample package. -->
-
- <xsd:complexType name="sampleType" >
- <xsd:annotation>
- <xsd:documentation>An SDK sample package.</xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The Android API Level for the documentation. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this doc, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
- <!-- The minimal revision of tools required by this package.
- Optional. If present, must be a revision element. -->
- <xsd:element name="min-tools-rev" type="sdk:revisionType" minOccurs="0" />
-
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of a path segment used by the extra element. -->
-
- <xsd:simpleType name="segmentType">
- <xsd:annotation>
- <xsd:documentation>
- One path segment for the install path of an extra element.
- It must be a single-segment path.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:pattern value="[a-zA-Z0-9_]+"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:simpleType name="segmentListType">
- <xsd:annotation>
- <xsd:documentation>
- A semi-colon separated list of a segmentTypes.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:pattern value="[a-zA-Z0-9_;]+"/>
- </xsd:restriction>
- </xsd:simpleType>
-
-
- <!-- The definition of a license to be referenced by the uses-license element. -->
-
- <xsd:complexType name="licenseType">
- <xsd:annotation>
- <xsd:documentation>
- A license definition. Such a license must be used later as a reference
- using a uses-license element in one of the package elements.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:simpleContent>
- <xsd:extension base="xsd:string">
- <xsd:attribute name="id" type="xsd:ID" />
- <xsd:attribute name="type" type="xsd:token" fixed="text" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-
- <!-- Type describing the license used by a package.
- The license MUST be defined using a license node and referenced
- using the ref attribute of the license element inside a package.
- -->
-
- <xsd:complexType name="usesLicenseType">
- <xsd:annotation>
- <xsd:documentation>
- Describes the license used by a package. The license MUST be defined
- using a license node and referenced using the ref attribute of the
- license element inside a package.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="ref" type="xsd:IDREF" />
- </xsd:complexType>
-
-
- <!-- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository elements and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- -->
-
- <xsd:complexType name="archivesType">
- <xsd:annotation>
- <xsd:documentation>
- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository packages and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence minOccurs="1" maxOccurs="unbounded">
- <!-- One archive file -->
- <xsd:element name="archive">
- <xsd:complexType>
- <!-- Properties of the archive file -->
- <xsd:all>
- <!-- The size in bytes of the archive to download. -->
- <xsd:element name="size" type="xsd:positiveInteger" />
- <!-- The checksum of the archive file. -->
- <xsd:element name="checksum" type="sdk:checksumType" />
- <!-- The URL is an absolute URL if it starts with http://, https://
- or ftp://. Otherwise it is relative to the parent directory that
- contains this repository.xml -->
- <xsd:element name="url" type="xsd:token" />
- </xsd:all>
-
- <!-- Attributes that identify the OS and architecture -->
- <xsd:attribute name="os" use="required">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="linux" />
- <xsd:enumeration value="macosx" />
- <xsd:enumeration value="windows" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- <xsd:attribute name="arch" use="optional">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="ppc" />
- <xsd:enumeration value="x86" />
- <xsd:enumeration value="x86_64" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- </xsd:complexType>
- </xsd:element>
- </xsd:sequence>
- </xsd:complexType>
-
-
- <!-- A full revision, with a major.minor.micro and an optional preview number.
- The major number is mandatory, the other elements are optional.
- -->
-
- <xsd:complexType name="revisionType">
- <xsd:annotation>
- <xsd:documentation>
- A full revision, with a major.minor.micro and an
- optional preview number. The major number is mandatory.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The major revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="major" type="xsd:positiveInteger" />
- <!-- The minor revision, an int >= 0, incremented each time a new
- minor package is generated. Assumed to be 0 if missing. -->
- <xsd:element name="minor" type="xsd:nonNegativeInteger" minOccurs="0" />
- <!-- The micro revision, an int >= 0, incremented each time a new
- buf fix is generated. Assumed to be 0 if missing. -->
- <xsd:element name="micro" type="xsd:nonNegativeInteger" minOccurs="0" />
- <!-- The preview/release candidate revision, an int > 0,
- incremented each time a new preview is generated.
- Not present for final releases. -->
- <xsd:element name="preview" type="xsd:positiveInteger" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- A collection of file paths available in an <extra> package
- that can be installed in an Android project.
- If present, the <project-files> collection must contain at least one path.
- Each path is relative to the root directory of the package.
- -->
-
- <xsd:complexType name="projectFilesType">
- <xsd:annotation>
- <xsd:documentation>
- A collection of file paths available in an <extra> package
- that can be installed in an Android project.
- If present, the <project-files> collection must contain at least one path.
- Each path is relative to the root directory of the package.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence minOccurs="1" maxOccurs="unbounded">
- <!-- One JAR Path, relative to the root folder of the package. -->
- <xsd:element name="path" type="xsd:string" />
- </xsd:sequence>
- </xsd:complexType>
-
-
- <!-- The definition of a file checksum -->
-
- <xsd:simpleType name="sha1Number">
- <xsd:annotation>
- <xsd:documentation>A SHA1 checksum.</xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:string">
- <xsd:pattern value="([0-9a-fA-F]){40}"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:complexType name="checksumType">
- <xsd:annotation>
- <xsd:documentation>A file checksum, currently only SHA1.</xsd:documentation>
- </xsd:annotation>
- <xsd:simpleContent>
- <xsd:extension base="sdk:sha1Number">
- <xsd:attribute name="type" type="xsd:token" fixed="sha1" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-</xsd:schema>
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-stats-1.xsd b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-stats-1.xsd
deleted file mode 100755
index 2944b12..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-stats-1.xsd
+++ /dev/null
@@ -1,96 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<xsd:schema
- targetNamespace="http://schemas.android.com/sdk/android/stats/1"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:ast="http://schemas.android.com/sdk/android/stats/1"
- elementFormDefault="qualified"
- attributeFormDefault="unqualified"
- version="1">
-
- <!--
- A simple list of platforms provided by the SDK Manager and some
- statistics on them, namely the market share percentage for that
- platform.
- This can be used by the SDK Manager or the ADT New Project Wizard
- to give users an idea of the relative install base of platforms.
-
- Scope, Caveat & Limitation:
- The "share percentage" corresponds to the Platform Versions table
- from the SDK Dashboard as seen at
- http://developer.android.com/resources/dashboard/platform-versions.html
- However the data is not automatically generated and there is NO
- freshness implied. The values may or may not be up-to-date and it is
- most likely they will only get refreshed when there's a significant
- change that affects the usage of the SDK tools.
-
- => The data is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
- OR CONDITIONS OF ANY KIND, either express or implied.
- -->
-
- <xsd:element name="sdk-stats" type="ast:platformsListType" />
-
- <xsd:complexType name="platformsListType">
- <xsd:annotation>
- <xsd:documentation>
- A simple list of platform stats.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:choice minOccurs="0" maxOccurs="unbounded">
- <xsd:element name="platform" type="ast:platformType" />
- </xsd:choice>
- </xsd:complexType>
-
-
- <!-- The definition of stats for a platform. -->
-
- <xsd:complexType name="platformType">
- <xsd:annotation>
- <xsd:documentation>Stats information for a given Android platform.
- The api-level acts as a key, and it is epxected there should only
- be one platform listed with the same API-level.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- The Android API Level for the platform. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
-
- <!-- The official codename for this platform, for example "Cupcake". -->
- <xsd:element name="codename" type="xsd:normalizedString" />
-
- <!-- The official version name of this platform, for example "Android 1.5". -->
- <xsd:element name="version" type="xsd:normalizedString" />
-
- <!-- An approximate share percentage of this platform. -->
- <xsd:element name="share" type="ast:percent" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- A decimal percentage, between 0.0 and 100.0% -->
-
- <xsd:simpleType name="percent" id="percent">
- <xsd:annotation>
- <xsd:documentation>A decimal percentage, between 0.0 and 100.0%.</xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:decimal">
- <xsd:minInclusive value="0"/>
- <xsd:maxInclusive value="100"/>
- </xsd:restriction>
- </xsd:simpleType>
-
-</xsd:schema>
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-sys-img-1.xsd b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-sys-img-1.xsd
deleted file mode 100755
index a19aa49..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/repository/sdk-sys-img-1.xsd
+++ /dev/null
@@ -1,229 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<xsd:schema
- targetNamespace="http://schemas.android.com/sdk/android/sys-img/1"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:sdk="http://schemas.android.com/sdk/android/sys-img/1"
- elementFormDefault="qualified"
- attributeFormDefault="unqualified"
- version="1">
-
- <!-- The repository contains a collection of downloadable items known as
- "packages". Each package has a type and various attributes and contains
- a list of file "archives" that can be downloaded for specific OSes.
-
- An Android Addon repository is a web site that contains an "addon.xml"
- file that conforms to this XML Schema.
-
- History:
- - v1 is used by the SDK Updater in Tools r20. It is split out of the
- main SDK Repository XML Schema and can only contain <system-image> packages.
- -->
-
- <xsd:element name="sdk-sys-img" type="sdk:repositoryType" />
-
- <xsd:complexType name="repositoryType">
- <xsd:annotation>
- <xsd:documentation>
- The repository contains a collection of downloadable system images.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:choice minOccurs="0" maxOccurs="unbounded">
- <xsd:element name="system-image" type="sdk:systemImageType" />
- <xsd:element name="license" type="sdk:licenseType" />
- </xsd:choice>
- </xsd:complexType>
-
-
- <!-- The definition of a system image used by a platform. -->
-
- <xsd:complexType name="systemImageType" >
- <xsd:annotation>
- <xsd:documentation>
- System Image for a platform.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:all>
- <!-- api-level+codename identifies the platform to which this system image belongs. -->
-
- <!-- The Android API Level for the platform. An int > 0. -->
- <xsd:element name="api-level" type="xsd:positiveInteger" />
- <!-- The optional codename for this platform, if it's a preview. -->
- <xsd:element name="codename" type="xsd:string" minOccurs="0" />
-
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
-
- <!-- The ABI of the system emulated by this image. -->
- <xsd:element name="abi" type="sdk:abiType" />
-
- <!-- The optional license of this package. If present, users will have
- to agree to it before downloading. -->
- <xsd:element name="uses-license" type="sdk:usesLicenseType" minOccurs="0" />
- <!-- The optional description of this package. -->
- <xsd:element name="description" type="xsd:string" minOccurs="0" />
- <!-- The optional description URL of this package -->
- <xsd:element name="desc-url" type="xsd:token" minOccurs="0" />
- <!-- The optional release note for this package. -->
- <xsd:element name="release-note" type="xsd:string" minOccurs="0" />
- <!-- The optional release note URL of this package -->
- <xsd:element name="release-url" type="xsd:token" minOccurs="0" />
-
- <!-- A list of file archives for this package. -->
- <xsd:element name="archives" type="sdk:archivesType" />
-
- <!-- An optional element indicating the package is obsolete.
- The string content is however currently not defined and ignored. -->
- <xsd:element name="obsolete" type="xsd:string" minOccurs="0" />
- </xsd:all>
- </xsd:complexType>
-
-
- <!-- The definition of the ABI supported by a platform's system image. -->
-
- <xsd:simpleType name="abiType">
- <xsd:annotation>
- <xsd:documentation>The ABI of a platform's system image.</xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="armeabi" />
- <xsd:enumeration value="armeabi-v7a" />
- <xsd:enumeration value="x86" />
- <xsd:enumeration value="mips" />
- </xsd:restriction>
- </xsd:simpleType>
-
-
- <!-- The definition of a license to be referenced by the uses-license element. -->
-
- <xsd:complexType name="licenseType">
- <xsd:annotation>
- <xsd:documentation>
- A license definition. Such a license must be used later as a reference
- using a uses-license element in one of the package elements.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:simpleContent>
- <xsd:extension base="xsd:string">
- <xsd:attribute name="id" type="xsd:ID" />
- <xsd:attribute name="type" type="xsd:token" fixed="text" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-
- <!-- Type describing the license used by a package.
- The license MUST be defined using a license node and referenced
- using the ref attribute of the license element inside a package.
- -->
-
- <xsd:complexType name="usesLicenseType">
- <xsd:annotation>
- <xsd:documentation>
- Describes the license used by a package. The license MUST be defined
- using a license node and referenced using the ref attribute of the
- license element inside a package.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="ref" type="xsd:IDREF" />
- </xsd:complexType>
-
-
- <!-- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository elements and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- -->
-
- <xsd:complexType name="archivesType">
- <xsd:annotation>
- <xsd:documentation>
- A collection of files that can be downloaded for a given architecture.
- The <archives> node is mandatory in the repository packages and the
- collection must have at least one <archive> declared.
- Each archive is a zip file that will be unzipped in a location that depends
- on its package type.
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence minOccurs="1" maxOccurs="unbounded">
- <!-- One archive file -->
- <xsd:element name="archive">
- <xsd:complexType>
- <!-- Properties of the archive file -->
- <xsd:all>
- <!-- The size in bytes of the archive to download. -->
- <xsd:element name="size" type="xsd:positiveInteger" />
- <!-- The checksum of the archive file. -->
- <xsd:element name="checksum" type="sdk:checksumType" />
- <!-- The URL is an absolute URL if it starts with http://, https://
- or ftp://. Otherwise it is relative to the parent directory that
- contains this repository.xml -->
- <xsd:element name="url" type="xsd:token" />
- </xsd:all>
-
- <!-- Attributes that identify the OS and architecture -->
- <xsd:attribute name="os" use="required">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="linux" />
- <xsd:enumeration value="macosx" />
- <xsd:enumeration value="windows" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- <xsd:attribute name="arch" use="optional">
- <xsd:simpleType>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="any" />
- <xsd:enumeration value="ppc" />
- <xsd:enumeration value="x86" />
- <xsd:enumeration value="x86_64" />
- </xsd:restriction>
- </xsd:simpleType>
- </xsd:attribute>
- </xsd:complexType>
- </xsd:element>
- </xsd:sequence>
- </xsd:complexType>
-
-
- <!-- The definition of a file checksum -->
-
- <xsd:simpleType name="sha1Number">
- <xsd:annotation>
- <xsd:documentation>A SHA1 checksum.</xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:string">
- <xsd:pattern value="([0-9a-fA-F]){40}"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:complexType name="checksumType">
- <xsd:annotation>
- <xsd:documentation>A file checksum, currently only SHA1.</xsd:documentation>
- </xsd:annotation>
- <xsd:simpleContent>
- <xsd:extension base="sdk:sha1Number">
- <xsd:attribute name="type" type="xsd:token" fixed="sha1" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
-</xsd:schema>
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/util/ArrayUtils.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/util/ArrayUtils.java
deleted file mode 100644
index 20f9c01..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/util/ArrayUtils.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.util;
-
-import java.lang.reflect.Array;
-
-// XXX these should be changed to reflect the actual memory allocator we use.
-// it looks like right now objects want to be powers of 2 minus 8
-// and the array size eats another 4 bytes
-
-/**
- * ArrayUtils contains some methods that you can call to find out
- * the most efficient increments by which to grow arrays.
- */
-/* package */ class ArrayUtils
-{
- private static Object[] EMPTY = new Object[0];
- private static final int CACHE_SIZE = 73;
- private static Object[] sCache = new Object[CACHE_SIZE];
-
- private ArrayUtils() { /* cannot be instantiated */ }
-
- public static int idealByteArraySize(int need) {
- for (int i = 4; i < 32; i++)
- if (need <= (1 << i) - 12)
- return (1 << i) - 12;
-
- return need;
- }
-
- public static int idealBooleanArraySize(int need) {
- return idealByteArraySize(need);
- }
-
- public static int idealShortArraySize(int need) {
- return idealByteArraySize(need * 2) / 2;
- }
-
- public static int idealCharArraySize(int need) {
- return idealByteArraySize(need * 2) / 2;
- }
-
- public static int idealIntArraySize(int need) {
- return idealByteArraySize(need * 4) / 4;
- }
-
- public static int idealFloatArraySize(int need) {
- return idealByteArraySize(need * 4) / 4;
- }
-
- public static int idealObjectArraySize(int need) {
- return idealByteArraySize(need * 4) / 4;
- }
-
- public static int idealLongArraySize(int need) {
- return idealByteArraySize(need * 8) / 8;
- }
-
- /**
- * Checks if the beginnings of two byte arrays are equal.
- *
- * @param array1 the first byte array
- * @param array2 the second byte array
- * @param length the number of bytes to check
- * @return true if they're equal, false otherwise
- */
- public static boolean equals(byte[] array1, byte[] array2, int length) {
- if (array1 == array2) {
- return true;
- }
- if (array1 == null || array2 == null || array1.length < length || array2.length < length) {
- return false;
- }
- for (int i = 0; i < length; i++) {
- if (array1[i] != array2[i]) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Returns an empty array of the specified type. The intent is that
- * it will return the same empty array every time to avoid reallocation,
- * although this is not guaranteed.
- */
- @SuppressWarnings("unchecked")
- public static <T> T[] emptyArray(Class<T> kind) {
- if (kind == Object.class) {
- return (T[]) EMPTY;
- }
-
- int bucket = ((System.identityHashCode(kind) / 8) & 0x7FFFFFFF) % CACHE_SIZE;
- Object cache = sCache[bucket];
-
- if (cache == null || cache.getClass().getComponentType() != kind) {
- cache = Array.newInstance(kind, 0);
- sCache[bucket] = cache;
-
- // Log.e("cache", "new empty " + kind.getName() + " at " + bucket);
- }
-
- return (T[]) cache;
- }
-
- /**
- * Checks that value is present as at least one of the elements of the array.
- * @param array the array to check in
- * @param value the value to check for
- * @return true if the value is present in the array
- */
- public static <T> boolean contains(T[] array, T value) {
- for (T element : array) {
- if (element == null) {
- if (value == null) return true;
- } else {
- if (value != null && element.equals(value)) return true;
- }
- }
- return false;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/util/CommandLineParser.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/util/CommandLineParser.java
deleted file mode 100644
index 3a86ea7..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/util/CommandLineParser.java
+++ /dev/null
@@ -1,968 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.util;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.utils.ILogger;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map.Entry;
-
-/**
- * Parses the command-line and stores flags needed or requested.
- * <p/>
- * This is a base class. To be useful you want to:
- * <ul>
- * <li>override it.
- * <li>pass an action array to the constructor.
- * <li>define flags for your actions.
- * </ul>
- * <p/>
- * To use, call {@link #parseArgs(String[])} and then
- * call {@link #getValue(String, String, String)}.
- */
-public class CommandLineParser {
-
- /*
- * Steps needed to add a new action:
- * - Each action is defined as a "verb object" followed by parameters.
- * - Either reuse a VERB_ constant or define a new one.
- * - Either reuse an OBJECT_ constant or define a new one.
- * - Add a new entry to mAction with a one-line help summary.
- * - In the constructor, add a define() call for each parameter (either mandatory
- * or optional) for the given action.
- */
-
- /** Internal verb name for internally hidden flags. */
- public final static String GLOBAL_FLAG_VERB = "@@internal@@"; //$NON-NLS-1$
-
- /** String to use when the verb doesn't need any object. */
- public final static String NO_VERB_OBJECT = ""; //$NON-NLS-1$
-
- /** The global help flag. */
- public static final String KEY_HELP = "help";
- /** The global verbose flag. */
- public static final String KEY_VERBOSE = "verbose";
- /** The global silent flag. */
- public static final String KEY_SILENT = "silent";
-
- /** Verb requested by the user. Null if none specified, which will be an error. */
- private String mVerbRequested;
- /** Direct object requested by the user. Can be null. */
- private String mDirectObjectRequested;
-
- /**
- * Action definitions.
- * <p/>
- * This list serves two purposes: first it is used to know which verb/object
- * actions are acceptable on the command-line; second it provides a summary
- * for each action that is printed in the help.
- * <p/>
- * Each entry is a string array with:
- * <ul>
- * <li> the verb.
- * <li> a direct object (use {@link #NO_VERB_OBJECT} if there's no object).
- * <li> a description.
- * <li> an alternate form for the object (e.g. plural).
- * </ul>
- */
- private final String[][] mActions;
-
- private static final int ACTION_VERB_INDEX = 0;
- private static final int ACTION_OBJECT_INDEX = 1;
- private static final int ACTION_DESC_INDEX = 2;
- private static final int ACTION_ALT_OBJECT_INDEX = 3;
-
- /**
- * The map of all defined arguments.
- * <p/>
- * The key is a string "verb/directObject/longName".
- */
- private final HashMap<String, Arg> mArguments = new HashMap<String, Arg>();
- /** Logger */
- private final ILogger mLog;
-
- /**
- * Constructs a new command-line processor.
- *
- * @param logger An SDK logger object. Must not be null.
- * @param actions The list of actions recognized on the command-line.
- * See the javadoc of {@link #mActions} for more details.
- *
- * @see #mActions
- */
- public CommandLineParser(ILogger logger, String[][] actions) {
- mLog = logger;
- mActions = actions;
-
- /*
- * usage should fit in 80 columns, including the space to print the options:
- * " -v --verbose 7890123456789012345678901234567890123456789012345678901234567890"
- */
-
- define(Mode.BOOLEAN, false, GLOBAL_FLAG_VERB, NO_VERB_OBJECT, "v", KEY_VERBOSE,
- "Verbose mode, shows errors, warnings and all messages.",
- false);
- define(Mode.BOOLEAN, false, GLOBAL_FLAG_VERB, NO_VERB_OBJECT, "s", KEY_SILENT,
- "Silent mode, shows errors only.",
- false);
- define(Mode.BOOLEAN, false, GLOBAL_FLAG_VERB, NO_VERB_OBJECT, "h", KEY_HELP,
- "Help on a specific command.",
- false);
- }
-
- /**
- * Indicates if this command-line can work when no verb is specified.
- * The default is false, which generates an error when no verb/object is specified.
- * Derived implementations can set this to true if they can deal with a lack
- * of verb/action.
- */
- public boolean acceptLackOfVerb() {
- return false;
- }
-
-
- //------------------
- // Helpers to get flags values
-
- /** Helper that returns true if --verbose was requested. */
- public boolean isVerbose() {
- return ((Boolean) getValue(GLOBAL_FLAG_VERB, NO_VERB_OBJECT, KEY_VERBOSE)).booleanValue();
- }
-
- /** Helper that returns true if --silent was requested. */
- public boolean isSilent() {
- return ((Boolean) getValue(GLOBAL_FLAG_VERB, NO_VERB_OBJECT, KEY_SILENT)).booleanValue();
- }
-
- /** Helper that returns true if --help was requested. */
- public boolean isHelpRequested() {
- return ((Boolean) getValue(GLOBAL_FLAG_VERB, NO_VERB_OBJECT, KEY_HELP)).booleanValue();
- }
-
- /** Returns the verb name from the command-line. Can be null. */
- public String getVerb() {
- return mVerbRequested;
- }
-
- /** Returns the direct object name from the command-line. Can be null. */
- public String getDirectObject() {
- return mDirectObjectRequested;
- }
-
- //------------------
-
- /**
- * Raw access to parsed parameter values.
- * <p/>
- * The default is to scan all parameters. Parameters that have been explicitly set on the
- * command line are returned first. Otherwise one with a non-null value is returned.
- * <p/>
- * Both a verb and a direct object filter can be specified. When they are non-null they limit
- * the scope of the search.
- * <p/>
- * If nothing has been found, return the last default value seen matching the filter.
- *
- * @param verb The verb name, including {@link #GLOBAL_FLAG_VERB}. If null, all possible
- * verbs that match the direct object condition will be examined and the first
- * value set will be used.
- * @param directObject The direct object name, including {@link #NO_VERB_OBJECT}. If null,
- * all possible direct objects that match the verb condition will be examined and
- * the first value set will be used.
- * @param longFlagName The long flag name for the given action. Mandatory. Cannot be null.
- * @return The current value object stored in the parameter, which depends on the argument mode.
- */
- public Object getValue(String verb, String directObject, String longFlagName) {
-
- if (verb != null && directObject != null) {
- String key = verb + '/' + directObject + '/' + longFlagName;
- Arg arg = mArguments.get(key);
- return arg.getCurrentValue();
- }
-
- Object lastDefault = null;
- for (Arg arg : mArguments.values()) {
- if (arg.getLongArg().equals(longFlagName)) {
- if (verb == null || arg.getVerb().equals(verb)) {
- if (directObject == null || arg.getDirectObject().equals(directObject)) {
- if (arg.isInCommandLine()) {
- return arg.getCurrentValue();
- }
- if (arg.getCurrentValue() != null) {
- lastDefault = arg.getCurrentValue();
- }
- }
- }
- }
- }
-
- return lastDefault;
- }
-
- /**
- * Internal setter for raw parameter value.
- * @param verb The verb name, including {@link #GLOBAL_FLAG_VERB}.
- * @param directObject The direct object name, including {@link #NO_VERB_OBJECT}.
- * @param longFlagName The long flag name for the given action.
- * @param value The new current value object stored in the parameter, which depends on the
- * argument mode.
- */
- protected void setValue(String verb, String directObject, String longFlagName, Object value) {
- String key = verb + '/' + directObject + '/' + longFlagName;
- Arg arg = mArguments.get(key);
- arg.setCurrentValue(value);
- }
-
- /**
- * Parses the command-line arguments.
- * <p/>
- * This method will exit and not return if a parsing error arise.
- *
- * @param args The arguments typically received by a main method.
- */
- public void parseArgs(String[] args) {
- String errorMsg = null;
- String verb = null;
- String directObject = null;
-
- try {
- int n = args.length;
- for (int i = 0; i < n; i++) {
- Arg arg = null;
- String a = args[i];
- if (a.startsWith("--")) { //$NON-NLS-1$
- arg = findLongArg(verb, directObject, a.substring(2));
- } else if (a.startsWith("-")) { //$NON-NLS-1$
- arg = findShortArg(verb, directObject, a.substring(1));
- }
-
- // No matching argument name found
- if (arg == null) {
- // Does it looks like a dashed parameter?
- if (a.startsWith("-")) { //$NON-NLS-1$
- if (verb == null || directObject == null) {
- // It looks like a dashed parameter and we don't have a a verb/object
- // set yet, the parameter was just given too early.
-
- errorMsg = String.format(
- "Flag '%1$s' is not a valid global flag. Did you mean to specify it after the verb/object name?",
- a);
- return;
- } else {
- // It looks like a dashed parameter but it is unknown by this
- // verb-object combination
-
- errorMsg = String.format(
- "Flag '%1$s' is not valid for '%2$s %3$s'.",
- a, verb, directObject);
- return;
- }
- }
-
- if (verb == null) {
- // Fill verb first. Find it.
- for (String[] actionDesc : mActions) {
- if (actionDesc[ACTION_VERB_INDEX].equals(a)) {
- verb = a;
- break;
- }
- }
-
- // Error if it was not a valid verb
- if (verb == null) {
- errorMsg = String.format(
- "Expected verb after global parameters but found '%1$s' instead.",
- a);
- return;
- }
-
- } else if (directObject == null) {
- // Then fill the direct object. Find it.
- for (String[] actionDesc : mActions) {
- if (actionDesc[ACTION_VERB_INDEX].equals(verb)) {
- if (actionDesc[ACTION_OBJECT_INDEX].equals(a)) {
- directObject = a;
- break;
- } else if (actionDesc.length > ACTION_ALT_OBJECT_INDEX &&
- actionDesc[ACTION_ALT_OBJECT_INDEX].equals(a)) {
- // if the alternate form exist and is used, we internally
- // only memorize the default direct object form.
- directObject = actionDesc[ACTION_OBJECT_INDEX];
- break;
- }
- }
- }
-
- // Error if it was not a valid object for that verb
- if (directObject == null) {
- errorMsg = String.format(
- "Expected verb after global parameters but found '%1$s' instead.",
- a);
- return;
-
- }
- } else {
- // The argument is not a dashed parameter and we already
- // have a verb/object. Must be some extra unknown argument.
- errorMsg = String.format(
- "Argument '%1$s' is not recognized.",
- a);
- }
- } else if (arg != null) {
- // This argument was present on the command line
- arg.setInCommandLine(true);
-
- // Process keyword
- Object error = null;
- if (arg.getMode().needsExtra()) {
- if (i+1 >= n) {
- errorMsg = String.format("Missing argument for flag %1$s.", a);
- return;
- }
-
- while (i+1 < n) {
- String b = args[i+1];
-
- if (arg.getMode() != Mode.STRING_ARRAY) {
- // We never accept something that looks like a valid argument
- // unless we see -- first
- Arg dummyArg = null;
- if (b.startsWith("--")) { //$NON-NLS-1$
- dummyArg = findLongArg(verb, directObject, b.substring(2));
- } else if (b.startsWith("-")) { //$NON-NLS-1$
- dummyArg = findShortArg(verb, directObject, b.substring(1));
- }
- if (dummyArg != null) {
- errorMsg = String.format(
- "Oops, it looks like you didn't provide an argument for '%1$s'.\n'%2$s' was found instead.",
- a, b);
- return;
- }
- }
-
- error = arg.getMode().process(arg, b);
- if (error == Accept.CONTINUE) {
- i++;
- } else if (error == Accept.ACCEPT_AND_STOP) {
- i++;
- break;
- } else if (error == Accept.REJECT_AND_STOP) {
- break;
- } else if (error instanceof String) {
- // We stop because of an error
- break;
- }
- }
- } else {
- error = arg.getMode().process(arg, null);
-
- if (isHelpRequested()) {
- // The --help flag was requested. We'll continue the usual processing
- // so that we can find the optional verb/object words. Those will be
- // used to print specific help.
- // Setting a non-null error message triggers printing the help, however
- // there is no specific error to print.
- errorMsg = ""; //$NON-NLS-1$
- }
- }
-
- if (error instanceof String) {
- errorMsg = String.format("Invalid usage for flag %1$s: %2$s.", a, error);
- return;
- }
- }
- }
-
- if (errorMsg == null) {
- if (verb == null && !acceptLackOfVerb()) {
- errorMsg = "Missing verb name.";
- } else if (verb != null) {
- if (directObject == null) {
- // Make sure this verb has an optional direct object
- for (String[] actionDesc : mActions) {
- if (actionDesc[ACTION_VERB_INDEX].equals(verb) &&
- actionDesc[ACTION_OBJECT_INDEX].equals(NO_VERB_OBJECT)) {
- directObject = NO_VERB_OBJECT;
- break;
- }
- }
-
- if (directObject == null) {
- errorMsg = String.format("Missing object name for verb '%1$s'.", verb);
- return;
- }
- }
-
- // Validate that all mandatory arguments are non-null for this action
- String missing = null;
- boolean plural = false;
- for (Entry<String, Arg> entry : mArguments.entrySet()) {
- Arg arg = entry.getValue();
- if (arg.getVerb().equals(verb) &&
- arg.getDirectObject().equals(directObject)) {
- if (arg.isMandatory() && arg.getCurrentValue() == null) {
- if (missing == null) {
- missing = "--" + arg.getLongArg(); //$NON-NLS-1$
- } else {
- missing += ", --" + arg.getLongArg(); //$NON-NLS-1$
- plural = true;
- }
- }
- }
- }
-
- if (missing != null) {
- errorMsg = String.format(
- "The %1$s %2$s must be defined for action '%3$s %4$s'",
- plural ? "parameters" : "parameter",
- missing,
- verb,
- directObject);
- }
-
- mVerbRequested = verb;
- mDirectObjectRequested = directObject;
- }
- }
- } finally {
- if (errorMsg != null) {
- printHelpAndExitForAction(verb, directObject, errorMsg);
- }
- }
- }
-
- /**
- * Finds an {@link Arg} given an action name and a long flag name.
- * @return The {@link Arg} found or null.
- */
- protected Arg findLongArg(String verb, String directObject, String longName) {
- if (verb == null) {
- verb = GLOBAL_FLAG_VERB;
- }
- if (directObject == null) {
- directObject = NO_VERB_OBJECT;
- }
- String key = verb + '/' + directObject + '/' + longName; //$NON-NLS-1$
- return mArguments.get(key);
- }
-
- /**
- * Finds an {@link Arg} given an action name and a short flag name.
- * @return The {@link Arg} found or null.
- */
- protected Arg findShortArg(String verb, String directObject, String shortName) {
- if (verb == null) {
- verb = GLOBAL_FLAG_VERB;
- }
- if (directObject == null) {
- directObject = NO_VERB_OBJECT;
- }
-
- for (Entry<String, Arg> entry : mArguments.entrySet()) {
- Arg arg = entry.getValue();
- if (arg.getVerb().equals(verb) && arg.getDirectObject().equals(directObject)) {
- if (shortName.equals(arg.getShortArg())) {
- return arg;
- }
- }
- }
-
- return null;
- }
-
- /**
- * Prints the help/usage and exits.
- *
- * @param errorFormat Optional error message to print prior to usage using String.format
- * @param args Arguments for String.format
- */
- public void printHelpAndExit(String errorFormat, Object... args) {
- printHelpAndExitForAction(null /*verb*/, null /*directObject*/, errorFormat, args);
- }
-
- /**
- * Prints the help/usage and exits.
- *
- * @param verb If null, displays help for all verbs. If not null, display help only
- * for that specific verb. In all cases also displays general usage and action list.
- * @param directObject If null, displays help for all verb objects.
- * If not null, displays help only for that specific action
- * In all cases also display general usage and action list.
- * @param errorFormat Optional error message to print prior to usage using String.format
- * @param args Arguments for String.format
- */
- public void printHelpAndExitForAction(String verb, String directObject,
- String errorFormat, Object... args) {
- if (errorFormat != null && errorFormat.length() > 0) {
- stderr(errorFormat, args);
- }
-
- /*
- * usage should fit in 80 columns
- * 12345678901234567890123456789012345678901234567890123456789012345678901234567890
- */
- stdout("\n" +
- "Usage:\n" +
- " android [global options] %s [action options]\n" +
- "\n" +
- "Global options:",
- verb == null ? "action" :
- verb + (directObject == null ? "" : " " + directObject)); //$NON-NLS-1$
- listOptions(GLOBAL_FLAG_VERB, NO_VERB_OBJECT);
-
- if (verb == null || directObject == null) {
- stdout("\nValid actions are composed of a verb and an optional direct object:");
- for (String[] action : mActions) {
- if (verb == null || verb.equals(action[ACTION_VERB_INDEX])) {
- stdout("- %1$6s %2$-13s: %3$s",
- action[ACTION_VERB_INDEX],
- action[ACTION_OBJECT_INDEX],
- action[ACTION_DESC_INDEX]);
- }
- }
- }
-
- // Only print details if a verb/object is requested
- if (verb != null) {
- for (String[] action : mActions) {
- if (verb == null || verb.equals(action[ACTION_VERB_INDEX])) {
- if (directObject == null || directObject.equals(action[ACTION_OBJECT_INDEX])) {
- stdout("\nAction \"%1$s %2$s\":",
- action[ACTION_VERB_INDEX],
- action[ACTION_OBJECT_INDEX]);
- stdout(" %1$s", action[ACTION_DESC_INDEX]);
- stdout("Options:");
- listOptions(action[ACTION_VERB_INDEX], action[ACTION_OBJECT_INDEX]);
- }
- }
- }
- }
-
- exit();
- }
-
- /**
- * Internal helper to print all the option flags for a given action name.
- */
- protected void listOptions(String verb, String directObject) {
- int numOptions = 0;
- int longArgLen = 8;
-
- for (Entry<String, Arg> entry : mArguments.entrySet()) {
- Arg arg = entry.getValue();
- if (arg.getVerb().equals(verb) && arg.getDirectObject().equals(directObject)) {
- int n = arg.getLongArg().length();
- if (n > longArgLen) {
- longArgLen = n;
- }
- }
- }
-
- for (Entry<String, Arg> entry : mArguments.entrySet()) {
- Arg arg = entry.getValue();
- if (arg.getVerb().equals(verb) && arg.getDirectObject().equals(directObject)) {
-
- String value = ""; //$NON-NLS-1$
- String required = ""; //$NON-NLS-1$
- if (arg.isMandatory()) {
- required = " [required]";
-
- } else {
- if (arg.getDefaultValue() instanceof String[]) {
- for (String v : (String[]) arg.getDefaultValue()) {
- if (value.length() > 0) {
- value += ", ";
- }
- value += v;
- }
- } else if (arg.getDefaultValue() != null) {
- Object v = arg.getDefaultValue();
- if (arg.getMode() != Mode.BOOLEAN || v.equals(Boolean.TRUE)) {
- value = v.toString();
- }
- }
- if (value.length() > 0) {
- value = " [Default: " + value + "]";
- }
- }
-
- // Java doesn't support * for printf variable width, so we'll insert the long arg
- // width "manually" in the printf format string.
- String longArgWidth = Integer.toString(longArgLen + 2);
-
- // Print a line in the form " -1_letter_arg --long_arg description"
- // where either the 1-letter arg or the long arg are optional.
- String output = String.format(
- " %1$-2s %2$-" + longArgWidth + "s: %3$s%4$s%5$s", //$NON-NLS-1$ //$NON-NLS-2$
- arg.getShortArg().length() > 0 ?
- "-" + arg.getShortArg() : //$NON-NLS-1$
- "", //$NON-NLS-1$
- arg.getLongArg().length() > 0 ?
- "--" + arg.getLongArg() : //$NON-NLS-1$
- "", //$NON-NLS-1$
- arg.getDescription(),
- value,
- required);
- stdout(output);
- numOptions++;
- }
- }
-
- if (numOptions == 0) {
- stdout(" No options");
- }
- }
-
- //----
-
- private static enum Accept {
- CONTINUE,
- ACCEPT_AND_STOP,
- REJECT_AND_STOP,
- }
-
- /**
- * The mode of an argument specifies the type of variable it represents,
- * whether an extra parameter is required after the flag and how to parse it.
- */
- public static enum Mode {
- /** Argument value is a Boolean. Default value is a Boolean. */
- BOOLEAN {
- @Override
- public boolean needsExtra() {
- return false;
- }
- @Override
- public Object process(Arg arg, String extra) {
- // Toggle the current value
- arg.setCurrentValue(! ((Boolean) arg.getCurrentValue()).booleanValue());
- return Accept.ACCEPT_AND_STOP;
- }
- },
-
- /** Argument value is an Integer. Default value is an Integer. */
- INTEGER {
- @Override
- public boolean needsExtra() {
- return true;
- }
- @Override
- public Object process(Arg arg, String extra) {
- try {
- arg.setCurrentValue(Integer.parseInt(extra));
- return null;
- } catch (NumberFormatException e) {
- return String.format("Failed to parse '%1$s' as an integer: %2$s", extra,
- e.getMessage());
- }
- }
- },
-
- /** Argument value is a String. Default value is a String[]. */
- ENUM {
- @Override
- public boolean needsExtra() {
- return true;
- }
- @Override
- public Object process(Arg arg, String extra) {
- StringBuilder desc = new StringBuilder();
- String[] values = (String[]) arg.getDefaultValue();
- for (String value : values) {
- if (value.equals(extra)) {
- arg.setCurrentValue(extra);
- return Accept.ACCEPT_AND_STOP;
- }
-
- if (desc.length() != 0) {
- desc.append(", ");
- }
- desc.append(value);
- }
-
- return String.format("'%1$s' is not one of %2$s", extra, desc.toString());
- }
- },
-
- /** Argument value is a String. Default value is a null. */
- STRING {
- @Override
- public boolean needsExtra() {
- return true;
- }
- @Override
- public Object process(Arg arg, String extra) {
- arg.setCurrentValue(extra);
- return Accept.ACCEPT_AND_STOP;
- }
- },
-
- /** Argument value is a {@link List}<String>. Default value is an empty list. */
- STRING_ARRAY {
- @Override
- public boolean needsExtra() {
- return true;
- }
- @Override
- public Object process(Arg arg, String extra) {
- // For simplification, a string array doesn't accept something that
- // starts with a dash unless a pure -- was seen before.
- if (extra != null) {
- Object v = arg.getCurrentValue();
- if (v == null) {
- ArrayList<String> a = new ArrayList<String>();
- arg.setCurrentValue(a);
- v = a;
- }
- if (v instanceof List<?>) {
- @SuppressWarnings("unchecked") List<String> a = (List<String>) v;
-
- if (extra.equals("--") ||
- !extra.startsWith("-") ||
- (extra.startsWith("-") && a.contains("--"))) {
- a.add(extra);
- return Accept.CONTINUE;
- } else if (a.isEmpty()) {
- return "No values provided";
- }
- }
- }
- return Accept.REJECT_AND_STOP;
- }
- };
-
- /**
- * Returns true if this mode requires an extra parameter.
- */
- public abstract boolean needsExtra();
-
- /**
- * Processes the flag for this argument.
- *
- * @param arg The argument being processed.
- * @param extra The extra parameter. Null if {@link #needsExtra()} returned false.
- * @return {@link Accept#CONTINUE} if this argument can use multiple values and
- * wishes to receive more.
- * Or {@link Accept#ACCEPT_AND_STOP} if this was the last value accepted by the argument.
- * Or {@link Accept#REJECT_AND_STOP} if this was value was reject and the argument
- * stops accepting new values with no error.
- * Or a string in case of error.
- * Never returns null.
- */
- public abstract Object process(Arg arg, String extra);
- }
-
- /**
- * An argument accepted by the command-line, also called "a flag".
- * Arguments must have a short version (one letter), a long version name and a description.
- * They can have a default value, or it can be null.
- * Depending on the {@link Mode}, the default value can be a Boolean, an Integer, a String
- * or a String array (in which case the first item is the current by default.)
- */
- static class Arg {
- /** Verb for that argument. Never null. */
- private final String mVerb;
- /** Direct Object for that argument. Never null, but can be empty string. */
- private final String mDirectObject;
- /** The 1-letter short name of the argument, e.g. -v. */
- private final String mShortName;
- /** The long name of the argument, e.g. --verbose. */
- private final String mLongName;
- /** A description. Never null. */
- private final String mDescription;
- /** A default value. Can be null. */
- private final Object mDefaultValue;
- /** The argument mode (type + process method). Never null. */
- private final Mode mMode;
- /** True if this argument is mandatory for this verb/directobject. */
- private final boolean mMandatory;
- /** Current value. Initially set to the default value. */
- private Object mCurrentValue;
- /** True if the argument has been used on the command line. */
- private boolean mInCommandLine;
-
- /**
- * Creates a new argument flag description.
- *
- * @param mode The {@link Mode} for the argument.
- * @param mandatory True if this argument is mandatory for this action.
- * @param verb The verb name. Never null. Can be {@link CommandLineParser#GLOBAL_FLAG_VERB}.
- * @param directObject The action name. Can be {@link CommandLineParser#NO_VERB_OBJECT}.
- * @param shortName The one-letter short argument name. Can be empty but not null.
- * @param longName The long argument name. Can be empty but not null.
- * @param description The description. Cannot be null.
- * @param defaultValue The default value (or values), which depends on the selected
- * {@link Mode}. Can be null.
- */
- public Arg(Mode mode,
- boolean mandatory,
- @NonNull String verb,
- @NonNull String directObject,
- @NonNull String shortName,
- @NonNull String longName,
- @NonNull String description,
- @Nullable Object defaultValue) {
- mMode = mode;
- mMandatory = mandatory;
- mVerb = verb;
- mDirectObject = directObject;
- mShortName = shortName;
- mLongName = longName;
- mDescription = description;
- mDefaultValue = defaultValue;
- mInCommandLine = false;
- if (defaultValue instanceof String[]) {
- mCurrentValue = ((String[])defaultValue)[0];
- } else {
- mCurrentValue = mDefaultValue;
- }
- }
-
- /** Return true if this argument is mandatory for this verb/directobject. */
- public boolean isMandatory() {
- return mMandatory;
- }
-
- /** Returns the 1-letter short name of the argument, e.g. -v. */
- public String getShortArg() {
- return mShortName;
- }
-
- /** Returns the long name of the argument, e.g. --verbose. */
- public String getLongArg() {
- return mLongName;
- }
-
- /** Returns the description. Never null. */
- public String getDescription() {
- return mDescription;
- }
-
- /** Returns the verb for that argument. Never null. */
- public String getVerb() {
- return mVerb;
- }
-
- /** Returns the direct Object for that argument. Never null, but can be empty string. */
- public String getDirectObject() {
- return mDirectObject;
- }
-
- /** Returns the default value. Can be null. */
- public Object getDefaultValue() {
- return mDefaultValue;
- }
-
- /** Returns the current value. Initially set to the default value. Can be null. */
- public Object getCurrentValue() {
- return mCurrentValue;
- }
-
- /** Sets the current value. Can be null. */
- public void setCurrentValue(Object currentValue) {
- mCurrentValue = currentValue;
- }
-
- /** Returns the argument mode (type + process method). Never null. */
- public Mode getMode() {
- return mMode;
- }
-
- /** Returns true if the argument has been used on the command line. */
- public boolean isInCommandLine() {
- return mInCommandLine;
- }
-
- /** Sets if the argument has been used on the command line. */
- public void setInCommandLine(boolean inCommandLine) {
- mInCommandLine = inCommandLine;
- }
- }
-
- /**
- * Internal helper to define a new argument for a give action.
- *
- * @param mode The {@link Mode} for the argument.
- * @param mandatory The argument is required (never if {@link Mode#BOOLEAN})
- * @param verb The verb name. Never null. Can be {@link CommandLineParser#GLOBAL_FLAG_VERB}.
- * @param directObject The action name. Can be {@link CommandLineParser#NO_VERB_OBJECT}.
- * @param shortName The one-letter short argument name. Can be empty but not null.
- * @param longName The long argument name. Can be empty but not null.
- * @param description The description. Cannot be null.
- * @param defaultValue The default value (or values), which depends on the selected
- * {@link Mode}.
- */
- protected void define(Mode mode,
- boolean mandatory,
- @NonNull String verb,
- @NonNull String directObject,
- @NonNull String shortName,
- @NonNull String longName,
- @NonNull String description,
- @Nullable Object defaultValue) {
- assert verb != null;
- assert(!(mandatory && mode == Mode.BOOLEAN)); // a boolean mode cannot be mandatory
-
- // We should always have at least a short or long name, ideally both but never none.
- assert shortName != null;
- assert longName != null;
- assert shortName.length() > 0 || longName.length() > 0;
-
- if (directObject == null) {
- directObject = NO_VERB_OBJECT;
- }
-
- String key = verb + '/' + directObject + '/' + longName;
- mArguments.put(key, new Arg(mode, mandatory,
- verb, directObject, shortName, longName, description, defaultValue));
- }
-
- /**
- * Exits in case of error.
- * This is protected so that it can be overridden in unit tests.
- */
- protected void exit() {
- System.exit(1);
- }
-
- /**
- * Prints a line to stdout.
- * This is protected so that it can be overridden in unit tests.
- *
- * @param format The string to be formatted. Cannot be null.
- * @param args Format arguments.
- */
- protected void stdout(String format, Object...args) {
- String output = String.format(format, args);
- output = LineUtil.reflowLine(output);
- mLog.info("%s\n", output); //$NON-NLS-1$
- }
-
- /**
- * Prints a line to stderr.
- * This is protected so that it can be overridden in unit tests.
- *
- * @param format The string to be formatted. Cannot be null.
- * @param args Format arguments.
- */
- protected void stderr(String format, Object...args) {
- mLog.error(null, format, args);
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/util/FormatUtils.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/util/FormatUtils.java
deleted file mode 100755
index fc9258c..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/util/FormatUtils.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.util;
-
-import com.android.annotations.NonNull;
-
-/**
- * Helper methods to do some format conversions.
- */
-public abstract class FormatUtils {
-
- /**
- * Converts a byte size to a human readable string,
- * for example "3 MiB", "1020 Bytes" or "1.2 GiB".
- *
- * @param size The byte size to convert.
- * @return A new non-null string, with the size expressed in either Bytes
- * or KiB or MiB or GiB.
- */
- public static @NonNull String byteSizeToString(long size) {
- String sizeStr;
-
- if (size < 1024) {
- sizeStr = String.format("%d Bytes", size);
- } else if (size < 1024 * 1024) {
- sizeStr = String.format("%d KiB", Math.round(size / 1024.0));
- } else if (size < 1024 * 1024 * 1024) {
- sizeStr = String.format("%.1f MiB",
- Math.round(10.0 * size / (1024 * 1024.0))/ 10.0);
- } else {
- sizeStr = String.format("%.1f GiB",
- Math.round(10.0 * size / (1024 * 1024 * 1024.0))/ 10.0);
- }
-
- return sizeStr;
- }
-
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/util/GrabProcessOutput.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/util/GrabProcessOutput.java
deleted file mode 100755
index 2935493..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/util/GrabProcessOutput.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.util;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-
-public class GrabProcessOutput {
-
- public enum Wait {
- /**
- * Doesn't wait for the exec to complete.
- * This still monitors the output but does not wait for the process to finish.
- * In this mode the process return code is unknown and always 0.
- */
- ASYNC,
- /**
- * This waits for the process to finish.
- * In this mode, {@link GrabProcessOutput#grabProcessOutput} returns the
- * error code from the process.
- * In some rare cases and depending on the OS, the process might not have
- * finished dumping data into stdout/stderr.
- * <p/>
- * Use this when you don't particularly care for the output but instead
- * care for the return code of the executed process.
- */
- WAIT_FOR_PROCESS,
- /**
- * This waits for the process to finish <em>and</em> for the stdout/stderr
- * threads to complete.
- * In this mode, {@link GrabProcessOutput#grabProcessOutput} returns the
- * error code from the process.
- * <p/>
- * Use this one when capturing all the output from the process is important.
- */
- WAIT_FOR_READERS,
- }
-
- public interface IProcessOutput {
- /**
- * Processes an stdout message line.
- * @param line The stdout message line. Null when the reader reached the end of stdout.
- */
- public void out(@Nullable String line);
- /**
- * Processes an stderr message line.
- * @param line The stderr message line. Null when the reader reached the end of stderr.
- */
- public void err(@Nullable String line);
- }
-
- /**
- * Get the stderr/stdout outputs of a process and return when the process is done.
- * Both <b>must</b> be read or the process will block on windows.
- *
- * @param process The process to get the ouput from.
- * @param output Optional object to capture stdout/stderr.
- * Note that on Windows capturing the output is not optional. If output is null
- * the stdout/stderr will be captured and discarded.
- * @param waitMode Whether to wait for the process and/or the readers to finish.
- * @return the process return code.
- * @throws InterruptedException if {@link Process#waitFor()} was interrupted.
- */
- public static int grabProcessOutput(
- @NonNull final Process process,
- Wait waitMode,
- @Nullable final IProcessOutput output) throws InterruptedException {
- // read the lines as they come. if null is returned, it's
- // because the process finished
- Thread threadErr = new Thread("stderr") {
- @Override
- public void run() {
- // create a buffer to read the stderr output
- InputStreamReader is = new InputStreamReader(process.getErrorStream());
- BufferedReader errReader = new BufferedReader(is);
-
- try {
- while (true) {
- String line = errReader.readLine();
- if (output != null) {
- output.err(line);
- }
- if (line == null) {
- break;
- }
- }
- } catch (IOException e) {
- // do nothing.
- }
- }
- };
-
- Thread threadOut = new Thread("stdout") {
- @Override
- public void run() {
- InputStreamReader is = new InputStreamReader(process.getInputStream());
- BufferedReader outReader = new BufferedReader(is);
-
- try {
- while (true) {
- String line = outReader.readLine();
- if (output != null) {
- output.out(line);
- }
- if (line == null) {
- break;
- }
- }
- } catch (IOException e) {
- // do nothing.
- }
- }
- };
-
- threadErr.start();
- threadOut.start();
-
- if (waitMode == Wait.ASYNC) {
- return 0;
- }
-
- // it looks like on windows process#waitFor() can return
- // before the thread have filled the arrays, so we wait for both threads and the
- // process itself.
- if (waitMode == Wait.WAIT_FOR_READERS) {
- try {
- threadErr.join();
- } catch (InterruptedException e) {
- }
- try {
- threadOut.join();
- } catch (InterruptedException e) {
- }
- }
-
- // get the return code from the process
- return process.waitFor();
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/util/LineUtil.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/util/LineUtil.java
deleted file mode 100755
index c42bd0d..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/util/LineUtil.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.util;
-
-
-public abstract class LineUtil {
-
- /**
- * Reformats a line so that it fits in 78 characters max.
- * <p/>
- * When wrapping the second line and following, prefix the string with a number of
- * spaces. This will use the first colon (:) to determine the prefix size
- * or use 4 as a minimum if there are no colons in the string.
- *
- * @param line The line to reflow. Must be non-null.
- * @return A new line to print as-is, that contains \n as needed.
- */
- public static String reflowLine(String line) {
- final int maxLen = 78;
-
- // Most of time the line will fit in the given length and this will be a no-op
- int n = line.length();
- int cr = line.indexOf('\n');
- if (n <= maxLen && (cr == -1 || cr == n - 1)) {
- return line;
- }
-
- int prefixSize = line.indexOf(':') + 1;
- // If there' some spacing after the colon, use the same when wrapping
- if (prefixSize > 0 && prefixSize < maxLen) {
- while(prefixSize < n && line.charAt(prefixSize) == ' ') {
- prefixSize++;
- }
- } else {
- prefixSize = 4;
- }
- String prefix = String.format(
- "%-" + Integer.toString(prefixSize) + "s", //$NON-NLS-1$ //$NON-NLS-2$
- " "); //$NON-NLS-1$
-
- StringBuilder output = new StringBuilder(n + prefixSize);
-
- while (n > 0) {
- cr = line.indexOf('\n');
- if (n <= maxLen && (cr == -1 || cr == n - 1)) {
- output.append(line);
- break;
- }
-
- // Line is longer than the max length, find the first character before and after
- // the whitespace where we want to break the line.
- int posNext = maxLen;
- if (cr != -1 && cr != n - 1 && cr <= posNext) {
- posNext = cr + 1;
- while (posNext < n && line.charAt(posNext) == '\n') {
- posNext++;
- }
- }
- while (posNext < n && line.charAt(posNext) == ' ') {
- posNext++;
- }
- while (posNext > 0) {
- char c = line.charAt(posNext - 1);
- if (c != ' ' && c != '\n') {
- posNext--;
- } else {
- break;
- }
- }
-
- if (posNext == 0 || (posNext >= n && maxLen < n)) {
- // We found no whitespace separator. This should generally not occur.
- posNext = maxLen;
- }
- int posPrev = posNext;
- while (posPrev > 0) {
- char c = line.charAt(posPrev - 1);
- if (c == ' ' || c == '\n') {
- posPrev--;
- } else {
- break;
- }
- }
-
- output.append(line.substring(0, posPrev)).append('\n');
- line = prefix + line.substring(posNext);
- n = line.length();
- }
-
- return output.toString();
- }
-
- /**
- * Formats the string using {@link String#format(String, Object...)}
- * and then returns the result of {@link #reflowLine(String)}.
- *
- * @param format The string format.
- * @param params The parameters for the string format.
- * @return The result of {@link #reflowLine(String)} on the formatted string.
- */
- public static String reformatLine(String format, Object...params) {
- return reflowLine(String.format(format, params));
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/util/SparseArray.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/util/SparseArray.java
deleted file mode 100644
index f0693fe..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/util/SparseArray.java
+++ /dev/null
@@ -1,401 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.util;
-
-
-/**
- * SparseArrays map integers to Objects. Unlike a normal array of Objects,
- * there can be gaps in the indices. It is intended to be more efficient
- * than using a HashMap to map Integers to Objects.
- */
-public class SparseArray<E> {
- private static final Object DELETED = new Object();
- private boolean mGarbage = false;
-
- /**
- * Creates a new SparseArray containing no mappings.
- */
- public SparseArray() {
- this(10);
- }
-
- /**
- * Creates a new SparseArray containing no mappings that will not
- * require any additional memory allocation to store the specified
- * number of mappings.
- */
- public SparseArray(int initialCapacity) {
- initialCapacity = ArrayUtils.idealIntArraySize(initialCapacity);
-
- mKeys = new int[initialCapacity];
- mValues = new Object[initialCapacity];
- mSize = 0;
- }
-
- /**
- * Gets the Object mapped from the specified key, or <code>null</code>
- * if no such mapping has been made.
- */
- public E get(int key) {
- return get(key, null);
- }
-
- /**
- * Gets the Object mapped from the specified key, or the specified Object
- * if no such mapping has been made.
- */
- @SuppressWarnings("unchecked")
- public E get(int key, E valueIfKeyNotFound) {
- int i = binarySearch(mKeys, 0, mSize, key);
-
- if (i < 0 || mValues[i] == DELETED) {
- return valueIfKeyNotFound;
- } else {
- return (E) mValues[i];
- }
- }
-
- /**
- * Removes the mapping from the specified key, if there was any.
- */
- public void delete(int key) {
- int i = binarySearch(mKeys, 0, mSize, key);
-
- if (i >= 0) {
- if (mValues[i] != DELETED) {
- mValues[i] = DELETED;
- mGarbage = true;
- }
- }
- }
-
- /**
- * Alias for {@link #delete(int)}.
- */
- public void remove(int key) {
- delete(key);
- }
-
- private void gc() {
- // Log.e("SparseArray", "gc start with " + mSize);
-
- int n = mSize;
- int o = 0;
- int[] keys = mKeys;
- Object[] values = mValues;
-
- for (int i = 0; i < n; i++) {
- Object val = values[i];
-
- if (val != DELETED) {
- if (i != o) {
- keys[o] = keys[i];
- values[o] = val;
- }
-
- o++;
- }
- }
-
- mGarbage = false;
- mSize = o;
-
- // Log.e("SparseArray", "gc end with " + mSize);
- }
-
- /**
- * Adds a mapping from the specified key to the specified value,
- * replacing the previous mapping from the specified key if there
- * was one.
- */
- public void put(int key, E value) {
- int i = binarySearch(mKeys, 0, mSize, key);
-
- if (i >= 0) {
- mValues[i] = value;
- } else {
- i = ~i;
-
- if (i < mSize && mValues[i] == DELETED) {
- mKeys[i] = key;
- mValues[i] = value;
- return;
- }
-
- if (mGarbage && mSize >= mKeys.length) {
- gc();
-
- // Search again because indices may have changed.
- i = ~binarySearch(mKeys, 0, mSize, key);
- }
-
- if (mSize >= mKeys.length) {
- int n = ArrayUtils.idealIntArraySize(mSize + 1);
-
- int[] nkeys = new int[n];
- Object[] nvalues = new Object[n];
-
- // Log.e("SparseArray", "grow " + mKeys.length + " to " + n);
- System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length);
- System.arraycopy(mValues, 0, nvalues, 0, mValues.length);
-
- mKeys = nkeys;
- mValues = nvalues;
- }
-
- if (mSize - i != 0) {
- // Log.e("SparseArray", "move " + (mSize - i));
- System.arraycopy(mKeys, i, mKeys, i + 1, mSize - i);
- System.arraycopy(mValues, i, mValues, i + 1, mSize - i);
- }
-
- mKeys[i] = key;
- mValues[i] = value;
- mSize++;
- }
- }
-
- /**
- * Returns the number of key-value mappings that this SparseArray
- * currently stores.
- */
- public int size() {
- if (mGarbage) {
- gc();
- }
-
- return mSize;
- }
-
- /**
- * Given an index in the range <code>0...size()-1</code>, returns
- * the key from the <code>index</code>th key-value mapping that this
- * SparseArray stores.
- */
- public int keyAt(int index) {
- if (mGarbage) {
- gc();
- }
-
- return mKeys[index];
- }
-
- /**
- * Given an index in the range <code>0...size()-1</code>, returns
- * the value from the <code>index</code>th key-value mapping that this
- * SparseArray stores.
- */
- @SuppressWarnings("unchecked")
- public E valueAt(int index) {
- if (mGarbage) {
- gc();
- }
-
- return (E) mValues[index];
- }
-
- /**
- * Given an index in the range <code>0...size()-1</code>, sets a new
- * value for the <code>index</code>th key-value mapping that this
- * SparseArray stores.
- */
- public void setValueAt(int index, E value) {
- if (mGarbage) {
- gc();
- }
-
- mValues[index] = value;
- }
-
- /**
- * Returns the index for which {@link #keyAt} would return the
- * specified key, or a negative number if the specified
- * key is not mapped.
- */
- public int indexOfKey(int key) {
- if (mGarbage) {
- gc();
- }
-
- return binarySearch(mKeys, 0, mSize, key);
- }
-
- /**
- * Returns an index for which {@link #valueAt} would return the
- * specified key, or a negative number if no keys map to the
- * specified value.
- * Beware that this is a linear search, unlike lookups by key,
- * and that multiple keys can map to the same value and this will
- * find only one of them.
- */
- public int indexOfValue(E value) {
- if (mGarbage) {
- gc();
- }
-
- for (int i = 0; i < mSize; i++)
- if (mValues[i] == value)
- return i;
-
- return -1;
- }
-
- /**
- * Removes all key-value mappings from this SparseArray.
- */
- public void clear() {
- int n = mSize;
- Object[] values = mValues;
-
- for (int i = 0; i < n; i++) {
- values[i] = null;
- }
-
- mSize = 0;
- mGarbage = false;
- }
-
- /**
- * Puts a key/value pair into the array, optimizing for the case where
- * the key is greater than all existing keys in the array.
- */
- public void append(int key, E value) {
- if (mSize != 0 && key <= mKeys[mSize - 1]) {
- put(key, value);
- return;
- }
-
- if (mGarbage && mSize >= mKeys.length) {
- gc();
- }
-
- int pos = mSize;
- if (pos >= mKeys.length) {
- int n = ArrayUtils.idealIntArraySize(pos + 1);
-
- int[] nkeys = new int[n];
- Object[] nvalues = new Object[n];
-
- // Log.e("SparseArray", "grow " + mKeys.length + " to " + n);
- System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length);
- System.arraycopy(mValues, 0, nvalues, 0, mValues.length);
-
- mKeys = nkeys;
- mValues = nvalues;
- }
-
- mKeys[pos] = key;
- mValues[pos] = value;
- mSize = pos + 1;
- }
-
- public SparseArray<E> getUnmodifiable() {
- final SparseArray<E> mStorage = this;
- return new SparseArray<E>() {
-
- @Override
- public E get(int key) {
- return mStorage.get(key);
- }
-
- @Override
- public E get(int key, E valueIfKeyNotFound) {
- return mStorage.get(key, valueIfKeyNotFound);
- }
-
- @Override
- public void delete(int key) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void remove(int key) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void put(int key, E value) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int size() {
- return mStorage.size();
- }
-
- @Override
- public int keyAt(int index) {
- return mStorage.keyAt(index);
- }
-
- @Override
- public E valueAt(int index) {
- return mStorage.valueAt(index);
- }
-
- @Override
- public void setValueAt(int index, E value) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int indexOfKey(int key) {
- return mStorage.indexOfKey(key);
- }
-
- @Override
- public int indexOfValue(E value) {
- return mStorage.indexOfValue(value);
- }
-
- @Override
- public void clear() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void append(int key, E value) {
- throw new UnsupportedOperationException();
- }
-
- };
- }
-
- private static int binarySearch(int[] a, int start, int len, int key) {
- int high = start + len, low = start - 1, guess;
-
- while (high - low > 1) {
- guess = (high + low) / 2;
-
- if (a[guess] < key)
- low = guess;
- else
- high = guess;
- }
-
- if (high == start + len)
- return ~(start + len);
- else if (a[high] == key)
- return high;
- else
- return ~high;
- }
-
- private int[] mKeys;
- private Object[] mValues;
- private int mSize;
-}
diff --git a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/util/SparseIntArray.java b/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/util/SparseIntArray.java
deleted file mode 100644
index 9573566..0000000
--- a/sdkmanager/libs/sdklib/src/main/java/com/android/sdklib/util/SparseIntArray.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.util;
-
-
-/**
- * SparseIntArrays map integers to integers. Unlike a normal array of integers,
- * there can be gaps in the indices. It is intended to be more efficient
- * than using a HashMap to map Integers to Integers.
- */
-public class SparseIntArray {
- /**
- * Creates a new SparseIntArray containing no mappings.
- */
- public SparseIntArray() {
- this(10);
- }
-
- /**
- * Creates a new SparseIntArray containing no mappings that will not
- * require any additional memory allocation to store the specified
- * number of mappings.
- */
- public SparseIntArray(int initialCapacity) {
- initialCapacity = ArrayUtils.idealIntArraySize(initialCapacity);
-
- mKeys = new int[initialCapacity];
- mValues = new int[initialCapacity];
- mSize = 0;
- }
-
- /**
- * Gets the int mapped from the specified key, or <code>0</code>
- * if no such mapping has been made.
- */
- public int get(int key) {
- return get(key, 0);
- }
-
- /**
- * Gets the int mapped from the specified key, or the specified value
- * if no such mapping has been made.
- */
- public int get(int key, int valueIfKeyNotFound) {
- int i = binarySearch(mKeys, 0, mSize, key);
-
- if (i < 0) {
- return valueIfKeyNotFound;
- } else {
- return mValues[i];
- }
- }
-
- /**
- * Removes the mapping from the specified key, if there was any.
- */
- public void delete(int key) {
- int i = binarySearch(mKeys, 0, mSize, key);
-
- if (i >= 0) {
- removeAt(i);
- }
- }
-
- /**
- * Removes the mapping at the given index.
- */
- public void removeAt(int index) {
- System.arraycopy(mKeys, index + 1, mKeys, index, mSize - (index + 1));
- System.arraycopy(mValues, index + 1, mValues, index, mSize - (index + 1));
- mSize--;
- }
-
- /**
- * Adds a mapping from the specified key to the specified value,
- * replacing the previous mapping from the specified key if there
- * was one.
- */
- public void put(int key, int value) {
- int i = binarySearch(mKeys, 0, mSize, key);
-
- if (i >= 0) {
- mValues[i] = value;
- } else {
- i = ~i;
-
- if (mSize >= mKeys.length) {
- int n = ArrayUtils.idealIntArraySize(mSize + 1);
-
- int[] nkeys = new int[n];
- int[] nvalues = new int[n];
-
- // Log.e("SparseIntArray", "grow " + mKeys.length + " to " + n);
- System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length);
- System.arraycopy(mValues, 0, nvalues, 0, mValues.length);
-
- mKeys = nkeys;
- mValues = nvalues;
- }
-
- if (mSize - i != 0) {
- // Log.e("SparseIntArray", "move " + (mSize - i));
- System.arraycopy(mKeys, i, mKeys, i + 1, mSize - i);
- System.arraycopy(mValues, i, mValues, i + 1, mSize - i);
- }
-
- mKeys[i] = key;
- mValues[i] = value;
- mSize++;
- }
- }
-
- /**
- * Returns the number of key-value mappings that this SparseIntArray
- * currently stores.
- */
- public int size() {
- return mSize;
- }
-
- /**
- * Given an index in the range <code>0...size()-1</code>, returns
- * the key from the <code>index</code>th key-value mapping that this
- * SparseIntArray stores.
- */
- public int keyAt(int index) {
- return mKeys[index];
- }
-
- /**
- * Given an index in the range <code>0...size()-1</code>, returns
- * the value from the <code>index</code>th key-value mapping that this
- * SparseIntArray stores.
- */
- public int valueAt(int index) {
- return mValues[index];
- }
-
- /**
- * Returns the index for which {@link #keyAt} would return the
- * specified key, or a negative number if the specified
- * key is not mapped.
- */
- public int indexOfKey(int key) {
- return binarySearch(mKeys, 0, mSize, key);
- }
-
- /**
- * Returns an index for which {@link #valueAt} would return the
- * specified key, or a negative number if no keys map to the
- * specified value.
- * Beware that this is a linear search, unlike lookups by key,
- * and that multiple keys can map to the same value and this will
- * find only one of them.
- */
- public int indexOfValue(int value) {
- for (int i = 0; i < mSize; i++)
- if (mValues[i] == value)
- return i;
-
- return -1;
- }
-
- /**
- * Removes all key-value mappings from this SparseIntArray.
- */
- public void clear() {
- mSize = 0;
- }
-
- /**
- * Puts a key/value pair into the array, optimizing for the case where
- * the key is greater than all existing keys in the array.
- */
- public void append(int key, int value) {
- if (mSize != 0 && key <= mKeys[mSize - 1]) {
- put(key, value);
- return;
- }
-
- int pos = mSize;
- if (pos >= mKeys.length) {
- int n = ArrayUtils.idealIntArraySize(pos + 1);
-
- int[] nkeys = new int[n];
- int[] nvalues = new int[n];
-
- // Log.e("SparseIntArray", "grow " + mKeys.length + " to " + n);
- System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length);
- System.arraycopy(mValues, 0, nvalues, 0, mValues.length);
-
- mKeys = nkeys;
- mValues = nvalues;
- }
-
- mKeys[pos] = key;
- mValues[pos] = value;
- mSize = pos + 1;
- }
-
- private static int binarySearch(int[] a, int start, int len, int key) {
- int high = start + len, low = start - 1, guess;
-
- while (high - low > 1) {
- guess = (high + low) / 2;
-
- if (a[guess] < key)
- low = guess;
- else
- high = guess;
- }
-
- if (high == start + len)
- return ~(start + len);
- else if (a[high] == key)
- return high;
- else
- return ~high;
- }
-
- private int[] mKeys;
- private int[] mValues;
- private int mSize;
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/AndroidVersionTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/AndroidVersionTest.java
deleted file mode 100755
index 5270bd1..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/AndroidVersionTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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;
-
-import junit.framework.TestCase;
-
-/**
- * Unit tests for {@link AndroidVersion}.
- */
-public class AndroidVersionTest extends TestCase {
-
- public final void testAndroidVersion() {
- AndroidVersion v = new AndroidVersion(1, " CODENAME ");
- assertEquals(1, v.getApiLevel());
- assertEquals("CODENAME", v.getApiString());
- assertTrue(v.isPreview());
- assertEquals("CODENAME", v.getCodename());
- assertEquals("CODENAME".hashCode(), v.hashCode());
- assertEquals("API 1, CODENAME preview", v.toString());
-
- v = new AndroidVersion(15, "REL");
- assertEquals(15, v.getApiLevel());
- assertEquals("15", v.getApiString());
- assertFalse(v.isPreview());
- assertNull(v.getCodename());
- assertTrue(v.equals(15));
- assertEquals(15, v.hashCode());
- assertEquals("API 15", v.toString());
-
- v = new AndroidVersion(15, null);
- assertEquals(15, v.getApiLevel());
- assertEquals("15", v.getApiString());
- assertFalse(v.isPreview());
- assertNull(v.getCodename());
- assertTrue(v.equals(15));
- assertEquals(15, v.hashCode());
- assertEquals("API 15", v.toString());
-
- // An empty codename is like a null codename
- v = new AndroidVersion(15, " ");
- assertFalse(v.isPreview());
- assertNull(v.getCodename());
- assertEquals("15", v.getApiString());
-
- v = new AndroidVersion(15, "");
- assertFalse(v.isPreview());
- assertNull(v.getCodename());
- assertEquals("15", v.getApiString());
-
- assertTrue(v.isGreaterOrEqualThan(0));
- assertTrue(v.isGreaterOrEqualThan(14));
- assertTrue(v.isGreaterOrEqualThan(15));
- assertFalse(v.isGreaterOrEqualThan(16));
- assertFalse(v.isGreaterOrEqualThan(Integer.MAX_VALUE));
- }
-
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/LayoutlibVersionTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/LayoutlibVersionTest.java
deleted file mode 100755
index 0c197aa..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/LayoutlibVersionTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * 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;
-
-import com.android.sdklib.SdkManager.LayoutlibVersion;
-
-import junit.framework.TestCase;
-
-/**
- * Unit test for {@link LayoutlibVersion}.
- */
-public class LayoutlibVersionTest extends TestCase {
-
- public void testLayoutlibVersion_create() {
- LayoutlibVersion lv = new LayoutlibVersion(1, 2);
- assertEquals(1, lv.getApi());
- assertEquals(2, lv.getRevision());
- }
-
- public void testLayoutlibVersion_compare() {
- assertTrue(new LayoutlibVersion(1, 1).compareTo(new LayoutlibVersion(1, 1)) == 0);
- assertTrue(new LayoutlibVersion(1, 2).compareTo(new LayoutlibVersion(1, 1)) > 0);
- assertTrue(new LayoutlibVersion(1, 1).compareTo(new LayoutlibVersion(1, 2)) < 0);
- assertTrue(new LayoutlibVersion(2, 2).compareTo(new LayoutlibVersion(1, 3)) > 0);
-
- // the lack of an API (== 0) naturally sorts as the lowest value possible.
- assertTrue(new LayoutlibVersion(0, 1).compareTo(new LayoutlibVersion(0, 2)) < 0);
- assertTrue(new LayoutlibVersion(0, 1).compareTo(new LayoutlibVersion(1, 2)) < 0);
- assertTrue(new LayoutlibVersion(0, 3).compareTo(new LayoutlibVersion(1, 2)) < 0);
- assertTrue(new LayoutlibVersion(1, 2).compareTo(new LayoutlibVersion(0, 3)) > 0);
-
- // if we lack the revision number, we don't use it in comparison
- assertTrue(new LayoutlibVersion(2, 0).compareTo(new LayoutlibVersion(2, 2)) == 0);
- assertTrue(new LayoutlibVersion(2, 2).compareTo(new LayoutlibVersion(2, 0)) == 0);
- }
-
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/SdkManagerTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/SdkManagerTest.java
deleted file mode 100755
index 487a96a..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/SdkManagerTest.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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;
-
-
-import com.android.SdkConstants;
-import com.android.sdklib.ISystemImage.LocationType;
-import com.android.sdklib.SdkManager.LayoutlibVersion;
-
-import java.util.Arrays;
-import java.util.regex.Pattern;
-
-public class SdkManagerTest extends SdkManagerTestCase {
-
- @SuppressWarnings("deprecation")
- public void testSdkManager_LayoutlibVersion() {
- SdkManager sdkman = getSdkManager();
- IAndroidTarget t = sdkman.getTargets()[0];
-
- assertTrue(t instanceof PlatformTarget);
-
- LayoutlibVersion lv = ((PlatformTarget) t).getLayoutlibVersion();
- assertNotNull(lv);
- assertEquals(5, lv.getApi());
- assertEquals(2, lv.getRevision());
-
- assertSame(lv, sdkman.getMaxLayoutlibVersion());
- }
-
- public void testSdkManager_SystemImage() throws Exception {
- SdkManager sdkman = getSdkManager();
- assertEquals("[PlatformTarget API 0 rev 1]", Arrays.toString(sdkman.getTargets()));
- IAndroidTarget t = sdkman.getTargets()[0];
-
- // By default SdkManagerTestCase creates an SDK with one platform containing
- // a legacy armeabi system image.
- assertEquals(
- "[SystemImage ABI=armeabi, location in platform legacy='$SDK/platforms/v0_0/images']",
- cleanPath(sdkman, Arrays.toString(t.getSystemImages())));
-
- // Now add a few "platform subfolders" system images and reload the SDK.
- // This disables the "legacy" mode, which means that although the armeabi
- // target from above is present, it is no longer visible.
-
- makeSystemImageFolder(new SystemImage(
- sdkman, t, LocationType.IN_PLATFORM_SUBFOLDER, SdkConstants.ABI_ARMEABI_V7A));
- makeSystemImageFolder(new SystemImage(
- sdkman, t, LocationType.IN_PLATFORM_SUBFOLDER, SdkConstants.ABI_INTEL_ATOM));
-
- sdkman.reloadSdk(getLog());
- assertEquals("[PlatformTarget API 0 rev 1]", Arrays.toString(sdkman.getTargets()));
- t = sdkman.getTargets()[0];
-
- assertEquals(
- "[SystemImage ABI=armeabi-v7a, location in platform subfolder='$SDK/platforms/v0_0/images/armeabi-v7a', " +
- "SystemImage ABI=x86, location in platform subfolder='$SDK/platforms/v0_0/images/x86']",
- cleanPath(sdkman, Arrays.toString(t.getSystemImages())));
-
- // Now add arm + arm v7a images using the new SDK/system-images.
- // The x86 one from the platform subfolder is still visible.
- // The armeabi one from the legacy folder is overridden by the new one.
- // The armeabi-v7a one from the platform subfolder is overridden by the new one.
-
- makeSystemImageFolder(new SystemImage(
- sdkman, t, LocationType.IN_SYSTEM_IMAGE, SdkConstants.ABI_ARMEABI));
- makeSystemImageFolder(new SystemImage(
- sdkman, t, LocationType.IN_SYSTEM_IMAGE, SdkConstants.ABI_ARMEABI_V7A));
-
- sdkman.reloadSdk(getLog());
- assertEquals("[PlatformTarget API 0 rev 1]", Arrays.toString(sdkman.getTargets()));
- t = sdkman.getTargets()[0];
-
- assertEquals(
- "[SystemImage ABI=armeabi, location in system image='$SDK/system-images/android-0/armeabi', " +
- "SystemImage ABI=armeabi-v7a, location in system image='$SDK/system-images/android-0/armeabi-v7a', " +
- "SystemImage ABI=x86, location in platform subfolder='$SDK/platforms/v0_0/images/x86']",
- cleanPath(sdkman, Arrays.toString(t.getSystemImages())));
- }
-
- public void testSdkManager_SystemImage_LegacyOverride() throws Exception {
- SdkManager sdkman = getSdkManager();
- assertEquals("[PlatformTarget API 0 rev 1]", Arrays.toString(sdkman.getTargets()));
- IAndroidTarget t = sdkman.getTargets()[0];
-
- // By default SdkManagerTestCase creates an SDK with one platform containing
- // a legacy armeabi system image.
- assertEquals(
- "[SystemImage ABI=armeabi, location in platform legacy='$SDK/platforms/v0_0/images']",
- cleanPath(sdkman, Arrays.toString(t.getSystemImages())));
-
- // Now add a different ABI system image in the new system-images folder.
- // This does not hide the legacy one as long as the ABI type is different
- // (to contrast: having at least one sub-folder in the platform's legacy images folder
- // will hide the legacy system image. Whereas this does not happen with the new type.)
-
- makeSystemImageFolder(new SystemImage(
- sdkman, t, LocationType.IN_SYSTEM_IMAGE, SdkConstants.ABI_INTEL_ATOM));
-
- sdkman.reloadSdk(getLog());
- assertEquals("[PlatformTarget API 0 rev 1]", Arrays.toString(sdkman.getTargets()));
- t = sdkman.getTargets()[0];
-
- assertEquals(
- "[SystemImage ABI=armeabi, location in platform legacy='$SDK/platforms/v0_0/images', " +
- "SystemImage ABI=x86, location in system image='$SDK/system-images/android-0/x86']",
- cleanPath(sdkman, Arrays.toString(t.getSystemImages())));
-
- // Now if we have one new system-image using the same ABI type, it will override the
- // legacy one. This gives us a good path for updates.
-
- makeSystemImageFolder(new SystemImage(
- sdkman, t, LocationType.IN_SYSTEM_IMAGE, SdkConstants.ABI_ARMEABI));
-
-
- sdkman.reloadSdk(getLog());
- assertEquals("[PlatformTarget API 0 rev 1]", Arrays.toString(sdkman.getTargets()));
- t = sdkman.getTargets()[0];
-
- assertEquals(
- "[SystemImage ABI=armeabi, location in system image='$SDK/system-images/android-0/armeabi', " +
- "SystemImage ABI=x86, location in system image='$SDK/system-images/android-0/x86']",
- cleanPath(sdkman, Arrays.toString(t.getSystemImages())));
- }
-
- /**
- * Sanitizes the paths used when testing results.
- * <p/>
- * The system image text representation contains the absolute path to the SDK.
- * However the SDK path is actually a randomized location.
- * We clean it by replacing it by the constant '$SDK'.
- * Also all the Windows path separators are converted to unix-like / separators.
- */
- private String cleanPath(SdkManager sdkman, String string) {
- return string
- .replaceAll(Pattern.quote(sdkman.getLocation()), "\\$SDK") //$NON-NLS-1$
- .replace('\\', '/');
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/devices/DeviceParserTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/devices/DeviceParserTest.java
deleted file mode 100644
index f24fbda..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/devices/DeviceParserTest.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.devices;
-
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import junit.framework.TestCase;
-
-import org.xml.sax.SAXParseException;
-
-import com.android.dvlib.DeviceSchemaTest;
-import com.android.resources.Density;
-import com.android.resources.Keyboard;
-import com.android.resources.KeyboardState;
-import com.android.resources.Navigation;
-import com.android.resources.NavigationState;
-import com.android.resources.ScreenOrientation;
-import com.android.resources.ScreenRatio;
-import com.android.resources.ScreenSize;
-import com.android.resources.TouchScreen;
-import com.android.sdklib.devices.Storage.Unit;
-
-public class DeviceParserTest extends TestCase {
-
- public void testValidDevices() throws Exception {
- InputStream devicesFile = DeviceSchemaTest.class.getResourceAsStream("devices_minimal.xml");
- List<Device> devices = DeviceParser.parse(devicesFile);
- assertEquals("Parsing devices_minimal.xml produces the wrong number of devices", 1,
- devices.size());
-
- Device device = devices.get(0);
- assertEquals("Galaxy Nexus", device.getName());
- assertEquals("Samsung", device.getManufacturer());
-
- // Test Meta information
- Meta meta = device.getMeta();
- assertFalse(meta.hasIconSixtyFour());
- assertFalse(meta.hasIconSixteen());
- assertFalse(meta.hasFrame());
-
- // Test Hardware information
- Hardware hw = device.getDefaultHardware();
- Screen screen = hw.getScreen();
- assertEquals(screen.getSize(), ScreenSize.NORMAL);
- assertEquals(4.65, screen.getDiagonalLength());
- assertEquals(Density.XHIGH, screen.getPixelDensity());
- assertEquals(ScreenRatio.LONG, screen.getRatio());
- assertEquals(720, screen.getXDimension());
- assertEquals(1280, screen.getYDimension());
- assertEquals(316.0, screen.getXdpi());
- assertEquals(316.0, screen.getYdpi());
- assertEquals(Multitouch.JAZZ_HANDS, screen.getMultitouch());
- assertEquals(TouchScreen.FINGER, screen.getMechanism());
- assertEquals(ScreenType.CAPACITIVE, screen.getScreenType());
- Set<Network> networks = hw.getNetworking();
- assertTrue(networks.contains(Network.BLUETOOTH));
- assertTrue(networks.contains(Network.WIFI));
- assertTrue(networks.contains(Network.NFC));
- Set<Sensor> sensors = hw.getSensors();
- assertTrue(sensors.contains(Sensor.ACCELEROMETER));
- assertTrue(sensors.contains(Sensor.BAROMETER));
- assertTrue(sensors.contains(Sensor.GYROSCOPE));
- assertTrue(sensors.contains(Sensor.COMPASS));
- assertTrue(sensors.contains(Sensor.GPS));
- assertTrue(sensors.contains(Sensor.PROXIMITY_SENSOR));
- assertTrue(hw.hasMic());
- assertEquals(2, hw.getCameras().size());
- Camera c = hw.getCamera(CameraLocation.FRONT);
- assertTrue(c != null);
- assertEquals(c.getLocation(), CameraLocation.FRONT);
- assertFalse(c.hasFlash());
- assertTrue(c.hasAutofocus());
- c = hw.getCamera(CameraLocation.BACK);
- assertTrue(c != null);
- assertEquals(c.getLocation(), CameraLocation.BACK);
- assertTrue(c.hasFlash());
- assertTrue(c.hasAutofocus());
- assertEquals(Keyboard.NOKEY, hw.getKeyboard());
- assertEquals(Navigation.NONAV, hw.getNav());
- assertEquals(new Storage(1, Unit.GiB), hw.getRam());
- assertEquals(ButtonType.SOFT, hw.getButtonType());
- List<Storage> storage = hw.getInternalStorage();
- assertEquals(1, storage.size());
- assertEquals(new Storage(16, Unit.GiB), storage.get(0));
- storage = hw.getRemovableStorage();
- assertEquals(0, storage.size());
- assertEquals("OMAP 4460", hw.getCpu());
- assertEquals("PowerVR SGX540", hw.getGpu());
- Set<Abi> abis = hw.getSupportedAbis();
- assertEquals(2, abis.size());
- assertTrue(abis.contains(Abi.ARMEABI));
- assertTrue(abis.contains(Abi.ARMEABI_V7A));
- assertEquals(0, hw.getSupportedUiModes().size());
- assertEquals(PowerType.BATTERY, hw.getChargeType());
-
- // Test Software
- assertEquals(1, device.getAllSoftware().size());
- Software sw = device.getSoftware(15);
- assertEquals(15, sw.getMaxSdkLevel());
- assertEquals(15, sw.getMinSdkLevel());
- assertTrue(sw.hasLiveWallpaperSupport());
- assertEquals(12, sw.getBluetoothProfiles().size());
- assertTrue(sw.getBluetoothProfiles().contains(BluetoothProfile.A2DP));
- assertEquals("2.0", sw.getGlVersion());
- assertEquals(29, sw.getGlExtensions().size());
- assertTrue(sw.getGlExtensions().contains("GL_OES_depth24"));
-
- // Test States
- assertEquals(2, device.getAllStates().size());
- State s = device.getDefaultState();
- assertEquals("Portrait", s.getName());
- assertTrue(s.isDefaultState());
- assertEquals("The phone in portrait view", s.getDescription());
- assertEquals(ScreenOrientation.PORTRAIT, s.getOrientation());
- assertEquals(KeyboardState.SOFT, s.getKeyState());
- assertEquals(NavigationState.HIDDEN, s.getNavState());
- s = device.getState("Landscape");
- assertEquals("Landscape", s.getName());
- assertFalse(s.isDefaultState());
- assertEquals(ScreenOrientation.LANDSCAPE, s.getOrientation());
- }
-
- public void testApiRange() throws Exception {
- Map<String, String> replacements = new HashMap<String, String>();
- replacements.put("api-level", "1-");
- InputStream stream = DeviceSchemaTest.getReplacedStream(replacements);
- List<Device> devices = DeviceParser.parse(stream);
- assertEquals(1, devices.size());
- Device device = devices.get(0);
- assertTrue(device.getSoftware(1) != null);
- assertTrue(device.getSoftware(2) != null);
- assertTrue(device.getSoftware(0) == null);
- replacements.put("api-level", "-2");
- stream = DeviceSchemaTest.getReplacedStream(replacements);
- device = DeviceParser.parse(stream).get(0);
- assertTrue(device.getSoftware(2) != null);
- assertTrue(device.getSoftware(3) == null);
- replacements.put("api-level", "1-2");
- stream = DeviceSchemaTest.getReplacedStream(replacements);
- device = DeviceParser.parse(stream).get(0);
- assertTrue(device.getSoftware(0) == null);
- assertTrue(device.getSoftware(1) != null);
- assertTrue(device.getSoftware(2) != null);
- assertTrue(device.getSoftware(3) == null);
- replacements.put("api-level", "-");
- stream = DeviceSchemaTest.getReplacedStream(replacements);
- device = DeviceParser.parse(stream).get(0);
- assertTrue(device.getSoftware(0) != null);
- assertTrue(device.getSoftware(15) != null);
- }
-
- public void testBadNetworking() throws Exception {
- Map<String, String> replacements = new HashMap<String, String>();
- replacements.put("networking", "NFD");
- InputStream stream = DeviceSchemaTest.getReplacedStream(replacements);
- try {
- List<Device> devices = DeviceParser.parse(stream);
- assertEquals(1, devices.size());
- assertEquals(0, devices.get(0).getDefaultHardware().getNetworking().size());
- fail();
- } catch (SAXParseException e) {
- assertTrue(e.getMessage().startsWith("cvc-enumeration-valid: Value 'NFD'"));
- }
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/devices/DeviceWriterTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/devices/DeviceWriterTest.java
deleted file mode 100644
index e8053be..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/devices/DeviceWriterTest.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.devices;
-
-import com.android.dvlib.DeviceSchemaTest;
-
-import junit.framework.TestCase;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-@SuppressWarnings("javadoc")
-public class DeviceWriterTest extends TestCase {
-
- public void testWriteIsValid() throws Exception {
- InputStream devicesFile =
- DeviceSchemaTest.class.getResourceAsStream("devices.xml");
- List<Device> devices = DeviceParser.parse(devicesFile);
- assertEquals("Parsed devices contained an un expected number of devices",
- 2, devices.size());
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- DeviceWriter.writeToXml(baos, devices);
- List<Device> writtenDevices = DeviceParser.parse(
- new ByteArrayInputStream(baos.toString().getBytes()));
- assertEquals("Writing and reparsing returns a different number of devices",
- devices.size(), writtenDevices.size());
- for (int i = 0; i < devices.size(); i++){
- assertEquals(devices.get(i), writtenDevices.get(i));
- }
- }
-
- public void testLocale() throws Exception {
- Locale prevLocale = Locale.getDefault();
- try {
- Locale.setDefault(Locale.FRANCE);
- InputStream devicesFile =
- DeviceSchemaTest.class.getResourceAsStream("devices.xml");
- List<Device> devices = DeviceParser.parse(devicesFile);
- assertEquals("Parsed devices contained an un expected number of devices",
- 2, devices.size());
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- DeviceWriter.writeToXml(baos, devices);
- String xml = baos.toString();
- assertTrue(xml.contains(".00"));
- assertFalse(xml.contains(",00"));
- } finally {
- Locale.setDefault(prevLocale);
- }
- }
-
- public void testApiLowerBound() throws Exception {
- Map<String, String> replacements = new HashMap<String, String>();
- replacements.put("api-level", "1-");
- InputStream stream = DeviceSchemaTest.getReplacedStream(replacements);
- List<Device> devices = DeviceParser.parse(stream);
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- DeviceWriter.writeToXml(baos, devices);
- List<Device> writtenDevices = DeviceParser.parse(
- new ByteArrayInputStream(baos.toString().getBytes()));
- assertEquals("Writing and reparsing returns a different number of devices",
- devices.size(), writtenDevices.size());
- for (int i = 0; i < devices.size(); i++){
- assertEquals(devices.get(i), writtenDevices.get(i));
- }
- }
-
- public void testApiUpperBound() throws Exception {
- Map<String, String> replacements = new HashMap<String, String>();
- replacements.put("api-level", "-10");
- InputStream stream = DeviceSchemaTest.getReplacedStream(replacements);
- List<Device> devices = DeviceParser.parse(stream);
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- DeviceWriter.writeToXml(baos, devices);
- List<Device> writtenDevices = DeviceParser.parse(
- new ByteArrayInputStream(baos.toString().getBytes()));
- assertEquals("Writing and reparsing returns a different number of devices",
- devices.size(), writtenDevices.size());
- for (int i = 0; i < devices.size(); i++){
- assertEquals(devices.get(i), writtenDevices.get(i));
- }
- }
-
- public void testApiNeitherBound() throws Exception {
- Map<String, String> replacements = new HashMap<String, String>();
- replacements.put("api-level", "-");
- InputStream stream = DeviceSchemaTest.getReplacedStream(replacements);
- List<Device> devices = DeviceParser.parse(stream);
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- DeviceWriter.writeToXml(baos, devices);
- List<Device> writtenDevices = DeviceParser.parse(
- new ByteArrayInputStream(baos.toString().getBytes()));
- assertEquals("Writing and reparsing returns a different number of devices",
- devices.size(), writtenDevices.size());
- for (int i = 0; i < devices.size(); i++){
- assertEquals(devices.get(i), writtenDevices.get(i));
- }
- }
-
- public void testApiBothBound() throws Exception {
- Map<String, String> replacements = new HashMap<String, String>();
- replacements.put("api-level", "9-10");
- InputStream stream = DeviceSchemaTest.getReplacedStream(replacements);
- List<Device> devices = DeviceParser.parse(stream);
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- DeviceWriter.writeToXml(baos, devices);
- List<Device> writtenDevices = DeviceParser.parse(
- new ByteArrayInputStream(baos.toString().getBytes()));
- assertEquals("Writing and reparsing returns a different number of devices",
- devices.size(), writtenDevices.size());
- for (int i = 0; i < devices.size(); i++){
- assertEquals(devices.get(i), writtenDevices.get(i));
- }
- }
- public void testApiSingle() throws Exception {
- Map<String, String> replacements = new HashMap<String, String>();
- replacements.put("api-level", "10");
- InputStream stream = DeviceSchemaTest.getReplacedStream(replacements);
- List<Device> devices = DeviceParser.parse(stream);
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- DeviceWriter.writeToXml(baos, devices);
- List<Device> writtenDevices = DeviceParser.parse(
- new ByteArrayInputStream(baos.toString().getBytes()));
- assertEquals("Writing and reparsing returns a different number of devices",
- devices.size(), writtenDevices.size());
- for (int i = 0; i < devices.size(); i++){
- assertEquals(devices.get(i), writtenDevices.get(i));
- }
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/build/DebugKeyProviderTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/build/DebugKeyProviderTest.java
deleted file mode 100755
index ead66ee..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/build/DebugKeyProviderTest.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.build;
-
-import com.android.sdklib.internal.build.DebugKeyProvider.IKeyGenOutput;
-
-import java.io.File;
-import java.security.PrivateKey;
-import java.security.cert.X509Certificate;
-import java.util.Calendar;
-
-import junit.framework.TestCase;
-
-public class DebugKeyProviderTest extends TestCase {
-
- private File mTmpFile;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
-
- // We want to allocate a new tmp file but not have it actually exist
- mTmpFile = File.createTempFile(this.getClass().getSimpleName(), ".keystore");
- assertTrue(mTmpFile.delete());
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- if (mTmpFile != null) {
- if (!mTmpFile.delete()) {
- mTmpFile.deleteOnExit();
- }
- mTmpFile = null;
- }
- }
-
- public void testCreateAndCheckKey() throws Exception {
- String osPath = mTmpFile.getAbsolutePath();
-
- KeygenOutput keygenOutput = new KeygenOutput();
-
- // "now" is just slightly before the key was created
- long now = System.currentTimeMillis();
-
- DebugKeyProvider provider;
- try {
- provider = new DebugKeyProvider(osPath, null /*storeType*/, keygenOutput);
- } catch (Throwable t) {
- // In case we get any kind of exception, rewrap it to make sure we output
- // the path used.
- String msg = String.format("%1$s in %2$s\n%3$s",
- t.getClass().getSimpleName(), osPath, t.toString());
- throw new Exception(msg, t);
- }
- assertNotNull(provider);
-
- assertEquals("", keygenOutput.getOut());
- assertEquals("", keygenOutput.getErr());
-
- PrivateKey key = provider.getDebugKey();
- assertNotNull(key);
-
- X509Certificate certificate = (X509Certificate) provider.getCertificate();
- assertNotNull(certificate);
-
- // The "not-after" (a.k.a. expiration) date should be after "now"
- Calendar c = Calendar.getInstance();
- c.setTimeInMillis(now);
- assertTrue(certificate.getNotAfter().compareTo(c.getTime()) > 0);
-
- // It should be valid after 1 year from now (adjust by a second since the 'now' time
- // doesn't exactly match the creation time... 1 second should be enough.)
- c.add(Calendar.DAY_OF_YEAR, 365);
- c.add(Calendar.SECOND, -1);
- assertTrue("1 year expiration failed",
- certificate.getNotAfter().compareTo(c.getTime()) > 0);
-
- // and 30 years from now
- c.add(Calendar.DAY_OF_YEAR, 29 * 365);
- assertTrue("30 year expiration failed",
- certificate.getNotAfter().compareTo(c.getTime()) > 0);
-
- // however expiration date should be passed in 30 years + 1 hour
- c.add(Calendar.HOUR, 1);
- assertFalse("30 year and 1 hour expiration failed",
- certificate.getNotAfter().compareTo(c.getTime()) > 0);
- }
-
- private static class KeygenOutput implements IKeyGenOutput {
- private String mOut = ""; //$NON-NLS-1$
- private String mErr = ""; //$NON-NLS-1$
-
- @Override
- public void out(String message) {
- mOut += message + "\n"; //$NON-NLS-1$
- }
-
- @Override
- public void err(String message) {
- mErr += message + "\n"; //$NON-NLS-1$
- }
-
- public String getOut() {
- return mOut;
- }
-
- public String getErr() {
- return mErr;
- }
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/build/SymbolLoaderTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/build/SymbolLoaderTest.java
deleted file mode 100644
index a972dfa..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/build/SymbolLoaderTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2012 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.build;
-
-import com.android.sdklib.internal.build.SymbolLoader.SymbolEntry;
-import com.google.common.base.Charsets;
-import com.google.common.collect.Table;
-import com.google.common.io.Files;
-
-import java.io.File;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class SymbolLoaderTest extends TestCase {
- public void test() throws Exception {
- String r = "" +
- "int xml authenticator 0x7f040000\n";
- File file = File.createTempFile(getClass().getSimpleName(), "txt");
- file.deleteOnExit();
- Files.write(r, file, Charsets.UTF_8);
- SymbolLoader loader = new SymbolLoader(file);
- loader.load();
- Table<String, String, SymbolEntry> symbols = loader.getSymbols();
- assertNotNull(symbols);
- assertEquals(1, symbols.size());
- assertNotNull(symbols.get("xml", "authenticator"));
- assertEquals("0x7f040000", symbols.get("xml", "authenticator").getValue());
- }
-
- public void testStyleables() throws Exception {
- String r = "" +
- "int[] styleable LimitedSizeLinearLayout { 0x7f010000, 0x7f010001 }\n" +
- "int styleable LimitedSizeLinearLayout_max_height 1\n" +
- "int styleable LimitedSizeLinearLayout_max_width 0\n" +
- "int xml authenticator 0x7f040000\n";
- File file = File.createTempFile(getClass().getSimpleName(), "txt");
- file.deleteOnExit();
- Files.write(r, file, Charsets.UTF_8);
- SymbolLoader loader = new SymbolLoader(file);
- loader.load();
- Table<String, String, SymbolEntry> symbols = loader.getSymbols();
- assertNotNull(symbols);
- assertEquals(4, symbols.size());
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/build/SymbolWriterTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/build/SymbolWriterTest.java
deleted file mode 100644
index 9edfb66..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/build/SymbolWriterTest.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright (C) 2012 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.build;
-
-import com.android.sdklib.internal.build.SymbolLoader.SymbolEntry;
-import com.google.common.base.Charsets;
-import com.google.common.collect.Table;
-import com.google.common.io.Files;
-
-import java.io.File;
-
-import junit.framework.TestCase;
-
-@SuppressWarnings("javadoc")
-public class SymbolWriterTest extends TestCase {
- private void check(String packageName, String rText, String rJava) throws Exception {
- // Load symbols
- File file = File.createTempFile(getClass().getSimpleName(), "txt");
- file.deleteOnExit();
- Files.write(rText, file, Charsets.UTF_8);
- SymbolLoader loader = new SymbolLoader(file);
- loader.load();
- Table<String, String, SymbolEntry> symbols = loader.getSymbols();
- assertNotNull(symbols);
-
- // Write symbols
- File outFolder = Files.createTempDir();
- outFolder.mkdirs();
-
- SymbolWriter writer = new SymbolWriter(outFolder.getPath(), packageName, loader, loader);
- writer.write();
-
- String contents = Files.toString(new File(outFolder,
- packageName.replace('.', File.separatorChar) + File.separator + "R.java"),
- Charsets.UTF_8);
-
- // Ensure we wrote what was expected
- assertEquals(rJava, contents.replaceAll("\t", " "));
- }
-
- public void test1() throws Exception {
- check(
- // Package
- "test.pkg",
-
- // R.txt
- "int xml authenticator 0x7f040000\n",
-
- // R.java
- "/* AUTO-GENERATED FILE. DO NOT MODIFY.\n" +
- " *\n" +
- " * This class was automatically generated by the\n" +
- " * aapt tool from the resource data it found. It\n" +
- " * should not be modified by hand.\n" +
- " */\n" +
- "package test.pkg;\n" +
- "\n" +
- "public final class R {\n" +
- " public static final class xml {\n" +
- " public static final int authenticator = 0x7f040000;\n" +
- " }\n" +
- "}\n"
- );
- }
-
- public void test2() throws Exception {
- check(
- // Package
- "test.pkg",
-
- // R.txt
- "int drawable foobar 0x7f020000\n" +
- "int drawable ic_launcher 0x7f020001\n" +
- "int string app_name 0x7f030000\n" +
- "int string lib1 0x7f030001\n" +
- "int style AppBaseTheme 0x7f040000\n" +
- "int style AppTheme 0x7f040001\n",
-
- // R.java
- "/* AUTO-GENERATED FILE. DO NOT MODIFY.\n" +
- " *\n" +
- " * This class was automatically generated by the\n" +
- " * aapt tool from the resource data it found. It\n" +
- " * should not be modified by hand.\n" +
- " */\n" +
- "package test.pkg;\n" +
- "\n" +
- "public final class R {\n" +
- " public static final class style {\n" +
- " public static final int AppBaseTheme = 0x7f040000;\n" +
- " public static final int AppTheme = 0x7f040001;\n" +
- " }\n" +
- " public static final class string {\n" +
- " public static final int app_name = 0x7f030000;\n" +
- " public static final int lib1 = 0x7f030001;\n" +
- " }\n" +
- " public static final class drawable {\n" +
- " public static final int ic_launcher = 0x7f020001;\n" +
- " public static final int foobar = 0x7f020000;\n" +
- " }\n" +
- "}\n"
- );
- }
-
- public void testStyleables1() throws Exception {
- check(
- // Package
- "test.pkg",
-
- // R.txt
- "int[] styleable TiledView { 0x7f010000, 0x7f010001, 0x7f010002, 0x7f010003, 0x7f010004 }\n" +
- "int styleable TiledView_tileName 2\n" +
- "int styleable TiledView_tilingEnum 4\n" +
- "int styleable TiledView_tilingMode 3\n" +
- "int styleable TiledView_tilingProperty 0\n" +
- "int styleable TiledView_tilingResource 1\n",
-
- // R.java
- "/* AUTO-GENERATED FILE. DO NOT MODIFY.\n" +
- " *\n" +
- " * This class was automatically generated by the\n" +
- " * aapt tool from the resource data it found. It\n" +
- " * should not be modified by hand.\n" +
- " */\n" +
- "package test.pkg;\n" +
- "\n" +
- "public final class R {\n" +
- " public static final class styleable {\n" +
- " public static final int TiledView_tilingProperty = 0;\n" +
- " public static final int TiledView_tilingMode = 3;\n" +
- " public static final int TiledView_tilingResource = 1;\n" +
- " public static final int TiledView_tileName = 2;\n" +
- " public static final int TiledView_tilingEnum = 4;\n" +
- " public static final int[] TiledView = { 0x7f010000, 0x7f010001, 0x7f010002, 0x7f010003, 0x7f010004 };\n" +
- " }\n" +
- "}\n"
- );
- }
-
- public void testStyleables2() throws Exception {
- check(
- // Package
- "test.pkg",
-
- // R.txt
- "int[] styleable LimitedSizeLinearLayout { 0x7f010000, 0x7f010001 }\n" +
- "int styleable LimitedSizeLinearLayout_max_height 1\n" +
- "int styleable LimitedSizeLinearLayout_max_width 0\n" +
- "int xml authenticator 0x7f040000\n",
-
- // R.java
- "/* AUTO-GENERATED FILE. DO NOT MODIFY.\n" +
- " *\n" +
- " * This class was automatically generated by the\n" +
- " * aapt tool from the resource data it found. It\n" +
- " * should not be modified by hand.\n" +
- " */\n" +
- "package test.pkg;\n" +
- "\n" +
- "public final class R {\n" +
- " public static final class styleable {\n" +
- " public static final int LimitedSizeLinearLayout_max_height = 1;\n" +
- " public static final int LimitedSizeLinearLayout_max_width = 0;\n" +
- " public static final int[] LimitedSizeLinearLayout = { 0x7f010000, 0x7f010001 };\n" +
- " }\n" +
- " public static final class xml {\n" +
- " public static final int authenticator = 0x7f040000;\n" +
- " }\n" +
- "}\n"
- );
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/AddonsListFetcherTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/AddonsListFetcherTest.java
deleted file mode 100755
index f62533d..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/AddonsListFetcherTest.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright (C) 2009 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.internal.repository.AddonsListFetcher.Site;
-import com.android.sdklib.repository.SdkAddonsListConstants;
-
-import org.w3c.dom.Document;
-
-import java.io.ByteArrayInputStream;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Arrays;
-
-import junit.framework.TestCase;
-
-/**
- * Tests for {@link AddonsListFetcher}
- */
-public class AddonsListFetcherTest extends TestCase {
-
- /**
- * An internal helper class to give us visibility to the protected members we want
- * to test.
- */
- private static class MockAddonsListFetcher extends AddonsListFetcher {
-
- public Site[] _parseAddonsList(Document doc,
- String nsUri,
- String baseUrl,
- ITaskMonitor monitor) {
- return super.parseAddonsList(doc, nsUri, baseUrl, monitor);
- }
-
- public int _getXmlSchemaVersion(InputStream xml) {
- return super.getXmlSchemaVersion(xml);
- }
-
- public String _validateXml(InputStream xml,
- String url,
- int version,
- String[] outError,
- Boolean[] validatorFound) {
- return super.validateXml(xml, url, version, outError, validatorFound);
- }
-
- public Document _getDocument(InputStream xml, ITaskMonitor monitor) {
- return super.getDocument(xml, monitor);
- }
-
- }
-
- private MockAddonsListFetcher mFetcher;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
-
- mFetcher = new MockAddonsListFetcher();
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
-
- mFetcher = null;
- }
-
- /**
- * Validate we can load a valid addon schema version 1
- */
- public void testLoadSample_1() throws Exception {
- InputStream xmlStream =
- getTestResource("/com/android/sdklib/testdata/addons_list_sample_1.xml");
-
- // guess the version from the XML document
- int version = mFetcher._getXmlSchemaVersion(xmlStream);
- assertEquals(1, version);
-
- Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };
- String[] validationError = new String[] { null };
- String url = "not-a-valid-url://addons_list.xml";
-
- String uri = mFetcher._validateXml(
- xmlStream, url, version, validationError, validatorFound);
- assertEquals(Boolean.TRUE, validatorFound[0]);
- assertEquals(null, validationError[0]);
- assertEquals(SdkAddonsListConstants.getSchemaUri(1), uri);
-
- // Validation was successful, load the document
- MockMonitor monitor = new MockMonitor();
- Document doc = mFetcher._getDocument(xmlStream, monitor);
- assertNotNull(doc);
-
- // Get the sites
- Site[] result = mFetcher._parseAddonsList(doc, uri, "http://base/url/", monitor);
-
- assertEquals("", monitor.getCapturedDescriptions());
- assertEquals("", monitor.getCapturedLog());
- assertEquals("", monitor.getCapturedErrorLog());
- assertEquals("", monitor.getCapturedVerboseLog());
-
- // check the sites we found...
- // The XML file is UTF-8 so we support character sets (but the Java source file is
- // not, so we use the \\u notation to create the Unicode String)
- assertEquals(
- "[<ADDON_SITE URL='http://www.example.com/my_addons.xml' Name='My Example Add-ons.'>, " +
- "<ADDON_SITE URL='http://www.example.co.jp/addons.xml' Name='\u3042\u308A\u304C\u3068\u3046\u3054\u3056\u3044\u307E\u3059\u3002'>, " +
- "<ADDON_SITE URL='http://www.example.com/' Name='Example of directory URL.'>, " +
- "<ADDON_SITE URL='http://base/url/relative_url.xml' Name='Relative URL.'>]",
- Arrays.toString(result));
- assertEquals(4, result.length);
- }
-
- /**
- * Validate we can load a valid addon schema version 2
- */
- public void testLoadSample_2() throws Exception {
- InputStream xmlStream =
- getTestResource("/com/android/sdklib/testdata/addons_list_sample_2.xml");
-
- // guess the version from the XML document
- int version = mFetcher._getXmlSchemaVersion(xmlStream);
- assertEquals(2, version);
-
- Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };
- String[] validationError = new String[] { null };
- String url = "not-a-valid-url://addons_list.xml";
-
- String uri = mFetcher._validateXml(
- xmlStream, url, version, validationError, validatorFound);
- assertEquals(Boolean.TRUE, validatorFound[0]);
- assertEquals(null, validationError[0]);
- assertEquals(SdkAddonsListConstants.getSchemaUri(2), uri);
-
- // Validation was successful, load the document
- MockMonitor monitor = new MockMonitor();
- Document doc = mFetcher._getDocument(xmlStream, monitor);
- assertNotNull(doc);
-
- // Get the sites
- Site[] result = mFetcher._parseAddonsList(doc, uri, "http://base/url/", monitor);
-
- assertEquals("", monitor.getCapturedDescriptions());
- assertEquals("", monitor.getCapturedLog());
- assertEquals("", monitor.getCapturedErrorLog());
- assertEquals("", monitor.getCapturedVerboseLog());
-
- // check the sites we found...
- // The XML file is UTF-8 so we support character sets (but the Java source file is
- // not, so we use the \\u notation to create the Unicode String)
- assertEquals(
- "[<ADDON_SITE URL='http://www.example.com/my_addons.xml' Name='My Example Add-ons.'>, " +
- "<ADDON_SITE URL='http://www.example.co.jp/addons.xml' Name='\u3042\u308A\u304C\u3068\u3046\u3054\u3056\u3044\u307E\u3059\u3002'>, " +
- "<ADDON_SITE URL='http://www.example.com/' Name='Example of directory URL.'>, " +
- "<SYS_IMG_SITE URL='http://www.example.com/' Name='Example of sys-img URL using the default xml filename.'>, " +
- "<SYS_IMG_SITE URL='http://www.example.com/specific_file.xml' Name='Example of sys-img URL using a specific xml filename.'>, " +
- "<ADDON_SITE URL='http://base/url/relative/url.xml' Name='Relative URL.'>]",
- Arrays.toString(result));
- assertEquals(6, result.length);
- }
-
- // IMPORTANT: Each time you add a test here for a new version, you should
- // also add a test in ValidateAddonsListXmlTest.
-
- /**
- * Returns an SdkLib file resource as a {@link ByteArrayInputStream},
- * which has the advantage that we can use {@link InputStream#reset()} on it
- * at any time to read it multiple times.
- * <p/>
- * The default for getResourceAsStream() is to return a {@link FileInputStream} that
- * does not support reset(), yet we need it in the tested code.
- *
- * @throws IOException if some I/O read fails
- */
- private ByteArrayInputStream getTestResource(String filename) throws IOException {
- InputStream xmlStream = this.getClass().getResourceAsStream(filename);
-
- try {
- byte[] data = new byte[8192];
- int offset = 0;
- int n;
-
- while ((n = xmlStream.read(data, offset, data.length - offset)) != -1) {
- offset += n;
-
- if (offset == data.length) {
- byte[] newData = new byte[offset + 8192];
- System.arraycopy(data, 0, newData, 0, offset);
- data = newData;
- }
- }
-
- return new ByteArrayInputStream(data, 0, offset);
- } finally {
- if (xmlStream != null) {
- xmlStream.close();
- }
- }
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/LocalSdkParserTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/LocalSdkParserTest.java
deleted file mode 100755
index 4989ec3..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/LocalSdkParserTest.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.SdkConstants;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.ISystemImage.LocationType;
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.SdkManagerTestCase;
-import com.android.sdklib.SystemImage;
-
-import java.util.Arrays;
-
-public class LocalSdkParserTest extends SdkManagerTestCase {
-
- public void testLocalSdkParser_SystemImages() throws Exception {
- SdkManager sdkman = getSdkManager();
- LocalSdkParser parser = new LocalSdkParser();
- MockMonitor monitor = new MockMonitor();
-
- // By default SdkManagerTestCase creates an SDK with one platform containing
- // a legacy armeabi system image (this is not a separate system image package)
-
- assertEquals(
- "[Android SDK Tools, revision 0, " +
- "SDK Platform Android 0.0, API 0, revision 1, " +
- "Sources for Android SDK, API 0, revision 0]",
- Arrays.toString(parser.parseSdk(sdkman.getLocation(), sdkman, monitor)));
-
- assertEquals(
- "[SDK Platform Android 0.0, API 0, revision 1, " +
- "Sources for Android SDK, API 0, revision 0]",
- Arrays.toString(parser.parseSdk(sdkman.getLocation(),
- sdkman,
- LocalSdkParser.PARSE_PLATFORMS | LocalSdkParser.PARSE_SOURCES,
- monitor)));
-
- assertEquals(
- "[SDK Platform Android 0.0, API 0, revision 1]",
- Arrays.toString(parser.parseSdk(sdkman.getLocation(),
- sdkman,
- LocalSdkParser.PARSE_PLATFORMS,
- monitor)));
-
- assertEquals(
- "[Sources for Android SDK, API 0, revision 0]",
- Arrays.toString(parser.parseSdk(sdkman.getLocation(),
- sdkman,
- LocalSdkParser.PARSE_SOURCES,
- monitor)));
-
- assertEquals(
- "[Android SDK Tools, revision 0]",
- Arrays.toString(parser.parseSdk(sdkman.getLocation(),
- sdkman,
- LocalSdkParser.PARSE_TOOLS,
- monitor)));
-
- // Now add a few "platform subfolders" system images and reload the SDK.
- // This disables the "legacy" mode but it still doesn't create any system image package
-
- IAndroidTarget t = sdkman.getTargets()[0];
- makeSystemImageFolder(new SystemImage(
- sdkman, t, LocationType.IN_PLATFORM_SUBFOLDER, SdkConstants.ABI_ARMEABI_V7A));
- makeSystemImageFolder(new SystemImage(
- sdkman, t, LocationType.IN_PLATFORM_SUBFOLDER, SdkConstants.ABI_INTEL_ATOM));
-
- sdkman.reloadSdk(getLog());
- t = sdkman.getTargets()[0];
-
- assertEquals(
- "[Android SDK Tools, revision 0, " +
- "SDK Platform Android 0.0, API 0, revision 1, " +
- "Sources for Android SDK, API 0, revision 0]",
- Arrays.toString(parser.parseSdk(sdkman.getLocation(), sdkman, monitor)));
-
- // Now add arm + arm v7a images using the new SDK/system-images.
- // The local parser will find the 2 system image packages which are associated
- // with the PlatformTarger in the SdkManager.
-
- makeSystemImageFolder(new SystemImage(
- sdkman, t, LocationType.IN_SYSTEM_IMAGE, SdkConstants.ABI_ARMEABI));
- makeSystemImageFolder(new SystemImage(
- sdkman, t, LocationType.IN_SYSTEM_IMAGE, SdkConstants.ABI_ARMEABI_V7A));
-
- sdkman.reloadSdk(getLog());
-
- assertEquals(
- "[Android SDK Tools, revision 0, " +
- "SDK Platform Android 0.0, API 0, revision 1, " +
- "ARM EABI v7a System Image, Android API 0, revision 0, " +
- "ARM EABI System Image, Android API 0, revision 0, " +
- "Sources for Android SDK, API 0, revision 0]",
- Arrays.toString(parser.parseSdk(sdkman.getLocation(), sdkman, monitor)));
-
- // Now add an x86 image using the new SDK/system-images.
- // Now this time we do NOT reload the SdkManager instance. Instead the parser
- // will find an unused system image and load it as a "broken package".
-
- makeSystemImageFolder(new SystemImage(
- sdkman, t, LocationType.IN_SYSTEM_IMAGE, SdkConstants.ABI_INTEL_ATOM));
-
- assertEquals(
- "[Android SDK Tools, revision 0, " +
- "SDK Platform Android 0.0, API 0, revision 1, " +
- "ARM EABI v7a System Image, Android API 0, revision 0, " +
- "ARM EABI System Image, Android API 0, revision 0, " +
- "Sources for Android SDK, API 0, revision 0, " +
- "Broken Intel x86 Atom System Image, API 0]",
- Arrays.toString(parser.parseSdk(sdkman.getLocation(), sdkman, monitor)));
-
- assertEquals(
- "[Android SDK Tools, revision 0, " +
- "SDK Platform Android 0.0, API 0, revision 1, " +
- "ARM EABI v7a System Image, Android API 0, revision 0, " +
- "ARM EABI System Image, Android API 0, revision 0, " +
- "Sources for Android SDK, API 0, revision 0, " +
- "Broken Intel x86 Atom System Image, API 0]",
- Arrays.toString(parser.parseSdk(sdkman.getLocation(),
- sdkman,
- LocalSdkParser.PARSE_ALL,
- monitor)));
-
- assertEquals(
- "[SDK Platform Android 0.0, API 0, revision 1, " +
- "ARM EABI v7a System Image, Android API 0, revision 0, " +
- "ARM EABI System Image, Android API 0, revision 0, " +
- "Sources for Android SDK, API 0, revision 0, " +
- "Broken Intel x86 Atom System Image, API 0]",
- Arrays.toString(parser.parseSdk(sdkman.getLocation(),
- sdkman,
- LocalSdkParser.PARSE_PLATFORMS | // platform also loads system-images
- LocalSdkParser.PARSE_SOURCES,
- monitor)));
-
- assertEquals(
- "[Sources for Android SDK, API 0, revision 0]",
- Arrays.toString(parser.parseSdk(sdkman.getLocation(),
- sdkman,
- LocalSdkParser.PARSE_SOURCES,
- monitor)));
- }
-
-}
-
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/MockEmptySdkManager.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/MockEmptySdkManager.java
deleted file mode 100755
index be1fb29..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/MockEmptySdkManager.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.
- */
-public class MockEmptySdkManager extends SdkManager {
- public MockEmptySdkManager(String osSdkPath) {
- super(osSdkPath);
- setTargets(new IAndroidTarget[0]);
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/MockMonitor.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/MockMonitor.java
deleted file mode 100755
index 72e7d93..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/MockMonitor.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2009 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.annotations.NonNull;
-
-/**
- * Mock implementation of {@link ITaskMonitor} that simply captures
- * the output in local strings. Does not provide any UI and has no
- * support for creating sub-monitors.
- */
-public class MockMonitor implements ITaskMonitor {
-
- String mCapturedLog = ""; //$NON-NLS-1$
- String mCapturedErrorLog = ""; //$NON-NLS-1$
- String mCapturedVerboseLog = ""; //$NON-NLS-1$
- String mCapturedDescriptions = ""; //$NON-NLS-1$
-
- public String getCapturedLog() {
- return mCapturedLog;
- }
-
- public String getCapturedErrorLog() {
- return mCapturedErrorLog;
- }
-
- public String getCapturedVerboseLog() {
- return mCapturedVerboseLog;
- }
-
- public String getCapturedDescriptions() {
- return mCapturedDescriptions;
- }
-
- @Override
- public void log(String format, Object... args) {
- mCapturedLog += String.format(format, args) + "\n"; //$NON-NLS-1$
- }
-
- @Override
- public void logError(String format, Object... args) {
- mCapturedErrorLog += String.format(format, args) + "\n"; //$NON-NLS-1$
- }
-
- @Override
- public void logVerbose(String format, Object... args) {
- mCapturedVerboseLog += String.format(format, args) + "\n"; //$NON-NLS-1$
- }
-
- @Override
- public void setProgressMax(int max) {
- }
-
- @Override
- public int getProgressMax() {
- return 0;
- }
-
- @Override
- public void setDescription(String format, Object... args) {
- mCapturedDescriptions += String.format(format, args) + "\n"; //$NON-NLS-1$
- }
-
- @Override
- public boolean isCancelRequested() {
- return false;
- }
-
- @Override
- public void incProgress(int delta) {
- }
-
- @Override
- public int getProgress() {
- return 0;
- }
-
- @Override
- public boolean displayPrompt(String title, String message) {
- return false;
- }
-
- @Override
- public ITaskMonitor createSubMonitor(int tickCount) {
- return null;
- }
-
- @Override
- public void error(Throwable t, String errorFormat, Object... args) {
- }
-
- @Override
- public void info(@NonNull String msgFormat, Object... args) {
- }
-
- @Override
- public void verbose(@NonNull String msgFormat, Object... args) {
- }
-
- @Override
- public void warning(@NonNull String warningFormat, Object... args) {
- }
-
- @Override
- public UserCredentials displayLoginCredentialsPrompt(String title, String message) {
- return null;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/MockPlatformTarget.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/MockPlatformTarget.java
deleted file mode 100755
index 1d9bb7b..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/MockPlatformTarget.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.SdkConstants;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.ISystemImage;
-import com.android.sdklib.ISystemImage.LocationType;
-import com.android.sdklib.SystemImage;
-import com.android.sdklib.io.FileOp;
-
-import java.util.Map;
-
-/**
- * A mock PlatformTarget.
- * This reimplements the minimum needed from the interface for our limited testing needs.
- */
-public class MockPlatformTarget implements IAndroidTarget {
-
- private final int mApiLevel;
- private final int mRevision;
- private ISystemImage[] mSystemImages;
-
- public MockPlatformTarget(int apiLevel, int revision) {
- mApiLevel = apiLevel;
- mRevision = revision;
- }
-
- @Override
- public String getClasspathName() {
- return getName();
- }
-
- @Override
- public String getShortClasspathName() {
- return getName();
- }
-
- @Override
- public String getDefaultSkin() {
- return null;
- }
-
- @Override
- public String getDescription() {
- return getName();
- }
-
- @Override
- public String getFullName() {
- return getName();
- }
-
- @Override
- public ISystemImage[] getSystemImages() {
- if (mSystemImages == null) {
- SystemImage si = new SystemImage(
- FileOp.append(getLocation(), SdkConstants.OS_IMAGES_FOLDER),
- LocationType.IN_PLATFORM_LEGACY,
- SdkConstants.ABI_ARMEABI);
- mSystemImages = new SystemImage[] { si };
- }
- return mSystemImages;
- }
-
- @Override
- public ISystemImage getSystemImage(String abiType) {
- if (SdkConstants.ABI_ARMEABI.equals(abiType)) {
- return getSystemImages()[0];
- }
- return null;
- }
-
- @Override
- public String getLocation() {
- return "/sdk/platforms/android-" + getVersion().getApiString();
- }
-
- @Override
- public IOptionalLibrary[] getOptionalLibraries() {
- return null;
- }
-
- @Override
- public IAndroidTarget getParent() {
- return null;
- }
-
- @Override
- public String getPath(int pathId) {
- throw new UnsupportedOperationException("Implement this as needed for tests");
- }
-
- @Override
- public String[] getPlatformLibraries() {
- return null;
- }
-
- @Override
- public String getProperty(String name) {
- return null;
- }
-
- @Override
- public Integer getProperty(String name, Integer defaultValue) {
- return defaultValue;
- }
-
- @Override
- public Boolean getProperty(String name, Boolean defaultValue) {
- return defaultValue;
- }
-
- @Override
- public Map<String, String> getProperties() {
- return null;
- }
-
- @Override
- public int getRevision() {
- return mRevision;
- }
-
- @Override
- public String[] getSkins() {
- return null;
- }
-
- @Override
- public int getUsbVendorId() {
- return 0;
- }
-
- /**
- * Returns a vendor that depends on the parent *platform* API.
- * This works well in Unit Tests where we'll typically have different
- * platforms as unique identifiers.
- */
- @Override
- public String getVendor() {
- return "vendor " + Integer.toString(mApiLevel);
- }
-
- /**
- * Create a synthetic name using the target API level.
- */
- @Override
- public String getName() {
- return "platform r" + Integer.toString(mApiLevel);
- }
-
- @Override
- public AndroidVersion getVersion() {
- return new AndroidVersion(mApiLevel, null /*codename*/);
- }
-
- @Override
- public String getVersionName() {
- return String.format("android-%1$d", mApiLevel);
- }
-
- @Override
- public String hashString() {
- return getVersionName();
- }
-
- /** Returns true for a platform. */
- @Override
- public boolean isPlatform() {
- return true;
- }
-
- @Override
- public boolean canRunOn(IAndroidTarget target) {
- throw new UnsupportedOperationException("Implement this as needed for tests");
- }
-
- @Override
- public int compareTo(IAndroidTarget o) {
- throw new UnsupportedOperationException("Implement this as needed for tests");
- }
-
- @Override
- public boolean hasRenderingLibrary() {
- return false;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/SdkStatsTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/SdkStatsTest.java
deleted file mode 100755
index baff6f9..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/SdkStatsTest.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (C) 2012 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.internal.repository.SdkStats.PlatformStat;
-import com.android.sdklib.repository.SdkStatsConstants;
-import com.android.sdklib.util.SparseArray;
-
-import org.w3c.dom.Document;
-
-import java.io.ByteArrayInputStream;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Arrays;
-
-import junit.framework.TestCase;
-
-/**
- * Tests for {@link SdkStats}
- */
-public class SdkStatsTest extends TestCase {
-
- /**
- * An internal helper class to give us visibility to the protected members we want
- * to test.
- */
- private static class MockSdkStats extends SdkStats {
-
- public SparseArray<PlatformStat> _parseStatsDocument(Document doc,
- String nsUri,
- ITaskMonitor monitor) {
- return super.parseStatsDocument(doc, nsUri, monitor);
- }
-
- public int _getXmlSchemaVersion(InputStream xml) {
- return super.getXmlSchemaVersion(xml);
- }
-
- public String _validateXml(InputStream xml, String url, int version,
- String[] outError, Boolean[] validatorFound) {
- return super.validateXml(xml, url, version, outError, validatorFound);
- }
-
- public Document _getDocument(InputStream xml, ITaskMonitor monitor) {
- return super.getDocument(xml, monitor);
- }
-
- }
-
- private MockSdkStats mStats;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
-
- mStats = new MockSdkStats();
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
-
- mStats = null;
- }
-
- /**
- * Validate we can still load a valid addon schema version 1
- */
- public void testLoadSample_1() throws Exception {
- InputStream xmlStream =
- getTestResource("/com/android/sdklib/testdata/stats_sample_1.xml");
-
- // guess the version from the XML document
- int version = mStats._getXmlSchemaVersion(xmlStream);
- assertEquals(1, version);
-
- Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };
- String[] validationError = new String[] { null };
- String url = "not-a-valid-url://stats.xml";
-
- String uri = mStats._validateXml(
- xmlStream, url, version, validationError, validatorFound);
- assertEquals(Boolean.TRUE, validatorFound[0]);
- assertEquals(null, validationError[0]);
- assertEquals(SdkStatsConstants.getSchemaUri(1), uri);
-
- // Validation was successful, load the document
- MockMonitor monitor = new MockMonitor();
- Document doc = mStats._getDocument(xmlStream, monitor);
- assertNotNull(doc);
-
- // Get the sites
- SparseArray<PlatformStat> result = mStats._parseStatsDocument(doc, uri, monitor);
-
- assertEquals("", monitor.getCapturedDescriptions());
- assertEquals("", monitor.getCapturedLog());
- assertEquals("", monitor.getCapturedErrorLog());
- assertEquals("", monitor.getCapturedVerboseLog());
-
- // check what we found
- assertEquals(3, result.size());
- int len = result.size();
-
- int[] keys = new int[len];
- PlatformStat[] stats = new PlatformStat[len];
- for (int i = 0; i < len; i++) {
- keys[i] = result.keyAt(i);
- stats[i] = result.valueAt(i);
- }
-
- assertEquals(
- "[3, 5, 42]",
- Arrays.toString(keys));
-
- assertEquals(
- "[<Stat api=3, code=Vanilla, vers=Android 0.5, share=0.1%, accum=100.0%>, " +
- "<Stat api=5, code=Coffee, vers=Android 42.0, share=25.8%, accum=99.9%>, " +
- "<Stat api=42, code=Chocolate, vers=Android 32.64, share=74.1%, accum=74.1%>]",
- Arrays.toString(stats));
- }
-
- /**
- * Returns an SdkLib file resource as a {@link ByteArrayInputStream},
- * which has the advantage that we can use {@link InputStream#reset()} on it
- * at any time to read it multiple times.
- * <p/>
- * The default for getResourceAsStream() is to return a {@link FileInputStream} that
- * does not support reset(), yet we need it in the tested code.
- *
- * @throws IOException if some I/O read fails
- */
- private ByteArrayInputStream getTestResource(String filename) throws IOException {
- InputStream xmlStream = this.getClass().getResourceAsStream(filename);
-
- try {
- byte[] data = new byte[8192];
- int offset = 0;
- int n;
-
- while ((n = xmlStream.read(data, offset, data.length - offset)) != -1) {
- offset += n;
-
- if (offset == data.length) {
- byte[] newData = new byte[offset + 8192];
- System.arraycopy(data, 0, newData, 0, offset);
- data = newData;
- }
- }
-
- return new ByteArrayInputStream(data, 0, offset);
- } finally {
- if (xmlStream != null) {
- xmlStream.close();
- }
- }
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/archives/ArchiveInstallerTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/archives/ArchiveInstallerTest.java
deleted file mode 100755
index b0b3f03..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/archives/ArchiveInstallerTest.java
+++ /dev/null
@@ -1,414 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.archives;
-
-import com.android.sdklib.internal.repository.DownloadCache;
-import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.MockEmptySdkManager;
-import com.android.sdklib.internal.repository.MockMonitor;
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.packages.ExtraPackage;
-import com.android.sdklib.internal.repository.packages.MockEmptyPackage;
-import com.android.sdklib.internal.repository.packages.MockExtraPackage;
-import com.android.sdklib.internal.repository.sources.SdkRepoSource;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.io.IFileOp;
-import com.android.sdklib.io.MockFileOp;
-import com.android.sdklib.repository.PkgProps;
-import com.android.utils.Pair;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-import java.util.regex.Pattern;
-
-import junit.framework.TestCase;
-
-/**
- * Unit tests for {@link ArchiveInstaller}.
- */
-public class ArchiveInstallerTest extends TestCase {
-
- private MockMonitor mMon;
- private String mSdkRoot;
- private MockFileOp mFile;
- private MockArchiveInstaller mArchInst;
- private MockEmptySdkManager mSdkMan;
-
- private class MockArchiveInstaller extends ArchiveInstaller {
-
- private Map<Archive, File> mDownloadMap = new HashMap<Archive, File>();
-
- public MockArchiveInstaller(IFileOp fileUtils) {
- super(fileUtils);
- }
-
- public void setDownloadResponse(Archive archive, File response) {
- mDownloadMap.put(archive, response);
- }
-
- @Override
- protected Pair<File, File> downloadFile(
- Archive archive,
- String osSdkRoot,
- DownloadCache cache,
- ITaskMonitor monitor,
- boolean forceHttp) {
- File file = mDownloadMap.get(archive);
- // register the file as "created"
- ArchiveInstallerTest.this.mFile.recordExistingFile(file);
- return Pair.of(file, null);
- }
-
- @Override
- protected boolean unzipFolder(
- ArchiveReplacement archiveInfo,
- File archiveFile,
- File unzipDestFolder,
- ITaskMonitor monitor) {
- // Claim the unzip works if the input archiveFile is one we know about
- // and the destination actually exists.
-
- if (getFileOp().isDirectory(unzipDestFolder) &&
- mDownloadMap.values().contains(archiveFile)) {
- return true;
- }
-
- return false;
- }
-
- }
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- mFile = new MockFileOp();
- mArchInst = new MockArchiveInstaller(mFile);
- mSdkRoot = "/sdk";
- mSdkMan = new MockEmptySdkManager(mSdkRoot);
- mMon = new MockMonitor();
- }
-
- // ----
-
- /** Test we don't try to install a local archive. */
- public void testInstall_SkipLocalArchive() throws Exception {
- MockEmptyPackage p = new MockEmptyPackage("testPkg");
- ArchiveReplacement ar = new ArchiveReplacement(p.getArchives()[0], null /*replaced*/);
-
- assertFalse(mArchInst.install(ar, mSdkRoot, false /*forceHttp*/, mSdkMan,
- null /*UrlCache*/, mMon));
- assertTrue(mMon.getCapturedLog().indexOf("Skipping already installed archive") != -1);
- }
-
- /** Test we can install a simple new archive. */
- public void testInstall_NewArchive() throws Exception {
- SdkSource src1 = new SdkRepoSource("http://repo.example.com/url", "repo1");
- MockEmptyPackage p = createRemoteEmptyPackage(src1, "testPkg");
- ArchiveReplacement ar = new ArchiveReplacement(p.getArchives()[0], null /*replaced*/);
-
- // associate the File that will be "downloaded" for this archive
- mArchInst.setDownloadResponse(
- p.getArchives()[0], createFile("/sdk", "tmp", "download1.zip"));
-
- assertTrue(mArchInst.install(ar, mSdkRoot, false /*forceHttp*/, mSdkMan,
- null /*UrlCache*/, mMon));
-
- // check what was created
- assertEquals(
- "[/sdk/mock/testPkg/source.properties]",
- Arrays.toString(mFile.getExistingFiles()));
-
- assertEquals(
- "[/, /sdk, /sdk/mock, /sdk/mock/testPkg]",
- Arrays.toString(mFile.getExistingFolders()));
-
- assertEquals(
- "[</sdk/mock/testPkg/source.properties: '### Android Tool: Source of this archive.\n" +
- "#...date...\n" +
- "Archive.Os=ANY\n" +
- "Pkg.Revision=0\n" +
- "Archive.Arch=ANY\n" +
- "Pkg.SourceUrl=http\\://repo.example.com/url\n" +
- "'>]",
- stripDate(Arrays.toString(mFile.getOutputStreams())));
-
- assertEquals(
- "Installing 'testPkg'\n" +
- "Installed 'testPkg'\n",
- mMon.getCapturedLog());
- }
-
- /** Test we can replace and rename an Extra package. */
- public void testInstall_InstallExtraArchive() throws Exception {
- SdkSource src1 = new SdkRepoSource("http://repo.example.com/url", "repo1");
-
- MockExtraPackage newPkg = createRemoteExtraPackage(src1, "vendor1", "oldPath", 2, 1);
- MockExtraPackage oldPkg = new MockExtraPackage(src1, "vendor1", "oldPath", 1, 1);
-
- // old pkg is installed, so its directory & files exists
- mFile.recordExistingFile("/sdk/extras/vendor1/oldPath/source.properties");
- mFile.recordExistingFolder("/sdk/extras/vendor1/oldPath");
-
- ArchiveReplacement ar = new ArchiveReplacement(
- newPkg.getArchives()[0],
- oldPkg.getArchives()[0]);
-
- // associate the File that will be "downloaded" for this archive
- mArchInst.setDownloadResponse(
- newPkg.getArchives()[0], createFile("/sdk", "tmp", "download1.zip"));
-
- assertTrue(mArchInst.install(ar, mSdkRoot, false /*forceHttp*/, mSdkMan,
- null /*UrlCache*/, mMon));
-
- // check what was created
- assertEquals(
- "[/sdk/extras/vendor1/oldPath/source.properties]",
- Arrays.toString(mFile.getExistingFiles()));
-
- // This created the /sdk/temp folder to put the oldPath package whilst we unzipped
- // the new one. The oldPath dir was then cleaned up but we still leave the root
- // temp dir around.
- assertEquals(
- "[/, /sdk, /sdk/extras, /sdk/extras/vendor1, /sdk/extras/vendor1/oldPath, /sdk/temp]",
- Arrays.toString(mFile.getExistingFolders()));
-
- assertEquals(
- (
- "[</sdk/extras/vendor1/oldPath/source.properties: " +
- "'### Android Tool: Source of this archive.\n" +
- "#...date...\n" +
- "Extra.VendorDisplay=vendor1\n" +
- "Pkg.Desc=desc\n" +
- "Extra.Path=oldPath\n" +
- "Archive.Arch=ANY\n" +
- "Pkg.DescUrl=url\n" +
- "Extra.NameDisplay=Vendor1 OldPath\n" +
- "Archive.Os=ANY\n" +
- "Pkg.SourceUrl=http\\://repo.example.com/url\n" +
- "Pkg.Revision=2\n" +
- "Extra.VendorId=vendor1\n" +
- "'>]"),
- stripDate(Arrays.toString(mFile.getOutputStreams())));
-
- assertEquals(
- "Installing Vendor1 OldPath, revision 2\n" +
- "Installed Vendor1 OldPath, revision 2\n",
- mMon.getCapturedLog());
- }
-
- /** Test we can replace and rename an Extra package. */
- public void testInstall_InstallRenamedExtraArchive() throws Exception {
- SdkSource src1 = new SdkRepoSource("http://repo.example.com/url", "repo1");
-
- MockExtraPackage newPkg = createRemoteExtraPackage(
- src1,
- "vendor1",
- "newPath",
- "oldPath",
- 2, // revision
- 1); // min_platform_tools_rev
- ExtraPackage oldPkg = (ExtraPackage) ExtraPackage.create(
- src1, // source
- null, // props
- "vendor1", // vendor
- "oldPath", // path
- 1, // revision
- null, // license
- null, // description
- null, // descUrl
- Os.ANY, // archiveOs
- Arch.ANY, // archiveArch
- "/sdk/extras/vendor1/oldPath" // archiveOsPath
- );
-
- // old pkg is installed, so its directory & files exists
- mFile.recordExistingFile("/sdk/extras/vendor1/oldPath/source.properties");
- mFile.recordExistingFolder("/sdk/extras/vendor1/oldPath");
-
- ArchiveReplacement ar = new ArchiveReplacement(
- newPkg.getArchives()[0],
- oldPkg.getArchives()[0]);
-
- // associate the File that will be "downloaded" for this archive
- mArchInst.setDownloadResponse(
- newPkg.getArchives()[0], createFile("/sdk", "tmp", "download1.zip"));
-
- assertTrue(mArchInst.install(ar, mSdkRoot, false /*forceHttp*/, mSdkMan,
- null /*UrlCache*/, mMon));
-
- // check what was created
- assertEquals(
- "[/sdk/extras/vendor1/newPath/source.properties]",
- Arrays.toString(mFile.getExistingFiles()));
-
- // oldPath directory has been deleted, we only have newPath now.
- // No sdk/temp dir was created since we didn't have to move the old package dir out
- // of the way.
- assertEquals(
- "[/, /sdk, /sdk/extras, /sdk/extras/vendor1, /sdk/extras/vendor1/newPath]",
- Arrays.toString(mFile.getExistingFolders()));
-
- assertEquals(
- (
- "[</sdk/extras/vendor1/newPath/source.properties: " +
- "'### Android Tool: Source of this archive.\n" +
- "#...date...\n" +
- "Extra.VendorDisplay=vendor1\n" +
- "Pkg.Desc=desc\n" +
- "Extra.OldPaths=oldPath\n" +
- "Extra.Path=newPath\n" +
- "Archive.Arch=ANY\n" +
- "Pkg.DescUrl=url\n" +
- "Extra.NameDisplay=Vendor1 NewPath\n" +
- "Archive.Os=ANY\n" +
- "Pkg.SourceUrl=http\\://repo.example.com/url\n" +
- "Pkg.Revision=2\n" +
- "Extra.VendorId=vendor1\n" +
- "'>]"),
- stripDate(Arrays.toString(mFile.getOutputStreams())));
-
- assertEquals(
- "Installing Vendor1 NewPath, revision 2\n" +
- "Installed Vendor1 NewPath, revision 2\n",
- mMon.getCapturedLog());
- }
-
- // ----
-
- /**
- * Helper creator method to create a {@link MockEmptyPackage} with no local
- * archive associated.
- */
- private static MockEmptyPackage createRemoteEmptyPackage(SdkSource source, String testHandle) {
- return new MockEmptyPackage(source, testHandle, 0 /*revision*/) {
- @Override
- protected Archive[] initializeArchives(
- Properties props,
- Os archiveOs,
- Arch archiveArch,
- String archiveOsPath) {
- // Create one remote archive for this package
- return new Archive[] {
- new Archive(
- this,
- Os.ANY,
- Arch.ANY,
- "http://some.source/some_url",
- 1234, // size
- "abcdef") // sha1
- };
- }
- };
- }
-
- /**
- * Helper creator method to create a {@link MockExtraPackage} with no local
- * archive associated.
- */
- private static MockExtraPackage createRemoteExtraPackage(
- SdkSource source,
- String vendor,
- String path,
- int revision,
- int min_platform_tools_rev) {
- return new MockExtraPackage(source, vendor, path, revision, min_platform_tools_rev) {
- @Override
- protected Archive[] initializeArchives(
- Properties props,
- Os archiveOs,
- Arch archiveArch,
- String archiveOsPath) {
- // Create one remote archive for this package
- return new Archive[] {
- new Archive(
- this,
- Os.ANY,
- Arch.ANY,
- "http://some.source/some_url",
- 1234, // size
- "abcdef") // sha1
- };
- }
- };
- }
-
- /**
- * Helper creator method to create a {@link MockExtraPackage} with no local
- * archive associated and a specific oldPaths attribute.
- */
- private static MockExtraPackage createRemoteExtraPackage(
- SdkSource source,
- String vendor,
- String newPath,
- String oldPaths,
- int revision,
- int min_platform_tools_rev) {
- Properties props = new Properties();
- props.setProperty(PkgProps.EXTRA_OLD_PATHS, oldPaths);
- props.setProperty(PkgProps.MIN_PLATFORM_TOOLS_REV,
- Integer.toString((min_platform_tools_rev)));
- return new MockExtraPackage(source, props, vendor, newPath, revision) {
- @Override
- protected Archive[] initializeArchives(
- Properties props2,
- Os archiveOs,
- Arch archiveArch,
- String archiveOsPath) {
- // Create one remote archive for this package
- return new Archive[] {
- new Archive(
- this,
- Os.ANY,
- Arch.ANY,
- "http://some.source/some_url",
- 1234, // size
- "abcdef") // sha1
- };
- }
- };
- }
-
- private File createFile(String...segments) {
- File f = null;
- for (String segment : segments) {
- if (f == null) {
- f = new File(segment);
- } else {
- f = new File(f, segment);
- }
- }
-
- return f;
- }
-
- /**
- * Strips the second line of the string.
- * The source.properties generated by Java contain the generation data on the
- * second line and this is of course not suitable for unit tests.
- */
- private String stripDate(String string) {
- // We know it's a date if it looks like:
- // \n # ... YYYY\n
- Pattern p = Pattern.compile("\n#[^#][^\n]*[0-9]{4}\\w*\n", Pattern.DOTALL);
- string = p.matcher(string.replaceAll("\r\n", "\n")).replaceAll("\n#...date...\n");
- return string;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/archives/ArchiveTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/archives/ArchiveTest.java
deleted file mode 100755
index c0ae718..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/archives/ArchiveTest.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.archives;
-
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-
-import junit.framework.TestCase;
-
-public class ArchiveTest extends TestCase {
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- public void testShortDescription() throws Exception {
- Archive a = new Archive(
- null, //pkg,
- Os.WINDOWS, //os
- Arch.ANY, //arch,
- null, //url
- 0, //size
- null); //checksum
- assertEquals("Archive for Windows", a.getShortDescription());
-
- a = new Archive(
- null, //pkg,
- Os.LINUX, //os
- Arch.ANY, //arch,
- null, //url
- 0, //size
- null); //checksum
- assertEquals("Archive for Linux", a.getShortDescription());
-
- a = new Archive(
- null, //pkg,
- Os.MACOSX, //os
- Arch.ANY, //arch,
- null, //url
- 0, //size
- null); //checksum
- assertEquals("Archive for MacOS X", a.getShortDescription());
-
- a = new Archive(
- null, //pkg,
- Os.ANY, //os
- Arch.ANY, //arch,
- null, //url
- 0, //size
- null); //checksum
- assertEquals("Archive for any OS", a.getShortDescription());
- }
-
- public void testLongDescription() throws Exception {
- Archive a = new Archive(
- null, //pkg,
- Os.WINDOWS, //os
- Arch.ANY, //arch,
- null, //url
- 900, //size
- "1234567890ABCDEF"); //checksum
- assertEquals(
- "Archive for Windows\n" +
- "Size: 900 Bytes\n" +
- "SHA1: 1234567890ABCDEF",
- a.getLongDescription());
-
- a = new Archive(null, Os.WINDOWS, Arch.ANY, null, 1100, "1234567890ABCDEF");
- assertEquals(
- "Archive for Windows\n" +
- "Size: 1 KiB\n" +
- "SHA1: 1234567890ABCDEF",
- a.getLongDescription());
-
- a = new Archive(null, Os.WINDOWS, Arch.ANY, null, 1900, "1234567890ABCDEF");
- assertEquals(
- "Archive for Windows\n" +
- "Size: 2 KiB\n" +
- "SHA1: 1234567890ABCDEF",
- a.getLongDescription());
-
- a = new Archive(null, Os.WINDOWS, Arch.ANY, null, (long)2e6, "1234567890ABCDEF");
- assertEquals(
- "Archive for Windows\n" +
- "Size: 1.9 MiB\n" +
- "SHA1: 1234567890ABCDEF",
- a.getLongDescription());
-
- a = new Archive(null, Os.WINDOWS, Arch.ANY, null, (long)19e6, "1234567890ABCDEF");
- assertEquals(
- "Archive for Windows\n" +
- "Size: 18.1 MiB\n" +
- "SHA1: 1234567890ABCDEF",
- a.getLongDescription());
-
- a = new Archive(null, Os.WINDOWS, Arch.ANY, null, (long)18e9, "1234567890ABCDEF");
- assertEquals(
- "Archive for Windows\n" +
- "Size: 16.8 GiB\n" +
- "SHA1: 1234567890ABCDEF",
- a.getLongDescription());
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/BrokenPackageTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/BrokenPackageTest.java
deleted file mode 100755
index 92a04c4..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/BrokenPackageTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.internal.repository.packages.BrokenPackage;
-
-import junit.framework.TestCase;
-
-public class BrokenPackageTest extends TestCase {
-
- private BrokenPackage m;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
-
- m = new BrokenPackage(null /*props*/,
- "short description",
- "long description",
- 12, // min api level
- 13, // exact api level
- "os/path");
-
- }
-
- public final void testGetShortDescription() {
- assertEquals("short description", m.getShortDescription());
- }
-
- public final void testGetLongDescription() {
- assertEquals("long description", m.getLongDescription());
- }
-
- public final void testGetMinApiLevel() {
- assertEquals(12, m.getMinApiLevel());
- }
-
- public final void testGetExactApiLevel() {
- assertEquals(13, m.getExactApiLevel());
- }
-
- public void testInstallId() {
- assertEquals("", m.installId());
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/ExtraPackageTest_v3.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/ExtraPackageTest_v3.java
deleted file mode 100755
index 6102f13..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/ExtraPackageTest_v3.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.packages.ExtraPackage;
-import com.android.sdklib.repository.PkgProps;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.Properties;
-
-/**
- * Tests {@link ExtraPackage} using anddon-3.xsd: it has a {@code <path>} and {@code <vendor>}.
- * (it lacks name-display, vendor-id and vendor-display with are in addon-4.xsd)
- */
-public class ExtraPackageTest_v3 extends MinToolsPackageTest {
-
- private static final char PS = File.pathSeparatorChar;
-
- private ExtraPackage createExtraPackage(Properties props) {
- ExtraPackage p = (ExtraPackage) ExtraPackage.create(
- null, //source
- props,
- null, //vendor
- null, //path
- -1, //revision
- null, //license
- null, //description
- null, //descUrl
- Os.ANY, //archiveOs
- Arch.ANY, //archiveArch
- "/local/archive/path" //archiveOsPath
- );
- return p;
- }
-
- /** Properties used to "load" the package. When saved, they become different. */
- private Properties createLoadedProps() {
- Properties props = super.createProps();
-
- // ExtraPackage properties
- props.setProperty(PkgProps.EXTRA_VENDOR, "vendor");
- props.setProperty(PkgProps.EXTRA_PATH, "the_path");
- props.setProperty(PkgProps.EXTRA_OLD_PATHS, "old_path1;oldpath2");
- props.setProperty(PkgProps.EXTRA_MIN_API_LEVEL, "11");
- props.setProperty(PkgProps.EXTRA_PROJECT_FILES,
- "path1.jar" + PS + "dir2/jar 2.jar" + PS + "dir/3/path");
-
- return props;
- }
-
- /** Properties saved by the package. They differ from loaded ones in name and vendor. */
- private Properties createSavedProps() {
- Properties props = super.createProps();
-
- // ExtraPackage properties
- props.setProperty(PkgProps.EXTRA_VENDOR_ID, "vendor");
- props.setProperty(PkgProps.EXTRA_VENDOR_DISPLAY, "vendor");
- props.setProperty(PkgProps.EXTRA_NAME_DISPLAY, "Vendor The Path");
- props.setProperty(PkgProps.EXTRA_PATH, "the_path");
- props.setProperty(PkgProps.EXTRA_OLD_PATHS, "old_path1;oldpath2");
- props.setProperty(PkgProps.EXTRA_MIN_API_LEVEL, "11");
- props.setProperty(PkgProps.EXTRA_PROJECT_FILES,
- "path1.jar" + PS + "dir2/jar 2.jar" + PS + "dir/3/path");
-
- return props;
- }
-
- protected void testCreatedExtraPackage(ExtraPackage p) {
- super.testCreatedPackage(p);
-
- // Package properties
- // vendor becomes both vendor-id and vendor-display
- assertEquals("vendor", p.getVendorId());
- assertEquals("vendor", p.getVendorDisplay());
- assertEquals("the_path", p.getPath());
- // path and vendor are combined in the default display name
- assertEquals("Vendor The Path", p.getDisplayName());
- assertEquals("[old_path1, oldpath2]", Arrays.toString(p.getOldPaths()));
- assertEquals(11, p.getMinApiLevel());
- assertEquals(
- "[path1.jar, dir2/jar 2.jar, dir/3/path]",
- Arrays.toString(p.getProjectFiles()));
- }
-
- // ----
-
- @Override
- public final void testCreate() {
- Properties props = createLoadedProps();
- ExtraPackage p = createExtraPackage(props);
-
- testCreatedExtraPackage(p);
- }
-
- @Override
- public void testSaveProperties() {
- Properties props = createLoadedProps();
- ExtraPackage p = createExtraPackage(props);
-
- Properties props2 = new Properties();
- p.saveProperties(props2);
-
- assertEquals(props2, createSavedProps());
- }
-
- public void testSameItemAs() {
- Properties props1 = createLoadedProps();
- ExtraPackage p1 = createExtraPackage(props1);
- assertTrue(p1.sameItemAs(p1));
-
- // different vendor, same path
- Properties props2 = new Properties(props1);
- props2.setProperty(PkgProps.EXTRA_VENDOR, "vendor2");
- ExtraPackage p2 = createExtraPackage(props2);
- assertFalse(p1.sameItemAs(p2));
- assertFalse(p2.sameItemAs(p1));
-
- // different vendor, different path
- props2.setProperty(PkgProps.EXTRA_PATH, "new_path2");
- p2 = createExtraPackage(props2);
- assertFalse(p1.sameItemAs(p2));
- assertFalse(p2.sameItemAs(p1));
-
- // same vendor, but single path using the old paths from p1
- Properties props3 = new Properties(props1);
- props3.setProperty(PkgProps.EXTRA_OLD_PATHS, "");
- props3.setProperty(PkgProps.EXTRA_PATH, "old_path1");
- ExtraPackage p3 = createExtraPackage(props3);
- assertTrue(p1.sameItemAs(p3));
- assertTrue(p3.sameItemAs(p1));
-
- props3.setProperty(PkgProps.EXTRA_PATH, "oldpath2");
- p3 = createExtraPackage(props3);
- assertTrue(p1.sameItemAs(p3));
- assertTrue(p3.sameItemAs(p1));
-
- // same vendor, different old paths but there's a path=>old_path match
- Properties props4 = new Properties(props1);
- props4.setProperty(PkgProps.EXTRA_OLD_PATHS, "new_path4;new_path5");
- props4.setProperty(PkgProps.EXTRA_PATH, "old_path1");
- ExtraPackage p4 = createExtraPackage(props4);
- assertTrue(p1.sameItemAs(p4));
- assertTrue(p4.sameItemAs(p1));
-
- // same vendor, incompatible paths
- Properties props5 = new Properties(props1);
- // and the only match is between old_paths, which doesn't count.
- props5.setProperty(PkgProps.EXTRA_OLD_PATHS, "old_path1;new_path5");
- props5.setProperty(PkgProps.EXTRA_PATH, "new_path4");
- ExtraPackage p5 = createExtraPackage(props5);
- assertFalse(p1.sameItemAs(p5));
- assertFalse(p5.sameItemAs(p1));
- }
-
- public void testInstallId() {
- Properties props = createLoadedProps();
- ExtraPackage p = createExtraPackage(props);
-
- assertEquals("extra-vendor-the_path", p.installId());
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/ExtraPackageTest_v4.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/ExtraPackageTest_v4.java
deleted file mode 100755
index eff3020..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/ExtraPackageTest_v4.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.packages.ExtraPackage;
-import com.android.sdklib.repository.PkgProps;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.Properties;
-
-/**
- * Tests {@link ExtraPackage} using anddon-4.xsd:
- * it has name-display, vendor-id and vendor-display.
- */
-public class ExtraPackageTest_v4 extends MinToolsPackageTest {
-
- private static final char PS = File.pathSeparatorChar;
-
- private ExtraPackage createExtraPackage(Properties props) {
- ExtraPackage p = (ExtraPackage) ExtraPackage.create(
- null, //source
- props,
- null, //vendor
- null, //path
- -1, //revision
- null, //license
- null, //description
- null, //descUrl
- Os.ANY, //archiveOs
- Arch.ANY, //archiveArch
- "/local/archive/path" //archiveOsPath
- );
- return p;
- }
-
- @Override
- protected Properties createProps() {
- Properties props = super.createProps();
-
- // ExtraPackage properties
- props.setProperty(PkgProps.EXTRA_VENDOR_ID, "the_vendor");
- props.setProperty(PkgProps.EXTRA_VENDOR_DISPLAY, "The Company, Inc.");
- props.setProperty(PkgProps.EXTRA_NAME_DISPLAY, "Some Extra Package");
- props.setProperty(PkgProps.EXTRA_PATH, "the_path");
- props.setProperty(PkgProps.EXTRA_OLD_PATHS, "old_path1;oldpath2");
- props.setProperty(PkgProps.EXTRA_MIN_API_LEVEL, "11");
- props.setProperty(PkgProps.EXTRA_PROJECT_FILES,
- "path1.jar" + PS + "dir2/jar 2.jar" + PS + "dir/3/path");
-
- return props;
- }
-
- protected void testCreatedExtraPackage(ExtraPackage p) {
- super.testCreatedPackage(p);
-
- // Package properties
- assertEquals("the_vendor", p.getVendorId());
- assertEquals("The Company, Inc.", p.getVendorDisplay());
- assertEquals("Some Extra Package", p.getDisplayName());
- assertEquals("the_path", p.getPath());
- assertEquals("[old_path1, oldpath2]", Arrays.toString(p.getOldPaths()));
- assertEquals(11, p.getMinApiLevel());
- assertEquals(
- "[path1.jar, dir2/jar 2.jar, dir/3/path]",
- Arrays.toString(p.getProjectFiles()));
- }
-
- // ----
-
- @Override
- public final void testCreate() {
- Properties props = createProps();
- ExtraPackage p = createExtraPackage(props);
-
- testCreatedExtraPackage(p);
- }
-
- @Override
- public void testSaveProperties() {
- Properties props = createProps();
- ExtraPackage p = createExtraPackage(props);
-
- Properties props2 = new Properties();
- p.saveProperties(props2);
-
- assertEquals(props2, props);
- }
-
- public void testSameItemAs() {
- Properties props1 = createProps();
- ExtraPackage p1 = createExtraPackage(props1);
- assertTrue(p1.sameItemAs(p1));
-
- // different vendor, same path
- Properties props2 = new Properties(props1);
- props2.setProperty(PkgProps.EXTRA_VENDOR_ID, "vendor2");
- props2.setProperty(PkgProps.EXTRA_VENDOR_DISPLAY, "Another Vendor Name");
- ExtraPackage p2 = createExtraPackage(props2);
- assertFalse(p1.sameItemAs(p2));
- assertFalse(p2.sameItemAs(p1));
-
- // different vendor, different path
- props2.setProperty(PkgProps.EXTRA_PATH, "new_path2");
- p2 = createExtraPackage(props2);
- assertFalse(p1.sameItemAs(p2));
- assertFalse(p2.sameItemAs(p1));
-
- // same vendor, but single path using the old paths from p1
- Properties props3 = new Properties(props1);
- props3.setProperty(PkgProps.EXTRA_OLD_PATHS, "");
- props3.setProperty(PkgProps.EXTRA_PATH, "old_path1");
- ExtraPackage p3 = createExtraPackage(props3);
- assertTrue(p1.sameItemAs(p3));
- assertTrue(p3.sameItemAs(p1));
-
- props3.setProperty(PkgProps.EXTRA_PATH, "oldpath2");
- p3 = createExtraPackage(props3);
- assertTrue(p1.sameItemAs(p3));
- assertTrue(p3.sameItemAs(p1));
-
- // same vendor, different old paths but there's a path=>old_path match
- Properties props4 = new Properties(props1);
- props4.setProperty(PkgProps.EXTRA_OLD_PATHS, "new_path4;new_path5");
- props4.setProperty(PkgProps.EXTRA_PATH, "old_path1");
- ExtraPackage p4 = createExtraPackage(props4);
- assertTrue(p1.sameItemAs(p4));
- assertTrue(p4.sameItemAs(p1));
-
- // same vendor, incompatible paths
- Properties props5 = new Properties(props1);
- // and the only match is between old_paths, which doesn't count.
- props5.setProperty(PkgProps.EXTRA_OLD_PATHS, "old_path1;new_path5");
- props5.setProperty(PkgProps.EXTRA_PATH, "new_path4");
- ExtraPackage p5 = createExtraPackage(props5);
- assertFalse(p1.sameItemAs(p5));
- assertFalse(p5.sameItemAs(p1));
- }
-
- public void testInstallId() {
- Properties props = createProps();
- ExtraPackage p = createExtraPackage(props);
-
- assertEquals("extra-the_vendor-the_path", p.installId());
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/FullRevisionPackageTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/FullRevisionPackageTest.java
deleted file mode 100755
index 9bf2703..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/FullRevisionPackageTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.repository.PkgProps;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Properties;
-
-import junit.framework.TestCase;
-
-public class FullRevisionPackageTest extends TestCase {
-
- /**
- * Helper that creates the {@link Properties} from a {@link FullRevision}
- * as expected by {@link FullRevisionPackage}.
- */
- public static Properties createProps(FullRevision revision) {
- Properties props = new Properties();
- if (revision != null) {
- props.setProperty(PkgProps.PKG_REVISION, revision.toString());
- }
- return props;
- }
-
- public void testCompareTo() throws Exception {
- // Test order of full revision packages.
- //
- // Note that Package.compareTo() is designed to return the desired
- // ordering for a list display and as such a final/release package
- // needs to be listed before its rc/preview package.
- //
- // This differs from the order used by FullRevision.compareTo().
-
- ArrayList<Package> list = new ArrayList<Package>();
-
- list.add(new MockToolPackage(null, new FullRevision(1, 0, 0, 0), 8));
- list.add(new MockToolPackage(null, new FullRevision(1, 0, 0, 1), 8));
- list.add(new MockToolPackage(null, new FullRevision(1, 0, 1, 0), 8));
- list.add(new MockToolPackage(null, new FullRevision(1, 0, 1, 1), 8));
- list.add(new MockToolPackage(null, new FullRevision(1, 1, 0, 0), 8));
- list.add(new MockToolPackage(null, new FullRevision(1, 1, 0, 1), 8));
- list.add(new MockToolPackage(null, new FullRevision(2, 1, 1, 0), 8));
- list.add(new MockToolPackage(null, new FullRevision(2, 1, 1, 1), 8));
-
- Collections.sort(list);
-
- assertEquals(
- "[Android SDK Tools, revision 1, " +
- "Android SDK Tools, revision 1 rc1, " +
- "Android SDK Tools, revision 1.0.1, " +
- "Android SDK Tools, revision 1.0.1 rc1, " +
- "Android SDK Tools, revision 1.1, " +
- "Android SDK Tools, revision 1.1 rc1, " +
- "Android SDK Tools, revision 2.1.1, " +
- "Android SDK Tools, revision 2.1.1 rc1]",
- Arrays.toString(list.toArray()));
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/FullRevisionTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/FullRevisionTest.java
deleted file mode 100755
index 07e8186..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/FullRevisionTest.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import java.util.Arrays;
-
-import junit.framework.TestCase;
-
-public class FullRevisionTest extends TestCase {
-
- public final void testFullRevision() {
- FullRevision p = new FullRevision(5);
- assertEquals(5, p.getMajor());
- assertEquals(FullRevision.IMPLICIT_MINOR_REV, p.getMinor());
- assertEquals(FullRevision.IMPLICIT_MICRO_REV, p.getMicro());
- assertEquals(FullRevision.NOT_A_PREVIEW, p.getPreview());
- assertFalse (p.isPreview());
- assertEquals("5", p.toShortString());
- assertEquals(p, FullRevision.parseRevision("5"));
- assertEquals("5.0.0", p.toString());
- assertEquals(p, FullRevision.parseRevision("5.0.0"));
- assertEquals("[5, 0, 0]", Arrays.toString(p.toIntArray(false /*includePreview*/)));
- assertEquals("[5, 0, 0, 0]", Arrays.toString(p.toIntArray(true /*includePreview*/)));
-
- p = new FullRevision(5, 0, 0, 6);
- assertEquals(5, p.getMajor());
- assertEquals(FullRevision.IMPLICIT_MINOR_REV, p.getMinor());
- assertEquals(FullRevision.IMPLICIT_MICRO_REV, p.getMicro());
- assertEquals(6, p.getPreview());
- assertTrue (p.isPreview());
- assertEquals("5 rc6", p.toShortString());
- assertEquals(p, FullRevision.parseRevision("5 rc6"));
- assertEquals("5.0.0 rc6", p.toString());
- assertEquals(p, FullRevision.parseRevision("5.0.0 rc6"));
- assertEquals("[5, 0, 0]", Arrays.toString(p.toIntArray(false /*includePreview*/)));
- assertEquals("[5, 0, 0, 6]", Arrays.toString(p.toIntArray(true /*includePreview*/)));
-
- p = new FullRevision(6, 7, 0);
- assertEquals(6, p.getMajor());
- assertEquals(7, p.getMinor());
- assertEquals(0, p.getMicro());
- assertEquals(0, p.getPreview());
- assertFalse (p.isPreview());
- assertEquals("6.7", p.toShortString());
- assertEquals(p, FullRevision.parseRevision("6.7"));
- assertEquals("6.7.0", p.toString());
- assertEquals(p, FullRevision.parseRevision("6.7.0"));
- assertEquals("[6, 7, 0]", Arrays.toString(p.toIntArray(false /*includePreview*/)));
- assertEquals("[6, 7, 0, 0]", Arrays.toString(p.toIntArray(true /*includePreview*/)));
-
- p = new FullRevision(10, 11, 12, FullRevision.NOT_A_PREVIEW);
- assertEquals(10, p.getMajor());
- assertEquals(11, p.getMinor());
- assertEquals(12, p.getMicro());
- assertEquals(0, p.getPreview());
- assertFalse (p.isPreview());
- assertEquals("10.11.12", p.toShortString());
- assertEquals("10.11.12", p.toString());
- assertEquals(p, FullRevision.parseRevision("10.11.12"));
- assertEquals("[10, 11, 12]", Arrays.toString(p.toIntArray(false /*includePreview*/)));
- assertEquals("[10, 11, 12, 0]", Arrays.toString(p.toIntArray(true /*includePreview*/)));
-
- p = new FullRevision(10, 11, 12, 13);
- assertEquals(10, p.getMajor());
- assertEquals(11, p.getMinor());
- assertEquals(12, p.getMicro());
- assertEquals(13, p.getPreview());
- assertTrue (p.isPreview());
- assertEquals("10.11.12 rc13", p.toShortString());
- assertEquals("10.11.12 rc13", p.toString());
- assertEquals(p, FullRevision.parseRevision("10.11.12 rc13"));
- assertEquals(p, FullRevision.parseRevision(" 10.11.12 rc13"));
- assertEquals(p, FullRevision.parseRevision("10.11.12 rc13 "));
- assertEquals(p, FullRevision.parseRevision(" 10.11.12 rc13 "));
- assertEquals("[10, 11, 12]", Arrays.toString(p.toIntArray(false /*includePreview*/)));
- assertEquals("[10, 11, 12, 13]", Arrays.toString(p.toIntArray(true /*includePreview*/)));
- }
-
- public final void testParseError() {
- String errorMsg = null;
- try {
- FullRevision.parseRevision("not a number");
- fail("FullRevision.parseRevision should thrown NumberFormatException");
- } catch (NumberFormatException e) {
- errorMsg = e.getMessage();
- }
- assertEquals("Invalid full revision: not a number", errorMsg);
-
- errorMsg = null;
- try {
- FullRevision.parseRevision("5 .6 .7");
- fail("FullRevision.parseRevision should thrown NumberFormatException");
- } catch (NumberFormatException e) {
- errorMsg = e.getMessage();
- }
- assertEquals("Invalid full revision: 5 .6 .7", errorMsg);
-
- errorMsg = null;
- try {
- FullRevision.parseRevision("5.0.0 preview 1");
- fail("FullRevision.parseRevision should thrown NumberFormatException");
- } catch (NumberFormatException e) {
- errorMsg = e.getMessage();
- }
- assertEquals("Invalid full revision: 5.0.0 preview 1", errorMsg);
-
- errorMsg = null;
- try {
- FullRevision.parseRevision(" 5.1.2 rc 42 ");
- fail("FullRevision.parseRevision should thrown NumberFormatException");
- } catch (NumberFormatException e) {
- errorMsg = e.getMessage();
- }
- assertEquals("Invalid full revision: 5.1.2 rc 42 ", errorMsg);
- }
-
- public final void testCompareTo() {
- FullRevision s4 = new FullRevision(4);
- FullRevision i4 = new FullRevision(4);
- FullRevision g5 = new FullRevision(5, 1, 0, 6);
- FullRevision y5 = new FullRevision(5);
- FullRevision c5 = new FullRevision(5, 1, 0, 6);
- FullRevision o5 = new FullRevision(5, 0, 0, 7);
- FullRevision p5 = new FullRevision(5, 1, 0, 0);
-
- assertEquals(s4, i4); // 4.0.0-0 == 4.0.0-0
- assertEquals(g5, c5); // 5.1.0-6 == 5.1.0-6
-
- assertFalse(y5.equals(p5)); // 5.0.0-0 != 5.1.0-0
- assertFalse(g5.equals(p5)); // 5.1.0-6 != 5.1.0-0
- assertTrue (s4.compareTo(i4) == 0); // 4.0.0-0 == 4.0.0-0
- assertTrue (s4.compareTo(y5) < 0); // 4.0.0-0 < 5.0.0-0
- assertTrue (y5.compareTo(y5) == 0); // 5.0.0-0 == 5.0.0-0
- assertTrue (y5.compareTo(p5) < 0); // 5.0.0-0 < 5.1.0-0
- assertTrue (o5.compareTo(y5) < 0); // 5.0.0-7 < 5.0.0-0
- assertTrue (p5.compareTo(p5) == 0); // 5.1.0-0 == 5.1.0-0
- assertTrue (c5.compareTo(p5) < 0); // 5.1.0-6 < 5.1.0-0
- assertTrue (p5.compareTo(c5) > 0); // 5.1.0-0 > 5.1.0-6
- assertTrue (p5.compareTo(o5) > 0); // 5.1.0-0 > 5.0.0-7
- assertTrue (c5.compareTo(o5) > 0); // 5.1.0-6 > 5.0.0-7
- assertTrue (o5.compareTo(o5) == 0); // 5.0.0-7 > 5.0.0-7
- }
-
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MajorRevisionTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MajorRevisionTest.java
deleted file mode 100755
index b77caad..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MajorRevisionTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import junit.framework.TestCase;
-
-public class MajorRevisionTest extends TestCase {
-
- public final void testMajorRevision() {
- MajorRevision p = new MajorRevision(5);
- assertEquals(5, p.getMajor());
- assertEquals(FullRevision.IMPLICIT_MINOR_REV, p.getMinor());
- assertEquals(FullRevision.IMPLICIT_MICRO_REV, p.getMicro());
- assertEquals(FullRevision.NOT_A_PREVIEW, p.getPreview());
- assertFalse (p.isPreview());
- assertEquals("5", p.toShortString());
- assertEquals(p, MajorRevision.parseRevision("5"));
- assertEquals("5", p.toString());
-
- assertEquals(new FullRevision(5, 0, 0, 0), p);
- }
-
- public final void testParseError() {
- String errorMsg = null;
- try {
- MajorRevision.parseRevision("5.0.0");
- fail("MajorRevision.parseRevision should thrown NumberFormatException");
- } catch (NumberFormatException e) {
- errorMsg = e.getMessage();
- }
- assertEquals("For input string: \"5.0.0\"", errorMsg);
- }
-
- public final void testCompareTo() {
- MajorRevision s4 = new MajorRevision(4);
- MajorRevision i4 = new MajorRevision(4);
- FullRevision g5 = new FullRevision (5, 1, 0, 6);
- MajorRevision y5 = new MajorRevision(5);
- FullRevision c5 = new FullRevision (5, 1, 0, 6);
- FullRevision o5 = new FullRevision (5, 0, 0, 7);
- FullRevision p5 = new FullRevision (5, 1, 0, 0);
-
- assertEquals(s4, i4); // 4.0.0-0 == 4.0.0-0
- assertEquals(g5, c5); // 5.1.0-6 == 5.1.0-6
-
- assertFalse(y5.equals(p5)); // 5.0.0-0 != 5.1.0-0
- assertFalse(g5.equals(p5)); // 5.1.0-6 != 5.1.0-0
- assertTrue (s4.compareTo(i4) == 0); // 4.0.0-0 == 4.0.0-0
- assertTrue (s4.compareTo(y5) < 0); // 4.0.0-0 < 5.0.0-0
- assertTrue (y5.compareTo(y5) == 0); // 5.0.0-0 == 5.0.0-0
- assertTrue (y5.compareTo(p5) < 0); // 5.0.0-0 < 5.1.0-0
- assertTrue (o5.compareTo(y5) < 0); // 5.0.0-7 < 5.0.0-0
- assertTrue (p5.compareTo(p5) == 0); // 5.1.0-0 == 5.1.0-0
- assertTrue (c5.compareTo(p5) < 0); // 5.1.0-6 < 5.1.0-0
- assertTrue (p5.compareTo(c5) > 0); // 5.1.0-0 > 5.1.0-6
- assertTrue (p5.compareTo(o5) > 0); // 5.1.0-0 > 5.0.0-7
- assertTrue (c5.compareTo(o5) > 0); // 5.1.0-6 > 5.0.0-7
- assertTrue (o5.compareTo(o5) == 0); // 5.0.0-7 > 5.0.0-7
- }
-
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MinToolsPackageTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MinToolsPackageTest.java
deleted file mode 100755
index adffe2e..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MinToolsPackageTest.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.packages.MinToolsPackage;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.repository.PkgProps;
-
-import java.io.File;
-import java.util.Properties;
-
-public class MinToolsPackageTest extends PackageTest {
-
- /** Local class used to test the abstract MinToolsPackage class */
- protected static class MockMinToolsPackage extends MinToolsPackage {
- public MockMinToolsPackage(
- SdkSource source,
- Properties props,
- int revision,
- String license,
- String description,
- String descUrl,
- Os archiveOs,
- Arch archiveArch,
- String archiveOsPath) {
- super(source,
- props,
- revision,
- license,
- description,
- descUrl,
- archiveOs,
- archiveArch,
- archiveOsPath);
- }
-
- @Override
- public File getInstallFolder(String osSdkRoot, SdkManager sdkManager) {
- throw new UnsupportedOperationException("abstract method not used in test"); //$NON-NLS-1$
- }
-
- @Override
- public String getListDescription() {
- throw new UnsupportedOperationException("abstract method not used in test"); //$NON-NLS-1$
- }
-
- @Override
- public String getShortDescription() {
- throw new UnsupportedOperationException("abstract method not used in test"); //$NON-NLS-1$
- }
-
- @Override
- public boolean sameItemAs(Package pkg) {
- throw new UnsupportedOperationException("abstract method not used in test"); //$NON-NLS-1$
- }
-
- @Override
- public String installId() {
- return ""; //$NON-NLS-1$
- }
- }
-
- @Override
- public void testCreate() {
- Properties props = createProps();
-
- MockMinToolsPackage p = new MockMinToolsPackage(
- null, //source
- props,
- -1, //revision
- null, //license
- null, //description
- null, //descUrl
- Os.ANY, //archiveOs
- Arch.ANY, //archiveArch
- LOCAL_ARCHIVE_PATH
- );
-
- testCreatedPackage(p);
- }
-
- @Override
- public void testSaveProperties() {
- Properties props = createProps();
-
- MockMinToolsPackage p = new MockMinToolsPackage(
- null, //source
- props,
- -1, //revision
- null, //license
- null, //description
- null, //descUrl
- Os.ANY, //archiveOs
- Arch.ANY, //archiveArch
- LOCAL_ARCHIVE_PATH
- );
-
- Properties props2 = new Properties();
- p.saveProperties(props2);
-
- assertEquals(props2, props);
- }
-
- @Override
- protected Properties createProps() {
- Properties props = super.createProps();
-
- // MinToolsPackage properties
- props.setProperty(PkgProps.MIN_TOOLS_REV, "3.0.1");
-
- return props;
- }
-
- protected void testCreatedMinToolsPackage(MockMinToolsPackage p) {
- super.testCreatedPackage(p);
-
- // MinToolsPackage properties
- assertEquals("3.0.1", p.getMinToolsRevision().toShortString());
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockAddonPackage.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockAddonPackage.java
deleted file mode 100755
index 7a52e7d..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockAddonPackage.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.SdkConstants;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.ISystemImage;
-import com.android.sdklib.ISystemImage.LocationType;
-import com.android.sdklib.SystemImage;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.io.FileOp;
-import com.android.sdklib.repository.PkgProps;
-
-import java.util.Map;
-import java.util.Properties;
-
-/**
- * A mock {@link AddonPackage} for testing.
- *
- * By design, this package contains one and only one archive.
- */
-public class MockAddonPackage extends AddonPackage {
-
- /**
- * Creates a {@link MockAddonTarget} with the requested base platform and addon revision
- * and then a {@link MockAddonPackage} wrapping it and a default name of "addon".
- *
- * By design, this package contains one and only one archive.
- */
- public MockAddonPackage(MockPlatformPackage basePlatform, int revision) {
- this("addon", basePlatform, revision); //$NON-NLS-1$
- }
-
- /**
- * Creates a {@link MockAddonTarget} with the requested base platform and addon revision
- * and then a {@link MockAddonPackage} wrapping it.
- *
- * By design, this package contains one and only one archive.
- */
- public MockAddonPackage(String name, MockPlatformPackage basePlatform, int revision) {
- super(new MockAddonTarget(name, basePlatform.getTarget(), revision), null /*props*/);
- }
-
- public MockAddonPackage(
- SdkSource source,
- String name,
- MockPlatformPackage basePlatform,
- int revision) {
- super(source,
- new MockAddonTarget(name, basePlatform.getTarget(), revision),
- createProperties(name, basePlatform.getTarget()));
- }
-
- private static Properties createProperties(String name, IAndroidTarget baseTarget) {
- String vendor = baseTarget.getVendor();
- Properties props = new Properties();
- props.setProperty(PkgProps.ADDON_NAME_ID, name);
- props.setProperty(PkgProps.ADDON_NAME_DISPLAY,
- String.format("The %1$s from %2$s", //$NON-NLS-1$
- name, vendor));
- props.setProperty(PkgProps.ADDON_VENDOR_ID,
- String.format("vendor-id-%1$s", vendor)); //$NON-NLS-1$
- props.setProperty(PkgProps.ADDON_VENDOR_DISPLAY,
- String.format("The %1$s", vendor)); //$NON-NLS-1$
- return props;
- }
-
- /**
- * A mock AddonTarget.
- * This reimplements the minimum needed from the interface for our limited testing needs.
- */
- static class MockAddonTarget implements IAndroidTarget {
-
- private final IAndroidTarget mParentTarget;
- private final int mRevision;
- private final String mName;
- private ISystemImage[] mSystemImages;
-
- public MockAddonTarget(String name, IAndroidTarget parentTarget, int revision) {
- mName = name;
- mParentTarget = parentTarget;
- mRevision = revision;
- }
-
- @Override
- public String getClasspathName() {
- return getName();
- }
-
- @Override
- public String getShortClasspathName() {
- return getName();
- }
-
- @Override
- public String getDefaultSkin() {
- return null;
- }
-
- @Override
- public String getDescription() {
- return getName();
- }
-
- @Override
- public String getFullName() {
- return getName();
- }
-
- @Override
- public ISystemImage[] getSystemImages() {
- if (mSystemImages == null) {
- SystemImage si = new SystemImage(
- FileOp.append(getLocation(), SdkConstants.OS_IMAGES_FOLDER),
- LocationType.IN_PLATFORM_LEGACY,
- SdkConstants.ABI_ARMEABI);
- mSystemImages = new SystemImage[] { si };
- }
- return mSystemImages;
- }
-
- @Override
- public ISystemImage getSystemImage(String abiType) {
- if (SdkConstants.ABI_ARMEABI.equals(abiType)) {
- return getSystemImages()[0];
- }
- return null;
- }
-
- @Override
- public String getLocation() {
- return "/sdk/add-ons/addon-" + mName;
- }
-
- @Override
- public IOptionalLibrary[] getOptionalLibraries() {
- return null;
- }
-
- @Override
- public IAndroidTarget getParent() {
- return mParentTarget;
- }
-
- @Override
- public String getPath(int pathId) {
- throw new UnsupportedOperationException("Implement this as needed for tests");
- }
-
- @Override
- public String[] getPlatformLibraries() {
- return null;
- }
-
- @Override
- public String getProperty(String name) {
- return null;
- }
-
- @Override
- public Integer getProperty(String name, Integer defaultValue) {
- return defaultValue;
- }
-
- @Override
- public Boolean getProperty(String name, Boolean defaultValue) {
- return defaultValue;
- }
-
- @Override
- public Map<String, String> getProperties() {
- return null;
- }
-
- @Override
- public int getRevision() {
- return mRevision;
- }
-
- @Override
- public String[] getSkins() {
- return null;
- }
-
- @Override
- public int getUsbVendorId() {
- return 0;
- }
-
- @Override
- public AndroidVersion getVersion() {
- return mParentTarget.getVersion();
- }
-
- @Override
- public String getName() {
- return mName;
- }
-
- @Override
- public String getVendor() {
- return mParentTarget.getVendor();
- }
-
- @Override
- public String getVersionName() {
- return String.format("mock-addon-%1$d", getVersion().getApiLevel());
- }
-
- @Override
- public String hashString() {
- return getVersionName();
- }
-
- /** Returns false for an addon. */
- @Override
- public boolean isPlatform() {
- return false;
- }
-
- @Override
- public boolean canRunOn(IAndroidTarget target) {
- throw new UnsupportedOperationException("Implement this as needed for tests");
- }
-
- @Override
- public int compareTo(IAndroidTarget o) {
- throw new UnsupportedOperationException("Implement this as needed for tests");
- }
-
- @Override
- public boolean hasRenderingLibrary() {
- return false;
- }
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockBrokenPackage.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockBrokenPackage.java
deleted file mode 100755
index e78e796..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockBrokenPackage.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.internal.repository.packages.BrokenPackage;
-
-
-/**
- * A mock {@link BrokenPackage} for testing.
- * <p/>
- * By design, this package contains one and only one archive.
- */
-public class MockBrokenPackage extends BrokenPackage {
-
- public MockBrokenPackage(int minApiLevel, int exactApiLevel) {
- this(createDesription(minApiLevel, exactApiLevel), // short description
- createDesription(minApiLevel, exactApiLevel), // long description
- minApiLevel,
- exactApiLevel);
- }
-
- private static String createDesription(int minApiLevel, int exactApiLevel) {
- String s = "Broken package";
- s += exactApiLevel == BrokenPackage.API_LEVEL_INVALID ? " (No API level)" :
- String.format(" for API %d", exactApiLevel);
- s += minApiLevel == BrokenPackage.MIN_API_LEVEL_NOT_SPECIFIED ? "" :
- String.format(", min API %d", minApiLevel);
- return s;
- }
-
- public MockBrokenPackage(
- String shortDescription,
- String longDescription,
- int minApiLevel,
- int exactApiLevel) {
- super(null /*props*/,
- shortDescription,
- longDescription,
- minApiLevel,
- exactApiLevel,
- "/sdk/broken/package" /*osPath*/);
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockEmptyPackage.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockEmptyPackage.java
deleted file mode 100755
index 70f57b4..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockEmptyPackage.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-
-import java.io.File;
-import java.util.Properties;
-
-/**
- * A mock empty package, of no particular subpackage type.
- * {@link #sameItemAs(Package)} will return true if these packages have the same handle.
- */
-public class MockEmptyPackage extends MajorRevisionPackage {
- private final String mTestHandle;
-
- /**
- * Creates a new {@link MockEmptyPackage} with a local archive.
- *
- * @param testHandle The comparison handle for {@link #sameItemAs(Package)}.
- */
- public MockEmptyPackage(String testHandle) {
- super(
- null /*source*/,
- null /*props*/,
- 0 /*revision*/,
- null /*license*/,
- null /*description*/,
- null /*descUrl*/,
- Os.ANY /*archiveOs*/,
- Arch.ANY /*archiveArch*/,
- "/sdk/tmp/empty_pkg" /*archiveOsPath*/
- );
- mTestHandle = testHandle;
- }
-
- /**
- * Creates a new {@link MockEmptyPackage} with a local archive.
- *
- * @param testHandle The comparison handle for {@link #sameItemAs(Package)}.
- * @param revision The revision of the package, printed in the short description.
- */
- public MockEmptyPackage(String testHandle, int revision) {
- super(
- null /*source*/,
- null /*props*/,
- revision,
- null /*license*/,
- null /*description*/,
- null /*descUrl*/,
- Os.ANY /*archiveOs*/,
- Arch.ANY /*archiveArch*/,
- "/sdk/tmp/empty_pkg" /*archiveOsPath*/
- );
- mTestHandle = testHandle;
- }
-
- /**
- * Creates a new {@link MockEmptyPackage} with a local archive.
- *
- * @param source The source associate with this package.
- * @param testHandle The comparison handle for {@link #sameItemAs(Package)}.
- * @param revision The revision of the package, printed in the short description.
- */
- public MockEmptyPackage(SdkSource source, String testHandle, int revision) {
- super(
- source,
- null /*props*/,
- revision,
- null /*license*/,
- null /*description*/,
- null /*descUrl*/,
- Os.ANY /*archiveOs*/,
- Arch.ANY /*archiveArch*/,
- "/sdk/tmp/empty_pkg" /*archiveOsPath*/
- );
- mTestHandle = testHandle;
- }
-
- @Override
- protected Archive[] initializeArchives(
- Properties props,
- Os archiveOs,
- Arch archiveArch,
- String archiveOsPath) {
- return new Archive[] {
- new Archive(this, props, archiveOs, archiveArch, archiveOsPath) {
- @Override
- public String toString() {
- return mTestHandle;
- }
- } };
- }
-
- public Archive getLocalArchive() {
- return getArchives()[0];
- }
-
- @Override
- public File getInstallFolder(String osSdkRoot, SdkManager sdkManager) {
- return new File(new File(osSdkRoot, "mock"), mTestHandle);
- }
-
- @Override
- public String installId() {
- return "mock-empty-" + mTestHandle; //$NON-NLS-1$
- }
-
- @Override
- public String getListDescription() {
- return this.getClass().getSimpleName();
- }
-
- @Override
- public String getShortDescription() {
- StringBuilder sb = new StringBuilder(this.getClass().getSimpleName());
- sb.append(" '").append(mTestHandle).append('\'');
- if (getRevision().getMajor() > 0) {
- sb.append(" rev=").append(getRevision());
- }
- return sb.toString();
- }
-
- /** Returns true if these packages have the same handle. */
- @Override
- public boolean sameItemAs(Package pkg) {
- return (pkg instanceof MockEmptyPackage) &&
- mTestHandle.equals(((MockEmptyPackage) pkg).mTestHandle);
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = super.hashCode();
- result = prime * result + ((mTestHandle == null) ? 0 : mTestHandle.hashCode());
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (!super.equals(obj)) {
- return false;
- }
- if (!(obj instanceof MockEmptyPackage)) {
- return false;
- }
- MockEmptyPackage other = (MockEmptyPackage) obj;
- if (mTestHandle == null) {
- if (other.mTestHandle != null) {
- return false;
- }
- } else if (!mTestHandle.equals(other.mTestHandle)) {
- return false;
- }
- return true;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockExtraPackage.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockExtraPackage.java
deleted file mode 100755
index ca5a6cf..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockExtraPackage.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.repository.PkgProps;
-
-import java.util.Properties;
-
-/**
- * A mock {@link ExtraPackage} for testing.
- *
- * By design, this package contains one and only one archive.
- */
-public class MockExtraPackage extends ExtraPackage {
-
- /**
- * Creates a {@link MockExtraPackage} with the given revision and hardcoded defaults
- * for everything else.
- * <p/>
- * By design, this creates a package with one and only one archive.
- */
- public MockExtraPackage(String vendor, String path, int revision, int min_platform_tools_rev) {
- this(null /*source*/, vendor, path, revision, min_platform_tools_rev);
- }
-
- public MockExtraPackage(
- SdkSource source,
- Properties props,
- String vendor,
- String path,
- int revision) {
- super(
- source,
- props, // props,
- vendor,
- path,
- revision,
- null, // license,
- "desc", // description,
- "url", // descUrl,
- Os.getCurrentOs(), // archiveOs,
- Arch.getCurrentArch(), // archiveArch,
- "foo" // archiveOsPath
- );
- }
-
- public MockExtraPackage(
- SdkSource source,
- String vendor,
- String path,
- int revision,
- int min_platform_tools_rev) {
- this(source, createProps(min_platform_tools_rev), vendor, path, revision);
- }
-
- private static Properties createProps(int min_platform_tools_rev) {
- Properties props = new Properties();
- props.setProperty(PkgProps.MIN_PLATFORM_TOOLS_REV,
- Integer.toString((min_platform_tools_rev)));
- return props;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockPlatformPackage.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockPlatformPackage.java
deleted file mode 100755
index dd744ec..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockPlatformPackage.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.internal.repository.MockPlatformTarget;
-import com.android.sdklib.internal.repository.packages.PlatformPackage;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.repository.PkgProps;
-
-import java.util.Properties;
-
-/**
- * A mock {@link PlatformPackage} for testing.
- *
- * By design, this package contains one and only one archive.
- */
-public class MockPlatformPackage extends PlatformPackage {
-
- private final IAndroidTarget mTarget;
-
- /**
- * Creates a {@link MockPlatformTarget} with the requested API and revision
- * and then a {@link MockPlatformPackage} wrapping it.
- *
- * By design, this package contains one and only one archive.
- */
- public MockPlatformPackage(int apiLevel, int revision) {
- this(null /*source*/, new MockPlatformTarget(apiLevel, revision), null /*props*/);
- }
-
- /**
- * Creates a {@link MockPlatformTarget} with the requested API and revision
- * and then a {@link MockPlatformPackage} wrapping it.
- *
- * Also sets the min-tools-rev of the platform using a major revision integer.
- *
- * By design, this package contains one and only one archive.
- */
- public MockPlatformPackage(int apiLevel, int revision, int min_tools_rev) {
- this(null /*source*/,
- new MockPlatformTarget(apiLevel, revision),
- createProps(min_tools_rev));
- }
-
- /**
- * Creates a {@link MockPlatformTarget} with the requested API and revision
- * and then a {@link MockPlatformPackage} wrapping it.
- *
- * Also sets the min-tools-rev of the platform using a {@link FullRevision}.
- *
- * By design, this package contains one and only one archive.
- */
- public MockPlatformPackage(int apiLevel, int revision, FullRevision min_tools_rev) {
- this(null /*source*/,
- new MockPlatformTarget(apiLevel, revision),
- createProps(min_tools_rev));
- }
-
- public MockPlatformPackage(SdkSource source, int apiLevel, int revision, int min_tools_rev) {
- this(source, new MockPlatformTarget(apiLevel, revision), createProps(min_tools_rev));
- }
-
- /** A little trick to be able to capture the target new after passing it to the super. */
- private MockPlatformPackage(SdkSource source, IAndroidTarget target, Properties props) {
- super(source, target, props);
- mTarget = target;
- }
-
- private static Properties createProps(int min_tools_rev) {
- Properties props = new Properties();
- props.setProperty(PkgProps.MIN_TOOLS_REV, Integer.toString((min_tools_rev)));
- return props;
- }
-
- private static Properties createProps(FullRevision min_tools_rev) {
- Properties props = new Properties();
- props.setProperty(PkgProps.MIN_TOOLS_REV, min_tools_rev.toShortString());
- return props;
- }
-
- public IAndroidTarget getTarget() {
- return mTarget;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockPlatformToolPackage.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockPlatformToolPackage.java
deleted file mode 100755
index b11c991..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockPlatformToolPackage.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-
-/**
- * A mock {@link PlatformToolPackage} for testing.
- *
- * By design, this package contains one and only one archive.
- */
-public class MockPlatformToolPackage extends PlatformToolPackage {
-
- /**
- * Creates a {@link MockPlatformToolPackage} with the given revision and hardcoded defaults
- * for everything else.
- * <p/>
- * By design, this creates a package with one and only one archive.
- */
- public MockPlatformToolPackage(int revision) {
- this(null /*source*/, revision);
- }
-
- /**
- * Creates a {@link MockPlatformToolPackage} with the given revision and hardcoded defaults
- * for everything else.
- * <p/>
- * By design, this creates a package with one and only one archive.
- */
- public MockPlatformToolPackage(SdkSource source, int revision) {
- super(
- source, // source,
- null, // props,
- revision,
- null, // license,
- "desc", // description,
- "url", // descUrl,
- Os.getCurrentOs(), // archiveOs,
- Arch.getCurrentArch(), // archiveArch,
- "foo" // archiveOsPath
- );
- }
-
- /**
- * Creates a {@link MockPlatformToolPackage} with the given revision and hardcoded defaults
- * for everything else.
- * <p/>
- * By design, this creates a package with one and only one archive.
- */
- public MockPlatformToolPackage(SdkSource source, FullRevision revision) {
- super(
- source, // source,
- FullRevisionPackageTest.createProps(revision), // props,
- revision.getMajor(),
- null, // license,
- "desc", // description,
- "url", // descUrl,
- Os.getCurrentOs(), // archiveOs,
- Arch.getCurrentArch(), // archiveArch,
- "foo" // archiveOsPath
- );
- }
-}
-
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockSourcePackage.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockSourcePackage.java
deleted file mode 100755
index 4c129a3..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockSourcePackage.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.internal.repository.packages.SourcePackage;
-import com.android.sdklib.internal.repository.packages.SystemImagePackage;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-
-
-/**
- * A mock {@link SystemImagePackage} for testing.
- *
- * By design, this package contains one and only one archive.
- */
-public class MockSourcePackage extends SourcePackage {
- /**
- * Creates a {@link MockSourcePackage} using the given base platform version
- * and package revision.
- *
- * By design, this package contains one and only one archive.
- */
- public MockSourcePackage(AndroidVersion version, int revision) {
- super(version,
- revision,
- null /*props*/,
- String.format("/sdk/sources/android-%s", version.getApiString()));
- }
-
- /**
- * Creates a {@link MockSourcePackage} using the given version,
- * sdk source and package revision.
- *
- * By design, this package contains one and only one archive.
- */
- public MockSourcePackage(
- SdkSource source,
- AndroidVersion version,
- int revision) {
- super(source,
- version,
- revision,
- null /*props*/,
- String.format("/sdk/sources/android-%s", version.getApiString()));
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockSystemImagePackage.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockSystemImagePackage.java
deleted file mode 100755
index 3c7baec..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockSystemImagePackage.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.internal.repository.packages.SystemImagePackage;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-
-
-/**
- * A mock {@link SystemImagePackage} for testing.
- *
- * By design, this package contains one and only one archive.
- */
-public class MockSystemImagePackage extends SystemImagePackage {
- /**
- * Creates a {@link MockSystemImagePackage} using the given base platform version
- * and package revision.
- *
- * By design, this package contains one and only one archive.
- */
- public MockSystemImagePackage(MockPlatformPackage basePlatform, int revision, String abi) {
- super(basePlatform.getAndroidVersion(),
- revision,
- abi,
- null /*props*/,
- String.format("/sdk/system-images/android-%s/%s",
- basePlatform.getAndroidVersion().getApiString(), abi));
- }
-
- /**
- * Creates a {@link MockSystemImagePackage} using the given base platform version,
- * sdk source and package revision.
- *
- * By design, this package contains one and only one archive.
- */
- public MockSystemImagePackage(
- SdkSource source,
- MockPlatformPackage basePlatform,
- int revision,
- String abi) {
- super(source,
- basePlatform.getAndroidVersion(),
- revision,
- abi,
- null /*props*/,
- String.format("/sdk/system-images/android-%s/%s",
- basePlatform.getAndroidVersion().getApiString(), abi));
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockToolPackage.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockToolPackage.java
deleted file mode 100755
index 3c39194..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/MockToolPackage.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.packages.ToolPackage;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.repository.PkgProps;
-
-import java.util.Properties;
-
-/**
- * A mock {@link ToolPackage} for testing.
- *
- * By design, this package contains one and only one archive.
- */
-public class MockToolPackage extends ToolPackage {
-
- /**
- * Creates a {@link MockToolPackage} with the given revision and hardcoded defaults
- * for everything else.
- * <p/>
- * By design, this creates a package with one and only one archive.
- */
- public MockToolPackage(int revision, int min_platform_tools_rev) {
- this(null /*source*/, revision, min_platform_tools_rev);
- }
-
- /**
- * Creates a {@link MockToolPackage} with the given revision and hardcoded defaults
- * for everything else.
- * <p/>
- * By design, this creates a package with one and only one archive.
- */
- public MockToolPackage(SdkSource source, int revision, int minPlatformToolsRev) {
- super(
- source, // source,
- createProps(null /*version*/, minPlatformToolsRev), // props,
- revision,
- null, // license,
- "desc", // description,
- "url", // descUrl,
- Os.getCurrentOs(), // archiveOs,
- Arch.getCurrentArch(), // archiveArch,
- "foo" // archiveOsPath
- );
- }
-
- /**
- * Creates a {@link MockToolPackage} with the given revision and hardcoded defaults
- * for everything else.
- * <p/>
- * By design, this creates a package with one and only one archive.
- */
- public MockToolPackage(
- SdkSource source,
- FullRevision revision,
- int minPlatformToolsRev) {
- super(
- source, // source,
- createProps(revision, minPlatformToolsRev), // props,
- revision.getMajor(),
- null, // license,
- "desc", // description,
- "url", // descUrl,
- Os.getCurrentOs(), // archiveOs,
- Arch.getCurrentArch(), // archiveArch,
- "foo" // archiveOsPath
- );
- }
-
- /**
- * Creates a {@link MockToolPackage} with the given revision and hardcoded defaults
- * for everything else.
- * <p/>
- * By design, this creates a package with one and only one archive.
- */
- public MockToolPackage(
- SdkSource source,
- FullRevision revision,
- FullRevision minPlatformToolsRev) {
- super(
- source, // source,
- createProps(revision, minPlatformToolsRev), // props,
- revision.getMajor(),
- null, // license,
- "desc", // description,
- "url", // descUrl,
- Os.getCurrentOs(), // archiveOs,
- Arch.getCurrentArch(), // archiveArch,
- "foo" // archiveOsPath
- );
- }
-
- private static Properties createProps(FullRevision revision, int minPlatformToolsRev) {
- Properties props = FullRevisionPackageTest.createProps(revision);
- props.setProperty(PkgProps.MIN_PLATFORM_TOOLS_REV,
- Integer.toString((minPlatformToolsRev)));
- return props;
- }
-
- private static Properties createProps(FullRevision revision, FullRevision minPlatformToolsRev) {
- Properties props = FullRevisionPackageTest.createProps(revision);
- props.setProperty(PkgProps.MIN_PLATFORM_TOOLS_REV,
- minPlatformToolsRev.toShortString());
- return props;
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/PackageTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/PackageTest.java
deleted file mode 100755
index f4d7b56..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/PackageTest.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.packages.BrokenPackage;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.internal.repository.sources.SdkRepoSource;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.repository.PkgProps;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Properties;
-
-import junit.framework.TestCase;
-
-public class PackageTest extends TestCase {
-
- protected static final String LOCAL_ARCHIVE_PATH = "/local/archive/path";
-
- /** Local class used to test the abstract Package class */
- protected static class MockPackage extends MajorRevisionPackage {
- public MockPackage(
- SdkSource source,
- Properties props,
- int revision,
- String license,
- String description,
- String descUrl,
- Os archiveOs,
- Arch archiveArch,
- String archiveOsPath) {
- super(source,
- props,
- revision,
- license,
- description,
- descUrl,
- archiveOs,
- archiveArch,
- archiveOsPath);
- }
-
- @Override
- public File getInstallFolder(String osSdkRoot, SdkManager sdkManager) {
- throw new UnsupportedOperationException("abstract method not used in test"); //$NON-NLS-1$
- }
-
- @Override
- public String getListDescription() {
- throw new UnsupportedOperationException("abstract method not used in test"); //$NON-NLS-1$
- }
-
- @Override
- public String getShortDescription() {
- throw new UnsupportedOperationException("abstract method not used in test"); //$NON-NLS-1$
- }
-
- @Override
- public boolean sameItemAs(Package pkg) {
- throw new UnsupportedOperationException("abstract method not used in test"); //$NON-NLS-1$
- }
-
- @Override
- public String installId() {
- return "mock-pkg"; //$NON-NLS-1$
- }
- }
-
- public void testCreate() throws Exception {
- Properties props = createProps();
-
- Package p = new MockPackage(
- null, //source
- props,
- -1, //revision
- null, //license
- null, //description
- null, //descUrl
- Os.ANY, //archiveOs
- Arch.ANY, //archiveArch
- LOCAL_ARCHIVE_PATH //archiveOsPath
- );
-
- testCreatedPackage(p);
- }
-
- public void testSaveProperties() throws Exception {
- Properties props = createProps();
-
- Package p = new MockPackage(
- null, //source
- props,
- -1, //revision
- null, //license
- null, //description
- null, //descUrl
- Os.ANY, //archiveOs
- Arch.ANY, //archiveArch
- LOCAL_ARCHIVE_PATH //archiveOsPath
- );
-
- Properties props2 = new Properties();
- p.saveProperties(props2);
-
- assertEquals(props2, props);
- }
-
- /**
- * Sets the properties used by {@link #testCreate()} and
- * {@link #testSaveProperties()}.
- * This is protected and used by derived classes to perform
- * a similar creation test.
- */
- protected Properties createProps() {
- Properties props = new Properties();
-
- // Package properties
- props.setProperty(PkgProps.PKG_REVISION, "42");
- props.setProperty(PkgProps.PKG_LICENSE, "The License");
- props.setProperty(PkgProps.PKG_DESC, "Some description.");
- props.setProperty(PkgProps.PKG_DESC_URL, "http://description/url");
- props.setProperty(PkgProps.PKG_RELEASE_NOTE, "Release Note");
- props.setProperty(PkgProps.PKG_RELEASE_URL, "http://release/note");
- props.setProperty(PkgProps.PKG_SOURCE_URL, "http://source/url");
- props.setProperty(PkgProps.PKG_OBSOLETE, "true");
- return props;
- }
-
- /**
- * Tests the values set via {@link #createProps()} after the
- * package has been created in {@link #testCreate()}.
- * This is protected and used by derived classes to perform
- * a similar creation test.
- */
- protected void testCreatedPackage(Package p) {
- // Package properties
- assertEquals("42", p.getRevision().toShortString());
- assertEquals("The License", p.getLicense());
- assertEquals("Some description.", p.getDescription());
- assertEquals("http://description/url", p.getDescUrl());
- assertEquals("Release Note", p.getReleaseNote());
- assertEquals("http://release/note", p.getReleaseNoteUrl());
- assertEquals(new SdkRepoSource("http://source/url", null /*uiName*/), p.getParentSource());
- assertTrue(p.isObsolete());
-
- assertNotNull(p.getArchives());
- assertEquals(1, p.getArchives().length);
- Archive a = p.getArchives()[0];
- assertNotNull(a);
- assertEquals(Os.ANY, a.getOs());
- assertEquals(Arch.ANY, a.getArch());
- assertEquals(LOCAL_ARCHIVE_PATH, a.getLocalOsPath());
- }
-
- // ----
-
- public void testCompareTo() throws Exception {
- ArrayList<Package> list = new ArrayList<Package>();
- MockPlatformPackage p1;
-
- list.add(p1 = new MockPlatformPackage(1, 2));
- list.add(new MockAddonPackage(p1, 3));
- list.add(new MockSystemImagePackage(p1, 4, "x86"));
- list.add(new MockBrokenPackage(BrokenPackage.MIN_API_LEVEL_NOT_SPECIFIED, 1));
- list.add(new MockExtraPackage("vendor", "path", 5, 6));
- list.add(new MockToolPackage(7, 8));
-
- Collections.sort(list);
-
- assertEquals(
- "[Android SDK Tools, revision 7, " +
- "SDK Platform Android android-1, API 1, revision 2, " +
- "Intel x86 Atom System Image, Android API 1, revision 4, " +
- "addon, Android API 1, revision 3, " +
- "Broken package for API 1, " +
- "Vendor Path, revision 5]",
- Arrays.toString(list.toArray()));
- }
-
- public void testGetPropertyInt() {
- Properties p = new Properties();
-
- assertEquals(42, Package.getPropertyInt(p, "key", 42));
-
- p.setProperty("key", "");
- assertEquals(43, Package.getPropertyInt(p, "key", 43));
-
- p.setProperty("key", "I am not a number");
- assertEquals(44, Package.getPropertyInt(p, "key", 44));
-
- p.setProperty("key", "6");
- assertEquals(6, Package.getPropertyInt(p, "key", 45));
- }
-
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/PlatformPackageTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/PlatformPackageTest.java
deleted file mode 100755
index acb57ee..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/PlatformPackageTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.internal.repository.MockPlatformTarget;
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.packages.PlatformPackage;
-import com.android.sdklib.repository.PkgProps;
-
-import java.util.Properties;
-
-public class PlatformPackageTest extends MinToolsPackageTest {
-
- /**
- * PlatformPackage implicitly generates a local archive wrapper
- * that matches the current platform OS and architecture. Since this
- * is not convenient for testing, this class overrides it to always
- * create archives for any OS and any architecture.
- */
- private static class PlatformPackageWithFakeArchive extends PlatformPackage {
- protected PlatformPackageWithFakeArchive(IAndroidTarget target, Properties props) {
- super(target, props);
- }
-
- @Override
- protected Archive[] initializeArchives(
- Properties props,
- Os archiveOs,
- Arch archiveArch,
- String archiveOsPath) {
- assert archiveOs == Os.getCurrentOs();
- assert archiveArch == Arch.getCurrentArch();
- return super.initializeArchives(props, Os.ANY, Arch.ANY, LOCAL_ARCHIVE_PATH);
- }
- }
-
- private PlatformPackage createPlatformPackage(Properties props) {
- PlatformPackage p = new PlatformPackageWithFakeArchive(
- new MockPlatformTarget(5 /*apiLevel*/, 1 /*revision*/),
- props);
-
- return p;
- }
-
- @Override
- protected Properties createProps() {
- Properties props = super.createProps();
-
- // PlatformPackage properties
- props.setProperty(PkgProps.VERSION_API_LEVEL, "5");
- props.setProperty(PkgProps.PLATFORM_VERSION, "android-5");
- props.setProperty(PkgProps.PLATFORM_INCLUDED_ABI, "armeabi");
-
- return props;
- }
-
- protected void testCreatedPlatformPackage(PlatformPackage p) {
- super.testCreatedPackage(p);
-
- // Package properties
- assertEquals("API 5", p.getAndroidVersion().toString());
- assertEquals("armeabi", p.getIncludedAbi());
- }
-
- // ----
-
- @Override
- public final void testCreate() {
- Properties props = createProps();
- PlatformPackage p = createPlatformPackage(props);
-
- testCreatedPlatformPackage(p);
- }
-
- @Override
- public void testSaveProperties() {
- Properties props = createProps();
- PlatformPackage p = createPlatformPackage(props);
-
- Properties props2 = new Properties();
- p.saveProperties(props2);
-
- assertEquals(props2.toString(), props.toString());
- assertEquals(props2, props);
- }
-
- public void testInstallId() {
- Properties props = createProps();
- PlatformPackage p = createPlatformPackage(props);
-
- assertEquals("android-5", p.installId());
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/SourcePackageTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/SourcePackageTest.java
deleted file mode 100755
index d87eab3..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/SourcePackageTest.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.AndroidVersion.AndroidVersionException;
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.packages.SourcePackage;
-import com.android.sdklib.repository.PkgProps;
-
-import java.util.Properties;
-
-public class SourcePackageTest extends PackageTest {
-
- /**
- * SourcePackageTest implicitly generates a local archive wrapper
- * that matches the current platform OS and architecture. Since this
- * is not convenient for testing, this class overrides it to always
- * create archives for any OS and any architecture.
- */
- private static class SourcePackageFakeArchive extends SourcePackage {
- protected SourcePackageFakeArchive(
- AndroidVersion platformVersion,
- int revision,
- Properties props) {
- super(platformVersion,
- revision,
- props,
- String.format("/sdk/sources/android-%s", platformVersion.getApiString()));
- }
-
- @Override
- protected Archive[] initializeArchives(
- Properties props,
- Os archiveOs,
- Arch archiveArch,
- String archiveOsPath) {
- assert archiveOs == Os.getCurrentOs();
- assert archiveArch == Arch.getCurrentArch();
- return super.initializeArchives(props, Os.ANY, Arch.ANY, LOCAL_ARCHIVE_PATH);
- }
- }
-
- private SourcePackage createSourcePackageTest(Properties props) throws AndroidVersionException {
- SourcePackage p = new SourcePackageFakeArchive(
- new AndroidVersion(props),
- 1 /*revision*/,
- props);
- return p;
- }
-
- @Override
- protected Properties createProps() {
- Properties props = super.createProps();
-
- // SourcePackageTest properties
- props.setProperty(PkgProps.VERSION_API_LEVEL, "5");
-
- return props;
- }
-
- protected void testCreatedSourcePackageTest(SourcePackage p) {
- super.testCreatedPackage(p);
-
- // SourcePackageTest properties
- assertEquals("API 5", p.getAndroidVersion().toString());
- }
-
- // ----
-
- @Override
- public final void testCreate() throws Exception {
- Properties props = createProps();
- SourcePackage p = createSourcePackageTest(props);
-
- testCreatedSourcePackageTest(p);
- }
-
- @Override
- public void testSaveProperties() throws Exception {
- Properties props = createProps();
- SourcePackage p = createSourcePackageTest(props);
-
- Properties props2 = new Properties();
- p.saveProperties(props2);
-
- assertEquals(props2, props);
- }
-
- public void testSameItemAs() throws Exception {
- Properties props1 = createProps();
- SourcePackage p1 = createSourcePackageTest(props1);
- assertTrue(p1.sameItemAs(p1));
-
- // different version
- Properties props2 = new Properties(props1);
- props2.setProperty(PkgProps.VERSION_API_LEVEL, "6");
- SourcePackage p2 = createSourcePackageTest(props2);
- assertFalse(p1.sameItemAs(p2));
- assertFalse(p2.sameItemAs(p1));
- }
-
- public void testInstallId() throws Exception {
- Properties props = createProps();
- SourcePackage p = createSourcePackageTest(props);
-
- assertEquals("source-5", p.installId());
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/SystemImagePackageTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/SystemImagePackageTest.java
deleted file mode 100755
index c32b81f..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/packages/SystemImagePackageTest.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.packages;
-
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.AndroidVersion.AndroidVersionException;
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.archives.Archive.Arch;
-import com.android.sdklib.internal.repository.archives.Archive.Os;
-import com.android.sdklib.internal.repository.packages.SystemImagePackage;
-import com.android.sdklib.repository.PkgProps;
-
-import java.util.Properties;
-
-public class SystemImagePackageTest extends PackageTest {
-
- /**
- * SystemImagePackage implicitly generates a local archive wrapper
- * that matches the current platform OS and architecture. Since this
- * is not convenient for testing, this class overrides it to always
- * create archives for any OS and any architecture.
- */
- private static class SysImgPackageFakeArchive extends SystemImagePackage {
- protected SysImgPackageFakeArchive(
- AndroidVersion platformVersion,
- int revision,
- String abi,
- Properties props) {
- super(platformVersion,
- revision,
- abi,
- props,
- String.format("/sdk/system-images/android-%s/%s",
- platformVersion.getApiString(), abi));
- }
-
- @Override
- protected Archive[] initializeArchives(
- Properties props,
- Os archiveOs,
- Arch archiveArch,
- String archiveOsPath) {
- assert archiveOs == Os.getCurrentOs();
- assert archiveArch == Arch.getCurrentArch();
- return super.initializeArchives(props, Os.ANY, Arch.ANY, LOCAL_ARCHIVE_PATH);
- }
- }
-
- private SystemImagePackage createSystemImagePackage(Properties props)
- throws AndroidVersionException {
- SystemImagePackage p = new SysImgPackageFakeArchive(
- new AndroidVersion(props),
- 1 /*revision*/,
- null /*abi*/,
- props);
- return p;
- }
-
- @Override
- protected Properties createProps() {
- Properties props = super.createProps();
-
- // SystemImagePackage properties
- props.setProperty(PkgProps.VERSION_API_LEVEL, "5");
- props.setProperty(PkgProps.SYS_IMG_ABI, "armeabi-v7a");
-
- return props;
- }
-
- protected void testCreatedSystemImagePackage(SystemImagePackage p) {
- super.testCreatedPackage(p);
-
- // SystemImagePackage properties
- assertEquals("API 5", p.getAndroidVersion().toString());
- assertEquals("armeabi-v7a", p.getAbi());
- }
-
- // ----
-
- @Override
- public final void testCreate() throws Exception {
- Properties props = createProps();
- SystemImagePackage p = createSystemImagePackage(props);
-
- testCreatedSystemImagePackage(p);
- }
-
- @Override
- public void testSaveProperties() throws Exception {
- Properties props = createProps();
- SystemImagePackage p = createSystemImagePackage(props);
-
- Properties props2 = new Properties();
- p.saveProperties(props2);
-
- assertEquals(props2, props);
- }
-
- public void testSameItemAs() throws Exception {
- Properties props1 = createProps();
- SystemImagePackage p1 = createSystemImagePackage(props1);
- assertTrue(p1.sameItemAs(p1));
-
- // different abi, same version
- Properties props2 = new Properties(props1);
- props2.setProperty(PkgProps.SYS_IMG_ABI, "x86");
- SystemImagePackage p2 = createSystemImagePackage(props2);
- assertFalse(p1.sameItemAs(p2));
- assertFalse(p2.sameItemAs(p1));
-
- // different abi, different version
- props2.setProperty(PkgProps.VERSION_API_LEVEL, "6");
- p2 = createSystemImagePackage(props2);
- assertFalse(p1.sameItemAs(p2));
- assertFalse(p2.sameItemAs(p1));
-
- // same abi, different version
- Properties props3 = new Properties(props1);
- props3.setProperty(PkgProps.VERSION_API_LEVEL, "6");
- SystemImagePackage p3 = createSystemImagePackage(props3);
- assertFalse(p1.sameItemAs(p3));
- assertFalse(p3.sameItemAs(p1));
- }
-
- public void testInstallId() throws Exception {
- Properties props = createProps();
- SystemImagePackage p = createSystemImagePackage(props);
-
- assertEquals("sysimg-5", p.installId());
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/sources/SdkAddonSourceTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/sources/SdkAddonSourceTest.java
deleted file mode 100755
index 046cd1d..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/sources/SdkAddonSourceTest.java
+++ /dev/null
@@ -1,750 +0,0 @@
-/*
- * Copyright (C) 2009 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.sources;
-
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.MockEmptySdkManager;
-import com.android.sdklib.internal.repository.MockMonitor;
-import com.android.sdklib.internal.repository.packages.AddonPackage;
-import com.android.sdklib.internal.repository.packages.ExtraPackage;
-import com.android.sdklib.internal.repository.packages.IMinToolsDependency;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.internal.repository.sources.SdkAddonSource;
-import com.android.sdklib.repository.SdkAddonConstants;
-import com.android.utils.Pair;
-
-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;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-import junit.framework.TestCase;
-
-/**
- * Tests for {@link SdkAddonSource}.
- */
-public class SdkAddonSourceTest extends TestCase {
-
- /**
- * An internal helper class to give us visibility to the protected members we want
- * to test.
- */
- private static class MockSdkAddonSource extends SdkAddonSource {
- public MockSdkAddonSource() {
- super("fake-url", null /*uiName*/);
- }
-
- public Document _findAlternateToolsXml(InputStream xml) {
- return super.findAlternateToolsXml(xml);
- }
-
- public boolean _parsePackages(Document doc, String nsUri, ITaskMonitor monitor) {
- return super.parsePackages(doc, nsUri, monitor);
- }
-
- public int _getXmlSchemaVersion(InputStream xml) {
- return super.getXmlSchemaVersion(xml);
- }
-
- public String _validateXml(InputStream xml, String url, int version,
- String[] outError, Boolean[] validatorFound) {
- return super.validateXml(xml, url, version, outError, validatorFound);
- }
-
- public Document _getDocument(InputStream xml, ITaskMonitor monitor) {
- return super.getDocument(xml, monitor);
- }
-
- }
-
- private MockSdkAddonSource mSource;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
-
- mSource = new MockSdkAddonSource();
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
-
- mSource = null;
- }
-
- public void testFindAlternateToolsXml_Errors() throws Exception {
- // Support null as input
- Document result = mSource._findAlternateToolsXml(null);
- assertNull(result);
-
- // Support an empty input
- String str = "";
- ByteArrayInputStream input = new ByteArrayInputStream(str.getBytes());
- result = mSource._findAlternateToolsXml(input);
- assertNull(result);
-
- // Support a random string as input
- str = "Some random string, not even HTML nor XML";
- input = new ByteArrayInputStream(str.getBytes());
- result = mSource._findAlternateToolsXml(input);
- assertNull(result);
-
- // Support an HTML input, e.g. a typical 404 document as returned by DL
- str = "<html><head> " +
- "<meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\"> " +
- "<title>404 Not Found</title> " + "<style><!--" + "body {font-family: arial,sans-serif}" +
- "div.nav { ... blah blah more css here ... color: green}" +
- "//--></style> " + "<script><!--" + "var rc=404;" + "//-->" + "</script> " + "</head> " +
- "<body text=#000000 bgcolor=#ffffff> " +
- "<table border=0 cellpadding=2 cellspacing=0 width=100%><tr><td rowspan=3 width=1% nowrap> " +
- "<b><font face=times color=#0039b6 size=10>G</font><font face=times color=#c41200 size=10>o</font><font face=times color=#f3c518 size=10>o</font><font face=times color=#0039b6 size=10>g</font><font face=times color=#30a72f size=10>l</font><font face=times color=#c41200 size=10>e</font> </b> " +
- "<td> </td></tr> " +
- "<tr><td bgcolor=\"#3366cc\"><font face=arial,sans-serif color=\"#ffffff\"><b>Error</b></td></tr> " +
- "<tr><td> </td></tr></table> " + "<blockquote> " + "<H1>Not Found</H1> " +
- "The requested URL <code>/404</code> was not found on this server." + " " + "<p> " +
- "</blockquote> " +
- "<table width=100% cellpadding=0 cellspacing=0><tr><td bgcolor=\"#3366cc\"><img alt=\"\" width=1 height=4></td></tr></table> " +
- "</body></html> ";
- input = new ByteArrayInputStream(str.getBytes());
- result = mSource._findAlternateToolsXml(input);
- assertNull(result);
-
- // Support some random XML document, totally unrelated to our sdk-repository schema
- str = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
- "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"" +
- " package=\"some.cool.app\" android:versionName=\"1.6.04\" android:versionCode=\"1604\">" +
- " <application android:label=\"@string/app_name\" android:icon=\"@drawable/icon\"/>" +
- "</manifest>";
- input = new ByteArrayInputStream(str.getBytes());
- result = mSource._findAlternateToolsXml(input);
- assertNull(result);
- }
-
- /**
- * Validate that findAlternateToolsXml doesn't work for addon even
- * when trying to load a valid addon xml.
- */
- public void testFindAlternateToolsXml_1() throws Exception {
- InputStream xmlStream = getTestResource("/com/android/sdklib/testdata/addon_sample_1.xml");
-
- Document result = mSource._findAlternateToolsXml(xmlStream);
- assertNull(result);
- }
-
- /**
- * Validate we can load a valid add-on schema version 1
- */
- public void testLoadAddonXml_1() throws Exception {
- InputStream xmlStream = getTestResource("/com/android/sdklib/testdata/addon_sample_1.xml");
-
- // guess the version from the XML document
- int version = mSource._getXmlSchemaVersion(xmlStream);
- assertEquals(1, version);
-
- Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };
- String[] validationError = new String[] { null };
- String url = "not-a-valid-url://" + SdkAddonConstants.URL_DEFAULT_FILENAME;
-
- String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound);
- assertEquals(Boolean.TRUE, validatorFound[0]);
- assertEquals(null, validationError[0]);
- assertEquals(SdkAddonConstants.getSchemaUri(1), uri);
-
- // Validation was successful, load the document
- MockMonitor monitor = new MockMonitor();
- Document doc = mSource._getDocument(xmlStream, monitor);
- assertNotNull(doc);
-
- // Get the packages
- assertTrue(mSource._parsePackages(doc, uri, monitor));
-
- assertEquals("Found My First add-on, Android API 1, revision 1\n" +
- "Found My Second add-on, Android API 2, revision 42\n" +
- "Found This add-on has no libraries, Android API 4, revision 3\n" +
- "Found G USB Driver, revision 43 (Obsolete)\n" +
- "Found Android Vendor Extra API Dep, revision 2 (Obsolete)\n" +
- "Found Unknown Extra, revision 2 (Obsolete)\n",
- monitor.getCapturedVerboseLog());
- assertEquals("", monitor.getCapturedLog());
- assertEquals("", monitor.getCapturedErrorLog());
-
- // check the packages we found... we expected to find 11 packages with each at least
- // one archive.
- Package[] pkgs = mSource.getPackages();
- assertEquals(6, pkgs.length);
- for (Package p : pkgs) {
- assertTrue(p.getArchives().length >= 1);
- }
-
- // 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) {
- ExtraPackage ep = (ExtraPackage) p;
- extraPaths.add(ep.getPath());
- extraVendors.add(ep.getVendorId() + "/" + ep.getVendorDisplay());
- extraInstall.add(ep.getInstallFolder(osSdkPath, sdkManager));
- }
- }
- assertEquals(
- "[extra_api_dep, usb_driver, extra0000005f]",
- Arrays.toString(extraPaths.toArray()));
- assertEquals(
- "[android_vendor/android_vendor, " +
- "g/g, " +
- "vendor0000005f/____]",
- Arrays.toString(extraVendors.toArray()));
- assertEquals(
- ("[SDK/extras/android_vendor/extra_api_dep, " +
- "SDK/extras/g/usb_driver, " +
- "SDK/extras/vendor0000005f/extra0000005f]").replace('/', File.separatorChar),
- Arrays.toString(extraInstall.toArray()));
- }
-
- /**
- * Validate we can still load a valid add-on schema version 2
- */
- public void testLoadAddonXml_2() throws Exception {
- InputStream xmlStream = getTestResource("/com/android/sdklib/testdata/addon_sample_2.xml");
-
- // guess the version from the XML document
- int version = mSource._getXmlSchemaVersion(xmlStream);
- assertEquals(2, version);
-
- Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };
- String[] validationError = new String[] { null };
- String url = "not-a-valid-url://" + SdkAddonConstants.URL_DEFAULT_FILENAME;
-
- String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound);
- assertEquals(Boolean.TRUE, validatorFound[0]);
- assertEquals(null, validationError[0]);
- assertEquals(SdkAddonConstants.getSchemaUri(2), uri);
-
- // Validation was successful, load the document
- MockMonitor monitor = new MockMonitor();
- Document doc = mSource._getDocument(xmlStream, monitor);
- assertNotNull(doc);
-
- // Get the packages
- assertTrue(mSource._parsePackages(doc, uri, monitor));
-
- assertEquals("Found My First add-on, Android API 1, revision 1\n" +
- "Found My Second add-on, Android API 2, revision 42\n" +
- "Found This add-on has no libraries, Android API 4, revision 3\n" +
- "Found G USB Driver, revision 43 (Obsolete)\n" +
- "Found Android Vendor Extra API Dep, revision 2 (Obsolete)\n" +
- "Found Unknown Extra, revision 2 (Obsolete)\n",
- monitor.getCapturedVerboseLog());
- assertEquals("", monitor.getCapturedLog());
- assertEquals("", monitor.getCapturedErrorLog());
-
- // check the packages we found... we expected to find 11 packages with each at least
- // one archive.
- // Note the order doesn't necessary match the one from the
- // assertEquald(getCapturedVerboseLog) because packages are sorted using the
- // Packages' sorting order, e.g. all platforms are sorted by descending API level, etc.
- Package[] pkgs = mSource.getPackages();
-
- assertEquals(6, pkgs.length);
- for (Package p : pkgs) {
- assertTrue(p.getArchives().length >= 1);
- }
-
- // Check the layoutlib of the platform packages.
- ArrayList<Pair<Integer, Integer>> layoutlibVers = new ArrayList<Pair<Integer,Integer>>();
- for (Package p : pkgs) {
- if (p instanceof AddonPackage) {
- layoutlibVers.add(((AddonPackage) p).getLayoutlibVersion());
- }
- }
- assertEquals(
- "[Pair [first=3, second=42], " + // for #3 "This add-on has no libraries"
- "Pair [first=0, second=0], " + // for #2 "My Second add-on"
- "Pair [first=5, second=0]]", // for #1 "My First add-on"
- Arrays.toString(layoutlibVers.toArray()));
-
-
- // 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) {
- ExtraPackage ep = (ExtraPackage) p;
- extraPaths.add(ep.getPath());
- extraVendors.add(ep.getVendorId() + "/" + ep.getVendorDisplay());
- extraInstall.add(ep.getInstallFolder(osSdkPath, sdkManager));
- }
- }
- assertEquals(
- "[extra_api_dep, usb_driver, extra0000005f]",
- Arrays.toString(extraPaths.toArray()));
- assertEquals(
- "[android_vendor/android_vendor, " +
- "g/g, " +
- "vendor0000005f/____]",
- Arrays.toString(extraVendors.toArray()));
- assertEquals(
- ("[SDK/extras/android_vendor/extra_api_dep, " +
- "SDK/extras/g/usb_driver, " +
- "SDK/extras/vendor0000005f/extra0000005f]").replace('/', File.separatorChar),
- Arrays.toString(extraInstall.toArray()));
- }
-
- /**
- * Validate we can load a valid add-on schema version 3
- */
- public void testLoadAddonXml_3() throws Exception {
- InputStream xmlStream = getTestResource("/com/android/sdklib/testdata/addon_sample_3.xml");
-
- // guess the version from the XML document
- int version = mSource._getXmlSchemaVersion(xmlStream);
- assertEquals(3, version);
-
- Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };
- String[] validationError = new String[] { null };
- String url = "not-a-valid-url://" + SdkAddonConstants.URL_DEFAULT_FILENAME;
-
- String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound);
- assertEquals(Boolean.TRUE, validatorFound[0]);
- assertEquals(null, validationError[0]);
- assertEquals(SdkAddonConstants.getSchemaUri(3), uri);
-
- // Validation was successful, load the document
- MockMonitor monitor = new MockMonitor();
- Document doc = mSource._getDocument(xmlStream, monitor);
- assertNotNull(doc);
-
- // Get the packages
- assertTrue(mSource._parsePackages(doc, uri, monitor));
-
- assertEquals("Found My First add-on, Android API 1, revision 1\n" +
- "Found My Second add-on, Android API 2, revision 42\n" +
- "Found This add-on has no libraries, Android API 4, revision 3\n" +
- "Found G USB Driver, revision 43 (Obsolete)\n" +
- "Found Android Vendor Extra API Dep, revision 2 (Obsolete)\n" +
- "Found Unknown Extra, revision 2 (Obsolete)\n",
- monitor.getCapturedVerboseLog());
- assertEquals("", monitor.getCapturedLog());
- assertEquals("", monitor.getCapturedErrorLog());
-
- // check the packages we found... we expected to find 6 packages with each at least
- // one archive.
- // Note the order doesn't necessary match the one from the
- // assertEquald(getCapturedVerboseLog) because packages are sorted using the
- // Packages' sorting order, e.g. all platforms are sorted by descending API level, etc.
- Package[] pkgs = mSource.getPackages();
-
- assertEquals(6, pkgs.length);
- for (Package p : pkgs) {
- assertTrue(p.getArchives().length >= 1);
- }
-
- // Check the layoutlib of the platform packages.
- ArrayList<Pair<Integer, Integer>> layoutlibVers = new ArrayList<Pair<Integer,Integer>>();
- for (Package p : pkgs) {
- if (p instanceof AddonPackage) {
- layoutlibVers.add(((AddonPackage) p).getLayoutlibVersion());
- }
- }
- assertEquals(
- "[Pair [first=3, second=42], " + // for #3 "This add-on has no libraries"
- "Pair [first=0, second=0], " + // for #2 "My Second add-on"
- "Pair [first=5, second=0]]", // for #1 "My First add-on"
- Arrays.toString(layoutlibVers.toArray()));
-
-
- // Check the extra packages: path, vendor, install folder, old-paths
-
- 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>();
- ArrayList<ArrayList<String>> extraFilePaths = new ArrayList<ArrayList<String>>();
- for (Package p : pkgs) {
- if (p instanceof ExtraPackage) {
- ExtraPackage ep = (ExtraPackage) p;
- // combine path and old-paths in the form "path [old_path1, old_path2]"
- extraPaths.add(ep.getPath() + " " + Arrays.toString(ep.getOldPaths()));
- extraVendors.add(ep.getVendorId() + "/" + ep.getVendorDisplay());
- extraInstall.add(ep.getInstallFolder(osSdkPath, sdkManager));
-
- ArrayList<String> filePaths = new ArrayList<String>();
- for (String filePath : ep.getProjectFiles()) {
- filePaths.add(filePath);
- }
- extraFilePaths.add(filePaths);
- }
- }
- assertEquals(
- "[extra_api_dep [path1, old_path2, oldPath3], " +
- "usb_driver [], " +
- "extra0000005f []]",
- Arrays.toString(extraPaths.toArray()));
- assertEquals(
- "[android_vendor/android_vendor, " +
- "g/g, " +
- "vendor0000005f/____]",
- Arrays.toString(extraVendors.toArray()));
- assertEquals(
- ("[SDK/extras/android_vendor/extra_api_dep, " +
- "SDK/extras/g/usb_driver, " +
- "SDK/extras/vendor0000005f/extra0000005f]").replace('/', File.separatorChar),
- Arrays.toString(extraInstall.toArray()));
- assertEquals(
- "[[v8/veggies_8.jar, root.jar, dir1/dir 2 with space/mylib.jar], " +
- "[], " +
- "[]]",
- Arrays.toString(extraFilePaths.toArray()));
- }
-
- /**
- * Validate we can load a valid add-on schema version 4
- */
- public void testLoadAddonXml_4() throws Exception {
- InputStream xmlStream = getTestResource("/com/android/sdklib/testdata/addon_sample_4.xml");
-
- // guess the version from the XML document
- int version = mSource._getXmlSchemaVersion(xmlStream);
- assertEquals(4, version);
-
- Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };
- String[] validationError = new String[] { null };
- String url = "not-a-valid-url://" + SdkAddonConstants.URL_DEFAULT_FILENAME;
-
- String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound);
- assertEquals(Boolean.TRUE, validatorFound[0]);
- assertEquals(null, validationError[0]);
- assertEquals(SdkAddonConstants.getSchemaUri(4), uri);
-
- // Validation was successful, load the document
- MockMonitor monitor = new MockMonitor();
- Document doc = mSource._getDocument(xmlStream, monitor);
- assertNotNull(doc);
-
- // Get the packages
- assertTrue(mSource._parsePackages(doc, uri, monitor));
-
- assertEquals("Found My First add-on, Android API 1, revision 1\n" +
- "Found My Second add-on, Android API 2, revision 42\n" +
- "Found This add-on has no libraries, Android API 4, revision 3\n" +
- "Found Random name, not an id!, revision 43 (Obsolete)\n" +
- "Found Yet another extra, by Android, revision 2\n" +
- "Found . -..- - .-. .-, revision 2 (Obsolete)\n",
- monitor.getCapturedVerboseLog());
- assertEquals("", monitor.getCapturedLog());
- assertEquals("", monitor.getCapturedErrorLog());
-
- // check the packages we found... we expected to find 6 packages with each at least
- // one archive.
- // Note the order doesn't necessary match the one from the
- // assertEquald(getCapturedVerboseLog) because packages are sorted using the
- // Packages' sorting order, e.g. all platforms are sorted by descending API level, etc.
- Package[] pkgs = mSource.getPackages();
-
- assertEquals(6, pkgs.length);
- for (Package p : pkgs) {
- assertTrue(p.getArchives().length >= 1);
- }
-
- // Check the addon packages: vendor/name id vs display
- ArrayList<String> addonNames = new ArrayList<String>();
- ArrayList<String> addonVendors = new ArrayList<String>();
- for (Package p : pkgs) {
- if (p instanceof AddonPackage) {
- AddonPackage ap = (AddonPackage) p;
- addonNames.add(ap.getNameId() + "/" + ap.getDisplayName());
- addonVendors.add(ap.getVendorId() + "/" + ap.getDisplayVendor());
- }
- }
- // Addons are sorted by addon/vendor id and thus their order differs from the
- // XML or the parsed package list.
- assertEquals(
- "[no_libs/This add-on has no libraries, " +
- "My_Second_add-on/My Second add-on, " +
- "My_First_add-on/My First add-on]",
- Arrays.toString(addonNames.toArray()));
- assertEquals(
- "[Joe_Bar/Joe Bar, " +
- "John_Deer/John Deer, " +
- "John_Doe/John Doe]",
- Arrays.toString(addonVendors.toArray()));
-
- // Check the layoutlib of the platform packages.
- ArrayList<Pair<Integer, Integer>> layoutlibVers = new ArrayList<Pair<Integer,Integer>>();
- for (Package p : pkgs) {
- if (p instanceof AddonPackage) {
- layoutlibVers.add(((AddonPackage) p).getLayoutlibVersion());
- }
- }
- assertEquals(
- "[Pair [first=3, second=42], " + // for #3 "This add-on has no libraries"
- "Pair [first=0, second=0], " + // for #2 "My Second add-on"
- "Pair [first=5, second=0]]", // for #1 "My First add-on"
- Arrays.toString(layoutlibVers.toArray()));
-
-
- // Check the extra packages: path, vendor, install folder, old-paths
- 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>();
- ArrayList<ArrayList<String>> extraFilePaths = new ArrayList<ArrayList<String>>();
- for (Package p : pkgs) {
- if (p instanceof ExtraPackage) {
- ExtraPackage ep = (ExtraPackage) p;
- // combine path and old-paths in the form "path [old_path1, old_path2]"
- extraPaths.add(ep.getPath() + " " + Arrays.toString(ep.getOldPaths()));
- extraVendors.add(ep.getVendorId() + "/" + ep.getVendorDisplay());
- extraInstall.add(ep.getInstallFolder(osSdkPath, sdkManager));
-
- ArrayList<String> filePaths = new ArrayList<String>();
- for (String filePath : ep.getProjectFiles()) {
- filePaths.add(filePath);
- }
- extraFilePaths.add(filePaths);
- }
- }
- // Extras are sorted by vendor-id/path and thus their order differs from the
- // XML or the parsed package list.
- assertEquals(
- "[extra0000005f [], " + // for extra #3
- "extra_api_dep [path1, old_path2, oldPath3], " + // for extra #2
- "usb_driver []]", // for extra #1
- Arrays.toString(extraPaths.toArray()));
- assertEquals(
- "[____/____, " +
- "android_vendor/Android Vendor, " +
- "cyclop/The big bus]",
- Arrays.toString(extraVendors.toArray()));
- assertEquals(
- ("[SDK/extras/____/extra0000005f, " +
- "SDK/extras/android_vendor/extra_api_dep, " +
- "SDK/extras/cyclop/usb_driver]").replace('/', File.separatorChar),
- Arrays.toString(extraInstall.toArray()));
- assertEquals(
- "[[], " +
- "[v8/veggies_8.jar, root.jar, dir1/dir 2 with space/mylib.jar], " +
- "[]]",
- Arrays.toString(extraFilePaths.toArray()));
- }
-
- /**
- * Validate we can load a valid add-on schema version 5
- */
- public void testLoadAddonXml_5() throws Exception {
- InputStream xmlStream = getTestResource("/com/android/sdklib/testdata/addon_sample_5.xml");
-
- // guess the version from the XML document
- int version = mSource._getXmlSchemaVersion(xmlStream);
- assertEquals(5, version);
-
- Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };
- String[] validationError = new String[] { null };
- String url = "not-a-valid-url://" + SdkAddonConstants.URL_DEFAULT_FILENAME;
-
- String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound);
- assertEquals(Boolean.TRUE, validatorFound[0]);
- assertEquals(null, validationError[0]);
- assertEquals(SdkAddonConstants.getSchemaUri(5), uri);
-
- // Validation was successful, load the document
- MockMonitor monitor = new MockMonitor();
- Document doc = mSource._getDocument(xmlStream, monitor);
- assertNotNull(doc);
-
- // Get the packages
- assertTrue(mSource._parsePackages(doc, uri, monitor));
-
- assertEquals("Found My First add-on, Android API 1, revision 1\n" +
- "Found My Second add-on, Android API 2, revision 42\n" +
- "Found This add-on has no libraries, Android API 4, revision 3\n" +
- "Found Random name, not an id!, revision 43 (Obsolete)\n" +
- "Found Yet another extra, by Android, revision 2\n" +
- "Found . -..- - .-. .-, revision 2 (Obsolete)\n",
- monitor.getCapturedVerboseLog());
- assertEquals("", monitor.getCapturedLog());
- assertEquals("", monitor.getCapturedErrorLog());
-
- // check the packages we found... we expected to find 6 packages with each at least
- // one archive.
- // Note the order doesn't necessary match the one from the
- // assertEquald(getCapturedVerboseLog) because packages are sorted using the
- // Packages' sorting order, e.g. all platforms are sorted by descending API level, etc.
- Package[] pkgs = mSource.getPackages();
-
- assertEquals(6, pkgs.length);
- for (Package p : pkgs) {
- assertTrue(p.getArchives().length >= 1);
- }
-
- // Check the addon packages: vendor/name id vs display
- ArrayList<String> addonNames = new ArrayList<String>();
- ArrayList<String> addonVendors = new ArrayList<String>();
- for (Package p : pkgs) {
- if (p instanceof AddonPackage) {
- AddonPackage ap = (AddonPackage) p;
- addonNames.add(ap.getNameId() + "/" + ap.getDisplayName());
- addonVendors.add(ap.getVendorId() + "/" + ap.getDisplayVendor());
- }
- }
- // Addons are sorted by addon/vendor id and thus their order differs from the
- // XML or the parsed package list.
- assertEquals(
- "[no_libs/This add-on has no libraries, " +
- "My_Second_add-on/My Second add-on, " +
- "My_First_add-on/My First add-on]",
- Arrays.toString(addonNames.toArray()));
- assertEquals(
- "[Joe_Bar/Joe Bar, " +
- "John_Deer/John Deer, " +
- "John_Doe/John Doe]",
- Arrays.toString(addonVendors.toArray()));
-
- // Check the layoutlib of the platform packages.
- ArrayList<Pair<Integer, Integer>> layoutlibVers = new ArrayList<Pair<Integer,Integer>>();
- for (Package p : pkgs) {
- if (p instanceof AddonPackage) {
- layoutlibVers.add(((AddonPackage) p).getLayoutlibVersion());
- }
- }
- assertEquals(
- "[Pair [first=3, second=42], " + // for #3 "This add-on has no libraries"
- "Pair [first=0, second=0], " + // for #2 "My Second add-on"
- "Pair [first=5, second=0]]", // for #1 "My First add-on"
- Arrays.toString(layoutlibVers.toArray()));
-
-
- // Check the extra packages: path, vendor, install folder, old-paths
- 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>();
- ArrayList<ArrayList<String>> extraFilePaths = new ArrayList<ArrayList<String>>();
- for (Package p : pkgs) {
- if (p instanceof ExtraPackage) {
- ExtraPackage ep = (ExtraPackage) p;
- // combine path and old-paths in the form "path [old_path1, old_path2]"
- extraPaths.add(ep.getPath() + " " + Arrays.toString(ep.getOldPaths()));
- extraVendors.add(ep.getVendorId() + "/" + ep.getVendorDisplay());
- extraInstall.add(ep.getInstallFolder(osSdkPath, sdkManager));
-
- ArrayList<String> filePaths = new ArrayList<String>();
- for (String filePath : ep.getProjectFiles()) {
- filePaths.add(filePath);
- }
- extraFilePaths.add(filePaths);
- }
- }
- // Extras are sorted by vendor-id/path and thus their order differs from the
- // XML or the parsed package list.
- assertEquals(
- "[extra0000005f [], " + // for extra #3
- "extra_api_dep [path1, old_path2, oldPath3], " + // for extra #2
- "usb_driver []]", // for extra #1
- Arrays.toString(extraPaths.toArray()));
- assertEquals(
- "[____/____, " +
- "android_vendor/Android Vendor, " +
- "cyclop/The big bus]",
- Arrays.toString(extraVendors.toArray()));
- assertEquals(
- ("[SDK/extras/____/extra0000005f, " +
- "SDK/extras/android_vendor/extra_api_dep, " +
- "SDK/extras/cyclop/usb_driver]").replace('/', File.separatorChar),
- Arrays.toString(extraInstall.toArray()));
- assertEquals(
- "[[], " +
- "[v8/veggies_8.jar, root.jar, dir1/dir 2 with space/mylib.jar], " +
- "[]]",
- Arrays.toString(extraFilePaths.toArray()));
-
-
- // Check the min-tools-rev
- ArrayList<String> minToolsRevs = new ArrayList<String>();
- for (Package p : pkgs) {
- if (p instanceof IMinToolsDependency) {
- minToolsRevs.add(p.getListDescription() + ": " +
- ((IMinToolsDependency) p).getMinToolsRevision().toShortString());
- }
- }
- assertEquals(
- "[. -..- - .-. .- (Obsolete): 3.0.1, " +
- "Yet another extra, by Android: 3, " +
- "Random name, not an id! (Obsolete): 3.2.1 rc42]",
- Arrays.toString(minToolsRevs.toArray()));
- }
-
- /**
- * Returns an SdkLib file resource as a {@link ByteArrayInputStream},
- * which has the advantage that we can use {@link InputStream#reset()} on it
- * at any time to read it multiple times.
- * <p/>
- * The default for getResourceAsStream() is to return a {@link FileInputStream} that
- * does not support reset(), yet we need it in the tested code.
- *
- * @throws IOException if some I/O read fails
- */
- private ByteArrayInputStream getTestResource(String filename) throws IOException {
- InputStream xmlStream = this.getClass().getResourceAsStream(filename);
-
- try {
- byte[] data = new byte[8192];
- int offset = 0;
- int n;
-
- while ((n = xmlStream.read(data, offset, data.length - offset)) != -1) {
- offset += n;
-
- if (offset == data.length) {
- byte[] newData = new byte[offset + 8192];
- System.arraycopy(data, 0, newData, 0, offset);
- data = newData;
- }
- }
-
- return new ByteArrayInputStream(data, 0, offset);
- } finally {
- if (xmlStream != null) {
- xmlStream.close();
- }
- }
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/sources/SdkRepoSourceTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/sources/SdkRepoSourceTest.java
deleted file mode 100755
index 9df0bfd..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/sources/SdkRepoSourceTest.java
+++ /dev/null
@@ -1,1063 +0,0 @@
-/*
- * Copyright (C) 2009 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.sources;
-
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.MockEmptySdkManager;
-import com.android.sdklib.internal.repository.MockMonitor;
-import com.android.sdklib.internal.repository.packages.ExtraPackage;
-import com.android.sdklib.internal.repository.packages.IMinPlatformToolsDependency;
-import com.android.sdklib.internal.repository.packages.IMinToolsDependency;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.internal.repository.packages.PlatformPackage;
-import com.android.sdklib.internal.repository.packages.PlatformToolPackage;
-import com.android.sdklib.internal.repository.packages.SourcePackage;
-import com.android.sdklib.internal.repository.packages.SystemImagePackage;
-import com.android.sdklib.internal.repository.packages.ToolPackage;
-import com.android.sdklib.internal.repository.sources.SdkRepoSource;
-import com.android.sdklib.repository.SdkRepoConstants;
-import com.android.utils.Pair;
-
-import org.w3c.dom.Document;
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-import junit.framework.TestCase;
-
-/**
- * Tests for {@link SdkRepoSource}
- */
-public class SdkRepoSourceTest extends TestCase {
-
- /**
- * An internal helper class to give us visibility to the protected members we want
- * to test.
- */
- private static class MockSdkRepoSource extends SdkRepoSource {
- public MockSdkRepoSource() {
- super("fake-url", null /*uiName*/);
- }
-
- /**
- * Returns a pair of Document (which can be null) and the captured stdout/stderr output
- * (which is the empty string by default).
- */
- public Pair<Document, String> _findAlternateToolsXml(InputStream xml) throws IOException {
-
- final StringBuilder output = new StringBuilder();
- Document doc = super.findAlternateToolsXml(xml, new ErrorHandler() {
- @Override
- public void warning(SAXParseException exception) throws SAXException {
- output.append("WARN: " + exception.getMessage()).append('\n');
- }
-
- @Override
- public void fatalError(SAXParseException exception) throws SAXException {
- output.append("FATAL: " + exception.getMessage()).append('\n');
- }
-
- @Override
- public void error(SAXParseException exception) throws SAXException {
- output.append("ERROR: " + exception.getMessage()).append('\n');
- }
- });
-
- return Pair.of(doc, output.toString());
- }
-
- public boolean _parsePackages(Document doc, String nsUri, ITaskMonitor monitor) {
- return super.parsePackages(doc, nsUri, monitor);
- }
-
- public int _getXmlSchemaVersion(InputStream xml) {
- return super.getXmlSchemaVersion(xml);
- }
-
- public String _validateXml(InputStream xml, String url, int version,
- String[] outError, Boolean[] validatorFound) {
- return super.validateXml(xml, url, version, outError, validatorFound);
- }
-
- public Document _getDocument(InputStream xml, ITaskMonitor monitor) {
- return super.getDocument(xml, monitor);
- }
-
- }
-
- private MockSdkRepoSource mSource;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
-
- mSource = new MockSdkRepoSource();
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
-
- mSource = null;
- }
-
- public void testFindAlternateToolsXml_Errors() throws Exception {
- // Support null as input
- Pair<Document, String> result = mSource._findAlternateToolsXml(null);
- assertEquals(Pair.of((Document) null, ""), result);
-
- // Support an empty input
- String str = "";
- ByteArrayInputStream input = new ByteArrayInputStream(str.getBytes());
- result = mSource._findAlternateToolsXml(input);
- assertEquals(
- Pair.of((Document) null, "FATAL: Premature end of file.\n"),
- result);
-
- // Support a random string as input
- str = "Some random string, not even HTML nor XML";
- input = new ByteArrayInputStream(str.getBytes());
- result = mSource._findAlternateToolsXml(input);
- assertEquals(
- Pair.of((Document) null, "FATAL: Content is not allowed in prolog.\n"),
- result);
-
- // Support an HTML input, e.g. a typical 404 document as returned by DL
- str = "<html><head> " +
- "<meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\"> " +
- "<title>404 Not Found</title> " + "<style><!--" + "body {font-family: arial,sans-serif}" +
- "div.nav { ... blah blah more css here ... color: green}" +
- "//--></style> " + "<script><!--" + "var rc=404;" + "//-->" + "</script> " + "</head> " +
- "<body text=#000000 bgcolor=#ffffff> " +
- "<table border=0 cellpadding=2 cellspacing=0 width=100%><tr><td rowspan=3 width=1% nowrap> " +
- "<b><font face=times color=#0039b6 size=10>G</font><font face=times color=#c41200 size=10>o</font><font face=times color=#f3c518 size=10>o</font><font face=times color=#0039b6 size=10>g</font><font face=times color=#30a72f size=10>l</font><font face=times color=#c41200 size=10>e</font> </b> " +
- "<td> </td></tr> " +
- "<tr><td bgcolor=\"#3366cc\"><font face=arial,sans-serif color=\"#ffffff\"><b>Error</b></td></tr> " +
- "<tr><td> </td></tr></table> " + "<blockquote> " + "<H1>Not Found</H1> " +
- "The requested URL <code>/404</code> was not found on this server." + " " + "<p> " +
- "</blockquote> " +
- "<table width=100% cellpadding=0 cellspacing=0><tr><td bgcolor=\"#3366cc\"><img alt=\"\" width=1 height=4></td></tr></table> " +
- "</body></html> ";
- input = new ByteArrayInputStream(str.getBytes());
- result = mSource._findAlternateToolsXml(input);
- assertEquals(
- Pair.of((Document) null, "FATAL: The element type \"meta\" must be terminated by the matching end-tag \"</meta>\".\n"),
- result);
-
- // Support some random XML document, totally unrelated to our sdk-repository schema
- str = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
- "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"" +
- " package=\"some.cool.app\" android:versionName=\"1.6.04\" android:versionCode=\"1604\">" +
- " <application android:label=\"@string/app_name\" android:icon=\"@drawable/icon\"/>" +
- "</manifest>";
- input = new ByteArrayInputStream(str.getBytes());
- result = mSource._findAlternateToolsXml(input);
- assertEquals(Pair.of((Document) null, ""), result);
- }
-
- /**
- * Validate we can load a new schema version 3 using the "alternate future tool" mode.
- */
- public void testFindAlternateToolsXml_3() throws Exception {
- InputStream xmlStream = getTestResource(
- "/com/android/sdklib/testdata/repository_sample_3.xml");
-
- Pair<Document, String> result = mSource._findAlternateToolsXml(xmlStream);
- assertNotNull(result.getFirst());
- assertEquals("", result.getSecond());
- MockMonitor monitor = new MockMonitor();
- assertTrue(mSource._parsePackages(result.getFirst(), SdkRepoConstants.NS_URI, monitor));
-
- assertEquals("Found Android SDK Tools, revision 1\n" +
- "Found Android SDK Tools, revision 42\n" +
- "Found Android SDK Platform-tools, revision 3\n",
- monitor.getCapturedVerboseLog());
- assertEquals("", monitor.getCapturedLog());
- assertEquals("", monitor.getCapturedErrorLog());
-
- // check the packages we found... we expected to find 2 tool packages and 1
- // platform-tools package, with at least 1 archive each.
- Package[] pkgs = mSource.getPackages();
- assertEquals(3, pkgs.length);
- for (Package p : pkgs) {
- assertTrue((p instanceof ToolPackage) || (p instanceof PlatformToolPackage));
- assertTrue(p.getArchives().length >= 1);
- }
- }
-
- /**
- * Validate we can still load an old repository in schema version 1
- */
- public void testLoadXml_1() throws Exception {
- InputStream xmlStream = getTestResource(
- "/com/android/sdklib/testdata/repository_sample_1.xml");
-
- // guess the version from the XML document
- int version = mSource._getXmlSchemaVersion(xmlStream);
- assertEquals(1, version);
-
- Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };
- String[] validationError = new String[] { null };
- String url = "not-a-valid-url://" + SdkRepoConstants.URL_DEFAULT_FILENAME;
-
- String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound);
- assertEquals(Boolean.TRUE, validatorFound[0]);
- assertEquals(null, validationError[0]);
- assertEquals(SdkRepoConstants.getSchemaUri(1), uri);
-
- // Validation was successful, load the document
- MockMonitor monitor = new MockMonitor();
- Document doc = mSource._getDocument(xmlStream, monitor);
- assertNotNull(doc);
-
- // Get the packages
- assertTrue(mSource._parsePackages(doc, uri, monitor));
-
- assertEquals("Found SDK Platform Android 1.0, API 1, revision 3\n" +
- "Found Documentation for Android SDK, API 1, revision 1\n" +
- "Found My First add-on, Android API 1, revision 1\n" +
- "Found SDK Platform Android 1.1, API 2, revision 12\n" +
- "Found My Second add-on, Android API 2, revision 42\n" +
- "Found SDK Platform Android Pastry Preview, revision 3\n" +
- "Found Android SDK Tools, revision 1\n" +
- "Found Documentation for Android SDK, API 2, revision 42\n" +
- "Found Android SDK Tools, revision 42\n" +
- "Found This add-on has no libraries, Android API 4, revision 3\n" +
- "Found Usb Driver, revision 43\n",
- monitor.getCapturedVerboseLog());
- assertEquals("", monitor.getCapturedLog());
- assertEquals("", monitor.getCapturedErrorLog());
-
- // check the packages we found... we expected to find 11 packages with each at least
- // one archive.
- Package[] pkgs = mSource.getPackages();
- assertEquals(11, pkgs.length);
- for (Package p : pkgs) {
- assertTrue(p.getArchives().length >= 1);
- }
-
- // 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) {
- ExtraPackage ep = (ExtraPackage) p;
- extraPaths.add(ep.getPath());
- extraVendors.add(ep.getVendorId() + "/" + ep.getVendorDisplay());
- extraInstall.add(ep.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()));
- }
-
- /**
- * Validate we can still load an old repository in schema version 2
- */
- public void testLoadXml_2() throws Exception {
- InputStream xmlStream = getTestResource(
- "/com/android/sdklib/testdata/repository_sample_2.xml");
-
- // guess the version from the XML document
- int version = mSource._getXmlSchemaVersion(xmlStream);
- assertEquals(2, version);
-
- Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };
- String[] validationError = new String[] { null };
- String url = "not-a-valid-url://" + SdkRepoConstants.URL_DEFAULT_FILENAME;
-
- String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound);
- assertEquals(Boolean.TRUE, validatorFound[0]);
- assertEquals(null, validationError[0]);
- assertEquals(SdkRepoConstants.getSchemaUri(2), uri);
-
- // Validation was successful, load the document
- MockMonitor monitor = new MockMonitor();
- Document doc = mSource._getDocument(xmlStream, monitor);
- assertNotNull(doc);
-
- // Get the packages
- assertTrue(mSource._parsePackages(doc, uri, monitor));
-
- assertEquals("Found SDK Platform Android 1.0, API 1, revision 3\n" +
- "Found Documentation for Android SDK, API 1, revision 1\n" +
- "Found My First add-on, Android API 1, revision 1\n" +
- "Found SDK Platform Android 1.1, API 2, revision 12\n" +
- "Found My Second add-on, Android API 2, revision 42\n" +
- "Found SDK Platform Android Pastry Preview, revision 3\n" +
- "Found Android SDK Tools, revision 1\n" +
- "Found Documentation for Android SDK, API 2, revision 42\n" +
- "Found Android SDK Tools, revision 42\n" +
- "Found This add-on has no libraries, Android API 4, revision 3\n" +
- "Found Usb Driver, revision 43 (Obsolete)\n" +
- "Found Extra API Dep, revision 2 (Obsolete)\n" +
- "Found Samples for SDK API 14, revision 24 (Obsolete)\n",
- monitor.getCapturedVerboseLog());
- assertEquals("", monitor.getCapturedLog());
- assertEquals("", monitor.getCapturedErrorLog());
-
- // check the packages we found... we expected to find 13 packages with each at least
- // one archive.
- Package[] pkgs = mSource.getPackages();
- assertEquals(13, pkgs.length);
- for (Package p : pkgs) {
- assertTrue(p.getArchives().length >= 1);
- }
-
- // 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) {
- ExtraPackage ep = (ExtraPackage) p;
- extraPaths.add(ep.getPath());
- extraVendors.add(ep.getVendorId() + "/" + ep.getVendorDisplay());
- extraInstall.add(ep.getInstallFolder(osSdkPath, sdkManager));
- }
- }
- assertEquals(
- "[extra_api_dep, usb_driver]",
- Arrays.toString(extraPaths.toArray()));
- assertEquals(
- "[/, /]",
- Arrays.toString(extraVendors.toArray()));
- assertEquals(
- "[SDK/extras/extra_api_dep, SDK/extras/usb_driver]".replace('/', File.separatorChar),
- Arrays.toString(extraInstall.toArray()));
- }
-
- /**
- * Validate what we can load from repository in schema version 3
- */
- public void testLoadXml_3() throws Exception {
- InputStream xmlStream = getTestResource(
- "/com/android/sdklib/testdata/repository_sample_3.xml");
-
- // guess the version from the XML document
- int version = mSource._getXmlSchemaVersion(xmlStream);
- assertEquals(3, version);
-
- Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };
- String[] validationError = new String[] { null };
- String url = "not-a-valid-url://" + SdkRepoConstants.URL_DEFAULT_FILENAME;
-
- String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound);
- assertEquals(Boolean.TRUE, validatorFound[0]);
- assertEquals(null, validationError[0]);
- assertEquals(SdkRepoConstants.getSchemaUri(3), uri);
-
- // Validation was successful, load the document
- MockMonitor monitor = new MockMonitor();
- Document doc = mSource._getDocument(xmlStream, monitor);
- assertNotNull(doc);
-
- // Get the packages
- assertTrue(mSource._parsePackages(doc, uri, monitor));
-
- assertEquals("Found SDK Platform Android 1.0, API 1, revision 3\n" +
- "Found Documentation for Android SDK, API 1, revision 1\n" +
- "Found SDK Platform Android 1.1, API 2, revision 12\n" +
- "Found SDK Platform Android Pastry Preview, revision 3\n" +
- "Found Android SDK Tools, revision 1\n" +
- "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, revision 43 (Obsolete)\n" +
- "Found Android Vendor Extra API Dep, revision 2 (Obsolete)\n" +
- "Found Samples for SDK API 14, revision 24 (Obsolete)\n",
- monitor.getCapturedVerboseLog());
- assertEquals("", monitor.getCapturedLog());
- assertEquals("", monitor.getCapturedErrorLog());
-
- // check the packages we found... we expected to find 13 packages with each at least
- // one archive.
- Package[] pkgs = mSource.getPackages();
- assertEquals(11, pkgs.length);
- for (Package p : pkgs) {
- assertTrue(p.getArchives().length >= 1);
- }
-
- // 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) {
- ExtraPackage ep = (ExtraPackage) p;
- extraPaths.add(ep.getPath());
- extraVendors.add(ep.getVendorId() + "/" + ep.getVendorDisplay());
- extraInstall.add(ep.getInstallFolder(osSdkPath, sdkManager));
- }
- }
- assertEquals(
- "[extra_api_dep, usb_driver]",
- Arrays.toString(extraPaths.toArray()));
- assertEquals(
- "[android_vendor/android_vendor, a/a]",
- Arrays.toString(extraVendors.toArray()));
- assertEquals(
- "[SDK/extras/android_vendor/extra_api_dep, SDK/extras/a/usb_driver]"
- .replace('/', File.separatorChar),
- Arrays.toString(extraInstall.toArray()));
- }
-
- /**
- * Validate what we can load from repository in schema version 4
- */
- public void testLoadXml_4() throws Exception {
- InputStream xmlStream = getTestResource(
- "/com/android/sdklib/testdata/repository_sample_4.xml");
-
- // guess the version from the XML document
- int version = mSource._getXmlSchemaVersion(xmlStream);
- assertEquals(4, version);
-
- Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };
- String[] validationError = new String[] { null };
- String url = "not-a-valid-url://" + SdkRepoConstants.URL_DEFAULT_FILENAME;
-
- String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound);
- assertEquals(Boolean.TRUE, validatorFound[0]);
- assertEquals(null, validationError[0]);
- assertEquals(SdkRepoConstants.getSchemaUri(4), uri);
-
- // Validation was successful, load the document
- MockMonitor monitor = new MockMonitor();
- Document doc = mSource._getDocument(xmlStream, monitor);
- assertNotNull(doc);
-
- // Get the packages
- assertTrue(mSource._parsePackages(doc, uri, monitor));
-
- assertEquals("Found SDK Platform Android 1.0, API 1, revision 3\n" +
- "Found Documentation for Android SDK, API 1, revision 1\n" +
- "Found SDK Platform Android 1.1, API 2, revision 12\n" +
- "Found SDK Platform Android Pastry Preview, revision 3\n" +
- "Found Android SDK Tools, revision 1\n" +
- "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, revision 43 (Obsolete)\n" +
- "Found Android Vendor Extra API Dep, revision 2 (Obsolete)\n" +
- "Found Samples for SDK API 14, revision 24 (Obsolete)\n",
- monitor.getCapturedVerboseLog());
- assertEquals("", monitor.getCapturedLog());
- assertEquals("", monitor.getCapturedErrorLog());
-
- // check the packages we found... we expected to find 13 packages with each at least
- // one archive.
- // Note the order doesn't necessary match the one from the
- // assertEquald(getCapturedVerboseLog) because packages are sorted using the
- // Packages' sorting order, e.g. all platforms are sorted by descending API level, etc.
- Package[] pkgs = mSource.getPackages();
-
- assertEquals(11, pkgs.length);
- for (Package p : pkgs) {
- assertTrue(p.getArchives().length >= 1);
- }
-
- // Check the layoutlib of the platform packages.
- ArrayList<Pair<Integer, Integer>> layoutlibVers = new ArrayList<Pair<Integer,Integer>>();
- for (Package p : pkgs) {
- if (p instanceof PlatformPackage) {
- layoutlibVers.add(((PlatformPackage) p).getLayoutlibVersion());
- }
- }
- assertEquals(
- "[Pair [first=1, second=0], " + // platform API 5 preview
- "Pair [first=5, second=31415], " + // platform API 2
- "Pair [first=5, second=0]]", // platform API 1
- Arrays.toString(layoutlibVers.toArray()));
-
- // Check the extra packages path, vendor, install folder and project-files
-
- 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>();
- ArrayList<ArrayList<String>> extraFilePaths = new ArrayList<ArrayList<String>>();
- for (Package p : pkgs) {
- if (p instanceof ExtraPackage) {
- ExtraPackage ep = (ExtraPackage) p;
- extraPaths.add(ep.getPath());
- extraVendors.add(ep.getVendorId() + "/" + ep.getVendorDisplay());
- extraInstall.add(ep.getInstallFolder(osSdkPath, sdkManager));
-
- ArrayList<String> filePaths = new ArrayList<String>();
- for (String filePath : ep.getProjectFiles()) {
- filePaths.add(filePath);
- }
- extraFilePaths.add(filePaths);
- }
- }
- assertEquals(
- "[extra_api_dep, usb_driver]",
- Arrays.toString(extraPaths.toArray()));
- assertEquals(
- "[android_vendor/android_vendor, a/a]",
- Arrays.toString(extraVendors.toArray()));
- assertEquals(
- "[SDK/extras/android_vendor/extra_api_dep, SDK/extras/a/usb_driver]"
- .replace('/', File.separatorChar),
- Arrays.toString(extraInstall.toArray()));
- assertEquals(
- "[[v8/veggies_8.jar, readme.txt, dir1/dir 2 with space/mylib.jar], " +
- "[]]",
- Arrays.toString(extraFilePaths.toArray()));
- }
-
- /**
- * Validate what we can load from repository in schema version 5
- */
- public void testLoadXml_5() throws Exception {
- InputStream xmlStream = getTestResource(
- "/com/android/sdklib/testdata/repository_sample_5.xml");
-
- // guess the version from the XML document
- int version = mSource._getXmlSchemaVersion(xmlStream);
- assertEquals(5, version);
-
- Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };
- String[] validationError = new String[] { null };
- String url = "not-a-valid-url://" + SdkRepoConstants.URL_DEFAULT_FILENAME;
-
- String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound);
- assertEquals(Boolean.TRUE, validatorFound[0]);
- assertEquals(null, validationError[0]);
- assertEquals(SdkRepoConstants.getSchemaUri(5), uri);
-
- // Validation was successful, load the document
- MockMonitor monitor = new MockMonitor();
- Document doc = mSource._getDocument(xmlStream, monitor);
- assertNotNull(doc);
-
- // Get the packages
- assertTrue(mSource._parsePackages(doc, uri, monitor));
-
- assertEquals("Found SDK Platform Android 1.0, API 1, revision 3\n" +
- "Found Documentation for Android SDK, API 1, revision 1\n" +
- "Found Sources for Android SDK, API 1, revision 1\n" +
- "Found SDK Platform Android 1.1, API 2, revision 12\n" +
- "Found Intel x86 Atom System Image, Android API 2, revision 1\n" +
- "Found ARM EABI v7a System Image, Android API 2, revision 2\n" +
- "Found Sources for Android SDK, API 2, revision 2\n" +
- "Found SDK Platform Android Pastry Preview, revision 3\n" +
- "Found Android SDK Tools, revision 1\n" +
- "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, revision 43 (Obsolete)\n" +
- "Found Android Vendor Extra API Dep, revision 2 (Obsolete)\n" +
- "Found Samples for SDK API 14, revision 24 (Obsolete)\n" +
- "Found ARM EABI System Image, Android API 42, revision 12\n" +
- "Found Sources for Android SDK, API 42, revision 12\n",
- monitor.getCapturedVerboseLog());
- assertEquals("", monitor.getCapturedLog());
- assertEquals("", monitor.getCapturedErrorLog());
-
- // check the packages we found... we expected to find 13 packages with each at least
- // one archive.
- // Note the order doesn't necessary match the one from the
- // assertEquald(getCapturedVerboseLog) because packages are sorted using the
- // Packages' sorting order, e.g. all platforms are sorted by descending API level, etc.
- Package[] pkgs = mSource.getPackages();
-
- assertEquals(17, pkgs.length);
- for (Package p : pkgs) {
- assertTrue(p.getArchives().length >= 1);
- }
-
- // Check the layoutlib & included-abi of the platform packages.
- ArrayList<Pair<Integer, Integer>> layoutlibVers = new ArrayList<Pair<Integer,Integer>>();
- ArrayList<String> includedAbi = new ArrayList<String>();
- for (Package p : pkgs) {
- if (p instanceof PlatformPackage) {
- layoutlibVers.add(((PlatformPackage) p).getLayoutlibVersion());
- String abi = ((PlatformPackage) p).getIncludedAbi();
- includedAbi.add(abi == null ? "(null)" : abi);
- }
- }
- assertEquals(
- "[Pair [first=1, second=0], " + // platform API 5 preview
- "Pair [first=5, second=31415], " + // platform API 2
- "Pair [first=5, second=0]]", // platform API 1
- Arrays.toString(layoutlibVers.toArray()));
- assertEquals(
- "[(null), " + // platform API 5 preview
- "x86, " + // platform API 2
- "armeabi]", // platform API 1
- Arrays.toString(includedAbi.toArray()));
-
- // Check the extra packages path, vendor, install folder, project-files, old-paths
-
- 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>();
- ArrayList<ArrayList<String>> extraFilePaths = new ArrayList<ArrayList<String>>();
- for (Package p : pkgs) {
- if (p instanceof ExtraPackage) {
- ExtraPackage ep = (ExtraPackage) p;
- // combine path and old-paths in the form "path [old_path1, old_path2]"
- extraPaths.add(ep.getPath() + " " + Arrays.toString(ep.getOldPaths()));
- extraVendors.add(ep.getVendorId() + "/" + ep.getVendorDisplay());
- extraInstall.add(ep.getInstallFolder(osSdkPath, sdkManager));
-
- ArrayList<String> filePaths = new ArrayList<String>();
- for (String filePath : ep.getProjectFiles()) {
- filePaths.add(filePath);
- }
- extraFilePaths.add(filePaths);
- }
- }
- assertEquals(
- "[extra_api_dep [path1, old_path2, oldPath3], " +
- "usb_driver []]",
- Arrays.toString(extraPaths.toArray()));
- assertEquals(
- "[android_vendor/android_vendor, " +
- "a/a]",
- Arrays.toString(extraVendors.toArray()));
- assertEquals(
- ("[SDK/extras/android_vendor/extra_api_dep, " +
- "SDK/extras/a/usb_driver]").replace('/', File.separatorChar),
- Arrays.toString(extraInstall.toArray()));
- assertEquals(
- "[[v8/veggies_8.jar, readme.txt, dir1/dir 2 with space/mylib.jar], " +
- "[]]",
- Arrays.toString(extraFilePaths.toArray()));
-
- // Check the system-image packages
- ArrayList<String> sysImgVersionAbi = new ArrayList<String>();
- for (Package p : pkgs) {
- if (p instanceof SystemImagePackage) {
- SystemImagePackage sip = (SystemImagePackage) p;
- String v = sip.getAndroidVersion().getApiString();
- String a = sip.getAbi();
- sysImgVersionAbi.add(String.format("%1$s %2$s", v, a)); //$NON-NLS-1$
- }
- }
- assertEquals(
- "[42 armeabi, " +
- "2 armeabi-v7a, " +
- "2 x86]",
- Arrays.toString(sysImgVersionAbi.toArray()));
-
- // Check the source packages
- ArrayList<String> sourceVersion = new ArrayList<String>();
- for (Package p : pkgs) {
- if (p instanceof SourcePackage) {
- SourcePackage sp = (SourcePackage) p;
- String v = sp.getAndroidVersion().getApiString();
- sourceVersion.add(v);
- }
- }
- assertEquals(
- "[42, 2, 1]",
- Arrays.toString(sourceVersion.toArray()));
- }
-
- /**
- * Validate what we can load from repository in schema version 6
- */
- public void testLoadXml_6() throws Exception {
- InputStream xmlStream = getTestResource(
- "/com/android/sdklib/testdata/repository_sample_6.xml");
-
- // guess the version from the XML document
- int version = mSource._getXmlSchemaVersion(xmlStream);
- assertEquals(6, version);
-
- Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };
- String[] validationError = new String[] { null };
- String url = "not-a-valid-url://" + SdkRepoConstants.URL_DEFAULT_FILENAME;
-
- String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound);
- assertEquals(Boolean.TRUE, validatorFound[0]);
- assertEquals(null, validationError[0]);
- assertEquals(SdkRepoConstants.getSchemaUri(6), uri);
-
- // Validation was successful, load the document
- MockMonitor monitor = new MockMonitor();
- Document doc = mSource._getDocument(xmlStream, monitor);
- assertNotNull(doc);
-
- // Get the packages
- assertTrue(mSource._parsePackages(doc, uri, monitor));
-
- assertEquals("Found SDK Platform Android 1.0, API 1, revision 3\n" +
- "Found Documentation for Android SDK, API 1, revision 1\n" +
- "Found Sources for Android SDK, API 1, revision 1\n" +
- "Found SDK Platform Android 1.1, API 2, revision 12\n" +
- "Found Intel x86 Atom System Image, Android API 2, revision 1\n" +
- "Found ARM EABI v7a System Image, Android API 2, revision 2\n" +
- "Found Sources for Android SDK, API 2, revision 2\n" +
- "Found SDK Platform Android Pastry Preview, revision 3\n" +
- "Found Android SDK Tools, revision 1\n" +
- "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 Samples for SDK API 14, revision 24 (Obsolete)\n" +
- "Found ARM EABI System Image, Android API 42, revision 12\n" +
- "Found MIPS System Image, Android API 42, revision 12\n" +
- "Found Sources for Android SDK, API 42, revision 12\n",
- monitor.getCapturedVerboseLog());
- assertEquals("", monitor.getCapturedLog());
- assertEquals("", monitor.getCapturedErrorLog());
-
- // check the packages we found... we expected to find 13 packages with each at least
- // one archive.
- // Note the order doesn't necessary match the one from the
- // assertEquald(getCapturedVerboseLog) because packages are sorted using the
- // Packages' sorting order, e.g. all platforms are sorted by descending API level, etc.
- Package[] pkgs = mSource.getPackages();
-
- assertEquals(16, pkgs.length);
- for (Package p : pkgs) {
- assertTrue(p.getArchives().length >= 1);
- }
-
- // Check the layoutlib & included-abi of the platform packages.
- ArrayList<Pair<Integer, Integer>> layoutlibVers = new ArrayList<Pair<Integer,Integer>>();
- ArrayList<String> includedAbi = new ArrayList<String>();
- for (Package p : pkgs) {
- if (p instanceof PlatformPackage) {
- layoutlibVers.add(((PlatformPackage) p).getLayoutlibVersion());
- String abi = ((PlatformPackage) p).getIncludedAbi();
- includedAbi.add(abi == null ? "(null)" : abi);
- }
- }
- assertEquals(
- "[Pair [first=1, second=0], " + // platform API 5 preview
- "Pair [first=5, second=31415], " + // platform API 2
- "Pair [first=5, second=0]]", // platform API 1
- Arrays.toString(layoutlibVers.toArray()));
- assertEquals(
- "[(null), " + // platform API 5 preview
- "x86, " + // platform API 2
- "armeabi]", // platform API 1
- Arrays.toString(includedAbi.toArray()));
-
- // Check the extra packages path, vendor, install folder, project-files, old-paths
-
- 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>();
- ArrayList<ArrayList<String>> extraFilePaths = new ArrayList<ArrayList<String>>();
- for (Package p : pkgs) {
- if (p instanceof ExtraPackage) {
- ExtraPackage ep = (ExtraPackage) p;
- // combine path and old-paths in the form "path [old_path1, old_path2]"
- extraPaths.add(ep.getPath() + " " + Arrays.toString(ep.getOldPaths()));
- extraVendors.add(ep.getVendorId() + "/" + ep.getVendorDisplay());
- extraInstall.add(ep.getInstallFolder(osSdkPath, sdkManager));
-
- ArrayList<String> filePaths = new ArrayList<String>();
- for (String filePath : ep.getProjectFiles()) {
- filePaths.add(filePath);
- }
- extraFilePaths.add(filePaths);
- }
- }
-
- // There are no extra packages anymore in repository-6
- assertEquals("[]", Arrays.toString(extraPaths.toArray()));
- assertEquals("[]", Arrays.toString(extraVendors.toArray()));
- assertEquals("[]", Arrays.toString(extraInstall.toArray()));
- assertEquals("[]", Arrays.toString(extraFilePaths.toArray()));
-
- // Check the system-image packages
- ArrayList<String> sysImgVersionAbi = new ArrayList<String>();
- for (Package p : pkgs) {
- if (p instanceof SystemImagePackage) {
- SystemImagePackage sip = (SystemImagePackage) p;
- String v = sip.getAndroidVersion().getApiString();
- String a = sip.getAbi();
- sysImgVersionAbi.add(String.format("%1$s %2$s", v, a)); //$NON-NLS-1$
- }
- }
- assertEquals(
- "[42 armeabi, " +
- "42 mips, " +
- "2 armeabi-v7a, " +
- "2 x86]",
- Arrays.toString(sysImgVersionAbi.toArray()));
-
- // Check the source packages
- ArrayList<String> sourceVersion = new ArrayList<String>();
- for (Package p : pkgs) {
- if (p instanceof SourcePackage) {
- SourcePackage sp = (SourcePackage) p;
- String v = sp.getAndroidVersion().getApiString();
- sourceVersion.add(v);
- }
- }
- assertEquals(
- "[42, 2, 1]",
- Arrays.toString(sourceVersion.toArray()));
- }
-
- /**
- * Validate what we can load from repository in schema version 6
- */
- public void testLoadXml_7() throws Exception {
- InputStream xmlStream = getTestResource(
- "/com/android/sdklib/testdata/repository_sample_7.xml");
-
- // guess the version from the XML document
- int version = mSource._getXmlSchemaVersion(xmlStream);
- assertEquals(7, version);
-
- Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };
- String[] validationError = new String[] { null };
- String url = "not-a-valid-url://" + SdkRepoConstants.URL_DEFAULT_FILENAME;
-
- String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound);
- assertEquals(Boolean.TRUE, validatorFound[0]);
- assertEquals(null, validationError[0]);
- assertEquals(SdkRepoConstants.getSchemaUri(7), uri);
-
- // Validation was successful, load the document
- MockMonitor monitor = new MockMonitor();
- Document doc = mSource._getDocument(xmlStream, monitor);
- assertNotNull(doc);
-
- // Get the packages
- assertTrue(mSource._parsePackages(doc, uri, monitor));
-
- assertEquals("Found SDK Platform Android 1.0, API 1, revision 3\n" +
- "Found Documentation for Android SDK, API 1, revision 1\n" +
- "Found Sources for Android SDK, API 1, revision 1\n" +
- "Found SDK Platform Android 1.1, API 2, revision 12\n" +
- "Found Intel x86 Atom System Image, Android API 2, revision 1\n" +
- "Found ARM EABI v7a System Image, Android API 2, revision 2\n" +
- "Found Sources for Android SDK, API 2, revision 2\n" +
- "Found SDK Platform Android Pastry Preview, revision 3\n" +
- "Found Android SDK Tools, revision 1.2.3 rc4\n" +
- "Found Documentation for Android SDK, API 2, revision 42\n" +
- "Found Android SDK Tools, revision 42\n" +
- "Found Android SDK Platform-tools, revision 3 rc5\n" +
- "Found Samples for SDK API 14, revision 24 (Obsolete)\n" +
- "Found Samples for SDK API 14, revision 25 (Obsolete)\n" +
- "Found ARM EABI System Image, Android API 42, revision 12\n" +
- "Found MIPS System Image, Android API 42, revision 12\n" +
- "Found Sources for Android SDK, API 42, revision 12\n",
- monitor.getCapturedVerboseLog());
- assertEquals("", monitor.getCapturedLog());
- assertEquals("", monitor.getCapturedErrorLog());
-
- // check the packages we found... we expected to find 13 packages with each at least
- // one archive.
- // Note the order doesn't necessary match the one from the
- // assertEquald(getCapturedVerboseLog) because packages are sorted using the
- // Packages' sorting order, e.g. all platforms are sorted by descending API level, etc.
- Package[] pkgs = mSource.getPackages();
-
- assertEquals(17, pkgs.length);
- for (Package p : pkgs) {
- assertTrue(p.getArchives().length >= 1);
- }
-
- // Check the layoutlib & included-abi of the platform packages.
- ArrayList<Pair<Integer, Integer>> layoutlibVers = new ArrayList<Pair<Integer,Integer>>();
- ArrayList<String> includedAbi = new ArrayList<String>();
- for (Package p : pkgs) {
- if (p instanceof PlatformPackage) {
- layoutlibVers.add(((PlatformPackage) p).getLayoutlibVersion());
- String abi = ((PlatformPackage) p).getIncludedAbi();
- includedAbi.add(abi == null ? "(null)" : abi);
- }
- }
- assertEquals(
- "[Pair [first=1, second=0], " + // platform API 5 preview
- "Pair [first=5, second=31415], " + // platform API 2
- "Pair [first=5, second=0]]", // platform API 1
- Arrays.toString(layoutlibVers.toArray()));
- assertEquals(
- "[(null), " + // platform API 5 preview
- "x86, " + // platform API 2
- "armeabi]", // platform API 1
- Arrays.toString(includedAbi.toArray()));
-
- // Check the extra packages path, vendor, install folder, project-files, old-paths
-
- 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>();
- ArrayList<ArrayList<String>> extraFilePaths = new ArrayList<ArrayList<String>>();
- for (Package p : pkgs) {
- if (p instanceof ExtraPackage) {
- ExtraPackage ep = (ExtraPackage) p;
- // combine path and old-paths in the form "path [old_path1, old_path2]"
- extraPaths.add(ep.getPath() + " " + Arrays.toString(ep.getOldPaths()));
- extraVendors.add(ep.getVendorId() + "/" + ep.getVendorDisplay());
- extraInstall.add(ep.getInstallFolder(osSdkPath, sdkManager));
-
- ArrayList<String> filePaths = new ArrayList<String>();
- for (String filePath : ep.getProjectFiles()) {
- filePaths.add(filePath);
- }
- extraFilePaths.add(filePaths);
- }
- }
-
- // There are no extra packages anymore in repository-6
- assertEquals("[]", Arrays.toString(extraPaths.toArray()));
- assertEquals("[]", Arrays.toString(extraVendors.toArray()));
- assertEquals("[]", Arrays.toString(extraInstall.toArray()));
- assertEquals("[]", Arrays.toString(extraFilePaths.toArray()));
-
-
- // Check the system-image packages
- ArrayList<String> sysImgVersionAbi = new ArrayList<String>();
- for (Package p : pkgs) {
- if (p instanceof SystemImagePackage) {
- SystemImagePackage sip = (SystemImagePackage) p;
- String v = sip.getAndroidVersion().getApiString();
- String a = sip.getAbi();
- sysImgVersionAbi.add(String.format("%1$s %2$s", v, a)); //$NON-NLS-1$
- }
- }
- assertEquals(
- "[42 armeabi, " +
- "42 mips, " +
- "2 armeabi-v7a, " +
- "2 x86]",
- Arrays.toString(sysImgVersionAbi.toArray()));
-
-
- // Check the source packages
- ArrayList<String> sourceVersion = new ArrayList<String>();
- for (Package p : pkgs) {
- if (p instanceof SourcePackage) {
- SourcePackage sp = (SourcePackage) p;
- String v = sp.getAndroidVersion().getApiString();
- sourceVersion.add(v);
- }
- }
- assertEquals(
- "[42, 2, 1]",
- Arrays.toString(sourceVersion.toArray()));
-
-
- // Check the min-tools-rev
- ArrayList<String> minToolsRevs = new ArrayList<String>();
- for (Package p : pkgs) {
- if (p instanceof IMinToolsDependency) {
- minToolsRevs.add(p.getListDescription() + ": " +
- ((IMinToolsDependency) p).getMinToolsRevision().toShortString());
- }
- }
- assertEquals(
- "[SDK Platform Android Pastry Preview: 0, " +
- "SDK Platform Android 1.1: 0, " +
- "SDK Platform Android 1.0: 2.0.1, " +
- "Samples for SDK API 14 (Obsolete): 5, " +
- "Samples for SDK API 14 (Obsolete): 5.1.2 rc3]",
- Arrays.toString(minToolsRevs.toArray()));
-
-
- // Check the min-platform-tools-rev
- ArrayList<String> minPlatToolsRevs = new ArrayList<String>();
- for (Package p : pkgs) {
- if (p instanceof IMinPlatformToolsDependency) {
- minPlatToolsRevs.add(p.getListDescription() + ": " +
- ((IMinPlatformToolsDependency) p).getMinPlatformToolsRevision().toShortString());
- }
- }
- assertEquals(
- "[Android SDK Tools: 4, " +
- "Android SDK Tools: 4 rc5]",
- Arrays.toString(minPlatToolsRevs.toArray()));
- }
-
- /**
- * Returns an SdkLib file resource as a {@link ByteArrayInputStream},
- * which has the advantage that we can use {@link InputStream#reset()} on it
- * at any time to read it multiple times.
- * <p/>
- * The default for getResourceAsStream() is to return a {@link FileInputStream} that
- * does not support reset(), yet we need it in the tested code.
- *
- * @throws IOException if some I/O read fails
- */
- private ByteArrayInputStream getTestResource(String filename) throws IOException {
- InputStream xmlStream = this.getClass().getResourceAsStream(filename);
-
- try {
- byte[] data = new byte[8192];
- int offset = 0;
- int n;
-
- while ((n = xmlStream.read(data, offset, data.length - offset)) != -1) {
- offset += n;
-
- if (offset == data.length) {
- byte[] newData = new byte[offset + 8192];
- System.arraycopy(data, 0, newData, 0, offset);
- data = newData;
- }
- }
-
- return new ByteArrayInputStream(data, 0, offset);
- } finally {
- if (xmlStream != null) {
- xmlStream.close();
- }
- }
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/sources/SdkSourcePropertiesTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/sources/SdkSourcePropertiesTest.java
deleted file mode 100755
index 6313e69..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/sources/SdkSourcePropertiesTest.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (C) 2012 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.sources;
-
-
-import com.android.sdklib.internal.repository.sources.SdkSourceProperties;
-
-import junit.framework.TestCase;
-
-public class SdkSourcePropertiesTest extends TestCase {
-
- private static class MockSdkSourceProperties extends SdkSourceProperties {
- private int mLoadCount;
- private int mSaveCount;
-
- public MockSdkSourceProperties() {
- clear();
- }
-
- public int getLoadCount() {
- return mLoadCount;
- }
-
- public int getSaveCount() {
- return mSaveCount;
- }
-
- @Override
- protected boolean loadProperties() {
- // Don't actually load anthing.
- mLoadCount++;
- return false;
- }
-
- @Override
- protected void saveLocked() {
- // Don't actually save anything.
- mSaveCount++;
- }
- }
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- public final void testSdkSourceProperties() {
- MockSdkSourceProperties m = new MockSdkSourceProperties();
-
- assertEquals(0, m.getLoadCount());
- assertEquals(0, m.getSaveCount());
- assertEquals(
- "<SdkSourceProperties>",
- m.toString());
-
- assertNull(m.getProperty(SdkSourceProperties.KEY_DISABLED, "http://example.com/1", null));
- assertEquals("None",
- m.getProperty(SdkSourceProperties.KEY_NAME, "http://example.com/2", "None"));
- assertEquals(1, m.getLoadCount());
- assertEquals(0, m.getSaveCount());
- assertEquals(
- "<SdkSourceProperties\n" +
- "@version@ = 1>",
- m.toString());
-
- m.setProperty(SdkSourceProperties.KEY_DISABLED, "http://example.com/1", "disabled");
- assertEquals("disabled",
- m.getProperty(SdkSourceProperties.KEY_DISABLED, "http://example.com/1", "None"));
- assertNull(m.getProperty(SdkSourceProperties.KEY_NAME, "http://example.com/1", null));
- assertEquals(
- "<SdkSourceProperties\n" +
- "@disabled@http://example.com/1 = disabled\n" +
- "@version@ = 1>",
- m.toString());
-
- m.setProperty(SdkSourceProperties.KEY_NAME, "http://example.com/2", "Site Name");
- assertEquals("Site Name",
- m.getProperty(SdkSourceProperties.KEY_NAME, "http://example.com/2", null));
- assertNull(m.getProperty(SdkSourceProperties.KEY_DISABLED, "http://example.com/2", null));
- assertEquals(1, m.getLoadCount());
- assertEquals(0, m.getSaveCount());
- assertEquals(
- "<SdkSourceProperties\n" +
- "@disabled@http://example.com/1 = disabled\n" +
- "@name@http://example.com/2 = Site Name\n" +
- "@version@ = 1>",
- m.toString());
-
- m.save();
- assertEquals(1, m.getSaveCount());
-
- // saving a 2nd time doesn't do anything if no property has been modified
- m.save();
- assertEquals(1, m.getSaveCount());
-
- // setting things to the same value doesn't actually mark the properties as modified
- m.setProperty(SdkSourceProperties.KEY_DISABLED, "http://example.com/1", "disabled");
- m.setProperty(SdkSourceProperties.KEY_NAME, "http://example.com/2", "Site Name");
- m.save();
- assertEquals(1, m.getSaveCount());
-
- m.setProperty(SdkSourceProperties.KEY_DISABLED, "http://example.com/1", "not disabled");
- m.setProperty(SdkSourceProperties.KEY_NAME, "http://example.com/2", "New Name");
- assertEquals(
- "<SdkSourceProperties\n" +
- "@disabled@http://example.com/1 = not disabled\n" +
- "@name@http://example.com/2 = New Name\n" +
- "@version@ = 1>",
- m.toString());
- m.save();
- assertEquals(2, m.getSaveCount());
-
- // setting a value to null deletes it
- m.setProperty(SdkSourceProperties.KEY_NAME, "http://example.com/2", null);
- assertEquals(
- "<SdkSourceProperties\n" +
- "@disabled@http://example.com/1 = not disabled\n" +
- "@version@ = 1>",
- m.toString());
-
- m.save();
- assertEquals(1, m.getLoadCount());
- assertEquals(3, m.getSaveCount());
- }
-
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/sources/SdkSysImgSourceTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/sources/SdkSysImgSourceTest.java
deleted file mode 100755
index c080d11..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/internal/repository/sources/SdkSysImgSourceTest.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright (C) 2012 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.sources;
-
-import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.MockMonitor;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.internal.repository.packages.SystemImagePackage;
-import com.android.sdklib.repository.SdkSysImgConstants;
-
-import org.w3c.dom.Document;
-
-import java.io.ByteArrayInputStream;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-import junit.framework.TestCase;
-
-/**
- * Tests for {@link SdkSysImgSource}.
- */
-public class SdkSysImgSourceTest extends TestCase {
-
- /**
- * An internal helper class to give us visibility to the protected members we want
- * to test.
- */
- private static class MockSdkSysImgSource extends SdkSysImgSource {
- public MockSdkSysImgSource() {
- super("fake-url", null /*uiName*/);
- }
-
- public Document _findAlternateToolsXml(InputStream xml) {
- return super.findAlternateToolsXml(xml);
- }
-
- public boolean _parsePackages(Document doc, String nsUri, ITaskMonitor monitor) {
- return super.parsePackages(doc, nsUri, monitor);
- }
-
- public int _getXmlSchemaVersion(InputStream xml) {
- return super.getXmlSchemaVersion(xml);
- }
-
- public String _validateXml(InputStream xml, String url, int version,
- String[] outError, Boolean[] validatorFound) {
- return super.validateXml(xml, url, version, outError, validatorFound);
- }
-
- public Document _getDocument(InputStream xml, ITaskMonitor monitor) {
- return super.getDocument(xml, monitor);
- }
-
- }
-
- private MockSdkSysImgSource mSource;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
-
- mSource = new MockSdkSysImgSource();
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
-
- mSource = null;
- }
-
- /**
- * Validate that findAlternateToolsXml doesn't work for this source even
- * when trying to load a valid xml. That's because finding alternate tools
- * is not supported by this kind of source.
- */
- public void testFindAlternateToolsXml_1() throws Exception {
- InputStream xmlStream =
- getTestResource("/com/android/sdklib/testdata/sys_img_sample_1.xml");
-
- Document result = mSource._findAlternateToolsXml(xmlStream);
- assertNull(result);
- }
-
- /**
- * Validate we can load a valid schema version 1
- */
- public void testLoadSysImgXml_1() throws Exception {
- InputStream xmlStream =
- getTestResource("/com/android/sdklib/testdata/sys_img_sample_1.xml");
-
- // guess the version from the XML document
- int version = mSource._getXmlSchemaVersion(xmlStream);
- assertEquals(1, version);
-
- Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };
- String[] validationError = new String[] { null };
- String url = "not-a-valid-url://" + SdkSysImgConstants.URL_DEFAULT_FILENAME;
-
- String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound);
- assertEquals(Boolean.TRUE, validatorFound[0]);
- assertEquals(null, validationError[0]);
- assertEquals(SdkSysImgConstants.getSchemaUri(1), uri);
-
- // Validation was successful, load the document
- MockMonitor monitor = new MockMonitor();
- Document doc = mSource._getDocument(xmlStream, monitor);
- assertNotNull(doc);
-
- // Get the packages
- assertTrue(mSource._parsePackages(doc, uri, monitor));
-
- assertEquals(
- "Found Intel x86 Atom System Image, Android API 2, revision 1\n" +
- "Found ARM EABI v7a System Image, Android API 2, revision 2\n" +
- "Found ARM EABI System Image, Android API 42, revision 12\n" +
- "Found MIPS System Image, Android API 42, revision 12\n",
- monitor.getCapturedVerboseLog());
- assertEquals("", monitor.getCapturedLog());
- assertEquals("", monitor.getCapturedErrorLog());
-
- // check the packages we found...
- // Note the order doesn't necessary match the one from the
- // assertEquald(getCapturedVerboseLog) because packages are sorted using the
- // Packages' sorting order, e.g. all platforms are sorted by descending API level, etc.
-
- Package[] pkgs = mSource.getPackages();
-
- assertEquals(4, pkgs.length);
- for (Package p : pkgs) {
- // We expected to find packages with each at least one archive.
- assertTrue(p.getArchives().length >= 1);
- // And only system images are supported by this source
- assertTrue(p instanceof SystemImagePackage);
- }
-
- // Check the system-image packages
- ArrayList<String> sysImgVersionAbi = new ArrayList<String>();
- for (Package p : pkgs) {
- if (p instanceof SystemImagePackage) {
- SystemImagePackage sip = (SystemImagePackage) p;
- String v = sip.getAndroidVersion().getApiString();
- String a = sip.getAbi();
- sysImgVersionAbi.add(String.format("%1$s %2$s", v, a)); //$NON-NLS-1$
- }
- }
- assertEquals(
- "[42 armeabi, " +
- "42 mips, " +
- "2 armeabi-v7a, " +
- "2 x86]",
- Arrays.toString(sysImgVersionAbi.toArray()));
-
- }
-
-
- //-----
-
- /**
- * Returns an SdkLib file resource as a {@link ByteArrayInputStream},
- * which has the advantage that we can use {@link InputStream#reset()} on it
- * at any time to read it multiple times.
- * <p/>
- * The default for getResourceAsStream() is to return a {@link FileInputStream} that
- * does not support reset(), yet we need it in the tested code.
- *
- * @throws IOException if some I/O read fails
- */
- private ByteArrayInputStream getTestResource(String filename) throws IOException {
- InputStream xmlStream = this.getClass().getResourceAsStream(filename);
-
- try {
- byte[] data = new byte[8192];
- int offset = 0;
- int n;
-
- while ((n = xmlStream.read(data, offset, data.length - offset)) != -1) {
- offset += n;
-
- if (offset == data.length) {
- byte[] newData = new byte[offset + 8192];
- System.arraycopy(data, 0, newData, 0, offset);
- data = newData;
- }
- }
-
- return new ByteArrayInputStream(data, 0, offset);
- } finally {
- if (xmlStream != null) {
- xmlStream.close();
- }
- }
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/io/MockFileOp.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/io/MockFileOp.java
deleted file mode 100755
index cbe5fdd..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/io/MockFileOp.java
+++ /dev/null
@@ -1,469 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.io;
-
-import com.android.SdkConstants;
-import com.android.annotations.NonNull;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Properties;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-
-/**
- * Mock version of {@link FileOp} that wraps some common {@link File}
- * operations on files and folders.
- * <p/>
- * This version does not perform any file operation. Instead it records a textual
- * representation of all the file operations performed.
- * <p/>
- * To avoid cross-platform path issues (e.g. Windows path), the methods here should
- * always use rooted (aka absolute) unix-looking paths, e.g. "/dir1/dir2/file3".
- * When processing {@link File}, you can convert them using {@link #getAgnosticAbsPath(File)}.
- */
-public class MockFileOp implements IFileOp {
-
- private final Set<String> mExistinfFiles = new TreeSet<String>();
- private final Set<String> mExistinfFolders = new TreeSet<String>();
- private final List<StringOutputStream> mOutputStreams = new ArrayList<StringOutputStream>();
-
- public MockFileOp() {
- }
-
- /** Resets the internal state, as if the object had been newly created. */
- public void reset() {
- mExistinfFiles.clear();
- mExistinfFolders.clear();
- }
-
- public String getAgnosticAbsPath(File file) {
- return getAgnosticAbsPath(file.getAbsolutePath());
- }
-
- public String getAgnosticAbsPath(String path) {
- if (SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_WINDOWS) {
- // Try to convert the windows-looking path to a unix-looking one
- path = path.replace('\\', '/');
- path = path.replace("C:", ""); //$NON-NLS-1$ //$NON-NLS-2$
- }
- return path;
- }
-
- /**
- * Records a new absolute file path.
- * Parent folders are not automatically created.
- */
- public void recordExistingFile(File file) {
- mExistinfFiles.add(getAgnosticAbsPath(file));
- }
-
- /**
- * Records a new absolute file path.
- * Parent folders are not automatically created.
- * <p/>
- * The syntax should always look "unix-like", e.g. "/dir/file".
- * On Windows that means you'll want to use {@link #getAgnosticAbsPath(File)}.
- * @param absFilePath A unix-like file path, e.g. "/dir/file"
- */
- public void recordExistingFile(String absFilePath) {
- mExistinfFiles.add(absFilePath);
- }
-
- /**
- * Records a new absolute folder path.
- * Parent folders are not automatically created.
- */
- public void recordExistingFolder(File folder) {
- mExistinfFolders.add(getAgnosticAbsPath(folder));
- }
-
- /**
- * Records a new absolute folder path.
- * Parent folders are not automatically created.
- * <p/>
- * The syntax should always look "unix-like", e.g. "/dir/file".
- * On Windows that means you'll want to use {@link #getAgnosticAbsPath(File)}.
- * @param absFolderPath A unix-like folder path, e.g. "/dir/file"
- */
- public void recordExistingFolder(String absFolderPath) {
- mExistinfFolders.add(absFolderPath);
- }
-
- /**
- * Returns the list of paths added using {@link #recordExistingFile(String)}
- * and eventually updated by {@link #delete(File)} operations.
- * <p/>
- * The returned list is sorted by alphabetic absolute path string.
- */
- public String[] getExistingFiles() {
- return mExistinfFiles.toArray(new String[mExistinfFiles.size()]);
- }
-
- /**
- * Returns the list of folder paths added using {@link #recordExistingFolder(String)}
- * and eventually updated {@link #delete(File)} or {@link #mkdirs(File)} operations.
- * <p/>
- * The returned list is sorted by alphabetic absolute path string.
- */
- public String[] getExistingFolders() {
- return mExistinfFolders.toArray(new String[mExistinfFolders.size()]);
- }
-
- /**
- * Returns the {@link StringOutputStream#toString()} as an array, in creation order.
- * Array can be empty but not null.
- */
- public String[] getOutputStreams() {
- int n = mOutputStreams.size();
- String[] result = new String[n];
- for (int i = 0; i < n; i++) {
- result[i] = mOutputStreams.get(i).toString();
- }
- return result;
- }
-
- /**
- * Helper to delete a file or a directory.
- * For a directory, recursively deletes all of its content.
- * Files that cannot be deleted right away are marked for deletion on exit.
- * The argument can be null.
- */
- @Override
- public void deleteFileOrFolder(File fileOrFolder) {
- if (fileOrFolder != null) {
- if (isDirectory(fileOrFolder)) {
- // Must delete content recursively first
- for (File item : listFiles(fileOrFolder)) {
- deleteFileOrFolder(item);
- }
- }
- delete(fileOrFolder);
- }
- }
-
- /**
- * {@inheritDoc}
- * <p/>
- * <em>Note: this mock version does nothing.</em>
- */
- @Override
- public void setExecutablePermission(File file) throws IOException {
- // pass
- }
-
- /**
- * {@inheritDoc}
- * <p/>
- * <em>Note: this mock version does nothing.</em>
- */
- @Override
- public void setReadOnly(File file) {
- // pass
- }
-
- /**
- * {@inheritDoc}
- * <p/>
- * <em>Note: this mock version does nothing.</em>
- */
- @Override
- public void copyFile(File source, File dest) throws IOException {
- // pass
- }
-
- /**
- * Checks whether 2 binary files are the same.
- *
- * @param source the source file to copy
- * @param destination the destination file to write
- * @throws FileNotFoundException if the source files don't exist.
- * @throws IOException if there's a problem reading the files.
- */
- @Override
- public boolean isSameFile(File source, File destination) throws IOException {
- throw new UnsupportedOperationException("MockFileUtils.isSameFile is not supported."); //$NON-NLS-1$
- }
-
- /** Invokes {@link File#isFile()} on the given {@code file}. */
- @Override
- public boolean isFile(File file) {
- String path = getAgnosticAbsPath(file);
- return mExistinfFiles.contains(path);
- }
-
- /** Invokes {@link File#isDirectory()} on the given {@code file}. */
- @Override
- public boolean isDirectory(File file) {
- String path = getAgnosticAbsPath(file);
- if (mExistinfFolders.contains(path)) {
- return true;
- }
-
- // If we defined a file or folder as a child of the requested file path,
- // then the directory exists implicitely.
- Pattern pathRE = Pattern.compile(
- Pattern.quote(path + (path.endsWith("/") ? "" : '/')) + //$NON-NLS-1$ //$NON-NLS-2$
- ".*"); //$NON-NLS-1$
-
- for (String folder : mExistinfFolders) {
- if (pathRE.matcher(folder).matches()) {
- return true;
- }
- }
- for (String filePath : mExistinfFiles) {
- if (pathRE.matcher(filePath).matches()) {
- return true;
- }
- }
-
- return false;
- }
-
- /** Invokes {@link File#exists()} on the given {@code file}. */
- @Override
- public boolean exists(File file) {
- return isFile(file) || isDirectory(file);
- }
-
- /** Invokes {@link File#length()} on the given {@code file}. */
- @Override
- public long length(File file) {
- throw new UnsupportedOperationException("MockFileUtils.length is not supported."); //$NON-NLS-1$
- }
-
- @Override
- public boolean delete(File file) {
- String path = getAgnosticAbsPath(file);
-
- if (mExistinfFiles.remove(path)) {
- return true;
- }
-
- boolean hasSubfiles = false;
- for (String folder : mExistinfFolders) {
- if (folder.startsWith(path) && !folder.equals(path)) {
- // the File.delete operation is not recursive and would fail to remove
- // a root dir that is not empty.
- return false;
- }
- }
- if (!hasSubfiles) {
- for (String filePath : mExistinfFiles) {
- if (filePath.startsWith(path) && !filePath.equals(path)) {
- // the File.delete operation is not recursive and would fail to remove
- // a root dir that is not empty.
- return false;
- }
- }
- }
-
- return mExistinfFolders.remove(path);
- }
-
- /** Invokes {@link File#mkdirs()} on the given {@code file}. */
- @Override
- public boolean mkdirs(File file) {
- for (; file != null; file = file.getParentFile()) {
- String path = getAgnosticAbsPath(file);
- mExistinfFolders.add(path);
- }
- return true;
- }
-
- /**
- * Invokes {@link File#listFiles()} on the given {@code file}.
- * The returned list is sorted by alphabetic absolute path string.
- */
- @Override
- public File[] listFiles(File file) {
- TreeSet<File> files = new TreeSet<File>();
-
- String path = getAgnosticAbsPath(file);
- Pattern pathRE = Pattern.compile(
- Pattern.quote(path + (path.endsWith("/") ? "" : '/')) + //$NON-NLS-1$ //$NON-NLS-2$
- ".*"); //$NON-NLS-1$
-
- for (String folder : mExistinfFolders) {
- if (pathRE.matcher(folder).matches()) {
- files.add(new File(folder));
- }
- }
- for (String filePath : mExistinfFiles) {
- if (pathRE.matcher(filePath).matches()) {
- files.add(new File(filePath));
- }
- }
- return files.toArray(new File[files.size()]);
- }
-
- /** Invokes {@link File#renameTo(File)} on the given files. */
- @Override
- public boolean renameTo(File oldFile, File newFile) {
- boolean renamed = false;
-
- String oldPath = getAgnosticAbsPath(oldFile);
- String newPath = getAgnosticAbsPath(newFile);
- Pattern pathRE = Pattern.compile(
- "^(" + Pattern.quote(oldPath) + //$NON-NLS-1$
- ")($|/.*)"); //$NON-NLS-1$
-
- Set<String> newStrings = new HashSet<String>();
- for (Iterator<String> it = mExistinfFolders.iterator(); it.hasNext(); ) {
- String folder = it.next();
- Matcher m = pathRE.matcher(folder);
- if (m.matches()) {
- it.remove();
- String newFolder = newPath + m.group(2);
- newStrings.add(newFolder);
- renamed = true;
- }
- }
- mExistinfFolders.addAll(newStrings);
- newStrings.clear();
-
- for (Iterator<String> it = mExistinfFiles.iterator(); it.hasNext(); ) {
- String filePath = it.next();
- Matcher m = pathRE.matcher(filePath);
- if (m.matches()) {
- it.remove();
- String newFilePath = newPath + m.group(2);
- newStrings.add(newFilePath);
- renamed = true;
- }
- }
- mExistinfFiles.addAll(newStrings);
-
- return renamed;
- }
-
- /**
- * {@inheritDoc}
- * <p/>
- * <em>TODO: we might want to overload this to read mock properties instead of a real file.</em>
- */
- @Override
- public @NonNull Properties loadProperties(@NonNull File file) {
- Properties props = new Properties();
- FileInputStream fis = null;
- try {
- fis = new FileInputStream(file);
- props.load(fis);
- } catch (IOException ignore) {
- } finally {
- if (fis != null) {
- try {
- fis.close();
- } catch (Exception ignore) {}
- }
- }
- return props;
- }
-
- /**
- * {@inheritDoc}
- * <p/>
- * <em>Note that this uses the mock version of {@link #newFileOutputStream(File)} and thus
- * records the write rather than actually performing it.</em>
- */
- @Override
- public boolean saveProperties(@NonNull File file, @NonNull Properties props,
- @NonNull String comments) {
- OutputStream fos = null;
- try {
- fos = newFileOutputStream(file);
-
- props.store(fos, comments);
- return true;
- } catch (IOException ignore) {
- } finally {
- if (fos != null) {
- try {
- fos.close();
- } catch (IOException e) {
- }
- }
- }
-
- return false;
- }
-
- /**
- * Returns an OutputStream that will capture the bytes written and associate
- * them with the given file.
- */
- @Override
- public OutputStream newFileOutputStream(File file) throws FileNotFoundException {
- StringOutputStream os = new StringOutputStream(file);
- mOutputStreams.add(os);
- return os;
- }
-
- /**
- * An {@link OutputStream} that will capture the stream as an UTF-8 string once properly closed
- * and associate it to the given {@link File}.
- */
- public class StringOutputStream extends ByteArrayOutputStream {
- private String mData;
- private final File mFile;
-
- public StringOutputStream(File file) {
- mFile = file;
- recordExistingFile(file);
- }
-
- public File getFile() {
- return mFile;
- }
-
- /** Can be null if the stream has never been properly closed. */
- public String getData() {
- return mData;
- }
-
- /** Once the stream is properly closed, convert the byte array to an UTF-8 string */
- @Override
- public void close() throws IOException {
- super.close();
- mData = new String(toByteArray(), "UTF-8"); //$NON-NLS-1$
- }
-
- /** Returns a string representation suitable for unit tests validation. */
- @Override
- public synchronized String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append('<').append(getAgnosticAbsPath(mFile)).append(": "); //$NON-NLS-1$
- if (mData == null) {
- sb.append("(stream not closed properly)>"); //$NON-NLS-1$
- } else {
- sb.append('\'').append(mData).append("'>"); //$NON-NLS-1$
- }
- return sb.toString();
- }
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/io/MockFileOpTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/io/MockFileOpTest.java
deleted file mode 100755
index 8fb1784..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/io/MockFileOpTest.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.io;
-
-import java.io.File;
-import java.io.OutputStream;
-import java.util.Arrays;
-
-import junit.framework.TestCase;
-
-/**
- * Unit-test for the {@link MockFileOp}, which is a mock of {@link FileOp} that doesn't
- * touch the file system. Just testing the test.
- */
-public class MockFileOpTest extends TestCase {
-
- private MockFileOp m;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- m = new MockFileOp();
- }
-
- private File createFile(String...segments) {
- File f = null;
- for (String segment : segments) {
- if (f == null) {
- f = new File(segment);
- } else {
- f = new File(f, segment);
- }
- }
-
- return f;
- }
-
- public void testIsFile() {
- File f1 = createFile("/dir1", "file1");
- assertFalse(m.isFile(f1));
-
- m.recordExistingFile("/dir1/file1");
- assertTrue(m.isFile(f1));
-
- assertEquals(
- "[/dir1/file1]",
- Arrays.toString(m.getExistingFiles()));
- }
-
- public void testIsDirectory() {
- File d4 = createFile("/dir1", "dir2", "dir3", "dir4");
- File f7 = createFile("/dir1", "dir2", "dir6", "file7");
- assertFalse(m.isDirectory(d4));
-
- m.recordExistingFolder("/dir1/dir2/dir3/dir4");
- m.recordExistingFile("/dir1/dir2/dir6/file7");
- assertTrue(m.isDirectory(d4));
- assertFalse(m.isDirectory(f7));
-
- // any intermediate directory exists implicitly
- assertTrue(m.isDirectory(createFile("/")));
- assertTrue(m.isDirectory(createFile("/dir1")));
- assertTrue(m.isDirectory(createFile("/dir1", "dir2")));
- assertTrue(m.isDirectory(createFile("/dir1", "dir2", "dir3")));
- assertTrue(m.isDirectory(createFile("/dir1", "dir2", "dir6")));
-
- assertEquals(
- "[/dir1/dir2/dir3/dir4]",
- Arrays.toString(m.getExistingFolders()));
- }
-
- public void testDelete() {
- m.recordExistingFolder("/dir1");
- m.recordExistingFile("/dir1/file1");
- m.recordExistingFile("/dir1/file2");
-
- assertEquals(
- "[/dir1/file1, /dir1/file2]",
- Arrays.toString(m.getExistingFiles()));
-
- assertTrue(m.delete(createFile("/dir1", "file1")));
- assertFalse(m.delete(createFile("/dir1", "file3")));
- assertFalse(m.delete(createFile("/dir2", "file2")));
- assertEquals(
- "[/dir1/file2]",
- Arrays.toString(m.getExistingFiles()));
-
- // deleting a directory with files in it fails
- assertFalse(m.delete(createFile("/dir1")));
- // but it works if the directory is empty
- assertTrue(m.delete(createFile("/dir1", "file2")));
- assertTrue(m.delete(createFile("/dir1")));
- }
-
- public void testListFiles() {
- m.recordExistingFolder("/dir1");
- m.recordExistingFile("/dir1/file1");
- m.recordExistingFile("/dir1/file2");
- m.recordExistingFile("/dir1/dir2/file3");
- m.recordExistingFile("/dir4/file4");
-
- assertEquals(
- "[]",
- m.getAgnosticAbsPath(Arrays.toString(m.listFiles(createFile("/not_a_dir")))));
-
- assertEquals(
- "[/dir1/dir2/file3]",
- m.getAgnosticAbsPath(Arrays.toString(m.listFiles(createFile("/dir1", "dir2")))));
-
- assertEquals(
- "[/dir1/dir2/file3, /dir1/file1, /dir1/file2]",
- m.getAgnosticAbsPath(Arrays.toString(m.listFiles(createFile("/dir1")))));
- }
-
- public void testMkDirs() {
- assertEquals("[]", Arrays.toString(m.getExistingFolders()));
-
- assertTrue(m.mkdirs(createFile("/dir1")));
- assertEquals("[/, /dir1]", Arrays.toString(m.getExistingFolders()));
-
- m.recordExistingFolder("/dir1");
- assertEquals("[/, /dir1]", Arrays.toString(m.getExistingFolders()));
-
- assertTrue(m.mkdirs(createFile("/dir1/dir2/dir3")));
- assertEquals(
- "[/, /dir1, /dir1/dir2, /dir1/dir2/dir3]",
- Arrays.toString(m.getExistingFolders()));
- }
-
- public void testRenameTo() {
- m.recordExistingFile("/dir1/dir2/dir6/file7");
- m.recordExistingFolder("/dir1/dir2/dir3/dir4");
-
- assertEquals("[/dir1/dir2/dir6/file7]", Arrays.toString(m.getExistingFiles()));
- assertEquals("[/dir1/dir2/dir3/dir4]", Arrays.toString(m.getExistingFolders()));
-
- assertTrue(m.renameTo(createFile("/dir1", "dir2"), createFile("/dir1", "newDir2")));
- assertEquals("[/dir1/newDir2/dir6/file7]", Arrays.toString(m.getExistingFiles()));
- assertEquals("[/dir1/newDir2/dir3/dir4]", Arrays.toString(m.getExistingFolders()));
-
- assertTrue(m.renameTo(
- createFile("/dir1", "newDir2", "dir6", "file7"),
- createFile("/dir1", "newDir2", "dir6", "newFile7")));
- assertTrue(m.renameTo(
- createFile("/dir1", "newDir2", "dir3", "dir4"),
- createFile("/dir1", "newDir2", "dir3", "newDir4")));
- assertEquals("[/dir1/newDir2/dir6/newFile7]", Arrays.toString(m.getExistingFiles()));
- assertEquals("[/dir1/newDir2/dir3/newDir4]", Arrays.toString(m.getExistingFolders()));
- }
-
- public void testNewFileOutputStream() throws Exception {
- assertEquals("[]", Arrays.toString(m.getOutputStreams()));
-
- File f = createFile("/dir1", "dir2", "simple ascii");
- OutputStream os = m.newFileOutputStream(f);
- assertNotNull(os);
- os.write("regular ascii".getBytes("UTF-8"));
- os.close();
-
- f = createFile("/dir1", "dir2", "utf-8 test");
- os = m.newFileOutputStream(f);
- assertNotNull(os);
- os.write("nihongo in UTF-8: 日本語".getBytes("UTF-8"));
- os.close();
-
- f = createFile("/dir1", "dir2", "forgot to close");
- os = m.newFileOutputStream(f);
- assertNotNull(os);
- os.write("wrote stuff but not closing the stream".getBytes("UTF-8"));
-
- assertEquals(
- "[</dir1/dir2/simple ascii: 'regular ascii'>, " +
- "</dir1/dir2/utf-8 test: 'nihongo in UTF-8: 日本語'>, " +
- "</dir1/dir2/forgot to close: (stream not closed properly)>]",
- Arrays.toString(m.getOutputStreams()));
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/repository/CaptureErrorHandler.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/repository/CaptureErrorHandler.java
deleted file mode 100755
index dccec59..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/repository/CaptureErrorHandler.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * 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.repository;
-
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-/**
- * A SAX error handler that captures the errors and warnings.
- * This allows us to capture *all* errors and just not get an exception on the first one.
- */
-class CaptureErrorHandler implements ErrorHandler {
-
- private String mWarnings = "";
- private String mErrors = "";
-
- public String getErrors() {
- return mErrors;
- }
-
- public String getWarnings() {
- return mWarnings;
- }
-
- /**
- * Verifies if the handler captures some errors or warnings.
- * Prints them on stderr.
- * Also fails the unit test if any error was generated.
- */
- public void verify() {
- if (mWarnings.length() > 0) {
- System.err.println(mWarnings);
- }
-
- if (mErrors.length() > 0) {
- System.err.println(mErrors);
- junit.framework.Assert.fail(mErrors);
- }
- }
-
- /**
- * @throws SAXException
- */
- @Override
- public void error(SAXParseException ex) throws SAXException {
- mErrors += "Error: " + ex.getMessage() + "\n";
- }
-
- /**
- * @throws SAXException
- */
- @Override
- public void fatalError(SAXParseException ex) throws SAXException {
- mErrors += "Fatal Error: " + ex.getMessage() + "\n";
- }
-
- /**
- * @throws SAXException
- */
- @Override
- public void warning(SAXParseException ex) throws SAXException {
- mWarnings += "Warning: " + ex.getMessage() + "\n";
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/repository/ValidateAddonXmlTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/repository/ValidateAddonXmlTest.java
deleted file mode 100755
index ea56e0b..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/repository/ValidateAddonXmlTest.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * 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.repository;
-
-import com.android.annotations.Nullable;
-
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-import java.io.InputStream;
-import java.io.StringReader;
-
-import javax.xml.XMLConstants;
-import javax.xml.transform.Source;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.validation.Schema;
-import javax.xml.validation.SchemaFactory;
-import javax.xml.validation.Validator;
-
-import junit.framework.TestCase;
-
-/**
- * Tests local validation of an SDK Addon sample XMLs using an XML Schema validator.
- */
-public class ValidateAddonXmlTest extends TestCase {
-
- private static String OPEN_TAG_ADDON =
- "<r:sdk-addon xmlns:r=\"http://schemas.android.com/sdk/android/addon/" +
- Integer.toString(SdkAddonConstants.NS_LATEST_VERSION) +
- "\">";
- private static String CLOSE_TAG_ADDON = "</r:sdk-addon>";
-
- // --- Helpers ------------
-
- /**
- * Helper method that returns a validator for our Addon XSD
- *
- * @param version The version number, in range {@code 1..NS_LATEST_VERSION}
- * @param handler A {@link CaptureErrorHandler}. If null the default will be used,
- * which will most likely print errors to stderr.
- */
- private Validator getAddonValidator(int version, @Nullable CaptureErrorHandler handler)
- throws SAXException {
- Validator validator = null;
- InputStream xsdStream = SdkAddonConstants.getXsdStream(version);
- if (xsdStream != null) {
- SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
- Schema schema = factory.newSchema(new StreamSource(xsdStream));
- validator = schema.newValidator();
- if (handler != null) {
- validator.setErrorHandler(handler);
- }
- }
-
- return validator;
- }
-
- /** An helper that validates a string against an expected regexp. */
- private void assertRegex(String expectedRegexp, String actualString) {
- assertNotNull(actualString);
- assertTrue(
- String.format("Regexp Assertion Failed:\nExpected: %s\nActual: %s\n",
- expectedRegexp, actualString),
- actualString.matches(expectedRegexp));
- }
-
- // --- Tests ------------
-
- /** Validates that NS_LATEST_VERSION points to the max available XSD schema. */
- public void testAddonLatestVersionNumber() throws Exception {
- CaptureErrorHandler handler = new CaptureErrorHandler();
-
- // There should be a schema matching NS_LATEST_VERSION
- assertNotNull(getAddonValidator(SdkAddonConstants.NS_LATEST_VERSION, handler));
-
- // There should NOT be a schema with NS_LATEST_VERSION+1
- assertNull(
- String.format(
- "There's an ADDON XSD at version %d but SdkAddonConstants.NS_LATEST_VERSION is still set to %d.",
- SdkAddonConstants.NS_LATEST_VERSION + 1,
- SdkAddonConstants.NS_LATEST_VERSION),
- getAddonValidator(SdkAddonConstants.NS_LATEST_VERSION + 1, handler));
- }
-
- /** Validate a valid sample using namespace version 1 using an InputStream */
- public void testValidateLocalAddonFile1() throws Exception {
- InputStream xmlStream = this.getClass().getResourceAsStream(
- "/com/android/sdklib/testdata/addon_sample_1.xml");
- Source source = new StreamSource(xmlStream);
-
- CaptureErrorHandler handler = new CaptureErrorHandler();
- Validator validator = getAddonValidator(1, handler);
- validator.validate(source);
- handler.verify();
- }
-
- /** Validate a valid sample using namespace version 2 using an InputStream */
- public void testValidateLocalAddonFile2() throws Exception {
- InputStream xmlStream = this.getClass().getResourceAsStream(
- "/com/android/sdklib/testdata/addon_sample_2.xml");
- Source source = new StreamSource(xmlStream);
-
- CaptureErrorHandler handler = new CaptureErrorHandler();
- Validator validator = getAddonValidator(2, handler);
- validator.validate(source);
- handler.verify();
- }
-
- /** Validate a valid sample using namespace version 3 using an InputStream */
- public void testValidateLocalAddonFile3() throws Exception {
- InputStream xmlStream = this.getClass().getResourceAsStream(
- "/com/android/sdklib/testdata/addon_sample_3.xml");
- Source source = new StreamSource(xmlStream);
-
- CaptureErrorHandler handler = new CaptureErrorHandler();
- Validator validator = getAddonValidator(3, handler);
- validator.validate(source);
- handler.verify();
- }
-
- /** Validate a valid sample using namespace version 4 using an InputStream */
- public void testValidateLocalAddonFile4() throws Exception {
- InputStream xmlStream = this.getClass().getResourceAsStream(
- "/com/android/sdklib/testdata/addon_sample_4.xml");
- Source source = new StreamSource(xmlStream);
-
- CaptureErrorHandler handler = new CaptureErrorHandler();
- Validator validator = getAddonValidator(4, handler);
- validator.validate(source);
- handler.verify();
- }
-
- // IMPORTANT: each time you add a test here, you should add a corresponding
- // test in SdkAddonSourceTest to validate the XML content is parsed correctly.
-
- // ----
-
- /**
- * An addon does not support a codename.
- * There used to be a typo in the repository.XSD versions 1-2 & the addon XSD versions 1-2
- * where addons had an optional element 'codename'. This was a typo and it's been fixed.
- */
- public void testAddonCodename() throws Exception {
- // we define a license named "lic1" and then reference "lic2" instead
- String document = "<?xml version=\"1.0\"?>" +
- OPEN_TAG_ADDON +
- "<r:license id=\"lic1\"> some license </r:license> " +
- "<r:add-on> <r:uses-license ref=\"lic1\" /> <r:revision>1</r:revision> " +
- "<r:name-id>AddonName</r:name-id> <r:name-display>The Addon Name</r:name-display> " +
- "<r:vendor-id>AddonVendor</r:vendor-id> <r:vendor-display>The Addon Vendor</r:vendor-display> " +
- "<r:api-level>42</r:api-level> " +
- "<r:codename>Addons do not support codenames</r:codenames> " +
- "<r:libs><r:lib><r:name>com.example.LibName</r:name></r:lib></r:libs> " +
- "<r:archives> <r:archive os=\"any\"> <r:size>1</r:size> <r:checksum>2822ae37115ebf13412bbef91339ee0d9454525e</r:checksum> " +
- "<r:url>url</r:url> </r:archive> </r:archives> </r:add-on>" +
- CLOSE_TAG_ADDON;
-
- Source source = new StreamSource(new StringReader(document));
-
- // don't capture the validator errors, we want it to fail and catch the exception
- Validator validator = getAddonValidator(SdkAddonConstants.NS_LATEST_VERSION, null);
- try {
- validator.validate(source);
- } catch (SAXParseException e) {
- // We expect a parse error referring to this grammar rule
- assertRegex("cvc-complex-type.2.4.a: Invalid content was found starting with element 'r:codename'.*",
- e.getMessage());
- return;
- }
- // If we get here, the validator has not failed as we expected it to.
- fail();
- }
-
- /** A document with a slash in an extra path. */
- public void testExtraPathWithSlash() throws Exception {
- String document = "<?xml version=\"1.0\"?>" +
- OPEN_TAG_ADDON +
- "<r:extra> <r:revision>1</r:revision> <r:path>path/cannot\\contain\\segments</r:path> " +
- "<r:archives> <r:archive os=\"any\"> <r:size>1</r:size> <r:checksum>2822ae37115ebf13412bbef91339ee0d9454525e</r:checksum> " +
- "<r:url>url</r:url> </r:archive> </r:archives> </r:extra>" +
- CLOSE_TAG_ADDON;
-
- Source source = new StreamSource(new StringReader(document));
-
- // don't capture the validator errors, we want it to fail and catch the exception
- Validator validator = getAddonValidator(SdkAddonConstants.NS_LATEST_VERSION, null);
- try {
- validator.validate(source);
- } catch (SAXParseException e) {
- // We expect a parse error referring to this grammar rule
- assertRegex("cvc-pattern-valid: Value 'path/cannot\\\\contain\\\\segments' is not facet-valid with respect to pattern.*",
- e.getMessage());
- return;
- }
- // If we get here, the validator has not failed as we expected it to.
- fail();
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/repository/ValidateAddonsListXmlTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/repository/ValidateAddonsListXmlTest.java
deleted file mode 100755
index 0461c67..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/repository/ValidateAddonsListXmlTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2012 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.repository;
-
-import com.android.annotations.Nullable;
-
-import org.xml.sax.SAXException;
-
-import java.io.InputStream;
-
-import javax.xml.XMLConstants;
-import javax.xml.transform.Source;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.validation.Schema;
-import javax.xml.validation.SchemaFactory;
-import javax.xml.validation.Validator;
-
-import junit.framework.TestCase;
-
-/**
- * Tests local validation of an SDK Addon-List sample XMLs using an XML Schema validator.
- */
-public class ValidateAddonsListXmlTest extends TestCase {
-
- // --- Helpers ------------
-
- /**
- * Helper method that returns a validator for our Addons-List XSD
- *
- * @param version The version number, in range {@code 1..NS_LATEST_VERSION}
- * @param handler A {@link CaptureErrorHandler}. If null the default will be used,
- * which will most likely print errors to stderr.
- */
- private Validator getValidator(int version, @Nullable CaptureErrorHandler handler)
- throws SAXException {
- Validator validator = null;
- InputStream xsdStream = SdkAddonsListConstants.getXsdStream(version);
- if (xsdStream != null) {
- SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
- Schema schema = factory.newSchema(new StreamSource(xsdStream));
- validator = schema.newValidator();
- if (handler != null) {
- validator.setErrorHandler(handler);
- }
- }
-
- return validator;
- }
-
- // --- Tests ------------
-
- /** Validates that NS_LATEST_VERSION points to the max available XSD schema. */
- public void testAddonLatestVersionNumber() throws Exception {
- CaptureErrorHandler handler = new CaptureErrorHandler();
-
- // There should be a schema matching NS_LATEST_VERSION
- assertNotNull(getValidator(SdkAddonsListConstants.NS_LATEST_VERSION, handler));
-
- // There should NOT be a schema with NS_LATEST_VERSION+1
- assertNull(
- String.format(
- "There's an ADDON XSD at version %d but SdkAddonsListConstants.NS_LATEST_VERSION is still set to %d.",
- SdkAddonsListConstants.NS_LATEST_VERSION + 1,
- SdkAddonsListConstants.NS_LATEST_VERSION),
- getValidator(SdkAddonsListConstants.NS_LATEST_VERSION + 1, handler));
- }
-
- /** Validate a valid sample using namespace version 1 using an InputStream */
- public void testValidateLocalAddonFile1() throws Exception {
- InputStream xmlStream = this.getClass().getResourceAsStream(
- "/com/android/sdklib/testdata/addons_list_sample_1.xml");
- Source source = new StreamSource(xmlStream);
-
- CaptureErrorHandler handler = new CaptureErrorHandler();
- Validator validator = getValidator(1, handler);
- validator.validate(source);
- handler.verify();
- }
-
- /** Validate a valid sample using namespace version 2 using an InputStream */
- public void testValidateLocalAddonFile2() throws Exception {
- InputStream xmlStream = this.getClass().getResourceAsStream(
- "/com/android/sdklib/testdata/addons_list_sample_2.xml");
- Source source = new StreamSource(xmlStream);
-
- CaptureErrorHandler handler = new CaptureErrorHandler();
- Validator validator = getValidator(2, handler);
- validator.validate(source);
- handler.verify();
- }
-
- // IMPORTANT: each time you add a test here, you should add a corresponding
- // test in AddonsListFetcherTest to validate the XML content is parsed correctly.
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/repository/ValidateRepositoryXmlTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/repository/ValidateRepositoryXmlTest.java
deleted file mode 100755
index bdc450c..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/repository/ValidateRepositoryXmlTest.java
+++ /dev/null
@@ -1,351 +0,0 @@
-/*
- * Copyright (C) 2009 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.repository;
-
-import com.android.annotations.Nullable;
-
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-import java.io.InputStream;
-import java.io.StringReader;
-
-import javax.xml.XMLConstants;
-import javax.xml.transform.Source;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.validation.Schema;
-import javax.xml.validation.SchemaFactory;
-import javax.xml.validation.Validator;
-
-import junit.framework.TestCase;
-
-/**
- * Tests local validation of an SDK Repository sample XMLs using an XML Schema validator.
- *
- * References:
- * http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi.html
- */
-public class ValidateRepositoryXmlTest extends TestCase {
-
- private static String OPEN_TAG_REPO =
- "<r:sdk-repository xmlns:r=\"http://schemas.android.com/sdk/android/repository/" +
- Integer.toString(SdkRepoConstants.NS_LATEST_VERSION) +
- "\">";
- private static String CLOSE_TAG_REPO = "</r:sdk-repository>";
-
- // --- Helpers ------------
-
- /**
- * Helper method that returns a validator for our Repository XSD
- *
- * @param version The version number, in range {@code 1..NS_LATEST_VERSION}
- * @param handler A {@link CaptureErrorHandler}. If null the default will be used,
- * which will most likely print errors to stderr.
- */
- private Validator getRepoValidator(int version, @Nullable CaptureErrorHandler handler)
- throws SAXException {
- Validator validator = null;
- InputStream xsdStream = SdkRepoConstants.getXsdStream(version);
- if (xsdStream != null) {
- SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
- Schema schema = factory.newSchema(new StreamSource(xsdStream));
- validator = schema.newValidator();
-
- if (handler != null) {
- validator.setErrorHandler(handler);
- }
- }
-
- return validator;
- }
-
- /** An helper that validates a string against an expected regexp. */
- private void assertRegex(String expectedRegexp, String actualString) {
- assertNotNull(actualString);
- assertTrue(
- String.format("Regexp Assertion Failed:\nExpected: %s\nActual: %s\n",
- expectedRegexp, actualString),
- actualString.matches(expectedRegexp));
- }
-
- // --- Tests ------------
-
- /** Validates that NS_LATEST_VERSION points to the max available XSD schema. */
- public void testRepoLatestVersionNumber() throws Exception {
- CaptureErrorHandler handler = new CaptureErrorHandler();
-
- // There should be a schema matching NS_LATEST_VERSION
- assertNotNull(getRepoValidator(SdkRepoConstants.NS_LATEST_VERSION, handler));
-
- // There should NOT be a schema with NS_LATEST_VERSION+1
- assertNull(
- String.format(
- "There's a REPO XSD at version %d but SdkRepoConstants.NS_LATEST_VERSION is still set to %d.",
- SdkRepoConstants.NS_LATEST_VERSION + 1,
- SdkRepoConstants.NS_LATEST_VERSION),
- getRepoValidator(SdkRepoConstants.NS_LATEST_VERSION + 1, handler));
- }
-
- /** Validate a valid sample using namespace version 1 using an InputStream */
- public void testValidateLocalRepositoryFile1() throws Exception {
- InputStream xmlStream = this.getClass().getResourceAsStream(
- "/com/android/sdklib/testdata/repository_sample_1.xml");
- Source source = new StreamSource(xmlStream);
-
- CaptureErrorHandler handler = new CaptureErrorHandler();
- Validator validator = getRepoValidator(1, handler);
- validator.validate(source);
- handler.verify();
- }
-
- /** Validate a valid sample using namespace version 2 using an InputStream */
- public void testValidateLocalRepositoryFile2() throws Exception {
- InputStream xmlStream = this.getClass().getResourceAsStream(
- "/com/android/sdklib/testdata/repository_sample_2.xml");
- Source source = new StreamSource(xmlStream);
-
- CaptureErrorHandler handler = new CaptureErrorHandler();
- Validator validator = getRepoValidator(2, handler);
- validator.validate(source);
- handler.verify();
- }
-
- /** Validate a valid sample using namespace version 3 using an InputStream */
- public void testValidateLocalRepositoryFile3() throws Exception {
- InputStream xmlStream = this.getClass().getResourceAsStream(
- "/com/android/sdklib/testdata/repository_sample_3.xml");
- Source source = new StreamSource(xmlStream);
-
- CaptureErrorHandler handler = new CaptureErrorHandler();
- Validator validator = getRepoValidator(3, handler);
- validator.validate(source);
- handler.verify();
- }
-
- /** Validate a valid sample using namespace version 4 using an InputStream */
- public void testValidateLocalRepositoryFile4() throws Exception {
- InputStream xmlStream = this.getClass().getResourceAsStream(
- "/com/android/sdklib/testdata/repository_sample_4.xml");
- Source source = new StreamSource(xmlStream);
-
- CaptureErrorHandler handler = new CaptureErrorHandler();
- Validator validator = getRepoValidator(4, handler);
- validator.validate(source);
- handler.verify();
-
- }
-
- /** Validate a valid sample using namespace version 5 using an InputStream */
- public void testValidateLocalRepositoryFile5() throws Exception {
- InputStream xmlStream = this.getClass().getResourceAsStream(
- "/com/android/sdklib/testdata/repository_sample_5.xml");
- Source source = new StreamSource(xmlStream);
-
- CaptureErrorHandler handler = new CaptureErrorHandler();
- Validator validator = getRepoValidator(5, handler);
- validator.validate(source);
- handler.verify();
-
- }
-
- /** Validate a valid sample using namespace version 5 using an InputStream */
- public void testValidateLocalRepositoryFile6() throws Exception {
- InputStream xmlStream = this.getClass().getResourceAsStream(
- "/com/android/sdklib/testdata/repository_sample_6.xml");
- Source source = new StreamSource(xmlStream);
-
- CaptureErrorHandler handler = new CaptureErrorHandler();
- Validator validator = getRepoValidator(6, handler);
- validator.validate(source);
- handler.verify();
-
- }
-
- /** Validate a valid sample using namespace version 5 using an InputStream */
- public void testValidateLocalRepositoryFile7() throws Exception {
- InputStream xmlStream = this.getClass().getResourceAsStream(
- "/com/android/sdklib/testdata/repository_sample_7.xml");
- Source source = new StreamSource(xmlStream);
-
- CaptureErrorHandler handler = new CaptureErrorHandler();
- Validator validator = getRepoValidator(7, handler);
- validator.validate(source);
- handler.verify();
-
- }
-
- // IMPORTANT: each time you add a test here, you should add a corresponding
- // test in SdkRepoSourceTest to validate the XML content is parsed correctly.
-
-
- // ---
-
- /** A document should at least have a root to be valid */
- public void testEmptyXml() throws Exception {
- String document = "<?xml version=\"1.0\"?>";
-
- Source source = new StreamSource(new StringReader(document));
-
- CaptureErrorHandler handler = new CaptureErrorHandler();
- Validator validator = getRepoValidator(SdkRepoConstants.NS_LATEST_VERSION, handler);
-
- try {
- validator.validate(source);
- } catch (SAXParseException e) {
- // We expect to get this specific exception message
- assertRegex("Premature end of file.*", e.getMessage());
- return;
- }
- // We shouldn't get here
- handler.verify();
- fail();
- }
-
- /** A document with a root element containing no platform, addon, etc., is valid. */
- public void testEmptyRootXml() throws Exception {
- String document = "<?xml version=\"1.0\"?>" +
- OPEN_TAG_REPO +
- CLOSE_TAG_REPO;
-
- Source source = new StreamSource(new StringReader(document));
-
- CaptureErrorHandler handler = new CaptureErrorHandler();
- Validator validator = getRepoValidator(SdkRepoConstants.NS_LATEST_VERSION, handler);
- validator.validate(source);
- handler.verify();
- }
-
- /** A document with an unknown element. */
- public void testUnknownContentXml() throws Exception {
- String document = "<?xml version=\"1.0\"?>" +
- OPEN_TAG_REPO +
- "<r:unknown />" +
- CLOSE_TAG_REPO;
-
- Source source = new StreamSource(new StringReader(document));
-
- // don't capture the validator errors, we want it to fail and catch the exception
- Validator validator = getRepoValidator(SdkRepoConstants.NS_LATEST_VERSION, null);
- try {
- validator.validate(source);
- } catch (SAXParseException e) {
- // We expect a parse expression referring to this grammar rule
- assertRegex("cvc-complex-type.2.4.a: Invalid content was found.*", e.getMessage());
- return;
- }
- // If we get here, the validator has not failed as we expected it to.
- fail();
- }
-
- /** A document with an incomplete element. */
- public void testIncompleteContentXml() throws Exception {
- String document = "<?xml version=\"1.0\"?>" +
- OPEN_TAG_REPO +
- "<r:platform> <r:api-level>1</r:api-level> <r:libs /> </r:platform>" +
- CLOSE_TAG_REPO;
-
- Source source = new StreamSource(new StringReader(document));
-
- // don't capture the validator errors, we want it to fail and catch the exception
- Validator validator = getRepoValidator(SdkRepoConstants.NS_LATEST_VERSION, null);
- try {
- validator.validate(source);
- } catch (SAXParseException e) {
- // We expect a parse error referring to this grammar rule
- assertRegex("cvc-complex-type.2.4.a: Invalid content was found.*", e.getMessage());
- return;
- }
- // If we get here, the validator has not failed as we expected it to.
- fail();
- }
-
- /** A document with a wrong type element. */
- public void testWrongTypeContentXml() throws Exception {
- String document = "<?xml version=\"1.0\"?>" +
- OPEN_TAG_REPO +
- "<r:platform> <r:api-level>NotAnInteger</r:api-level> <r:libs /> </r:platform>" +
- CLOSE_TAG_REPO;
-
- Source source = new StreamSource(new StringReader(document));
-
- // don't capture the validator errors, we want it to fail and catch the exception
- Validator validator = getRepoValidator(SdkRepoConstants.NS_LATEST_VERSION, null);
- try {
- validator.validate(source);
- } catch (SAXParseException e) {
- // We expect a parse error referring to this grammar rule
- assertRegex("cvc-datatype-valid.1.2.1: 'NotAnInteger' is not a valid value.*",
- e.getMessage());
- return;
- }
- // If we get here, the validator has not failed as we expected it to.
- fail();
- }
-
- /** A document with an unknown license id. */
- public void testLicenseIdNotFound() throws Exception {
- // we define a license named "lic1" and then reference "lic2" instead
- String document = "<?xml version=\"1.0\"?>" +
- OPEN_TAG_REPO +
- "<r:license id=\"lic1\"> some license </r:license> " +
- "<r:tool> <r:uses-license ref=\"lic2\" /> <r:revision> <r:major>1</r:major> </r:revision> " +
- "<r:min-platform-tools-rev> <r:major>1</r:major> </r:min-platform-tools-rev> " +
- "<r:archives> <r:archive os=\"any\"> <r:size>1</r:size> <r:checksum>2822ae37115ebf13412bbef91339ee0d9454525e</r:checksum> " +
- "<r:url>url</r:url> </r:archive> </r:archives> </r:tool>" +
- CLOSE_TAG_REPO;
-
- Source source = new StreamSource(new StringReader(document));
-
- // don't capture the validator errors, we want it to fail and catch the exception
- Validator validator = getRepoValidator(SdkRepoConstants.NS_LATEST_VERSION, null);
- try {
- validator.validate(source);
- } catch (SAXParseException e) {
- // We expect a parse error referring to this grammar rule
- assertRegex("cvc-id.1: There is no ID/IDREF binding for IDREF 'lic2'.*",
- e.getMessage());
- return;
- }
- // If we get here, the validator has not failed as we expected it to.
- fail();
- }
-
- /** The latest XSD repository-6 should fail when an 'extra' is present. */
- public void testExtraPathWithSlash() throws Exception {
- String document = "<?xml version=\"1.0\"?>" +
- OPEN_TAG_REPO +
- "<r:extra> <r:revision>1</r:revision> <r:path>path</r:path> " +
- "<r:archives> <r:archive os=\"any\"> <r:size>1</r:size> <r:checksum>2822ae37115ebf13412bbef91339ee0d9454525e</r:checksum> " +
- "<r:url>url</r:url> </r:archive> </r:archives> </r:extra>" +
- CLOSE_TAG_REPO;
-
- Source source = new StreamSource(new StringReader(document));
-
- // don't capture the validator errors, we want it to fail and catch the exception
- Validator validator = getRepoValidator(SdkRepoConstants.NS_LATEST_VERSION, null);
- try {
- validator.validate(source);
- } catch (SAXParseException e) {
- // We expect a parse error referring to this grammar rule
- assertRegex("cvc-complex-type.2.4.a: Invalid content was found starting with element 'r:extra'.*",
- e.getMessage());
- return;
- }
- // If we get here, the validator has not failed as we expected it to.
- fail();
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/repository/ValidateSysImgXmlTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/repository/ValidateSysImgXmlTest.java
deleted file mode 100755
index fe7b1e8..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/repository/ValidateSysImgXmlTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2012 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.repository;
-
-import com.android.annotations.Nullable;
-
-import org.xml.sax.SAXException;
-
-import java.io.InputStream;
-
-import javax.xml.XMLConstants;
-import javax.xml.transform.Source;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.validation.Schema;
-import javax.xml.validation.SchemaFactory;
-import javax.xml.validation.Validator;
-
-import junit.framework.TestCase;
-
-/**
- * Tests local validation of an SDK Repository sample XMLs using an XML Schema validator.
- *
- * References:
- * http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi.html
- */
-public class ValidateSysImgXmlTest extends TestCase {
-
- // --- Helpers ------------
-
- /**
- * Helper method that returns a validator for our Repository XSD
- *
- * @param version The version number, in range {@code 1..NS_LATEST_VERSION}
- * @param handler A {@link CaptureErrorHandler}. If null the default will be used,
- * which will most likely print errors to stderr.
- */
- private Validator getValidator(int version, @Nullable CaptureErrorHandler handler)
- throws SAXException {
- Validator validator = null;
- InputStream xsdStream = SdkSysImgConstants.getXsdStream(version);
- if (xsdStream != null) {
- SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
- Schema schema = factory.newSchema(new StreamSource(xsdStream));
- validator = schema.newValidator();
-
- if (handler != null) {
- validator.setErrorHandler(handler);
- }
- }
-
- return validator;
- }
-
- // --- Tests ------------
-
- /** Validates that NS_LATEST_VERSION points to the max available XSD schema. */
- public void testSysImgLatestVersionNumber() throws Exception {
- CaptureErrorHandler handler = new CaptureErrorHandler();
-
- // There should be a schema matching NS_LATEST_VERSION
- assertNotNull(getValidator(SdkSysImgConstants.NS_LATEST_VERSION, handler));
-
- // There should NOT be a schema with NS_LATEST_VERSION+1
- assertNull(
- String.format(
- "There's a REPO XSD at version %d but SdkSysImgConstants.NS_LATEST_VERSION is still set to %d.",
- SdkSysImgConstants.NS_LATEST_VERSION + 1,
- SdkSysImgConstants.NS_LATEST_VERSION),
- getValidator(SdkSysImgConstants.NS_LATEST_VERSION + 1, handler));
- }
-
- /** Validate a valid sample using namespace version 1 using an InputStream */
- public void testValidateLocalRepositoryFile1() throws Exception {
- InputStream xmlStream = this.getClass().getResourceAsStream(
- "/com/android/sdklib/testdata/sys_img_sample_1.xml");
- Source source = new StreamSource(xmlStream);
-
- CaptureErrorHandler handler = new CaptureErrorHandler();
- Validator validator = getValidator(1, handler);
- validator.validate(source);
- handler.verify();
- }
-
- // IMPORTANT: each time you add a test here, you should add a corresponding
- // test in SdkSysImgSourceTest to validate the XML content is parsed correctly.
-
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/AndroidManifest-activityalias.xml b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/AndroidManifest-activityalias.xml
deleted file mode 100644
index 6f63897..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/AndroidManifest-activityalias.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.testapp" android:versionCode="42"
- android:versionName="1.42">
-
- <application android:icon="@drawable/icon">
- <activity android:name="com.android.testapp.MainActivity"
- android:label="@string/app_name">
- </activity>
-
- <activity-alias android:name="com.android.testapp.AliasActivity"
- android:label="@string/app_name"
- android:targetActivity="com.android.testapp.MainActivity">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity-alias>
- </application>
-
- <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="8" />
-
-</manifest>
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/AndroidManifest-instrumentation.xml b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/AndroidManifest-instrumentation.xml
deleted file mode 100644
index f1dce67..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/AndroidManifest-instrumentation.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.AndroidProject.tests">
-
- <!--
- This declares that this app uses the instrumentation test runner targeting
- the package of com.android.samples. To run the tests use the command:
- "adb shell am instrument -w com.android.samples.tests/android.test.InstrumentationTestRunner"
- -->
- <instrumentation android:name="android.test.InstrumentationTestRunner"
- android:targetPackage="com.android.AndroidProject"
- android:label="Sample test for deployment."/>
-
- <application>
- <uses-library android:name="android.test.runner" />
- </application>
- <uses-sdk android:minSdkVersion="foo"/>
-
-</manifest>
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/AndroidManifest-testapp.xml b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/AndroidManifest-testapp.xml
deleted file mode 100644
index f55b4e0..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/AndroidManifest-testapp.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.testapp" android:versionCode="42"
- android:versionName="1.42">
- <application android:icon="@drawable/icon">
- <activity android:name="com.android.testapp.MainActivity"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- </activity>
- <uses-library android:name="android.test.runner"
- android:required="false" />
- <uses-library android:name="android.test.runner2" />
- </application>
- <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="8" />
- <supports-screens android:resizeable="true"
- android:smallScreens="true" android:anyDensity="true"
- android:largeScreens="true" android:normalScreens="true" />
- <uses-configuration android:reqKeyboardType="twelvekey"
- android:reqTouchScreen="finger" android:reqFiveWayNav="true"
- android:reqHardKeyboard="true" android:reqNavigation="nonav" />
- <uses-feature android:glEsVersion="0x00020001" />
- <uses-feature android:name="com.foo.feature" />
- <instrumentation android:name="android.test.InstrumentationTestRunner"
- android:targetPackage="com.example.android.apis" android:label="Tests for Api Demos." />
-</manifest>
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/AndroidManifest-testapp2.xml b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/AndroidManifest-testapp2.xml
deleted file mode 100644
index d5bcac7..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/AndroidManifest-testapp2.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.testapp" android:versionCode="42"
- android:versionName="1.42">
- <application android:icon="@drawable/icon"/>
- <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="8" />
- <supports-screens android:largeScreens="false" />
-</manifest>
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/addon_sample_1.xml b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/addon_sample_1.xml
deleted file mode 100755
index d761d73..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/addon_sample_1.xml
+++ /dev/null
@@ -1,164 +0,0 @@
-<?xml version="1.0"?>
-<!--
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<sdk:sdk-addon
- xmlns:sdk="http://schemas.android.com/sdk/android/addon/1">
-
- <!-- Define a couple of licenses. These will be referenced by uses-license later. -->
-
- <sdk:license type="text" id="license1">
- This is the license
- for this platform.
- </sdk:license>
-
- <sdk:license id="license2">
- Licenses are only of type 'text' right now, so this is implied.
- </sdk:license>
-
- <!-- Inner elements must be either platform, add-on, doc or tool.
- There can be 0 or more of each, in any order. -->
-
- <sdk:add-on>
- <sdk:name>My First add-on</sdk:name>
- <sdk:api-level>1</sdk:api-level>
- <sdk:vendor>John Doe</sdk:vendor>
- <sdk:revision>1</sdk:revision>
- <sdk:uses-license ref="license2" />
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/myfirstaddon</sdk:desc-url>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/add-ons/first.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <!-- The libs node is mandatory, however it can be empty. -->
- <sdk:libs>
- <sdk:lib>
- <sdk:name>android.blah.somelib</sdk:name>
- <sdk:description>The description for this library.</sdk:description>
- </sdk:lib>
- <sdk:lib>
- <!-- sdk:description is optional, name is not -->
- <sdk:name>com.android.mymaps</sdk:name>
- </sdk:lib>
- </sdk:libs>
- </sdk:add-on>
-
- <sdk:add-on>
- <sdk:name>My Second add-on</sdk:name>
- <sdk:api-level>2</sdk:api-level>
- <sdk:vendor>John Deer</sdk:vendor>
- <sdk:revision>42</sdk:revision>
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/second-42-win.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/second-42-linux.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:libs>
- <sdk:lib>
- <sdk:name>android.blah.somelib</sdk:name>
- <sdk:description>The description for this library.</sdk:description>
- </sdk:lib>
- <sdk:lib>
- <sdk:name>com.android.mymaps</sdk:name>
- </sdk:lib>
- </sdk:libs>
- <sdk:uses-license ref="license2" />
- </sdk:add-on>
-
- <sdk:add-on>
- <sdk:uses-license ref="license2" />
- <sdk:name>This add-on has no libraries</sdk:name>
- <sdk:api-level>4</sdk:api-level>
- <sdk:vendor>Joe Bar</sdk:vendor>
- <sdk:revision>3</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/imnotanarchiveimadoctorjim.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <!-- The libs node is mandatory, however it can be empty. -->
- <sdk:libs />
- </sdk:add-on>
-
- <sdk:extra>
- <sdk:vendor>g</sdk:vendor>
- <sdk:path>usb_driver</sdk:path>
- <sdk:uses-license ref="license2" />
- <sdk:revision>43</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/extraduff.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:description>An Extra package for the USB driver, it will install in $SDK/usb_driver</sdk:description>
- <sdk:desc-url>http://www.example.com/extra.html</sdk:desc-url>
- <sdk:min-tools-rev>3</sdk:min-tools-rev>
- <sdk:obsolete/>
- </sdk:extra>
-
- <sdk:extra>
- <sdk:vendor>android_vendor</sdk:vendor>
- <sdk:path>extra_api_dep</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: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>
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/addon_sample_2.xml b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/addon_sample_2.xml
deleted file mode 100755
index 1033c15..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/addon_sample_2.xml
+++ /dev/null
@@ -1,179 +0,0 @@
-<?xml version="1.0"?>
-<!--
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<sdk:sdk-addon
- xmlns:sdk="http://schemas.android.com/sdk/android/addon/2">
-
- <!-- Define a couple of licenses. These will be referenced by uses-license later. -->
-
- <sdk:license type="text" id="license1">
- This is the license
- for this platform.
- </sdk:license>
-
- <sdk:license id="license2">
- Licenses are only of type 'text' right now, so this is implied.
- </sdk:license>
-
- <!-- Inner elements must be either platform, add-on, doc or tool.
- There can be 0 or more of each, in any order. -->
-
- <sdk:add-on>
- <sdk:name>My First add-on</sdk:name>
- <sdk:api-level>1</sdk:api-level>
- <sdk:vendor>John Doe</sdk:vendor>
- <sdk:revision>1</sdk:revision>
- <sdk:uses-license ref="license2" />
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/myfirstaddon</sdk:desc-url>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/add-ons/first.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <!-- The libs node is mandatory, however it can be empty. -->
- <sdk:libs>
- <sdk:lib>
- <sdk:name>android.blah.somelib</sdk:name>
- <sdk:description>The description for this library.</sdk:description>
- </sdk:lib>
- <sdk:lib>
- <!-- sdk:description is optional, name is not -->
- <sdk:name>com.android.mymaps</sdk:name>
- </sdk:lib>
- </sdk:libs>
- <sdk:layoutlib>
- <sdk:api>5</sdk:api>
- <sdk:revision>0</sdk:revision>
- </sdk:layoutlib>
- </sdk:add-on>
-
- <sdk:add-on>
- <sdk:name>My Second add-on</sdk:name>
- <sdk:api-level>2</sdk:api-level>
- <sdk:vendor>John Deer</sdk:vendor>
- <sdk:revision>42</sdk:revision>
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/second-42-win.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/second-42-linux.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:libs>
- <sdk:lib>
- <sdk:name>android.blah.somelib</sdk:name>
- <sdk:description>The description for this library.</sdk:description>
- </sdk:lib>
- <sdk:lib>
- <sdk:name>com.android.mymaps</sdk:name>
- </sdk:lib>
- </sdk:libs>
- <sdk:uses-license ref="license2" />
- <!-- No layoutlib element in this package. It's optional. -->
- </sdk:add-on>
-
- <sdk:add-on>
- <sdk:uses-license ref="license2" />
- <sdk:name>This add-on has no libraries</sdk:name>
- <sdk:api-level>4</sdk:api-level>
- <sdk:vendor>Joe Bar</sdk:vendor>
- <sdk:revision>3</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/imnotanarchiveimadoctorjim.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <!-- The libs node is mandatory, however it can be empty. -->
- <sdk:libs />
- <sdk:layoutlib>
- <sdk:api>3</sdk:api>
- <sdk:revision>42</sdk:revision>
- </sdk:layoutlib>
- </sdk:add-on>
-
- <sdk:extra>
- <sdk:vendor>g</sdk:vendor>
- <sdk:path>usb_driver</sdk:path>
- <sdk:uses-license ref="license2" />
- <sdk:revision>43</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/extraduff.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:description>An Extra package for the USB driver, it will install in $SDK/usb_driver</sdk:description>
- <sdk:desc-url>http://www.example.com/extra.html</sdk:desc-url>
- <sdk:min-tools-rev>3</sdk:min-tools-rev>
- <sdk:obsolete/>
- </sdk:extra>
-
- <sdk:extra>
- <sdk:vendor>android_vendor</sdk:vendor>
- <sdk:path>extra_api_dep</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:project-files>
- <sdk:path>v8/veggies_8.jar</sdk:path>
- <sdk:path>root.jar</sdk:path>
- <sdk:path>dir1/dir 2 with space/mylib.jar</sdk:path>
- </sdk:project-files>
- </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>
- <!-- No project-files element in this package. -->
- </sdk:extra>
-
-</sdk:sdk-addon>
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/addon_sample_3.xml b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/addon_sample_3.xml
deleted file mode 100755
index 568cec1..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/addon_sample_3.xml
+++ /dev/null
@@ -1,180 +0,0 @@
-<?xml version="1.0"?>
-<!--
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<sdk:sdk-addon
- xmlns:sdk="http://schemas.android.com/sdk/android/addon/3">
-
- <!-- Define a couple of licenses. These will be referenced by uses-license later. -->
-
- <sdk:license type="text" id="license1">
- This is the license
- for this platform.
- </sdk:license>
-
- <sdk:license id="license2">
- Licenses are only of type 'text' right now, so this is implied.
- </sdk:license>
-
- <!-- Inner elements must be either platform, add-on, doc or tool.
- There can be 0 or more of each, in any order. -->
-
- <sdk:add-on>
- <sdk:name>My First add-on</sdk:name>
- <sdk:api-level>1</sdk:api-level>
- <sdk:vendor>John Doe</sdk:vendor>
- <sdk:revision>1</sdk:revision>
- <sdk:uses-license ref="license2" />
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/myfirstaddon</sdk:desc-url>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/add-ons/first.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <!-- The libs node is mandatory, however it can be empty. -->
- <sdk:libs>
- <sdk:lib>
- <sdk:name>android.blah.somelib</sdk:name>
- <sdk:description>The description for this library.</sdk:description>
- </sdk:lib>
- <sdk:lib>
- <!-- sdk:description is optional, name is not -->
- <sdk:name>com.android.mymaps</sdk:name>
- </sdk:lib>
- </sdk:libs>
- <sdk:layoutlib>
- <sdk:api>5</sdk:api>
- <sdk:revision>0</sdk:revision>
- </sdk:layoutlib>
- </sdk:add-on>
-
- <sdk:add-on>
- <sdk:name>My Second add-on</sdk:name>
- <sdk:api-level>2</sdk:api-level>
- <sdk:vendor>John Deer</sdk:vendor>
- <sdk:revision>42</sdk:revision>
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/second-42-win.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/second-42-linux.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:libs>
- <sdk:lib>
- <sdk:name>android.blah.somelib</sdk:name>
- <sdk:description>The description for this library.</sdk:description>
- </sdk:lib>
- <sdk:lib>
- <sdk:name>com.android.mymaps</sdk:name>
- </sdk:lib>
- </sdk:libs>
- <sdk:uses-license ref="license2" />
- <!-- No layoutlib element in this package. It's optional. -->
- </sdk:add-on>
-
- <sdk:add-on>
- <sdk:uses-license ref="license2" />
- <sdk:name>This add-on has no libraries</sdk:name>
- <sdk:api-level>4</sdk:api-level>
- <sdk:vendor>Joe Bar</sdk:vendor>
- <sdk:revision>3</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/imnotanarchiveimadoctorjim.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <!-- The libs node is mandatory, however it can be empty. -->
- <sdk:libs />
- <sdk:layoutlib>
- <sdk:api>3</sdk:api>
- <sdk:revision>42</sdk:revision>
- </sdk:layoutlib>
- </sdk:add-on>
-
- <sdk:extra>
- <sdk:vendor>g</sdk:vendor>
- <sdk:path>usb_driver</sdk:path>
- <sdk:uses-license ref="license2" />
- <sdk:revision>43</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/extraduff.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:description>An Extra package for the USB driver, it will install in $SDK/usb_driver</sdk:description>
- <sdk:desc-url>http://www.example.com/extra.html</sdk:desc-url>
- <sdk:min-tools-rev>3</sdk:min-tools-rev>
- <sdk:obsolete/>
- </sdk:extra>
-
- <sdk:extra>
- <sdk:vendor>android_vendor</sdk:vendor>
- <sdk:path>extra_api_dep</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:project-files>
- <sdk:path>v8/veggies_8.jar</sdk:path>
- <sdk:path>root.jar</sdk:path>
- <sdk:path>dir1/dir 2 with space/mylib.jar</sdk:path>
- </sdk:project-files>
- <sdk:old-paths>path1;old_path2;oldPath3</sdk:old-paths>
- </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>
- <!-- No project-files element in this package. -->
- </sdk:extra>
-
-</sdk:sdk-addon>
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/addon_sample_4.xml b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/addon_sample_4.xml
deleted file mode 100755
index 6fba439..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/addon_sample_4.xml
+++ /dev/null
@@ -1,203 +0,0 @@
-<?xml version="1.0"?>
-<!--
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<sdk:sdk-addon
- xmlns:sdk="http://schemas.android.com/sdk/android/addon/4">
-
- <!-- Define a couple of licenses. These will be referenced by uses-license later. -->
-
- <sdk:license type="text" id="license1">
- This is the license
- for this platform.
- </sdk:license>
-
- <sdk:license id="license2">
- Licenses are only of type 'text' right now, so this is implied.
- </sdk:license>
-
- <!-- Inner elements must be either platform, add-on, doc or tool.
- There can be 0 or more of each, in any order. -->
-
- <sdk:add-on>
- <sdk:name-id>My_First_add-on</sdk:name-id>
- <sdk:name-display>My First add-on</sdk:name-display>
-
- <sdk:vendor-id>John_Doe</sdk:vendor-id>
- <sdk:vendor-display>John Doe</sdk:vendor-display>
-
- <sdk:api-level>1</sdk:api-level>
- <sdk:revision>1</sdk:revision>
- <sdk:uses-license ref="license2" />
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/myfirstaddon</sdk:desc-url>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/add-ons/first.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <!-- The libs node is mandatory, however it can be empty. -->
- <sdk:libs>
- <sdk:lib>
- <sdk:name>android.blah.somelib</sdk:name>
- <sdk:description>The description for this library.</sdk:description>
- </sdk:lib>
- <sdk:lib>
- <!-- sdk:description is optional, name is not -->
- <sdk:name>com.android.mymaps</sdk:name>
- </sdk:lib>
- </sdk:libs>
- <sdk:layoutlib>
- <sdk:api>5</sdk:api>
- <sdk:revision>0</sdk:revision>
- </sdk:layoutlib>
- </sdk:add-on>
-
- <sdk:add-on>
- <sdk:name-id>My_Second_add-on</sdk:name-id>
- <sdk:name-display>My Second add-on</sdk:name-display>
-
- <sdk:vendor-id>John_Deer</sdk:vendor-id>
- <sdk:vendor-display>John Deer</sdk:vendor-display>
-
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>42</sdk:revision>
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/second-42-win.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/second-42-linux.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:libs>
- <sdk:lib>
- <sdk:name>android.blah.somelib</sdk:name>
- <sdk:description>The description for this library.</sdk:description>
- </sdk:lib>
- <sdk:lib>
- <sdk:name>com.android.mymaps</sdk:name>
- </sdk:lib>
- </sdk:libs>
- <sdk:uses-license ref="license2" />
- <!-- No layoutlib element in this package. It's optional. -->
- </sdk:add-on>
-
- <sdk:add-on>
- <sdk:name-id>no_libs</sdk:name-id>
- <sdk:name-display>This add-on has no libraries</sdk:name-display>
-
- <sdk:vendor-id>Joe_Bar</sdk:vendor-id>
- <sdk:vendor-display>Joe Bar</sdk:vendor-display>
-
- <sdk:uses-license ref="license2" />
- <sdk:api-level>4</sdk:api-level>
- <sdk:revision>3</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/imnotanarchiveimadoctorjim.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <!-- The libs node is mandatory, however it can be empty. -->
- <sdk:libs />
- <sdk:layoutlib>
- <sdk:api>3</sdk:api>
- <sdk:revision>42</sdk:revision>
- </sdk:layoutlib>
- </sdk:add-on>
-
- <sdk:extra>
- <sdk:name-display>Random name, not an id!</sdk:name-display>
-
- <sdk:vendor-id>cyclop</sdk:vendor-id>
- <sdk:vendor-display>The big bus</sdk:vendor-display>
-
- <sdk:path>usb_driver</sdk:path>
- <sdk:uses-license ref="license2" />
- <sdk:revision>43</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/extraduff.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:description>An Extra package for the USB driver, it will install in $SDK/usb_driver</sdk:description>
- <sdk:desc-url>http://www.example.com/extra.html</sdk:desc-url>
- <sdk:min-tools-rev>3</sdk:min-tools-rev>
- <sdk:obsolete/>
- </sdk:extra>
-
- <sdk:extra>
- <sdk:name-display>Yet another extra, by Android</sdk:name-display>
-
- <sdk:vendor-id>android_vendor</sdk:vendor-id>
- <sdk:vendor-display>Android Vendor</sdk:vendor-display>
-
- <sdk:path>extra_api_dep</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:project-files>
- <sdk:path>v8/veggies_8.jar</sdk:path>
- <sdk:path>root.jar</sdk:path>
- <sdk:path>dir1/dir 2 with space/mylib.jar</sdk:path>
- </sdk:project-files>
- <sdk:old-paths>path1;old_path2;oldPath3</sdk:old-paths>
- </sdk:extra>
-
- <sdk:extra>
- <sdk:name-display>. -..- - .-. .-</sdk:name-display>
-
- <sdk:vendor-id>____</sdk:vendor-id>
- <sdk:vendor-display>____</sdk:vendor-display>
-
- <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>
- <!-- No project-files element in this package. -->
- </sdk:extra>
-
-</sdk:sdk-addon>
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/addon_sample_5.xml b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/addon_sample_5.xml
deleted file mode 100755
index 47b37be..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/addon_sample_5.xml
+++ /dev/null
@@ -1,214 +0,0 @@
-<?xml version="1.0"?>
-<!--
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<sdk:sdk-addon
- xmlns:sdk="http://schemas.android.com/sdk/android/addon/5">
-
- <!-- Define a couple of licenses. These will be referenced by uses-license later. -->
-
- <sdk:license type="text" id="license1">
- This is the license
- for this platform.
- </sdk:license>
-
- <sdk:license id="license2">
- Licenses are only of type 'text' right now, so this is implied.
- </sdk:license>
-
- <!-- Inner elements must be either platform, add-on, doc or tool.
- There can be 0 or more of each, in any order. -->
-
- <sdk:add-on>
- <sdk:name-id>My_First_add-on</sdk:name-id>
- <sdk:name-display>My First add-on</sdk:name-display>
-
- <sdk:vendor-id>John_Doe</sdk:vendor-id>
- <sdk:vendor-display>John Doe</sdk:vendor-display>
-
- <sdk:api-level>1</sdk:api-level>
- <sdk:revision>1</sdk:revision>
- <sdk:uses-license ref="license2" />
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/myfirstaddon</sdk:desc-url>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/add-ons/first.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <!-- The libs node is mandatory, however it can be empty. -->
- <sdk:libs>
- <sdk:lib>
- <sdk:name>android.blah.somelib</sdk:name>
- <sdk:description>The description for this library.</sdk:description>
- </sdk:lib>
- <sdk:lib>
- <!-- sdk:description is optional, name is not -->
- <sdk:name>com.android.mymaps</sdk:name>
- </sdk:lib>
- </sdk:libs>
- <sdk:layoutlib>
- <sdk:api>5</sdk:api>
- <sdk:revision>0</sdk:revision>
- </sdk:layoutlib>
- </sdk:add-on>
-
- <sdk:add-on>
- <sdk:name-id>My_Second_add-on</sdk:name-id>
- <sdk:name-display>My Second add-on</sdk:name-display>
-
- <sdk:vendor-id>John_Deer</sdk:vendor-id>
- <sdk:vendor-display>John Deer</sdk:vendor-display>
-
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>42</sdk:revision>
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/second-42-win.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/second-42-linux.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:libs>
- <sdk:lib>
- <sdk:name>android.blah.somelib</sdk:name>
- <sdk:description>The description for this library.</sdk:description>
- </sdk:lib>
- <sdk:lib>
- <sdk:name>com.android.mymaps</sdk:name>
- </sdk:lib>
- </sdk:libs>
- <sdk:uses-license ref="license2" />
- <!-- No layoutlib element in this package. It's optional. -->
- </sdk:add-on>
-
- <sdk:add-on>
- <sdk:name-id>no_libs</sdk:name-id>
- <sdk:name-display>This add-on has no libraries</sdk:name-display>
-
- <sdk:vendor-id>Joe_Bar</sdk:vendor-id>
- <sdk:vendor-display>Joe Bar</sdk:vendor-display>
-
- <sdk:uses-license ref="license2" />
- <sdk:api-level>4</sdk:api-level>
- <sdk:revision>3</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/imnotanarchiveimadoctorjim.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <!-- The libs node is mandatory, however it can be empty. -->
- <sdk:libs />
- <sdk:layoutlib>
- <sdk:api>3</sdk:api>
- <sdk:revision>42</sdk:revision>
- </sdk:layoutlib>
- </sdk:add-on>
-
- <sdk:extra>
- <sdk:name-display>Random name, not an id!</sdk:name-display>
-
- <sdk:vendor-id>cyclop</sdk:vendor-id>
- <sdk:vendor-display>The big bus</sdk:vendor-display>
-
- <sdk:path>usb_driver</sdk:path>
- <sdk:uses-license ref="license2" />
- <sdk:revision>43</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/extraduff.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:description>An Extra package for the USB driver, it will install in $SDK/usb_driver</sdk:description>
- <sdk:desc-url>http://www.example.com/extra.html</sdk:desc-url>
- <sdk:min-tools-rev>
- <sdk:major>3</sdk:major>
- <sdk:minor>2</sdk:minor>
- <sdk:micro>1</sdk:micro>
- <sdk:preview>42</sdk:preview>
- </sdk:min-tools-rev>
- <sdk:obsolete/>
- </sdk:extra>
-
- <sdk:extra>
- <sdk:name-display>Yet another extra, by Android</sdk:name-display>
-
- <sdk:vendor-id>android_vendor</sdk:vendor-id>
- <sdk:vendor-display>Android Vendor</sdk:vendor-display>
-
- <sdk:path>extra_api_dep</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>
- <sdk:major>3</sdk:major>
- </sdk:min-tools-rev>
- <sdk:min-api-level>42</sdk:min-api-level>
- <sdk:project-files>
- <sdk:path>v8/veggies_8.jar</sdk:path>
- <sdk:path>root.jar</sdk:path>
- <sdk:path>dir1/dir 2 with space/mylib.jar</sdk:path>
- </sdk:project-files>
- <sdk:old-paths>path1;old_path2;oldPath3</sdk:old-paths>
- </sdk:extra>
-
- <sdk:extra>
- <sdk:name-display>. -..- - .-. .-</sdk:name-display>
-
- <sdk:vendor-id>____</sdk:vendor-id>
- <sdk:vendor-display>____</sdk:vendor-display>
-
- <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>
- <sdk:major>3</sdk:major>
- <!-- no minor, assumed to be 0 -->
- <sdk:micro>1</sdk:micro>
- </sdk:min-tools-rev>
- <sdk:min-api-level>42</sdk:min-api-level>
- <sdk:obsolete></sdk:obsolete>
- <!-- No project-files element in this package. -->
- </sdk:extra>
-
-</sdk:sdk-addon>
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/addons_list_sample_1.xml b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/addons_list_sample_1.xml
deleted file mode 100755
index 5ea5cb8..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/addons_list_sample_1.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<sdk:sdk-addons-list
- xmlns:sdk="http://schemas.android.com/sdk/android/addons-list/1">
-
- <sdk:addon-site>
- <sdk:url>http://www.example.com/my_addons.xml</sdk:url>
- <sdk:name> <!-- we'll ignore leading/trailing spacing -->
- My Example Add-ons.
- </sdk:name>
- </sdk:addon-site>
-
- <sdk:addon-site>
- <sdk:url>http://www.example.co.jp/addons.xml</sdk:url>
- <!-- this file is UTF-8 so we support character sets -->
- <sdk:name>ありがとうございます。</sdk:name>
- </sdk:addon-site>
-
- <sdk:addon-site>
- <sdk:url>http://www.example.com/</sdk:url>
- <sdk:name>Example of directory URL.</sdk:name>
- </sdk:addon-site>
-
- <sdk:addon-site>
- <sdk:url>relative_url.xml</sdk:url>
- <sdk:name>Relative URL.</sdk:name>
- </sdk:addon-site>
-
-</sdk:sdk-addons-list>
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/addons_list_sample_2.xml b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/addons_list_sample_2.xml
deleted file mode 100755
index ef72b2c..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/addons_list_sample_2.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<sdk:sdk-addons-list
- xmlns:sdk="http://schemas.android.com/sdk/android/addons-list/2">
-
- <sdk:addon-site>
- <sdk:url>http://www.example.com/my_addons.xml</sdk:url>
- <sdk:name> <!-- we'll ignore leading/trailing spacing -->
- My Example Add-ons.
- </sdk:name>
- </sdk:addon-site>
-
- <sdk:addon-site>
- <sdk:url>http://www.example.co.jp/addons.xml</sdk:url>
- <!-- this file is UTF-8 so we support character sets -->
- <sdk:name>ありがとうございます。</sdk:name>
- </sdk:addon-site>
-
- <sdk:addon-site>
- <sdk:url>http://www.example.com/</sdk:url>
- <sdk:name>Example of directory URL.</sdk:name>
- </sdk:addon-site>
-
- <sdk:sys-img-site>
- <sdk:url>http://www.example.com/</sdk:url>
- <sdk:name>Example of sys-img URL using the default xml filename.</sdk:name>
- </sdk:sys-img-site>
-
- <sdk:sys-img-site>
- <sdk:url>http://www.example.com/specific_file.xml</sdk:url>
- <sdk:name>Example of sys-img URL using a specific xml filename.</sdk:name>
- </sdk:sys-img-site>
-
- <sdk:addon-site>
- <sdk:url>relative/url.xml</sdk:url>
- <sdk:name>Relative URL.</sdk:name>
- </sdk:addon-site>
-
-</sdk:sdk-addons-list>
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/repository_sample_1.xml b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/repository_sample_1.xml
deleted file mode 100755
index 7e2bc36..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/repository_sample_1.xml
+++ /dev/null
@@ -1,274 +0,0 @@
-<?xml version="1.0"?>
-<!--
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<sdk:sdk-repository
- xmlns:sdk="http://schemas.android.com/sdk/android/repository/1">
-
- <!-- Define a couple of licenses. These will be referenced by uses-license later. -->
-
- <sdk:license type="text" id="license1">
- This is the license
- for this platform.
- </sdk:license>
-
- <sdk:license id="license2">
- Licenses are only of type 'text' right now, so this is implied.
- </sdk:license>
-
- <!-- Inner elements must be either platform, add-on, doc or tool.
- There can be 0 or more of each, in any order. -->
-
- <sdk:platform>
- <sdk:version>1.0</sdk:version>
- <sdk:api-level>1</sdk:api-level>
- <sdk:revision>3</sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/platform1.html</sdk:desc-url>
- <sdk:release-note>This is an optional release note
- for this package. It's a free multi-line text.
- </sdk:release-note>
- <sdk:release-url>http://some/url/for/the/release/note.html</sdk:release-url>
- <sdk:min-tools-rev>2</sdk:min-tools-rev>
- <!-- The archives node is mandatory and it cannot be empty. -->
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/files/plat1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:platform>
-
- <sdk:doc>
- <sdk:api-level>1</sdk:api-level>
- <sdk:revision>1</sdk:revision>
- <!-- the license element is not mandatory. -->
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/docs.html</sdk:desc-url>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/docs/docs1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:doc>
-
- <sdk:add-on>
- <sdk:name>My First add-on</sdk:name>
- <sdk:api-level>1</sdk:api-level>
- <sdk:vendor>John Doe</sdk:vendor>
- <sdk:revision>1</sdk:revision>
- <sdk:uses-license ref="license2" />
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/myfirstaddon</sdk:desc-url>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/add-ons/first.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <!-- The libs node is mandatory, however it can be empty. -->
- <sdk:libs>
- <sdk:lib>
- <sdk:name>android.blah.somelib</sdk:name>
- <sdk:description>The description for this library.</sdk:description>
- </sdk:lib>
- <sdk:lib>
- <!-- sdk:description is optional, name is not -->
- <sdk:name>com.android.mymaps</sdk:name>
- </sdk:lib>
- </sdk:libs>
- </sdk:add-on>
-
- <sdk:platform>
- <sdk:version>1.1</sdk:version>
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>12</sdk:revision>
- <sdk:uses-license ref="license1" />
- <!-- sdk:description and sdk:desc-url are optional -->
- <sdk:archives>
- <sdk:archive os="windows">
- <!-- arch attribute is optional -->
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-win.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx" arch="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-mac.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx" arch="ppc">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-mac.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux" arch="x86">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux" arch="x86_64">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-linux.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:platform>
-
- <sdk:add-on>
- <sdk:name>My Second add-on</sdk:name>
- <sdk:api-level>2</sdk:api-level>
- <sdk:vendor>John Deer</sdk:vendor>
- <sdk:revision>42</sdk:revision>
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/second-42-win.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/second-42-linux.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:libs>
- <sdk:lib>
- <sdk:name>android.blah.somelib</sdk:name>
- <sdk:description>The description for this library.</sdk:description>
- </sdk:lib>
- <sdk:lib>
- <sdk:name>com.android.mymaps</sdk:name>
- </sdk:lib>
- </sdk:libs>
- <sdk:uses-license ref="license2" />
- </sdk:add-on>
-
- <sdk:platform>
- <sdk:version>Pastry</sdk:version>
- <sdk:api-level>5</sdk:api-level>
- <sdk:codename>Pastry</sdk:codename>
- <sdk:revision>3</sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:description>Preview version for Pastry</sdk:description>
- <sdk:desc-url>http://www.example.com/platform1.html</sdk:desc-url>
- <!-- The archives node is mandatory and it cannot be empty. -->
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/files/plat1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:platform>
-
- <sdk:tool>
- <sdk:revision>1</sdk:revision>
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/tools.html</sdk:desc-url>
- <sdk:uses-license ref="license1" />
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/files/tools1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:tool>
-
- <sdk:doc>
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>42</sdk:revision>
- <sdk:uses-license ref="license2" />
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/docs/2.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/docs2-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/docs2-mac.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:doc>
-
- <sdk:tool>
- <sdk:revision>42</sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/tools/2.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/tools2-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/tools2-mac.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:tool>
-
- <sdk:add-on>
- <sdk:uses-license ref="license2" />
- <sdk:name>This add-on has no libraries</sdk:name>
- <sdk:api-level>4</sdk:api-level>
- <sdk:vendor>Joe Bar</sdk:vendor>
- <sdk:revision>3</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/imnotanarchiveimadoctorjim.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <!-- The libs node is mandatory, however it can be empty. -->
- <sdk:libs />
- </sdk:add-on>
-
- <sdk:extra>
- <sdk:path>usb_driver</sdk:path>
- <sdk:uses-license ref="license2" />
- <sdk:revision>43</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/extraduff.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:description>An Extra package for the USB driver, it will install in $SDK/usb_driver</sdk:description>
- <sdk:desc-url>http://www.example.com/extra.html</sdk:desc-url>
- <sdk:min-tools-rev>3</sdk:min-tools-rev>
- </sdk:extra>
-
-</sdk:sdk-repository>
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/repository_sample_2.xml b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/repository_sample_2.xml
deleted file mode 100755
index 6b2d679..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/repository_sample_2.xml
+++ /dev/null
@@ -1,309 +0,0 @@
-<?xml version="1.0"?>
-<!--
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<sdk:sdk-repository
- xmlns:sdk="http://schemas.android.com/sdk/android/repository/2">
-
- <!-- Define a couple of licenses. These will be referenced by uses-license later. -->
-
- <sdk:license type="text" id="license1">
- This is the license
- for this platform.
- </sdk:license>
-
- <sdk:license id="license2">
- Licenses are only of type 'text' right now, so this is implied.
- </sdk:license>
-
- <!-- Inner elements must be either platform, add-on, doc or tool.
- There can be 0 or more of each, in any order. -->
-
- <sdk:platform>
- <sdk:version>1.0</sdk:version>
- <sdk:api-level>1</sdk:api-level>
- <sdk:revision>3</sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/platform1.html</sdk:desc-url>
- <sdk:release-note>This is an optional release note
- for this package. It's a free multi-line text.
- </sdk:release-note>
- <sdk:release-url>http://some/url/for/the/release/note.html</sdk:release-url>
- <sdk:min-tools-rev>2</sdk:min-tools-rev>
- <!-- The archives node is mandatory and it cannot be empty. -->
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/files/plat1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:platform>
-
- <sdk:doc>
- <sdk:api-level>1</sdk:api-level>
- <sdk:revision>1</sdk:revision>
- <!-- the license element is not mandatory. -->
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/docs.html</sdk:desc-url>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/docs/docs1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:doc>
-
- <sdk:add-on>
- <sdk:name>My First add-on</sdk:name>
- <sdk:api-level>1</sdk:api-level>
- <sdk:vendor>John Doe</sdk:vendor>
- <sdk:revision>1</sdk:revision>
- <sdk:uses-license ref="license2" />
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/myfirstaddon</sdk:desc-url>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/add-ons/first.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <!-- The libs node is mandatory, however it can be empty. -->
- <sdk:libs>
- <sdk:lib>
- <sdk:name>android.blah.somelib</sdk:name>
- <sdk:description>The description for this library.</sdk:description>
- </sdk:lib>
- <sdk:lib>
- <!-- sdk:description is optional, name is not -->
- <sdk:name>com.android.mymaps</sdk:name>
- </sdk:lib>
- </sdk:libs>
- </sdk:add-on>
-
- <sdk:platform>
- <sdk:version>1.1</sdk:version>
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>12</sdk:revision>
- <sdk:uses-license ref="license1" />
- <!-- sdk:description and sdk:desc-url are optional -->
- <sdk:archives>
- <sdk:archive os="windows">
- <!-- arch attribute is optional -->
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-win.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx" arch="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-mac.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx" arch="ppc">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-mac.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux" arch="x86">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux" arch="x86_64">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-linux.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:platform>
-
- <sdk:add-on>
- <sdk:name>My Second add-on</sdk:name>
- <sdk:api-level>2</sdk:api-level>
- <sdk:vendor>John Deer</sdk:vendor>
- <sdk:revision>42</sdk:revision>
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/second-42-win.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/second-42-linux.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:libs>
- <sdk:lib>
- <sdk:name>android.blah.somelib</sdk:name>
- <sdk:description>The description for this library.</sdk:description>
- </sdk:lib>
- <sdk:lib>
- <sdk:name>com.android.mymaps</sdk:name>
- </sdk:lib>
- </sdk:libs>
- <sdk:uses-license ref="license2" />
- </sdk:add-on>
-
- <sdk:platform>
- <sdk:version>Pastry</sdk:version>
- <sdk:api-level>5</sdk:api-level>
- <sdk:codename>Pastry</sdk:codename>
- <sdk:revision>3</sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:description>Preview version for Pastry</sdk:description>
- <sdk:desc-url>http://www.example.com/platform1.html</sdk:desc-url>
- <!-- The archives node is mandatory and it cannot be empty. -->
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/files/plat1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:platform>
-
- <sdk:tool>
- <sdk:revision>1</sdk:revision>
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/tools.html</sdk:desc-url>
- <sdk:uses-license ref="license1" />
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/files/tools1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:tool>
-
- <sdk:doc>
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>42</sdk:revision>
- <sdk:uses-license ref="license2" />
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/docs/2.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/docs2-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/docs2-mac.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:doc>
-
- <sdk:tool>
- <sdk:revision>42</sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/tools/2.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/tools2-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/tools2-mac.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:tool>
-
- <sdk:add-on>
- <sdk:uses-license ref="license2" />
- <sdk:name>This add-on has no libraries</sdk:name>
- <sdk:api-level>4</sdk:api-level>
- <sdk:vendor>Joe Bar</sdk:vendor>
- <sdk:revision>3</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/imnotanarchiveimadoctorjim.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <!-- The libs node is mandatory, however it can be empty. -->
- <sdk:libs />
- </sdk:add-on>
-
- <sdk:extra>
- <sdk:path>usb_driver</sdk:path>
- <sdk:uses-license ref="license2" />
- <sdk:revision>43</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/extraduff.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:description>An Extra package for the USB driver, it will install in $SDK/usb_driver</sdk:description>
- <sdk:desc-url>http://www.example.com/extra.html</sdk:desc-url>
- <sdk:min-tools-rev>3</sdk:min-tools-rev>
- <sdk:obsolete/>
- </sdk:extra>
-
- <sdk:extra>
- <sdk:path>extra_api_dep</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:sample>
- <sdk:api-level>14</sdk:api-level>
- <sdk:revision>24</sdk:revision>
- <sdk:archives>
- <sdk:archive os="any" arch="any">
- <sdk:size>65537</sdk:size>
- <sdk:checksum type="sha1">3822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/sample_duff.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:description>Some sample package</sdk:description>
- <sdk:desc-url>http://www.example.com/sample.html</sdk:desc-url>
- <sdk:min-tools-rev>5</sdk:min-tools-rev>
- <sdk:obsolete>This is obsolete</sdk:obsolete>
- </sdk:sample>
-
-</sdk:sdk-repository>
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/repository_sample_3.xml b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/repository_sample_3.xml
deleted file mode 100755
index 05a9c79..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/repository_sample_3.xml
+++ /dev/null
@@ -1,261 +0,0 @@
-<?xml version="1.0"?>
-<!--
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<sdk:sdk-repository
- xmlns:sdk="http://schemas.android.com/sdk/android/repository/3">
-
- <!-- Define a couple of licenses. These will be referenced by uses-license later. -->
-
- <sdk:license type="text" id="license1">
- This is the license
- for this platform.
- </sdk:license>
-
- <sdk:license id="license2">
- Licenses are only of type 'text' right now, so this is implied.
- </sdk:license>
-
- <!-- Inner elements must be either platform, add-on, doc or tool.
- There can be 0 or more of each, in any order. -->
-
- <sdk:platform>
- <sdk:version>1.0</sdk:version>
- <sdk:api-level>1</sdk:api-level>
- <sdk:revision>3</sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/platform1.html</sdk:desc-url>
- <sdk:release-note>This is an optional release note
- for this package. It's a free multi-line text.
- </sdk:release-note>
- <sdk:release-url>http://some/url/for/the/release/note.html</sdk:release-url>
- <sdk:min-tools-rev>2</sdk:min-tools-rev>
- <!-- The archives node is mandatory and it cannot be empty. -->
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/files/plat1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:platform>
-
- <sdk:doc>
- <sdk:api-level>1</sdk:api-level>
- <sdk:revision>1</sdk:revision>
- <!-- the license element is not mandatory. -->
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/docs.html</sdk:desc-url>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/docs/docs1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:doc>
-
- <sdk:platform>
- <sdk:version>1.1</sdk:version>
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>12</sdk:revision>
- <sdk:uses-license ref="license1" />
- <!-- sdk:description and sdk:desc-url are optional -->
- <sdk:archives>
- <sdk:archive os="windows">
- <!-- arch attribute is optional -->
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-win.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx" arch="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-mac.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx" arch="ppc">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-mac.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux" arch="x86">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux" arch="x86_64">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-linux.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:platform>
-
- <sdk:platform>
- <sdk:version>Pastry</sdk:version>
- <sdk:api-level>5</sdk:api-level>
- <sdk:codename>Pastry</sdk:codename>
- <sdk:revision>3</sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:description>Preview version for Pastry</sdk:description>
- <sdk:desc-url>http://www.example.com/platform1.html</sdk:desc-url>
- <!-- The archives node is mandatory and it cannot be empty. -->
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/files/plat1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:platform>
-
- <sdk:tool>
- <sdk:revision>1</sdk:revision>
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/tools.html</sdk:desc-url>
- <sdk:uses-license ref="license1" />
- <sdk:min-platform-tools-rev>4</sdk:min-platform-tools-rev>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/files/tools1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:tool>
-
- <sdk:doc>
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>42</sdk:revision>
- <sdk:uses-license ref="license2" />
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/docs/2.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/docs2-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/docs2-mac.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:doc>
-
- <sdk:tool>
- <sdk:revision>42</sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:min-platform-tools-rev>3</sdk:min-platform-tools-rev>
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/tools/2.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/tools2-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/tools2-mac.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:tool>
-
- <sdk:platform-tool>
- <sdk:revision>3</sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">3822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-tools/2.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">3822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-tools2-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">3822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-tools2-mac.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:platform-tool>
-
- <sdk:extra>
- <sdk:vendor>a</sdk:vendor>
- <sdk:path>usb_driver</sdk:path>
- <sdk:uses-license ref="license2" />
- <sdk:revision>43</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/extraduff.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:description>An Extra package for the USB driver, it will install in $SDK/usb_driver</sdk:description>
- <sdk:desc-url>http://www.example.com/extra.html</sdk:desc-url>
- <sdk:min-tools-rev>3</sdk:min-tools-rev>
- <sdk:obsolete/>
- </sdk:extra>
-
- <sdk:extra>
- <sdk:vendor>android_vendor</sdk:vendor>
- <sdk:path>extra_api_dep</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:sample>
- <sdk:api-level>14</sdk:api-level>
- <sdk:revision>24</sdk:revision>
- <sdk:archives>
- <sdk:archive os="any" arch="any">
- <sdk:size>65537</sdk:size>
- <sdk:checksum type="sha1">3822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/sample_duff.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:description>Some sample package</sdk:description>
- <sdk:desc-url>http://www.example.com/sample.html</sdk:desc-url>
- <sdk:min-tools-rev>5</sdk:min-tools-rev>
- <sdk:obsolete>This is obsolete</sdk:obsolete>
- </sdk:sample>
-
-</sdk:sdk-repository>
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/repository_sample_4.xml b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/repository_sample_4.xml
deleted file mode 100755
index f68b033..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/repository_sample_4.xml
+++ /dev/null
@@ -1,278 +0,0 @@
-<?xml version="1.0"?>
-<!--
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<sdk:sdk-repository
- xmlns:sdk="http://schemas.android.com/sdk/android/repository/4">
-
- <!-- Define a couple of licenses. These will be referenced by uses-license later. -->
-
- <sdk:license type="text" id="license1">
- This is the license
- for this platform.
- </sdk:license>
-
- <sdk:license id="license2">
- Licenses are only of type 'text' right now, so this is implied.
- </sdk:license>
-
- <!-- Inner elements must be either platform, add-on, doc or tool.
- There can be 0 or more of each, in any order. -->
-
- <sdk:platform>
- <sdk:version>1.0</sdk:version>
- <sdk:api-level>1</sdk:api-level>
- <sdk:revision>3</sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/platform1.html</sdk:desc-url>
- <sdk:release-note>This is an optional release note
- for this package. It's a free multi-line text.
- </sdk:release-note>
- <sdk:release-url>http://some/url/for/the/release/note.html</sdk:release-url>
- <sdk:min-tools-rev>2</sdk:min-tools-rev>
- <!-- The archives node is mandatory and it cannot be empty. -->
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/files/plat1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:layoutlib>
- <sdk:api>5</sdk:api>
- <sdk:revision>0</sdk:revision>
- </sdk:layoutlib>
- </sdk:platform>
-
- <sdk:doc>
- <sdk:api-level>1</sdk:api-level>
- <sdk:revision>1</sdk:revision>
- <!-- the license element is not mandatory. -->
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/docs.html</sdk:desc-url>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/docs/docs1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:doc>
-
- <sdk:platform>
- <sdk:version>1.1</sdk:version>
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>12</sdk:revision>
- <sdk:uses-license ref="license1" />
- <!-- sdk:description and sdk:desc-url are optional -->
- <sdk:archives>
- <sdk:archive os="windows">
- <!-- arch attribute is optional -->
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-win.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx" arch="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-mac.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx" arch="ppc">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-mac.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux" arch="x86">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux" arch="x86_64">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-linux.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:layoutlib>
- <sdk:api>5</sdk:api>
- <sdk:revision>31415</sdk:revision>
- </sdk:layoutlib>
- </sdk:platform>
-
- <sdk:platform>
- <sdk:version>Pastry</sdk:version>
- <sdk:api-level>5</sdk:api-level>
- <sdk:codename>Pastry</sdk:codename>
- <sdk:revision>3</sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:description>Preview version for Pastry</sdk:description>
- <sdk:desc-url>http://www.example.com/platform1.html</sdk:desc-url>
- <!-- The archives node is mandatory and it cannot be empty. -->
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/files/plat1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:layoutlib>
- <sdk:api>1</sdk:api>
- </sdk:layoutlib>
- </sdk:platform>
-
- <sdk:tool>
- <sdk:revision>1</sdk:revision>
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/tools.html</sdk:desc-url>
- <sdk:uses-license ref="license1" />
- <sdk:min-platform-tools-rev>4</sdk:min-platform-tools-rev>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/files/tools1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:tool>
-
- <sdk:doc>
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>42</sdk:revision>
- <sdk:uses-license ref="license2" />
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/docs/2.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/docs2-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/docs2-mac.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:doc>
-
- <sdk:tool>
- <sdk:revision>42</sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:min-platform-tools-rev>3</sdk:min-platform-tools-rev>
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/tools/2.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/tools2-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/tools2-mac.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:tool>
-
- <sdk:platform-tool>
- <sdk:revision>3</sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">3822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-tools/2.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">3822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-tools2-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">3822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-tools2-mac.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:platform-tool>
-
- <sdk:extra>
- <sdk:vendor>a</sdk:vendor>
- <sdk:path>usb_driver</sdk:path>
- <sdk:uses-license ref="license2" />
- <sdk:revision>43</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/extraduff.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:description>An Extra package for the USB driver, it will install in $SDK/usb_driver</sdk:description>
- <sdk:desc-url>http://www.example.com/extra.html</sdk:desc-url>
- <sdk:min-tools-rev>3</sdk:min-tools-rev>
- <sdk:obsolete/>
- <!-- no project-files in this USB driver package. -->
- </sdk:extra>
-
- <sdk:extra>
- <sdk:vendor>android_vendor</sdk:vendor>
- <sdk:path>extra_api_dep</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:project-files>
- <sdk:path>v8/veggies_8.jar</sdk:path>
- <sdk:path>readme.txt</sdk:path>
- <sdk:path>dir1/dir 2 with space/mylib.jar</sdk:path>
- </sdk:project-files>
- </sdk:extra>
-
- <sdk:sample>
- <sdk:api-level>14</sdk:api-level>
- <sdk:revision>24</sdk:revision>
- <sdk:archives>
- <sdk:archive os="any" arch="any">
- <sdk:size>65537</sdk:size>
- <sdk:checksum type="sha1">3822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/sample_duff.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:description>Some sample package</sdk:description>
- <sdk:desc-url>http://www.example.com/sample.html</sdk:desc-url>
- <sdk:min-tools-rev>5</sdk:min-tools-rev>
- <sdk:obsolete>This is obsolete</sdk:obsolete>
- </sdk:sample>
-
-</sdk:sdk-repository>
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/repository_sample_5.xml b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/repository_sample_5.xml
deleted file mode 100755
index 471550e..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/repository_sample_5.xml
+++ /dev/null
@@ -1,356 +0,0 @@
-<?xml version="1.0"?>
-<!--
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<sdk:sdk-repository
- xmlns:sdk="http://schemas.android.com/sdk/android/repository/5">
-
- <!-- Define a couple of licenses. These will be referenced by uses-license later. -->
-
- <sdk:license type="text" id="license1">
- This is the license
- for this platform.
- </sdk:license>
-
- <sdk:license id="license2">
- Licenses are only of type 'text' right now, so this is implied.
- </sdk:license>
-
- <!-- Inner elements must be either platform, add-on, doc or tool.
- There can be 0 or more of each, in any order. -->
-
- <sdk:platform>
- <sdk:version>1.0</sdk:version>
- <sdk:api-level>1</sdk:api-level>
- <sdk:revision>3</sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/platform1.html</sdk:desc-url>
- <sdk:release-note>This is an optional release note
- for this package. It's a free multi-line text.
- </sdk:release-note>
- <sdk:release-url>http://some/url/for/the/release/note.html</sdk:release-url>
- <sdk:min-tools-rev>2</sdk:min-tools-rev>
- <!-- The archives node is mandatory and it cannot be empty. -->
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/files/plat1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:layoutlib>
- <sdk:api>5</sdk:api>
- <sdk:revision>0</sdk:revision>
- </sdk:layoutlib>
- <sdk:included-abi>armeabi</sdk:included-abi>
- </sdk:platform>
-
- <sdk:doc>
- <sdk:api-level>1</sdk:api-level>
- <sdk:revision>1</sdk:revision>
- <!-- the license element is not mandatory. -->
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/docs.html</sdk:desc-url>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/docs/docs1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:doc>
-
- <sdk:source>
- <sdk:api-level>1</sdk:api-level>
- <sdk:revision>1</sdk:revision>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65535</sdk:size>
- <sdk:checksum type="sha1">1234ae37115ebf13412bbef91339ee0d94541234</sdk:checksum>
- <sdk:url>http://www.example.com/plat1/sources1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:source>
-
- <sdk:platform>
- <sdk:version>1.1</sdk:version>
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>12</sdk:revision>
- <sdk:uses-license ref="license1" />
- <!-- sdk:description and sdk:desc-url are optional -->
- <sdk:archives>
- <sdk:archive os="windows">
- <!-- arch attribute is optional -->
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-win.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx" arch="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-mac.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx" arch="ppc">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-mac.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux" arch="x86">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux" arch="x86_64">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-linux.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:layoutlib>
- <sdk:api>5</sdk:api>
- <sdk:revision>31415</sdk:revision>
- </sdk:layoutlib>
- <sdk:included-abi>x86</sdk:included-abi>
- </sdk:platform>
-
- <sdk:system-image>
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>1</sdk:revision>
- <sdk:abi>x86</sdk:abi>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65535</sdk:size>
- <sdk:checksum type="sha1">1234ae37115ebf13412bbef91339ee0d94541234</sdk:checksum>
- <sdk:url>http://www.example.com/plat1/x86/image1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:system-image>
-
- <sdk:system-image>
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>2</sdk:revision>
- <sdk:abi>armeabi-v7a</sdk:abi>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65534</sdk:size>
- <sdk:checksum type="sha1">1234ae37115ebf13412bbef91339ee0d94541234</sdk:checksum>
- <sdk:url>http://www.example.com/plat1/armv7/image2.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:system-image>
-
- <sdk:source>
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>2</sdk:revision>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65534</sdk:size>
- <sdk:checksum type="sha1">1234ae37115ebf13412bbef91339ee0d94541234</sdk:checksum>
- <sdk:url>http://www.example.com/plat1/sources2.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:source>
-
- <sdk:platform>
- <sdk:version>Pastry</sdk:version>
- <sdk:api-level>5</sdk:api-level>
- <sdk:codename>Pastry</sdk:codename>
- <sdk:revision>3</sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:description>Preview version for Pastry</sdk:description>
- <sdk:desc-url>http://www.example.com/platform1.html</sdk:desc-url>
- <!-- The archives node is mandatory and it cannot be empty. -->
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/files/plat1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:layoutlib>
- <sdk:api>1</sdk:api>
- </sdk:layoutlib>
- </sdk:platform>
-
- <sdk:tool>
- <sdk:revision>1</sdk:revision>
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/tools.html</sdk:desc-url>
- <sdk:uses-license ref="license1" />
- <sdk:min-platform-tools-rev>4</sdk:min-platform-tools-rev>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/files/tools1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:tool>
-
- <sdk:doc>
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>42</sdk:revision>
- <sdk:uses-license ref="license2" />
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/docs/2.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/docs2-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/docs2-mac.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:doc>
-
- <sdk:tool>
- <sdk:revision>42</sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:min-platform-tools-rev>3</sdk:min-platform-tools-rev>
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/tools/2.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/tools2-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/tools2-mac.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:tool>
-
- <sdk:platform-tool>
- <sdk:revision>3</sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">3822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-tools/2.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">3822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-tools2-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">3822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-tools2-mac.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:platform-tool>
-
- <sdk:extra>
- <sdk:vendor>a</sdk:vendor>
- <sdk:path>usb_driver</sdk:path>
- <sdk:uses-license ref="license2" />
- <sdk:revision>43</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/extraduff.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:description>An Extra package for the USB driver, it will install in $SDK/usb_driver</sdk:description>
- <sdk:desc-url>http://www.example.com/extra.html</sdk:desc-url>
- <sdk:min-tools-rev>3</sdk:min-tools-rev>
- <sdk:obsolete/>
- <!-- no project-files in this USB driver package. -->
- </sdk:extra>
-
- <sdk:extra>
- <sdk:vendor>android_vendor</sdk:vendor>
- <sdk:path>extra_api_dep</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:project-files>
- <sdk:path>v8/veggies_8.jar</sdk:path>
- <sdk:path>readme.txt</sdk:path>
- <sdk:path>dir1/dir 2 with space/mylib.jar</sdk:path>
- </sdk:project-files>
- <sdk:old-paths>path1;old_path2;oldPath3</sdk:old-paths>
- </sdk:extra>
-
- <sdk:sample>
- <sdk:api-level>14</sdk:api-level>
- <sdk:revision>24</sdk:revision>
- <sdk:archives>
- <sdk:archive os="any" arch="any">
- <sdk:size>65537</sdk:size>
- <sdk:checksum type="sha1">3822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/sample_duff.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:description>Some sample package</sdk:description>
- <sdk:desc-url>http://www.example.com/sample.html</sdk:desc-url>
- <sdk:min-tools-rev>5</sdk:min-tools-rev>
- <sdk:obsolete>This is obsolete</sdk:obsolete>
- </sdk:sample>
-
- <sdk:system-image>
- <sdk:api-level>42</sdk:api-level>
- <sdk:revision>12</sdk:revision>
- <sdk:abi>armeabi</sdk:abi>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>1234</sdk:size>
- <sdk:checksum type="sha1">12345637115ebf13412bbef91339ee0d94541234</sdk:checksum>
- <sdk:url>http://www.example.com/plat42/86/image12.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:system-image>
-
- <sdk:source>
- <sdk:api-level>42</sdk:api-level>
- <sdk:revision>12</sdk:revision>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>1234</sdk:size>
- <sdk:checksum type="sha1">12345637115ebf13412bbef91339ee0d94541234</sdk:checksum>
- <sdk:url>http://www.example.com/plat42/source12.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:source>
-
-</sdk:sdk-repository>
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/repository_sample_6.xml b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/repository_sample_6.xml
deleted file mode 100755
index 12be591..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/repository_sample_6.xml
+++ /dev/null
@@ -1,325 +0,0 @@
-<?xml version="1.0"?>
-<!--
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<sdk:sdk-repository
- xmlns:sdk="http://schemas.android.com/sdk/android/repository/6">
-
- <!-- Define a couple of licenses. These will be referenced by uses-license later. -->
-
- <sdk:license type="text" id="license1">
- This is the license
- for this platform.
- </sdk:license>
-
- <sdk:license id="license2">
- Licenses are only of type 'text' right now, so this is implied.
- </sdk:license>
-
- <!-- Inner elements must be either platform, add-on, doc or tool.
- There can be 0 or more of each, in any order. -->
-
- <sdk:platform>
- <sdk:version>1.0</sdk:version>
- <sdk:api-level>1</sdk:api-level>
- <sdk:revision>3</sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/platform1.html</sdk:desc-url>
- <sdk:release-note>This is an optional release note
- for this package. It's a free multi-line text.
- </sdk:release-note>
- <sdk:release-url>http://some/url/for/the/release/note.html</sdk:release-url>
- <sdk:min-tools-rev>2</sdk:min-tools-rev>
- <!-- The archives node is mandatory and it cannot be empty. -->
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/files/plat1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:layoutlib>
- <sdk:api>5</sdk:api>
- <sdk:revision>0</sdk:revision>
- </sdk:layoutlib>
- <sdk:included-abi>armeabi</sdk:included-abi>
- </sdk:platform>
-
- <sdk:doc>
- <sdk:api-level>1</sdk:api-level>
- <sdk:revision>1</sdk:revision>
- <!-- the license element is not mandatory. -->
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/docs.html</sdk:desc-url>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/docs/docs1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:doc>
-
- <sdk:source>
- <sdk:api-level>1</sdk:api-level>
- <sdk:revision>1</sdk:revision>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65535</sdk:size>
- <sdk:checksum type="sha1">1234ae37115ebf13412bbef91339ee0d94541234</sdk:checksum>
- <sdk:url>http://www.example.com/plat1/sources1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:source>
-
- <sdk:platform>
- <sdk:version>1.1</sdk:version>
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>12</sdk:revision>
- <sdk:uses-license ref="license1" />
- <!-- sdk:description and sdk:desc-url are optional -->
- <sdk:archives>
- <sdk:archive os="windows">
- <!-- arch attribute is optional -->
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-win.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx" arch="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-mac.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx" arch="ppc">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-mac.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux" arch="x86">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux" arch="x86_64">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-linux.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:layoutlib>
- <sdk:api>5</sdk:api>
- <sdk:revision>31415</sdk:revision>
- </sdk:layoutlib>
- <sdk:included-abi>x86</sdk:included-abi>
- </sdk:platform>
-
- <sdk:system-image>
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>1</sdk:revision>
- <sdk:abi>x86</sdk:abi>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65535</sdk:size>
- <sdk:checksum type="sha1">1234ae37115ebf13412bbef91339ee0d94541234</sdk:checksum>
- <sdk:url>http://www.example.com/plat1/x86/image1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:system-image>
-
- <sdk:system-image>
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>2</sdk:revision>
- <sdk:abi>armeabi-v7a</sdk:abi>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65534</sdk:size>
- <sdk:checksum type="sha1">1234ae37115ebf13412bbef91339ee0d94541234</sdk:checksum>
- <sdk:url>http://www.example.com/plat1/armv7/image2.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:system-image>
-
- <sdk:source>
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>2</sdk:revision>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65534</sdk:size>
- <sdk:checksum type="sha1">1234ae37115ebf13412bbef91339ee0d94541234</sdk:checksum>
- <sdk:url>http://www.example.com/plat1/sources2.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:source>
-
- <sdk:platform>
- <sdk:version>Pastry</sdk:version>
- <sdk:api-level>5</sdk:api-level>
- <sdk:codename>Pastry</sdk:codename>
- <sdk:revision>3</sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:description>Preview version for Pastry</sdk:description>
- <sdk:desc-url>http://www.example.com/platform1.html</sdk:desc-url>
- <!-- The archives node is mandatory and it cannot be empty. -->
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/files/plat1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:layoutlib>
- <sdk:api>1</sdk:api>
- </sdk:layoutlib>
- </sdk:platform>
-
- <sdk:tool>
- <sdk:revision>1</sdk:revision>
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/tools.html</sdk:desc-url>
- <sdk:uses-license ref="license1" />
- <sdk:min-platform-tools-rev>4</sdk:min-platform-tools-rev>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/files/tools1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:tool>
-
- <sdk:doc>
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>42</sdk:revision>
- <sdk:uses-license ref="license2" />
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/docs/2.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/docs2-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/docs2-mac.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:doc>
-
- <sdk:tool>
- <sdk:revision>42</sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:min-platform-tools-rev>3</sdk:min-platform-tools-rev>
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/tools/2.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/tools2-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/tools2-mac.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:tool>
-
- <sdk:platform-tool>
- <sdk:revision>3</sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">3822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-tools/2.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">3822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-tools2-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">3822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-tools2-mac.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:platform-tool>
-
- <sdk:sample>
- <sdk:api-level>14</sdk:api-level>
- <sdk:revision>24</sdk:revision>
- <sdk:archives>
- <sdk:archive os="any" arch="any">
- <sdk:size>65537</sdk:size>
- <sdk:checksum type="sha1">3822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/sample_duff.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:description>Some sample package</sdk:description>
- <sdk:desc-url>http://www.example.com/sample.html</sdk:desc-url>
- <sdk:min-tools-rev>5</sdk:min-tools-rev>
- <sdk:obsolete>This is obsolete</sdk:obsolete>
- </sdk:sample>
-
- <sdk:system-image>
- <sdk:api-level>42</sdk:api-level>
- <sdk:revision>12</sdk:revision>
- <sdk:abi>armeabi</sdk:abi>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>1234</sdk:size>
- <sdk:checksum type="sha1">12345637115ebf13412bbef91339ee0d94541234</sdk:checksum>
- <sdk:url>http://www.example.com/plat42/86/image12.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:system-image>
-
- <sdk:system-image>
- <sdk:api-level>42</sdk:api-level>
- <sdk:revision>12</sdk:revision>
- <sdk:abi>mips</sdk:abi>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>12345</sdk:size>
- <sdk:checksum type="sha1">12345637115ebf13412bbef91339ee0d94541234</sdk:checksum>
- <sdk:url>http://www.example.com/plat42/mips/image12.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:system-image>
-
- <sdk:source>
- <sdk:api-level>42</sdk:api-level>
- <sdk:revision>12</sdk:revision>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>1234</sdk:size>
- <sdk:checksum type="sha1">12345637115ebf13412bbef91339ee0d94541234</sdk:checksum>
- <sdk:url>http://www.example.com/plat42/source12.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:source>
-
-</sdk:sdk-repository>
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/repository_sample_7.xml b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/repository_sample_7.xml
deleted file mode 100755
index 401521b..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/repository_sample_7.xml
+++ /dev/null
@@ -1,371 +0,0 @@
-<?xml version="1.0"?>
-<!--
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<sdk:sdk-repository
- xmlns:sdk="http://schemas.android.com/sdk/android/repository/7">
-
- <!-- Define a couple of licenses. These will be referenced by uses-license later. -->
-
- <sdk:license type="text" id="license1">
- This is the license
- for this platform.
- </sdk:license>
-
- <sdk:license id="license2">
- Licenses are only of type 'text' right now, so this is implied.
- </sdk:license>
-
- <!-- Inner elements must be either platform, add-on, doc or tool.
- There can be 0 or more of each, in any order. -->
-
- <sdk:platform>
- <sdk:version>1.0</sdk:version>
- <sdk:api-level>1</sdk:api-level>
- <sdk:revision>3</sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/platform1.html</sdk:desc-url>
- <sdk:release-note>This is an optional release note
- for this package. It's a free multi-line text.
- </sdk:release-note>
- <sdk:release-url>http://some/url/for/the/release/note.html</sdk:release-url>
- <sdk:min-tools-rev>
- <sdk:major>2</sdk:major>
- <!-- minor is missing and equivalent to 0 -->
- <sdk:micro>1</sdk:micro>
- </sdk:min-tools-rev>
- <!-- The archives node is mandatory and it cannot be empty. -->
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/files/plat1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:layoutlib>
- <sdk:api>5</sdk:api>
- <sdk:revision>0</sdk:revision>
- </sdk:layoutlib>
- <sdk:included-abi>armeabi</sdk:included-abi>
- </sdk:platform>
-
- <sdk:doc>
- <sdk:api-level>1</sdk:api-level>
- <sdk:revision>1</sdk:revision>
- <!-- the license element is not mandatory. -->
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/docs.html</sdk:desc-url>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/docs/docs1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:doc>
-
- <sdk:source>
- <sdk:api-level>1</sdk:api-level>
- <sdk:revision>1</sdk:revision>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65535</sdk:size>
- <sdk:checksum type="sha1">1234ae37115ebf13412bbef91339ee0d94541234</sdk:checksum>
- <sdk:url>http://www.example.com/plat1/sources1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:source>
-
- <sdk:platform>
- <sdk:version>1.1</sdk:version>
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>12</sdk:revision>
- <sdk:uses-license ref="license1" />
- <!-- sdk:description and sdk:desc-url are optional -->
- <sdk:archives>
- <sdk:archive os="windows">
- <!-- arch attribute is optional -->
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-win.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx" arch="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-mac.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx" arch="ppc">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-mac.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux" arch="x86">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux" arch="x86_64">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-2-12-linux.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:layoutlib>
- <sdk:api>5</sdk:api>
- <sdk:revision>31415</sdk:revision>
- </sdk:layoutlib>
- <sdk:included-abi>x86</sdk:included-abi>
- </sdk:platform>
-
- <sdk:system-image>
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>1</sdk:revision>
- <sdk:abi>x86</sdk:abi>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65535</sdk:size>
- <sdk:checksum type="sha1">1234ae37115ebf13412bbef91339ee0d94541234</sdk:checksum>
- <sdk:url>http://www.example.com/plat1/x86/image1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:system-image>
-
- <sdk:system-image>
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>2</sdk:revision>
- <sdk:abi>armeabi-v7a</sdk:abi>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65534</sdk:size>
- <sdk:checksum type="sha1">1234ae37115ebf13412bbef91339ee0d94541234</sdk:checksum>
- <sdk:url>http://www.example.com/plat1/armv7/image2.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:system-image>
-
- <sdk:source>
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>2</sdk:revision>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65534</sdk:size>
- <sdk:checksum type="sha1">1234ae37115ebf13412bbef91339ee0d94541234</sdk:checksum>
- <sdk:url>http://www.example.com/plat1/sources2.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:source>
-
- <sdk:platform>
- <sdk:version>Pastry</sdk:version>
- <sdk:api-level>5</sdk:api-level>
- <sdk:codename>Pastry</sdk:codename>
- <sdk:revision>3</sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:description>Preview version for Pastry</sdk:description>
- <sdk:desc-url>http://www.example.com/platform1.html</sdk:desc-url>
- <!-- The archives node is mandatory and it cannot be empty. -->
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/files/plat1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:layoutlib>
- <sdk:api>1</sdk:api>
- </sdk:layoutlib>
- </sdk:platform>
-
- <sdk:tool>
- <sdk:revision>
- <sdk:major>1</sdk:major>
- <sdk:minor>2</sdk:minor>
- <sdk:micro>3</sdk:micro>
- <sdk:preview>4</sdk:preview>
- </sdk:revision>
- <sdk:description>Some optional description</sdk:description>
- <sdk:desc-url>http://www.example.com/tools.html</sdk:desc-url>
- <sdk:uses-license ref="license1" />
- <sdk:min-platform-tools-rev>
- <sdk:major>4</sdk:major>
- </sdk:min-platform-tools-rev>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>http://www.example.com/files/tools1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:tool>
-
- <sdk:doc>
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>42</sdk:revision>
- <sdk:uses-license ref="license2" />
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/docs/2.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/docs2-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/docs2-mac.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:doc>
-
- <sdk:tool>
- <sdk:revision>
- <sdk:major>42</sdk:major>
- </sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:min-platform-tools-rev>
- <sdk:major>4</sdk:major>
- <sdk:minor>0</sdk:minor>
- <sdk:micro>0</sdk:micro>
- <sdk:preview>5</sdk:preview>
- </sdk:min-platform-tools-rev>
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/tools/2.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/tools2-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/tools2-mac.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:tool>
-
- <sdk:platform-tool>
- <sdk:revision>
- <sdk:major>3</sdk:major>
- <sdk:minor>0</sdk:minor>
- <sdk:micro>0</sdk:micro>
- <sdk:preview>5</sdk:preview>
- </sdk:revision>
- <sdk:uses-license ref="license1" />
- <sdk:archives>
- <sdk:archive os="windows">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">3822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-tools/2.zip</sdk:url>
- </sdk:archive>
- <sdk:archive os="linux">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">3822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-tools2-linux.tar.bz2</sdk:url>
- </sdk:archive>
- <sdk:archive os="macosx">
- <sdk:size>65536</sdk:size>
- <sdk:checksum type="sha1">3822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/platform-tools2-mac.tar.bz2</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:platform-tool>
-
- <sdk:sample>
- <sdk:api-level>14</sdk:api-level>
- <sdk:revision>24</sdk:revision>
- <sdk:archives>
- <sdk:archive os="any" arch="any">
- <sdk:size>65537</sdk:size>
- <sdk:checksum type="sha1">3822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/sample_duff.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:description>Some sample package</sdk:description>
- <sdk:desc-url>http://www.example.com/sample.html</sdk:desc-url>
- <sdk:min-tools-rev>
- <sdk:major>5</sdk:major>
- </sdk:min-tools-rev>
- <sdk:obsolete>This is obsolete</sdk:obsolete>
- </sdk:sample>
-
- <sdk:sample>
- <sdk:api-level>14</sdk:api-level>
- <sdk:revision>25</sdk:revision>
- <sdk:archives>
- <sdk:archive os="any" arch="any">
- <sdk:size>65537</sdk:size>
- <sdk:checksum type="sha1">3822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
- <sdk:url>distrib/sample_duff.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- <sdk:description>Some sample package</sdk:description>
- <sdk:desc-url>http://www.example.com/sample.html</sdk:desc-url>
- <sdk:min-tools-rev>
- <sdk:major>5</sdk:major>
- <sdk:minor>1</sdk:minor>
- <sdk:micro>2</sdk:micro>
- <sdk:preview>3</sdk:preview>
- </sdk:min-tools-rev>
- <sdk:obsolete>This is obsolete</sdk:obsolete>
- </sdk:sample>
-
- <sdk:system-image>
- <sdk:api-level>42</sdk:api-level>
- <sdk:revision>12</sdk:revision>
- <sdk:abi>armeabi</sdk:abi>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>1234</sdk:size>
- <sdk:checksum type="sha1">12345637115ebf13412bbef91339ee0d94541234</sdk:checksum>
- <sdk:url>http://www.example.com/plat42/86/image12.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:system-image>
-
- <sdk:system-image>
- <sdk:api-level>42</sdk:api-level>
- <sdk:revision>12</sdk:revision>
- <sdk:abi>mips</sdk:abi>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>12345</sdk:size>
- <sdk:checksum type="sha1">12345637115ebf13412bbef91339ee0d94541234</sdk:checksum>
- <sdk:url>http://www.example.com/plat42/mips/image12.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:system-image>
-
- <sdk:source>
- <sdk:api-level>42</sdk:api-level>
- <sdk:revision>12</sdk:revision>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>1234</sdk:size>
- <sdk:checksum type="sha1">12345637115ebf13412bbef91339ee0d94541234</sdk:checksum>
- <sdk:url>http://www.example.com/plat42/source12.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:source>
-
-</sdk:sdk-repository>
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/stats_sample_1.xml b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/stats_sample_1.xml
deleted file mode 100755
index 344b8a5..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/stats_sample_1.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<sdk:sdk-stats
- xmlns:sdk="http://schemas.android.com/sdk/android/stats/1">
-
- <sdk:platform>
- <sdk:api-level>3</sdk:api-level>
- <sdk:codename>Vanilla</sdk:codename>
- <sdk:version>Android 0.5</sdk:version>
- <sdk:share>0.1</sdk:share>
- </sdk:platform>
-
- <sdk:platform>
- <sdk:api-level>5</sdk:api-level>
- <sdk:codename>Coffee</sdk:codename>
- <sdk:version>Android 42.0</sdk:version>
- <sdk:share>25.8</sdk:share>
- </sdk:platform>
-
- <sdk:platform>
- <sdk:api-level>42</sdk:api-level>
- <sdk:codename>Chocolate</sdk:codename>
- <sdk:version>Android 32.64</sdk:version>
- <sdk:share>74.1</sdk:share>
- </sdk:platform>
-
- <sdk:platform>
- <sdk:api-level>5</sdk:api-level>
- <sdk:codename>Ignored</sdk:codename>
- <sdk:version>API 5 was already seen above</sdk:version>
- <sdk:share>99.9</sdk:share>
- </sdk:platform>
-
-</sdk:sdk-stats>
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/sys_img_sample_1.xml b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/sys_img_sample_1.xml
deleted file mode 100755
index 6196db4..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/testdata/sys_img_sample_1.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<?xml version="1.0"?>
-<!--
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.
--->
-<sdk:sdk-sys-img
- xmlns:sdk="http://schemas.android.com/sdk/android/sys-img/1">
-
- <!-- Define a couple of licenses. These will be referenced by uses-license later. -->
-
- <sdk:license type="text" id="license1">
- This is the license
- for this platform.
- </sdk:license>
-
- <sdk:license id="license2">
- Licenses are only of type 'text' right now, so this is implied.
- </sdk:license>
-
- <sdk:system-image>
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>1</sdk:revision>
- <sdk:abi>x86</sdk:abi>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65535</sdk:size>
- <sdk:checksum type="sha1">1234ae37115ebf13412bbef91339ee0d94541234</sdk:checksum>
- <sdk:url>http://www.example.com/plat1/x86/image1.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:system-image>
-
- <sdk:system-image>
- <sdk:api-level>2</sdk:api-level>
- <sdk:revision>2</sdk:revision>
- <sdk:abi>armeabi-v7a</sdk:abi>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>65534</sdk:size>
- <sdk:checksum type="sha1">1234ae37115ebf13412bbef91339ee0d94541234</sdk:checksum>
- <sdk:url>http://www.example.com/plat1/armv7/image2.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:system-image>
-
- <sdk:system-image>
- <sdk:api-level>42</sdk:api-level>
- <sdk:revision>12</sdk:revision>
- <sdk:abi>armeabi</sdk:abi>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>1234</sdk:size>
- <sdk:checksum type="sha1">12345637115ebf13412bbef91339ee0d94541234</sdk:checksum>
- <sdk:url>http://www.example.com/plat42/86/image12.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:system-image>
-
- <sdk:system-image>
- <sdk:api-level>42</sdk:api-level>
- <sdk:revision>12</sdk:revision>
- <sdk:abi>mips</sdk:abi>
- <sdk:archives>
- <sdk:archive os="any">
- <sdk:size>12345</sdk:size>
- <sdk:checksum type="sha1">12345637115ebf13412bbef91339ee0d94541234</sdk:checksum>
- <sdk:url>http://www.example.com/plat42/mips/image12.zip</sdk:url>
- </sdk:archive>
- </sdk:archives>
- </sdk:system-image>
-
-</sdk:sdk-sys-img>
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/util/BSPatchTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/util/BSPatchTest.java
deleted file mode 100755
index 6c6c405..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/util/BSPatchTest.java
+++ /dev/null
@@ -1,533 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.util;
-
-import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Arrays;
-
-import junit.framework.TestCase;
-
-
-public class BSPatchTest extends TestCase {
-
- // $ bsdiff file1 file2 diff-1-2.patch
- // $ hexdump -v -e '1/1 "0x%02x, "' diff-1-2.patch
-
- public void testBSPatch1() throws Exception {
- byte[] file1 = toSignedBytes(new short[] {
- 0x62, 0x73, 0x64, 0x69, 0x66, 0x66, 0x20, 0x69, 0x73, 0x20,
- 0x61, 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0x20, 0x66, 0x6f, 0x72,
- 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x20,
- 0x61, 0x6e, 0x64, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x69,
- 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73,
- 0x20, 0x74, 0x6f, 0x20, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79,
- 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x0a
- });
-
- byte[] file2 = toSignedBytes(new short[] {
- 0x62, 0x73, 0x64, 0x69, 0x66, 0x66, 0x20, 0x61, 0x6e, 0x64,
- 0x20, 0x62, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x20, 0x61,
- 0x72, 0x65, 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x20, 0x66,
- 0x6f, 0x72, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e,
- 0x67, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x70, 0x70, 0x6c,
- 0x79, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, 0x63, 0x68,
- 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x69, 0x6e, 0x61,
- 0x72, 0x79, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x0a,
- });
-
- byte[] patch = toSignedBytes(new short[] {
- 0x42, 0x53, 0x44, 0x49, 0x46, 0x46, 0x34, 0x30, 0x35, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x42, 0x5a, 0x68, 0x39, 0x31, 0x41, 0x59, 0x26,
- 0x53, 0x59, 0x93, 0x0d, 0x6a, 0xae, 0x00, 0x00, 0x0c, 0x68,
- 0x40, 0x58, 0xa8, 0x02, 0x00, 0x04, 0x00, 0x40, 0x00, 0x20,
- 0x00, 0x21, 0x88, 0x19, 0x08, 0x32, 0x62, 0x1b, 0xde, 0xbc,
- 0x24, 0x08, 0xe9, 0x45, 0x3c, 0x5d, 0xc9, 0x14, 0xe1, 0x42,
- 0x42, 0x4c, 0x35, 0xaa, 0xb8, 0x42, 0x5a, 0x68, 0x39, 0x31,
- 0x41, 0x59, 0x26, 0x53, 0x59, 0x05, 0xb6, 0xa3, 0x63, 0x00,
- 0x00, 0x00, 0x48, 0x00, 0x40, 0x00, 0x00, 0x80, 0x20, 0x00,
- 0x21, 0x00, 0x82, 0x83, 0x17, 0x72, 0x45, 0x38, 0x50, 0x90,
- 0x05, 0xb6, 0xa3, 0x63, 0x42, 0x5a, 0x68, 0x39, 0x31, 0x41,
- 0x59, 0x26, 0x53, 0x59, 0xdb, 0x41, 0x22, 0x6f, 0x00, 0x00,
- 0x01, 0x91, 0x80, 0x40, 0x00, 0x3e, 0x45, 0xdc, 0x00, 0x20,
- 0x00, 0x22, 0x9a, 0x19, 0x32, 0x7a, 0x7a, 0xa1, 0x00, 0x00,
- 0x21, 0xe2, 0xf8, 0x98, 0x42, 0x13, 0x3c, 0xec, 0x35, 0x5f,
- 0x17, 0x72, 0x45, 0x38, 0x50, 0x90, 0xdb, 0x41, 0x22, 0x6f
- });
-
- byte[] expected = file2;
- byte[] actual = patchFile(file1, patch);
-
- assertEquals(toDiffString(expected, actual),
- Arrays.toString(expected), Arrays.toString(actual));
- }
-
- public void testBSPatch2() throws Exception {
- byte[] file1 = toSignedBytes(new short[] {
- 0x62, 0x73, 0x64, 0x69, 0x66, 0x66, 0x20, 0x61, 0x6e, 0x64,
- 0x20, 0x62, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x20, 0x61,
- 0x72, 0x65, 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x20, 0x66,
- 0x6f, 0x72, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e,
- 0x67, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x70, 0x70, 0x6c,
- 0x79, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, 0x63, 0x68,
- 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x69, 0x6e, 0x61,
- 0x72, 0x79, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x0a,
- 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
- 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x6f, 0x6c, 0x6f,
- 0x67, 0x79, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x62, 0x73, 0x64,
- 0x69, 0x66, 0x66, 0x2f, 0x0a, 0x44, 0x65, 0x73, 0x63, 0x72,
- 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x67, 0x65,
- 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x70,
- 0x6c, 0x79, 0x20, 0x61, 0x20, 0x70, 0x61, 0x74, 0x63, 0x68,
- 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x74,
- 0x77, 0x6f, 0x20, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x20,
- 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x0a
- });
-
- byte[] file2 = toSignedBytes(new short[] {
- 0x62, 0x73, 0x64, 0x69, 0x66, 0x66, 0x20, 0x61, 0x6e, 0x64,
- 0x20, 0x62, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x20, 0x61,
- 0x72, 0x65, 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x20, 0x66,
- 0x6f, 0x72, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e,
- 0x67, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x70, 0x70, 0x6c,
- 0x79, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, 0x63, 0x68,
- 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x69, 0x6e, 0x61,
- 0x72, 0x79, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x0a,
- 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,
- 0x6e, 0x3a, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
- 0x65, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x20, 0x61, 0x20,
- 0x70, 0x61, 0x74, 0x63, 0x68, 0x20, 0x62, 0x65, 0x74, 0x77,
- 0x65, 0x65, 0x6e, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x62, 0x69,
- 0x6e, 0x61, 0x72, 0x79, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73,
- 0x2e, 0x0a, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
- 0x77, 0x77, 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x6f,
- 0x6c, 0x6f, 0x67, 0x79, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x62,
- 0x73, 0x64, 0x69, 0x66, 0x66, 0x2f, 0x0a, 0x42, 0x53, 0x44,
- 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, 0x20,
- 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20,
- 0x32, 0x30, 0x30, 0x33, 0x2d, 0x32, 0x30, 0x30, 0x35, 0x20,
- 0x43, 0x6f, 0x6c, 0x69, 0x6e, 0x20, 0x50, 0x65, 0x72, 0x63,
- 0x69, 0x76, 0x61, 0x6c, 0x0a,
- });
-
- byte[] patch = toSignedBytes(new short[] {
- 0x42, 0x53, 0x44, 0x49, 0x46, 0x46, 0x34, 0x30, 0x3e, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x42, 0x5a, 0x68, 0x39, 0x31, 0x41, 0x59, 0x26,
- 0x53, 0x59, 0x3f, 0xa6, 0x07, 0x42, 0x00, 0x00, 0x14, 0x5d,
- 0x40, 0x58, 0x08, 0x08, 0x00, 0xc8, 0x02, 0x00, 0x00, 0xa0,
- 0x00, 0x40, 0x00, 0x20, 0x00, 0x21, 0xa4, 0x69, 0x84, 0xfd,
- 0x41, 0x03, 0x40, 0xd0, 0x22, 0xef, 0xe1, 0x49, 0x33, 0x02,
- 0xce, 0x2e, 0xe6, 0x8b, 0xb9, 0x22, 0x9c, 0x28, 0x48, 0x1f,
- 0xd3, 0x03, 0xa1, 0x00, 0x42, 0x5a, 0x68, 0x39, 0x31, 0x41,
- 0x59, 0x26, 0x53, 0x59, 0x58, 0xc3, 0x04, 0xf0, 0x00, 0x00,
- 0x00, 0x40, 0x10, 0x40, 0x00, 0x00, 0x02, 0x20, 0x00, 0x21,
- 0x00, 0x82, 0x83, 0x17, 0x72, 0x45, 0x38, 0x50, 0x90, 0x58,
- 0xc3, 0x04, 0xf0, 0x42, 0x5a, 0x68, 0x39, 0x31, 0x41, 0x59,
- 0x26, 0x53, 0x59, 0x26, 0xc7, 0xbc, 0x09, 0x00, 0x00, 0x08,
- 0x5f, 0x80, 0x00, 0x10, 0x40, 0x06, 0x5a, 0x00, 0x1c, 0x00,
- 0x48, 0x00, 0x2a, 0xe5, 0xdd, 0x20, 0x20, 0x00, 0x31, 0x46,
- 0x86, 0x80, 0x00, 0x00, 0x1a, 0xa6, 0x26, 0x40, 0xfd, 0x50,
- 0x34, 0x79, 0x27, 0x92, 0x78, 0xda, 0x4d, 0x37, 0xa9, 0x20,
- 0x8d, 0x8c, 0x41, 0x90, 0xea, 0x1c, 0x3a, 0xb3, 0xaa, 0x63,
- 0x64, 0xa4, 0x27, 0x6d, 0x5b, 0x2a, 0xfc, 0x25, 0x1b, 0xab,
- 0xd2, 0xff, 0x8b, 0xb9, 0x22, 0x9c, 0x28, 0x48, 0x13, 0x63,
- 0xde, 0x04, 0x80
- });
-
- byte[] expected = file2;
- byte[] actual = patchFile(file1, patch);
-
- assertEquals(toDiffString(expected, actual),
- Arrays.toString(expected), Arrays.toString(actual));
- }
-
- public void testBSPatch3() throws Exception {
- byte[] file1 = toSignedBytes(new short[] {
- 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
- 0x2e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x6f, 0x6c, 0x6f,
- 0x67, 0x79, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x62, 0x73, 0x64,
- 0x69, 0x66, 0x66, 0x2f, 0x0a, 0x42, 0x69, 0x6e, 0x61, 0x72,
- 0x79, 0x20, 0x64, 0x69, 0x66, 0x66, 0x2f, 0x70, 0x61, 0x74,
- 0x63, 0x68, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x74, 0x79,
- 0x0a, 0x53, 0x48, 0x41, 0x31, 0x3a, 0x20, 0x37, 0x32, 0x63,
- 0x35, 0x37, 0x34, 0x33, 0x34, 0x62, 0x64, 0x64, 0x34, 0x63,
- 0x33, 0x38, 0x33, 0x63, 0x36, 0x39, 0x62, 0x62, 0x30, 0x66,
- 0x61, 0x64, 0x34, 0x32, 0x33, 0x35, 0x37, 0x38, 0x35, 0x32,
- 0x32, 0x63, 0x64, 0x30, 0x64, 0x33, 0x61, 0x0a, 0x53, 0x48,
- 0x41, 0x32, 0x35, 0x36, 0x3a, 0x20, 0x61, 0x62, 0x62, 0x64,
- 0x32, 0x32, 0x30, 0x39, 0x33, 0x38, 0x35, 0x65, 0x38, 0x65,
- 0x38, 0x38, 0x30, 0x61, 0x64, 0x64, 0x30, 0x62, 0x37, 0x38,
- 0x31, 0x37, 0x37, 0x38, 0x64, 0x65, 0x64, 0x34, 0x39, 0x65,
- 0x31, 0x30, 0x61, 0x36, 0x66, 0x30, 0x63, 0x37, 0x39, 0x39,
- 0x64, 0x33, 0x32, 0x36, 0x61, 0x36, 0x61, 0x65, 0x36, 0x37,
- 0x30, 0x33, 0x36, 0x39, 0x36, 0x38, 0x66, 0x62, 0x31, 0x64,
- 0x0a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
- 0x6f, 0x6e, 0x3a, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
- 0x74, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x20, 0x61,
- 0x20, 0x70, 0x61, 0x74, 0x63, 0x68, 0x20, 0x62, 0x65, 0x74,
- 0x77, 0x65, 0x65, 0x6e, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x62,
- 0x69, 0x6e, 0x61, 0x72, 0x79, 0x20, 0x66, 0x69, 0x6c, 0x65,
- 0x73, 0x0a, 0x20, 0x62, 0x73, 0x64, 0x69, 0x66, 0x66, 0x20,
- 0x61, 0x6e, 0x64, 0x20, 0x62, 0x73, 0x70, 0x61, 0x74, 0x63,
- 0x68, 0x20, 0x61, 0x72, 0x65, 0x20, 0x74, 0x6f, 0x6f, 0x6c,
- 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x75, 0x69, 0x6c,
- 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61,
- 0x70, 0x70, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61,
- 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62,
- 0x69, 0x6e, 0x61, 0x72, 0x79, 0x20, 0x66, 0x69, 0x6c, 0x65,
- 0x73, 0x2e, 0x0a
- });
-
- byte[] file2 = toSignedBytes(new short[] {
- 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x20, 0x64, 0x69, 0x66,
- 0x66, 0x2f, 0x70, 0x61, 0x74, 0x63, 0x68, 0x20, 0x75, 0x74,
- 0x69, 0x6c, 0x69, 0x74, 0x79, 0x0a, 0x48, 0x6f, 0x6d, 0x65,
- 0x70, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x20, 0x20, 0x20, 0x68,
- 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e,
- 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x6f, 0x6c, 0x6f, 0x67,
- 0x79, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x62, 0x73, 0x64, 0x69,
- 0x66, 0x66, 0x2f, 0x0a, 0x53, 0x48, 0x41, 0x31, 0x3a, 0x20,
- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x37, 0x32, 0x63,
- 0x35, 0x37, 0x34, 0x33, 0x34, 0x62, 0x64, 0x64, 0x34, 0x63,
- 0x33, 0x38, 0x33, 0x63, 0x36, 0x39, 0x62, 0x62, 0x30, 0x66,
- 0x61, 0x64, 0x34, 0x32, 0x33, 0x35, 0x37, 0x38, 0x35, 0x32,
- 0x32, 0x63, 0x64, 0x30, 0x64, 0x33, 0x61, 0x0a, 0x53, 0x48,
- 0x41, 0x32, 0x35, 0x36, 0x3a, 0x20, 0x20, 0x20, 0x20, 0x20,
- 0x20, 0x61, 0x62, 0x62, 0x64, 0x32, 0x32, 0x30, 0x39, 0x33,
- 0x38, 0x35, 0x65, 0x38, 0x65, 0x38, 0x38, 0x30, 0x61, 0x64,
- 0x64, 0x30, 0x62, 0x37, 0x38, 0x31, 0x37, 0x37, 0x38, 0x64,
- 0x65, 0x64, 0x34, 0x39, 0x65, 0x31, 0x30, 0x61, 0x36, 0x66,
- 0x30, 0x63, 0x37, 0x39, 0x39, 0x64, 0x33, 0x32, 0x36, 0x61,
- 0x36, 0x61, 0x65, 0x36, 0x37, 0x30, 0x33, 0x36, 0x39, 0x36,
- 0x38, 0x66, 0x62, 0x31, 0x64, 0x0a, 0x44, 0x65, 0x73, 0x63,
- 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x67,
- 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x2f, 0x61, 0x70,
- 0x70, 0x6c, 0x79, 0x20, 0x61, 0x20, 0x70, 0x61, 0x74, 0x63,
- 0x68, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20,
- 0x74, 0x77, 0x6f, 0x20, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79,
- 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20,
- 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
- 0x62, 0x73, 0x64, 0x69, 0x66, 0x66, 0x20, 0x61, 0x6e, 0x64,
- 0x20, 0x62, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x20, 0x61,
- 0x72, 0x65, 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x20, 0x66,
- 0x6f, 0x72, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e,
- 0x67, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x70, 0x70, 0x6c,
- 0x79, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, 0x74, 0x63, 0x68,
- 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x69, 0x6e, 0x61,
- 0x72, 0x79, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x0a,
- });
-
- byte[] patch = toSignedBytes(new short[] {
- 0x42, 0x53, 0x44, 0x49, 0x46, 0x46, 0x34, 0x30, 0x48, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x68, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x42, 0x5a, 0x68, 0x39, 0x31, 0x41, 0x59, 0x26,
- 0x53, 0x59, 0xea, 0x1c, 0x55, 0x4e, 0x00, 0x00, 0x07, 0xfa,
- 0x40, 0x7c, 0x0e, 0x00, 0x10, 0x88, 0x00, 0x10, 0x02, 0x20,
- 0x00, 0x40, 0x00, 0x20, 0x00, 0x21, 0x29, 0xa8, 0x00, 0x6d,
- 0x42, 0x98, 0x00, 0x09, 0x9a, 0x99, 0xcc, 0xb7, 0x2b, 0xcd,
- 0xf7, 0x1e, 0x00, 0x86, 0x22, 0x21, 0x09, 0x25, 0x14, 0xc5,
- 0x0e, 0xd4, 0x61, 0xf1, 0x77, 0x24, 0x53, 0x85, 0x09, 0x0e,
- 0xa1, 0xc5, 0x54, 0xe0, 0x42, 0x5a, 0x68, 0x39, 0x31, 0x41,
- 0x59, 0x26, 0x53, 0x59, 0xb2, 0xea, 0xe3, 0xb5, 0x00, 0x00,
- 0x00, 0xc8, 0x00, 0xc0, 0x00, 0x00, 0x02, 0x00, 0x08, 0x20,
- 0x00, 0x21, 0x26, 0x41, 0x98, 0xa8, 0x0e, 0x2e, 0xe4, 0x8a,
- 0x70, 0xa1, 0x21, 0x65, 0xd5, 0xc7, 0x6a, 0x42, 0x5a, 0x68,
- 0x39, 0x31, 0x41, 0x59, 0x26, 0x53, 0x59, 0x99, 0x1b, 0x67,
- 0xdb, 0x00, 0x00, 0x07, 0xff, 0x80, 0x40, 0x00, 0x10, 0x00,
- 0x40, 0x00, 0x20, 0x10, 0x20, 0x40, 0x08, 0x00, 0x22, 0x82,
- 0xc0, 0x00, 0x20, 0x00, 0x31, 0x00, 0x00, 0x06, 0x81, 0x33,
- 0x50, 0xc3, 0x00, 0x20, 0x73, 0xb3, 0x44, 0x9c, 0xfd, 0xde,
- 0x1f, 0x68, 0xbb, 0x92, 0x29, 0xc2, 0x84, 0x84, 0xc8, 0xdb,
- 0x3e, 0xd8
- });
-
- byte[] expected = file2;
- byte[] actual = patchFile(file1, patch);
-
- assertEquals(toDiffString(expected, actual),
- Arrays.toString(expected), Arrays.toString(actual));
- }
-
- private String toDiffString(byte[] a1, byte[] a2) {
- StringBuilder sb = new StringBuilder();
- int n1 = a1.length;
- int n2 = a2.length;
- boolean was_same = false;
-
- for (int i = 0; i < n1; i++) {
- boolean same = i > 1 &&
- i+2 < n1 &&
- i+2 < n2 &&
- a1[i+0] == a2[i+0] &&
- a1[i+1] == a2[i+1] &&
- a1[i+2] == a2[i+2];
- if (!same) {
- if (i >= n2) {
- sb.append(String.format("[%1$3d] %2$02x %2$c | -- -\n", i, a1[i]));
- } else {
- sb.append(String.format("[%1$3d] %2$02x %2$c | %3$02x %3$c\n", i, a1[i], a2[i]));
- }
- } else if (!was_same) {
- sb.append(String.format("[%1$3d] ...\n", i));
- }
- was_same = same;
- }
- for (int i = n1; i < n2; i++) {
- sb.append(String.format("[%1$3d] -- - | %2$02x %2$c\n", i, a2[i]));
- }
-
- return sb.toString();
- }
-
- /**
- * Work around the lack of unsigned bytes in java by providing an initialization
- * array where each short is in the range 0..0xFF and converting it to signed bytes.
- *
- * unsigned byte: 0..127 => signed java byte: 0..127
- * unsigned byte: 128..255 => signed java byte: -128..-1
- *
- * unsigned to signed java: (unsigned - 256) if unsigned > 127
- * signed java to unsigned: (256 + signed) if signed < 0
- */
- private byte[] toSignedBytes(short[] s) {
- int n = s.length;
- byte[] b = new byte[n];
- for (int i = 0; i < n; i++) {
- short v = s[i];
- b[i] = v < 128 ? (byte)v : (byte)(v - 256);
- }
- return b;
- }
-
- @SuppressWarnings("unused")
- private byte toSigned(int unsigned) {
- return unsigned < 128 ? (byte)unsigned : (byte)(unsigned - 256);
- }
-
- private short toUnsigned(byte signed) {
- if (signed >= 0) {
- return signed;
- } else {
- return (short) ((short) 256 + signed);
- }
- }
-
- /**
- * Patches the binary "file1" using the bsdiff/bspatch "patch" data.
- * This implements bspatch.c in Java.
- *
- * Reference: http://www.daemonology.net/bsdiff/ <br/>
- * Based on bspatch.c as identified by <br/>
- * {@code $FreeBSD: src/usr.bin/bsdiff/bspatch/bspatch.c,v 1.1 2005/08/06 01:59:06 cperciva Exp $}
- * (BSD license, Copyright 2003-2005 Colin Percival)
- *
- * @param file1 The base file to be patched.
- * @param patch The binary patch to apply to base file.
- * @return A new byte array representing the patched file.
- * @throws PatchException when the patch header is invalid.
- * @throws IOException if the BZIP2 decoder fails.
- */
- private byte[] patchFile(byte[] file1, byte[] patch) throws PatchException, IOException {
- /*
- File format:
- 0 8 "BSDIFF40"
- 8 8 X
- 16 8 Y
- 24 8 sizeof(newfile)
- 32 X bzip2(control block)
- 32+X Y bzip2(diff block)
- 32+X+Y ??? bzip2(extra block)
- with control block a set of triples (x,y,z) meaning "add x bytes
- from oldfile to x bytes from the diff block; copy y bytes from the
- extra block; seek forwards in oldfile by z bytes".
- */
-
- /* Read header */
- if (patch.length < 32) {
- throw new PatchException("Header.len < 32");
- }
- byte[] header = patch;
-
- /* Check for appropriate magic */
- if (header[0] != 'B' || header[1] != 'S' || header[2] != 'D' || header[3] != 'I' ||
- header[4] != 'F' || header[5] != 'F' || header[6] != '4' || header[7] != '0') {
- throw new PatchException("Invalid header signature");
- }
-
- /* Read lengths from header */
- long bzctrllen = offtin(header, 8);
- long bzdatalen = offtin(header, 16);
- long newsize = offtin(header, 24);
- if (bzctrllen < 0 || bzdatalen < 0 || newsize < 0) {
- throw new PatchException("Invalid header lengths");
- }
-
- // Note: bspatch uses long lengths everywhere;
- // however new byte[] doesn't support that and we don't expect to
- // have 2GB+ file sizes to diff any time soon so let's
- // do a first implementation that only supports 2^32 sizes.
-
- /* Read embedded files using Apache Common Compress' BZIP2 */
- InputStream cpfbz2 = readBzip2Data(patch, 32, bzctrllen);
- InputStream dpfbz2 = readBzip2Data(patch, 32 + bzctrllen, bzdatalen);
- InputStream epfbz2 = readBzip2Data(patch, 32 + bzctrllen + bzdatalen, -1);
-
- int oldsize = file1.length;
- byte[] old = file1;
-
- byte[] _new = new byte[(int) newsize];
-
- long ctrl[] = new long[3];
- byte buf[] = new byte[8];
- long oldpos = 0;
- long newpos = 0;
- while (newpos < newsize) {
- long lenread;
-
- /* Read control data */
- for(int i = 0; i <= 2; i++) {
- lenread = BZ2_bzRead(cpfbz2, buf, 0, 8);
- if (lenread < 8) {
- throw new PatchException("Failed to read control data") ;
- }
- ctrl[i] = offtin(buf, 0);
- };
-
- /* Sanity-check */
- if (newpos + ctrl[0] > newsize) {
- throw new PatchException("Sanity check failed") ;
- }
-
- /* Read diff string */
- lenread = BZ2_bzRead(dpfbz2, _new, newpos, ctrl[0]);
- if (lenread < ctrl[0]) {
- throw new PatchException("Failed to read diff data") ;
- }
-
- /* Add old data to diff string */
- for (int i = 0; i < ctrl[0]; i++) {
- if (oldpos + i >= 0 && oldpos + i < oldsize) {
- _new[(int) (newpos + i)] += old[(int) (oldpos + i)];
- }
- }
-
- /* Adjust pointers */
- newpos += ctrl[0];
- oldpos += ctrl[0];
-
- /* Sanity-check */
- if (newpos + ctrl[1] > newsize) {
- throw new PatchException("Sanity check failed") ;
- }
-
- /* Read extra string */
- lenread = BZ2_bzRead(epfbz2, _new, newpos, ctrl[1]);
- if (lenread < ctrl[1]) {
- throw new PatchException("Failed to read extra data") ;
- }
-
- /* Adjust pointers */
- newpos += ctrl[1];
- oldpos += ctrl[2];
- }
-
- /* Clean up the bzip2 reads */
- cpfbz2.close();
- dpfbz2.close();
- epfbz2.close();
-
- /* Write the new file */
- // nop
-
- return _new;
- }
-
- private long offtin(byte[] header, int offset) {
- long y = 0;
-
- offset += 7;
- y = header[offset] & 0x7F;
- boolean sign = (header[offset] & 0x80) != 0;
- for (int i = 6; i >= 0; i--) {
- y = y * 256 + toUnsigned(header[--offset]);
- }
-
- if (sign) {
- y = -y;
- }
-
- return y;
- }
-
- /**
- * Decode a BZIP2 data block starting at the given offset.
- *
- * @param data The binary data of the file.
- * @param offset The index where the file begins
- * @param length The length to read. Use -1 to mean "up to the end".
- * @return A new decoded byte array.
- * @throws IOException when the BZIP2 decompression fails.
- */
- private InputStream readBzip2Data(byte[] data, long offset, long length) throws IOException {
- if (length == -1) {
- length = data.length - offset;
- }
- ByteArrayInputStream is = new ByteArrayInputStream(data, (int) offset, (int) length);
- BZip2CompressorInputStream bis = new BZip2CompressorInputStream(is);
- return bis;
- }
-
- /**
- * Reads the {@code length} next bytes from the bzip2 input stream.
- *
- * @param bzip2is The input stream to read from.
- * @param dest The destination buffer to fill.
- * @param length The length to read in bytes.
- * @return The number of bytes read.
- * @throws IOException If there's not enough data to read.
- */
- private long BZ2_bzRead(InputStream bzip2is, byte[] dest, long offset, long length)
- throws IOException {
- for (long i = 0; i < length; ) {
- int len = bzip2is.read(dest, (int) (offset + i), (int) (length - i));
- if (len == -1) {
- throw new IOException("Bzip2 EOF");
- }
- i += len;
- }
- return length;
- }
-
-
- @SuppressWarnings("serial")
- static class PatchException extends Exception {
- public PatchException() {
- super("Corrupt patch");
- }
- public PatchException(String msg) {
- super("Corrupt patch: " + msg);
- }
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/util/CommandLineParserTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/util/CommandLineParserTest.java
deleted file mode 100644
index 7d8a01f..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/util/CommandLineParserTest.java
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.util;
-
-import com.android.utils.ILogger;
-import com.android.utils.StdLogger;
-
-import java.util.Arrays;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-
-public class CommandLineParserTest extends TestCase {
-
- private StdLogger mLog;
-
- /**
- * A mock version of the {@link CommandLineParser} class that does not
- * exits and captures its stdout/stderr output.
- */
- public static class MockCommandLineProcessor extends CommandLineParser {
- private boolean mExitCalled;
- private boolean mHelpCalled;
- private String mStdOut = "";
- private String mStdErr = "";
-
- public MockCommandLineProcessor(ILogger logger) {
- super(logger,
- new String[][] {
- { "verb1", "action1", "Some action" },
- { "verb1", "action2", "Another action" },
- { "verb2", NO_VERB_OBJECT, "Action with string array" },
- });
- define(Mode.STRING, false /*mandatory*/,
- "verb1", "action1", "1", "first", "non-mandatory flag", null);
- define(Mode.STRING, true /*mandatory*/,
- "verb1", "action1", "2", "second", "mandatory flag", null);
-
- define(Mode.STRING, true /*mandatory*/,
- "verb2", NO_VERB_OBJECT, "1", "first", "1st mandatory flag", null);
- define(Mode.STRING_ARRAY, true /*mandatory*/,
- "verb2", NO_VERB_OBJECT, "2", "second", "2nd mandatory flag", null);
- define(Mode.STRING, true /*mandatory*/,
- "verb2", NO_VERB_OBJECT, "3", "third", "3rd mandatory flag", null);
- }
-
- @Override
- public void printHelpAndExitForAction(String verb, String directObject,
- String errorFormat, Object... args) {
- mHelpCalled = true;
- super.printHelpAndExitForAction(verb, directObject, errorFormat, args);
- }
-
- @Override
- protected void exit() {
- mExitCalled = true;
- }
-
- @Override
- protected void stdout(String format, Object... args) {
- String s = String.format(format, args);
- mStdOut += s + "\n";
- // don't call super to avoid printing stuff
- }
-
- @Override
- protected void stderr(String format, Object... args) {
- String s = String.format(format, args);
- mStdErr += s + "\n";
- // don't call super to avoid printing stuff
- }
-
- public boolean wasHelpCalled() {
- return mHelpCalled;
- }
-
- public boolean wasExitCalled() {
- return mExitCalled;
- }
-
- public String getStdOut() {
- return mStdOut;
- }
-
- public String getStdErr() {
- return mStdErr;
- }
- }
-
- @Override
- protected void setUp() throws Exception {
- mLog = new StdLogger(StdLogger.Level.VERBOSE);
- super.setUp();
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- public void testPrintHelpAndExit() {
- MockCommandLineProcessor c = new MockCommandLineProcessor(mLog);
- assertFalse(c.wasExitCalled());
- assertFalse(c.wasHelpCalled());
- assertTrue(c.getStdOut().equals(""));
- assertTrue(c.getStdErr().equals(""));
- c.printHelpAndExit(null);
- assertTrue(c.getStdOut().indexOf("-v") != -1);
- assertTrue(c.getStdOut().indexOf("--verbose") != -1);
- assertTrue(c.getStdErr().equals(""));
- assertTrue(c.wasExitCalled());
-
- c = new MockCommandLineProcessor(mLog);
- assertFalse(c.wasExitCalled());
- assertTrue(c.getStdOut().equals(""));
- assertTrue(c.getStdErr().indexOf("Missing parameter") == -1);
-
- c.printHelpAndExit("Missing %s", "parameter");
- assertTrue(c.wasExitCalled());
- assertFalse(c.getStdOut().equals(""));
- assertTrue(c.getStdErr().indexOf("Missing parameter") != -1);
- }
-
- public void testVerbose() {
- MockCommandLineProcessor c = new MockCommandLineProcessor(mLog);
-
- assertFalse(c.isVerbose());
- c.parseArgs(new String[] { "-v" });
- assertTrue(c.isVerbose());
- assertTrue(c.wasExitCalled());
- assertTrue(c.wasHelpCalled());
- assertTrue(c.getStdErr().indexOf("Missing verb name.") != -1);
-
- c = new MockCommandLineProcessor(mLog);
- c.parseArgs(new String[] { "--verbose" });
- assertTrue(c.isVerbose());
- assertTrue(c.wasExitCalled());
- assertTrue(c.wasHelpCalled());
- assertTrue(c.getStdErr().indexOf("Missing verb name.") != -1);
- }
-
- public void testHelp() {
- MockCommandLineProcessor c = new MockCommandLineProcessor(mLog);
-
- c.parseArgs(new String[] { "-h" });
- assertTrue(c.wasExitCalled());
- assertTrue(c.wasHelpCalled());
- assertTrue(c.getStdErr().indexOf("Missing verb name.") == -1);
-
- c = new MockCommandLineProcessor(mLog);
- c.parseArgs(new String[] { "--help" });
- assertTrue(c.wasExitCalled());
- assertTrue(c.wasHelpCalled());
- assertTrue(c.getStdErr().indexOf("Missing verb name.") == -1);
- }
-
- public void testMandatory() {
- MockCommandLineProcessor c = new MockCommandLineProcessor(mLog);
-
- c.parseArgs(new String[] { "verb1", "action1", "-1", "value1", "-2", "value2" });
- assertFalse(c.wasExitCalled());
- assertFalse(c.wasHelpCalled());
- assertEquals("", c.getStdErr());
- assertEquals("value1", c.getValue("verb1", "action1", "first"));
- assertEquals("value2", c.getValue("verb1", "action1", "second"));
-
- c = new MockCommandLineProcessor(mLog);
- c.parseArgs(new String[] { "verb1", "action1", "-2", "value2" });
- assertFalse(c.wasExitCalled());
- assertFalse(c.wasHelpCalled());
- assertEquals("", c.getStdErr());
- assertEquals(null, c.getValue("verb1", "action1", "first"));
- assertEquals("value2", c.getValue("verb1", "action1", "second"));
-
- c = new MockCommandLineProcessor(mLog);
- c.parseArgs(new String[] { "verb1", "action1" });
- assertTrue(c.wasExitCalled());
- assertTrue(c.wasHelpCalled());
- assertTrue(c.getStdErr().indexOf("must be defined") != -1);
- assertEquals(null, c.getValue("verb1", "action1", "first"));
- assertEquals(null, c.getValue("verb1", "action1", "second"));
- }
-
- public void testStringArray() {
- MockCommandLineProcessor c = new MockCommandLineProcessor(mLog);
-
- c.parseArgs(new String[] { "verb2",
- "-1", "value1",
- "-2", "value2_a", "value2_b", "value2_c", "value2_d",
- "-3", "value3" });
- assertFalse(c.wasExitCalled());
- assertFalse(c.wasHelpCalled());
- assertEquals("", c.getStdErr());
- assertEquals("value1", c.getValue("verb2", null, "first"));
- assertTrue(c.getValue("verb2", null, "second") instanceof List<?>);
- assertEquals("[value2_a, value2_b, value2_c, value2_d]",
- Arrays.toString(((List<?>) c.getValue("verb2", null, "second")).toArray()));
- assertEquals("value3", c.getValue("verb2", null, "third"));
- }
-
- public void testStringArray_DashDash() {
- MockCommandLineProcessor c = new MockCommandLineProcessor(mLog);
-
- // Use -- to tell argument -2 it can absorb any argument, including dashed ones.
- // Logically -2 must be the last argument and -1/-3 must be placed before it.
- c.parseArgs(new String[] { "verb2",
- "-1", "value1",
- "-3", "value3",
- "-2", "value2_a", "--", "-value2_b", "--value2_c", "value2_d" });
- assertFalse(c.wasExitCalled());
- assertFalse(c.wasHelpCalled());
- assertEquals("", c.getStdErr());
- assertEquals("value1", c.getValue("verb2", null, "first"));
- assertTrue(c.getValue("verb2", null, "second") instanceof List<?>);
- assertEquals("[value2_a, --, -value2_b, --value2_c, value2_d]",
- Arrays.toString(((List<?>) c.getValue("verb2", null, "second")).toArray()));
- assertEquals("value3", c.getValue("verb2", null, "third"));
- }
-
- public void testStringArray_EmptyStringArray() {
- MockCommandLineProcessor c = new MockCommandLineProcessor(mLog);
-
- c.parseArgs(new String[] { "verb2",
- "-1", "value1",
- "-2",
- "-3", "value3" });
- assertTrue(c.wasExitCalled());
- assertTrue(c.wasHelpCalled());
- assertEquals("Invalid usage for flag -2: No values provided.", c.getStdErr().trim());
- }
-}
diff --git a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/util/LineUtilTest.java b/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/util/LineUtilTest.java
deleted file mode 100755
index 213efc2..0000000
--- a/sdkmanager/libs/sdklib/src/test/java/com/android/sdklib/util/LineUtilTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.util;
-
-import com.android.sdklib.util.LineUtil;
-
-import junit.framework.TestCase;
-
-
-public class LineUtilTest extends TestCase {
-
- public void testReflowLine() {
- boolean gotNpe = false;
- try {
- LineUtil.reflowLine(null);
- } catch(NullPointerException e) {
- gotNpe = true;
- } finally {
- assertTrue(gotNpe);
- }
-
- assertEquals("", LineUtil.reflowLine(""));
-
- assertEquals("1234567", LineUtil.reflowLine("1234567"));
-
- assertEquals(
- "-- verbose, -v: This description for this flag fits in exactly 78 characters.",
- LineUtil.reflowLine("-- verbose, -v: This description for this flag fits in exactly 78 characters."));
-
- assertEquals(
- "--verbose, -v : This description for this flag fits in more than 78\n" +
- " characters and needs to wrap up at the colon.",
- LineUtil.reflowLine("--verbose, -v : This description for this flag fits in more than 78 characters and needs to wrap up at the colon."));
-
- assertEquals(
- "If the line needs to wrap but there's no colon marker, the line will just wrap\n" +
- " with 4 spaces.",
- LineUtil.reflowLine("If the line needs to wrap but there's no colon marker, the line will just wrap with 4 spaces."));
-
- assertEquals(
- "--blah: More than 78 characters and lots of\n" +
- " spaces. ",
- LineUtil.reflowLine("--blah: More than 78 characters and lots of spaces. "));
-
- assertEquals(
- "In this case the colon is at the very end of the string and it's not going to\n" +
- " wrap as expected:",
- LineUtil.reflowLine("In this case the colon is at the very end of the string and it's not going to wrap as expected:"));
-
- assertEquals(
- "--flag:In-this-case-there-is-no-whitespace-and-wrapping-will-cut-just-at-the-7\n" +
- " 8-mark.",
- LineUtil.reflowLine("--flag:In-this-case-there-is-no-whitespace-and-wrapping-will-cut-just-at-the-78-mark."));
-
- assertEquals(
- "Desc: This line is split in 2.\n" +
- " The second line must align at the colon and yet still wrap as expected\n" +
- " if it doesn't fit properly.\n" +
- " The end.",
- LineUtil.reflowLine("Desc: This line is split in 2.\nThe second line must align at the colon and yet still wrap as expected if it doesn't fit properly.\nThe end."));
-
- assertEquals(
- "Desc: This line is split in 2\n" +
- " even though it doesn't need to wrap.",
- LineUtil.reflowLine("Desc: This line is split in 2\n\n\n\n\n\neven though it doesn't need to wrap."));
-
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/Android.mk b/sdkmanager/libs/sdkuilib/Android.mk
index 9406fdf..b746632 100644
--- a/sdkmanager/libs/sdkuilib/Android.mk
+++ b/sdkmanager/libs/sdkuilib/Android.mk
@@ -12,13 +12,18 @@
# 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.
-#
+
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_JAVA_RESOURCE_DIRS := src
+# The sdkuilib code has moved to tools/swt/sdkuilib.
+# The rule below uses the prebuilt sdkuilib.jar if found.
+#
+# If you want to run the tests, cd to tools/swt
+# and run ./gradlew :sdkuilib:test
+LOCAL_MODULE := sdkuilib
+LOCAL_MODULE_TAGS := optional
# IMPORTANT: if you add a new dependency here, please make sure
# to also check the following file:
# sdkmanager/app/etc/android.bat
@@ -39,13 +44,8 @@
swt \
swtmenubar
-LOCAL_MODULE := sdkuilib
+LOCAL_PREBUILT_JAVA_LIBRARIES := \
+ ../../../../prebuilts/devtools/$(LOCAL_MODULE)/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
-LOCAL_JAR_MANIFEST := etc/manifest.txt
+include $(BUILD_HOST_PREBUILT)
-include $(BUILD_HOST_JAVA_LIBRARY)
-
-
-
-# Build all sub-directories
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/AboutDialog.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/AboutDialog.java
deleted file mode 100755
index 717890b..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/AboutDialog.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository;
-
-
-import com.android.SdkConstants;
-import com.android.sdklib.io.FileOp;
-import com.android.sdklib.repository.PkgProps;
-import com.android.sdklib.repository.SdkAddonConstants;
-import com.android.sdklib.repository.SdkRepoConstants;
-import com.android.sdkuilib.internal.repository.icons.ImageFactory;
-import com.android.sdkuilib.ui.GridDataBuilder;
-import com.android.sdkuilib.ui.GridLayoutBuilder;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.Properties;
-
-public class AboutDialog extends UpdaterBaseDialog {
-
- public AboutDialog(Shell parentShell, UpdaterData updaterData) {
- super(parentShell, updaterData, "About" /*title*/);
- assert updaterData != null;
- }
-
- @Override
- protected void createContents() {
- super.createContents();
- Shell shell = getShell();
- shell.setMinimumSize(new Point(450, 150));
- shell.setSize(450, 150);
-
- GridLayoutBuilder.create(shell).columns(3);
-
- Label logo = new Label(shell, SWT.NONE);
- ImageFactory imgf = getUpdaterData() == null ? null : getUpdaterData().getImageFactory();
- Image image = imgf == null ? null : imgf.getImageByName("sdkman_logo_128.png");
- if (image != null) logo.setImage(image);
-
- Label label = new Label(shell, SWT.NONE);
- GridDataBuilder.create(label).hFill().hGrab().hSpan(2);;
- label.setText(String.format(
- "Android SDK Manager.\n" +
- "Revision %1$s\n" +
- "Add-on XML Schema #%2$d\n" +
- "Repository XML Schema #%3$d\n" +
- // TODO: update with new year date (search this to find other occurrences to update)
- "Copyright (C) 2009-2012 The Android Open Source Project.",
- getRevision(),
- SdkAddonConstants.NS_LATEST_VERSION,
- SdkRepoConstants.NS_LATEST_VERSION));
-
- Label filler = new Label(shell, SWT.NONE);
- GridDataBuilder.create(filler).fill().grab().hSpan(2);
-
- createCloseButton();
- }
-
- @Override
- protected void checkSubclass() {
- // Disable the check that prevents subclassing of SWT components
- }
-
- // -- Start of internal part ----------
- // Hide everything down-below from SWT designer
- //$hide>>$
-
- // End of hiding from SWT Designer
- //$hide<<$
-
- private String getRevision() {
- Properties p = new Properties();
- try{
- File sourceProp = FileOp.append(getUpdaterData().getOsSdkRoot(),
- SdkConstants.FD_TOOLS,
- SdkConstants.FN_SOURCE_PROP);
- FileInputStream fis = null;
- try {
- fis = new FileInputStream(sourceProp);
- p.load(fis);
- } finally {
- if (fis != null) {
- try {
- fis.close();
- } catch (IOException ignore) {
- }
- }
- }
-
- String revision = p.getProperty(PkgProps.PKG_REVISION);
- if (revision != null) {
- return revision;
- }
- } catch (IOException e) {
- }
-
- return "?";
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ArchiveInfo.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ArchiveInfo.java
deleted file mode 100755
index 2c509ca..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ArchiveInfo.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository;
-
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.archives.ArchiveReplacement;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-/**
- * Represents an archive that we want to install.
- * Note that the installer deals with archives whereas the user mostly sees packages
- * but as far as we are concerned for installation there's a 1-to-1 mapping.
- * <p/>
- * A new archive is always a remote archive that needs to be downloaded and then
- * installed. It can replace an existing local one. It can also depends on another
- * (new or local) archive, which means the dependent archive needs to be successfully
- * installed first. Finally this archive can also be a dependency for another one.
- * <p/>
- * The accepted and rejected flags are used by {@link SdkUpdaterChooserDialog} to follow
- * user choices. The installer should never install something that is not accepted.
- * <p/>
- * <em>Note</em>: There is currently no logic to support more than one level of
- * dependency, either here or in the {@link SdkUpdaterChooserDialog}, since we currently
- * have no need for it.
- *
- * @see ArchiveInfo#ArchiveInfo(Archive, Archive, ArchiveInfo[])
- */
-class ArchiveInfo extends ArchiveReplacement implements Comparable<ArchiveInfo> {
-
- private final ArchiveInfo[] mDependsOn;
- private final ArrayList<ArchiveInfo> mDependencyFor = new ArrayList<ArchiveInfo>();
- private boolean mAccepted;
- private boolean mRejected;
-
- /**
- * Creates a new replacement where the {@code newArchive} will replace the
- * currently installed {@code replaced} archive.
- * When {@code newArchive} is not intended to replace anything (e.g. because
- * the user is installing a new package not present on her system yet), then
- * {@code replace} shall be null.
- *
- * @param newArchive A "new archive" to be installed. This is always an archive
- * that comes from a remote site. This <em>may</em> be null.
- * @param replaced An optional local archive that the new one will replace.
- * Can be null if this archive does not replace anything.
- * @param dependsOn An optional new or local dependency, that is an archive that
- * <em>this</em> archive depends upon. In other words, we can only install
- * this archive if the dependency has been successfully installed. It also
- * means we need to install the dependency first. Can be null or empty.
- * However it cannot contain nulls.
- */
- public ArchiveInfo(Archive newArchive, Archive replaced, ArchiveInfo[] dependsOn) {
- super(newArchive, replaced);
- mDependsOn = dependsOn;
- }
-
- /**
- * Returns an optional new or local dependency, that is an archive that <em>this</em>
- * archive depends upon. In other words, we can only install this archive if the
- * dependency has been successfully installed. It also means we need to install the
- * dependency first.
- * <p/>
- * This array can be null or empty. It can't contain nulls though.
- */
- public ArchiveInfo[] getDependsOn() {
- return mDependsOn;
- }
-
- /**
- * Returns true if this new archive is a dependency for <em>another</em> one that we
- * want to install.
- */
- public boolean isDependencyFor() {
- return mDependencyFor.size() > 0;
- }
-
- /**
- * Adds an {@link ArchiveInfo} for which <em>this</em> package is a dependency.
- * This means the package added here depends on this package.
- */
- public ArchiveInfo addDependencyFor(ArchiveInfo dependencyFor) {
- if (!mDependencyFor.contains(dependencyFor)) {
- mDependencyFor.add(dependencyFor);
- }
-
- return this;
- }
-
- /**
- * Returns the list of {@link ArchiveInfo} for which <em>this</em> package is a dependency.
- * This means the packages listed here depend on this package.
- * <p/>
- * Implementation detail: this is the internal mutable list. Callers should not modify it.
- * This list can be empty but is never null.
- */
- public Collection<ArchiveInfo> getDependenciesFor() {
- return mDependencyFor;
- }
-
- /**
- * Sets whether this archive was accepted (either manually by the user or
- * automatically if it doesn't have a license) for installation.
- */
- public void setAccepted(boolean accepted) {
- mAccepted = accepted;
- }
-
- /**
- * Returns whether this archive was accepted (either manually by the user or
- * automatically if it doesn't have a license) for installation.
- */
- public boolean isAccepted() {
- return mAccepted;
- }
-
- /**
- * Sets whether this archive was rejected manually by the user.
- * An archive can neither accepted nor rejected.
- */
- public void setRejected(boolean rejected) {
- mRejected = rejected;
- }
-
- /**
- * Returns whether this archive was rejected manually by the user.
- * An archive can neither accepted nor rejected.
- */
- public boolean isRejected() {
- return mRejected;
- }
-
- /**
- * ArchiveInfos are compared using ther "new archive" ordering.
- *
- * @see Archive#compareTo(Archive)
- */
- @Override
- public int compareTo(ArchiveInfo rhs) {
- if (getNewArchive() != null && rhs != null) {
- return getNewArchive().compareTo(rhs.getNewArchive());
- }
- return 0;
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ISdkUpdaterWindow.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ISdkUpdaterWindow.java
deleted file mode 100755
index e5f2521..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ISdkUpdaterWindow.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository;
-
-import com.android.sdkuilib.repository.ISdkChangeListener;
-
-/**
- * Interface for the actual implementation of the Update Window.
- */
-public interface ISdkUpdaterWindow {
-
- /**
- * Adds a new listener to be notified when a change is made to the content of the SDK.
- */
- public abstract void addListener(ISdkChangeListener listener);
-
- /**
- * Removes a new listener to be notified anymore when a change is made to the content of
- * the SDK.
- */
- public abstract void removeListener(ISdkChangeListener listener);
-
- /**
- * Opens the window.
- */
- public abstract void open();
-
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ISettingsPage.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ISettingsPage.java
deleted file mode 100755
index 333644f..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ISettingsPage.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository;
-
-import com.android.sdklib.internal.repository.DownloadCache;
-
-import java.net.URL;
-import java.util.Properties;
-
-/**
- * Interface that a settings page must implement.
- */
-public interface ISettingsPage {
-
- /**
- * Java system setting picked up by {@link URL} for http proxy port.
- * Type: String.
- */
- public static final String KEY_HTTP_PROXY_PORT = "http.proxyPort"; //$NON-NLS-1$
-
- /**
- * Java system setting picked up by {@link URL} for http proxy host.
- * Type: String.
- */
- public static final String KEY_HTTP_PROXY_HOST = "http.proxyHost"; //$NON-NLS-1$
-
- /**
- * Setting to force using http:// instead of https:// connections.
- * Type: Boolean.
- * Default: False.
- */
- public static final String KEY_FORCE_HTTP = "sdkman.force.http"; //$NON-NLS-1$
-
- /**
- * Setting to display only packages that are new or updates.
- * Type: Boolean.
- * Default: True.
- */
- public static final String KEY_SHOW_UPDATE_ONLY = "sdkman.show.update.only"; //$NON-NLS-1$
-
- /**
- * Setting to ask for permission before restarting ADB.
- * Type: Boolean.
- * Default: False.
- */
- public static final String KEY_ASK_ADB_RESTART = "sdkman.ask.adb.restart"; //$NON-NLS-1$
-
- /**
- * Setting to use the {@link DownloadCache}, for small manifest XML files.
- * Type: Boolean.
- * Default: True.
- */
- public static final String KEY_USE_DOWNLOAD_CACHE = "sdkman.use.dl.cache"; //$NON-NLS-1$
-
- /**
- * Setting to enabling previews in the package list
- * Type: Boolean.
- * Default: False.
- */
- public static final String KEY_ENABLE_PREVIEWS = "sdkman.enable.previews"; //$NON-NLS-1$
-
- /**
- * Setting to set the density of the monitor.
- * Type: Integer.
- * Default: -1
- */
- public static final String KEY_MONITOR_DENSITY = "sdkman.monitor.density"; //$NON-NLS-1$
-
- /** Loads settings from the given {@link Properties} container and update the page UI. */
- public abstract void loadSettings(Properties inSettings);
-
- /** Called by the application to retrieve settings from the UI and store them in
- * the given {@link Properties} container. */
- public abstract void retrieveSettings(Properties outSettings);
-
- /**
- * Called by the application to give a callback that the page should invoke when
- * settings have changed.
- */
- public abstract void setOnSettingsChanged(SettingsChangedCallback settingsChangedCallback);
-
- /**
- * Callback used to notify the application that settings have changed and need to be
- * applied.
- */
- public interface SettingsChangedCallback {
- /**
- * Invoked by the settings page when settings have changed and need to be
- * applied. The application will call {@link ISettingsPage#retrieveSettings(Properties)}
- * and apply the new settings.
- */
- public abstract void onSettingsChanged(ISettingsPage page);
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/IUpdaterData.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/IUpdaterData.java
deleted file mode 100755
index acc3990..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/IUpdaterData.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository;
-
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.internal.avd.AvdManager;
-import com.android.sdklib.internal.repository.DownloadCache;
-import com.android.sdklib.internal.repository.ITaskFactory;
-import com.android.sdkuilib.internal.repository.icons.ImageFactory;
-import com.android.utils.ILogger;
-
-import org.eclipse.swt.widgets.Shell;
-
-
-/**
- * Interface used to retrieve some parameters from an {@link UpdaterData} instance.
- * Useful mostly for unit tests purposes.
- */
-interface IUpdaterData {
-
- public abstract ITaskFactory getTaskFactory();
-
- public abstract ILogger getSdkLog();
-
- public abstract DownloadCache getDownloadCache();
-
- public abstract ImageFactory getImageFactory();
-
- public abstract SdkManager getSdkManager();
-
- public abstract AvdManager getAvdManager();
-
- public abstract SettingsController getSettingsController();
-
- public abstract Shell getWindowShell();
-
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/MenuBarWrapper.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/MenuBarWrapper.java
deleted file mode 100755
index 8d3eabd..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/MenuBarWrapper.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository;
-
-
-import com.android.menubar.IMenuBarCallback;
-import com.android.menubar.MenuBarEnhancer;
-import com.android.sdkuilib.internal.repository.ui.SdkUpdaterWindowImpl2;
-
-import org.eclipse.swt.widgets.Menu;
-
-/**
- * A simple wrapper/delegate around the {@link MenuBarEnhancer}.
- *
- * The {@link MenuBarEnhancer} and {@link IMenuBarCallback} classes are only
- * available when the SwtMenuBar library is available too. This wrapper helps
- * {@link SdkUpdaterWindowImpl2} make the call conditional, otherwise the updater
- * window class would fail to load when the SwtMenuBar library isn't found.
- */
-public abstract class MenuBarWrapper {
-
- public MenuBarWrapper(String appName, Menu menu) {
- MenuBarEnhancer.setupMenu(appName, menu, new IMenuBarCallback() {
- @Override
- public void onPreferencesMenuSelected() {
- MenuBarWrapper.this.onPreferencesMenuSelected();
- }
-
- @Override
- public void onAboutMenuSelected() {
- MenuBarWrapper.this.onAboutMenuSelected();
- }
-
- @Override
- public void printError(String format, Object... args) {
- MenuBarWrapper.this.printError(format, args);
- }
- });
- }
-
- abstract public void onPreferencesMenuSelected();
-
- abstract public void onAboutMenuSelected();
-
- abstract public void printError(String format, Object... args);
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SdkUpdaterChooserDialog.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SdkUpdaterChooserDialog.java
deleted file mode 100755
index 48f5553..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SdkUpdaterChooserDialog.java
+++ /dev/null
@@ -1,781 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository;
-
-import com.android.SdkConstants;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.packages.FullRevision;
-import com.android.sdklib.internal.repository.packages.IAndroidVersionProvider;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdkuilib.internal.repository.icons.ImageFactory;
-import com.android.sdkuilib.ui.GridDialog;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.custom.StyleRange;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Link;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-
-/**
- * Implements an {@link SdkUpdaterChooserDialog}.
- */
-final class SdkUpdaterChooserDialog extends GridDialog {
-
- /** Last dialog size for this session. */
- private static Point sLastSize;
- private boolean mLicenseAcceptAll;
- private boolean mInternalLicenseRadioUpdate;
-
- // UI fields
- private SashForm mSashForm;
- private Composite mPackageRootComposite;
- private TableViewer mTableViewPackage;
- private Table mTablePackage;
- private TableColumn mTableColum;
- private StyledText mPackageText;
- private Button mLicenseRadioAccept;
- private Button mLicenseRadioReject;
- private Button mLicenseRadioAcceptAll;
- private Group mPackageTextGroup;
- private final UpdaterData mUpdaterData;
- private Group mTableGroup;
- private Label mErrorLabel;
-
- /**
- * List of all archives to be installed with dependency information.
- * <p/>
- * Note: in a lot of cases, we need to find the archive info for a given archive. This
- * is currently done using a simple linear search, which is fine since we only have a very
- * limited number of archives to deal with (e.g. < 10 now). We might want to revisit
- * this later if it becomes an issue. Right now just do the simple thing.
- *<p/>
- * Typically we could add a map Archive=>ArchiveInfo later.
- */
- private final Collection<ArchiveInfo> mArchives;
-
-
-
- /**
- * Create the dialog.
- * @param parentShell The shell to use, typically updaterData.getWindowShell()
- * @param updaterData The updater data
- * @param archives The archives to be installed
- */
- public SdkUpdaterChooserDialog(Shell parentShell,
- UpdaterData updaterData,
- Collection<ArchiveInfo> archives) {
- super(parentShell, 3, false/*makeColumnsEqual*/);
- mUpdaterData = updaterData;
- mArchives = archives;
- }
-
- @Override
- protected boolean isResizable() {
- return true;
- }
-
- /**
- * Returns the results, i.e. the list of selected new archives to install.
- * This is similar to the {@link ArchiveInfo} list instance given to the constructor
- * except only accepted archives are present.
- *
- * An empty list is returned if cancel was choosen.
- */
- public ArrayList<ArchiveInfo> getResult() {
- ArrayList<ArchiveInfo> ais = new ArrayList<ArchiveInfo>();
-
- if (getReturnCode() == Window.OK) {
- for (ArchiveInfo ai : mArchives) {
- if (ai.isAccepted()) {
- ais.add(ai);
- }
- }
- }
-
- return ais;
- }
-
- /**
- * Create the main content of the dialog.
- * See also {@link #createButtonBar(Composite)} below.
- */
- @Override
- public void createDialogContent(Composite parent) {
- // Sash form
- mSashForm = new SashForm(parent, SWT.NONE);
- mSashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1));
-
-
- // Left part of Sash Form
-
- mTableGroup = new Group(mSashForm, SWT.NONE);
- mTableGroup.setText("Packages");
- mTableGroup.setLayout(new GridLayout(1, false/*makeColumnsEqual*/));
-
- mTableViewPackage = new TableViewer(mTableGroup, SWT.BORDER | SWT.V_SCROLL | SWT.SINGLE);
- mTablePackage = mTableViewPackage.getTable();
- mTablePackage.setHeaderVisible(false);
- mTablePackage.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
-
- mTablePackage.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- onPackageSelected(); //$hide$
- }
- @Override
- public void widgetDefaultSelected(SelectionEvent e) {
- onPackageDoubleClick();
- }
- });
-
- mTableColum = new TableColumn(mTablePackage, SWT.NONE);
- mTableColum.setWidth(100);
- mTableColum.setText("Packages");
-
-
- // Right part of Sash form
- mPackageRootComposite = new Composite(mSashForm, SWT.NONE);
- mPackageRootComposite.setLayout(new GridLayout(4, false/*makeColumnsEqual*/));
- mPackageRootComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-
- mPackageTextGroup = new Group(mPackageRootComposite, SWT.NONE);
- mPackageTextGroup.setText("Package Description && License");
- mPackageTextGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 4, 1));
- mPackageTextGroup.setLayout(new GridLayout(1, false/*makeColumnsEqual*/));
-
- mPackageText = new StyledText(mPackageTextGroup,
- SWT.MULTI | SWT.READ_ONLY | SWT.WRAP | SWT.V_SCROLL);
- mPackageText.setBackground(
- getParentShell().getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
- mPackageText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
-
- mLicenseRadioAccept = new Button(mPackageRootComposite, SWT.RADIO);
- mLicenseRadioAccept.setText("Accept");
- mLicenseRadioAccept.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- onLicenseRadioSelected();
- }
- });
-
- mLicenseRadioReject = new Button(mPackageRootComposite, SWT.RADIO);
- mLicenseRadioReject.setText("Reject");
- mLicenseRadioReject.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- onLicenseRadioSelected();
- }
- });
-
- Link link = new Link(mPackageRootComposite, SWT.NONE);
- link.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false, 1, 1));
- final String printAction = "Print"; // extracted for NLS, to compare with below.
- link.setText(String.format("<a>Copy to clipboard</a> | <a>%1$s</a>", printAction));
- link.setToolTipText("Copies all text and license to clipboard | Print using system defaults.");
- link.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- super.widgetSelected(e);
- if (printAction.equals(e.text)) {
- mPackageText.print();
- } else {
- Point p = mPackageText.getSelection();
- mPackageText.selectAll();
- mPackageText.copy();
- mPackageText.setSelection(p);
- }
- }
- });
-
-
- mLicenseRadioAcceptAll = new Button(mPackageRootComposite, SWT.RADIO);
- mLicenseRadioAcceptAll.setText("Accept All");
- mLicenseRadioAcceptAll.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- onLicenseRadioSelected();
- }
- });
-
- mSashForm.setWeights(new int[] {200, 300});
- }
-
- /**
- * Creates and returns the contents of this dialog's button bar.
- * <p/>
- * This reimplements most of the code from the base class with a few exceptions:
- * <ul>
- * <li>Enforces 3 columns.
- * <li>Inserts a full-width error label.
- * <li>Inserts a help label on the left of the first button.
- * <li>Renames the OK button into "Install"
- * </ul>
- */
- @Override
- protected Control createButtonBar(Composite parent) {
- Composite composite = new Composite(parent, SWT.NONE);
- GridLayout layout = new GridLayout();
- layout.numColumns = 0; // this is incremented by createButton
- layout.makeColumnsEqualWidth = false;
- layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
- layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
- layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
- layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
- composite.setLayout(layout);
- GridData data = new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1);
- composite.setLayoutData(data);
- composite.setFont(parent.getFont());
-
- // Error message area
- mErrorLabel = new Label(composite, SWT.NONE);
- mErrorLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1));
-
- // Label at the left of the install/cancel buttons
- Label label = new Label(composite, SWT.NONE);
- label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
- label.setText("[*] Something depends on this package");
- label.setEnabled(false);
- layout.numColumns++;
-
- // Add the ok/cancel to the button bar.
- createButtonsForButtonBar(composite);
-
- // the ok button should be an "install" button
- Button button = getButton(IDialogConstants.OK_ID);
- button.setText("Install");
-
- return composite;
- }
-
- // -- End of UI, Start of internal logic ----------
- // Hide everything down-below from SWT designer
- //$hide>>$
-
- @Override
- public void create() {
- super.create();
-
- // set window title
- getShell().setText("Choose Packages to Install");
-
- setWindowImage();
-
- // Automatically accept those with an empty license or no license
- for (ArchiveInfo ai : mArchives) {
- Archive a = ai.getNewArchive();
- if (a != null) {
- String license = a.getParentPackage().getLicense();
- ai.setAccepted(license == null || license.trim().length() == 0);
- }
- }
-
- // Fill the list with the replacement packages
- mTableViewPackage.setLabelProvider(new NewArchivesLabelProvider());
- mTableViewPackage.setContentProvider(new NewArchivesContentProvider());
- mTableViewPackage.setInput(mArchives);
-
- adjustColumnsWidth();
-
- // select first item
- mTablePackage.select(0);
- onPackageSelected();
- }
-
- /**
- * Creates the icon of the window shell.
- */
- private void setWindowImage() {
- String imageName = "android_icon_16.png"; //$NON-NLS-1$
- if (SdkConstants.currentPlatform() == SdkConstants.PLATFORM_DARWIN) {
- imageName = "android_icon_128.png"; //$NON-NLS-1$
- }
-
- if (mUpdaterData != null) {
- ImageFactory imgFactory = mUpdaterData.getImageFactory();
- if (imgFactory != null) {
- getShell().setImage(imgFactory.getImageByName(imageName));
- }
- }
- }
-
- /**
- * Adds a listener to adjust the columns width when the parent is resized.
- * <p/>
- * If we need something more fancy, we might want to use this:
- * http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet77.java?view=co
- */
- private void adjustColumnsWidth() {
- // Add a listener to resize the column to the full width of the table
- ControlAdapter resizer = new ControlAdapter() {
- @Override
- public void controlResized(ControlEvent e) {
- Rectangle r = mTablePackage.getClientArea();
- mTableColum.setWidth(r.width);
- }
- };
- mTablePackage.addControlListener(resizer);
- resizer.controlResized(null);
- }
-
- /**
- * Captures the window size before closing this.
- * @see #getInitialSize()
- */
- @Override
- public boolean close() {
- sLastSize = getShell().getSize();
- return super.close();
- }
-
- /**
- * Tries to reuse the last window size during this session.
- * <p/>
- * Note: the alternative would be to implement {@link #getDialogBoundsSettings()}
- * since the default {@link #getDialogBoundsStrategy()} is to persist both location
- * and size.
- */
- @Override
- protected Point getInitialSize() {
- if (sLastSize != null) {
- return sLastSize;
- } else {
- // Arbitrary values that look good on my screen and fit on 800x600
- return new Point(740, 470);
- }
- }
-
- /**
- * Callback invoked when a package item is selected in the list.
- */
- private void onPackageSelected() {
- ArchiveInfo ai = getSelectedArchive();
- displayInformation(ai);
- displayMissingDependency(ai);
- updateLicenceRadios(ai);
- }
-
- /** Returns the currently selected {@link ArchiveInfo} or null. */
- private ArchiveInfo getSelectedArchive() {
- ISelection sel = mTableViewPackage.getSelection();
- if (sel instanceof IStructuredSelection) {
- Object elem = ((IStructuredSelection) sel).getFirstElement();
- if (elem instanceof ArchiveInfo) {
- return (ArchiveInfo) elem;
- }
- }
- return null;
- }
-
- /**
- * Updates the package description and license text depending on the selected package.
- * <p/>
- * Note that right now there is no logic to support more than one level of dependencies
- * (e.g. A <- B <- C and A is disabled so C should be disabled; currently C's state depends
- * solely on B's state). We currently don't need this. It would be straightforward to add
- * if we had a need for it, though. This would require changes to {@link ArchiveInfo} and
- * {@link SdkUpdaterLogic}.
- */
- private void displayInformation(ArchiveInfo ai) {
- if (ai == null) {
- mPackageText.setText("Please select a package.");
- return;
- }
-
- Archive aNew = ai.getNewArchive();
- if (aNew == null) {
- // Only missing archives have a null archive, so we shouldn't be here.
- return;
- }
-
- Package pNew = aNew.getParentPackage();
-
- mPackageText.setText(""); //$NON-NLS-1$
-
- addSectionTitle("Package Description\n");
- addText(pNew.getLongDescription(), "\n\n"); //$NON-NLS-1$
-
- Archive aOld = ai.getReplaced();
- if (aOld != null) {
- Package pOld = aOld.getParentPackage();
-
- FullRevision rOld = pOld.getRevision();
- FullRevision rNew = pNew.getRevision();
-
- boolean showRev = true;
-
- if (pNew instanceof IAndroidVersionProvider &&
- pOld instanceof IAndroidVersionProvider) {
- AndroidVersion vOld = ((IAndroidVersionProvider) pOld).getAndroidVersion();
- AndroidVersion vNew = ((IAndroidVersionProvider) pNew).getAndroidVersion();
-
- if (!vOld.equals(vNew)) {
- // Versions are different, so indicate more than just the revision.
- addText(String.format("This update will replace API %1$s revision %2$s with API %3$s revision %4$s.\n\n",
- vOld.getApiString(), rOld.toShortString(),
- vNew.getApiString(), rNew.toShortString()));
- showRev = false;
- }
- }
-
- if (showRev) {
- addText(String.format("This update will replace revision %1$s with revision %2$s.\n\n",
- rOld.toShortString(),
- rNew.toShortString()));
- }
- }
-
- ArchiveInfo[] aDeps = ai.getDependsOn();
- if ((aDeps != null && aDeps.length > 0) || ai.isDependencyFor()) {
- addSectionTitle("Dependencies\n");
-
- if (aDeps != null && aDeps.length > 0) {
- addText("Installing this package also requires installing:");
- for (ArchiveInfo aDep : aDeps) {
- addText(String.format("\n- %1$s",
- aDep.getShortDescription()));
- }
- addText("\n\n");
- }
-
- if (ai.isDependencyFor()) {
- addText("This package is a dependency for:");
- for (ArchiveInfo ai2 : ai.getDependenciesFor()) {
- addText(String.format("\n- %1$s",
- ai2.getShortDescription()));
- }
- addText("\n\n");
- }
- }
-
- addSectionTitle("Archive Description\n");
- addText(aNew.getLongDescription(), "\n\n"); //$NON-NLS-1$
-
- String license = pNew.getLicense();
- if (license != null) {
- addSectionTitle("License\n");
- addText(license.trim(), "\n\n"); //$NON-NLS-1$
- }
-
- addSectionTitle("Site\n");
- SdkSource source = pNew.getParentSource();
- if (source != null) {
- addText(source.getShortDescription());
- }
- }
-
- /**
- * Computes and displays missing dependencies.
- *
- * If there's a selected package, check the dependency for that one.
- * Otherwise display the first missing dependency of any other package.
- */
- private void displayMissingDependency(ArchiveInfo ai) {
- String error = null;
-
- try {
- if (ai != null) {
- if (ai.isAccepted()) {
- // Case where this package is accepted but blocked by another non-accepted one
- ArchiveInfo[] adeps = ai.getDependsOn();
- if (adeps != null) {
- for (ArchiveInfo adep : adeps) {
- if (!adep.isAccepted()) {
- error = String.format("This package depends on '%1$s'.",
- adep.getShortDescription());
- return;
- }
- }
- }
- } else {
- // Case where this package blocks another one when not accepted
- for (ArchiveInfo adep : ai.getDependenciesFor()) {
- // It only matters if the blocked one is accepted
- if (adep.isAccepted()) {
- error = String.format("Package '%1$s' depends on this one.",
- adep.getShortDescription());
- return;
- }
- }
- }
- }
-
- // If there is no missing dependency on the current selection,
- // just find the first missing dependency of any other package.
- for (ArchiveInfo ai2 : mArchives) {
- if (ai2 == ai) {
- // We already processed that one above.
- continue;
- }
- if (ai2.isAccepted()) {
- // The user requested to install this package.
- // Check if all its dependencies are met.
- ArchiveInfo[] adeps = ai2.getDependsOn();
- if (adeps != null) {
- for (ArchiveInfo adep : adeps) {
- if (!adep.isAccepted()) {
- error = String.format("Package '%1$s' depends on '%2$s'",
- ai2.getShortDescription(),
- adep.getShortDescription());
- return;
- }
- }
- }
- } else {
- // The user did not request to install this package.
- // Check whether this package blocks another one when not accepted.
- for (ArchiveInfo adep : ai2.getDependenciesFor()) {
- // It only matters if the blocked one is accepted
- // or if it's a local archive that is already installed (these
- // are marked as implicitly accepted, so it's the same test.)
- if (adep.isAccepted()) {
- error = String.format("Package '%1$s' depends on '%2$s'",
- adep.getShortDescription(),
- ai2.getShortDescription());
- return;
- }
- }
- }
- }
- } finally {
- mErrorLabel.setText(error == null ? "" : error); //$NON-NLS-1$
- }
- }
-
- private void addText(String...string) {
- for (String s : string) {
- mPackageText.append(s);
- }
- }
-
- private void addSectionTitle(String string) {
- String s = mPackageText.getText();
- int start = (s == null ? 0 : s.length());
- mPackageText.append(string);
-
- StyleRange sr = new StyleRange();
- sr.start = start;
- sr.length = string.length();
- sr.fontStyle = SWT.BOLD;
- sr.underline = true;
- mPackageText.setStyleRange(sr);
- }
-
- private void updateLicenceRadios(ArchiveInfo ai) {
- if (mInternalLicenseRadioUpdate) {
- return;
- }
- mInternalLicenseRadioUpdate = true;
-
- boolean oneAccepted = false;
-
- if (mLicenseAcceptAll) {
- mLicenseRadioAcceptAll.setSelection(true);
- mLicenseRadioAccept.setEnabled(true);
- mLicenseRadioReject.setEnabled(true);
- mLicenseRadioAccept.setSelection(false);
- mLicenseRadioReject.setSelection(false);
- } else {
- mLicenseRadioAcceptAll.setSelection(false);
- oneAccepted = ai != null && ai.isAccepted();
- mLicenseRadioAccept.setEnabled(ai != null);
- mLicenseRadioReject.setEnabled(ai != null);
- mLicenseRadioAccept.setSelection(oneAccepted);
- mLicenseRadioReject.setSelection(ai != null && ai.isRejected());
- }
-
- // The install button is enabled if there's at least one package accepted.
- // If the current one isn't, look for another one.
- boolean missing = mErrorLabel.getText() != null && mErrorLabel.getText().length() > 0;
- if (!missing && !oneAccepted) {
- for(ArchiveInfo ai2 : mArchives) {
- if (ai2.isAccepted()) {
- oneAccepted = true;
- break;
- }
- }
- }
-
- getButton(IDialogConstants.OK_ID).setEnabled(!missing && oneAccepted);
-
- mInternalLicenseRadioUpdate = false;
- }
-
- /**
- * Callback invoked when one of the radio license buttons is selected.
- *
- * - accept/refuse: toggle, update item checkbox
- * - accept all: set accept-all, check all items
- */
- private void onLicenseRadioSelected() {
- if (mInternalLicenseRadioUpdate) {
- return;
- }
- mInternalLicenseRadioUpdate = true;
-
- ArchiveInfo ai = getSelectedArchive();
-
- if (ai == null) {
- // Should never happen.
- return;
- }
-
- boolean needUpdate = true;
-
- if (!mLicenseAcceptAll && mLicenseRadioAcceptAll.getSelection()) {
- // Accept all has been switched on. Mark all packages as accepted
- mLicenseAcceptAll = true;
- for(ArchiveInfo ai2 : mArchives) {
- ai2.setAccepted(true);
- ai2.setRejected(false);
- }
-
- } else if (mLicenseRadioAccept.getSelection()) {
- // Accept only this one
- mLicenseAcceptAll = false;
- ai.setAccepted(true);
- ai.setRejected(false);
-
- } else if (mLicenseRadioReject.getSelection()) {
- // Reject only this one
- mLicenseAcceptAll = false;
- ai.setAccepted(false);
- ai.setRejected(true);
-
- } else {
- needUpdate = false;
- }
-
- mInternalLicenseRadioUpdate = false;
-
- if (needUpdate) {
- if (mLicenseAcceptAll) {
- mTableViewPackage.refresh();
- } else {
- mTableViewPackage.refresh(ai);
- }
- displayMissingDependency(ai);
- updateLicenceRadios(ai);
- }
- }
-
- /**
- * Callback invoked when a package item is double-clicked in the list.
- */
- private void onPackageDoubleClick() {
- ArchiveInfo ai = getSelectedArchive();
-
- if (ai == null) {
- // Should never happen.
- return;
- }
-
- boolean wasAccepted = ai.isAccepted();
- ai.setAccepted(!wasAccepted);
- ai.setRejected(wasAccepted);
-
- // update state
- mLicenseAcceptAll = false;
- mTableViewPackage.refresh(ai);
- displayMissingDependency(ai);
- updateLicenceRadios(ai);
- }
-
- private class NewArchivesLabelProvider extends LabelProvider {
- @Override
- public Image getImage(Object element) {
- assert element instanceof ArchiveInfo;
- ArchiveInfo ai = (ArchiveInfo) element;
-
- ImageFactory imgFactory = mUpdaterData.getImageFactory();
- if (imgFactory != null) {
- if (ai.isAccepted()) {
- return imgFactory.getImageByName("accept_icon16.png");
- } else if (ai.isRejected()) {
- return imgFactory.getImageByName("reject_icon16.png");
- }
- return imgFactory.getImageByName("unknown_icon16.png");
- }
- return super.getImage(element);
- }
-
- @Override
- public String getText(Object element) {
- assert element instanceof ArchiveInfo;
- ArchiveInfo ai = (ArchiveInfo) element;
-
- String desc = ai.getShortDescription();
-
- if (ai.isDependencyFor()) {
- desc += " [*]";
- }
-
- return desc;
- }
- }
-
- private class NewArchivesContentProvider implements IStructuredContentProvider {
-
- @Override
- public void dispose() {
- // pass
- }
-
- @Override
- public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
- // Ignore. The input is always mArchives
- }
-
- @Override
- public Object[] getElements(Object inputElement) {
- return mArchives.toArray();
- }
- }
-
- // End of hiding from SWT Designer
- //$hide<<$
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SdkUpdaterLogic.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SdkUpdaterLogic.java
deleted file mode 100755
index 25e6553..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SdkUpdaterLogic.java
+++ /dev/null
@@ -1,1477 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository;
-
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.internal.repository.ITask;
-import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.packages.AddonPackage;
-import com.android.sdklib.internal.repository.packages.DocPackage;
-import com.android.sdklib.internal.repository.packages.ExtraPackage;
-import com.android.sdklib.internal.repository.packages.FullRevision;
-import com.android.sdklib.internal.repository.packages.IAndroidVersionProvider;
-import com.android.sdklib.internal.repository.packages.IExactApiLevelDependency;
-import com.android.sdklib.internal.repository.packages.IMinApiLevelDependency;
-import com.android.sdklib.internal.repository.packages.IMinPlatformToolsDependency;
-import com.android.sdklib.internal.repository.packages.IMinToolsDependency;
-import com.android.sdklib.internal.repository.packages.IPlatformDependency;
-import com.android.sdklib.internal.repository.packages.MinToolsPackage;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.internal.repository.packages.Package.UpdateInfo;
-import com.android.sdklib.internal.repository.packages.PlatformPackage;
-import com.android.sdklib.internal.repository.packages.PlatformToolPackage;
-import com.android.sdklib.internal.repository.packages.SamplePackage;
-import com.android.sdklib.internal.repository.packages.SystemImagePackage;
-import com.android.sdklib.internal.repository.packages.ToolPackage;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.internal.repository.sources.SdkSources;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * The logic to compute which packages to install, based on the choices
- * made by the user. This adds required packages as needed.
- * <p/>
- * When the user doesn't provide a selection, looks at local package to find
- * those that can be updated and compute dependencies too.
- */
-class SdkUpdaterLogic {
-
- private final IUpdaterData mUpdaterData;
-
- public SdkUpdaterLogic(IUpdaterData updaterData) {
- mUpdaterData = updaterData;
- }
-
- /**
- * Retrieves an unfiltered list of all remote archives.
- * The archives are guaranteed to be compatible with the current platform.
- */
- public List<ArchiveInfo> getAllRemoteArchives(
- SdkSources sources,
- Package[] localPkgs,
- boolean includeAll) {
-
- List<Package> remotePkgs = new ArrayList<Package>();
- SdkSource[] remoteSources = sources.getAllSources();
- fetchRemotePackages(remotePkgs, remoteSources);
-
- ArrayList<Archive> archives = new ArrayList<Archive>();
- for (Package remotePkg : remotePkgs) {
- // Only look for non-obsolete updates unless requested to include them
- if (includeAll || !remotePkg.isObsolete()) {
- // Found a suitable update. Only accept the remote package
- // if it provides at least one compatible archive
-
- addArchives:
- for (Archive a : remotePkg.getArchives()) {
- if (a.isCompatible()) {
-
- // If we're trying to add a package for revision N,
- // make sure we don't also have a package for revision N-1.
- for (int i = archives.size() - 1; i >= 0; i--) {
- Package pkgFound = archives.get(i).getParentPackage();
- if (pkgFound.canBeUpdatedBy(remotePkg) == UpdateInfo.UPDATE) {
- // This package can update one we selected earlier.
- // Remove the one that can be updated by this new one.
- archives.remove(i);
- } else if (remotePkg.canBeUpdatedBy(pkgFound) == UpdateInfo.UPDATE) {
- // There is a package in the list that is already better
- // than the one we want to add, so don't add it.
- break addArchives;
- }
- }
-
- archives.add(a);
- break;
- }
- }
- }
- }
-
- ArrayList<ArchiveInfo> result = new ArrayList<ArchiveInfo>();
-
- ArchiveInfo[] localArchives = createLocalArchives(localPkgs);
-
- for (Archive a : archives) {
- insertArchive(a,
- result,
- archives,
- remotePkgs,
- remoteSources,
- localArchives,
- false /*automated*/);
- }
-
- return result;
- }
-
- /**
- * Compute which packages to install by taking the user selection
- * and adding required packages as needed.
- *
- * When the user doesn't provide a selection, looks at local packages to find
- * those that can be updated and compute dependencies too.
- */
- public List<ArchiveInfo> computeUpdates(
- Collection<Archive> selectedArchives,
- SdkSources sources,
- Package[] localPkgs,
- boolean includeAll) {
-
- List<ArchiveInfo> archives = new ArrayList<ArchiveInfo>();
- List<Package> remotePkgs = new ArrayList<Package>();
- SdkSource[] remoteSources = sources.getAllSources();
-
- // Create ArchiveInfos out of local (installed) packages.
- ArchiveInfo[] localArchives = createLocalArchives(localPkgs);
-
- // If we do not have a specific list of archives to install (that is the user
- // selected "update all" rather than request specific packages), then we try to
- // find updates based on the *existing* packages.
- if (selectedArchives == null) {
- selectedArchives = findUpdates(
- localArchives,
- remotePkgs,
- remoteSources,
- includeAll);
- }
-
- // Once we have a list of packages to install, we try to solve all their
- // dependencies by automatically adding them to the list of things to install.
- // This works on the list provided either by the user directly or the list
- // computed from potential updates.
- for (Archive a : selectedArchives) {
- insertArchive(a,
- archives,
- selectedArchives,
- remotePkgs,
- remoteSources,
- localArchives,
- false /*automated*/);
- }
-
- // Finally we need to look at *existing* packages which are not being updated
- // and check if they have any missing dependencies and suggest how to fix
- // these dependencies.
- fixMissingLocalDependencies(
- archives,
- selectedArchives,
- remotePkgs,
- remoteSources,
- localArchives);
-
- return archives;
- }
-
- private double getRevisionRank(FullRevision rev) {
- int p = rev.isPreview() ? 999 : 999 - rev.getPreview();
- return rev.getMajor() +
- rev.getMinor() / 1000.d +
- rev.getMicro() / 1000000.d +
- p / 1000000000.d;
- }
-
- /**
- * Finds new packages that the user does not have in his/her local SDK
- * and adds them to the list of archives to install.
- * <p/>
- * The default is to only find "new" platforms, that is anything more
- * recent than the highest platform currently installed.
- * A side effect is that for an empty SDK install this will list *all*
- * platforms available (since there's no "highest" installed platform.)
- *
- * @param archives The in-out list of archives to install. Typically the
- * list is not empty at first as it should contain any archives that is
- * already scheduled for install. This method will add to the list.
- * @param sources The list of all sources, to fetch them as necessary.
- * @param localPkgs The list of all currently installed packages.
- * @param includeAll When true, this will list all platforms.
- * (included these lower than the highest installed one) as well as
- * all obsolete packages of these platforms.
- */
- public void addNewPlatforms(
- Collection<ArchiveInfo> archives,
- SdkSources sources,
- Package[] localPkgs,
- boolean includeAll) {
-
- // Create ArchiveInfos out of local (installed) packages.
- ArchiveInfo[] localArchives = createLocalArchives(localPkgs);
-
- // Find the highest platform installed
- double currentPlatformScore = 0;
- double currentSampleScore = 0;
- double currentAddonScore = 0;
- double currentDocScore = 0;
- HashMap<String, Double> currentExtraScore = new HashMap<String, Double>();
- if (!includeAll) {
- if (localPkgs != null) {
- for (Package p : localPkgs) {
- double rev = getRevisionRank(p.getRevision());
- int api = 0;
- boolean isPreview = false;
- if (p instanceof IAndroidVersionProvider) {
- AndroidVersion vers = ((IAndroidVersionProvider) p).getAndroidVersion();
- api = vers.getApiLevel();
- isPreview = vers.isPreview();
- }
-
- // The score is 1000*api + (999 if preview) + rev
- // This allows previews to rank above a non-preview and
- // allows revisions to rank appropriately.
- double score = api * 1000 + (isPreview ? 999 : 0) + rev;
-
- if (p instanceof PlatformPackage) {
- currentPlatformScore = Math.max(currentPlatformScore, score);
- } else if (p instanceof SamplePackage) {
- currentSampleScore = Math.max(currentSampleScore, score);
- } else if (p instanceof AddonPackage) {
- currentAddonScore = Math.max(currentAddonScore, score);
- } else if (p instanceof ExtraPackage) {
- currentExtraScore.put(((ExtraPackage) p).getPath(), score);
- } else if (p instanceof DocPackage) {
- currentDocScore = Math.max(currentDocScore, score);
- }
- }
- }
- }
-
- SdkSource[] remoteSources = sources.getAllSources();
- ArrayList<Package> remotePkgs = new ArrayList<Package>();
- fetchRemotePackages(remotePkgs, remoteSources);
-
- Package suggestedDoc = null;
-
- for (Package p : remotePkgs) {
- // Skip obsolete packages unless requested to include them.
- if (p.isObsolete() && !includeAll) {
- continue;
- }
-
- double rev = getRevisionRank(p.getRevision());
- int api = 0;
- boolean isPreview = false;
- if (p instanceof IAndroidVersionProvider) {
- AndroidVersion vers = ((IAndroidVersionProvider) p).getAndroidVersion();
- api = vers.getApiLevel();
- isPreview = vers.isPreview();
- }
-
- double score = api * 1000 + (isPreview ? 999 : 0) + rev;
-
- boolean shouldAdd = false;
- if (p instanceof PlatformPackage) {
- shouldAdd = score > currentPlatformScore;
- } else if (p instanceof SamplePackage) {
- shouldAdd = score > currentSampleScore;
- } else if (p instanceof AddonPackage) {
- shouldAdd = score > currentAddonScore;
- } else if (p instanceof ExtraPackage) {
- String key = ((ExtraPackage) p).getPath();
- shouldAdd = !currentExtraScore.containsKey(key) ||
- score > currentExtraScore.get(key).doubleValue();
- } else if (p instanceof DocPackage) {
- // We don't want all the doc, only the most recent one
- if (score > currentDocScore) {
- suggestedDoc = p;
- currentDocScore = score;
- }
- }
-
- if (shouldAdd) {
- // We should suggest this package for installation.
- for (Archive a : p.getArchives()) {
- if (a.isCompatible()) {
- insertArchive(a,
- archives,
- null /*selectedArchives*/,
- remotePkgs,
- remoteSources,
- localArchives,
- true /*automated*/);
- }
- }
- }
-
- if (p instanceof PlatformPackage && (score >= currentPlatformScore)) {
- // We just added a new platform *or* we are visiting the highest currently
- // installed platform. In either case we want to make sure it either has
- // its own system image or that we provide one by default.
- PlatformPackage pp = (PlatformPackage) p;
- if (pp.getIncludedAbi() == null) {
- for (Package p2 : remotePkgs) {
- if (!(p2 instanceof SystemImagePackage) ||
- (p2.isObsolete() && !includeAll)) {
- continue;
- }
- SystemImagePackage sip = (SystemImagePackage) p2;
- if (sip.getAndroidVersion().equals(pp.getAndroidVersion())) {
- for (Archive a : sip.getArchives()) {
- if (a.isCompatible()) {
- insertArchive(a,
- archives,
- null /*selectedArchives*/,
- remotePkgs,
- remoteSources,
- localArchives,
- true /*automated*/);
- }
- }
- }
- }
- }
- }
- }
-
- if (suggestedDoc != null) {
- // We should suggest this package for installation.
- for (Archive a : suggestedDoc.getArchives()) {
- if (a.isCompatible()) {
- insertArchive(a,
- archives,
- null /*selectedArchives*/,
- remotePkgs,
- remoteSources,
- localArchives,
- true /*automated*/);
- }
- }
- }
- }
-
- /**
- * Create a array of {@link ArchiveInfo} based on all local (already installed)
- * packages. The array is always non-null but may be empty.
- * <p/>
- * The local {@link ArchiveInfo} are guaranteed to have one non-null archive
- * that you can retrieve using {@link ArchiveInfo#getNewArchive()}.
- */
- protected ArchiveInfo[] createLocalArchives(Package[] localPkgs) {
-
- if (localPkgs != null) {
- ArrayList<ArchiveInfo> list = new ArrayList<ArchiveInfo>();
- for (Package p : localPkgs) {
- // Only accept packages that have one compatible archive.
- // Local package should have 1 and only 1 compatible archive anyway.
- for (Archive a : p.getArchives()) {
- if (a != null && a.isCompatible()) {
- // We create an "installed" archive info to wrap the local package.
- // Note that dependencies are not computed since right now we don't
- // deal with more than one level of dependencies and installed archives
- // are deemed implicitly accepted anyway.
- list.add(new LocalArchiveInfo(a));
- }
- }
- }
-
- return list.toArray(new ArchiveInfo[list.size()]);
- }
-
- return new ArchiveInfo[0];
- }
-
- /**
- * Find suitable updates to all current local packages.
- * <p/>
- * Returns a list of potential updates for *existing* packages. This does NOT solve
- * dependencies for the new packages.
- * <p/>
- * Always returns a non-null collection, which can be empty.
- */
- private Collection<Archive> findUpdates(
- ArchiveInfo[] localArchives,
- Collection<Package> remotePkgs,
- SdkSource[] remoteSources,
- boolean includeAll) {
- ArrayList<Archive> updates = new ArrayList<Archive>();
-
- fetchRemotePackages(remotePkgs, remoteSources);
-
- for (ArchiveInfo ai : localArchives) {
- Archive na = ai.getNewArchive();
- if (na == null) {
- continue;
- }
- Package localPkg = na.getParentPackage();
-
- for (Package remotePkg : remotePkgs) {
- // Only look for non-obsolete updates unless requested to include them
- if ((includeAll || !remotePkg.isObsolete()) &&
- localPkg.canBeUpdatedBy(remotePkg) == UpdateInfo.UPDATE) {
- // Found a suitable update. Only accept the remote package
- // if it provides at least one compatible archive
-
- addArchives:
- for (Archive a : remotePkg.getArchives()) {
- if (a.isCompatible()) {
-
- // If we're trying to add a package for revision N,
- // make sure we don't also have a package for revision N-1.
- for (int i = updates.size() - 1; i >= 0; i--) {
- Package pkgFound = updates.get(i).getParentPackage();
- if (pkgFound.canBeUpdatedBy(remotePkg) == UpdateInfo.UPDATE) {
- // This package can update one we selected earlier.
- // Remove the one that can be updated by this new one.
- updates.remove(i);
- } else if (remotePkg.canBeUpdatedBy(pkgFound) ==
- UpdateInfo.UPDATE) {
- // There is a package in the list that is already better
- // than the one we want to add, so don't add it.
- break addArchives;
- }
- }
-
- updates.add(a);
- break;
- }
- }
- }
- }
- }
-
- return updates;
- }
-
- /**
- * Check all local archives which are NOT being updated and see if they
- * miss any dependency. If they do, try to fix that dependency by selecting
- * an appropriate package.
- */
- private void fixMissingLocalDependencies(
- Collection<ArchiveInfo> outArchives,
- Collection<Archive> selectedArchives,
- Collection<Package> remotePkgs,
- SdkSource[] remoteSources,
- ArchiveInfo[] localArchives) {
-
- nextLocalArchive: for (ArchiveInfo ai : localArchives) {
- Archive a = ai.getNewArchive();
- Package p = a == null ? null : a.getParentPackage();
- if (p == null) {
- continue;
- }
-
- // Is this local archive being updated?
- for (ArchiveInfo ai2 : outArchives) {
- if (ai2.getReplaced() == a) {
- // this new archive will replace the current local one,
- // so we don't have to care about fixing dependencies (since the
- // new archive should already have had its dependencies resolved)
- continue nextLocalArchive;
- }
- }
-
- // find dependencies for the local archive and add them as needed
- // to the outArchives collection.
- ArchiveInfo[] deps = findDependency(p,
- outArchives,
- selectedArchives,
- remotePkgs,
- remoteSources,
- localArchives);
-
- if (deps != null) {
- // The already installed archive has a missing dependency, which we
- // just selected for install. Make sure we remember the dependency
- // so that we can enforce it later in the UI.
- for (ArchiveInfo aid : deps) {
- aid.addDependencyFor(ai);
- }
- }
- }
- }
-
- private ArchiveInfo insertArchive(Archive archive,
- Collection<ArchiveInfo> outArchives,
- Collection<Archive> selectedArchives,
- Collection<Package> remotePkgs,
- SdkSource[] remoteSources,
- ArchiveInfo[] localArchives,
- boolean automated) {
- Package p = archive.getParentPackage();
-
- // Is this an update?
- Archive updatedArchive = null;
- for (ArchiveInfo ai : localArchives) {
- Archive a = ai.getNewArchive();
- if (a != null) {
- Package lp = a.getParentPackage();
-
- if (lp.canBeUpdatedBy(p) == UpdateInfo.UPDATE) {
- updatedArchive = a;
- }
- }
- }
-
- // Find dependencies and adds them as needed to outArchives
- ArchiveInfo[] deps = findDependency(p,
- outArchives,
- selectedArchives,
- remotePkgs,
- remoteSources,
- localArchives);
-
- // Make sure it's not a dup
- ArchiveInfo ai = null;
-
- for (ArchiveInfo ai2 : outArchives) {
- Archive a2 = ai2.getNewArchive();
- if (a2 != null && a2.getParentPackage().sameItemAs(archive.getParentPackage())) {
- ai = ai2;
- break;
- }
- }
-
- if (ai == null) {
- ai = new ArchiveInfo(
- archive, //newArchive
- updatedArchive, //replaced
- deps //dependsOn
- );
- outArchives.add(ai);
- }
-
- if (deps != null) {
- for (ArchiveInfo d : deps) {
- d.addDependencyFor(ai);
- }
- }
-
- return ai;
- }
-
- /**
- * Resolves dependencies for a given package.
- *
- * Returns null if no dependencies were found.
- * Otherwise return an array of {@link ArchiveInfo}, which is guaranteed to have
- * at least size 1 and contain no null elements.
- */
- private ArchiveInfo[] findDependency(Package pkg,
- Collection<ArchiveInfo> outArchives,
- Collection<Archive> selectedArchives,
- Collection<Package> remotePkgs,
- SdkSource[] remoteSources,
- ArchiveInfo[] localArchives) {
-
- // Current dependencies can be:
- // - addon: *always* depends on platform of same API level
- // - platform: *might* depends on tools of rev >= min-tools-rev
- // - extra: *might* depends on platform with api >= min-api-level
-
- Set<ArchiveInfo> aiFound = new HashSet<ArchiveInfo>();
-
- if (pkg instanceof IPlatformDependency) {
- ArchiveInfo ai = findPlatformDependency(
- (IPlatformDependency) pkg,
- outArchives,
- selectedArchives,
- remotePkgs,
- remoteSources,
- localArchives);
-
- if (ai != null) {
- aiFound.add(ai);
- }
- }
-
- if (pkg instanceof IMinToolsDependency) {
-
- ArchiveInfo ai = findToolsDependency(
- (IMinToolsDependency) pkg,
- outArchives,
- selectedArchives,
- remotePkgs,
- remoteSources,
- localArchives);
-
- if (ai != null) {
- aiFound.add(ai);
- }
- }
-
- if (pkg instanceof IMinPlatformToolsDependency) {
-
- ArchiveInfo ai = findPlatformToolsDependency(
- (IMinPlatformToolsDependency) pkg,
- outArchives,
- selectedArchives,
- remotePkgs,
- remoteSources,
- localArchives);
-
- if (ai != null) {
- aiFound.add(ai);
- }
- }
-
- if (pkg instanceof IMinApiLevelDependency) {
-
- ArchiveInfo ai = findMinApiLevelDependency(
- (IMinApiLevelDependency) pkg,
- outArchives,
- selectedArchives,
- remotePkgs,
- remoteSources,
- localArchives);
-
- if (ai != null) {
- aiFound.add(ai);
- }
- }
-
- if (pkg instanceof IExactApiLevelDependency) {
-
- ArchiveInfo ai = findExactApiLevelDependency(
- (IExactApiLevelDependency) pkg,
- outArchives,
- selectedArchives,
- remotePkgs,
- remoteSources,
- localArchives);
-
- if (ai != null) {
- aiFound.add(ai);
- }
- }
-
- if (aiFound.size() > 0) {
- ArchiveInfo[] result = aiFound.toArray(new ArchiveInfo[aiFound.size()]);
- Arrays.sort(result);
- return result;
- }
-
- return null;
- }
-
- /**
- * Resolves dependencies on tools.
- *
- * A platform or an extra package can both have a min-tools-rev, in which case it
- * depends on having a tools package of the requested revision.
- * Finds the tools dependency. If found, add it to the list of things to install.
- * Returns the archive info dependency, if any.
- */
- protected ArchiveInfo findToolsDependency(
- IMinToolsDependency pkg,
- Collection<ArchiveInfo> outArchives,
- Collection<Archive> selectedArchives,
- Collection<Package> remotePkgs,
- SdkSource[] remoteSources,
- ArchiveInfo[] localArchives) {
- // This is the requirement to match.
- FullRevision rev = pkg.getMinToolsRevision();
-
- if (rev.equals(MinToolsPackage.MIN_TOOLS_REV_NOT_SPECIFIED)) {
- // Well actually there's no requirement.
- return null;
- }
-
- // First look in locally installed packages.
- for (ArchiveInfo ai : localArchives) {
- Archive a = ai.getNewArchive();
- if (a != null) {
- Package p = a.getParentPackage();
- if (p instanceof ToolPackage) {
- if (((ToolPackage) p).getRevision().compareTo(rev) >= 0) {
- // We found one already installed.
- return null;
- }
- }
- }
- }
-
- // Look in archives already scheduled for install
- for (ArchiveInfo ai : outArchives) {
- Archive a = ai.getNewArchive();
- if (a != null) {
- Package p = a.getParentPackage();
- if (p instanceof ToolPackage) {
- if (((ToolPackage) p).getRevision().compareTo(rev) >= 0) {
- // The dependency is already scheduled for install, nothing else to do.
- return ai;
- }
- }
- }
- }
-
- // Otherwise look in the selected archives.
- if (selectedArchives != null) {
- for (Archive a : selectedArchives) {
- Package p = a.getParentPackage();
- if (p instanceof ToolPackage) {
- if (((ToolPackage) p).getRevision().compareTo(rev) >= 0) {
- // It's not already in the list of things to install, so add it now
- return insertArchive(a,
- outArchives,
- selectedArchives,
- remotePkgs,
- remoteSources,
- localArchives,
- true /*automated*/);
- }
- }
- }
- }
-
- // Finally nothing matched, so let's look at all available remote packages
- fetchRemotePackages(remotePkgs, remoteSources);
- FullRevision localRev = rev;
- Archive localArch = null;
- for (Package p : remotePkgs) {
- if (p instanceof ToolPackage) {
- FullRevision r = ((ToolPackage) p).getRevision();
- if (r.compareTo(localRev) >= 0) {
- // It's not already in the list of things to install, so add the
- // first compatible archive we can find.
- for (Archive a : p.getArchives()) {
- if (a.isCompatible()) {
- localRev = r;
- localArch = a;
- break;
- }
- }
- }
- }
- }
- if (localArch != null) {
- return insertArchive(localArch,
- outArchives,
- selectedArchives,
- remotePkgs,
- remoteSources,
- localArchives,
- true /*automated*/);
-
- }
-
- // We end up here if nothing matches. We don't have a good platform to match.
- // We need to indicate this extra depends on a missing platform archive
- // so that it can be impossible to install later on.
- return new MissingArchiveInfo(MissingArchiveInfo.TITLE_TOOL, rev);
- }
-
- /**
- * Resolves dependencies on platform-tools.
- *
- * A tool package can have a min-platform-tools-rev, in which case it depends on
- * having a platform-tool package of the requested revision.
- * Finds the platform-tool dependency. If found, add it to the list of things to install.
- * Returns the archive info dependency, if any.
- */
- protected ArchiveInfo findPlatformToolsDependency(
- IMinPlatformToolsDependency pkg,
- Collection<ArchiveInfo> outArchives,
- Collection<Archive> selectedArchives,
- Collection<Package> remotePkgs,
- SdkSource[] remoteSources,
- ArchiveInfo[] localArchives) {
- // This is the requirement to match.
- FullRevision rev = pkg.getMinPlatformToolsRevision();
- boolean findMax = false;
- int compareThreshold = 0;
- ArchiveInfo aiMax = null;
- Archive aMax = null;
-
- if (rev.equals(IMinPlatformToolsDependency.MIN_PLATFORM_TOOLS_REV_INVALID)) {
- // The requirement is invalid, which is not supposed to happen since this
- // property is mandatory. However in a typical upgrade scenario we can end
- // up with the previous updater managing a new package and not dealing
- // correctly with the new unknown property.
- // So instead we parse all the existing and remote packages and try to find
- // the max available revision and we'll use it.
- findMax = true;
- // When findMax is false, we want r.compareTo(rev) >= 0.
- // When findMax is true, we want r.compareTo(rev) > 0 (so >= 1).
- compareThreshold = 1;
- }
-
- // First look in locally installed packages.
- for (ArchiveInfo ai : localArchives) {
- Archive a = ai.getNewArchive();
- if (a != null) {
- Package p = a.getParentPackage();
- if (p instanceof PlatformToolPackage) {
- FullRevision r = ((PlatformToolPackage) p).getRevision();
- if (findMax && r.compareTo(rev) > compareThreshold) {
- rev = r;
- aiMax = ai;
- } else if (!findMax && r.compareTo(rev) >= compareThreshold) {
- // We found one already installed.
- return null;
- }
- }
- }
- }
-
- // Because of previews, we can have more than 1 choice, so get the local max.
- FullRevision localRev = rev;
- ArchiveInfo localAiMax = null;
- // Look in archives already scheduled for install
- for (ArchiveInfo ai : outArchives) {
- Archive a = ai.getNewArchive();
- if (a != null) {
- Package p = a.getParentPackage();
- if (p instanceof PlatformToolPackage) {
- FullRevision r = ((PlatformToolPackage) p).getRevision();
- if (r.compareTo(localRev) >= compareThreshold) {
- localRev = r;
- localAiMax = ai;
- }
- }
- }
- }
- if (localAiMax != null) {
- if (findMax) {
- rev = localRev;
- aiMax = localAiMax;
- } else {
- // The dependency is already scheduled for install, nothing else to do.
- return localAiMax;
- }
- }
-
-
- // Otherwise look in the selected archives.
- localRev = rev;
- Archive localAMax = null;
- if (selectedArchives != null) {
- for (Archive a : selectedArchives) {
- Package p = a.getParentPackage();
- if (p instanceof PlatformToolPackage) {
- FullRevision r = ((PlatformToolPackage) p).getRevision();
- if (r.compareTo(localRev) >= compareThreshold) {
- localRev = r;
- localAiMax = null;
- localAMax = a;
- }
- }
- }
- if (localAMax != null) {
- if (findMax) {
- rev = localRev;
- aiMax = null;
- aMax = localAMax;
- } else {
- // It's not already in the list of things to install, so add it now
- return insertArchive(localAMax,
- outArchives,
- selectedArchives,
- remotePkgs,
- remoteSources,
- localArchives,
- true /*automated*/);
- }
- }
- }
-
- // Finally nothing matched, so let's look at all available remote packages
- fetchRemotePackages(remotePkgs, remoteSources);
- localRev = rev;
- localAMax = null;
- for (Package p : remotePkgs) {
- if (p instanceof PlatformToolPackage) {
- FullRevision r = ((PlatformToolPackage) p).getRevision();
- if (r.compareTo(rev) >= 0) {
- // Make sure there's at least one valid archive here
- for (Archive a : p.getArchives()) {
- if (a.isCompatible()) {
- if (r.compareTo(localRev) >= compareThreshold) {
- localRev = r;
- localAiMax = null;
- localAMax = a;
- break;
- }
- }
- }
- }
- }
- }
- if (localAMax != null) {
- if (findMax) {
- rev = localRev;
- aiMax = null;
- aMax = localAMax;
- } else {
- // It's not already in the list of things to install, so add the
- // first compatible archive we can find.
- return insertArchive(localAMax,
- outArchives,
- selectedArchives,
- remotePkgs,
- remoteSources,
- localArchives,
- true /*automated*/);
- }
- }
-
- if (findMax) {
- if (aMax != null) {
- return insertArchive(aMax,
- outArchives,
- selectedArchives,
- remotePkgs,
- remoteSources,
- localArchives,
- true /*automated*/);
- } else if (aiMax != null) {
- return aiMax;
- }
- }
-
- // We end up here if nothing matches. We don't have a good platform to match.
- // We need to indicate this package depends on a missing platform archive
- // so that it can be impossible to install later on.
- return new MissingArchiveInfo(MissingArchiveInfo.TITLE_PLATFORM_TOOL, rev);
- }
-
- /**
- * Resolves dependencies on platform for an addon.
- *
- * An addon depends on having a platform with the same API level.
- *
- * Finds the platform dependency. If found, add it to the list of things to install.
- * Returns the archive info dependency, if any.
- */
- protected ArchiveInfo findPlatformDependency(
- IPlatformDependency pkg,
- Collection<ArchiveInfo> outArchives,
- Collection<Archive> selectedArchives,
- Collection<Package> remotePkgs,
- SdkSource[] remoteSources,
- ArchiveInfo[] localArchives) {
- // This is the requirement to match.
- AndroidVersion v = pkg.getAndroidVersion();
-
- // Find a platform that would satisfy the requirement.
-
- // First look in locally installed packages.
- for (ArchiveInfo ai : localArchives) {
- Archive a = ai.getNewArchive();
- if (a != null) {
- Package p = a.getParentPackage();
- if (p instanceof PlatformPackage) {
- if (v.equals(((PlatformPackage) p).getAndroidVersion())) {
- // We found one already installed.
- return null;
- }
- }
- }
- }
-
- // Look in archives already scheduled for install
- for (ArchiveInfo ai : outArchives) {
- Archive a = ai.getNewArchive();
- if (a != null) {
- Package p = a.getParentPackage();
- if (p instanceof PlatformPackage) {
- if (v.equals(((PlatformPackage) p).getAndroidVersion())) {
- // The dependency is already scheduled for install, nothing else to do.
- return ai;
- }
- }
- }
- }
-
- // Otherwise look in the selected archives.
- if (selectedArchives != null) {
- for (Archive a : selectedArchives) {
- Package p = a.getParentPackage();
- if (p instanceof PlatformPackage) {
- if (v.equals(((PlatformPackage) p).getAndroidVersion())) {
- // It's not already in the list of things to install, so add it now
- return insertArchive(a,
- outArchives,
- selectedArchives,
- remotePkgs,
- remoteSources,
- localArchives,
- true /*automated*/);
- }
- }
- }
- }
-
- // Finally nothing matched, so let's look at all available remote packages
- fetchRemotePackages(remotePkgs, remoteSources);
- for (Package p : remotePkgs) {
- if (p instanceof PlatformPackage) {
- if (v.equals(((PlatformPackage) p).getAndroidVersion())) {
- // It's not already in the list of things to install, so add the
- // first compatible archive we can find.
- for (Archive a : p.getArchives()) {
- if (a.isCompatible()) {
- return insertArchive(a,
- outArchives,
- selectedArchives,
- remotePkgs,
- remoteSources,
- localArchives,
- true /*automated*/);
- }
- }
- }
- }
- }
-
- // We end up here if nothing matches. We don't have a good platform to match.
- // We need to indicate this addon depends on a missing platform archive
- // so that it can be impossible to install later on.
- return new MissingPlatformArchiveInfo(pkg.getAndroidVersion());
- }
-
- /**
- * Resolves platform dependencies for extras.
- * An extra depends on having a platform with a minimun API level.
- *
- * We try to return the highest API level available above the specified minimum.
- * Note that installed packages have priority so if one installed platform satisfies
- * the dependency, we'll use it even if there's a higher API platform available but
- * not installed yet.
- *
- * Finds the platform dependency. If found, add it to the list of things to install.
- * Returns the archive info dependency, if any.
- */
- protected ArchiveInfo findMinApiLevelDependency(
- IMinApiLevelDependency pkg,
- Collection<ArchiveInfo> outArchives,
- Collection<Archive> selectedArchives,
- Collection<Package> remotePkgs,
- SdkSource[] remoteSources,
- ArchiveInfo[] localArchives) {
-
- int api = pkg.getMinApiLevel();
-
- if (api == IMinApiLevelDependency.MIN_API_LEVEL_NOT_SPECIFIED) {
- return null;
- }
-
- // Find a platform that would satisfy the requirement.
-
- // First look in locally installed packages.
- for (ArchiveInfo ai : localArchives) {
- Archive a = ai.getNewArchive();
- if (a != null) {
- Package p = a.getParentPackage();
- if (p instanceof PlatformPackage) {
- if (((PlatformPackage) p).getAndroidVersion().isGreaterOrEqualThan(api)) {
- // We found one already installed.
- return null;
- }
- }
- }
- }
-
- // Look in archives already scheduled for install
- int foundApi = 0;
- ArchiveInfo foundAi = null;
-
- for (ArchiveInfo ai : outArchives) {
- Archive a = ai.getNewArchive();
- if (a != null) {
- Package p = a.getParentPackage();
- if (p instanceof PlatformPackage) {
- if (((PlatformPackage) p).getAndroidVersion().isGreaterOrEqualThan(api)) {
- if (api > foundApi) {
- foundApi = api;
- foundAi = ai;
- }
- }
- }
- }
- }
-
- if (foundAi != null) {
- // The dependency is already scheduled for install, nothing else to do.
- return foundAi;
- }
-
- // Otherwise look in the selected archives *or* available remote packages
- // and takes the best out of the two sets.
- foundApi = 0;
- Archive foundArchive = null;
- if (selectedArchives != null) {
- for (Archive a : selectedArchives) {
- Package p = a.getParentPackage();
- if (p instanceof PlatformPackage) {
- if (((PlatformPackage) p).getAndroidVersion().isGreaterOrEqualThan(api)) {
- if (api > foundApi) {
- foundApi = api;
- foundArchive = a;
- }
- }
- }
- }
- }
-
- // Finally nothing matched, so let's look at all available remote packages
- fetchRemotePackages(remotePkgs, remoteSources);
- for (Package p : remotePkgs) {
- if (p instanceof PlatformPackage) {
- if (((PlatformPackage) p).getAndroidVersion().isGreaterOrEqualThan(api)) {
- if (api > foundApi) {
- // It's not already in the list of things to install, so add the
- // first compatible archive we can find.
- for (Archive a : p.getArchives()) {
- if (a.isCompatible()) {
- foundApi = api;
- foundArchive = a;
- }
- }
- }
- }
- }
- }
-
- if (foundArchive != null) {
- // It's not already in the list of things to install, so add it now
- return insertArchive(foundArchive,
- outArchives,
- selectedArchives,
- remotePkgs,
- remoteSources,
- localArchives,
- true /*automated*/);
- }
-
- // We end up here if nothing matches. We don't have a good platform to match.
- // We need to indicate this extra depends on a missing platform archive
- // so that it can be impossible to install later on.
- return new MissingPlatformArchiveInfo(new AndroidVersion(api, null /*codename*/));
- }
-
- /**
- * Resolves platform dependencies for add-ons.
- * An add-ons depends on having a platform with an exact specific API level.
- *
- * Finds the platform dependency. If found, add it to the list of things to install.
- * Returns the archive info dependency, if any.
- */
- protected ArchiveInfo findExactApiLevelDependency(
- IExactApiLevelDependency pkg,
- Collection<ArchiveInfo> outArchives,
- Collection<Archive> selectedArchives,
- Collection<Package> remotePkgs,
- SdkSource[] remoteSources,
- ArchiveInfo[] localArchives) {
-
- int api = pkg.getExactApiLevel();
-
- if (api == IExactApiLevelDependency.API_LEVEL_INVALID) {
- return null;
- }
-
- // Find a platform that would satisfy the requirement.
-
- // First look in locally installed packages.
- for (ArchiveInfo ai : localArchives) {
- Archive a = ai.getNewArchive();
- if (a != null) {
- Package p = a.getParentPackage();
- if (p instanceof PlatformPackage) {
- if (((PlatformPackage) p).getAndroidVersion().equals(api)) {
- // We found one already installed.
- return null;
- }
- }
- }
- }
-
- // Look in archives already scheduled for install
-
- for (ArchiveInfo ai : outArchives) {
- Archive a = ai.getNewArchive();
- if (a != null) {
- Package p = a.getParentPackage();
- if (p instanceof PlatformPackage) {
- if (((PlatformPackage) p).getAndroidVersion().equals(api)) {
- return ai;
- }
- }
- }
- }
-
- // Otherwise look in the selected archives.
- if (selectedArchives != null) {
- for (Archive a : selectedArchives) {
- Package p = a.getParentPackage();
- if (p instanceof PlatformPackage) {
- if (((PlatformPackage) p).getAndroidVersion().equals(api)) {
- // It's not already in the list of things to install, so add it now
- return insertArchive(a,
- outArchives,
- selectedArchives,
- remotePkgs,
- remoteSources,
- localArchives,
- true /*automated*/);
- }
- }
- }
- }
-
- // Finally nothing matched, so let's look at all available remote packages
- fetchRemotePackages(remotePkgs, remoteSources);
- for (Package p : remotePkgs) {
- if (p instanceof PlatformPackage) {
- if (((PlatformPackage) p).getAndroidVersion().equals(api)) {
- // It's not already in the list of things to install, so add the
- // first compatible archive we can find.
- for (Archive a : p.getArchives()) {
- if (a.isCompatible()) {
- return insertArchive(a,
- outArchives,
- selectedArchives,
- remotePkgs,
- remoteSources,
- localArchives,
- true /*automated*/);
- }
- }
- }
- }
- }
-
- // We end up here if nothing matches. We don't have a good platform to match.
- // We need to indicate this extra depends on a missing platform archive
- // so that it can be impossible to install later on.
- return new MissingPlatformArchiveInfo(new AndroidVersion(api, null /*codename*/));
- }
-
- /**
- * Fetch all remote packages only if really needed.
- * <p/>
- * This method takes a list of sources. Each source is only fetched once -- that is each
- * source keeps the list of packages that we fetched from the remote XML file. If the list
- * is null, it means this source has never been fetched so we'll do it once here. Otherwise
- * we rely on the cached list of packages from this source.
- * <p/>
- * This method also takes a remote package list as input, which it will fill out.
- * If a source has already been fetched, we'll add its packages to the remote package list
- * if they are not already present. Otherwise, the source will be fetched and the packages
- * added to the list.
- *
- * @param remotePkgs An in-out list of packages available from remote sources.
- * This list must not be null.
- * It can be empty or already contain some packages.
- * @param remoteSources A list of available remote sources to fetch from.
- */
- protected void fetchRemotePackages(
- final Collection<Package> remotePkgs,
- final SdkSource[] remoteSources) {
- if (remotePkgs.size() > 0) {
- return;
- }
-
- // First check if there's any remote source we need to fetch.
- // This will bring the task window, so we rather not display it unless
- // necessary.
- boolean needsFetch = false;
- for (final SdkSource remoteSrc : remoteSources) {
- Package[] pkgs = remoteSrc.getPackages();
- if (pkgs == null) {
- // This source has never been fetched. We'll do it below.
- needsFetch = true;
- } else {
- // This source has already been fetched and we know its package list.
- // We still need to make sure all of its packages are present in the
- // remotePkgs list.
-
- nextPackage: for (Package pkg : pkgs) {
- for (Archive a : pkg.getArchives()) {
- // Only add a package if it contains at least one compatible archive
- // and is not already in the remote package list.
- if (a.isCompatible()) {
- if (!remotePkgs.contains(pkg)) {
- remotePkgs.add(pkg);
- continue nextPackage;
- }
- }
- }
- }
- }
- }
-
- if (!needsFetch) {
- return;
- }
-
- final boolean forceHttp = mUpdaterData.getSettingsController().getSettings().getForceHttp();
-
- mUpdaterData.getTaskFactory().start("Refresh Sources", new ITask() {
- @Override
- public void run(ITaskMonitor monitor) {
- for (SdkSource remoteSrc : remoteSources) {
- Package[] pkgs = remoteSrc.getPackages();
-
- if (pkgs == null) {
- remoteSrc.load(mUpdaterData.getDownloadCache(), monitor, forceHttp);
- pkgs = remoteSrc.getPackages();
- }
-
- if (pkgs != null) {
- nextPackage: for (Package pkg : pkgs) {
- for (Archive a : pkg.getArchives()) {
- // Only add a package if it contains at least one compatible archive
- // and is not already in the remote package list.
- if (a.isCompatible()) {
- if (!remotePkgs.contains(pkg)) {
- remotePkgs.add(pkg);
- continue nextPackage;
- }
- }
- }
- }
- }
- }
- }
- });
- }
-
-
- /**
- * A {@link LocalArchiveInfo} is an {@link ArchiveInfo} that wraps an already installed
- * "local" package/archive.
- * <p/>
- * In this case, the "new Archive" is still expected to be non null and the
- * "replaced Archive" is null. Installed archives are always accepted and never
- * rejected.
- * <p/>
- * Dependencies are not set.
- */
- private static class LocalArchiveInfo extends ArchiveInfo {
-
- public LocalArchiveInfo(Archive localArchive) {
- super(localArchive, null /*replaced*/, null /*dependsOn*/);
- }
-
- /** Installed archives are always accepted. */
- @Override
- public boolean isAccepted() {
- return true;
- }
-
- /** Installed archives are never rejected. */
- @Override
- public boolean isRejected() {
- return false;
- }
- }
-
- /**
- * A {@link MissingPlatformArchiveInfo} is an {@link ArchiveInfo} that represents a
- * package/archive that we <em>really</em> need as a dependency but that we don't have.
- * <p/>
- * This is currently used for addons and extras in case we can't find a matching base platform.
- * <p/>
- * This kind of archive has specific properties: the new archive to install is null,
- * there are no dependencies and no archive is being replaced. The info can never be
- * accepted and is always rejected.
- */
- private static class MissingPlatformArchiveInfo extends ArchiveInfo {
-
- private final AndroidVersion mVersion;
-
- /**
- * Constructs a {@link MissingPlatformArchiveInfo} that will indicate the
- * given platform version is missing.
- */
- public MissingPlatformArchiveInfo(AndroidVersion version) {
- super(null /*newArchive*/, null /*replaced*/, null /*dependsOn*/);
- mVersion = version;
- }
-
- /** Missing archives are never accepted. */
- @Override
- public boolean isAccepted() {
- return false;
- }
-
- /** Missing archives are always rejected. */
- @Override
- public boolean isRejected() {
- return true;
- }
-
- @Override
- public String getShortDescription() {
- return String.format("Missing SDK Platform Android%1$s, API %2$d",
- mVersion.isPreview() ? " Preview" : "",
- mVersion.getApiLevel());
- }
- }
-
- /**
- * A {@link MissingArchiveInfo} is an {@link ArchiveInfo} that represents a
- * package/archive that we <em>really</em> need as a dependency but that we don't have.
- * <p/>
- * This is currently used for extras in case we can't find a matching tool revision
- * or when a platform-tool is missing.
- * <p/>
- * This kind of archive has specific properties: the new archive to install is null,
- * there are no dependencies and no archive is being replaced. The info can never be
- * accepted and is always rejected.
- */
- private static class MissingArchiveInfo extends ArchiveInfo {
-
- private final FullRevision mRevision;
- private final String mTitle;
-
- public static final String TITLE_TOOL = "Tools";
- public static final String TITLE_PLATFORM_TOOL = "Platform-tools";
-
- /**
- * Constructs a {@link MissingPlatformArchiveInfo} that will indicate the
- * given platform version is missing.
- *
- * @param title Typically "Tools" or "Platform-tools".
- * @param revision The required revision.
- */
- public MissingArchiveInfo(String title, FullRevision revision) {
- super(null /*newArchive*/, null /*replaced*/, null /*dependsOn*/);
- mTitle = title;
- mRevision = revision;
- }
-
- /** Missing archives are never accepted. */
- @Override
- public boolean isAccepted() {
- return false;
- }
-
- /** Missing archives are always rejected. */
- @Override
- public boolean isRejected() {
- return true;
- }
-
- @Override
- public String getShortDescription() {
- return String.format("Missing Android SDK %1$s, revision %2$s",
- mTitle,
- mRevision.toShortString());
- }
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SdkUpdaterNoWindow.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SdkUpdaterNoWindow.java
deleted file mode 100755
index 5e7143d..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SdkUpdaterNoWindow.java
+++ /dev/null
@@ -1,624 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository;
-
-import com.android.annotations.NonNull;
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.internal.repository.ITask;
-import com.android.sdklib.internal.repository.ITaskFactory;
-import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.NullTaskMonitor;
-import com.android.sdklib.internal.repository.UserCredentials;
-import com.android.sdklib.repository.SdkRepoConstants;
-import com.android.utils.ILogger;
-import com.android.utils.Pair;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Properties;
-
-/**
- * Performs an update using only a non-interactive console output with no GUI.
- */
-public class SdkUpdaterNoWindow {
-
- /** The {@link UpdaterData} to use. */
- private final UpdaterData mUpdaterData;
- /** The {@link ILogger} logger to use. */
- private final ILogger mSdkLog;
- /** The reply to any question asked by the update process. Currently this will
- * be yes/no for ability to replace modified samples or restart ADB. */
- private final boolean mForce;
-
- /**
- * Creates an UpdateNoWindow object that will update using the given SDK root
- * and outputs to the given SDK logger.
- *
- * @param osSdkRoot The OS path of the SDK folder to update.
- * @param sdkManager An existing SDK manager to list current platforms and addons.
- * @param sdkLog A logger object, that should ideally output to a write-only console.
- * @param force The reply to any question asked by the update process. Currently this will
- * be yes/no for ability to replace modified samples or restart ADB.
- * @param useHttp True to force using HTTP instead of HTTPS for downloads.
- * @param proxyPort An optional HTTP/HTTPS proxy port. Can be null.
- * @param proxyHost An optional HTTP/HTTPS proxy host. Can be null.
- */
- public SdkUpdaterNoWindow(String osSdkRoot,
- SdkManager sdkManager,
- ILogger sdkLog,
- boolean force,
- boolean useHttp,
- String proxyHost,
- String proxyPort) {
- mSdkLog = sdkLog;
- mForce = force;
- mUpdaterData = new UpdaterData(osSdkRoot, sdkLog);
-
- // Read and apply settings from settings file, so that http/https proxy is set
- // and let the command line args override them as necessary.
- SettingsController settingsController = mUpdaterData.getSettingsController();
- settingsController.loadSettings();
- settingsController.applySettings();
- setupProxy(proxyHost, proxyPort);
-
- // Change the in-memory settings to force the http/https mode
- settingsController.setSetting(ISettingsPage.KEY_FORCE_HTTP, useHttp);
-
- // Use a factory that only outputs to the given ILogger.
- mUpdaterData.setTaskFactory(new ConsoleTaskFactory());
-
- // Check that the AVD Manager has been correctly initialized. This is done separately
- // from the constructor in the GUI-based UpdaterWindowImpl to give time to the UI to
- // initialize before displaying a message box. Since we don't have any GUI here
- // we can call it whenever we want.
- if (mUpdaterData.checkIfInitFailed()) {
- return;
- }
-
- // Setup the default sources including the getenv overrides.
- mUpdaterData.setupDefaultSources();
-
- mUpdaterData.getLocalSdkParser().parseSdk(
- osSdkRoot,
- sdkManager,
- new NullTaskMonitor(sdkLog));
- }
-
- /**
- * Performs the actual update.
- *
- * @param pkgFilter A list of {@link SdkRepoConstants#NODES} to limit the type of packages
- * we can update. A null or empty list means to update everything possible.
- * @param includeAll True to list and install all packages, including obsolete ones.
- * @param dryMode True to check what would be updated/installed but do not actually
- * download or install anything.
- */
- public void updateAll(
- ArrayList<String> pkgFilter,
- boolean includeAll,
- boolean dryMode) {
- mUpdaterData.updateOrInstallAll_NoGUI(pkgFilter, includeAll, dryMode);
- }
-
- /**
- * Lists remote packages available for install using 'android update sdk --no-ui'.
- *
- * @param includeAll True to list and install all packages, including obsolete ones.
- * @param extendedOutput True to display more details on each package.
- */
- public void listRemotePackages(boolean includeAll, boolean extendedOutput) {
- mUpdaterData.listRemotePackages_NoGUI(includeAll, extendedOutput);
- }
-
- // -----
-
- /**
- * Sets both the HTTP and HTTPS proxy system properties, overriding the ones
- * from the settings with these values if they are defined.
- */
- private void setupProxy(String proxyHost, String proxyPort) {
-
- // The system property constants can be found in the Java SE documentation at
- // http://download.oracle.com/javase/6/docs/technotes/guides/net/proxies.html
- final String JAVA_PROP_HTTP_PROXY_HOST = "http.proxyHost"; //$NON-NLS-1$
- final String JAVA_PROP_HTTP_PROXY_PORT = "http.proxyPort"; //$NON-NLS-1$
- final String JAVA_PROP_HTTPS_PROXY_HOST = "https.proxyHost"; //$NON-NLS-1$
- final String JAVA_PROP_HTTPS_PROXY_PORT = "https.proxyPort"; //$NON-NLS-1$
-
- Properties props = System.getProperties();
-
- if (proxyHost != null && proxyHost.length() > 0) {
- props.setProperty(JAVA_PROP_HTTP_PROXY_HOST, proxyHost);
- props.setProperty(JAVA_PROP_HTTPS_PROXY_HOST, proxyHost);
- }
- if (proxyPort != null && proxyPort.length() > 0) {
- props.setProperty(JAVA_PROP_HTTP_PROXY_PORT, proxyPort);
- props.setProperty(JAVA_PROP_HTTPS_PROXY_PORT, proxyPort);
- }
- }
-
- /**
- * A custom implementation of {@link ITaskFactory} that
- * provides {@link ConsoleTaskMonitor} objects.
- */
- private class ConsoleTaskFactory implements ITaskFactory {
- @Override
- public void start(String title, ITask task) {
- start(title, null /*parentMonitor*/, task);
- }
-
- @Override
- public void start(String title, ITaskMonitor parentMonitor, ITask task) {
- if (parentMonitor == null) {
- task.run(new ConsoleTaskMonitor(title, task));
- } else {
- // Use all the reminder of the parent monitor.
- if (parentMonitor.getProgressMax() == 0) {
- parentMonitor.setProgressMax(1);
- }
-
- ITaskMonitor sub = parentMonitor.createSubMonitor(
- parentMonitor.getProgressMax() - parentMonitor.getProgress());
- try {
- task.run(sub);
- } finally {
- int delta =
- sub.getProgressMax() - sub.getProgress();
- if (delta > 0) {
- sub.incProgress(delta);
- }
- }
- }
- }
- }
-
- /**
- * A custom implementation of {@link ITaskMonitor} that defers all output to the
- * super {@link SdkUpdaterNoWindow#mSdkLog}.
- */
- private class ConsoleTaskMonitor implements ITaskMonitor {
-
- private static final double MAX_COUNT = 10000.0;
- private double mIncCoef = 0;
- private double mValue = 0;
- private String mLastDesc = null;
- private String mLastProgressBase = null;
-
- /**
- * Creates a new {@link ConsoleTaskMonitor} with the given title.
- */
- public ConsoleTaskMonitor(String title, ITask task) {
- mSdkLog.info("%s:\n", title);
- }
-
- /**
- * Sets the description in the current task dialog.
- */
- @Override
- public void setDescription(String format, Object...args) {
-
- String last = mLastDesc;
- String line = String.format(" " + format, args); //$NON-NLS-1$
-
- // If the description contains a %, it generally indicates a recurring
- // progress so we want a \r at the end.
- int pos = line.indexOf('%');
- if (pos > -1) {
- String base = line.trim();
- if (mLastProgressBase != null && base.startsWith(mLastProgressBase)) {
- line = " " + base.substring(mLastProgressBase.length()); //$NON-NLS-1$
- }
- line += '\r';
- } else {
- mLastProgressBase = line.trim();
- line += '\n';
- }
-
- // Skip line if it's the same as the last one.
- if (last != null && last.equals(line.trim())) {
- return;
- }
- mLastDesc = line.trim();
-
- // If the last line terminated with a \r but the new one doesn't, we need to
- // insert a \n to avoid erasing the previous line.
- if (last != null &&
- last.endsWith("\r") && //$NON-NLS-1$
- !line.endsWith("\r")) { //$NON-NLS-1$
- line = '\n' + line;
- }
-
- mSdkLog.info("%s", line); //$NON-NLS-1$
- }
-
- @Override
- public void log(String format, Object...args) {
- setDescription(" " + format, args); //$NON-NLS-1$
- }
-
- @Override
- public void logError(String format, Object...args) {
- setDescription(format, args);
- }
-
- @Override
- public void logVerbose(String format, Object...args) {
- // The ConsoleTask does not display verbose log messages.
- }
-
- // --- ILogger ---
-
- @Override
- public void error(Throwable t, String errorFormat, Object... args) {
- mSdkLog.error(t, errorFormat, args);
- }
-
- @Override
- public void warning(@NonNull String warningFormat, Object... args) {
- mSdkLog.warning(warningFormat, args);
- }
-
- @Override
- public void info(@NonNull String msgFormat, Object... args) {
- mSdkLog.info(msgFormat, args);
- }
-
- @Override
- public void verbose(@NonNull String msgFormat, Object... args) {
- mSdkLog.verbose(msgFormat, args);
- }
-
- /**
- * Sets the max value of the progress bar.
- *
- * Weird things will happen if setProgressMax is called multiple times
- * *after* {@link #incProgress(int)}: we don't try to adjust it on the
- * fly.
- */
- @Override
- public void setProgressMax(int max) {
- assert max > 0;
- // Always set the dialog's progress max to 10k since it only handles
- // integers and we want to have a better inner granularity. Instead
- // we use the max to compute a coefficient for inc deltas.
- mIncCoef = max > 0 ? MAX_COUNT / max : 0;
- assert mIncCoef > 0;
- }
-
- @Override
- public int getProgressMax() {
- return mIncCoef > 0 ? (int) (MAX_COUNT / mIncCoef) : 0;
- }
-
- /**
- * Increments the current value of the progress bar.
- */
- @Override
- public void incProgress(int delta) {
- if (delta > 0 && mIncCoef > 0) {
- internalIncProgress(delta * mIncCoef);
- }
- }
-
- private void internalIncProgress(double realDelta) {
- mValue += realDelta;
- // max value is 10k, so 10k/100 == 100%.
- // Experimentation shows that it is not really useful to display this
- // progression since during download the description line will change.
- // mSdkLog.printf(" [%3d%%]\r", ((int)mValue) / 100);
- }
-
- /**
- * Returns the current value of the progress bar,
- * between 0 and up to {@link #setProgressMax(int)} - 1.
- */
- @Override
- public int getProgress() {
- assert mIncCoef > 0;
- return mIncCoef > 0 ? (int)(mValue / mIncCoef) : 0;
- }
-
- /**
- * Returns true if the "Cancel" button was selected.
- */
- @Override
- public boolean isCancelRequested() {
- return false;
- }
-
- /**
- * Display a yes/no question dialog box.
- *
- * This implementation allow this to be called from any thread, it
- * makes sure the dialog is opened synchronously in the ui thread.
- *
- * @param title The title of the dialog box
- * @param message The error message
- * @return true if YES was clicked.
- */
- @Override
- public boolean displayPrompt(final String title, final String message) {
- // TODO Make it interactive if mForce==false
- mSdkLog.info("\n%1$s\n%2$s\n%3$s", //$NON-NLS-1$
- title,
- message,
- mForce ? "--force used, will reply yes\n" :
- "Note: you can use --force to override to yes.\n");
- if (mForce) {
- return true;
- }
-
- while (true) {
- mSdkLog.info("%1$s", "[y/n] =>"); //$NON-NLS-1$
- try {
- byte[] readBuffer = new byte[2048];
- String reply = readLine(readBuffer).trim();
- mSdkLog.info("\n"); //$NON-NLS-1$
- if (reply.length() > 0 && reply.length() <= 3) {
- char c = reply.charAt(0);
- if (c == 'y' || c == 'Y') {
- return true;
- } else if (c == 'n' || c == 'N') {
- return false;
- }
- }
- mSdkLog.info("Unknown reply '%s'. Please use y[es]/n[o].\n"); //$NON-NLS-1$
-
- } catch (IOException e) {
- // Exception. Be conservative and say no.
- mSdkLog.info("\n"); //$NON-NLS-1$
- return false;
- }
- }
- }
-
- /**
- * Displays a prompt message to the user and read two values,
- * login/password.
- * <p>
- * <i>Asks user for login/password information.</i>
- * <p>
- * This method shows a question in the standard output, asking for login
- * and password.</br>
- * <b>Method Output:</b></br>
- * Title</br>
- * Message</br>
- * Login: (Wait for user input)</br>
- * Password: (Wait for user input)</br>
- * <p>
- *
- * @param title The title of the iteration.
- * @param message The message to be displayed.
- * @return A {@link Pair} holding the entered login and password. The
- * <b>first element</b> is always the <b>Login</b>, and the
- * <b>second element</b> is always the <b>Password</b>. This
- * method will never return null, in case of error the pair will
- * be filled with empty strings.
- * @see ITaskMonitor#displayLoginCredentialsPrompt(String, String)
- */
- @Override
- public UserCredentials displayLoginCredentialsPrompt(String title, String message) {
- String login = ""; //$NON-NLS-1$
- String password = ""; //$NON-NLS-1$
- String workstation = ""; //$NON-NLS-1$
- String domain = ""; //$NON-NLS-1$
-
- mSdkLog.info("\n%1$s\n%2$s", title, message);
- byte[] readBuffer = new byte[2048];
- try {
- mSdkLog.info("\nLogin: ");
- login = readLine(readBuffer);
- mSdkLog.info("\nPassword: ");
- password = readLine(readBuffer);
- mSdkLog.info("\nIf your proxy uses NTLM authentication, provide the following information. Leave blank otherwise.");
- mSdkLog.info("\nWorkstation: ");
- workstation = readLine(readBuffer);
- mSdkLog.info("\nDomain: ");
- domain = readLine(readBuffer);
-
- /*
- * TODO: Implement a way to don't echo the typed password On
- * Java 5 there's no simple way to do this. There's just a
- * workaround which is output backspaces on each keystroke.
- * A good alternative is to use Java 6 java.io.Console
- */
- } catch (IOException e) {
- // Reset login/pass to empty Strings.
- login = ""; //$NON-NLS-1$
- password = ""; //$NON-NLS-1$
- workstation = ""; //$NON-NLS-1$
- domain = ""; //$NON-NLS-1$
- //Just print the error to console.
- mSdkLog.info("\nError occurred during login/pass query: %s\n", e.getMessage());
- }
-
- return new UserCredentials(login, password, workstation, domain);
- }
-
- /**
- * Reads current console input in the given buffer.
- *
- * @param buffer Buffer to hold the user input. Must be larger than the largest
- * expected input. Cannot be null.
- * @return A new string. May be empty but not null.
- * @throws IOException in case the buffer isn't long enough.
- */
- private String readLine(byte[] buffer) throws IOException {
- int count = System.in.read(buffer);
-
- // is the input longer than the buffer?
- if (count == buffer.length && buffer[count-1] != 10) {
- throw new IOException(String.format(
- "Input is longer than the buffer size, (%1$s) bytes", buffer.length));
- }
-
- // ignore end whitespace
- while (count > 0 && (buffer[count-1] == '\r' || buffer[count-1] == '\n')) {
- count--;
- }
-
- return new String(buffer, 0, count);
- }
-
- /**
- * Creates a sub-monitor that will use up to tickCount on the progress bar.
- * tickCount must be 1 or more.
- */
- @Override
- public ITaskMonitor createSubMonitor(int tickCount) {
- assert mIncCoef > 0;
- assert tickCount > 0;
- return new ConsoleSubTaskMonitor(this, null, mValue, tickCount * mIncCoef);
- }
- }
-
- private interface IConsoleSubTaskMonitor extends ITaskMonitor {
- public void subIncProgress(double realDelta);
- }
-
- private static class ConsoleSubTaskMonitor implements IConsoleSubTaskMonitor {
-
- private final ConsoleTaskMonitor mRoot;
- private final IConsoleSubTaskMonitor mParent;
- private final double mStart;
- private final double mSpan;
- private double mSubValue;
- private double mSubCoef;
-
- /**
- * Creates a new sub task monitor which will work for the given range [start, start+span]
- * in its parent.
- *
- * @param root The ProgressTask root
- * @param parent The immediate parent. Can be the null or another sub task monitor.
- * @param start The start value in the root's coordinates
- * @param span The span value in the root's coordinates
- */
- public ConsoleSubTaskMonitor(ConsoleTaskMonitor root,
- IConsoleSubTaskMonitor parent,
- double start,
- double span) {
- mRoot = root;
- mParent = parent;
- mStart = start;
- mSpan = span;
- mSubValue = start;
- }
-
- @Override
- public boolean isCancelRequested() {
- return mRoot.isCancelRequested();
- }
-
- @Override
- public void setDescription(String format, Object... args) {
- mRoot.setDescription(format, args);
- }
-
- @Override
- public void log(String format, Object... args) {
- mRoot.log(format, args);
- }
-
- @Override
- public void logError(String format, Object... args) {
- mRoot.logError(format, args);
- }
-
- @Override
- public void logVerbose(String format, Object... args) {
- mRoot.logVerbose(format, args);
- }
-
- @Override
- public void setProgressMax(int max) {
- assert max > 0;
- mSubCoef = max > 0 ? mSpan / max : 0;
- assert mSubCoef > 0;
- }
-
- @Override
- public int getProgressMax() {
- return mSubCoef > 0 ? (int) (mSpan / mSubCoef) : 0;
- }
-
- @Override
- public int getProgress() {
- assert mSubCoef > 0;
- return mSubCoef > 0 ? (int)((mSubValue - mStart) / mSubCoef) : 0;
- }
-
- @Override
- public void incProgress(int delta) {
- if (delta > 0 && mSubCoef > 0) {
- subIncProgress(delta * mSubCoef);
- }
- }
-
- @Override
- public void subIncProgress(double realDelta) {
- mSubValue += realDelta;
- if (mParent != null) {
- mParent.subIncProgress(realDelta);
- } else {
- mRoot.internalIncProgress(realDelta);
- }
- }
-
- @Override
- public boolean displayPrompt(String title, String message) {
- return mRoot.displayPrompt(title, message);
- }
-
- @Override
- public UserCredentials displayLoginCredentialsPrompt(String title, String message) {
- return mRoot.displayLoginCredentialsPrompt(title, message);
- }
-
- @Override
- public ITaskMonitor createSubMonitor(int tickCount) {
- assert mSubCoef > 0;
- assert tickCount > 0;
- return new ConsoleSubTaskMonitor(mRoot,
- this,
- mSubValue,
- tickCount * mSubCoef);
- }
-
- // --- ILogger ---
-
- @Override
- public void error(Throwable t, String errorFormat, Object... args) {
- mRoot.error(t, errorFormat, args);
- }
-
- @Override
- public void warning(@NonNull String warningFormat, Object... args) {
- mRoot.warning(warningFormat, args);
- }
-
- @Override
- public void info(@NonNull String msgFormat, Object... args) {
- mRoot.info(msgFormat, args);
- }
-
- @Override
- public void verbose(@NonNull String msgFormat, Object... args) {
- mRoot.verbose(msgFormat, args);
- }
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SettingsController.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SettingsController.java
deleted file mode 100755
index 2d2352b..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SettingsController.java
+++ /dev/null
@@ -1,382 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository;
-
-import com.android.annotations.NonNull;
-import com.android.prefs.AndroidLocation;
-import com.android.prefs.AndroidLocation.AndroidLocationException;
-import com.android.utils.ILogger;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map.Entry;
-import java.util.Properties;
-
-/**
- * Controller class to get settings values. Settings are kept in-memory.
- * Users of this class must first load the settings before changing them and save
- * them when modified.
- * <p/>
- * Settings are enumerated by constants in {@link ISettingsPage}.
- */
-public class SettingsController {
-
- private static final String SETTINGS_FILENAME = "androidtool.cfg"; //$NON-NLS-1$
-
- private final ILogger mSdkLog;
- private final Settings mSettings;
-
- public interface OnChangedListener {
- public void onSettingsChanged(SettingsController controller, Settings oldSettings);
- }
- private final List<OnChangedListener> mChangedListeners = new ArrayList<OnChangedListener>(1);
-
- /** The currently associated {@link ISettingsPage}. Can be null. */
- private ISettingsPage mSettingsPage;
-
- /**
- * Constructs a new default {@link SettingsController}.
- *
- * @param sdkLog A non-null logger to use.
- */
- public SettingsController(@NonNull ILogger sdkLog) {
- mSdkLog = sdkLog;
- mSettings = new Settings();
- }
-
- /**
- * Specialized constructor that wraps an existing {@link Settings} instance.
- * This is mostly used in unit-tests to override settings that are being used.
- * Normal usage should NOT need to call this constructor.
- *
- * @param sdkLog A non-null logger to use.
- * @param settings A non-null {@link Settings} to use as-is. It is not duplicated.
- */
- protected SettingsController(@NonNull ILogger sdkLog, @NonNull Settings settings) {
- mSdkLog = sdkLog;
- mSettings = settings;
- }
-
- public Settings getSettings() {
- return mSettings;
- }
-
- public void registerOnChangedListener(OnChangedListener listener) {
- if (listener != null && !mChangedListeners.contains(listener)) {
- mChangedListeners.add(listener);
- }
- }
-
- public void unregisterOnChangedListener(OnChangedListener listener) {
- if (listener != null) {
- mChangedListeners.remove(listener);
- }
- }
-
- //--- Access to settings ------------
-
-
- public static class Settings {
- private final Properties mProperties;
-
- /** Initialize an empty set of settings. */
- public Settings() {
- mProperties = new Properties();
- }
-
- /** Duplicates a set of settings. */
- public Settings(Settings settings) {
- this();
- for (Entry<Object, Object> entry : settings.mProperties.entrySet()) {
- mProperties.put(entry.getKey(), entry.getValue());
- }
- }
-
- /**
- * Specialized constructor for unit-tests that wraps an existing
- * {@link Properties} instance. The properties instance is not duplicated,
- * it's merely used as-is and changes will be reflected directly.
- */
- protected Settings(Properties properties) {
- mProperties = properties;
- }
-
- /**
- * Returns the value of the {@link ISettingsPage#KEY_FORCE_HTTP} setting.
- *
- * @see ISettingsPage#KEY_FORCE_HTTP
- */
- public boolean getForceHttp() {
- return Boolean.parseBoolean(mProperties.getProperty(ISettingsPage.KEY_FORCE_HTTP));
- }
-
- /**
- * Returns the value of the {@link ISettingsPage#KEY_ASK_ADB_RESTART} setting.
- *
- * @see ISettingsPage#KEY_ASK_ADB_RESTART
- */
- public boolean getAskBeforeAdbRestart() {
- return Boolean.parseBoolean(mProperties.getProperty(ISettingsPage.KEY_ASK_ADB_RESTART));
- }
-
- /**
- * Returns the value of the {@link ISettingsPage#KEY_USE_DOWNLOAD_CACHE} setting.
- *
- * @see ISettingsPage#KEY_USE_DOWNLOAD_CACHE
- */
- public boolean getUseDownloadCache() {
- return Boolean.parseBoolean(
- mProperties.getProperty(
- ISettingsPage.KEY_USE_DOWNLOAD_CACHE,
- Boolean.TRUE.toString()));
- }
-
- /**
- * Returns the value of the {@link ISettingsPage#KEY_SHOW_UPDATE_ONLY} setting.
- *
- * @see ISettingsPage#KEY_SHOW_UPDATE_ONLY
- */
- public boolean getShowUpdateOnly() {
- return Boolean.parseBoolean(
- mProperties.getProperty(
- ISettingsPage.KEY_SHOW_UPDATE_ONLY,
- Boolean.TRUE.toString()));
- }
-
- /**
- * Returns the value of the {@link ISettingsPage#KEY_ENABLE_PREVIEWS} setting.
- *
- * @see ISettingsPage#KEY_ENABLE_PREVIEWS
- */
- public boolean getEnablePreviews() {
- return Boolean.parseBoolean(mProperties.getProperty(ISettingsPage.KEY_ENABLE_PREVIEWS));
- }
-
- /**
- * Returns the value of the {@link ISettingsPage#KEY_MONITOR_DENSITY} setting
- * @see ISettingsPage#KEY_MONITOR_DENSITY
- */
- public int getMonitorDensity() {
- String value = mProperties.getProperty(ISettingsPage.KEY_MONITOR_DENSITY, null);
- if (value == null) {
- return -1;
- }
-
- try {
- return Integer.parseInt(value);
- } catch (NumberFormatException e) {
- return -1;
- }
- }
- }
-
- /**
- * Sets the value of the {@link ISettingsPage#KEY_SHOW_UPDATE_ONLY} setting.
- *
- * @param enabled True if only compatible non-obsolete update items should be shown.
- * @see ISettingsPage#KEY_SHOW_UPDATE_ONLY
- */
- public void setShowUpdateOnly(boolean enabled) {
- setSetting(ISettingsPage.KEY_SHOW_UPDATE_ONLY, enabled);
- }
-
- /**
- * Sets the value of the {@link ISettingsPage#KEY_MONITOR_DENSITY} setting.
- *
- * @param density the density of the monitor
- * @see ISettingsPage#KEY_MONITOR_DENSITY
- */
- public void setMonitorDensity(int density) {
- mSettings.mProperties.setProperty(
- ISettingsPage.KEY_MONITOR_DENSITY, Integer.toString(density));
- }
-
- /**
- * Internal helper to set a boolean setting.
- */
- void setSetting(String key, boolean value) {
- mSettings.mProperties.setProperty(key, Boolean.toString(value));
- }
-
- //--- Controller methods -------------
-
- /**
- * Associate the given {@link ISettingsPage} with this {@link SettingsController}.
- * <p/>
- * This loads the current properties into the setting page UI.
- * It then associates the SettingsChanged callback with this controller.
- * <p/>
- * If the setting page given is null, it will be unlinked from controller.
- *
- * @param settingsPage An {@link ISettingsPage} to associate with the controller.
- */
- public void setSettingsPage(ISettingsPage settingsPage) {
- mSettingsPage = settingsPage;
-
- if (settingsPage != null) {
- settingsPage.loadSettings(mSettings.mProperties);
-
- settingsPage.setOnSettingsChanged(new ISettingsPage.SettingsChangedCallback() {
- @Override
- public void onSettingsChanged(ISettingsPage page) {
- SettingsController.this.onSettingsChanged();
- }
- });
- }
- }
-
- /**
- * Load settings from the settings file.
- */
- public void loadSettings() {
- FileInputStream fis = null;
- String path = null;
- try {
- String folder = AndroidLocation.getFolder();
- File f = new File(folder, SETTINGS_FILENAME);
- path = f.getPath();
- if (f.exists()) {
- fis = new FileInputStream(f);
-
- mSettings.mProperties.load(fis);
-
- // Properly reformat some settings to enforce their default value when missing.
- setShowUpdateOnly(mSettings.getShowUpdateOnly());
- setSetting(ISettingsPage.KEY_ASK_ADB_RESTART, mSettings.getAskBeforeAdbRestart());
- setSetting(ISettingsPage.KEY_USE_DOWNLOAD_CACHE, mSettings.getUseDownloadCache());
- }
-
- } catch (Exception e) {
- if (mSdkLog != null) {
- mSdkLog.error(e,
- "Failed to load settings from .android folder. Path is '%1$s'.",
- path);
- }
- } finally {
- if (fis != null) {
- try {
- fis.close();
- } catch (IOException e) {
- }
- }
- }
- }
-
- /**
- * Saves settings to the settings file.
- */
- public void saveSettings() {
-
- FileOutputStream fos = null;
- String path = null;
- try {
- String folder = AndroidLocation.getFolder();
- File f = new File(folder, SETTINGS_FILENAME);
- path = f.getPath();
-
- fos = new FileOutputStream(f);
-
- mSettings.mProperties.store(fos, "## Settings for Android Tool"); //$NON-NLS-1$
-
- } catch (Exception e) {
- if (mSdkLog != null) {
- // This is important enough that we want to really nag the user about it
- String reason = null;
-
- if (e instanceof FileNotFoundException) {
- reason = "File not found";
- } else if (e instanceof AndroidLocationException) {
- reason = ".android folder not found, please define ANDROID_SDK_HOME";
- } else if (e.getMessage() != null) {
- reason = String.format("%1$s: %2$s",
- e.getClass().getSimpleName(),
- e.getMessage());
- } else {
- reason = e.getClass().getName();
- }
-
- mSdkLog.error(e, "Failed to save settings file '%1$s': %2$s", path, reason);
- }
- } finally {
- if (fos != null) {
- try {
- fos.close();
- } catch (IOException e) {
- }
- }
- }
- }
-
- /**
- * When settings have changed: retrieve the new settings, apply them, save them
- * and notify on-settings-changed listeners.
- */
- private void onSettingsChanged() {
- if (mSettingsPage == null) {
- return;
- }
-
- Settings oldSettings = new Settings(mSettings);
- mSettingsPage.retrieveSettings(mSettings.mProperties);
- applySettings();
- saveSettings();
-
- for (OnChangedListener listener : mChangedListeners) {
- try {
- listener.onSettingsChanged(this, oldSettings);
- } catch (Throwable ignore) {}
- }
- }
-
- /**
- * Applies the current settings.
- */
- public void applySettings() {
- Properties props = System.getProperties();
-
- // Get the configured HTTP proxy settings
- String proxyHost = mSettings.mProperties.getProperty(ISettingsPage.KEY_HTTP_PROXY_HOST,
- ""); //$NON-NLS-1$
- String proxyPort = mSettings.mProperties.getProperty(ISettingsPage.KEY_HTTP_PROXY_PORT,
- ""); //$NON-NLS-1$
-
- // Set both the HTTP and HTTPS proxy system properties.
- // The system property constants can be found in the Java SE documentation at
- // http://download.oracle.com/javase/6/docs/technotes/guides/net/proxies.html
- final String JAVA_PROP_HTTP_PROXY_HOST = "http.proxyHost"; //$NON-NLS-1$
- final String JAVA_PROP_HTTP_PROXY_PORT = "http.proxyPort"; //$NON-NLS-1$
- final String JAVA_PROP_HTTPS_PROXY_HOST = "https.proxyHost"; //$NON-NLS-1$
- final String JAVA_PROP_HTTPS_PROXY_PORT = "https.proxyPort"; //$NON-NLS-1$
-
- // Only change the proxy if have something in the preferences.
- // Do not erase the default settings by empty values.
- if (proxyHost != null && proxyHost.length() > 0) {
- props.setProperty(JAVA_PROP_HTTP_PROXY_HOST, proxyHost);
- props.setProperty(JAVA_PROP_HTTPS_PROXY_HOST, proxyHost);
- }
- if (proxyPort != null && proxyPort.length() > 0) {
- props.setProperty(JAVA_PROP_HTTP_PROXY_PORT, proxyPort);
- props.setProperty(JAVA_PROP_HTTPS_PROXY_PORT, proxyPort);
- }
- }
-
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SettingsDialog.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SettingsDialog.java
deleted file mode 100755
index f05be4c..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SettingsDialog.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository;
-
-import com.android.sdklib.internal.repository.DownloadCache;
-import com.android.sdklib.internal.repository.DownloadCache.Strategy;
-import com.android.sdklib.util.FormatUtils;
-import com.android.sdkuilib.ui.GridDataBuilder;
-import com.android.sdkuilib.ui.GridLayoutBuilder;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-import java.util.Properties;
-
-
-public class SettingsDialog extends UpdaterBaseDialog implements ISettingsPage {
-
-
- // data members
- private final DownloadCache mDownloadCache = new DownloadCache(Strategy.SERVE_CACHE);
- private final SettingsController mSettingsController;
- private SettingsChangedCallback mSettingsChangedCallback;
-
- // UI widgets
- private Text mTextProxyServer;
- private Text mTextProxyPort;
- private Text mTextCacheSize;
- private Button mCheckUseCache;
- private Button mCheckForceHttp;
- private Button mCheckAskAdbRestart;
- private Button mCheckEnablePreviews;
-
- private SelectionAdapter mApplyOnSelected = new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- applyNewSettings(); //$hide$
- }
- };
-
- private ModifyListener mApplyOnModified = new ModifyListener() {
- @Override
- public void modifyText(ModifyEvent e) {
- applyNewSettings(); //$hide$
- }
- };
-
- public SettingsDialog(Shell parentShell, UpdaterData updaterData) {
- super(parentShell, updaterData, "Settings" /*title*/);
- assert updaterData != null;
- mSettingsController = updaterData.getSettingsController();
- }
-
- @Override
- protected void createShell() {
- super.createShell();
- Shell shell = getShell();
- shell.setMinimumSize(new Point(450, 370));
- shell.setSize(450, 400);
- }
-
- @Override
- protected void createContents() {
- super.createContents();
- Shell shell = getShell();
-
- Group group = new Group(shell, SWT.NONE);
- group.setText("Proxy Settings");
- GridDataBuilder.create(group).fill().grab().hSpan(2);
- GridLayoutBuilder.create(group).columns(2);
-
- Label label = new Label(group, SWT.NONE);
- GridDataBuilder.create(label).hRight().vCenter();
- label.setText("HTTP Proxy Server");
- String tooltip = "The hostname or IP of the HTTP & HTTPS proxy server to use (e.g. proxy.example.com).\n" +
- "When empty, the default Java proxy setting is used.";
- label.setToolTipText(tooltip);
-
- mTextProxyServer = new Text(group, SWT.BORDER);
- GridDataBuilder.create(mTextProxyServer).hFill().hGrab().vCenter();
- mTextProxyServer.addModifyListener(mApplyOnModified);
- mTextProxyServer.setToolTipText(tooltip);
-
- label = new Label(group, SWT.NONE);
- GridDataBuilder.create(label).hRight().vCenter();
- label.setText("HTTP Proxy Port");
- tooltip = "The port of the HTTP & HTTPS proxy server to use (e.g. 3128).\n" +
- "When empty, the default Java proxy setting is used.";
- label.setToolTipText(tooltip);
-
- mTextProxyPort = new Text(group, SWT.BORDER);
- GridDataBuilder.create(mTextProxyPort).hFill().hGrab().vCenter();
- mTextProxyPort.addModifyListener(mApplyOnModified);
- mTextProxyPort.setToolTipText(tooltip);
-
- // ----
- group = new Group(shell, SWT.NONE);
- group.setText("Manifest Cache");
- GridDataBuilder.create(group).fill().grab().hSpan(2);
- GridLayoutBuilder.create(group).columns(3);
-
- label = new Label(group, SWT.NONE);
- GridDataBuilder.create(label).hRight().vCenter();
- label.setText("Directory:");
-
- Text text = new Text(group, SWT.NONE);
- GridDataBuilder.create(text).hFill().hGrab().vCenter().hSpan(2);
- text.setEnabled(false);
- text.setText(mDownloadCache.getCacheRoot().getAbsolutePath());
-
- label = new Label(group, SWT.NONE);
- GridDataBuilder.create(label).hRight().vCenter();
- label.setText("Current Size:");
-
- mTextCacheSize = new Text(group, SWT.NONE);
- GridDataBuilder.create(mTextCacheSize).hFill().hGrab().vCenter().hSpan(2);
- mTextCacheSize.setEnabled(false);
- updateDownloadCacheSize();
-
- mCheckUseCache = new Button(group, SWT.CHECK);
- GridDataBuilder.create(mCheckUseCache).vCenter().hSpan(1);
- mCheckUseCache.setText("Use download cache");
- mCheckUseCache.setToolTipText("When checked, small manifest files are cached locally.\n" +
- "Large binary files are never cached locally.");
- mCheckUseCache.addSelectionListener(mApplyOnSelected);
-
- label = new Label(group, SWT.NONE);
- GridDataBuilder.create(label).hFill().hGrab().hSpan(1);
-
- Button button = new Button(group, SWT.PUSH);
- GridDataBuilder.create(button).vCenter().hSpan(1);
- button.setText("Clear Cache");
- button.setToolTipText("Deletes all cached files.");
- button.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- mDownloadCache.clearCache();
- updateDownloadCacheSize();
- }
- });
-
- // ----
- group = new Group(shell, SWT.NONE);
- group.setText("Others");
- GridDataBuilder.create(group).fill().grab().hSpan(2);
- GridLayoutBuilder.create(group).columns(2);
-
- mCheckForceHttp = new Button(group, SWT.CHECK);
- GridDataBuilder.create(mCheckForceHttp).hFill().hGrab().vCenter().hSpan(2);
- mCheckForceHttp.setText("Force https://... sources to be fetched using http://...");
- mCheckForceHttp.setToolTipText(
- "If you are not able to connect to the official Android repository using HTTPS,\n" +
- "enable this setting to force accessing it via HTTP.");
- mCheckForceHttp.addSelectionListener(mApplyOnSelected);
-
- mCheckAskAdbRestart = new Button(group, SWT.CHECK);
- GridDataBuilder.create(mCheckAskAdbRestart).hFill().hGrab().vCenter().hSpan(2);
- mCheckAskAdbRestart.setText("Ask before restarting ADB");
- mCheckAskAdbRestart.setToolTipText(
- "When checked, the user will be asked for permission to restart ADB\n" +
- "after updating an addon-on package or a tool package.");
- mCheckAskAdbRestart.addSelectionListener(mApplyOnSelected);
-
- mCheckEnablePreviews = new Button(group, SWT.CHECK);
- GridDataBuilder.create(mCheckEnablePreviews).hFill().hGrab().vCenter().hSpan(2);
- mCheckEnablePreviews.setText("Enable Preview Tools");
- mCheckEnablePreviews.setToolTipText(
- "When checked, the package list will also display preview versions of the tools.\n" +
- "These are optional future release candidates that the Android tools team\n" +
- "publishes from time to time for early feedback.");
- mCheckEnablePreviews.addSelectionListener(mApplyOnSelected);
-
- Label filler = new Label(shell, SWT.NONE);
- GridDataBuilder.create(filler).hFill().hGrab();
-
- createCloseButton();
- }
-
- @Override
- protected void postCreate() {
- super.postCreate();
- // This tells the controller to load the settings into the page UI.
- mSettingsController.setSettingsPage(this);
- }
-
- @Override
- protected void close() {
- // Dissociate this page from the controller
- mSettingsController.setSettingsPage(null);
- super.close();
- }
-
-
- // -- Start of internal part ----------
- // Hide everything down-below from SWT designer
- //$hide>>$
-
- /** Loads settings from the given {@link Properties} container and update the page UI. */
- @Override
- public void loadSettings(Properties inSettings) {
- mTextProxyServer.setText(inSettings.getProperty(KEY_HTTP_PROXY_HOST, "")); //$NON-NLS-1$
- mTextProxyPort.setText( inSettings.getProperty(KEY_HTTP_PROXY_PORT, "")); //$NON-NLS-1$
- mCheckForceHttp.setSelection(
- Boolean.parseBoolean(inSettings.getProperty(KEY_FORCE_HTTP)));
- mCheckAskAdbRestart.setSelection(
- Boolean.parseBoolean(inSettings.getProperty(KEY_ASK_ADB_RESTART)));
- mCheckUseCache.setSelection(
- Boolean.parseBoolean(inSettings.getProperty(KEY_USE_DOWNLOAD_CACHE)));
- mCheckEnablePreviews.setSelection(
- Boolean.parseBoolean(inSettings.getProperty(KEY_ENABLE_PREVIEWS)));
-
- }
-
- /** Called by the application to retrieve settings from the UI and store them in
- * the given {@link Properties} container. */
- @Override
- public void retrieveSettings(Properties outSettings) {
- outSettings.setProperty(KEY_HTTP_PROXY_HOST, mTextProxyServer.getText());
- outSettings.setProperty(KEY_HTTP_PROXY_PORT, mTextProxyPort.getText());
- outSettings.setProperty(KEY_FORCE_HTTP,
- Boolean.toString(mCheckForceHttp.getSelection()));
- outSettings.setProperty(KEY_ASK_ADB_RESTART,
- Boolean.toString(mCheckAskAdbRestart.getSelection()));
- outSettings.setProperty(KEY_USE_DOWNLOAD_CACHE,
- Boolean.toString(mCheckUseCache.getSelection()));
- outSettings.setProperty(KEY_ENABLE_PREVIEWS,
- Boolean.toString(mCheckEnablePreviews.getSelection()));
-
- }
-
- /**
- * Called by the application to give a callback that the page should invoke when
- * settings must be applied. The page does not apply the settings itself, instead
- * it notifies the application.
- */
- @Override
- public void setOnSettingsChanged(SettingsChangedCallback settingsChangedCallback) {
- mSettingsChangedCallback = settingsChangedCallback;
- }
-
- /**
- * Callback invoked when user touches one of the settings.
- * There is no "Apply" button, settings are applied immediately as they are changed.
- * Notify the application that settings have changed.
- */
- private void applyNewSettings() {
- if (mSettingsChangedCallback != null) {
- mSettingsChangedCallback.onSettingsChanged(this);
- }
- }
-
- private void updateDownloadCacheSize() {
- long size = mDownloadCache.getCurrentSize();
- String str = FormatUtils.byteSizeToString(size);
- mTextCacheSize.setText(str);
- }
-
-
- // End of hiding from SWT Designer
- //$hide<<$
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterBaseDialog.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterBaseDialog.java
deleted file mode 100755
index 02b39b4..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterBaseDialog.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository;
-
-import com.android.SdkConstants;
-import com.android.sdkuilib.internal.repository.icons.ImageFactory;
-import com.android.sdkuilib.internal.repository.ui.SdkUpdaterWindowImpl2;
-import com.android.sdkuilib.ui.GridDataBuilder;
-import com.android.sdkuilib.ui.GridLayoutBuilder;
-import com.android.sdkuilib.ui.SwtBaseDialog;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Shell;
-
-
-
-/**
- * Base class for auxiliary dialogs shown in the updater (for example settings,
- * about box or add-on site.)
- */
-public abstract class UpdaterBaseDialog extends SwtBaseDialog {
-
- private final UpdaterData mUpdaterData;
-
- protected UpdaterBaseDialog(Shell parentShell, UpdaterData updaterData, String title) {
- super(parentShell,
- SWT.APPLICATION_MODAL,
- String.format("%1$s - %2$s", SdkUpdaterWindowImpl2.APP_NAME, title)); //$NON-NLS-1$
- mUpdaterData = updaterData;
- }
-
- public UpdaterData getUpdaterData() {
- return mUpdaterData;
- }
-
- /**
- * Initializes the shell with a 2-column Grid layout.
- * Caller should use {@link #createCloseButton()} to inject the
- * close button at the bottom of the dialog.
- */
- @Override
- protected void createContents() {
- Shell shell = getShell();
- setWindowImage(shell);
-
- GridLayoutBuilder.create(shell).columns(2);
- }
-
- protected void createCloseButton() {
- Button close = new Button(getShell(), SWT.PUSH);
- close.setText("Close");
- GridDataBuilder.create(close).hFill().vBottom();
- close.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- close();
- }
- });
- }
-
- @Override
- protected void postCreate() {
- // pass
- }
-
- @Override
- protected void close() {
- super.close();
- }
-
- /**
- * Creates the icon of the window shell.
- *
- * @param shell The shell on which to put the icon
- */
- private void setWindowImage(Shell shell) {
- String imageName = "android_icon_16.png"; //$NON-NLS-1$
- if (SdkConstants.currentPlatform() == SdkConstants.PLATFORM_DARWIN) {
- imageName = "android_icon_128.png"; //$NON-NLS-1$
- }
-
- if (mUpdaterData != null) {
- ImageFactory imgFactory = mUpdaterData.getImageFactory();
- if (imgFactory != null) {
- shell.setImage(imgFactory.getImageByName(imageName));
- }
- }
- }
-}
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
deleted file mode 100755
index 7fc1b1e..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java
+++ /dev/null
@@ -1,1159 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository;
-
-import com.android.SdkConstants;
-import com.android.annotations.VisibleForTesting;
-import com.android.annotations.VisibleForTesting.Visibility;
-import com.android.prefs.AndroidLocation.AndroidLocationException;
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.internal.avd.AvdManager;
-import com.android.sdklib.internal.repository.AdbWrapper;
-import com.android.sdklib.internal.repository.DownloadCache;
-import com.android.sdklib.internal.repository.ITask;
-import com.android.sdklib.internal.repository.ITaskFactory;
-import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.LocalSdkParser;
-import com.android.sdklib.internal.repository.NullTaskMonitor;
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.archives.ArchiveInstaller;
-import com.android.sdklib.internal.repository.packages.AddonPackage;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.internal.repository.packages.PlatformToolPackage;
-import com.android.sdklib.internal.repository.packages.ToolPackage;
-import com.android.sdklib.internal.repository.sources.SdkRepoSource;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.internal.repository.sources.SdkSourceCategory;
-import com.android.sdklib.internal.repository.sources.SdkSources;
-import com.android.sdklib.repository.SdkAddonConstants;
-import com.android.sdklib.repository.SdkRepoConstants;
-import com.android.sdklib.util.LineUtil;
-import com.android.sdklib.util.SparseIntArray;
-import com.android.sdkuilib.internal.repository.SettingsController.OnChangedListener;
-import com.android.sdkuilib.internal.repository.core.PackageLoader;
-import com.android.sdkuilib.internal.repository.icons.ImageFactory;
-import com.android.sdkuilib.internal.repository.ui.SdkUpdaterWindowImpl2;
-import com.android.sdkuilib.repository.ISdkChangeListener;
-import com.android.utils.ILogger;
-
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Shell;
-
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Data shared between {@link SdkUpdaterWindowImpl2} and its pages.
- */
-public class UpdaterData implements IUpdaterData {
-
- public static final int NO_TOOLS_MSG = 0;
- public static final int TOOLS_MSG_UPDATED_FROM_ADT = 1;
- public static final int TOOLS_MSG_UPDATED_FROM_SDKMAN = 2;
-
- private String mOsSdkRoot;
-
- private final LocalSdkParser mLocalSdkParser = new LocalSdkParser();
- /** Holds all sources. Do not use this directly.
- * Instead use {@link #getSources()} so that unit tests can override this as needed. */
- private final SdkSources mSources = new SdkSources();
- /** Holds settings. Do not use this directly.
- * Instead use {@link #getSettingsController()} so that unit tests can override this. */
- private final SettingsController mSettingsController;
- private final ArrayList<ISdkChangeListener> mListeners = new ArrayList<ISdkChangeListener>();
- private final ILogger mSdkLog;
- private ITaskFactory mTaskFactory;
- private Shell mWindowShell;
- private SdkManager mSdkManager;
- private AvdManager mAvdManager;
- /**
- * The current {@link PackageLoader} to use.
- * Lazily created in {@link #getPackageLoader()}.
- */
- private PackageLoader mPackageLoader;
- /**
- * The current {@link DownloadCache} to use.
- * Lazily created in {@link #getDownloadCache()}.
- */
- private DownloadCache mDownloadCache;
- /**
- * The current {@link ImageFactory}.
- * Set via {@link #setImageFactory(ImageFactory)} by the window implementation.
- * It is null when invoked using the command-line interface.
- */
- private ImageFactory mImageFactory;
- private AndroidLocationException mAvdManagerInitError;
-
- /**
- * Creates a new updater data.
- *
- * @param sdkLog Logger. Cannot be null.
- * @param osSdkRoot The OS path to the SDK root.
- */
- public UpdaterData(String osSdkRoot, ILogger sdkLog) {
- mOsSdkRoot = osSdkRoot;
- mSdkLog = sdkLog;
-
-
- mSettingsController = initSettingsController();
- initSdk();
- }
-
- // ----- getters, setters ----
-
- public String getOsSdkRoot() {
- return mOsSdkRoot;
- }
-
- @Override
- public DownloadCache getDownloadCache() {
- if (mDownloadCache == null) {
- mDownloadCache = new DownloadCache(
- getSettingsController().getSettings().getUseDownloadCache() ?
- DownloadCache.Strategy.FRESH_CACHE :
- DownloadCache.Strategy.DIRECT);
- }
- return mDownloadCache;
- }
-
- public void setTaskFactory(ITaskFactory taskFactory) {
- mTaskFactory = taskFactory;
- }
-
- @Override
- public ITaskFactory getTaskFactory() {
- return mTaskFactory;
- }
-
- public SdkSources getSources() {
- return mSources;
- }
-
- public LocalSdkParser getLocalSdkParser() {
- return mLocalSdkParser;
- }
-
- @Override
- public ILogger getSdkLog() {
- return mSdkLog;
- }
-
- public void setImageFactory(ImageFactory imageFactory) {
- mImageFactory = imageFactory;
- }
-
- @Override
- public ImageFactory getImageFactory() {
- return mImageFactory;
- }
-
- @Override
- public SdkManager getSdkManager() {
- return mSdkManager;
- }
-
- @Override
- public AvdManager getAvdManager() {
- return mAvdManager;
- }
-
- @Override
- public SettingsController getSettingsController() {
- return mSettingsController;
- }
-
- /** Adds a listener ({@link ISdkChangeListener}) that is notified when the SDK is reloaded. */
- public void addListeners(ISdkChangeListener listener) {
- if (mListeners.contains(listener) == false) {
- mListeners.add(listener);
- }
- }
-
- /** Removes a listener ({@link ISdkChangeListener}) that is notified when the SDK is reloaded. */
- public void removeListener(ISdkChangeListener listener) {
- mListeners.remove(listener);
- }
-
- public void setWindowShell(Shell windowShell) {
- mWindowShell = windowShell;
- }
-
- @Override
- public Shell getWindowShell() {
- return mWindowShell;
- }
-
- public PackageLoader getPackageLoader() {
- // The package loader is lazily initialized here.
- if (mPackageLoader == null) {
- mPackageLoader = new PackageLoader(this);
- }
- return mPackageLoader;
- }
-
- /**
- * 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$
- }
-
- String error = 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);
-
- // We may not have any UI. Only display a dialog if there's a window shell available.
- if (mWindowShell != null && !mWindowShell.isDisposed()) {
- MessageDialog.openError(mWindowShell,
- "Android Virtual Devices Manager",
- error);
- } else {
- mSdkLog.error(null /* Throwable */, "%s", error); //$NON-NLS-1$
- }
-
- return true;
- }
- return false;
- }
-
- // -----
-
- /**
- * Initializes the {@link SdkManager} and the {@link AvdManager}.
- * Extracted so that we can override this in unit tests.
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected void initSdk() {
- setSdkManager(SdkManager.createManager(mOsSdkRoot, mSdkLog));
- try {
- mAvdManager = null;
- mAvdManager = AvdManager.getInstance(mSdkManager, mSdkLog);
- } catch (AndroidLocationException e) {
- mSdkLog.error(e, "Unable to read AVDs: " + e.getMessage()); //$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 listeners.
- broadcastOnSdkReload();
- }
-
- /**
- * Initializes the {@link SettingsController}
- * Extracted so that we can override this in unit tests.
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected SettingsController initSettingsController() {
- SettingsController settingsController = new SettingsController(mSdkLog);
- settingsController.registerOnChangedListener(new OnChangedListener() {
- @Override
- public void onSettingsChanged(
- SettingsController controller,
- SettingsController.Settings oldSettings) {
-
- // Reset the download cache if it doesn't match the right strategy.
- // The cache instance gets lazily recreated later in getDownloadCache().
- if (mDownloadCache != null) {
- if (controller.getSettings().getUseDownloadCache() &&
- mDownloadCache.getStrategy() != DownloadCache.Strategy.FRESH_CACHE) {
- mDownloadCache = null;
- } else if (!controller.getSettings().getUseDownloadCache() &&
- mDownloadCache.getStrategy() != DownloadCache.Strategy.DIRECT) {
- mDownloadCache = null;
- }
- }
- }
- });
- return settingsController;
- }
-
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected void setSdkManager(SdkManager sdkManager) {
- mSdkManager = sdkManager;
- }
-
- /**
- * Reloads the SDK content (targets).
- * <p/>
- * This also reloads the AVDs in case their status changed.
- * <p/>
- * This does not notify the listeners ({@link ISdkChangeListener}).
- */
- public void reloadSdk() {
- // reload SDK
- mSdkManager.reloadSdk(mSdkLog);
-
- // reload AVDs
- if (mAvdManager != null) {
- try {
- mAvdManager.reloadAvds(mSdkLog);
- } catch (AndroidLocationException e) {
- // FIXME
- }
- }
-
- mLocalSdkParser.clearPackages();
-
- // notify listeners
- broadcastOnSdkReload();
- }
-
- /**
- * Reloads the AVDs.
- * <p/>
- * This does not notify the listeners.
- */
- public void reloadAvds() {
- // reload AVDs
- if (mAvdManager != null) {
- try {
- mAvdManager.reloadAvds(mSdkLog);
- } catch (AndroidLocationException e) {
- mSdkLog.error(e, null);
- }
- }
- }
-
- /**
- * Sets up the default sources: <br/>
- * - the default google SDK repository, <br/>
- * - the user sources from prefs <br/>
- * - the extra repo URLs from the environment, <br/>
- * - and finally the extra user repo URLs from the environment.
- */
- public void setupDefaultSources() {
- SdkSources sources = getSources();
-
- // Load the conventional sources.
- // For testing, the env var can be set to replace the default root download URL.
- // It must end with a / and its the location where the updater will look for
- // the repository.xml, addons_list.xml and such files.
-
- String baseUrl = System.getenv("SDK_TEST_BASE_URL"); //$NON-NLS-1$
- if (baseUrl == null || baseUrl.length() <= 0 || !baseUrl.endsWith("/")) { //$NON-NLS-1$
- baseUrl = SdkRepoConstants.URL_GOOGLE_SDK_SITE;
- }
-
- sources.add(SdkSourceCategory.ANDROID_REPO,
- new SdkRepoSource(baseUrl,
- SdkSourceCategory.ANDROID_REPO.getUiName()));
-
- // Load user sources (this will also notify change listeners but this operation is
- // done early enough that there shouldn't be any anyway.)
- sources.loadUserAddons(getSdkLog());
- }
-
- /**
- * Returns the list of installed packages, parsing them if this has not yet been done.
- * <p/>
- * The package list is cached in the {@link LocalSdkParser} and will be reset when
- * {@link #reloadSdk()} is invoked.
- */
- public Package[] getInstalledPackages(ITaskMonitor monitor) {
- LocalSdkParser parser = getLocalSdkParser();
-
- Package[] packages = parser.getPackages();
-
- if (packages == null) {
- // load on demand the first time
- packages = parser.parseSdk(getOsSdkRoot(), getSdkManager(), monitor);
- }
-
- return packages;
- }
- /**
- * Install the list of given {@link Archive}s. This is invoked by the user selecting some
- * packages in the remote page and then clicking "install selected".
- *
- * @param archives The archives to install. Incompatible ones will be skipped.
- * @param flags Optional flags for the installer, such as {@link #NO_TOOLS_MSG}.
- * @return A list of archives that have been installed. Can be empty but not null.
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected List<Archive> installArchives(final List<ArchiveInfo> archives, final int flags) {
- if (mTaskFactory == null) {
- throw new IllegalArgumentException("Task Factory is null");
- }
-
- // this will accumulate all the packages installed.
- final List<Archive> newlyInstalledArchives = new ArrayList<Archive>();
-
- final boolean forceHttp = getSettingsController().getSettings().getForceHttp();
-
- // sort all archives based on their dependency level.
- Collections.sort(archives, new InstallOrderComparator());
-
- mTaskFactory.start("Installing Archives", new ITask() {
- @Override
- public void run(ITaskMonitor monitor) {
-
- final int progressPerArchive = 2 * ArchiveInstaller.NUM_MONITOR_INC;
- monitor.setProgressMax(1 + archives.size() * progressPerArchive);
- monitor.setDescription("Preparing to install archives");
-
- boolean installedAddon = false;
- boolean installedTools = false;
- boolean installedPlatformTools = false;
- boolean preInstallHookInvoked = false;
-
- // Mark all current local archives as already installed.
- HashSet<Archive> installedArchives = new HashSet<Archive>();
- for (Package p : getInstalledPackages(monitor.createSubMonitor(1))) {
- for (Archive a : p.getArchives()) {
- installedArchives.add(a);
- }
- }
-
- int numInstalled = 0;
- nextArchive: for (ArchiveInfo ai : archives) {
- Archive archive = ai.getNewArchive();
- if (archive == null) {
- // This is not supposed to happen.
- continue nextArchive;
- }
-
- int nextProgress = monitor.getProgress() + progressPerArchive;
- try {
- if (monitor.isCancelRequested()) {
- break;
- }
-
- ArchiveInfo[] adeps = ai.getDependsOn();
- if (adeps != null) {
- for (ArchiveInfo adep : adeps) {
- Archive na = adep.getNewArchive();
- if (na == null) {
- // This archive depends on a missing archive.
- // We shouldn't get here.
- // Skip it.
- monitor.log("Skipping '%1$s'; it depends on a missing package.",
- archive.getParentPackage().getShortDescription());
- continue nextArchive;
- } else if (!installedArchives.contains(na)) {
- // This archive depends on another one that was not installed.
- // We shouldn't get here.
- // Skip it.
- monitor.logError("Skipping '%1$s'; it depends on '%2$s' which was not installed.",
- archive.getParentPackage().getShortDescription(),
- adep.getShortDescription());
- continue nextArchive;
- }
- }
- }
-
- if (!preInstallHookInvoked) {
- preInstallHookInvoked = true;
- broadcastPreInstallHook();
- }
-
- ArchiveInstaller installer = createArchiveInstaler();
- if (installer.install(ai,
- mOsSdkRoot,
- forceHttp,
- mSdkManager,
- getDownloadCache(),
- monitor)) {
- // We installed this archive.
- newlyInstalledArchives.add(archive);
- installedArchives.add(archive);
- numInstalled++;
-
- // If this package was replacing an existing one, the old one
- // is no longer installed.
- installedArchives.remove(ai.getReplaced());
-
- // Check if we successfully installed a platform-tool or add-on package.
- if (archive.getParentPackage() instanceof AddonPackage) {
- installedAddon = true;
- } else if (archive.getParentPackage() instanceof ToolPackage) {
- installedTools = true;
- } else if (archive.getParentPackage() instanceof PlatformToolPackage) {
- installedPlatformTools = true;
- }
- }
-
- } catch (Throwable t) {
- // Display anything unexpected in the monitor.
- String msg = t.getMessage();
- if (msg != null) {
- msg = String.format("Unexpected Error installing '%1$s': %2$s: %3$s",
- archive.getParentPackage().getShortDescription(),
- t.getClass().getCanonicalName(), msg);
- } else {
- // no error info? get the stack call to display it
- // At least that'll give us a better bug report.
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- t.printStackTrace(new PrintStream(baos));
-
- msg = String.format("Unexpected Error installing '%1$s'\n%2$s",
- archive.getParentPackage().getShortDescription(),
- baos.toString());
- }
-
- monitor.log( "%1$s", msg); //$NON-NLS-1$
- mSdkLog.error(t, "%1$s", msg); //$NON-NLS-1$
- } finally {
-
- // Always move the progress bar to the desired position.
- // This allows internal methods to not have to care in case
- // they abort early
- monitor.incProgress(nextProgress - monitor.getProgress());
- }
- }
-
- if (installedAddon) {
- // Update the USB vendor ids for adb
- try {
- mSdkManager.updateAdb();
- monitor.log("Updated ADB to support the USB devices declared in the SDK add-ons.");
- } catch (Exception e) {
- mSdkLog.error(e, "Update ADB failed");
- monitor.logError("failed to update adb to support the USB devices declared in the SDK add-ons.");
- }
- }
-
- if (preInstallHookInvoked) {
- broadcastPostInstallHook();
- }
-
- if (installedAddon || installedPlatformTools) {
- // We need to restart ADB. Actually since we don't know if it's even
- // running, maybe we should just kill it and not start it.
- // Note: it turns out even under Windows we don't need to kill adb
- // before updating the tools folder, as adb.exe is (surprisingly) not
- // locked.
-
- askForAdbRestart(monitor);
- }
-
- if (installedTools) {
- notifyToolsNeedsToBeRestarted(flags);
- }
-
- if (numInstalled == 0) {
- monitor.setDescription("Done. Nothing was installed.");
- } else {
- monitor.setDescription("Done. %1$d %2$s installed.",
- numInstalled,
- numInstalled == 1 ? "package" : "packages");
-
- //notify listeners something was installed, so that they can refresh
- reloadSdk();
- }
- }
- });
-
- return newlyInstalledArchives;
- }
-
- /**
- * A comparator to sort all the {@link ArchiveInfo} based on their
- * dependency level. This forces the installer to install first all packages
- * with no dependency, then those with one level of dependency, etc.
- */
- private static class InstallOrderComparator implements Comparator<ArchiveInfo> {
-
- private final Map<ArchiveInfo, Integer> mOrders = new HashMap<ArchiveInfo, Integer>();
-
- @Override
- public int compare(ArchiveInfo o1, ArchiveInfo o2) {
- int n1 = getDependencyOrder(o1);
- int n2 = getDependencyOrder(o2);
-
- return n1 - n2;
- }
-
- private int getDependencyOrder(ArchiveInfo ai) {
- if (ai == null) {
- return 0;
- }
-
- // reuse cached value, if any
- Integer cached = mOrders.get(ai);
- if (cached != null) {
- return cached.intValue();
- }
-
- ArchiveInfo[] deps = ai.getDependsOn();
- if (deps == null) {
- return 0;
- }
-
- // compute dependencies, recursively
- int n = deps.length;
-
- for (ArchiveInfo dep : deps) {
- n += getDependencyOrder(dep);
- }
-
- // cache it
- mOrders.put(ai, Integer.valueOf(n));
-
- return n;
- }
-
- }
-
- /**
- * Attempts to restart ADB.
- * <p/>
- * If the "ask before restart" setting is set (the default), prompt the user whether
- * now is a good time to restart ADB.
- *
- * @param monitor
- */
- private void askForAdbRestart(ITaskMonitor monitor) {
- final boolean[] canRestart = new boolean[] { true };
-
- if (getWindowShell() != null &&
- getSettingsController().getSettings().getAskBeforeAdbRestart()) {
- // need to ask for permission first
- final Shell shell = getWindowShell();
- if (shell != null && !shell.isDisposed()) {
- shell.getDisplay().syncExec(new Runnable() {
- @Override
- public void run() {
- if (!shell.isDisposed()) {
- canRestart[0] = MessageDialog.openQuestion(shell,
- "ADB Restart",
- "A package that depends on ADB has been updated. \n" +
- "Do you want to restart ADB now?");
- }
- }
- });
- }
- }
-
- if (canRestart[0]) {
- AdbWrapper adb = new AdbWrapper(getOsSdkRoot(), monitor);
- adb.stopAdb();
- adb.startAdb();
- }
- }
-
- private void notifyToolsNeedsToBeRestarted(int flags) {
-
- String msg = null;
- if ((flags & TOOLS_MSG_UPDATED_FROM_ADT) != 0) {
- msg =
- "The Android SDK and AVD Manager that you are currently using has been updated. " +
- "Please also run Eclipse > Help > Check for Updates to see if the Android " +
- "plug-in needs to be updated.";
-
- } else if ((flags & TOOLS_MSG_UPDATED_FROM_SDKMAN) != 0) {
- msg =
- "The Android SDK and AVD Manager that you are currently using has been updated. " +
- "It is recommended that you now close the manager window and re-open it. " +
- "If you use Eclipse, please run Help > Check for Updates to see if the Android " +
- "plug-in needs to be updated.";
- }
-
- final String msg2 = msg;
-
- final Shell shell = getWindowShell();
- if (msg2 != null && shell != null && !shell.isDisposed()) {
- shell.getDisplay().syncExec(new Runnable() {
- @Override
- public void run() {
- if (!shell.isDisposed()) {
- MessageDialog.openInformation(shell,
- "Android Tools Updated",
- msg2);
- }
- }
- });
- }
- }
-
-
- /**
- * Tries to update all the *existing* local packages.
- * This version *requires* to be run with a GUI.
- * <p/>
- * There are two modes of operation:
- * <ul>
- * <li>If selectedArchives is null, refreshes all sources, compares the available remote
- * packages with the current local ones and suggest updates to be done to the user (including
- * new platforms that the users doesn't have yet).
- * <li>If selectedArchives is not null, this represents a list of archives/packages that
- * the user wants to install or update, so just process these.
- * </ul>
- *
- * @param selectedArchives The list of remote archives to consider for the update.
- * This can be null, in which case a list of remote archive is fetched from all
- * available sources.
- * @param includeObsoletes True if obsolete packages should be used when resolving what
- * to update.
- * @param flags Optional flags for the installer, such as {@link #NO_TOOLS_MSG}.
- * @return A list of archives that have been installed. Can be null if nothing was done.
- */
- public List<Archive> updateOrInstallAll_WithGUI(
- Collection<Archive> selectedArchives,
- boolean includeObsoletes,
- int flags) {
-
- // Note: we no longer call refreshSources(true) here. This will be done
- // automatically by computeUpdates() iif it needs to access sources to
- // resolve missing dependencies.
-
- SdkUpdaterLogic ul = new SdkUpdaterLogic(this);
- List<ArchiveInfo> archives = ul.computeUpdates(
- selectedArchives,
- getSources(),
- getLocalSdkParser().getPackages(),
- includeObsoletes);
-
- if (selectedArchives == null) {
- getPackageLoader().loadRemoteAddonsList(new NullTaskMonitor(getSdkLog()));
- ul.addNewPlatforms(
- archives,
- getSources(),
- getLocalSdkParser().getPackages(),
- includeObsoletes);
- }
-
- // TODO if selectedArchives is null and archives.len==0, find if there are
- // any new platform we can suggest to install instead.
-
- Collections.sort(archives);
-
- SdkUpdaterChooserDialog dialog =
- new SdkUpdaterChooserDialog(getWindowShell(), this, archives);
- dialog.open();
-
- ArrayList<ArchiveInfo> result = dialog.getResult();
- if (result != null && result.size() > 0) {
- return installArchives(result, flags);
- }
- return null;
- }
-
- /**
- * Fetches all archives available on the known remote sources.
- *
- * Used by {@link UpdaterData#listRemotePackages_NoGUI} and
- * {@link UpdaterData#updateOrInstallAll_NoGUI}.
- *
- * @param includeAll True to list and install all packages, including obsolete ones.
- * @return A list of potential {@link ArchiveInfo} to install.
- */
- private List<ArchiveInfo> getRemoteArchives_NoGUI(boolean includeAll) {
- refreshSources(true);
- getPackageLoader().loadRemoteAddonsList(new NullTaskMonitor(getSdkLog()));
-
- List<ArchiveInfo> archives;
- SdkUpdaterLogic ul = new SdkUpdaterLogic(this);
-
- if (includeAll) {
- archives = ul.getAllRemoteArchives(
- getSources(),
- getLocalSdkParser().getPackages(),
- includeAll);
-
- } else {
- archives = ul.computeUpdates(
- null /*selectedArchives*/,
- getSources(),
- getLocalSdkParser().getPackages(),
- includeAll);
-
- ul.addNewPlatforms(
- archives,
- getSources(),
- getLocalSdkParser().getPackages(),
- includeAll);
- }
-
- Collections.sort(archives);
- return archives;
- }
-
- /**
- * Lists remote packages available for install using
- * {@link UpdaterData#updateOrInstallAll_NoGUI}.
- *
- * @param includeAll True to list and install all packages, including obsolete ones.
- * @param extendedOutput True to display more details on each package.
- */
- public void listRemotePackages_NoGUI(boolean includeAll, boolean extendedOutput) {
-
- List<ArchiveInfo> archives = getRemoteArchives_NoGUI(includeAll);
-
- mSdkLog.info("Packages available for installation or update: %1$d\n", archives.size());
-
- int index = 1;
- for (ArchiveInfo ai : archives) {
- Archive a = ai.getNewArchive();
- if (a != null) {
- Package p = a.getParentPackage();
- if (p != null) {
- if (extendedOutput) {
- mSdkLog.info("----------\n");
- mSdkLog.info("id: %1$d or \"%2$s\"\n", index, p.installId());
- mSdkLog.info(" Type: %1$s\n",
- p.getClass().getSimpleName().replaceAll("Package", "")); //$NON-NLS-1$ //$NON-NLS-2$
- String desc = LineUtil.reformatLine(" Desc: %s\n",
- p.getLongDescription());
- mSdkLog.info("%s", desc); //$NON-NLS-1$
- } else {
- mSdkLog.info("%1$ 4d- %2$s\n",
- index,
- p.getShortDescription());
- }
- index++;
- }
- }
- }
- }
-
- /**
- * Tries to update all the *existing* local packages.
- * This version is intended to run without a GUI and
- * only outputs to the current {@link ILogger}.
- *
- * @param pkgFilter A list of {@link SdkRepoConstants#NODES} or {@link Package#installId()}
- * or package indexes to limit the packages we can update or install.
- * A null or empty list means to update everything possible.
- * @param includeAll True to list and install all packages, including obsolete ones.
- * @param dryMode True to check what would be updated/installed but do not actually
- * download or install anything.
- * @return A list of archives that have been installed. Can be null if nothing was done.
- */
- public List<Archive> updateOrInstallAll_NoGUI(
- Collection<String> pkgFilter,
- boolean includeAll,
- boolean dryMode) {
-
- List<ArchiveInfo> archives = getRemoteArchives_NoGUI(includeAll);
-
- // Filter the selected archives to only keep the ones matching the filter
- if (pkgFilter != null && pkgFilter.size() > 0 && archives != null && archives.size() > 0) {
- // Map filter types to an SdkRepository Package type,
- // e.g. create a map "platform" => PlatformPackage.class
- HashMap<String, Class<? extends Package>> pkgMap =
- new HashMap<String, Class<? extends Package>>();
-
- mapFilterToPackageClass(pkgMap, SdkRepoConstants.NODES);
- mapFilterToPackageClass(pkgMap, SdkAddonConstants.NODES);
-
- // Prepare a map install-id => package instance
- HashMap<String, Package> installIdMap = new HashMap<String, Package>();
- for (ArchiveInfo ai : archives) {
- Archive a = ai.getNewArchive();
- if (a != null) {
- Package p = a.getParentPackage();
- if (p != null) {
- String id = p.installId();
- if (id != null && id.length() > 0 && !installIdMap.containsKey(id)) {
- installIdMap.put(id, p);
- }
- }
- }
- }
-
- // Now intersect this with the pkgFilter requested by the user, in order to
- // only keep the classes that the user wants to install.
- // We also create a set with the package indices requested by the user
- // and a set of install-ids requested by the user.
-
- HashSet<Class<? extends Package>> userFilteredClasses =
- new HashSet<Class<? extends Package>>();
- SparseIntArray userFilteredIndices = new SparseIntArray();
- Set<String> userFilteredInstallIds = new HashSet<String>();
-
- for (String type : pkgFilter) {
- if (installIdMap.containsKey(type)) {
- userFilteredInstallIds.add(type);
-
- } else if (type.replaceAll("[0-9]+", "").length() == 0) {//$NON-NLS-1$ //$NON-NLS-2$
- // An all-digit number is a package index requested by the user.
- int index = Integer.parseInt(type);
- userFilteredIndices.put(index, index);
-
- } else if (pkgMap.containsKey(type)) {
- userFilteredClasses.add(pkgMap.get(type));
-
- } else {
- // This should not happen unless there's a mismatch in the package map.
- mSdkLog.error(null, "Ignoring unknown package filter '%1$s'", type);
- }
- }
-
- // we don't need the maps anymore
- pkgMap = null;
- installIdMap = null;
-
- // Now filter the remote archives list to keep:
- // - any package which class matches userFilteredClasses
- // - any package index which matches userFilteredIndices
- // - any package install id which matches userFilteredInstallIds
-
- int index = 1;
- for (Iterator<ArchiveInfo> it = archives.iterator(); it.hasNext(); ) {
- boolean keep = false;
- ArchiveInfo ai = it.next();
- Archive a = ai.getNewArchive();
- if (a != null) {
- Package p = a.getParentPackage();
- if (p != null) {
- if (userFilteredInstallIds.contains(p.installId()) ||
- userFilteredClasses.contains(p.getClass()) ||
- userFilteredIndices.get(index) > 0) {
- keep = true;
- }
-
- index++;
- }
- }
-
- if (!keep) {
- it.remove();
- }
- }
-
- if (archives.size() == 0) {
- mSdkLog.info(LineUtil.reflowLine(
- "Warning: The package filter removed all packages. There is nothing to install.\nPlease consider trying to update again without a package filter.\n"));
- return null;
- }
- }
-
- if (archives != null && archives.size() > 0) {
- if (dryMode) {
- mSdkLog.info("Packages selected for install:\n");
- for (ArchiveInfo ai : archives) {
- Archive a = ai.getNewArchive();
- if (a != null) {
- Package p = a.getParentPackage();
- if (p != null) {
- mSdkLog.info("- %1$s\n", p.getShortDescription());
- }
- }
- }
- mSdkLog.info("\nDry mode is on so nothing is actually being installed.\n");
- } else {
- return installArchives(archives, NO_TOOLS_MSG);
- }
- } else {
- mSdkLog.info("There is nothing to install or update.\n");
- }
-
- return null;
- }
-
- @SuppressWarnings("unchecked")
- private void mapFilterToPackageClass(
- HashMap<String, Class<? extends Package>> inOutPkgMap,
- String[] nodes) {
-
- // Automatically find the classes matching the node names
- ClassLoader classLoader = getClass().getClassLoader();
- String basePackage = Package.class.getPackage().getName();
-
- for (String node : nodes) {
- // Capitalize the name
- String name = node.substring(0, 1).toUpperCase() + node.substring(1);
-
- // We can have one dash at most in a name. If it's present, we'll try
- // with the dash or with the next letter capitalized.
- int dash = name.indexOf('-');
- if (dash > 0) {
- name = name.replaceFirst("-", "");
- }
-
- for (int alternatives = 0; alternatives < 2; alternatives++) {
-
- String fqcn = basePackage + '.' + name + "Package"; //$NON-NLS-1$
- try {
- Class<? extends Package> clazz =
- (Class<? extends Package>) classLoader.loadClass(fqcn);
- if (clazz != null) {
- inOutPkgMap.put(node, clazz);
- continue;
- }
- } catch (Throwable ignore) {
- }
-
- if (alternatives == 0 && dash > 0) {
- // Try an alternative where the next letter after the dash
- // is converted to an upper case.
- name = name.substring(0, dash) +
- name.substring(dash, dash + 1).toUpperCase() +
- name.substring(dash + 1);
- } else {
- break;
- }
- }
- }
- }
-
- /**
- * Refresh all sources. This is invoked either internally (reusing an existing monitor)
- * or as a UI callback on the remote page "Refresh" button (in which case the monitor is
- * null and a new task should be created.)
- *
- * @param forceFetching When true, load sources that haven't been loaded yet.
- * When false, only refresh sources that have been loaded yet.
- */
- public void refreshSources(final boolean forceFetching) {
- assert mTaskFactory != null;
-
- final boolean forceHttp = getSettingsController().getSettings().getForceHttp();
-
- mTaskFactory.start("Refresh Sources", new ITask() {
- @Override
- public void run(ITaskMonitor monitor) {
-
- getPackageLoader().loadRemoteAddonsList(monitor);
-
- SdkSource[] sources = getSources().getAllSources();
- monitor.setDescription("Refresh Sources");
- monitor.setProgressMax(monitor.getProgress() + sources.length);
- for (SdkSource source : sources) {
- if (forceFetching ||
- source.getPackages() != null ||
- source.getFetchError() != null) {
- source.load(getDownloadCache(), monitor.createSubMonitor(1), forceHttp);
- }
- monitor.incProgress(1);
- }
- }
- });
- }
-
- /**
- * Safely invoke all the registered {@link ISdkChangeListener#onSdkLoaded()}.
- * This can be called from any thread.
- */
- public void broadcastOnSdkLoaded() {
- if (mWindowShell != null && !mWindowShell.isDisposed() && mListeners.size() > 0) {
- mWindowShell.getDisplay().syncExec(new Runnable() {
- @Override
- public void run() {
- for (ISdkChangeListener listener : mListeners) {
- try {
- listener.onSdkLoaded();
- } catch (Throwable t) {
- mSdkLog.error(t, null);
- }
- }
- }
- });
- }
- }
-
- /**
- * Safely invoke all the registered {@link ISdkChangeListener#onSdkReload()}.
- * This can be called from any thread.
- */
- private void broadcastOnSdkReload() {
- if (mWindowShell != null && !mWindowShell.isDisposed() && mListeners.size() > 0) {
- mWindowShell.getDisplay().syncExec(new Runnable() {
- @Override
- public void run() {
- for (ISdkChangeListener listener : mListeners) {
- try {
- listener.onSdkReload();
- } catch (Throwable t) {
- mSdkLog.error(t, null);
- }
- }
- }
- });
- }
- }
-
- /**
- * Safely invoke all the registered {@link ISdkChangeListener#preInstallHook()}.
- * This can be called from any thread.
- */
- private void broadcastPreInstallHook() {
- if (mWindowShell != null && !mWindowShell.isDisposed() && mListeners.size() > 0) {
- mWindowShell.getDisplay().syncExec(new Runnable() {
- @Override
- public void run() {
- for (ISdkChangeListener listener : mListeners) {
- try {
- listener.preInstallHook();
- } catch (Throwable t) {
- mSdkLog.error(t, null);
- }
- }
- }
- });
- }
- }
-
- /**
- * Safely invoke all the registered {@link ISdkChangeListener#postInstallHook()}.
- * This can be called from any thread.
- */
- private void broadcastPostInstallHook() {
- if (mWindowShell != null && !mWindowShell.isDisposed() && mListeners.size() > 0) {
- mWindowShell.getDisplay().syncExec(new Runnable() {
- @Override
- public void run() {
- for (ISdkChangeListener listener : mListeners) {
- try {
- listener.postInstallHook();
- } catch (Throwable t) {
- mSdkLog.error(t, null);
- }
- }
- }
- });
- }
- }
-
- /**
- * Internal helper to return a new {@link ArchiveInstaller}.
- * This allows us to override the installer for unit-testing.
- */
- @VisibleForTesting(visibility=Visibility.PRIVATE)
- protected ArchiveInstaller createArchiveInstaler() {
- return new ArchiveInstaller();
- }
-
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/core/PackageLoader.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/core/PackageLoader.java
deleted file mode 100755
index 18cccae..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/core/PackageLoader.java
+++ /dev/null
@@ -1,493 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository.core;
-
-import com.android.sdklib.internal.repository.AddonsListFetcher;
-import com.android.sdklib.internal.repository.AddonsListFetcher.Site;
-import com.android.sdklib.internal.repository.DownloadCache;
-import com.android.sdklib.internal.repository.ITask;
-import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.NullTaskMonitor;
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.internal.repository.packages.Package.UpdateInfo;
-import com.android.sdklib.internal.repository.sources.SdkAddonSource;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.internal.repository.sources.SdkSourceCategory;
-import com.android.sdklib.internal.repository.sources.SdkSources;
-import com.android.sdklib.internal.repository.sources.SdkSysImgSource;
-import com.android.sdklib.repository.SdkAddonsListConstants;
-import com.android.sdklib.repository.SdkRepoConstants;
-import com.android.sdkuilib.internal.repository.UpdaterData;
-
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Loads packages fetched from the remote SDK Repository and keeps track
- * of their state compared with the current local SDK installation.
- */
-public class PackageLoader {
-
- /** The update data context. Never null. */
- private final UpdaterData mUpdaterData;
-
- /**
- * The {@link DownloadCache} override. Can be null, in which case the one from
- * {@link UpdaterData} is used instead.
- * @see #getDownloadCache()
- */
- private final DownloadCache mOverrideCache;
-
- /**
- * 0 = need to fetch remote addons list once..
- * 1 = fetch succeeded, don't need to do it any more.
- * -1= fetch failed, do it again only if the user requests a refresh
- * or changes the force-http setting.
- */
- private int mStateFetchRemoteAddonsList;
-
-
- /**
- * Interface for the callback called by
- * {@link PackageLoader#loadPackages(boolean, ISourceLoadedCallback)}.
- * <p/>
- * After processing each source, the package loader calls {@link #onUpdateSource}
- * with the list of packages found in that source.
- * By returning true from {@link #onUpdateSource}, the client tells the loader to
- * continue and process the next source. By returning false, it tells to stop loading.
- * <p/>
- * The {@link #onLoadCompleted()} method is guaranteed to be called at the end, no
- * matter how the loader stopped, so that the client can clean up or perform any
- * final action.
- */
- public interface ISourceLoadedCallback {
- /**
- * After processing each source, the package loader calls this method with the
- * list of packages found in that source.
- * By returning true from {@link #onUpdateSource}, the client tells
- * the loader to continue and process the next source.
- * By returning false, it tells to stop loading.
- * <p/>
- * <em>Important</em>: This method is called from a sub-thread, so clients which
- * try to access any UI widgets must wrap their calls into
- * {@link Display#syncExec(Runnable)} or {@link Display#asyncExec(Runnable)}.
- *
- * @param packages All the packages loaded from the source. Never null.
- * @return True if the load operation should continue, false if it should stop.
- */
- public boolean onUpdateSource(SdkSource source, Package[] packages);
-
- /**
- * This method is guaranteed to be called at the end, no matter how the
- * loader stopped, so that the client can clean up or perform any final action.
- */
- public void onLoadCompleted();
- }
-
- /**
- * Interface describing the task of installing a specific package.
- * For details on the operation,
- * see {@link PackageLoader#loadPackagesWithInstallTask(int, IAutoInstallTask)}.
- *
- * @see PackageLoader#loadPackagesWithInstallTask(int, IAutoInstallTask)
- */
- public interface IAutoInstallTask {
- /**
- * Invoked by the loader once a source has been loaded and its package
- * definitions are known. The method should return the {@code packages}
- * array and can modify it if necessary.
- * The loader will call {@link #acceptPackage(Package)} on all the packages returned.
- *
- * @param source The source of the packages. Null for the locally installed packages.
- * @param packages The packages found in the source.
- */
- public Package[] filterLoadedSource(SdkSource source, Package[] packages);
-
- /**
- * Called by the install task for every package available (new ones, updates as well
- * as existing ones that don't have a potential update.)
- * The method should return true if this is a package that should be installed.
- * <p/>
- * <em>Important</em>: This method is called from a sub-thread, so clients who try
- * to access any UI widgets must wrap their calls into {@link Display#syncExec(Runnable)}
- * or {@link Display#asyncExec(Runnable)}.
- */
- public boolean acceptPackage(Package pkg);
-
- /**
- * Called when the accepted package has been installed, successfully or not.
- * If an already installed (aka existing) package has been accepted, this will
- * be called with a 'true' success and the actual install paths.
- * <p/>
- * <em>Important</em>: This method is called from a sub-thread, so clients who try
- * to access any UI widgets must wrap their calls into {@link Display#syncExec(Runnable)}
- * or {@link Display#asyncExec(Runnable)}.
- */
- public void setResult(boolean success, Map<Package, File> installPaths);
-
- /**
- * Called when the task is done iterating and completed.
- */
- public void taskCompleted();
- }
-
- /**
- * Creates a new PackageManager associated with the given {@link UpdaterData}
- * and using the {@link UpdaterData}'s default {@link DownloadCache}.
- *
- * @param updaterData The {@link UpdaterData}. Must not be null.
- */
- public PackageLoader(UpdaterData updaterData) {
- mUpdaterData = updaterData;
- mOverrideCache = null;
- }
-
- /**
- * Creates a new PackageManager associated with the given {@link UpdaterData}
- * but using the specified {@link DownloadCache} instead of the one from
- * {@link UpdaterData}.
- *
- * @param updaterData The {@link UpdaterData}. Must not be null.
- * @param cache The {@link DownloadCache} to use instead of the one from {@link UpdaterData}.
- */
- public PackageLoader(UpdaterData updaterData, DownloadCache cache) {
- mUpdaterData = updaterData;
- mOverrideCache = cache;
- }
-
- /**
- * Loads all packages from the remote repository.
- * This runs in an {@link ITask}. The call is blocking.
- * <p/>
- * The callback is called with each set of {@link PkgItem} found in each source.
- * The caller is responsible to accumulate the packages given to the callback
- * after each source is finished loaded. In return the callback tells the loader
- * whether to continue loading sources.
- * <p/>
- * Normally this method doesn't access the remote source if it's already
- * been loaded in the in-memory source (e.g. don't fetch twice).
- *
- * @param overrideExisting Set this to true when the caller wants to
- * check for updates and discard any existing source already
- * loaded in memory. It should be false for normal use.
- * @param sourceLoadedCallback The callback to invoke for each loaded source.
- */
- public void loadPackages(
- final boolean overrideExisting,
- final ISourceLoadedCallback sourceLoadedCallback) {
- try {
- if (mUpdaterData == null) {
- return;
- }
-
- mUpdaterData.getTaskFactory().start("Loading Sources", new ITask() {
- @Override
- public void run(ITaskMonitor monitor) {
- monitor.setProgressMax(10);
-
- // get local packages and offer them to the callback
- Package[] localPkgs =
- mUpdaterData.getInstalledPackages(monitor.createSubMonitor(1));
- if (localPkgs == null) {
- localPkgs = new Package[0];
- }
- if (!sourceLoadedCallback.onUpdateSource(null, localPkgs)) {
- return;
- }
-
- // get remote packages
- boolean forceHttp =
- mUpdaterData.getSettingsController().getSettings().getForceHttp();
- loadRemoteAddonsList(monitor.createSubMonitor(1));
-
- SdkSource[] sources = mUpdaterData.getSources().getAllSources();
- try {
- if (sources != null && sources.length > 0) {
- ITaskMonitor subMonitor = monitor.createSubMonitor(8);
- subMonitor.setProgressMax(sources.length);
- for (SdkSource source : sources) {
- Package[] pkgs = source.getPackages();
- if (pkgs == null || overrideExisting) {
- source.load(getDownloadCache(),
- subMonitor.createSubMonitor(1),
- forceHttp);
- pkgs = source.getPackages();
- }
- if (pkgs == null) {
- continue;
- }
-
- // Notify the callback a new source has finished loading.
- // If the callback requests so, stop right away.
- if (!sourceLoadedCallback.onUpdateSource(source, pkgs)) {
- return;
- }
- }
- }
- } catch(Exception e) {
- monitor.logError("Loading source failed: %1$s", e.toString());
- } finally {
- monitor.setDescription("Done loading packages.");
- }
- }
- });
- } finally {
- sourceLoadedCallback.onLoadCompleted();
- }
- }
-
- /**
- * Load packages, source by source using
- * {@link #loadPackages(boolean, ISourceLoadedCallback)},
- * and executes the given {@link IAutoInstallTask} on the current package list.
- * That is for each package known, the install task is queried to find if
- * the package is the one to be installed or updated.
- * <p/>
- * - If an already installed package is accepted by the task, it is returned. <br/>
- * - If a new package (remotely available but not installed locally) is accepted,
- * the user will be <em>prompted</em> for permission to install it. <br/>
- * - If an existing package has updates, the install task will be accept if it
- * accepts one of the updating packages, and if yes the the user will be
- * <em>prompted</em> for permission to install it. <br/>
- * <p/>
- * Only one package can be accepted, after which the task is completed.
- * There is no direct return value, {@link IAutoInstallTask#setResult} is called on the
- * result of the accepted package.
- * When the task is completed, {@link IAutoInstallTask#taskCompleted()} is called.
- * <p/>
- * <em>Important</em>: Since some UI will be displayed to install the selected package,
- * the {@link UpdaterData} must have a window {@link Shell} associated using
- * {@link UpdaterData#setWindowShell(Shell)}.
- * <p/>
- * The call is blocking. Although the name says "Task", this is not an {@link ITask}
- * running in its own thread but merely a synchronous call.
- *
- * @param installFlags Flags for installation such as
- * {@link UpdaterData#TOOLS_MSG_UPDATED_FROM_ADT}.
- * @param installTask The task to perform.
- */
- public void loadPackagesWithInstallTask(
- final int installFlags,
- final IAutoInstallTask installTask) {
-
- loadPackages(false /*overrideExisting*/, new ISourceLoadedCallback() {
- List<Archive> mArchivesToInstall = new ArrayList<Archive>();
- Map<Package, File> mInstallPaths = new HashMap<Package, File>();
-
- @Override
- public boolean onUpdateSource(SdkSource source, Package[] packages) {
- packages = installTask.filterLoadedSource(source, packages);
- if (packages == null || packages.length == 0) {
- // Tell loadPackages() to process the next source.
- return true;
- }
-
- for (Package pkg : packages) {
- if (pkg.isLocal()) {
- // This is a local (aka installed) package
- if (installTask.acceptPackage(pkg)) {
- // If the caller is accepting an installed package,
- // return a success and give the package's install path
- Archive[] a = pkg.getArchives();
- // an installed package should have one local compatible archive
- if (a.length == 1 && a[0].isCompatible()) {
- mInstallPaths.put(pkg, new File(a[0].getLocalOsPath()));
- }
- }
-
- } else {
- // This is a remote package
- if (installTask.acceptPackage(pkg)) {
- // The caller is accepting this remote package. We'll install it.
- for (Archive archive : pkg.getArchives()) {
- if (archive.isCompatible()) {
- mArchivesToInstall.add(archive);
- break;
- }
- }
- }
- }
- }
-
- // Tell loadPackages() to process the next source.
- return true;
- }
-
- @Override
- public void onLoadCompleted() {
- if (!mArchivesToInstall.isEmpty()) {
- installArchives(mArchivesToInstall);
- }
- if (mInstallPaths == null) {
- installTask.setResult(false, null);
- } else {
- installTask.setResult(true, mInstallPaths);
- }
-
- installTask.taskCompleted();
- }
-
- /**
- * Shows the UI of the install selector.
- * If the package is then actually installed, refresh the local list and
- * notify the install task of the installation path.
- *
- * @param archivesToInstall The archives to install.
- */
- private void installArchives(final List<Archive> archivesToInstall) {
- // Actually install the new archives that we just found.
- // This will display some UI so we need a shell's sync exec.
-
- final List<Archive> installedArchives = new ArrayList<Archive>();
-
- Shell shell = mUpdaterData.getWindowShell();
- if (shell != null && !shell.isDisposed()) {
- shell.getDisplay().syncExec(new Runnable() {;
- @Override
- public void run() {
- List<Archive> archives =
- mUpdaterData.updateOrInstallAll_WithGUI(
- archivesToInstall,
- true /* includeObsoletes */,
- installFlags);
-
- if (archives != null) {
- installedArchives.addAll(archives);
- }
- }
- });
- }
-
- if (installedArchives.isEmpty()) {
- // We failed to install anything.
- mInstallPaths = null;
- return;
- }
-
- // The local package list has changed, make sure to refresh it
- mUpdaterData.getSdkManager().reloadSdk(mUpdaterData.getSdkLog());
- mUpdaterData.getLocalSdkParser().clearPackages();
- final Package[] localPkgs = mUpdaterData.getInstalledPackages(
- new NullTaskMonitor(mUpdaterData.getSdkLog()));
-
- // Scan the installed package list to find the install paths.
- for (Archive installedArchive : installedArchives) {
- Package pkg = installedArchive.getParentPackage();
-
- for (Package localPkg : localPkgs) {
- if (localPkg.canBeUpdatedBy(pkg) == UpdateInfo.NOT_UPDATE) {
- Archive[] localArchive = localPkg.getArchives();
- if (localArchive.length == 1 && localArchive[0].isCompatible()) {
- mInstallPaths.put(
- localPkg,
- new File(localArchive[0].getLocalOsPath()));
- }
- }
- }
- }
- }
- });
- }
-
-
- /**
- * Loads the remote add-ons list.
- */
- public void loadRemoteAddonsList(ITaskMonitor monitor) {
-
- if (mStateFetchRemoteAddonsList != 0) {
- return;
- }
-
- mUpdaterData.getTaskFactory().start("Load Add-ons List", monitor, new ITask() {
- @Override
- public void run(ITaskMonitor subMonitor) {
- loadRemoteAddonsListInTask(subMonitor);
- }
- });
- }
-
- private void loadRemoteAddonsListInTask(ITaskMonitor monitor) {
- mStateFetchRemoteAddonsList = -1;
-
- String url = SdkAddonsListConstants.URL_ADDON_LIST;
-
- // We override SdkRepoConstants.URL_GOOGLE_SDK_SITE if this is defined
- String baseUrl = System.getenv("SDK_TEST_BASE_URL"); //$NON-NLS-1$
- if (baseUrl != null) {
- if (baseUrl.length() > 0 && baseUrl.endsWith("/")) { //$NON-NLS-1$
- if (url.startsWith(SdkRepoConstants.URL_GOOGLE_SDK_SITE)) {
- url = baseUrl + url.substring(SdkRepoConstants.URL_GOOGLE_SDK_SITE.length());
- }
- } else {
- monitor.logError("Ignoring invalid SDK_TEST_BASE_URL: %1$s", baseUrl); //$NON-NLS-1$
- }
- }
-
- if (mUpdaterData.getSettingsController().getSettings().getForceHttp()) {
- url = url.replaceAll("https://", "http://"); //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- // Hook to bypass loading 3rd party addons lists.
- boolean fetch3rdParties = System.getenv("SDK_SKIP_3RD_PARTIES") == null;
-
- AddonsListFetcher fetcher = new AddonsListFetcher();
- Site[] sites = fetcher.fetch(url, getDownloadCache(), monitor);
- if (sites != null) {
- SdkSources sources = mUpdaterData.getSources();
- sources.removeAll(SdkSourceCategory.ADDONS_3RD_PARTY);
-
- if (fetch3rdParties) {
- for (Site s : sites) {
- switch (s.getType()) {
- case ADDON_SITE:
- sources.add(SdkSourceCategory.ADDONS_3RD_PARTY,
- new SdkAddonSource(s.getUrl(), s.getUiName()));
- break;
- case SYS_IMG_SITE:
- sources.add(SdkSourceCategory.ADDONS_3RD_PARTY,
- new SdkSysImgSource(s.getUrl(), s.getUiName()));
- break;
- }
- }
- }
-
- sources.notifyChangeListeners();
-
- mStateFetchRemoteAddonsList = 1;
- }
-
- monitor.setDescription("Fetched Add-ons List successfully");
- }
-
- /**
- * Returns the {@link DownloadCache} to use.
- *
- * @return Returns {@link #mOverrideCache} if not null; otherwise returns the
- * one from {@link UpdaterData} is used instead.
- */
- private DownloadCache getDownloadCache() {
- return mOverrideCache != null ? mOverrideCache : mUpdaterData.getDownloadCache();
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/core/PackagesDiffLogic.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/core/PackagesDiffLogic.java
deleted file mode 100755
index a95c8ac..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/core/PackagesDiffLogic.java
+++ /dev/null
@@ -1,947 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository.core;
-
-import com.android.SdkConstants;
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.internal.repository.packages.ExtraPackage;
-import com.android.sdklib.internal.repository.packages.IAndroidVersionProvider;
-import com.android.sdklib.internal.repository.packages.IFullRevisionProvider;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.internal.repository.packages.Package.UpdateInfo;
-import com.android.sdklib.internal.repository.packages.PlatformPackage;
-import com.android.sdklib.internal.repository.packages.PlatformToolPackage;
-import com.android.sdklib.internal.repository.packages.SystemImagePackage;
-import com.android.sdklib.internal.repository.packages.ToolPackage;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.util.SparseArray;
-import com.android.sdkuilib.internal.repository.UpdaterData;
-import com.android.sdkuilib.internal.repository.core.PkgItem.PkgState;
-import com.android.sdkuilib.internal.repository.ui.PackagesPageIcons;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Helper class that separates the logic of package management from the UI
- * so that we can test it using head-less unit tests.
- */
-public class PackagesDiffLogic {
- private final UpdaterData mUpdaterData;
- private boolean mFirstLoadComplete = true;
-
- public PackagesDiffLogic(UpdaterData updaterData) {
- mUpdaterData = updaterData;
- }
-
- /**
- * Removes all the internal state and resets the object.
- * Useful for testing.
- */
- public void clear() {
- mFirstLoadComplete = true;
- mOpApi.clear();
- mOpSource.clear();
- }
-
- /** Return mFirstLoadComplete and resets it to false.
- * All following calls will returns false. */
- public boolean isFirstLoadComplete() {
- boolean b = mFirstLoadComplete;
- mFirstLoadComplete = false;
- return b;
- }
-
- /**
- * Mark all new and update PkgItems as checked.
- *
- * @param selectNew If true, select all new packages (except the rc/preview ones).
- * @param selectUpdates If true, select all update packages.
- * @param selectTop If true, select the top platform.
- * If the top platform has nothing installed, select all items in it (except the rc/preview);
- * If it is partially installed, at least select the platform and system images if none of
- * the system images are installed.
- * @param currentPlatform The {@link SdkConstants#currentPlatform()} value.
- */
- public void checkNewUpdateItems(
- boolean selectNew,
- boolean selectUpdates,
- boolean selectTop,
- int currentPlatform) {
- int maxApi = 0;
- Set<Integer> installedPlatforms = new HashSet<Integer>();
- SparseArray<List<PkgItem>> platformItems = new SparseArray<List<PkgItem>>();
-
- // sort items in platforms... directly deal with new/update items
- List<PkgItem> allItems = getAllPkgItems(true /*byApi*/, true /*bySource*/);
- for (PkgItem item : allItems) {
- if (!item.hasCompatibleArchive()) {
- // Ignore items that have no archive compatible with the current platform.
- continue;
- }
-
- // Get the main package's API level. We don't need to look at the updates
- // since by definition they should target the same API level.
- int api = 0;
- Package p = item.getMainPackage();
- if (p instanceof IAndroidVersionProvider) {
- api = ((IAndroidVersionProvider) p).getAndroidVersion().getApiLevel();
- }
-
- if (selectTop && api > 0) {
- // Keep track of the max api seen
- maxApi = Math.max(maxApi, api);
-
- // keep track of what platform is currently installed (that is, has at least
- // one thing installed.)
- if (item.getState() == PkgState.INSTALLED) {
- installedPlatforms.add(api);
- }
-
- // for each platform, collect all its related item for later use below.
- List<PkgItem> items = platformItems.get(api);
- if (items == null) {
- platformItems.put(api, items = new ArrayList<PkgItem>());
- }
- items.add(item);
- }
-
- if ((selectUpdates || selectNew) &&
- item.getState() == PkgState.NEW &&
- !item.getRevision().isPreview()) {
- boolean sameFound = false;
- Package newPkg = item.getMainPackage();
- if (newPkg instanceof IFullRevisionProvider) {
- // We have a potential new non-preview package; but this kind of package
- // supports having previews, which means we want to make sure we're not
- // offering an older "new" non-preview if there's a newer preview installed.
- //
- // We should get into this odd situation only when updating an RC/preview
- // by a final release pkg.
-
- IFullRevisionProvider newPkg2 = (IFullRevisionProvider) newPkg;
- for (PkgItem item2 : allItems) {
- if (item2.getState() == PkgState.INSTALLED) {
- Package installed = item2.getMainPackage();
-
- if (installed.getRevision().isPreview() &&
- newPkg2.sameItemAs(installed, true /*ignorePreviews*/)) {
- sameFound = true;
-
- if (installed.canBeUpdatedBy(newPkg) == UpdateInfo.UPDATE) {
- item.setChecked(true);
- break;
- }
- }
- }
- }
- }
-
- if (selectNew && !sameFound) {
- item.setChecked(true);
- }
-
- } else if (selectUpdates && item.hasUpdatePkg()) {
- item.setChecked(true);
- }
- }
-
- List<PkgItem> items = platformItems.get(maxApi);
- if (selectTop && maxApi > 0 && items != null) {
- if (!installedPlatforms.contains(maxApi)) {
- // If the top platform has nothing installed at all, select everything in it
- for (PkgItem item : items) {
- if ((item.getState() == PkgState.NEW && !item.getRevision().isPreview()) ||
- item.hasUpdatePkg()) {
- item.setChecked(true);
- }
- }
-
- } else {
- // The top platform has at least one thing installed.
-
- // First make sure the platform package itself is installed, or select it.
- for (PkgItem item : items) {
- Package p = item.getMainPackage();
- if (p instanceof PlatformPackage &&
- item.getState() == PkgState.NEW && !item.getRevision().isPreview()) {
- item.setChecked(true);
- break;
- }
- }
-
- // Check we have at least one system image installed, otherwise select them
- boolean hasSysImg = false;
- for (PkgItem item : items) {
- Package p = item.getMainPackage();
- if (p instanceof PlatformPackage && item.getState() == PkgState.INSTALLED) {
- if (item.hasUpdatePkg() && item.isChecked()) {
- // If the installed platform is scheduled for update, look for the
- // system image in the update package, not the current one.
- p = item.getUpdatePkg();
- if (p instanceof PlatformPackage) {
- hasSysImg = ((PlatformPackage) p).getIncludedAbi() != null;
- }
- } else {
- // Otherwise look into the currently installed platform
- hasSysImg = ((PlatformPackage) p).getIncludedAbi() != null;
- }
- if (hasSysImg) {
- break;
- }
- }
- if (p instanceof SystemImagePackage && item.getState() == PkgState.INSTALLED) {
- hasSysImg = true;
- break;
- }
- }
- if (!hasSysImg) {
- // No system image installed.
- // Try whether the current platform or its update would bring one.
-
- for (PkgItem item : items) {
- Package p = item.getMainPackage();
- if (p instanceof PlatformPackage) {
- if (item.getState() == PkgState.NEW &&
- !item.getRevision().isPreview() &&
- ((PlatformPackage) p).getIncludedAbi() != null) {
- item.setChecked(true);
- hasSysImg = true;
- } else if (item.hasUpdatePkg()) {
- p = item.getUpdatePkg();
- if (p instanceof PlatformPackage &&
- ((PlatformPackage) p).getIncludedAbi() != null) {
- item.setChecked(true);
- hasSysImg = true;
- }
- }
- }
- }
- }
- if (!hasSysImg) {
- // No system image in the platform, try a system image package
- for (PkgItem item : items) {
- Package p = item.getMainPackage();
- if (p instanceof SystemImagePackage && item.getState() == PkgState.NEW) {
- item.setChecked(true);
- }
- }
- }
- }
- }
-
- if (selectTop) {
- for (PkgItem item : getAllPkgItems(true /*byApi*/, true /*bySource*/)) {
- Package p = item.getMainPackage();
- if (p instanceof ExtraPackage &&
- item.getState() == PkgState.NEW &&
- !item.getRevision().isPreview()) {
- ExtraPackage ep = (ExtraPackage) p;
-
- // On Windows, we'll also auto-select the USB driver
- if (currentPlatform == SdkConstants.PLATFORM_WINDOWS) {
- if (ep.getVendorId().equals("google") && //$NON-NLS-1$
- ep.getPath().equals("usb_driver")) { //$NON-NLS-1$
- item.setChecked(true);
- continue;
- }
- }
-
- // On all platforms, we'll auto-select the support library.
- if (ep.getVendorId().equals("android") && //$NON-NLS-1$
- ep.getPath().equals("support")) { //$NON-NLS-1$
- item.setChecked(true);
- continue;
- }
-
- }
- }
- }
- }
-
- /**
- * Mark all PkgItems as not checked.
- */
- public void uncheckAllItems() {
- for (PkgItem item : getAllPkgItems(true /*byApi*/, true /*bySource*/)) {
- item.setChecked(false);
- }
- }
-
- /**
- * An update operation, customized to either sort by API or sort by source.
- */
- abstract class UpdateOp {
- private final Set<SdkSource> mVisitedSources = new HashSet<SdkSource>();
- private final List<PkgCategory> mCategories = new ArrayList<PkgCategory>();
- private final Set<PkgCategory> mCatsToRemove = new HashSet<PkgCategory>();
- private final Set<PkgItem> mItemsToRemove = new HashSet<PkgItem>();
- private final Map<Package, PkgItem> mUpdatesToRemove = new HashMap<Package, PkgItem>();
-
- /** Removes all internal state. */
- public void clear() {
- mVisitedSources.clear();
- mCategories.clear();
- }
-
- /** Retrieve the sorted category list. */
- public List<PkgCategory> getCategories() {
- return mCategories;
- }
-
- /** Retrieve the category key for the given package, either local or remote. */
- public abstract Object getCategoryKey(Package pkg);
-
- /** Modified {@code currentCategories} to add default categories. */
- public abstract void addDefaultCategories();
-
- /** Creates the category for the given key and returns it. */
- public abstract PkgCategory createCategory(Object catKey);
- /** Adjust attributes of an existing category. */
- public abstract void adjustCategory(PkgCategory cat, Object catKey);
-
- /** Sorts the category list (but not the items within the categories.) */
- public abstract void sortCategoryList();
-
- /** Called after items of a given category have changed. Used to sort the
- * items and/or adjust the category name. */
- public abstract void postCategoryItemsChanged();
-
- public void updateStart() {
- mVisitedSources.clear();
-
- // Note that default categories are created after the unused ones so that
- // the callback can decide whether they should be marked as unused or not.
- mCatsToRemove.clear();
- mItemsToRemove.clear();
- mUpdatesToRemove.clear();
- for (PkgCategory cat : mCategories) {
- mCatsToRemove.add(cat);
- List<PkgItem> items = cat.getItems();
- mItemsToRemove.addAll(items);
- for (PkgItem item : items) {
- if (item.hasUpdatePkg()) {
- mUpdatesToRemove.put(item.getUpdatePkg(), item);
- }
- }
- }
-
- addDefaultCategories();
- }
-
- public boolean updateSourcePackages(SdkSource source, Package[] newPackages) {
- mVisitedSources.add(source);
- if (source == null) {
- return processLocals(this, newPackages);
- } else {
- return processSource(this, source, newPackages);
- }
- }
-
- public boolean updateEnd() {
- boolean hasChanged = false;
-
- // Remove unused categories & items at the end of the update
- synchronized (mCategories) {
- for (PkgCategory unusedCat : mCatsToRemove) {
- if (mCategories.remove(unusedCat)) {
- hasChanged = true;
- }
- }
- }
-
- for (PkgCategory cat : mCategories) {
- for (Iterator<PkgItem> itemIt = cat.getItems().iterator(); itemIt.hasNext(); ) {
- PkgItem item = itemIt.next();
- if (mItemsToRemove.contains(item)) {
- itemIt.remove();
- hasChanged = true;
- } else if (item.hasUpdatePkg() &&
- mUpdatesToRemove.containsKey(item.getUpdatePkg())) {
- item.removeUpdate();
- hasChanged = true;
- }
- }
- }
-
- mCatsToRemove.clear();
- mItemsToRemove.clear();
- mUpdatesToRemove.clear();
-
- return hasChanged;
- }
-
- public boolean isKeep(PkgItem item) {
- return !mItemsToRemove.contains(item);
- }
-
- public void keep(Package pkg) {
- mUpdatesToRemove.remove(pkg);
- }
-
- public void keep(PkgItem item) {
- mItemsToRemove.remove(item);
- }
-
- public void keep(PkgCategory cat) {
- mCatsToRemove.remove(cat);
- }
-
- public void dontKeep(PkgItem item) {
- mItemsToRemove.add(item);
- }
-
- public void dontKeep(PkgCategory cat) {
- mCatsToRemove.add(cat);
- }
- }
-
- private final UpdateOpApi mOpApi = new UpdateOpApi();
- private final UpdateOpSource mOpSource = new UpdateOpSource();
-
- public List<PkgCategory> getCategories(boolean displayIsSortByApi) {
- return displayIsSortByApi ? mOpApi.getCategories() : mOpSource.getCategories();
- }
-
- public List<PkgItem> getAllPkgItems(boolean byApi, boolean bySource) {
- List<PkgItem> items = new ArrayList<PkgItem>();
-
- if (byApi) {
- List<PkgCategory> cats = getCategories(true /*displayIsSortByApi*/);
- synchronized (cats) {
- for (PkgCategory cat : cats) {
- items.addAll(cat.getItems());
- }
- }
- }
-
- if (bySource) {
- List<PkgCategory> cats = getCategories(false /*displayIsSortByApi*/);
- synchronized (cats) {
- for (PkgCategory cat : cats) {
- items.addAll(cat.getItems());
- }
- }
- }
-
- return items;
- }
-
- public void updateStart() {
- mOpApi.updateStart();
- mOpSource.updateStart();
- }
-
- public boolean updateSourcePackages(
- boolean displayIsSortByApi,
- SdkSource source,
- Package[] newPackages) {
-
- boolean apiListChanged = mOpApi.updateSourcePackages(source, newPackages);
- boolean sourceListChanged = mOpSource.updateSourcePackages(source, newPackages);
- return displayIsSortByApi ? apiListChanged : sourceListChanged;
- }
-
- public boolean updateEnd(boolean displayIsSortByApi) {
- boolean apiListChanged = mOpApi.updateEnd();
- boolean sourceListChanged = mOpSource.updateEnd();
- return displayIsSortByApi ? apiListChanged : sourceListChanged;
- }
-
-
- /** Process all local packages. Returns true if something changed. */
- private boolean processLocals(UpdateOp op, Package[] packages) {
- boolean hasChanged = false;
- List<PkgCategory> cats = op.getCategories();
- Set<PkgItem> keep = new HashSet<PkgItem>();
-
- // For all locally installed packages, check they are either listed
- // as installed or create new installed items for them.
-
- nextPkg: for (Package localPkg : packages) {
- // Check to see if we already have the exact same package
- // (type & revision) marked as installed.
- for (PkgCategory cat : cats) {
- for (PkgItem currItem : cat.getItems()) {
- if (currItem.getState() == PkgState.INSTALLED &&
- currItem.isSameMainPackageAs(localPkg)) {
- // This package is already listed as installed.
- op.keep(currItem);
- op.keep(cat);
- keep.add(currItem);
- continue nextPkg;
- }
- }
- }
-
- // If not found, create a new installed package item
- keep.add(addNewItem(op, localPkg, PkgState.INSTALLED));
- hasChanged = true;
- }
-
- // Remove installed items that we don't want to keep anymore. They would normally be
- // cleanup up in UpdateOp.updateEnd(); however it's easier to remove them before we
- // run processSource() to avoid merging updates in items that would be removed later.
-
- for (PkgCategory cat : cats) {
- for (Iterator<PkgItem> itemIt = cat.getItems().iterator(); itemIt.hasNext(); ) {
- PkgItem item = itemIt.next();
- if (item.getState() == PkgState.INSTALLED && !keep.contains(item)) {
- itemIt.remove();
- hasChanged = true;
- }
- }
- }
-
- if (hasChanged) {
- op.postCategoryItemsChanged();
- }
-
- return hasChanged;
- }
-
- /**
- * {@link PkgState}s to check in {@link #processSource(UpdateOp, SdkSource, Package[])}.
- * The order matters.
- * When installing the diff will have both the new and the installed item and we
- * need to merge with the installed one before the new one.
- */
- private final static PkgState[] PKG_STATES = { PkgState.INSTALLED, PkgState.NEW };
-
- /** Process all remote packages. Returns true if something changed. */
- private boolean processSource(UpdateOp op, SdkSource source, Package[] packages) {
- boolean hasChanged = false;
- List<PkgCategory> cats = op.getCategories();
-
- boolean enablePreviews =
- mUpdaterData.getSettingsController().getSettings().getEnablePreviews();
-
- nextPkg: for (Package newPkg : packages) {
-
- if (!enablePreviews && newPkg.getRevision().isPreview()) {
- // This is a preview and previews are not enabled. Ignore the package.
- continue nextPkg;
- }
-
- for (PkgCategory cat : cats) {
- for (PkgState state : PKG_STATES) {
- for (Iterator<PkgItem> currItemIt = cat.getItems().iterator();
- currItemIt.hasNext(); ) {
- PkgItem currItem = currItemIt.next();
- // We need to merge with installed items first. When installing
- // the diff will have both the new and the installed item and we
- // need to merge with the installed one before the new one.
- if (currItem.getState() != state) {
- continue;
- }
- // Only process current items if they represent the same item (but
- // with a different revision number) than the new package.
- Package mainPkg = currItem.getMainPackage();
- if (!mainPkg.sameItemAs(newPkg)) {
- continue;
- }
-
- // Check to see if we already have the exact same package
- // (type & revision) marked as main or update package.
- if (currItem.isSameMainPackageAs(newPkg)) {
- op.keep(currItem);
- op.keep(cat);
- continue nextPkg;
- } else if (currItem.hasUpdatePkg() &&
- currItem.isSameUpdatePackageAs(newPkg)) {
- op.keep(currItem.getUpdatePkg());
- op.keep(cat);
- continue nextPkg;
- }
-
- switch (currItem.getState()) {
- case NEW:
- if (newPkg.getRevision().compareTo(mainPkg.getRevision()) < 0) {
- if (!op.isKeep(currItem)) {
- // The new item has a lower revision than the current one,
- // but the current one hasn't been marked as being kept so
- // it's ok to downgrade it.
- currItemIt.remove();
- addNewItem(op, newPkg, PkgState.NEW);
- hasChanged = true;
- }
- } else if (newPkg.getRevision().compareTo(mainPkg.getRevision()) > 0) {
- // We have a more recent new version, remove the current one
- // and replace by a new one
- currItemIt.remove();
- addNewItem(op, newPkg, PkgState.NEW);
- hasChanged = true;
- }
- break;
- case INSTALLED:
- // if newPkg.revision<=mainPkg.revision: it's already installed, ignore.
- if (newPkg.getRevision().compareTo(mainPkg.getRevision()) > 0) {
- // This is a new update for the main package.
- if (currItem.mergeUpdate(newPkg)) {
- op.keep(currItem.getUpdatePkg());
- op.keep(cat);
- hasChanged = true;
- }
- }
- break;
- }
- continue nextPkg;
- }
- }
- }
- // If not found, create a new package item
- addNewItem(op, newPkg, PkgState.NEW);
- hasChanged = true;
- }
-
- if (hasChanged) {
- op.postCategoryItemsChanged();
- }
-
- return hasChanged;
- }
-
- private PkgItem addNewItem(UpdateOp op, Package pkg, PkgState state) {
- List<PkgCategory> cats = op.getCategories();
- Object catKey = op.getCategoryKey(pkg);
- PkgCategory cat = findCurrentCategory(cats, catKey);
-
- if (cat == null) {
- // This is a new category. Create it and add it to the list.
- cat = op.createCategory(catKey);
- synchronized (cats) {
- cats.add(cat);
- }
- op.sortCategoryList();
- } else {
- // Not a new category. Give op a chance to adjust the category attributes
- op.adjustCategory(cat, catKey);
- }
-
- PkgItem item = new PkgItem(pkg, state);
- op.keep(item);
- cat.getItems().add(item);
- op.keep(cat);
- return item;
- }
-
- private PkgCategory findCurrentCategory(
- List<PkgCategory> currentCategories,
- Object categoryKey) {
- for (PkgCategory cat : currentCategories) {
- if (cat.getKey().equals(categoryKey)) {
- return cat;
- }
- }
- return null;
- }
-
- /**
- * {@link UpdateOp} describing the Sort-by-API operation.
- */
- private class UpdateOpApi extends UpdateOp {
- @Override
- public Object getCategoryKey(Package pkg) {
- // Sort by API
-
- if (pkg instanceof IAndroidVersionProvider) {
- return ((IAndroidVersionProvider) pkg).getAndroidVersion();
-
- } else if (pkg instanceof ToolPackage || pkg instanceof PlatformToolPackage) {
- if (pkg.getRevision().isPreview()) {
- return PkgCategoryApi.KEY_TOOLS_PREVIEW;
- } else {
- return PkgCategoryApi.KEY_TOOLS;
- }
- } else {
- return PkgCategoryApi.KEY_EXTRA;
- }
- }
-
- @Override
- public void addDefaultCategories() {
- boolean needTools = true;
- boolean needExtras = true;
-
- List<PkgCategory> cats = getCategories();
- for (PkgCategory cat : cats) {
- if (cat.getKey().equals(PkgCategoryApi.KEY_TOOLS)) {
- // Mark them as no unused to prevent their removal in updateEnd().
- keep(cat);
- needTools = false;
- } else if (cat.getKey().equals(PkgCategoryApi.KEY_EXTRA)) {
- keep(cat);
- needExtras = false;
- }
- }
-
- // Always add the tools & extras categories, even if empty (unlikely anyway)
- if (needTools) {
- PkgCategoryApi acat = new PkgCategoryApi(
- PkgCategoryApi.KEY_TOOLS,
- null,
- mUpdaterData.getImageFactory().getImageByName(PackagesPageIcons.ICON_CAT_OTHER));
- synchronized (cats) {
- cats.add(acat);
- }
- }
-
- if (needExtras) {
- PkgCategoryApi acat = new PkgCategoryApi(
- PkgCategoryApi.KEY_EXTRA,
- null,
- mUpdaterData.getImageFactory().getImageByName(PackagesPageIcons.ICON_CAT_OTHER));
- synchronized (cats) {
- cats.add(acat);
- }
- }
- }
-
- @Override
- public PkgCategory createCategory(Object catKey) {
- // Create API category.
- PkgCategory cat = null;
-
- assert catKey instanceof AndroidVersion;
- AndroidVersion key = (AndroidVersion) catKey;
-
- // We should not be trying to recreate the tools or extra categories.
- assert !key.equals(PkgCategoryApi.KEY_TOOLS) && !key.equals(PkgCategoryApi.KEY_EXTRA);
-
- // We need a label for the category.
- // If we have an API level, try to get the info from the SDK Manager.
- // If we don't (e.g. when installing a new platform that isn't yet available
- // locally in the SDK Manager), it's OK we'll try to find the first platform
- // package available.
- String platformName = null;
- for (IAndroidTarget target :
- mUpdaterData.getSdkManager().getTargets()) {
- if (target.isPlatform() && key.equals(target.getVersion())) {
- platformName = target.getVersionName();
- break;
- }
- }
-
- cat = new PkgCategoryApi(
- key,
- platformName,
- mUpdaterData.getImageFactory().getImageByName(PackagesPageIcons.ICON_CAT_PLATFORM));
-
- return cat;
- }
-
- @Override
- public void adjustCategory(PkgCategory cat, Object catKey) {
- // Pass. Nothing to do for API-sorted categories
- }
-
- @Override
- public void sortCategoryList() {
- // Sort the categories list.
- // We always want categories in order tools..platforms..extras.
- // For platform, we compare in descending order (o2-o1).
- // This order is achieved by having the category keys ordered as
- // needed for the sort to just do what we expect.
-
- synchronized (getCategories()) {
- Collections.sort(getCategories(), new Comparator<PkgCategory>() {
- @Override
- public int compare(PkgCategory cat1, PkgCategory cat2) {
- assert cat1 instanceof PkgCategoryApi;
- assert cat2 instanceof PkgCategoryApi;
- assert cat1.getKey() instanceof AndroidVersion;
- assert cat2.getKey() instanceof AndroidVersion;
- AndroidVersion v1 = (AndroidVersion) cat1.getKey();
- AndroidVersion v2 = (AndroidVersion) cat2.getKey();
- return v2.compareTo(v1);
- }
- });
- }
- }
-
- @Override
- public void postCategoryItemsChanged() {
- // Sort the items
- for (PkgCategory cat : getCategories()) {
- Collections.sort(cat.getItems());
-
- // When sorting by API, we can't always get the platform name
- // from the package manager. In this case at the very end we
- // look for a potential platform package we can use to extract
- // the platform version name (e.g. '1.5') from the first suitable
- // platform package we can find.
-
- assert cat instanceof PkgCategoryApi;
- PkgCategoryApi pac = (PkgCategoryApi) cat;
- if (pac.getPlatformName() == null) {
- // Check whether we can get the actual platform version name (e.g. "1.5")
- // from the first Platform package we find in this category.
-
- for (PkgItem item : cat.getItems()) {
- Package p = item.getMainPackage();
- if (p instanceof PlatformPackage) {
- String platformName = ((PlatformPackage) p).getVersionName();
- if (platformName != null) {
- pac.setPlatformName(platformName);
- break;
- }
- }
- }
- }
- }
-
- }
- }
-
- /**
- * {@link UpdateOp} describing the Sort-by-Source operation.
- */
- private class UpdateOpSource extends UpdateOp {
-
- @Override
- public boolean updateSourcePackages(SdkSource source, Package[] newPackages) {
- // When displaying the repo by source, we want to create all the
- // categories so that they can appear on the UI even if empty.
- if (source != null) {
- List<PkgCategory> cats = getCategories();
- Object catKey = source;
- PkgCategory cat = findCurrentCategory(cats, catKey);
-
- if (cat == null) {
- // This is a new category. Create it and add it to the list.
- cat = createCategory(catKey);
- synchronized (cats) {
- cats.add(cat);
- }
- sortCategoryList();
- }
-
- keep(cat);
- }
-
- return super.updateSourcePackages(source, newPackages);
- }
-
- @Override
- public Object getCategoryKey(Package pkg) {
- // Sort by source
- SdkSource source = pkg.getParentSource();
- if (source == null) {
- return PkgCategorySource.UNKNOWN_SOURCE;
- }
- return source;
- }
-
- @Override
- public void addDefaultCategories() {
- List<PkgCategory> cats = getCategories();
- for (PkgCategory cat : cats) {
- if (cat.getKey().equals(PkgCategorySource.UNKNOWN_SOURCE)) {
- // Already present.
- return;
- }
- }
-
- // Always add the local categories, even if empty (unlikely anyway)
- PkgCategorySource cat = new PkgCategorySource(
- PkgCategorySource.UNKNOWN_SOURCE,
- mUpdaterData);
- // Mark it so that it can be cleared in updateEnd() if not used.
- dontKeep(cat);
- synchronized (cats) {
- cats.add(cat);
- }
- }
-
- /**
- * Create a new source category.
- * <p/>
- * One issue is that local archives are processed first and we don't have the
- * full source information on them (e.g. we know the referral URL but not
- * the referral name of the site).
- * In this case this will just create {@link PkgCategorySource} where the label isn't
- * known yet.
- */
- @Override
- public PkgCategory createCategory(Object catKey) {
- assert catKey instanceof SdkSource;
- PkgCategory cat = new PkgCategorySource((SdkSource) catKey, mUpdaterData);
- return cat;
- }
-
- /**
- * Checks whether the category needs to be adjust.
- * As mentioned in {@link #createCategory(Object)}, local archives are processed
- * first and result in a {@link PkgCategorySource} where the label isn't known.
- * Once we process the external source with the actual name, we'll update it.
- */
- @Override
- public void adjustCategory(PkgCategory cat, Object catKey) {
- assert cat instanceof PkgCategorySource;
- assert catKey instanceof SdkSource;
- if (cat instanceof PkgCategorySource) {
- ((PkgCategorySource) cat).adjustLabel((SdkSource) catKey);
- }
- }
-
- @Override
- public void sortCategoryList() {
- // Sort the sources in ascending source name order,
- // with the local packages always first.
-
- synchronized (getCategories()) {
- Collections.sort(getCategories(), new Comparator<PkgCategory>() {
- @Override
- public int compare(PkgCategory cat1, PkgCategory cat2) {
- assert cat1 instanceof PkgCategorySource;
- assert cat2 instanceof PkgCategorySource;
-
- SdkSource src1 = ((PkgCategorySource) cat1).getSource();
- SdkSource src2 = ((PkgCategorySource) cat2).getSource();
-
- if (src1 == src2) {
- return 0;
- } else if (src1 == PkgCategorySource.UNKNOWN_SOURCE) {
- return -1;
- } else if (src2 == PkgCategorySource.UNKNOWN_SOURCE) {
- return 1;
- }
- assert src1 != null; // true because LOCAL_SOURCE==null
- assert src2 != null;
- return src1.toString().compareTo(src2.toString());
- }
- });
- }
- }
-
- @Override
- public void postCategoryItemsChanged() {
- // Sort the items
- for (PkgCategory cat : getCategories()) {
- Collections.sort(cat.getItems());
- }
- }
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/core/PkgCategory.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/core/PkgCategory.java
deleted file mode 100755
index a08b6ef..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/core/PkgCategory.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository.core;
-
-
-import java.util.ArrayList;
-import java.util.List;
-
-public abstract class PkgCategory {
- private final Object mKey;
- private final Object mIconRef;
- private final List<PkgItem> mItems = new ArrayList<PkgItem>();
- private String mLabel;
-
- public PkgCategory(Object key, String label, Object iconRef) {
- mKey = key;
- mLabel = label;
- mIconRef = iconRef;
- }
-
- public Object getKey() {
- return mKey;
- }
-
- public String getLabel() {
- return mLabel;
- }
-
- public void setLabel(String label) {
- mLabel = label;
- }
-
- public Object getIconRef() {
- return mIconRef;
- }
-
- public List<PkgItem> getItems() {
- return mItems;
- }
-
- @Override
- public String toString() {
- return String.format("%s <key=%s, label=%s, #items=%d>",
- this.getClass().getSimpleName(),
- mKey == null ? "null" : mKey.toString(),
- mLabel,
- mItems.size());
- }
-
- /** {@link PkgCategory}s are equal if their internal keys are equal. */
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((mKey == null) ? 0 : mKey.hashCode());
- return result;
- }
-
- /** {@link PkgCategory}s are equal if their internal keys are equal. */
- @Override
- public boolean equals(Object obj) {
- if (this == obj) return true;
- if (obj == null) return false;
- if (getClass() != obj.getClass()) return false;
- PkgCategory other = (PkgCategory) obj;
- if (mKey == null) {
- if (other.mKey != null) return false;
- } else if (!mKey.equals(other.mKey)) return false;
- return true;
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/core/PkgCategoryApi.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/core/PkgCategoryApi.java
deleted file mode 100755
index aff11e5..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/core/PkgCategoryApi.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository.core;
-
-import com.android.sdklib.AndroidVersion;
-
-
-public class PkgCategoryApi extends PkgCategory {
-
- /** Platform name, in the form "Android 1.2". Can be null if we don't have the name. */
- private String mPlatformName;
-
- // When sorting by Source, key is the hash of the source's name.
- // When storing by API, key is the AndroidVersion (API level >=1 + optional codename).
- // We always want categories in order tools..platforms..extras; to achieve that tools
- // and extras have the special values so they get "naturally" sorted the way we want
- // them.
- // (Note: don't use integer.max to avoid integers wrapping in comparisons. We can
- // revisit the day we get 2^30 platforms.)
- public final static AndroidVersion KEY_TOOLS = new AndroidVersion(Integer.MAX_VALUE / 2, null);
- public final static AndroidVersion KEY_TOOLS_PREVIEW =
- new AndroidVersion(Integer.MAX_VALUE / 2 - 1, null);
- public final static AndroidVersion KEY_EXTRA = new AndroidVersion(-1, null);
-
- public PkgCategoryApi(AndroidVersion version, String platformName, Object iconRef) {
- super(version, null /*label*/, iconRef);
- setPlatformName(platformName);
- }
-
- public String getPlatformName() {
- return mPlatformName;
- }
-
- public void setPlatformName(String platformName) {
- if (platformName != null) {
- // Normal case for actual platform categories
- mPlatformName = String.format("Android %1$s", platformName);
- super.setLabel(null);
- }
- }
-
- public String getApiLabel() {
- AndroidVersion key = (AndroidVersion) getKey();
- if (key.equals(KEY_TOOLS)) {
- return "TOOLS"; //$NON-NLS-1$ // for internal debug use only
- } else if (key.equals(KEY_TOOLS_PREVIEW)) {
- return "TOOLS-PREVIEW"; //$NON-NLS-1$ // for internal debug use only
- } else if (key.equals(KEY_EXTRA)) {
- return "EXTRAS"; //$NON-NLS-1$ // for internal debug use only
- } else {
- return key.toString();
- }
- }
-
- @Override
- public String getLabel() {
- String label = super.getLabel();
- if (label == null) {
- AndroidVersion key = (AndroidVersion) getKey();
-
- if (key.equals(KEY_TOOLS)) {
- label = "Tools";
- } else if (key.equals(KEY_TOOLS_PREVIEW)) {
- label = "Tools (Preview Channel)";
- } else if (key.equals(KEY_EXTRA)) {
- label = "Extras";
- } else {
- if (mPlatformName != null) {
- label = String.format("%1$s (%2$s)", mPlatformName, getApiLabel());
- } else {
- label = getApiLabel();
- }
- }
- super.setLabel(label);
- }
- return label;
- }
-
- @Override
- public void setLabel(String label) {
- throw new UnsupportedOperationException("Use setPlatformName() instead.");
- }
-
- @Override
- public String toString() {
- return String.format("%s <API=%s, label=%s, #items=%d>",
- this.getClass().getSimpleName(),
- getApiLabel(),
- getLabel(),
- getItems().size());
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/core/PkgCategorySource.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/core/PkgCategorySource.java
deleted file mode 100755
index b73288b..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/core/PkgCategorySource.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository.core;
-
-import com.android.sdklib.internal.repository.sources.SdkRepoSource;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdkuilib.internal.repository.UpdaterData;
-import com.android.sdkuilib.internal.repository.ui.PackagesPageIcons;
-
-
-public class PkgCategorySource extends PkgCategory {
-
- /**
- * A special {@link SdkSource} object that represents the locally installed
- * items, or more exactly a lack of remote source.
- */
- public final static SdkSource UNKNOWN_SOURCE =
- new SdkRepoSource("http://no.source", "Local Packages");
- private final SdkSource mSource;
-
- /**
- * Creates a new {@link PkgCategorySource}.
- * This uses {@link SdkSource#toString()} to get the source's description.
- * Note that if the name of the source isn't known, the description will use its URL.
- */
- public PkgCategorySource(SdkSource source, UpdaterData updaterData) {
- super(
- source, // the source is the key and it can be null
- source == UNKNOWN_SOURCE ? "Local Packages" : source.toString(),
- source == UNKNOWN_SOURCE ?
- updaterData.getImageFactory().getImageByName(PackagesPageIcons.ICON_PKG_INSTALLED) :
- source);
- mSource = source;
- }
-
- @Override
- public String toString() {
- return String.format("%s <source=%s, #items=%d>",
- this.getClass().getSimpleName(),
- mSource.toString(),
- getItems().size());
- }
-
- public SdkSource getSource() {
- return mSource;
- }
-
- /** Sets the label to match the source's UI name if the label wasn't already set. */
- public void adjustLabel(SdkSource source) {
- if (getLabel() == null || getLabel().startsWith("http")) { //$NON-NLS-1$
- setLabel(source == UNKNOWN_SOURCE ? "Local Packages" : source.toString());
- }
- }
-
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/core/PkgContentProvider.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/core/PkgContentProvider.java
deleted file mode 100755
index 8adf428..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/core/PkgContentProvider.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository.core;
-
-import com.android.sdklib.internal.repository.IDescription;
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdkuilib.internal.repository.ui.PackagesPage;
-
-import org.eclipse.jface.viewers.IInputProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Content provider for the main tree view in {@link PackagesPage}.
- */
-public class PkgContentProvider implements ITreeContentProvider {
-
- private final IInputProvider mViewer;
- private boolean mDisplayArchives;
-
- public PkgContentProvider(IInputProvider viewer) {
- mViewer = viewer;
- }
-
- public void setDisplayArchives(boolean displayArchives) {
- mDisplayArchives = displayArchives;
- }
-
- @Override
- public Object[] getChildren(Object parentElement) {
- if (parentElement instanceof ArrayList<?>) {
- return ((ArrayList<?>) parentElement).toArray();
-
- } else if (parentElement instanceof PkgCategorySource) {
- return getSourceChildren((PkgCategorySource) parentElement);
-
- } else if (parentElement instanceof PkgCategory) {
- return ((PkgCategory) parentElement).getItems().toArray();
-
- } else if (parentElement instanceof PkgItem) {
- if (mDisplayArchives) {
-
- Package pkg = ((PkgItem) parentElement).getUpdatePkg();
-
- // Display update packages as sub-items if the details mode is activated.
- if (pkg != null) {
- return new Object[] { pkg };
- }
-
- return ((PkgItem) parentElement).getArchives();
- }
-
- } else if (parentElement instanceof Package) {
- if (mDisplayArchives) {
- return ((Package) parentElement).getArchives();
- }
-
- }
-
- return new Object[0];
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public Object getParent(Object element) {
- // This operation is expensive, so we do the minimum
- // and don't try to cover all cases.
-
- if (element instanceof PkgItem) {
- Object input = mViewer.getInput();
- if (input != null) {
- for (PkgCategory cat : (List<PkgCategory>) input) {
- if (cat.getItems().contains(element)) {
- return cat;
- }
- }
- }
- }
-
- return null;
- }
-
- @Override
- public boolean hasChildren(Object parentElement) {
- if (parentElement instanceof ArrayList<?>) {
- return true;
-
- } else if (parentElement instanceof PkgCategory) {
- return true;
-
- } else if (parentElement instanceof PkgItem) {
- if (mDisplayArchives) {
- Package pkg = ((PkgItem) parentElement).getUpdatePkg();
-
- // Display update packages as sub-items if the details mode is activated.
- if (pkg != null) {
- return true;
- }
-
- Archive[] archives = ((PkgItem) parentElement).getArchives();
- return archives.length > 0;
- }
- } else if (parentElement instanceof Package) {
- if (mDisplayArchives) {
- return ((Package) parentElement).getArchives().length > 0;
- }
- }
-
- return false;
- }
-
- @Override
- public Object[] getElements(Object inputElement) {
- return getChildren(inputElement);
- }
-
- @Override
- public void dispose() {
- // unused
-
- }
-
- @Override
- public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
- // unused
- }
-
-
- private Object[] getSourceChildren(PkgCategorySource parentElement) {
- List<?> children = parentElement.getItems();
-
- SdkSource source = parentElement.getSource();
- IDescription error = null;
- IDescription empty = null;
-
- String errStr = source.getFetchError();
- if (errStr != null) {
- error = new RepoSourceError(source);
- }
- if (!source.isEnabled() || children.isEmpty()) {
- empty = new RepoSourceNotification(source);
- }
-
- if (error != null || empty != null) {
- ArrayList<Object> children2 = new ArrayList<Object>();
- if (error != null) {
- children2.add(error);
- }
- if (empty != null) {
- children2.add(empty);
- }
- children2.addAll(children);
- children = children2;
- }
-
- return children.toArray();
- }
-
-
- /**
- * A dummy entry returned for sources which had load errors.
- * It displays a summary of the error as its short description or
- * it displays the source's long description.
- */
- public static class RepoSourceError implements IDescription {
-
- private final SdkSource mSource;
-
- public RepoSourceError(SdkSource source) {
- mSource = source;
- }
-
- @Override
- public String getLongDescription() {
- return mSource.getLongDescription();
- }
-
- @Override
- public String getShortDescription() {
- return mSource.getFetchError();
- }
- }
-
- /**
- * A dummy entry returned for sources with no packages.
- * We need that to force the SWT tree to display an open/close triangle
- * even for empty sources.
- */
- public static class RepoSourceNotification implements IDescription {
-
- private final SdkSource mSource;
-
- public RepoSourceNotification(SdkSource source) {
- mSource = source;
- }
-
- @Override
- public String getLongDescription() {
- if (mSource.isEnabled()) {
- return mSource.getLongDescription();
- } else {
- return "Loading from this site has been disabled. " +
- "To enable it, use Tools > Manage Add-ons Sites.";
- }
- }
-
- @Override
- public String getShortDescription() {
- if (mSource.isEnabled()) {
- return "No packages found.";
- } else {
- return "This site is disabled. ";
- }
- }
- }
-
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/core/PkgItem.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/core/PkgItem.java
deleted file mode 100755
index cac43e4..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/core/PkgItem.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository.core;
-
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.packages.FullRevision;
-import com.android.sdklib.internal.repository.packages.IAndroidVersionProvider;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.internal.repository.packages.Package.UpdateInfo;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-
-/**
- * A {@link PkgItem} represents one main {@link Package} combined with its state
- * and an optional update package.
- * <p/>
- * The main package is final and cannot change since it's what "defines" this PkgItem.
- * The state or update package can change later.
- */
-public class PkgItem implements Comparable<PkgItem> {
- private final PkgState mState;
- private final Package mMainPkg;
- private Package mUpdatePkg;
- private boolean mChecked;
-
- /**
- * The state of the a given {@link PkgItem}, that is the relationship between
- * a given remote package and the local repository.
- */
- public enum PkgState {
- // Implementation detail: if this is changed then PackageDiffLogic#STATES
- // and PackageDiffLogic#processSource() need to be changed accordingly.
-
- /**
- * Package is locally installed and may or may not have an update.
- */
- INSTALLED,
-
- /**
- * There's a new package available on the remote site that isn't installed locally.
- */
- NEW
- }
-
- /**
- * Create a new {@link PkgItem} for this main package.
- * The main package is final and cannot change since it's what "defines" this PkgItem.
- * The state or update package can change later.
- */
- public PkgItem(Package mainPkg, PkgState state) {
- mMainPkg = mainPkg;
- mState = state;
- assert mMainPkg != null;
- }
-
- public boolean isObsolete() {
- return mMainPkg.isObsolete();
- }
-
- public boolean isChecked() {
- return mChecked;
- }
-
- public void setChecked(boolean checked) {
- mChecked = checked;
- }
-
- public Package getUpdatePkg() {
- return mUpdatePkg;
- }
-
- public boolean hasUpdatePkg() {
- return mUpdatePkg != null;
- }
-
- public String getName() {
- return mMainPkg.getListDescription();
- }
-
- public FullRevision getRevision() {
- return mMainPkg.getRevision();
- }
-
- public String getDescription() {
- return mMainPkg.getDescription();
- }
-
- public Package getMainPackage() {
- return mMainPkg;
- }
-
- public PkgState getState() {
- return mState;
- }
-
- public SdkSource getSource() {
- return mMainPkg.getParentSource();
- }
-
- public int getApi() {
- return mMainPkg instanceof IAndroidVersionProvider ?
- ((IAndroidVersionProvider) mMainPkg).getAndroidVersion().getApiLevel() :
- -1;
- }
-
- public Archive[] getArchives() {
- return mMainPkg.getArchives();
- }
-
- @Override
- public int compareTo(PkgItem pkg) {
- return getMainPackage().compareTo(pkg.getMainPackage());
- }
-
- /**
- * Returns true if this package or its updating packages contains
- * the exact given archive.
- * Important: This compares object references, not object equality.
- */
- public boolean hasArchive(Archive archive) {
- if (mMainPkg.hasArchive(archive)) {
- return true;
- }
- if (mUpdatePkg != null && mUpdatePkg.hasArchive(archive)) {
- return true;
- }
- return false;
- }
-
- /**
- * Returns true if the main package has at least one archive
- * compatible with the current platform.
- */
- public boolean hasCompatibleArchive() {
- return mMainPkg.hasCompatibleArchive();
- }
-
- /**
- * Checks whether the main packages are of the same type and are
- * not an update of each other and have the same revision number.
- */
- public boolean isSameMainPackageAs(Package pkg) {
- if (mMainPkg.canBeUpdatedBy(pkg) == UpdateInfo.NOT_UPDATE) {
- // package revision numbers must match
- return mMainPkg.getRevision().equals(pkg.getRevision());
- }
- return false;
- }
-
- /**
- * Checks whether the update packages are of the same type and are
- * not an update of each other and have the same revision numbers.
- */
- public boolean isSameUpdatePackageAs(Package pkg) {
- if (mUpdatePkg != null && mUpdatePkg.canBeUpdatedBy(pkg) == UpdateInfo.NOT_UPDATE) {
- // package revision numbers must match
- return mUpdatePkg.getRevision().equals(pkg.getRevision());
- }
- return false;
- }
-
- /**
- * Checks whether too {@link PkgItem} are the same.
- * This checks both items have the same state, both main package are similar
- * and that they have the same updating packages.
- */
- public boolean isSameItemAs(PkgItem item) {
- if (this == item) {
- return true;
- }
- boolean same = this.mState == item.mState;
- if (same) {
- same = isSameMainPackageAs(item.getMainPackage());
- }
-
- if (same) {
- // check updating packages are the same
- Package p1 = this.mUpdatePkg;
- Package p2 = item.getUpdatePkg();
- same = (p1 == p2) || (p1 == null && p2 == null) || (p1 != null && p2 != null);
-
- if (same && p1 != null) {
- same = p1.canBeUpdatedBy(p2) == UpdateInfo.NOT_UPDATE;
- }
- }
-
- return same;
- }
-
- /**
- * Equality is defined as {@link #isSameItemAs(PkgItem)}: state, main package
- * and update package must be the similar.
- */
- @Override
- public boolean equals(Object obj) {
- return (obj instanceof PkgItem) && this.isSameItemAs((PkgItem) obj);
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((mState == null) ? 0 : mState.hashCode());
- result = prime * result + ((mMainPkg == null) ? 0 : mMainPkg.hashCode());
- result = prime * result + ((mUpdatePkg == null) ? 0 : mUpdatePkg.hashCode());
- return result;
- }
-
- /**
- * Check whether the 'pkg' argument is an update for this package.
- * If it is, record it as an updating package.
- * If there's already an updating package, only keep the most recent update.
- * Returns true if it is update (even if there was already an update and this
- * ended up not being the most recent), false if incompatible or not an update.
- *
- * This should only be used for installed packages.
- */
- public boolean mergeUpdate(Package pkg) {
- if (mUpdatePkg == pkg) {
- return true;
- }
- if (mMainPkg.canBeUpdatedBy(pkg) == UpdateInfo.UPDATE) {
- if (mUpdatePkg == null) {
- mUpdatePkg = pkg;
- } else if (mUpdatePkg.canBeUpdatedBy(pkg) == UpdateInfo.UPDATE) {
- // If we have more than one, keep only the most recent update
- mUpdatePkg = pkg;
- }
- return true;
- }
-
- return false;
- }
-
- public void removeUpdate() {
- mUpdatePkg = null;
- }
-
- /** Returns a string representation of this item, useful when debugging. */
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append('<');
-
- if (mChecked) {
- sb.append(" * "); //$NON-NLS-1$
- }
-
- sb.append(mState.toString());
-
- if (mMainPkg != null) {
- sb.append(", pkg:"); //$NON-NLS-1$
- sb.append(mMainPkg.toString());
- }
-
- if (mUpdatePkg != null) {
- sb.append(", updated by:"); //$NON-NLS-1$
- sb.append(mUpdatePkg.toString());
- }
-
- sb.append('>');
- return sb.toString();
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/core/SdkLogAdapter.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/core/SdkLogAdapter.java
deleted file mode 100755
index 5f24030..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/core/SdkLogAdapter.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository.core;
-
-import com.android.sdkuilib.internal.tasks.ILogUiProvider;
-import com.android.utils.ILogger;
-
-
-/**
- * Adapter that transform log from an {@link ILogUiProvider} to an {@link ILogger}.
- */
-public final class SdkLogAdapter implements ILogUiProvider {
-
- private ILogger mSdkLog;
- private String mLastLogMsg;
-
- /**
- * Creates a new adapter to output log on the given {@code sdkLog}.
- *
- * @param sdkLog The logger to output to. Must not be null.
- */
- public SdkLogAdapter(ILogger sdkLog) {
- mSdkLog = sdkLog;
- }
-
- /**
- * Sets the description in the current task dialog.
- * This method can be invoked from a non-UI thread.
- */
- @Override
- public void setDescription(final String description) {
- if (acceptLog(description)) {
- mSdkLog.info("%1$s", description); //$NON-NLS-1$
- }
- }
-
- /**
- * Logs a "normal" information line.
- * This method can be invoked from a non-UI thread.
- */
- @Override
- public void log(String log) {
- if (acceptLog(log)) {
- mSdkLog.info(" %1$s", log); //$NON-NLS-1$
- }
- }
-
- /**
- * Logs an "error" information line.
- * This method can be invoked from a non-UI thread.
- */
- @Override
- public void logError(String log) {
- if (acceptLog(log)) {
- mSdkLog.error(null, " %1$s", log); //$NON-NLS-1$
- }
- }
-
- /**
- * Logs a "verbose" information line, that is extra details which are typically
- * not that useful for the end-user and might be hidden until explicitly shown.
- * This method can be invoked from a non-UI thread.
- */
- @Override
- public void logVerbose(String log) {
- if (acceptLog(log)) {
- mSdkLog.verbose(" %1$s", log); //$NON-NLS-1$
- }
- }
-
- // ----
-
- /**
- * Filter messages displayed in the log: <br/>
- * - Messages with a % are typical part of a progress update and shouldn't be in the log. <br/>
- * - Messages that are the same as the same output message should be output a second time.
- *
- * @param msg The potential log line to print.
- * @return True if the log line should be printed, false otherwise.
- */
- private boolean acceptLog(String msg) {
- if (msg == null) {
- return false;
- }
-
- msg = msg.trim();
- if (msg.indexOf('%') != -1) {
- return false;
- }
-
- if (msg.equals(mLastLogMsg)) {
- return false;
- }
-
- mLastLogMsg = msg;
- return true;
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/ImageFactory.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/ImageFactory.java
deleted file mode 100755
index ab84cc2..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/ImageFactory.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository.icons;
-
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.internal.repository.sources.SdkSourceCategory;
-import com.android.sdkuilib.internal.repository.core.PkgContentProvider;
-
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Locale;
-import java.util.Map;
-
-
-/**
- * An utility class to serve {@link Image} correspond to the various icons
- * present in this package and dispose of them correctly at the end.
- */
-public class ImageFactory {
-
- private final Display mDisplay;
- private final Map<String, Image> mImages = new HashMap<String, Image>();
-
- public ImageFactory(Display display) {
- mDisplay = display;
- }
-
- /**
- * Loads an image given its filename (with its extension).
- * Might return null if the image cannot be loaded.
- * The image is cached. Successive calls will return the <em>same</em> object.
- *
- * @param imageName The filename (with extension) of the image to load.
- * @return A new or existing {@link Image}. The caller must NOT dispose the image (the
- * image will disposed by {@link #dispose()}). The returned image can be null if the
- * expected file is missing.
- */
- public Image getImageByName(String imageName) {
-
- Image image = mImages.get(imageName);
- if (image != null) {
- return image;
- }
-
- InputStream stream = getClass().getResourceAsStream(imageName);
- if (stream != null) {
- try {
- image = new Image(mDisplay, stream);
- } catch (SWTException e) {
- // ignore
- } catch (IllegalArgumentException e) {
- // ignore
- }
- }
-
- // Store the image in the hash, even if this failed. If it fails now, it will fail later.
- mImages.put(imageName, image);
-
- return image;
- }
-
- /**
- * Loads and returns the appropriate image for a given package, archive or source object.
- * The image is cached. Successive calls will return the <em>same</em> object.
- *
- * @param object A {@link SdkSource} or {@link Package} or {@link Archive}.
- * @return A new or existing {@link Image}. The caller must NOT dispose the image (the
- * image will disposed by {@link #dispose()}). The returned image can be null if the
- * object is of an unknown type.
- */
- public Image getImageForObject(Object object) {
-
- if (object == null) {
- return null;
- }
-
- if (object instanceof Image) {
- return (Image) object;
- }
-
- String clz = object.getClass().getSimpleName();
- if (clz.endsWith(Package.class.getSimpleName())) {
- String name = clz.replaceFirst(Package.class.getSimpleName(), "") //$NON-NLS-1$
- .replace("SystemImage", "sysimg") //$NON-NLS-1$ //$NON-NLS-2$
- .toLowerCase(Locale.US);
- name += "_pkg_16.png"; //$NON-NLS-1$
- return getImageByName(name);
- }
-
- if (object instanceof SdkSourceCategory) {
- return getImageByName("source_cat_icon_16.png"); //$NON-NLS-1$
-
- } else if (object instanceof SdkSource) {
- return getImageByName("source_icon_16.png"); //$NON-NLS-1$
-
- } else if (object instanceof PkgContentProvider.RepoSourceError) {
- return getImageByName("error_icon_16.png"); //$NON-NLS-1$
-
- } else if (object instanceof PkgContentProvider.RepoSourceNotification) {
- return getImageByName("nopkg_icon_16.png"); //$NON-NLS-1$
- }
-
- if (object instanceof Archive) {
- if (((Archive) object).isCompatible()) {
- return getImageByName("archive_icon16.png"); //$NON-NLS-1$
- } else {
- return getImageByName("incompat_icon16.png"); //$NON-NLS-1$
- }
- }
-
- if (object instanceof String) {
- return getImageByName((String) object);
- }
-
-
- if (object != null) {
- // For debugging
- // System.out.println("No image for object " + object.getClass().getSimpleName());
- }
-
- return null;
- }
-
- /**
- * Dispose all the images created by this factory so far.
- */
- public void dispose() {
- Iterator<Image> it = mImages.values().iterator();
- while(it.hasNext()) {
- Image img = it.next();
- if (img != null && img.isDisposed() == false) {
- img.dispose();
- }
- it.remove();
- }
- }
-
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/accept_icon16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/accept_icon16.png
deleted file mode 100755
index a9483fb..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/accept_icon16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/addon_pkg_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/addon_pkg_16.png
deleted file mode 100755
index ca6a231..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/addon_pkg_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/android_icon_128.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/android_icon_128.png
deleted file mode 100644
index 830c04b..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/android_icon_128.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/android_icon_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/android_icon_16.png
deleted file mode 100644
index 08ffda8..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/android_icon_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/archive_icon16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/archive_icon16.png
deleted file mode 100755
index be5edd7..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/archive_icon16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/broken_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/broken_16.png
deleted file mode 100755
index 945d871..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/broken_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/broken_pkg_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/broken_pkg_16.png
deleted file mode 100755
index 6daa67b..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/broken_pkg_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/devman_generic_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/devman_generic_16.png
deleted file mode 100755
index 6f59cd4..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/devman_generic_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/devman_manufacturer_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/devman_manufacturer_16.png
deleted file mode 100755
index 422276d..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/devman_manufacturer_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/devman_user_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/devman_user_16.png
deleted file mode 100755
index f8a173c..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/devman_user_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/doc_pkg_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/doc_pkg_16.png
deleted file mode 100755
index 186b3b1..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/doc_pkg_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/error_icon_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/error_icon_16.png
deleted file mode 100755
index ccb4d0a..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/error_icon_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/extra_pkg_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/extra_pkg_16.png
deleted file mode 100755
index a6529f0..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/extra_pkg_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/incompat_icon16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/incompat_icon16.png
deleted file mode 100755
index 2a307e9..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/incompat_icon16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/log_off_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/log_off_16.png
deleted file mode 100755
index c9d7cb7..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/log_off_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/log_on_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/log_on_16.png
deleted file mode 100755
index 58f4195..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/log_on_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/nopkg_icon_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/nopkg_icon_16.png
deleted file mode 100755
index 147837f..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/nopkg_icon_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/pkg_incompat_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/pkg_incompat_16.png
deleted file mode 100755
index 7ef989e..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/pkg_incompat_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/pkg_installed_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/pkg_installed_16.png
deleted file mode 100755
index 78b7e5a..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/pkg_installed_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/pkg_new_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/pkg_new_16.png
deleted file mode 100755
index 0976ad4..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/pkg_new_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/pkg_update_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/pkg_update_16.png
deleted file mode 100755
index e766251..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/pkg_update_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/pkgcat_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/pkgcat_16.png
deleted file mode 100755
index cd9b807..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/pkgcat_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/pkgcat_other_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/pkgcat_other_16.png
deleted file mode 100755
index 395a240..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/pkgcat_other_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/platform_pkg_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/platform_pkg_16.png
deleted file mode 100755
index 0b0744b..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/platform_pkg_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/platformtool_pkg_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/platformtool_pkg_16.png
deleted file mode 100755
index 8bb0bb3..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/platformtool_pkg_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/reject_icon16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/reject_icon16.png
deleted file mode 100755
index b87bbc9..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/reject_icon16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/sample_pkg_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/sample_pkg_16.png
deleted file mode 100755
index 8d31865..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/sample_pkg_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/sdkman_logo_128.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/sdkman_logo_128.png
deleted file mode 100644
index 0f1670d..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/sdkman_logo_128.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/source_cat_icon_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/source_cat_icon_16.png
deleted file mode 100755
index 13c8bb3..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/source_cat_icon_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/source_icon_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/source_icon_16.png
deleted file mode 100755
index 5eb1ead..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/source_icon_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/source_pkg_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/source_pkg_16.png
deleted file mode 100755
index 9992cda..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/source_pkg_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/status_ok_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/status_ok_16.png
deleted file mode 100755
index eeb0a6f..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/status_ok_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/stop_disabled_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/stop_disabled_16.png
deleted file mode 100755
index ae6da31..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/stop_disabled_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/stop_enabled_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/stop_enabled_16.png
deleted file mode 100755
index 7ce1864..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/stop_enabled_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/sysimg_pkg_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/sysimg_pkg_16.png
deleted file mode 100755
index 7795c2c..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/sysimg_pkg_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/tool_pkg_16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/tool_pkg_16.png
deleted file mode 100755
index 8ca7710..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/tool_pkg_16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/unknown_icon16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/unknown_icon16.png
deleted file mode 100755
index 1b97eb7..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/unknown_icon16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/warning_icon16.png b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/warning_icon16.png
deleted file mode 100755
index ca3b6ed..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/icons/warning_icon16.png
+++ /dev/null
Binary files differ
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/AddonSitesDialog.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/AddonSitesDialog.java
deleted file mode 100755
index 77f82b1..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/AddonSitesDialog.java
+++ /dev/null
@@ -1,574 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository.ui;
-
-import com.android.sdklib.internal.repository.sources.SdkAddonSource;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.internal.repository.sources.SdkSourceCategory;
-import com.android.sdklib.internal.repository.sources.SdkSourceProperties;
-import com.android.sdklib.internal.repository.sources.SdkSources;
-import com.android.sdklib.internal.repository.sources.SdkSysImgSource;
-import com.android.sdklib.repository.SdkSysImgConstants;
-import com.android.sdkuilib.internal.repository.UpdaterBaseDialog;
-import com.android.sdkuilib.internal.repository.UpdaterData;
-import com.android.sdkuilib.ui.GridDataBuilder;
-import com.android.sdkuilib.ui.GridLayoutBuilder;
-
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.MessageBox;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.swt.widgets.TabItem;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-
-/**
- * Dialog that displays 2 tabs: <br/>
- * - one tab with the list of extra add-ons sites defined by the user. <br/>
- * - one tab with the list of 3rd-party add-ons currently available, which the user can
- * deactivate to prevent from loading them.
- */
-public class AddonSitesDialog extends UpdaterBaseDialog {
-
- private final SdkSources mSources;
- private Table mUserTable;
- private TableViewer mUserTableViewer;
- private CheckboxTableViewer mSitesTableViewer;
- private Button mUserButtonNew;
- private Button mUserButtonDelete;
- private Button mUserButtonEdit;
- private Runnable mSourcesChangeListener;
-
- /**
- * Create the dialog.
- *
- * @param parent The parent's shell
- * @wbp.parser.entryPoint
- */
- public AddonSitesDialog(Shell parent, UpdaterData updaterData) {
- super(parent, updaterData, "Add-on Sites");
- mSources = updaterData.getSources();
- assert mSources != null;
- }
-
- /**
- * Create contents of the dialog.
- * @wbp.parser.entryPoint
- */
- @Override
- protected void createContents() {
- super.createContents();
- Shell shell = getShell();
- shell.setMinimumSize(new Point(300, 300));
- shell.setSize(600, 400);
-
- TabFolder tabFolder = new TabFolder(shell, SWT.NONE);
- GridDataBuilder.create(tabFolder).fill().grab().hSpan(2);
-
- TabItem sitesTabItem = new TabItem(tabFolder, SWT.NONE);
- sitesTabItem.setText("Official Add-on Sites");
- createTabOfficialSites(tabFolder, sitesTabItem);
-
- TabItem userTabItem = new TabItem(tabFolder, SWT.NONE);
- userTabItem.setText("User Defined Sites");
- createTabUserSites(tabFolder, userTabItem);
-
- // placeholder for aligning close button
- Label label = new Label(shell, SWT.NONE);
- GridDataBuilder.create(label).hFill().hGrab();
-
- createCloseButton();
- }
-
- void createTabOfficialSites(TabFolder tabFolder, TabItem sitesTabItem) {
- Composite root = new Composite(tabFolder, SWT.NONE);
- sitesTabItem.setControl(root);
- GridLayoutBuilder.create(root).columns(3);
-
- Label label = new Label(root, SWT.NONE);
- GridDataBuilder.create(label).hGrab().vCenter().hSpan(3);
- label.setText(
- "This lets select which official 3rd-party sites you want to load.\n" +
- "\n" +
- "These sites are managed by non-Android vendors to provide add-ons and extra packages.\n" +
- "They are by default all enabled. When you disable one, the SDK Manager will not check the site for new packages."
- );
-
- mSitesTableViewer = CheckboxTableViewer.newCheckList(root, SWT.BORDER | SWT.FULL_SELECTION);
- mSitesTableViewer.setContentProvider(new SourcesContentProvider());
-
- Table sitesTable = mSitesTableViewer.getTable();
- sitesTable.setToolTipText("Enable 3rd-Party Site");
- sitesTable.setLinesVisible(true);
- sitesTable.setHeaderVisible(true);
- GridDataBuilder.create(sitesTable).fill().grab().hSpan(3);
-
- TableViewerColumn columnViewer = new TableViewerColumn(mSitesTableViewer, SWT.NONE);
- TableColumn column = columnViewer.getColumn();
- column.setResizable(true);
- column.setWidth(150);
- column.setText("Name");
- columnViewer.setLabelProvider(new ColumnLabelProvider() {
- @Override
- public String getText(Object element) {
- if (element instanceof SdkSource) {
- String name = ((SdkSource) element).getUiName();
- if (name != null) {
- return name;
- }
- return ((SdkSource) element).getShortDescription();
- }
- return super.getText(element);
- }
- });
-
- columnViewer = new TableViewerColumn(mSitesTableViewer, SWT.NONE);
- column = columnViewer.getColumn();
- column.setResizable(true);
- column.setWidth(400);
- column.setText("URL");
- columnViewer.setLabelProvider(new ColumnLabelProvider() {
- @Override
- public String getText(Object element) {
- if (element instanceof SdkSource) {
- return ((SdkSource) element).getUrl();
- }
- return super.getText(element);
- }
- });
-
- mSitesTableViewer.addCheckStateListener(new ICheckStateListener() {
- @Override
- public void checkStateChanged(CheckStateChangedEvent event) {
- on_SitesTableViewer_checkStateChanged(event);
- }
- });
-
- // "enable all" and "disable all" buttons under the table
- Button selectAll = new Button(root, SWT.NONE);
- selectAll.setText("Enable All");
- GridDataBuilder.create(selectAll).hLeft();
- selectAll.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent event) {
- on_SitesTableViewer_selectAll();
- }
- });
-
- // placeholder between both buttons
- label = new Label(root, SWT.NONE);
- GridDataBuilder.create(label).hFill().hGrab();
-
- Button deselectAll = new Button(root, SWT.NONE);
- deselectAll.setText("Disable All");
- GridDataBuilder.create(deselectAll).hRight();
- deselectAll.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent event) {
- on_SitesTableViewer_deselectAll();
- }
- });
- }
-
- void createTabUserSites(TabFolder tabFolder, TabItem userTabItem) {
- Composite root = new Composite(tabFolder, SWT.NONE);
- userTabItem.setControl(root);
- GridLayoutBuilder.create(root).columns(2);
-
- Label label = new Label(root, SWT.NONE);
- GridDataBuilder.create(label).hLeft().vCenter().hSpan(2);
- label.setText(
- "This lets you manage a list of user-contributed external add-on sites URLs.\n" +
- "\n" +
- "Add-on sites can provide new add-ons and extra packages.\n" +
- "They cannot provide standard Android platforms, system images or docs.\n" +
- "Adding a URL here will not allow you to clone an official Android repository."
- );
-
- mUserTableViewer = new TableViewer(root, SWT.BORDER | SWT.FULL_SELECTION);
- mUserTableViewer.setContentProvider(new SourcesContentProvider());
-
- mUserTableViewer.addPostSelectionChangedListener(new ISelectionChangedListener() {
- @Override
- public void selectionChanged(SelectionChangedEvent event) {
- on_UserTableViewer_selectionChanged(event);
- }
- });
- mUserTable = mUserTableViewer.getTable();
- mUserTable.setLinesVisible(true);
- mUserTable.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseUp(MouseEvent event) {
- on_UserTable_mouseUp(event);
- }
- });
- GridDataBuilder.create(mUserTable).fill().grab().vSpan(5);
-
- TableViewerColumn tableViewerColumn = new TableViewerColumn(mUserTableViewer, SWT.NONE);
- TableColumn userColumnUrl = tableViewerColumn.getColumn();
- userColumnUrl.setWidth(100);
-
- // Implementation detail: set the label provider on the table viewer *after* associating
- // a column. This will set the label provider on the column for us.
- mUserTableViewer.setLabelProvider(new LabelProvider());
-
-
- mUserButtonNew = new Button(root, SWT.NONE);
- mUserButtonNew.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- userNewOrEdit(false /*isEdit*/);
- }
- });
- GridDataBuilder.create(mUserButtonNew).hFill().vCenter();
- mUserButtonNew.setText("New...");
-
- mUserButtonEdit = new Button(root, SWT.NONE);
- mUserButtonEdit.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- userNewOrEdit(true /*isEdit*/);
- }
- });
- GridDataBuilder.create(mUserButtonEdit).hFill().vCenter();
- mUserButtonEdit.setText("Edit...");
-
- mUserButtonDelete = new Button(root, SWT.NONE);
- mUserButtonDelete.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- on_UserButtonDelete_widgetSelected(e);
- }
- });
- GridDataBuilder.create(mUserButtonDelete).hFill().vCenter();
- mUserButtonDelete.setText("Delete...");
-
- adjustColumnsWidth(mUserTable, userColumnUrl);
- }
-
- @Override
- protected void close() {
- if (mSources != null && mSourcesChangeListener != null) {
- mSources.removeChangeListener(mSourcesChangeListener);
- }
- SdkSourceProperties p = new SdkSourceProperties();
- p.save();
- super.close();
- }
-
- /**
- * Adds a listener to adjust the column width when the parent is resized.
- */
- private void adjustColumnsWidth(final Table table, final TableColumn column0) {
- // Add a listener to resize the column to the full width of the table
- table.addControlListener(new ControlAdapter() {
- @Override
- public void controlResized(ControlEvent e) {
- Rectangle r = table.getClientArea();
- column0.setWidth(r.width * 100 / 100); // 100%
- }
- });
- }
-
- private void userNewOrEdit(final boolean isEdit) {
- final SdkSource[] knownSources = mSources.getAllSources();
- String title = isEdit ? "Edit Add-on Site URL" : "Add Add-on Site URL";
- String msg = "Please enter the URL of the addon.xml:";
- IStructuredSelection sel = (IStructuredSelection) mUserTableViewer.getSelection();
- final String initialValue = !isEdit || sel.isEmpty() ? null :
- sel.getFirstElement().toString();
-
- if (isEdit && initialValue == null) {
- // Edit with no actual value is not supposed to happen. Ignore this case.
- return;
- }
-
- InputDialog dlg = new InputDialog(
- getShell(),
- title,
- msg,
- initialValue,
- new IInputValidator() {
- @Override
- public String isValid(String newText) {
-
- newText = newText == null ? null : newText.trim();
-
- if (newText == null || newText.length() == 0) {
- return "Error: URL field is empty. Please enter a URL.";
- }
-
- // A URL should have one of the following prefixes
- if (!newText.startsWith("file://") && //$NON-NLS-1$
- !newText.startsWith("ftp://") && //$NON-NLS-1$
- !newText.startsWith("http://") && //$NON-NLS-1$
- !newText.startsWith("https://")) { //$NON-NLS-1$
- return "Error: The URL must start by one of file://, ftp://, http:// or https://";
- }
-
- if (isEdit && newText.equals(initialValue)) {
- // Edited value hasn't changed. This isn't an error.
- return null;
- }
-
- // Reject URLs that are already in the source list.
- // URLs are generally case-insensitive (except for file:// where it all depends
- // on the current OS so we'll ignore this case.)
- for (SdkSource s : knownSources) {
- if (newText.equalsIgnoreCase(s.getUrl())) {
- return "Error: This site is already listed.";
- }
- }
-
- return null;
- }
- });
-
- if (dlg.open() == Window.OK) {
- String url = dlg.getValue().trim();
-
- if (!url.equals(initialValue)) {
- if (isEdit && initialValue != null) {
- // Remove the old value before we add the new one, which is we just
- // asserted will be different.
- for (SdkSource source : mSources.getSources(SdkSourceCategory.USER_ADDONS)) {
- if (initialValue.equals(source.getUrl())) {
- mSources.remove(source);
- break;
- }
- }
-
- }
-
- // create the source, store it and update the list
- SdkSource newSource;
- // use url suffix to decide whether this is a SysImg or Addon;
- // see SdkSources.loadUserAddons() for another check like this
- if (url.endsWith(SdkSysImgConstants.URL_DEFAULT_FILENAME)) {
- newSource = new SdkSysImgSource(url, null/*uiName*/);
- } else {
- newSource = new SdkAddonSource(url, null/*uiName*/);
- }
- mSources.add(SdkSourceCategory.USER_ADDONS, newSource);
- setReturnValue(true);
- // notify sources change listeners. This will invoke our own loadUserUrlsList().
- mSources.notifyChangeListeners();
-
- // select the new source
- IStructuredSelection newSel = new StructuredSelection(newSource);
- mUserTableViewer.setSelection(newSel, true /*reveal*/);
- }
- }
- }
-
- private void on_UserButtonDelete_widgetSelected(SelectionEvent e) {
- IStructuredSelection sel = (IStructuredSelection) mUserTableViewer.getSelection();
- String selectedUrl = sel.isEmpty() ? null : sel.getFirstElement().toString();
-
- if (selectedUrl == null) {
- return;
- }
-
- MessageBox mb = new MessageBox(getShell(),
- SWT.YES | SWT.NO | SWT.ICON_QUESTION | SWT.APPLICATION_MODAL);
- mb.setText("Delete add-on site");
- mb.setMessage(String.format("Do you want to delete the URL %1$s?", selectedUrl));
- if (mb.open() == SWT.YES) {
- for (SdkSource source : mSources.getSources(SdkSourceCategory.USER_ADDONS)) {
- if (selectedUrl.equals(source.getUrl())) {
- mSources.remove(source);
- setReturnValue(true);
- mSources.notifyChangeListeners();
- break;
- }
- }
- }
- }
-
- private void on_UserTable_mouseUp(MouseEvent event) {
- Point p = new Point(event.x, event.y);
- if (mUserTable.getItem(p) == null) {
- mUserTable.deselectAll();
- on_UserTableViewer_selectionChanged(null /*event*/);
- }
- }
-
- private void on_UserTableViewer_selectionChanged(SelectionChangedEvent event) {
- ISelection sel = mUserTableViewer.getSelection();
- mUserButtonDelete.setEnabled(!sel.isEmpty());
- mUserButtonEdit.setEnabled(!sel.isEmpty());
- }
-
- private void on_SitesTableViewer_checkStateChanged(CheckStateChangedEvent event) {
- Object element = event.getElement();
- if (element instanceof SdkSource) {
- SdkSource source = (SdkSource) element;
- boolean isChecked = event.getChecked();
- if (source.isEnabled() != isChecked) {
- setReturnValue(true);
- source.setEnabled(isChecked);
- mSources.notifyChangeListeners();
- }
- }
- }
-
- private void on_SitesTableViewer_selectAll() {
- for (Object item : (Object[]) mSitesTableViewer.getInput()) {
- if (!mSitesTableViewer.getChecked(item)) {
- mSitesTableViewer.setChecked(item, true);
- on_SitesTableViewer_checkStateChanged(
- new CheckStateChangedEvent(mSitesTableViewer, item, true));
- }
- }
- }
-
- private void on_SitesTableViewer_deselectAll() {
- for (Object item : (Object[]) mSitesTableViewer.getInput()) {
- if (mSitesTableViewer.getChecked(item)) {
- mSitesTableViewer.setChecked(item, false);
- on_SitesTableViewer_checkStateChanged(
- new CheckStateChangedEvent(mSitesTableViewer, item, false));
- }
- }
- }
-
-
- @Override
- protected void postCreate() {
- // A runnable to initially load and then update the user urls & sites lists.
- final Runnable updateInUiThread = new Runnable() {
- @Override
- public void run() {
- loadUserUrlsList();
- loadSiteUrlsList();
- }
- };
-
- // A listener that runs when the sources have changed.
- // This is most likely called on a worker thread.
- mSourcesChangeListener = new Runnable() {
- @Override
- public void run() {
- Shell shell = getShell();
- if (shell != null) {
- Display display = shell.getDisplay();
- if (display != null) {
- display.syncExec(updateInUiThread);
- }
- }
- }
- };
-
- mSources.addChangeListener(mSourcesChangeListener);
-
- // initialize the list
- updateInUiThread.run();
- }
-
- private void loadUserUrlsList() {
- SdkSource[] knownSources = mSources.getSources(SdkSourceCategory.USER_ADDONS);
- Arrays.sort(knownSources);
-
- ISelection oldSelection = mUserTableViewer.getSelection();
-
- mUserTableViewer.setInput(knownSources);
- mUserTableViewer.refresh();
- // initialize buttons' state that depend on the list
- on_UserTableViewer_selectionChanged(null /*event*/);
-
- if (oldSelection != null && !oldSelection.isEmpty()) {
- mUserTableViewer.setSelection(oldSelection, true /*reveal*/);
- }
- }
-
- private void loadSiteUrlsList() {
- SdkSource[] knownSources = mSources.getSources(SdkSourceCategory.ADDONS_3RD_PARTY);
- Arrays.sort(knownSources);
-
- ISelection oldSelection = mSitesTableViewer.getSelection();
-
- mSitesTableViewer.setInput(knownSources);
- mSitesTableViewer.refresh();
-
- if (oldSelection != null && !oldSelection.isEmpty()) {
- mSitesTableViewer.setSelection(oldSelection, true /*reveal*/);
- }
-
- // Check the sources which are currently enabled.
- ArrayList<SdkSource> disabled = new ArrayList<SdkSource>(knownSources.length);
- for (SdkSource source : knownSources) {
- if (source.isEnabled()) {
- disabled.add(source);
- }
- }
- mSitesTableViewer.setCheckedElements(disabled.toArray());
- }
-
-
- private static class SourcesContentProvider implements IStructuredContentProvider {
- @Override
- public void dispose() {
- // pass
- }
-
- @Override
- public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
- // pass
- }
-
- @Override
- public Object[] getElements(Object inputElement) {
- if (inputElement instanceof SdkSource[]) {
- return (Object[]) inputElement;
- } else {
- return new Object[0];
- }
- }
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/AdtUpdateDialog.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/AdtUpdateDialog.java
deleted file mode 100755
index e90c3d9..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/AdtUpdateDialog.java
+++ /dev/null
@@ -1,494 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository.ui;
-
-
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.internal.repository.packages.ExtraPackage;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.internal.repository.packages.PlatformPackage;
-import com.android.sdklib.internal.repository.packages.PlatformToolPackage;
-import com.android.sdklib.internal.repository.packages.ToolPackage;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdkuilib.internal.repository.SettingsController;
-import com.android.sdkuilib.internal.repository.UpdaterData;
-import com.android.sdkuilib.internal.repository.core.PackageLoader;
-import com.android.sdkuilib.internal.repository.core.SdkLogAdapter;
-import com.android.sdkuilib.internal.repository.core.PackageLoader.IAutoInstallTask;
-import com.android.sdkuilib.internal.tasks.ProgressView;
-import com.android.sdkuilib.internal.tasks.ProgressViewFactory;
-import com.android.sdkuilib.ui.GridDataBuilder;
-import com.android.sdkuilib.ui.GridLayoutBuilder;
-import com.android.sdkuilib.ui.SwtBaseDialog;
-import com.android.utils.ILogger;
-import com.android.utils.Pair;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.ProgressBar;
-import org.eclipse.swt.widgets.Shell;
-
-import java.io.File;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-/**
- * This is a private implementation of UpdateWindow for ADT,
- * designed to install a very specific package.
- * <p/>
- * Example of usage:
- * <pre>
- * AdtUpdateDialog dialog = new AdtUpdateDialog(
- * AdtPlugin.getDisplay().getActiveShell(),
- * new AdtConsoleSdkLog(),
- * sdk.getSdkLocation());
- *
- * Pair<Boolean, File> result = dialog.installExtraPackage(
- * "android", "compatibility"); //$NON-NLS-1$ //$NON-NLS-2$
- * or
- * Pair<Boolean, File> result = dialog.installPlatformPackage(11);
- * </pre>
- */
-public class AdtUpdateDialog extends SwtBaseDialog {
-
- public static final int USE_MAX_REMOTE_API_LEVEL = 0;
-
- private static final String APP_NAME = "Android SDK Manager";
- private final UpdaterData mUpdaterData;
-
- private Boolean mResultCode = Boolean.FALSE;
- private Map<Package, File> mResultPaths = null;
- private SettingsController mSettingsController;
- private PackageFilter mPackageFilter;
- private PackageLoader mPackageLoader;
-
- private ProgressBar mProgressBar;
- private Label mStatusText;
-
- /**
- * Creates a new {@link AdtUpdateDialog}.
- * Callers will want to call {@link #installExtraPackage} or
- * {@link #installPlatformPackage} after this.
- *
- * @param parentShell The existing parent shell. Must not be null.
- * @param sdkLog An SDK logger. Must not be null.
- * @param osSdkRoot The current SDK root OS path. Must not be null or empty.
- */
- public AdtUpdateDialog(
- Shell parentShell,
- ILogger sdkLog,
- String osSdkRoot) {
- super(parentShell, SWT.NONE, APP_NAME);
- mUpdaterData = new UpdaterData(osSdkRoot, sdkLog);
- }
-
- /**
- * Displays the update dialog and triggers installation of the requested {@code extra}
- * package with the specified vendor and path attributes.
- * <p/>
- * Callers must not try to reuse this dialog after this call.
- *
- * @param vendor The extra package vendor string to match.
- * @param path The extra package path string to match.
- * @return A boolean indicating whether the installation was successful (meaning the package
- * was either already present, or got installed or updated properly) and a {@link File}
- * with the path to the root folder of the package. The file is null when the boolean
- * is false, otherwise it should point to an existing valid folder.
- * @wbp.parser.entryPoint
- */
- public Pair<Boolean, File> installExtraPackage(String vendor, String path) {
- mPackageFilter = createExtraFilter(vendor, path);
- open();
-
- File installPath = null;
- if (mResultPaths != null) {
- for (Entry<Package, File> entry : mResultPaths.entrySet()) {
- if (entry.getKey() instanceof ExtraPackage) {
- installPath = entry.getValue();
- break;
- }
- }
- }
-
- return Pair.of(mResultCode, installPath);
- }
-
- /**
- * Displays the update dialog and triggers installation of platform-tools package.
- * <p/>
- * Callers must not try to reuse this dialog after this call.
- *
- * @return A boolean indicating whether the installation was successful (meaning the package
- * was either already present, or got installed or updated properly) and a {@link File}
- * with the path to the root folder of the package. The file is null when the boolean
- * is false, otherwise it should point to an existing valid folder.
- * @wbp.parser.entryPoint
- */
- public Pair<Boolean, File> installPlatformTools() {
- mPackageFilter = createPlatformToolsFilter();
- open();
-
- File installPath = null;
- if (mResultPaths != null) {
- for (Entry<Package, File> entry : mResultPaths.entrySet()) {
- if (entry.getKey() instanceof ExtraPackage) {
- installPath = entry.getValue();
- break;
- }
- }
- }
-
- return Pair.of(mResultCode, installPath);
- }
-
- /**
- * Displays the update dialog and triggers installation of the requested platform
- * package with the specified API level.
- * <p/>
- * Callers must not try to reuse this dialog after this call.
- *
- * @param apiLevel The platform API level to match.
- * The special value {@link #USE_MAX_REMOTE_API_LEVEL} means to use
- * the highest API level available on the remote repository.
- * @return A boolean indicating whether the installation was successful (meaning the package
- * was either already present, or got installed or updated properly) and a {@link File}
- * with the path to the root folder of the package. The file is null when the boolean
- * is false, otherwise it should point to an existing valid folder.
- */
- public Pair<Boolean, File> installPlatformPackage(int apiLevel) {
- mPackageFilter = createPlatformFilter(apiLevel);
- open();
-
- File installPath = null;
- if (mResultPaths != null) {
- for (Entry<Package, File> entry : mResultPaths.entrySet()) {
- if (entry.getKey() instanceof PlatformPackage) {
- installPath = entry.getValue();
- break;
- }
- }
- }
-
- return Pair.of(mResultCode, installPath);
- }
-
- /**
- * Displays the update dialog and triggers installation of a new SDK. This works by
- * requesting a remote platform package with the specified API levels as well as
- * the first tools or platform-tools packages available.
- * <p/>
- * Callers must not try to reuse this dialog after this call.
- *
- * @param apiLevels A set of platform API levels to match.
- * The special value {@link #USE_MAX_REMOTE_API_LEVEL} means to use
- * the highest API level available in the repository.
- * @return A boolean indicating whether the installation was successful (meaning the packages
- * were either already present, or got installed or updated properly).
- */
- public boolean installNewSdk(Set<Integer> apiLevels) {
- mPackageFilter = createNewSdkFilter(apiLevels);
- open();
- return mResultCode.booleanValue();
- }
-
- @Override
- protected void createContents() {
- Shell shell = getShell();
- shell.setMinimumSize(new Point(450, 100));
- shell.setSize(450, 100);
-
- mUpdaterData.setWindowShell(shell);
-
- GridLayoutBuilder.create(shell).columns(1);
-
- Composite composite1 = new Composite(shell, SWT.NONE);
- composite1.setLayout(new GridLayout(1, false));
- GridDataBuilder.create(composite1).fill().grab();
-
- mProgressBar = new ProgressBar(composite1, SWT.NONE);
- GridDataBuilder.create(mProgressBar).hFill().hGrab();
-
- mStatusText = new Label(composite1, SWT.NONE);
- mStatusText.setText("Status Placeholder"); //$NON-NLS-1$ placeholder
- GridDataBuilder.create(mStatusText).hFill().hGrab();
- }
-
- @Override
- protected void postCreate() {
- ProgressViewFactory factory = new ProgressViewFactory();
- factory.setProgressView(new ProgressView(
- mStatusText,
- mProgressBar,
- null /*buttonStop*/,
- new SdkLogAdapter(mUpdaterData.getSdkLog())));
- mUpdaterData.setTaskFactory(factory);
-
- setupSources();
- initializeSettings();
-
- if (mUpdaterData.checkIfInitFailed()) {
- close();
- return;
- }
-
- mUpdaterData.broadcastOnSdkLoaded();
-
- mPackageLoader = new PackageLoader(mUpdaterData);
- }
-
- @Override
- protected void eventLoop() {
- mPackageLoader.loadPackagesWithInstallTask(
- mPackageFilter.installFlags(),
- new IAutoInstallTask() {
- @Override
- public Package[] filterLoadedSource(SdkSource source, Package[] packages) {
- for (Package pkg : packages) {
- mPackageFilter.visit(pkg);
- }
- return packages;
- }
-
- @Override
- public boolean acceptPackage(Package pkg) {
- // Is this the package we want to install?
- return mPackageFilter.accept(pkg);
- }
-
- @Override
- public void setResult(boolean success, Map<Package, File> installPaths) {
- // Capture the result from the installation.
- mResultCode = Boolean.valueOf(success);
- mResultPaths = installPaths;
- }
-
- @Override
- public void taskCompleted() {
- // We can close that window now.
- close();
- }
- });
-
- super.eventLoop();
- }
-
- // -- Start of internal part ----------
- // Hide everything down-below from SWT designer
- //$hide>>$
-
- // --- Public API -----------
-
-
- // --- Internals & UI Callbacks -----------
-
- /**
- * Used to initialize the sources.
- */
- private void setupSources() {
- mUpdaterData.setupDefaultSources();
- }
-
- /**
- * Initializes settings.
- */
- private void initializeSettings() {
- mSettingsController = mUpdaterData.getSettingsController();
- mSettingsController.loadSettings();
- mSettingsController.applySettings();
- }
-
- // ----
-
- private static abstract class PackageFilter {
- /** Returns the installer flags for the corresponding mode. */
- abstract int installFlags();
-
- /** Visit a new package definition, in case we need to adjust the filter dynamically. */
- abstract void visit(Package pkg);
-
- /** Checks whether this is the package we've been looking for. */
- abstract boolean accept(Package pkg);
- }
-
- public static PackageFilter createExtraFilter(
- final String vendor,
- final String path) {
- return new PackageFilter() {
- String mVendor = vendor;
- String mPath = path;
-
- @Override
- boolean accept(Package pkg) {
- if (pkg instanceof ExtraPackage) {
- ExtraPackage ep = (ExtraPackage) pkg;
- if (ep.getVendorId().equals(mVendor)) {
- // Check actual extra <path> field first
- if (ep.getPath().equals(mPath)) {
- return true;
- }
- // If not, check whether this is one of the <old-paths> values.
- for (String oldPath : ep.getOldPaths()) {
- if (oldPath.equals(mPath)) {
- return true;
- }
- }
- }
- }
- return false;
- }
-
- @Override
- void visit(Package pkg) {
- // nop
- }
-
- @Override
- int installFlags() {
- return UpdaterData.TOOLS_MSG_UPDATED_FROM_ADT;
- }
- };
- }
-
- private PackageFilter createPlatformToolsFilter() {
- return new PackageFilter() {
- @Override
- boolean accept(Package pkg) {
- return pkg instanceof PlatformToolPackage;
- }
-
- @Override
- void visit(Package pkg) {
- // nop
- }
-
- @Override
- int installFlags() {
- return UpdaterData.TOOLS_MSG_UPDATED_FROM_ADT;
- }
- };
- }
-
- public static PackageFilter createPlatformFilter(final int apiLevel) {
- return new PackageFilter() {
- int mApiLevel = apiLevel;
- boolean mFindMaxApi = apiLevel == USE_MAX_REMOTE_API_LEVEL;
-
- @Override
- boolean accept(Package pkg) {
- if (pkg instanceof PlatformPackage) {
- PlatformPackage pp = (PlatformPackage) pkg;
- AndroidVersion v = pp.getAndroidVersion();
- return !v.isPreview() && v.getApiLevel() == mApiLevel;
- }
- return false;
- }
-
- @Override
- void visit(Package pkg) {
- // Try to find the max API in all remote packages
- if (mFindMaxApi &&
- pkg instanceof PlatformPackage &&
- !pkg.isLocal()) {
- PlatformPackage pp = (PlatformPackage) pkg;
- AndroidVersion v = pp.getAndroidVersion();
- if (!v.isPreview()) {
- int api = v.getApiLevel();
- if (api > mApiLevel) {
- mApiLevel = api;
- }
- }
- }
- }
-
- @Override
- int installFlags() {
- return UpdaterData.TOOLS_MSG_UPDATED_FROM_ADT;
- }
- };
- }
-
- public static PackageFilter createNewSdkFilter(final Set<Integer> apiLevels) {
- return new PackageFilter() {
- int mMaxApiLevel;
- boolean mFindMaxApi = apiLevels.contains(USE_MAX_REMOTE_API_LEVEL);
- boolean mNeedTools = true;
- boolean mNeedPlatformTools = true;
-
- @Override
- boolean accept(Package pkg) {
- if (!pkg.isLocal()) {
- if (pkg instanceof PlatformPackage) {
- PlatformPackage pp = (PlatformPackage) pkg;
- AndroidVersion v = pp.getAndroidVersion();
- if (!v.isPreview()) {
- int level = v.getApiLevel();
- if ((mFindMaxApi && level == mMaxApiLevel) ||
- (level > 0 && apiLevels.contains(level))) {
- return true;
- }
- }
- } else if (mNeedTools && pkg instanceof ToolPackage) {
- // We want a tool package. There should be only one,
- // but in case of error just take the first one.
- mNeedTools = false;
- return true;
- } else if (mNeedPlatformTools && pkg instanceof PlatformToolPackage) {
- // We want a platform-tool package. There should be only one,
- // but in case of error just take the first one.
- mNeedPlatformTools = false;
- return true;
- }
- }
- return false;
- }
-
- @Override
- void visit(Package pkg) {
- // Try to find the max API in all remote packages
- if (mFindMaxApi &&
- pkg instanceof PlatformPackage &&
- !pkg.isLocal()) {
- PlatformPackage pp = (PlatformPackage) pkg;
- AndroidVersion v = pp.getAndroidVersion();
- if (!v.isPreview()) {
- int api = v.getApiLevel();
- if (api > mMaxApiLevel) {
- mMaxApiLevel = api;
- }
- }
- }
- }
-
- @Override
- int installFlags() {
- return UpdaterData.NO_TOOLS_MSG;
- }
- };
- }
-
-
-
- // End of hiding from SWT Designer
- //$hide<<$
-
- // -----
-
-}
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
deleted file mode 100755
index a092550..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/AvdManagerPage.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository.ui;
-
-import com.android.prefs.AndroidLocation.AndroidLocationException;
-import com.android.sdklib.devices.DeviceManager;
-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;
-import com.android.sdkuilib.internal.widgets.AvdSelector;
-import com.android.sdkuilib.internal.widgets.AvdSelector.DisplayMode;
-import com.android.sdkuilib.repository.ISdkChangeListener;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-
-/**
- * An Update page displaying AVD Manager entries.
- * This is the sole page displayed by {@link AvdManagerWindowImpl1}.
- *
- * Note: historically the SDK Manager was a single window with several sub-pages and a tab
- * switcher. For simplicity each page was separated in its own window. The AVD Manager is
- * thus composed of the {@link AvdManagerWindowImpl1} (the window shell itself) and this
- * page displays the actually list of AVDs and various action buttons.
- */
-public class AvdManagerPage extends Composite
- implements ISdkChangeListener, DevicesChangedListener, DisposeListener {
-
- private AvdSelector mAvdSelector;
-
- private final UpdaterData mUpdaterData;
- private final DeviceManager mDeviceManager;
- /**
- * Create the composite.
- * @param parent The parent of the composite.
- * @param updaterData An instance of {@link UpdaterData}.
- */
- public AvdManagerPage(Composite parent,
- int swtStyle,
- UpdaterData updaterData,
- DeviceManager deviceManager) {
- super(parent, swtStyle);
-
- mUpdaterData = updaterData;
- mUpdaterData.addListeners(this);
-
- mDeviceManager = deviceManager;
- mDeviceManager.registerListener(this);
-
- createContents(this);
- postCreate(); //$hide$
- }
-
- private void createContents(Composite parent) {
- parent.setLayout(new GridLayout(1, false));
-
- Label label = new Label(parent, SWT.NONE);
- label.setLayoutData(new GridData());
-
- try {
- if (mUpdaterData != null && mUpdaterData.getAvdManager() != null) {
- label.setText(String.format(
- "List of existing Android Virtual Devices located at %s",
- mUpdaterData.getAvdManager().getBaseAvdFolder()));
- } else {
- label.setText("Error: cannot find the AVD folder location.\r\n Please set the 'ANDROID_SDK_HOME' env variable.");
- }
- } catch (AndroidLocationException e) {
- label.setText(e.getMessage());
- }
-
- mAvdSelector = new AvdSelector(parent,
- mUpdaterData.getOsSdkRoot(),
- mUpdaterData.getAvdManager(),
- DisplayMode.MANAGER,
- mUpdaterData.getSdkLog());
- mAvdSelector.setSettingsController(mUpdaterData.getSettingsController());
- }
-
- @Override
- public void widgetDisposed(DisposeEvent e) {
- dispose();
- }
-
- @Override
- public void dispose() {
- mUpdaterData.removeListener(this);
- mDeviceManager.unregisterListener(this);
- super.dispose();
- }
-
- @Override
- protected void checkSubclass() {
- // Disable the check that prevents subclassing of SWT components
- }
-
- public void selectAvd(AvdInfo avdInfo, boolean reloadAvdList) {
- if (reloadAvdList) {
- mAvdSelector.refresh(true /*reload*/);
-
- // Reloading the AVDs created new objects, so the reference to avdInfo
- // will never be selected. Instead reselect it based on its unique name.
- AvdManager am = mUpdaterData.getAvdManager();
- avdInfo = am.getAvd(avdInfo.getName(), false /*validAvdOnly*/);
- }
- mAvdSelector.setSelection(avdInfo);
- }
-
- // -- Start of internal part ----------
- // Hide everything down-below from SWT designer
- //$hide>>$
-
- /**
- * Called by the constructor right after {@link #createContents(Composite)}.
- */
- private void postCreate() {
- // nothing to be done for now.
- }
-
- // --- Implementation of ISdkChangeListener ---
-
- @Override
- public void onSdkLoaded() {
- onSdkReload();
- }
-
- @Override
- public void onSdkReload() {
- mAvdSelector.refresh(false /*reload*/);
- }
-
- @Override
- public void preInstallHook() {
- // nothing to be done for now.
- }
-
- @Override
- public void postInstallHook() {
- // nothing to be done for now.
- }
-
- // --- Implementation of DevicesChangeListener
-
- @Override
- public void onDevicesChanged() {
- mAvdSelector.refresh(false /*reload*/);
- }
-
-
- // End of hiding from SWT Designer
- //$hide<<$
-}
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
deleted file mode 100755
index e3efca6..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/AvdManagerWindowImpl1.java
+++ /dev/null
@@ -1,411 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository.ui;
-
-
-import com.android.SdkConstants;
-import com.android.sdklib.devices.DeviceManager;
-import com.android.sdklib.internal.avd.AvdInfo;
-import com.android.sdklib.internal.repository.ITaskFactory;
-import com.android.sdkuilib.internal.repository.AboutDialog;
-import com.android.sdkuilib.internal.repository.MenuBarWrapper;
-import com.android.sdkuilib.internal.repository.SettingsController;
-import com.android.sdkuilib.internal.repository.SettingsDialog;
-import com.android.sdkuilib.internal.repository.UpdaterData;
-import com.android.sdkuilib.internal.repository.icons.ImageFactory;
-import com.android.sdkuilib.internal.repository.ui.DeviceManagerPage.IAvdCreatedListener;
-import com.android.sdkuilib.repository.AvdManagerWindow.AvdInvocationContext;
-import com.android.sdkuilib.repository.ISdkChangeListener;
-import com.android.sdkuilib.repository.SdkUpdaterWindow;
-import com.android.sdkuilib.ui.GridDataBuilder;
-import com.android.sdkuilib.ui.GridLayoutBuilder;
-import com.android.utils.ILogger;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.swt.widgets.TabItem;
-
-/**
- * This is an intermediate version of the {@link AvdManagerPage}
- * wrapped in its own standalone window for use from the SDK Manager 2.
- */
-public class AvdManagerWindowImpl1 {
-
- private static final String APP_NAME = "Android Virtual Device Manager";
- private static final String APP_NAME_MAC_MENU = "AVD Manager";
- private static final String SIZE_POS_PREFIX = "avdman1"; //$NON-NLS-1$
-
- private final Shell mParentShell;
- private final AvdInvocationContext mContext;
- /** Internal data shared between the window and its pages. */
- private final UpdaterData mUpdaterData;
- /** True if this window created the UpdaterData, in which case it needs to dispose it. */
- private final boolean mOwnUpdaterData;
- private final DeviceManager mDeviceManager;
-
-
- // --- UI members ---
-
- protected Shell mShell;
- private AvdManagerPage mAvdPage;
- private SettingsController mSettingsController;
- private TabFolder mTabFolder;
-
- /**
- * Creates a new window. Caller must call open(), which will block.
- *
- * @param parentShell Parent shell.
- * @param sdkLog Logger. Cannot be null.
- * @param osSdkRoot The OS path to the SDK root.
- * @param context The {@link AvdInvocationContext} to change the behavior depending on who's
- * opening the SDK Manager.
- */
- public AvdManagerWindowImpl1(
- Shell parentShell,
- ILogger sdkLog,
- String osSdkRoot,
- AvdInvocationContext context) {
- mParentShell = parentShell;
- mContext = context;
- mUpdaterData = new UpdaterData(osSdkRoot, sdkLog);
- mOwnUpdaterData = true;
- mDeviceManager = DeviceManager.createInstance(osSdkRoot, sdkLog);
- }
-
- /**
- * Creates a new window. Caller must call open(), which will block.
- * <p/>
- * This is to be used when the window is opened from {@link SdkUpdaterWindowImpl2}
- * to share the same {@link UpdaterData} structure.
- *
- * @param parentShell Parent shell.
- * @param updaterData The parent's updater data.
- * @param context The {@link AvdInvocationContext} to change the behavior depending on who's
- * opening the SDK Manager.
- */
- public AvdManagerWindowImpl1(
- Shell parentShell,
- UpdaterData updaterData,
- AvdInvocationContext context) {
- mParentShell = parentShell;
- mContext = context;
- mUpdaterData = updaterData;
- mOwnUpdaterData = false;
- mDeviceManager = DeviceManager.createInstance(mUpdaterData.getOsSdkRoot(),
- mUpdaterData.getSdkLog());
- }
-
- /**
- * Opens the window.
- * @wbp.parser.entryPoint
- */
- public void open() {
- if (mParentShell == null) {
- Display.setAppName(APP_NAME); //$hide$ (hide from SWT designer)
- }
-
- createShell();
- preCreateContent();
- createContents();
- createMenuBar();
- mShell.open();
- mShell.layout();
-
- boolean ok = postCreateContent();
-
- if (ok && mContext == AvdInvocationContext.STANDALONE) {
- Display display = Display.getDefault();
- while (!mShell.isDisposed()) {
- if (!display.readAndDispatch()) {
- display.sleep();
- }
- }
-
- dispose(); //$hide$
- }
- }
-
- private void createShell() {
- // The AVD Manager must use a shell trim when standalone
- // or a dialog trim when invoked from somewhere else.
- int style = SWT.SHELL_TRIM;
- if (mContext != AvdInvocationContext.STANDALONE) {
- style |= SWT.APPLICATION_MODAL;
- }
-
- mShell = new Shell(mParentShell, style);
- mShell.addDisposeListener(new DisposeListener() {
- @Override
- public void widgetDisposed(DisposeEvent e) {
- ShellSizeAndPos.saveSizeAndPos(mShell, SIZE_POS_PREFIX); //$hide$
- onAndroidSdkUpdaterDispose(); //$hide$
- mAvdPage.dispose(); //$hide$
- }
- });
-
- GridLayout glShell = new GridLayout(2, false);
- mShell.setLayout(glShell);
-
- mShell.setMinimumSize(new Point(500, 300));
- mShell.setSize(700, 500);
- mShell.setText(APP_NAME);
-
- ShellSizeAndPos.loadSizeAndPos(mShell, SIZE_POS_PREFIX);
- }
-
- private void createContents() {
-
- mTabFolder = new TabFolder(mShell, SWT.NONE);
- GridDataBuilder.create(mTabFolder).fill().grab().hSpan(2);
-
- // avd tab
- TabItem avdTabItem = new TabItem(mTabFolder, SWT.NONE);
- avdTabItem.setText("Android Virtual Devices");
- createAvdTab(mTabFolder, avdTabItem);
-
- // device tab
- TabItem devTabItem = new TabItem(mTabFolder, SWT.NONE);
- devTabItem.setText("Device Definitions");
- createDeviceTab(mTabFolder, devTabItem);
- }
-
- private void createAvdTab(TabFolder tabFolder, TabItem avdTabItem) {
- Composite root = new Composite(tabFolder, SWT.NONE);
- avdTabItem.setControl(root);
- GridLayoutBuilder.create(root).columns(1);
-
- mAvdPage = new AvdManagerPage(root, SWT.NONE, mUpdaterData, mDeviceManager);
- GridDataBuilder.create(mAvdPage).fill().grab();
- }
-
- private void createDeviceTab(TabFolder tabFolder, TabItem devTabItem) {
- Composite root = new Composite(tabFolder, SWT.NONE);
- devTabItem.setControl(root);
- GridLayoutBuilder.create(root).columns(1);
-
- DeviceManagerPage devicePage =
- new DeviceManagerPage(root, SWT.NONE, mUpdaterData, mDeviceManager);
- GridDataBuilder.create(devicePage).fill().grab();
-
- devicePage.setAvdCreatedListener(new IAvdCreatedListener() {
- @Override
- public void onAvdCreated(AvdInfo avdInfo) {
- if (avdInfo != null) {
- mTabFolder.setSelection(0); // display mAvdPage
- mAvdPage.selectAvd(avdInfo, true /*reloadAvdList*/);
- }
- }
- });
- }
-
- @SuppressWarnings("unused")
- // MenuBarWrapper works using side effects
- private void createMenuBar() {
- Menu menuBar = new Menu(mShell, SWT.BAR);
- mShell.setMenuBar(menuBar);
-
- // Only create the tools menu when running as standalone.
- // We don't need the tools menu when invoked from the IDE, or the SDK Manager
- // or from the AVD Chooser dialog. The only point of the tools menu is to
- // get the about box, and invoke Tools > SDK Manager, which we don't
- // need to do in these cases.
- if (mContext == AvdInvocationContext.STANDALONE) {
-
- MenuItem menuBarTools = new MenuItem(menuBar, SWT.CASCADE);
- menuBarTools.setText("Tools");
-
- Menu menuTools = new Menu(menuBarTools);
- menuBarTools.setMenu(menuTools);
-
- MenuItem manageSdk = new MenuItem(menuTools, SWT.NONE);
- manageSdk.setText("Manage SDK...");
- manageSdk.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent event) {
- onSdkManager();
- }
- });
-
- try {
- new MenuBarWrapper(APP_NAME_MAC_MENU, menuTools) {
- @Override
- public void onPreferencesMenuSelected() {
- SettingsDialog sd = new SettingsDialog(mShell, mUpdaterData);
- sd.open();
- }
-
- @Override
- public void onAboutMenuSelected() {
- AboutDialog ad = new AboutDialog(mShell, mUpdaterData);
- ad.open();
- }
-
- @Override
- public void printError(String format, Object... args) {
- if (mUpdaterData != null) {
- mUpdaterData.getSdkLog().error(null, format, args);
- }
- }
- };
- } catch (Throwable e) {
- mUpdaterData.getSdkLog().error(e, "Failed to setup menu bar");
- e.printStackTrace();
- }
- }
- }
-
-
- // -- Start of internal part ----------
- // Hide everything down-below from SWT designer
- //$hide>>$
-
- // --- Public API -----------
-
- /**
- * Adds a new listener to be notified when a change is made to the content of the SDK.
- */
- public void addListener(ISdkChangeListener listener) {
- mUpdaterData.addListeners(listener);
- }
-
- /**
- * Removes a new listener to be notified anymore when a change is made to the content of
- * the SDK.
- */
- public void removeListener(ISdkChangeListener listener) {
- mUpdaterData.removeListener(listener);
- }
-
- // --- Internals & UI Callbacks -----------
-
- /**
- * Called before the UI is created.
- */
- private void preCreateContent() {
- mUpdaterData.setWindowShell(mShell);
- // We need the UI factory to create the UI
- mUpdaterData.setImageFactory(new ImageFactory(mShell.getDisplay()));
- // Note: we can't create the TaskFactory yet because we need the UI
- // to be created first, so this is done in postCreateContent().
- }
-
- /**
- * 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 boolean postCreateContent() {
- setWindowImage(mShell);
-
- setupSources();
- initializeSettings();
-
- if (mUpdaterData.checkIfInitFailed()) {
- return false;
- }
-
- mUpdaterData.broadcastOnSdkLoaded();
-
- return true;
- }
-
- /**
- * Creates the icon of the window shell.
- *
- * @param shell The shell on which to put the icon
- */
- private void setWindowImage(Shell shell) {
- String imageName = "android_icon_16.png"; //$NON-NLS-1$
- if (SdkConstants.currentPlatform() == SdkConstants.PLATFORM_DARWIN) {
- imageName = "android_icon_128.png";
- }
-
- if (mUpdaterData != null) {
- ImageFactory imgFactory = mUpdaterData.getImageFactory();
- if (imgFactory != null) {
- shell.setImage(imgFactory.getImageByName(imageName));
- }
- }
- }
-
- /**
- * Called by the main loop when the window has been disposed.
- */
- private void dispose() {
- mUpdaterData.getSources().saveUserAddons(mUpdaterData.getSdkLog());
- }
-
- /**
- * Callback called when the window shell is disposed.
- */
- private void onAndroidSdkUpdaterDispose() {
- if (mOwnUpdaterData && mUpdaterData != null) {
- ImageFactory imgFactory = mUpdaterData.getImageFactory();
- if (imgFactory != null) {
- imgFactory.dispose();
- }
- }
- }
-
- /**
- * Used to initialize the sources.
- */
- private void setupSources() {
- mUpdaterData.setupDefaultSources();
- }
-
- /**
- * Initializes settings.
- * This must be called after addExtraPages(), which created a settings page.
- * Iterate through all the pages to find the first (and supposedly unique) setting page,
- * and use it to load and apply these settings.
- */
- private void initializeSettings() {
- mSettingsController = mUpdaterData.getSettingsController();
- mSettingsController.loadSettings();
- mSettingsController.applySettings();
- }
-
- private void onSdkManager() {
- ITaskFactory oldFactory = mUpdaterData.getTaskFactory();
-
- try {
- SdkUpdaterWindowImpl2 win = new SdkUpdaterWindowImpl2(
- mShell,
- mUpdaterData,
- SdkUpdaterWindow.SdkInvocationContext.AVD_MANAGER);
-
- win.open();
- } catch (Exception e) {
- mUpdaterData.getSdkLog().error(e, "SDK Manager window error");
- } finally {
- mUpdaterData.setTaskFactory(oldFactory);
- }
- }
-}
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
deleted file mode 100755
index 7b63d39..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/DeviceManagerPage.java
+++ /dev/null
@@ -1,832 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository.ui;
-
-import com.android.sdklib.devices.Device;
-import com.android.sdklib.devices.DeviceManager;
-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;
-import com.android.sdklib.devices.Storage.Unit;
-import com.android.sdklib.internal.avd.AvdInfo;
-import com.android.sdkuilib.internal.repository.UpdaterData;
-import com.android.sdkuilib.internal.repository.icons.ImageFactory;
-import com.android.sdkuilib.internal.widgets.AvdCreationDialog;
-import com.android.sdkuilib.internal.widgets.AvdSelector;
-import com.android.sdkuilib.internal.widgets.DeviceCreationDialog;
-import com.android.sdkuilib.repository.ISdkChangeListener;
-import com.android.sdkuilib.ui.GridDataBuilder;
-import com.android.sdkuilib.ui.GridLayoutBuilder;
-
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.graphics.Resource;
-import org.eclipse.swt.graphics.TextLayout;
-import org.eclipse.swt.graphics.TextStyle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * A page displaying Device Manager entries.
- * <p/>
- * This is displayed as a second tab in the AVD Manager window.
- * The layout purposely matches the one from {@link AvdManagerPage} and {@link AvdSelector}
- * so that there's a good consistency when switching tabs.
- * The table displays a few properties of each device as well as actions to edit/add/delete
- * devices and a button to create an AVD from a given device.
- *
- * Non-goals: this tries to keep it simple for a first iteration. Possible enhancements:
- * - a way to sort the device list by name, manufacturer or screen size.
- * - possibly a tree organized by manufacturer.
- * - a filter box to do a string search on any part of the display.
- */
-public class DeviceManagerPage extends Composite
- implements ISdkChangeListener, DevicesChangedListener, DisposeListener {
-
- public interface IAvdCreatedListener {
- public void onAvdCreated(AvdInfo createdAvdInfo);
- }
-
- private final UpdaterData mUpdaterData;
- private final DeviceManager mDeviceManager;
- private Table mTable;
- private Button mNewButton;
- private Button mEditButton;
- private Button mDeleteButton;
- private Button mNewAvdButton;
- private Button mRefreshButton;
- private ImageFactory mImageFactory;
- private Image mUserImage;
- private Image mGenericImage;
- private Image mOtherImage;
- private int mImageWidth;
- private boolean mDisableRefresh;
- private IAvdCreatedListener mAvdCreatedListener;
-
- /**
- * Create the composite.
- * @param parent The parent of the composite.
- * @param updaterData An instance of {@link UpdaterData}.
- */
- public DeviceManagerPage(Composite parent,
- int swtStyle,
- UpdaterData updaterData,
- DeviceManager deviceManager) {
- super(parent, swtStyle);
-
- mUpdaterData = updaterData;
- mUpdaterData.addListeners(this);
-
- mDeviceManager = deviceManager;
- mDeviceManager.registerListener(this);
-
- createContents(this);
- postCreate(); //$hide$
- }
-
- public void setAvdCreatedListener(IAvdCreatedListener avdCreatedListener) {
- mAvdCreatedListener = avdCreatedListener;
- }
-
- private void createContents(Composite parent) {
-
- // get some bitmaps.
- mImageFactory = new ImageFactory(parent.getDisplay());
- mUserImage = mImageFactory.getImageByName("devman_user_16.png");
- mGenericImage = mImageFactory.getImageByName("devman_generic_16.png");
- mOtherImage = mImageFactory.getImageByName("devman_manufacturer_16.png");
- mImageWidth = Math.max(mGenericImage.getImageData().width,
- Math.max(mUserImage.getImageData().width,
- mOtherImage.getImageData().width));
-
- // Layout has 2 columns
- GridLayoutBuilder.create(parent).columns(2);
-
- // Insert a top label explanation. This matches the design in AvdManagerPage so
- // that the table starts at the same height on both tabs.
- Label label = new Label(parent, SWT.NONE);
- label.setText("List of known device definitions. This can later be used to create Android Virtual Devices.");
- GridDataBuilder.create(label).hSpan(2);
-
- // Device table.
- mTable = new Table(parent, SWT.FULL_SELECTION | SWT.SINGLE | SWT.BORDER);
- mTable.setHeaderVisible(true);
- mTable.setLinesVisible(true);
- mTable.setFont(parent.getFont());
- setTableHeightHint(30);
-
- // Buttons on the side.
- Composite buttons = new Composite(parent, SWT.NONE);
- GridLayoutBuilder.create(buttons).columns(1).noMargins();
- GridDataBuilder.create(buttons).vFill();
- buttons.setFont(parent.getFont());
-
- mNewButton = new Button(buttons, SWT.PUSH | SWT.FLAT);
- mNewButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mNewButton.setText("New Device...");
- mNewButton.setToolTipText("Creates a new user device definition.");
- mNewButton.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- onNewDevice();
- }
- });
-
- mEditButton = new Button(buttons, SWT.PUSH | SWT.FLAT);
- mEditButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mEditButton.setText("Edit...");
- mEditButton.setToolTipText("Edit an existing device definition.");
- mEditButton.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- onEditDevice();
- }
- });
-
- mDeleteButton = new Button(buttons, SWT.PUSH | SWT.FLAT);
- mDeleteButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mDeleteButton.setText("Delete...");
- mDeleteButton.setToolTipText("Deletes the selected AVD.");
- mDeleteButton.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- onDeleteDevice();
- }
- });
-
- @SuppressWarnings("unused")
- Label spacing = new Label(buttons, SWT.NONE);
-
- mNewAvdButton = new Button(buttons, SWT.PUSH | SWT.FLAT);
- mNewAvdButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mNewAvdButton.setText("Create AVD...");
- mNewAvdButton.setToolTipText("Creates a new AVD based on this device definition.");
- mNewAvdButton.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- onCreateAvd();
- }
- });
-
- Composite padding = new Composite(buttons, SWT.NONE);
- padding.setLayoutData(new GridData(GridData.FILL_VERTICAL));
-
- mRefreshButton = new Button(buttons, SWT.PUSH | SWT.FLAT);
- mRefreshButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mRefreshButton.setText("Refresh");
- mRefreshButton.setToolTipText("Reloads the list of devices.");
- mRefreshButton.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- onRefresh();
- }
- });
-
- // Legend at the bottom.
- // This matches the one on AvdSelector so that the table height in the tab be similar.
- Composite legend = new Composite(parent, SWT.NONE);
- GridLayoutBuilder.create(legend).columns(4).noMargins();
- GridDataBuilder.create(legend).hFill().vTop().hGrab().hSpan(2);
- legend.setFont(parent.getFont());
-
- new Label(legend, SWT.NONE).setImage(mUserImage);
- new Label(legend, SWT.NONE).setText("A user-created device definition.");
- new Label(legend, SWT.NONE).setImage(mGenericImage);
- new Label(legend, SWT.NONE).setText("A generic device definition.");
- Label icon = new Label(legend, SWT.NONE);
- icon.setImage(mOtherImage);
- Label l = new Label(legend, SWT.NONE);
- l.setText("A manufacturer-specific device definition.");
- GridData gd;
- l.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
- gd.horizontalSpan = 3;
- icon.setVisible(false);
- l.setVisible(false);
-
- // create the table columns
- final TableColumn column0 = new TableColumn(mTable, SWT.NONE);
- column0.setText("Device");
-
- adjustColumnsWidth(mTable, column0);
- setupSelectionListener(mTable);
- fillTable(mTable);
- updateButtonStates();
- setEnabled(true);
- }
-
- private void adjustColumnsWidth(final Table table, final TableColumn column0) {
- // Add a listener to resize the column to the full width of the table
- table.addControlListener(new ControlAdapter() {
- @Override
- public void controlResized(ControlEvent e) {
- Rectangle r = table.getClientArea();
- column0.setWidth(r.width * 100 / 100 - 1); // 100%
- }
- });
- }
-
- private void setupSelectionListener(Table table) {
- // TODO Auto-generated method stub
-
- }
-
- /**
- * Sets the table grid layout data.
- *
- * @param heightHint If > 0, the height hint is set to the requested value.
- */
- public void setTableHeightHint(int heightHint) {
- GridData data = new GridData();
- if (heightHint > 0) {
- data.heightHint = heightHint;
- }
- data.grabExcessVerticalSpace = true;
- data.grabExcessHorizontalSpace = true;
- data.horizontalAlignment = GridData.FILL;
- data.verticalAlignment = GridData.FILL;
- mTable.setLayoutData(data);
- }
-
- @Override
- public void widgetDisposed(DisposeEvent e) {
- dispose();
- }
-
- @Override
- public void dispose() {
- mUpdaterData.removeListener(this);
- mDeviceManager.unregisterListener(this);
- super.dispose();
- }
-
- @Override
- protected void checkSubclass() {
- // Disable the check that prevents subclassing of SWT components
- }
-
- // -- Start of internal part ----------
- // Hide everything down-below from SWT designer
- //$hide>>$
-
- /**
- * Called by the constructor right after {@link #createContents(Composite)}.
- */
- private void postCreate() {
- // nothing to be done for now.
- }
-
-
- // -------
-
- private static class CellInfo {
- final boolean mIsUser;
- final Device mDevice;
- final TextLayout mWidget;
- Rectangle mBounds;
-
- CellInfo(boolean isUser, Device device, TextLayout widget) {
- mIsUser = isUser;
- mDevice = device;
- mWidget = widget;
- }
- }
-
- private void fillTable(final Table table) {
-
- table.removeAll();
- disposeTableResources(table.getData("disposeResources"));
-
- final List<Resource> disposables = new ArrayList<Resource>();
-
- Font boldFont = getBoldFont(table);
- if (boldFont != null) {
- disposables.add(boldFont);
- } else {
- boldFont = table.getFont();
- }
-
- try {
- mDisableRefresh = true;
- disposables.addAll(fillDevices(table, boldFont, true,
- mDeviceManager.getDevices(DeviceManager.USER_DEVICES)));
- disposables.addAll(fillDevices(table, boldFont, false,
- mDeviceManager.getDevices(DeviceManager.DEFAULT_DEVICES |
- DeviceManager.VENDOR_DEVICES)));
- } finally {
- mDisableRefresh = false;
- }
-
- table.setData("disposeResources", disposables);
-
- if (!Boolean.TRUE.equals(table.getData("createdTableListeners"))) {
- table.addListener(SWT.PaintItem, new Listener() {
- @Override
- public void handleEvent(Event event) {
- if (event.item != null) {
- Object info = event.item.getData();
- if (info instanceof CellInfo) {
- ((CellInfo) info).mWidget.draw(event.gc, event.x, event.y + 1);
- }
- }
- }
- });
-
- table.addListener(SWT.MeasureItem, new Listener() {
- @Override
- public void handleEvent(Event event) {
- if (event.item != null) {
- Object info = event.item.getData();
- if (info instanceof CellInfo) {
- CellInfo ci = (CellInfo) info;
- Rectangle bounds = ci.mBounds;
- if (bounds == null) {
- // TextLayout.getBounds() seems expensive, so let's cache it.
- ci.mBounds = bounds = ci.mWidget.getBounds();
- }
- event.width = bounds.width + 2;
- event.height = bounds.height + 4;
- }
- }
- }
- });
-
- table.addDisposeListener(new DisposeListener() {
- @Override
- public void widgetDisposed(DisposeEvent event) {
- disposeTableResources(table.getData("disposeResources"));
- }
- });
-
- table.addSelectionListener(new SelectionListener() {
- /** Handles single clicks on a row. */
- @Override
- public void widgetSelected(SelectionEvent event) {
- updateButtonStates();
- }
-
- /** Handles double click on a row. */
- @Override
- public void widgetDefaultSelected(SelectionEvent event) {
- // FIXME: should double-click be to edit a device or create a new AVD?
- onEditDevice();
- }
- });
- }
-
- if (table.getItemCount() == 0) {
- table.setEnabled(true);
- TableItem item = new TableItem(table, SWT.NONE);
- item.setData(null);
- item.setText(0, "No devices available");
- return;
- }
-
- table.setData("createdTableListeners", Boolean.TRUE);
- }
-
- private void disposeTableResources(Object disposablesList) {
- if (disposablesList instanceof List<?>) {
- for (Object obj : (List<?>) disposablesList) {
- if (obj instanceof Resource) {
- ((Resource) obj).dispose();
- }
- }
- }
- }
-
- private Font getBoldFont(Table table) {
- Display display = table.getDisplay();
- FontData[] fds = table.getFont().getFontData();
- if (fds != null && fds.length > 0) {
- fds[0].setStyle(SWT.BOLD);
- return new Font(display, fds[0]);
- }
- return null;
- }
-
- private List<Resource> fillDevices(
- Table table,
- Font boldFont,
- boolean isUser,
- List<Device> devices) {
- List<Resource> disposables = new ArrayList<Resource>();
- Display display = table.getDisplay();
-
- TextStyle boldStyle = new TextStyle();
- boldStyle.font = boldFont;
-
- // 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.
- Collections.sort(devices, new Comparator<Device>() {
- @Override
- public int compare(Device d1, Device d2) {
- String s1 = d1 == null ? "" : d1.getName();
- String s2 = d2 == null ? "" : d2.getName();
- return s1.compareTo(s2);
- }});
- } else {
- // Sort non-user devices by descending "pretty name"
- // TODO revisit. Doesn't perform as well as expected.
- Collections.sort(devices, new Comparator<Device>() {
- @Override
- public int compare(Device d1, Device d2) {
- String s1 = getPrettyName(d1, true /*leadZeroes*/);
- String s2 = getPrettyName(d2, true /*leadZeroes*/);
- return s2.compareTo(s1);
- }});
- }
-
- // Generate a list of the AVD names using these devices
- Map<Device, List<String>> device2avdMap = new HashMap<Device, List<String>>();
- for (AvdInfo avd : mUpdaterData.getAvdManager().getAllAvds()) {
- String n = avd.getDeviceName();
- String m = avd.getDeviceManufacturer();
- if (n == null || m == null || n.isEmpty() || m.isEmpty()) {
- continue;
- }
- for (Device device : devices) {
- if (m.equals(device.getManufacturer()) && n.equals(device.getName())) {
- List<String> list = device2avdMap.get(device);
- if (list == null) {
- list = new LinkedList<String>();
- device2avdMap.put(device, list);
- }
- list.add(avd.getName());
- }
- }
- }
-
- final String prefix = "\n ";
-
- for (Device device : devices) {
- TableItem item = new TableItem(table, SWT.NONE);
- TextLayout widget = new TextLayout(display);
- CellInfo ci = new CellInfo(isUser, device, widget);
- item.setData(ci);
-
- widget.setIndent(mImageWidth * 2);
- widget.setFont(table.getFont());
-
- StringBuilder sb = new StringBuilder();
- String name = getPrettyName(device, false /*leadZeroes*/);
- sb.append(name);
- int pos1 = sb.length();
-
- String manufacturer = device.getManufacturer();
- String manu = manufacturer;
- if (isUser) {
- item.setImage(mUserImage);
- } else if (GENERIC.equals(manu)) {
- item.setImage(mGenericImage);
- } else {
- item.setImage(mOtherImage);
- if (!manufacturer.contains(NEXUS)) {
- sb.append(" by ").append(manufacturer);
- }
- }
-
- Hardware hw = device.getDefaultHardware();
- Screen screen = hw.getScreen();
- sb.append(prefix);
- sb.append(String.format(java.util.Locale.US,
- "Screen: %1$.1f\", %2$d \u00D7 %3$d, %4$s %5$s", // U+00D7: Unicode multiplication sign
- screen.getDiagonalLength(),
- screen.getXDimension(),
- screen.getYDimension(),
- screen.getSize().getShortDisplayValue(),
- screen.getPixelDensity().getResourceValue()
- ));
-
- Storage sto = hw.getRam();
- Unit unit = sto.getSizeAsUnit(Unit.GiB) > 1 ? Unit.GiB : Unit.MiB;
- sb.append(prefix);
- sb.append(String.format(java.util.Locale.US,
- "RAM: %1$d %2$s",
- sto.getSizeAsUnit(unit),
- unit));
-
- List<String> avdList = device2avdMap.get(device);
- if (avdList != null && !avdList.isEmpty()) {
- sb.append(prefix);
- sb.append("Used by: ");
- boolean first = true;
- for (String avd : avdList) {
- if (!first) {
- sb.append(", ");
- }
- sb.append(avd);
- first = false;
- }
- }
-
- widget.setText(sb.toString());
- widget.setStyle(boldStyle, 0, pos1);
- }
-
- return disposables;
- }
-
- // Constants extracted from DeviceMenuListerner -- TODO refactor somewhere else.
- 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 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.
- *
- * Replace "'in'" with '"' (e.g. 2.7" QVGA instead of 2.7in QVGA)
- * Use the same precision for all devices (all but one specify decimals)
- * Add in screen resolution and density
- */
- private static String getPrettyName(Device d, boolean leadZeroes) {
- if (d == null) {
- return "";
- }
- String name = d.getName();
- if (name.equals("3.7 FWVGA slider")) { //$NON-NLS-1$
- // Fix metadata: this one entry doesn't have "in" like the rest of them
- name = "3.7in FWVGA slider"; //$NON-NLS-1$
- }
-
- Matcher matcher = PATTERN.matcher(name);
- if (matcher.matches()) {
- String size = matcher.group(1);
- String n = matcher.group(2);
- int dot = size.indexOf('.');
- if (dot == -1) {
- size = size + ".0";
- dot = size.length() - 2;
- }
- if (leadZeroes && dot < 3) {
- // Pad to have at least 3 digits before the dot, for sorting purposes.
- // We can revisit this once we get devices that are more than 999 inches wide.
- size = "000".substring(dot) + size;
- }
- name = size + "\" " + n;
- }
-
- return name;
- }
-
- /**
- * Returns the currently selected cell info in the table or null
- */
- private CellInfo getTableSelection() {
- if (mTable.isDisposed()) {
- return null;
- }
- int selIndex = mTable.getSelectionIndex();
- if (selIndex >= 0) {
- return (CellInfo) mTable.getItem(selIndex).getData();
- }
-
- return null;
- }
-
- private void updateButtonStates() {
- CellInfo ci = getTableSelection();
-
- mNewButton.setEnabled(true);
- mEditButton.setEnabled(ci != null);
- mEditButton.setText((ci != null && !ci.mIsUser) ? "Clone..." : "Edit...");
- mDeleteButton.setEnabled(ci != null && ci.mIsUser);
- mNewAvdButton.setEnabled(ci != null);
- mRefreshButton.setEnabled(true);
- }
-
- private void onNewDevice() {
- DeviceCreationDialog dlg = new DeviceCreationDialog(
- getShell(),
- mDeviceManager,
- mUpdaterData.getImageFactory(),
- null /*device*/);
- if (dlg.open() == Window.OK) {
- onRefresh();
-
- // Select the new device, if any.
- selectCellByDevice(dlg.getCreatedDevice());
- updateButtonStates();
- }
- }
-
- private void onEditDevice() {
- CellInfo ci = getTableSelection();
- if (ci == null || ci.mDevice == null) {
- return;
- }
-
- DeviceCreationDialog dlg = new DeviceCreationDialog(
- getShell(),
- mDeviceManager,
- mUpdaterData.getImageFactory(),
- ci.mDevice);
- if (dlg.open() == Window.OK) {
- onRefresh();
-
- // Select the new device, if any.
- selectCellByDevice(dlg.getCreatedDevice());
- updateButtonStates();
- }
- }
-
- private void onDeleteDevice() {
- CellInfo ci = getTableSelection();
- if (ci == null || ci.mDevice == null || !ci.mIsUser) {
- return;
- }
-
- final String name = getPrettyName(ci.mDevice, false /*leadZeroes*/);
- final AtomicBoolean result = new AtomicBoolean(false);
- getDisplay().syncExec(new Runnable() {
- @Override
- public void run() {
- Shell shell = getDisplay().getActiveShell();
- boolean ok = MessageDialog.openQuestion(shell,
- "Delete Device Definition",
- String.format(
- "Please confirm that you want to delete the device definition named '%s'. This operation cannot be reverted.",
- name));
- result.set(ok);
- }
- });
-
- if (result.get()) {
- mDeviceManager.removeUserDevice(ci.mDevice);
- mDeviceManager.saveUserDevices();
- onRefresh();
- }
- }
-
- private void onCreateAvd() {
- CellInfo ci = getTableSelection();
- if (ci == null || ci.mDevice == null) {
- return;
- }
-
- final AvdCreationDialog dlg = new AvdCreationDialog(mTable.getShell(),
- mUpdaterData.getAvdManager(),
- mImageFactory,
- mUpdaterData.getSdkLog(),
- null);
- dlg.selectInitialDevice(ci.mDevice);
-
- if (dlg.open() == Window.OK) {
- onRefresh();
-
- if (mAvdCreatedListener != null) {
- mAvdCreatedListener.onAvdCreated(dlg.getCreatedAvd());
- }
- }
- }
-
- private void onRefresh() {
- if (mDisableRefresh || mTable.isDisposed()) {
- return;
- }
- int selIndex = mTable.getSelectionIndex();
- CellInfo selected = getTableSelection();
-
- fillTable(mTable);
-
- if (selected != null) {
- if (selectCellByName(selected)) {
- updateButtonStates();
- return;
- }
- }
- // If not found by name, use the position if available.
- if (selIndex >= 0 && selIndex < mTable.getItemCount()) {
- mTable.select(selIndex);
- }
- }
-
- private boolean selectCellByName(CellInfo selected) {
- if (mTable.isDisposed() || selected == null || selected.mDevice == null) {
- return false;
- }
- String name = selected.mDevice.getName();
- for (int n = mTable.getItemCount() - 1; n >= 0; n--) {
- TableItem item = mTable.getItem(n);
- Object data = item.getData();
- if (data instanceof CellInfo) {
- CellInfo ci = (CellInfo) data;
- if (ci != null && ci.mDevice != null && name.equals(ci.mDevice.getName())) {
- // Same cell object. Select it.
- mTable.select(n);
- return true;
- }
- }
- }
- return false;
- }
-
- private boolean selectCellByDevice(Device selected) {
- if (mTable.isDisposed() || selected == null) {
- return false;
- }
- for (int n = mTable.getItemCount() - 1; n >= 0; n--) {
- TableItem item = mTable.getItem(n);
- Object data = item.getData();
- if (data instanceof CellInfo) {
- CellInfo ci = (CellInfo) data;
- if (ci != null && ci.mDevice == selected) {
- // Same device object. Select it.
- mTable.select(n);
- return true;
- }
- }
- }
- return false;
- }
-
- // -------
-
-
- // --- Implementation of ISdkChangeListener ---
-
- @Override
- public void onSdkLoaded() {
- onSdkReload();
- }
-
- @Override
- public void onSdkReload() {
- onRefresh();
- }
-
- @Override
- public void preInstallHook() {
- // nothing to be done for now.
- }
-
- @Override
- public void postInstallHook() {
- // nothing to be done for now.
- }
-
- // --- Implementation of DevicesChangeListener
-
- @Override
- public void onDevicesChanged() {
- onRefresh();
- }
-
-
- // End of hiding from SWT Designer
- //$hide<<$
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/LogWindow.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/LogWindow.java
deleted file mode 100755
index 43dbaf5..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/LogWindow.java
+++ /dev/null
@@ -1,379 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository.ui;
-
-import com.android.sdkuilib.internal.tasks.ILogUiProvider;
-import com.android.sdkuilib.ui.GridDataBuilder;
-import com.android.sdkuilib.ui.GridLayoutBuilder;
-import com.android.utils.ILogger;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StyleRange;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.ShellAdapter;
-import org.eclipse.swt.events.ShellEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Widget;
-
-
-/**
- * A floating log window that can be displayed or hidden by the main SDK Manager 2 window.
- * It displays a log of the sdk manager operation (listing, install, delete) including
- * any errors (e.g. network error or install/delete errors.)
- * <p/>
- * Since the SDK Manager will direct all log to this window, its purpose is to be
- * opened by the main window at startup and left open all the time. When not needed
- * the floating window is hidden but not closed. This way it can easily accumulate
- * all the log.
- */
-class LogWindow implements ILogUiProvider {
-
- private Shell mParentShell;
- private Shell mShell;
- private Composite mRootComposite;
- private StyledText mStyledText;
- private Label mLogDescription;
- private Button mCloseButton;
-
- private final ILogger mSecondaryLog;
- private boolean mCloseRequested;
- private boolean mInitPosition = true;
- private String mLastLogMsg = null;
-
- private enum TextStyle {
- DEFAULT,
- TITLE,
- ERROR
- }
-
- /**
- * Creates the floating window. Callers should use {@link #open()} later.
- *
- * @param parentShell Parent container
- * @param secondaryLog An optional logger where messages will <em>also</em> be output.
- */
- public LogWindow(Shell parentShell, ILogger secondaryLog) {
- mParentShell = parentShell;
- mSecondaryLog = secondaryLog;
- }
-
- /**
- * For testing only. See {@link #open()} and {@link #close()} for normal usage.
- * @wbp.parser.entryPoint
- */
- void openBlocking() {
- open();
- Display display = Display.getDefault();
- while (!mShell.isDisposed()) {
- if (!display.readAndDispatch()) {
- display.sleep();
- }
- }
- close();
- }
-
- /**
- * Opens the window.
- * This call does not block and relies on the fact that the main window is
- * already running an SWT event dispatch loop.
- * Caller should use {@link #close()} later.
- */
- public void open() {
- createShell();
- createContents();
- mShell.open();
- mShell.layout();
- mShell.setVisible(false);
- }
-
- /**
- * Closes and <em>destroys</em> the window.
- * This must be called just before quitting the app.
- * <p/>
- * To simply hide/show the window, use {@link #setVisible(boolean)} instead.
- */
- public void close() {
- if (mShell != null && !mShell.isDisposed()) {
- mCloseRequested = true;
- mShell.close();
- mShell = null;
- }
- }
-
- /**
- * Determines whether the window is currently shown or not.
- *
- * @return True if the window is shown.
- */
- public boolean isVisible() {
- return mShell != null && !mShell.isDisposed() && mShell.isVisible();
- }
-
- /**
- * Toggles the window visibility.
- *
- * @param visible True to make the window visible, false to hide it.
- */
- public void setVisible(boolean visible) {
- if (mShell != null && !mShell.isDisposed()) {
- mShell.setVisible(visible);
- if (visible && mInitPosition) {
- mInitPosition = false;
- positionWindow();
- }
- }
- }
-
- private void createShell() {
- mShell = new Shell(mParentShell, SWT.SHELL_TRIM | SWT.TOOL);
- mShell.setMinimumSize(new Point(600, 300));
- mShell.setSize(450, 300);
- mShell.setText("Android SDK Manager Log");
- GridLayoutBuilder.create(mShell);
-
- mShell.addShellListener(new ShellAdapter() {
- @Override
- public void shellClosed(ShellEvent e) {
- if (!mCloseRequested) {
- e.doit = false;
- setVisible(false);
- }
- }
- });
- }
-
- /**
- * Create contents of the dialog.
- */
- private void createContents() {
- mRootComposite = new Composite(mShell, SWT.NONE);
- GridLayoutBuilder.create(mRootComposite).columns(2);
- GridDataBuilder.create(mRootComposite).fill().grab();
-
- mStyledText = new StyledText(mRootComposite,
- SWT.BORDER | SWT.MULTI | SWT.READ_ONLY | SWT.WRAP | SWT.V_SCROLL);
- GridDataBuilder.create(mStyledText).hSpan(2).fill().grab();
-
- mLogDescription = new Label(mRootComposite, SWT.NONE);
- GridDataBuilder.create(mLogDescription).hFill().hGrab();
-
- mCloseButton = new Button(mRootComposite, SWT.NONE);
- mCloseButton.setText("Close");
- mCloseButton.setToolTipText("Closes the log window");
- mCloseButton.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- setVisible(false); //$hide$
- }
- });
- }
-
- // --- Implementation of ILogUiProvider ---
-
-
- /**
- * Sets the description in the current task dialog.
- * This method can be invoked from a non-UI thread.
- */
- @Override
- public void setDescription(final String description) {
- syncExec(mLogDescription, new Runnable() {
- @Override
- public void run() {
- mLogDescription.setText(description);
-
- if (acceptLog(description, true /*isDescription*/)) {
- appendLine(TextStyle.TITLE, description);
-
- if (mSecondaryLog != null) {
- mSecondaryLog.info("%1$s", description); //$NON-NLS-1$
- }
- }
- }
- });
- }
-
- /**
- * Logs a "normal" information line.
- * This method can be invoked from a non-UI thread.
- */
- @Override
- public void log(final String log) {
- if (acceptLog(log, false /*isDescription*/)) {
- syncExec(mLogDescription, new Runnable() {
- @Override
- public void run() {
- appendLine(TextStyle.DEFAULT, log);
- }
- });
-
- if (mSecondaryLog != null) {
- mSecondaryLog.info(" %1$s", log); //$NON-NLS-1$
- }
- }
- }
-
- /**
- * Logs an "error" information line.
- * This method can be invoked from a non-UI thread.
- */
- @Override
- public void logError(final String log) {
- if (acceptLog(log, false /*isDescription*/)) {
- syncExec(mLogDescription, new Runnable() {
- @Override
- public void run() {
- appendLine(TextStyle.ERROR, log);
- }
- });
-
- if (mSecondaryLog != null) {
- mSecondaryLog.error(null, "%1$s", log); //$NON-NLS-1$
- }
- }
- }
-
- /**
- * Logs a "verbose" information line, that is extra details which are typically
- * not that useful for the end-user and might be hidden until explicitly shown.
- * This method can be invoked from a non-UI thread.
- */
- @Override
- public void logVerbose(final String log) {
- if (acceptLog(log, false /*isDescription*/)) {
- syncExec(mLogDescription, new Runnable() {
- @Override
- public void run() {
- appendLine(TextStyle.DEFAULT, " " + log); //$NON-NLS-1$
- }
- });
-
- if (mSecondaryLog != null) {
- mSecondaryLog.info(" %1$s", log); //$NON-NLS-1$
- }
- }
- }
-
-
- // ----
-
-
- /**
- * Centers the dialog in its parent shell.
- */
- private void positionWindow() {
- // Centers the dialog in its parent shell
- Shell child = mShell;
- if (child != null && mParentShell != null) {
- // get the parent client area with a location relative to the display
- Rectangle parentArea = mParentShell.getClientArea();
- Point parentLoc = mParentShell.getLocation();
- int px = parentLoc.x;
- int py = parentLoc.y;
- int pw = parentArea.width;
- int ph = parentArea.height;
-
- Point childSize = child.getSize();
- int cw = Math.max(childSize.x, pw);
- int ch = childSize.y;
-
- int x = 30 + px + (pw - cw) / 2;
- if (x < 0) x = 0;
-
- int y = py + (ph - ch) / 2;
- if (y < py) y = py;
-
- child.setLocation(x, y);
- child.setSize(cw, ch);
- }
- }
-
- private void appendLine(TextStyle style, String text) {
- if (!text.endsWith("\n")) { //$NON-NLS-1$
- text += '\n';
- }
-
- int start = mStyledText.getCharCount();
-
- if (style == TextStyle.DEFAULT) {
- mStyledText.append(text);
-
- } else {
- mStyledText.append(text);
-
- StyleRange sr = new StyleRange();
- sr.start = start;
- sr.length = text.length();
- sr.fontStyle = SWT.BOLD;
- if (style == TextStyle.ERROR) {
- sr.foreground = mStyledText.getDisplay().getSystemColor(SWT.COLOR_DARK_RED);
- }
- sr.underline = false;
- mStyledText.setStyleRange(sr);
- }
-
- // Scroll caret if it was already at the end before we added new text.
- // Ideally we would scroll if the scrollbar is at the bottom but we don't
- // have direct access to the scrollbar without overriding the SWT impl.
- if (mStyledText.getCaretOffset() >= start) {
- mStyledText.setSelection(mStyledText.getCharCount());
- }
- }
-
-
- private void syncExec(final Widget widget, final Runnable runnable) {
- if (widget != null && !widget.isDisposed()) {
- widget.getDisplay().syncExec(runnable);
- }
- }
-
- /**
- * Filter messages displayed in the log: <br/>
- * - Messages with a % are typical part of a progress update and shouldn't be in the log. <br/>
- * - Messages that are the same as the same output message should be output a second time.
- *
- * @param msg The potential log line to print.
- * @return True if the log line should be printed, false otherwise.
- */
- private boolean acceptLog(String msg, boolean isDescription) {
- if (msg == null) {
- return false;
- }
-
- msg = msg.trim();
-
- // Descriptions also have the download progress status (0..100%) which we want to avoid
- if (isDescription && msg.indexOf('%') != -1) {
- return false;
- }
-
- if (msg.equals(mLastLogMsg)) {
- return false;
- }
-
- mLastLogMsg = msg;
- return true;
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/PackagesPage.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/PackagesPage.java
deleted file mode 100755
index d9a1102..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/PackagesPage.java
+++ /dev/null
@@ -1,1297 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository.ui;
-
-import com.android.sdklib.internal.repository.ITask;
-import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.archives.ArchiveInstaller;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdkuilib.internal.repository.UpdaterData;
-import com.android.sdkuilib.internal.repository.core.PkgCategory;
-import com.android.sdkuilib.internal.repository.core.PkgCategoryApi;
-import com.android.sdkuilib.internal.repository.core.PkgContentProvider;
-import com.android.sdkuilib.internal.repository.core.PkgItem;
-import com.android.sdkuilib.internal.repository.core.PkgItem.PkgState;
-import com.android.sdkuilib.internal.repository.icons.ImageFactory;
-import com.android.sdkuilib.repository.ISdkChangeListener;
-import com.android.sdkuilib.repository.SdkUpdaterWindow.SdkInvocationContext;
-import com.android.sdkuilib.ui.GridDataBuilder;
-import com.android.sdkuilib.ui.GridLayoutBuilder;
-
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.ITreeSelection;
-import org.eclipse.jface.viewers.TreeViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.window.ToolTip;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Link;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-/**
- * Page that displays both locally installed packages as well as all known
- * remote available packages. This gives an overview of what is installed
- * vs what is available and allows the user to update or install packages.
- */
-public final class PackagesPage extends Composite implements ISdkChangeListener {
-
- enum MenuAction {
- RELOAD (SWT.NONE, "Reload"),
- SHOW_ADDON_SITES (SWT.NONE, "Manage Add-on Sites..."),
- TOGGLE_SHOW_ARCHIVES (SWT.CHECK, "Show Archives Details"),
- TOGGLE_SHOW_INSTALLED_PKG (SWT.CHECK, "Show Installed Packages"),
- TOGGLE_SHOW_OBSOLETE_PKG (SWT.CHECK, "Show Obsolete Packages"),
- TOGGLE_SHOW_UPDATE_NEW_PKG (SWT.CHECK, "Show Updates/New Packages"),
- SORT_API_LEVEL (SWT.RADIO, "Sort by API Level"),
- SORT_SOURCE (SWT.RADIO, "Sort by Repository")
- ;
-
- private final int mMenuStyle;
- private final String mMenuTitle;
-
- MenuAction(int menuStyle, String menuTitle) {
- mMenuStyle = menuStyle;
- mMenuTitle = menuTitle;
- }
-
- public int getMenuStyle() {
- return mMenuStyle;
- }
-
- public String getMenuTitle() {
- return mMenuTitle;
- }
- };
-
- private final Map<MenuAction, MenuItem> mMenuActions = new HashMap<MenuAction, MenuItem>();
-
- private final PackagesPageImpl mImpl;
- private final SdkInvocationContext mContext;
-
- private boolean mDisplayArchives = false;
- private boolean mOperationPending;
-
- private Composite mGroupPackages;
- private Text mTextSdkOsPath;
- private Button mCheckSortSource;
- private Button mCheckSortApi;
- private Button mCheckFilterObsolete;
- private Button mCheckFilterInstalled;
- private Button mCheckFilterNew;
- private Composite mGroupOptions;
- private Composite mGroupSdk;
- private Button mButtonDelete;
- private Button mButtonInstall;
- private Font mTreeFontItalic;
- private TreeColumn mTreeColumnName;
- private CheckboxTreeViewer mTreeViewer;
-
- public PackagesPage(
- Composite parent,
- int swtStyle,
- UpdaterData updaterData,
- SdkInvocationContext context) {
- super(parent, swtStyle);
- mImpl = new PackagesPageImpl(updaterData) {
- @Override
- protected boolean isUiDisposed() {
- return mGroupPackages == null || mGroupPackages.isDisposed();
- };
- @Override
- protected void syncExec(Runnable runnable) {
- if (!isUiDisposed()) {
- mGroupPackages.getDisplay().syncExec(runnable);
- }
- };
-
- @Override
- protected void syncViewerSelection() {
- PackagesPage.this.syncViewerSelection();
- }
-
- @Override
- protected void refreshViewerInput() {
- PackagesPage.this.refreshViewerInput();
- }
-
- @Override
- protected boolean isSortByApi() {
- return PackagesPage.this.isSortByApi();
- }
-
- @Override
- protected Font getTreeFontItalic() {
- return mTreeFontItalic;
- }
-
- @Override
- protected void loadPackages(boolean useLocalCache, boolean overrideExisting) {
- PackagesPage.this.loadPackages(useLocalCache, overrideExisting);
- }
- };
- mContext = context;
-
- createContents(this);
- postCreate(); //$hide$
- }
-
- public void performFirstLoad() {
- mImpl.performFirstLoad();
- }
-
- @SuppressWarnings("unused")
- private void createContents(Composite parent) {
- GridLayoutBuilder.create(parent).noMargins().columns(2);
-
- mGroupSdk = new Composite(parent, SWT.NONE);
- GridDataBuilder.create(mGroupSdk).hFill().vCenter().hGrab().hSpan(2);
- GridLayoutBuilder.create(mGroupSdk).columns(2);
-
- Label label1 = new Label(mGroupSdk, SWT.NONE);
- label1.setText("SDK Path:");
-
- mTextSdkOsPath = new Text(mGroupSdk, SWT.NONE);
- GridDataBuilder.create(mTextSdkOsPath).hFill().vCenter().hGrab();
- mTextSdkOsPath.setEnabled(false);
-
- Group groupPackages = new Group(parent, SWT.NONE);
- mGroupPackages = groupPackages;
- GridDataBuilder.create(mGroupPackages).fill().grab().hSpan(2);
- groupPackages.setText("Packages");
- GridLayoutBuilder.create(groupPackages).columns(1);
-
- mTreeViewer = new CheckboxTreeViewer(groupPackages, SWT.BORDER);
- mImpl.setITreeViewer(new PackagesPageImpl.ICheckboxTreeViewer() {
- @Override
- public Object getInput() {
- return mTreeViewer.getInput();
- }
-
- @Override
- public void setInput(List<PkgCategory> cats) {
- mTreeViewer.setInput(cats);
- }
-
- @Override
- public void setContentProvider(PkgContentProvider pkgContentProvider) {
- mTreeViewer.setContentProvider(pkgContentProvider);
- }
-
- @Override
- public void refresh() {
- mTreeViewer.refresh();
- }
-
- @Override
- public Object[] getCheckedElements() {
- return mTreeViewer.getCheckedElements();
- }
- });
- mTreeViewer.addFilter(new ViewerFilter() {
- @Override
- public boolean select(Viewer viewer, Object parentElement, Object element) {
- return filterViewerItem(element);
- }
- });
-
- mTreeViewer.addCheckStateListener(new ICheckStateListener() {
- @Override
- public void checkStateChanged(CheckStateChangedEvent event) {
- onTreeCheckStateChanged(event); //$hide$
- }
- });
-
- mTreeViewer.addDoubleClickListener(new IDoubleClickListener() {
- @Override
- public void doubleClick(DoubleClickEvent event) {
- onTreeDoubleClick(event); //$hide$
- }
- });
-
- Tree tree = mTreeViewer.getTree();
- tree.setLinesVisible(true);
- tree.setHeaderVisible(true);
- GridDataBuilder.create(tree).fill().grab();
-
- // column name icon is set when loading depending on the current filter type
- // (e.g. API level or source)
- TreeViewerColumn columnName = new TreeViewerColumn(mTreeViewer, SWT.NONE);
- mTreeColumnName = columnName.getColumn();
- mTreeColumnName.setText("Name");
- mTreeColumnName.setWidth(340);
-
- TreeViewerColumn columnApi = new TreeViewerColumn(mTreeViewer, SWT.NONE);
- TreeColumn treeColumn2 = columnApi.getColumn();
- treeColumn2.setText("API");
- treeColumn2.setAlignment(SWT.CENTER);
- treeColumn2.setWidth(50);
-
- TreeViewerColumn columnRevision = new TreeViewerColumn(mTreeViewer, SWT.NONE);
- TreeColumn treeColumn3 = columnRevision.getColumn();
- treeColumn3.setText("Rev.");
- treeColumn3.setToolTipText("Revision currently installed");
- treeColumn3.setAlignment(SWT.CENTER);
- treeColumn3.setWidth(50);
-
-
- TreeViewerColumn columnStatus = new TreeViewerColumn(mTreeViewer, SWT.NONE);
- TreeColumn treeColumn4 = columnStatus.getColumn();
- treeColumn4.setText("Status");
- treeColumn4.setAlignment(SWT.LEAD);
- treeColumn4.setWidth(190);
-
- mImpl.setIColumns(
- wrapColumn(columnName),
- wrapColumn(columnApi),
- wrapColumn(columnRevision),
- wrapColumn(columnStatus));
-
- mGroupOptions = new Composite(groupPackages, SWT.NONE);
- GridDataBuilder.create(mGroupOptions).hFill().vCenter().hGrab();
- GridLayoutBuilder.create(mGroupOptions).columns(7).noMargins();
-
- // Options line 1, 7 columns
-
- Label label3 = new Label(mGroupOptions, SWT.NONE);
- label3.setText("Show:");
-
- mCheckFilterNew = new Button(mGroupOptions, SWT.CHECK);
- mCheckFilterNew.setText("Updates/New");
- mCheckFilterNew.setToolTipText("Show Updates and New");
- mCheckFilterNew.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- refreshViewerInput();
- }
- });
- mCheckFilterNew.setSelection(true);
-
- mCheckFilterInstalled = new Button(mGroupOptions, SWT.CHECK);
- mCheckFilterInstalled.setToolTipText("Show Installed");
- mCheckFilterInstalled.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- refreshViewerInput();
- }
- });
- mCheckFilterInstalled.setSelection(true);
- mCheckFilterInstalled.setText("Installed");
-
- mCheckFilterObsolete = new Button(mGroupOptions, SWT.CHECK);
- mCheckFilterObsolete.setText("Obsolete");
- mCheckFilterObsolete.setToolTipText("Also show obsolete packages");
- mCheckFilterObsolete.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- refreshViewerInput();
- }
- });
- mCheckFilterObsolete.setSelection(false);
-
- Link linkSelectNew = new Link(mGroupOptions, SWT.NONE);
- // Note for i18n: we need to identify which link is used, and this is done by using the
- // text itself so for translation purposes we want to keep the <a> link strings separate.
- final String strLinkNew = "New";
- final String strLinkUpdates = "Updates";
- linkSelectNew.setText(
- String.format("Select <a>%1$s</a> or <a>%2$s</a>", strLinkNew, strLinkUpdates));
- linkSelectNew.setToolTipText("Selects all items that are either new or updates.");
- GridDataBuilder.create(linkSelectNew).hFill();
- linkSelectNew.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- super.widgetSelected(e);
- boolean selectNew = e.text == null || e.text.equals(strLinkNew);
- onSelectNewUpdates(selectNew, !selectNew, false/*selectTop*/);
- }
- });
-
- // placeholder between "select all" and "install"
- Label placeholder = new Label(mGroupOptions, SWT.NONE);
- GridDataBuilder.create(placeholder).hFill().hGrab();
-
- mButtonInstall = new Button(mGroupOptions, SWT.NONE);
- mButtonInstall.setText(""); //$NON-NLS-1$ placeholder, filled in updateButtonsState()
- mButtonInstall.setToolTipText("Install one or more packages");
- GridDataBuilder.create(mButtonInstall).vCenter().wHint(150);
- mButtonInstall.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- onButtonInstall(); //$hide$
- }
- });
-
- // Options line 2, 7 columns
-
- Label label2 = new Label(mGroupOptions, SWT.NONE);
- label2.setText("Sort by:");
-
- mCheckSortApi = new Button(mGroupOptions, SWT.RADIO);
- mCheckSortApi.setToolTipText("Sort by API level");
- mCheckSortApi.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- if (mCheckSortApi.getSelection()) {
- refreshViewerInput();
- copySelection(true /*toApi*/);
- syncViewerSelection();
- }
- }
- });
- mCheckSortApi.setText("API level");
- mCheckSortApi.setSelection(true);
-
- mCheckSortSource = new Button(mGroupOptions, SWT.RADIO);
- mCheckSortSource.setText("Repository");
- mCheckSortSource.setToolTipText("Sort by Repository");
- mCheckSortSource.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- if (mCheckSortSource.getSelection()) {
- refreshViewerInput();
- copySelection(false /*toApi*/);
- syncViewerSelection();
- }
- }
- });
-
- // placeholder between "repository" and "deselect"
- new Label(mGroupOptions, SWT.NONE);
-
- Link linkDeselect = new Link(mGroupOptions, SWT.NONE);
- linkDeselect.setText("<a>Deselect All</a>");
- linkDeselect.setToolTipText("Deselects all the currently selected items");
- GridDataBuilder.create(linkDeselect).hFill();
- linkDeselect.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- super.widgetSelected(e);
- onDeselectAll();
- }
- });
-
- // placeholder between "deselect" and "delete"
- placeholder = new Label(mGroupOptions, SWT.NONE);
- GridDataBuilder.create(placeholder).hFill().hGrab();
-
- mButtonDelete = new Button(mGroupOptions, SWT.NONE);
- mButtonDelete.setText(""); //$NON-NLS-1$ placeholder, filled in updateButtonsState()
- mButtonDelete.setToolTipText("Delete one ore more installed packages");
- GridDataBuilder.create(mButtonDelete).vCenter().wHint(150);
- mButtonDelete.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- onButtonDelete(); //$hide$
- }
- });
- }
-
- private PackagesPageImpl.ITreeViewerColumn wrapColumn(final TreeViewerColumn column) {
- return new PackagesPageImpl.ITreeViewerColumn() {
- @Override
- public void setLabelProvider(ColumnLabelProvider labelProvider) {
- column.setLabelProvider(labelProvider);
- }
- };
- }
-
- private Image getImage(String filename) {
- if (mImpl.mUpdaterData != null) {
- ImageFactory imgFactory = mImpl.mUpdaterData.getImageFactory();
- if (imgFactory != null) {
- return imgFactory.getImageByName(filename);
- }
- }
- return null;
- }
-
-
- // -- Start of internal part ----------
- // Hide everything down-below from SWT designer
- //$hide>>$
-
-
- // --- menu interactions ---
-
- public void registerMenuAction(final MenuAction action, MenuItem item) {
- item.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- Button button = null;
-
- switch (action) {
- case RELOAD:
- mImpl.fullReload();
- break;
- case SHOW_ADDON_SITES:
- AddonSitesDialog d = new AddonSitesDialog(getShell(), mImpl.mUpdaterData);
- if (d.open()) {
- mImpl.loadPackages();
- }
- break;
- case TOGGLE_SHOW_ARCHIVES:
- mDisplayArchives = !mDisplayArchives;
- // Force the viewer to be refreshed
- ((PkgContentProvider) mTreeViewer.getContentProvider()).
- setDisplayArchives(mDisplayArchives);
- mTreeViewer.setInput(null);
- refreshViewerInput();
- syncViewerSelection();
- break;
- case TOGGLE_SHOW_INSTALLED_PKG:
- button = mCheckFilterInstalled;
- break;
- case TOGGLE_SHOW_OBSOLETE_PKG:
- button = mCheckFilterObsolete;
- break;
- case TOGGLE_SHOW_UPDATE_NEW_PKG:
- button = mCheckFilterNew;
- break;
- case SORT_API_LEVEL:
- button = mCheckSortApi;
- break;
- case SORT_SOURCE:
- button = mCheckSortSource;
- break;
- }
-
- if (button != null && !button.isDisposed()) {
- // Toggle this button (radio or checkbox)
-
- boolean value = button.getSelection();
-
- // SWT doesn't automatically switch radio buttons when using the
- // Widget#setSelection method, so we'll do it here manually.
- if (!value && (button.getStyle() & SWT.RADIO) != 0) {
- // we'll be selecting this radio button, so deselect all ther other ones
- // in the parent group.
- for (Control child : button.getParent().getChildren()) {
- if (child instanceof Button &&
- child != button &&
- (child.getStyle() & SWT.RADIO) != 0) {
- ((Button) child).setSelection(value);
- }
- }
- }
-
- button.setSelection(!value);
-
- // SWT doesn't actually invoke the listeners when using Widget#setSelection
- // so let's run the actual action.
- button.notifyListeners(SWT.Selection, new Event());
- }
-
- updateMenuCheckmarks();
- }
- });
-
- mMenuActions.put(action, item);
- }
-
- // --- internal methods ---
-
- private void updateMenuCheckmarks() {
-
- for (Entry<MenuAction, MenuItem> entry : mMenuActions.entrySet()) {
- MenuAction action = entry.getKey();
- MenuItem item = entry.getValue();
-
- if (action.getMenuStyle() == SWT.NONE) {
- continue;
- }
-
- boolean value = false;
- Button button = null;
-
- switch (action) {
- case TOGGLE_SHOW_ARCHIVES:
- value = mDisplayArchives;
- break;
- case TOGGLE_SHOW_INSTALLED_PKG:
- button = mCheckFilterInstalled;
- break;
- case TOGGLE_SHOW_OBSOLETE_PKG:
- button = mCheckFilterObsolete;
- break;
- case TOGGLE_SHOW_UPDATE_NEW_PKG:
- button = mCheckFilterNew;
- break;
- case SORT_API_LEVEL:
- button = mCheckSortApi;
- break;
- case SORT_SOURCE:
- button = mCheckSortSource;
- break;
- }
-
- if (button != null && !button.isDisposed()) {
- value = button.getSelection();
- }
-
- if (!item.isDisposed()) {
- item.setSelection(value);
- }
- }
- }
-
- private void postCreate() {
- mImpl.postCreate();
-
- if (mImpl.mUpdaterData != null) {
- mTextSdkOsPath.setText(mImpl.mUpdaterData.getOsSdkRoot());
- }
-
- ((PkgContentProvider) mTreeViewer.getContentProvider()).setDisplayArchives(
- mDisplayArchives);
-
- ColumnViewerToolTipSupport.enableFor(mTreeViewer, ToolTip.NO_RECREATE);
-
- Tree tree = mTreeViewer.getTree();
- FontData fontData = tree.getFont().getFontData()[0];
- fontData.setStyle(SWT.ITALIC);
- mTreeFontItalic = new Font(tree.getDisplay(), fontData);
-
- tree.addDisposeListener(new DisposeListener() {
- @Override
- public void widgetDisposed(DisposeEvent e) {
- mTreeFontItalic.dispose();
- mTreeFontItalic = null;
- }
- });
- }
-
- private void loadPackages(boolean useLocalCache, boolean overrideExisting) {
- if (mImpl.mUpdaterData == null) {
- return;
- }
-
- // LoadPackage is synchronous but does not block the UI.
- // Consequently it's entirely possible for the user
- // to request the app to close whilst the packages are loading. Any
- // action done after loadPackages must check the UI hasn't been
- // disposed yet. Otherwise hilarity ensues.
-
- boolean displaySortByApi = isSortByApi();
-
- if (mTreeColumnName.isDisposed()) {
- // If the UI got disposed, don't try to load anything since we won't be
- // able to display it anyway.
- return;
- }
-
- mTreeColumnName.setImage(getImage(
- displaySortByApi ? PackagesPageIcons.ICON_SORT_BY_API
- : PackagesPageIcons.ICON_SORT_BY_SOURCE));
-
- mImpl.loadPackagesImpl(useLocalCache, overrideExisting);
- }
-
- private void refreshViewerInput() {
- // Dynamically update the table while we load after each source.
- // Since the official Android source gets loaded first, it makes the
- // window look non-empty a lot sooner.
- if (!mGroupPackages.isDisposed()) {
- try {
- mImpl.setViewerInput();
- } catch (Exception ignore) {}
-
- // set the initial expanded state
- expandInitial(mTreeViewer.getInput());
-
- updateButtonsState();
- updateMenuCheckmarks();
- }
- }
-
- private boolean isSortByApi() {
- return mCheckSortApi != null && !mCheckSortApi.isDisposed() && mCheckSortApi.getSelection();
- }
-
- /**
- * Decide whether to keep an item in the current tree based on user-chosen filter options.
- */
- private boolean filterViewerItem(Object treeElement) {
- if (treeElement instanceof PkgCategory) {
- PkgCategory cat = (PkgCategory) treeElement;
-
- if (!cat.getItems().isEmpty()) {
- // A category is hidden if all of its content is hidden.
- // However empty categories are always visible.
- for (PkgItem item : cat.getItems()) {
- if (filterViewerItem(item)) {
- // We found at least one element that is visible.
- return true;
- }
- }
- return false;
- }
- }
-
- if (treeElement instanceof PkgItem) {
- PkgItem item = (PkgItem) treeElement;
-
- if (!mCheckFilterObsolete.getSelection()) {
- if (item.isObsolete()) {
- return false;
- }
- }
-
- if (!mCheckFilterInstalled.getSelection()) {
- if (item.getState() == PkgState.INSTALLED) {
- return false;
- }
- }
-
- if (!mCheckFilterNew.getSelection()) {
- if (item.getState() == PkgState.NEW || item.hasUpdatePkg()) {
- return false;
- }
- }
- }
-
- return true;
- }
-
- /**
- * Performs the initial expansion of the tree. This expands categories that contain
- * at least one installed item and collapses the ones with nothing installed.
- *
- * TODO: change this to only change the expanded state on categories that have not
- * been touched by the user yet. Once we do that, call this every time a new source
- * is added or the list is reloaded.
- */
- private void expandInitial(Object elem) {
- if (elem == null) {
- return;
- }
- if (mTreeViewer != null && !mTreeViewer.getTree().isDisposed()) {
-
- boolean enablePreviews =
- mImpl.mUpdaterData.getSettingsController().getSettings().getEnablePreviews();
-
- mTreeViewer.setExpandedState(elem, true);
- nextCategory: for (Object pkg :
- ((ITreeContentProvider) mTreeViewer.getContentProvider()).
- getChildren(elem)) {
- if (pkg instanceof PkgCategory) {
- PkgCategory cat = (PkgCategory) pkg;
-
- // Always expand the Tools category (and the preview one, if enabled)
- if (cat.getKey().equals(PkgCategoryApi.KEY_TOOLS) ||
- (enablePreviews &&
- cat.getKey().equals(PkgCategoryApi.KEY_TOOLS_PREVIEW))) {
- expandInitial(pkg);
- continue nextCategory;
- }
-
-
- for (PkgItem item : cat.getItems()) {
- if (item.getState() == PkgState.INSTALLED) {
- expandInitial(pkg);
- continue nextCategory;
- }
- }
- }
- }
- }
- }
-
- /**
- * Handle checking and unchecking of the tree items.
- *
- * When unchecking, all sub-tree items checkboxes are cleared too.
- * When checking a source, all of its packages are checked too.
- * When checking a package, only its compatible archives are checked.
- */
- private void onTreeCheckStateChanged(CheckStateChangedEvent event) {
- boolean checked = event.getChecked();
- Object elem = event.getElement();
-
- assert event.getSource() == mTreeViewer;
-
- // When selecting, we want to only select compatible archives and expand the super nodes.
- checkAndExpandItem(elem, checked, true/*fixChildren*/, true/*fixParent*/);
- updateButtonsState();
- }
-
- private void onTreeDoubleClick(DoubleClickEvent event) {
- assert event.getSource() == mTreeViewer;
- ISelection sel = event.getSelection();
- if (sel.isEmpty() || !(sel instanceof ITreeSelection)) {
- return;
- }
- ITreeSelection tsel = (ITreeSelection) sel;
- Object elem = tsel.getFirstElement();
- if (elem == null) {
- return;
- }
-
- ITreeContentProvider provider =
- (ITreeContentProvider) mTreeViewer.getContentProvider();
- Object[] children = provider.getElements(elem);
- if (children == null) {
- return;
- }
-
- if (children.length > 0) {
- // If the element has children, expand/collapse it.
- if (mTreeViewer.getExpandedState(elem)) {
- mTreeViewer.collapseToLevel(elem, 1);
- } else {
- mTreeViewer.expandToLevel(elem, 1);
- }
- } else {
- // If the element is a terminal one, select/deselect it.
- checkAndExpandItem(
- elem,
- !mTreeViewer.getChecked(elem),
- false /*fixChildren*/,
- true /*fixParent*/);
- updateButtonsState();
- }
- }
-
- private void checkAndExpandItem(
- Object elem,
- boolean checked,
- boolean fixChildren,
- boolean fixParent) {
- ITreeContentProvider provider =
- (ITreeContentProvider) mTreeViewer.getContentProvider();
-
- // fix the item itself
- if (checked != mTreeViewer.getChecked(elem)) {
- mTreeViewer.setChecked(elem, checked);
- }
- if (elem instanceof PkgItem) {
- // update the PkgItem to reflect the selection
- ((PkgItem) elem).setChecked(checked);
- }
-
- if (!checked) {
- if (fixChildren) {
- // when de-selecting, we deselect all children too
- mTreeViewer.setSubtreeChecked(elem, checked);
- for (Object child : provider.getChildren(elem)) {
- checkAndExpandItem(child, checked, fixChildren, false/*fixParent*/);
- }
- }
-
- // fix the parent when deselecting
- if (fixParent) {
- Object parent = provider.getParent(elem);
- if (parent != null && mTreeViewer.getChecked(parent)) {
- mTreeViewer.setChecked(parent, false);
- }
- }
- return;
- }
-
- // When selecting, we also select sub-items (for a category)
- if (fixChildren) {
- if (elem instanceof PkgCategory || elem instanceof PkgItem) {
- Object[] children = provider.getChildren(elem);
- for (Object child : children) {
- checkAndExpandItem(child, true, fixChildren, false/*fixParent*/);
- }
- // only fix the parent once the last sub-item is set
- if (elem instanceof PkgCategory) {
- if (children.length > 0) {
- checkAndExpandItem(
- children[0], true, false/*fixChildren*/, true/*fixParent*/);
- } else {
- mTreeViewer.setChecked(elem, false);
- }
- }
- } else if (elem instanceof Package) {
- // in details mode, we auto-select compatible packages
- selectCompatibleArchives(elem, provider);
- }
- }
-
- if (fixParent && checked && elem instanceof PkgItem) {
- Object parent = provider.getParent(elem);
- if (!mTreeViewer.getChecked(parent)) {
- Object[] children = provider.getChildren(parent);
- boolean allChecked = children.length > 0;
- for (Object e : children) {
- if (!mTreeViewer.getChecked(e)) {
- allChecked = false;
- break;
- }
- }
- if (allChecked) {
- mTreeViewer.setChecked(parent, true);
- }
- }
- }
- }
-
- private void selectCompatibleArchives(Object pkg, ITreeContentProvider provider) {
- for (Object archive : provider.getChildren(pkg)) {
- if (archive instanceof Archive) {
- mTreeViewer.setChecked(archive, ((Archive) archive).isCompatible());
- }
- }
- }
-
- /**
- * Checks all PkgItems that are either new or have updates or select top platform
- * for initial run.
- */
- private void onSelectNewUpdates(boolean selectNew, boolean selectUpdates, boolean selectTop) {
- // This will update the tree's "selected" state and then invoke syncViewerSelection()
- // which will in turn update tree.
- mImpl.onSelectNewUpdates(selectNew, selectUpdates, selectTop);
- }
-
- /**
- * Deselect all checked PkgItems.
- */
- private void onDeselectAll() {
- // This does not update the tree itself, syncViewerSelection does it below.
- mImpl.onDeselectAll();
- syncViewerSelection();
- }
-
- /**
- * When switching between the tree-by-api and the tree-by-source, copy the selection
- * (aka the checked items) from one list to the other.
- * This does not update the tree itself.
- */
- private void copySelection(boolean fromSourceToApi) {
- List<PkgItem> fromItems =
- mImpl.mDiffLogic.getAllPkgItems(!fromSourceToApi, fromSourceToApi);
- List<PkgItem> toItems =
- mImpl.mDiffLogic.getAllPkgItems(fromSourceToApi, !fromSourceToApi);
-
- // deselect all targets
- for (PkgItem item : toItems) {
- item.setChecked(false);
- }
-
- // mark new one from the source
- for (PkgItem source : fromItems) {
- if (source.isChecked()) {
- // There should typically be a corresponding item in the target side
- for (PkgItem target : toItems) {
- if (target.isSameMainPackageAs(source.getMainPackage())) {
- target.setChecked(true);
- break;
- }
- }
- }
- }
- }
-
- /**
- * Synchronize the 'checked' state of PkgItems in the tree with their internal isChecked state.
- */
- private void syncViewerSelection() {
- ITreeContentProvider provider = (ITreeContentProvider) mTreeViewer.getContentProvider();
-
- Object input = mTreeViewer.getInput();
- if (input != null) {
- for (Object cat : provider.getElements(input)) {
- Object[] children = provider.getElements(cat);
- boolean allChecked = children.length > 0;
- for (Object child : children) {
- if (child instanceof PkgItem) {
- PkgItem item = (PkgItem) child;
- boolean checked = item.isChecked();
- allChecked &= checked;
-
- if (checked != mTreeViewer.getChecked(item)) {
- if (checked) {
- if (!mTreeViewer.getExpandedState(cat)) {
- mTreeViewer.setExpandedState(cat, true);
- }
- }
- checkAndExpandItem(
- item,
- checked,
- true/*fixChildren*/,
- false/*fixParent*/);
- }
- }
- }
-
- if (allChecked != mTreeViewer.getChecked(cat)) {
- mTreeViewer.setChecked(cat, allChecked);
- }
- }
- }
-
- updateButtonsState();
- }
-
- /**
- * Indicate an install/delete operation is pending.
- * This disables the install/delete buttons.
- * Use {@link #endOperationPending()} to revert, typically in a {@code try..finally} block.
- */
- private void beginOperationPending() {
- mOperationPending = true;
- updateButtonsState();
- }
-
- private void endOperationPending() {
- mOperationPending = false;
- updateButtonsState();
- }
-
- /**
- * Updates the Install and Delete Package buttons.
- */
- private void updateButtonsState() {
- if (!mButtonInstall.isDisposed()) {
- int numPackages = getArchivesForInstall(null /*archives*/);
-
- mButtonInstall.setEnabled((numPackages > 0) && !mOperationPending);
- mButtonInstall.setText(
- numPackages == 0 ? "Install packages..." : // disabled button case
- numPackages == 1 ? "Install 1 package..." :
- String.format("Install %d packages...", numPackages));
- }
-
- if (!mButtonDelete.isDisposed()) {
- // We can only delete local archives
- int numPackages = getArchivesToDelete(null /*outMsg*/, null /*outArchives*/);
-
- mButtonDelete.setEnabled((numPackages > 0) && !mOperationPending);
- mButtonDelete.setText(
- numPackages == 0 ? "Delete packages..." : // disabled button case
- numPackages == 1 ? "Delete 1 package..." :
- String.format("Delete %d packages...", numPackages));
- }
- }
-
- /**
- * Called when the Install Package button is selected.
- * Collects the packages to be installed and shows the installation window.
- */
- private void onButtonInstall() {
- ArrayList<Archive> archives = new ArrayList<Archive>();
- getArchivesForInstall(archives);
-
- if (mImpl.mUpdaterData != null) {
- boolean needsRefresh = false;
- try {
- beginOperationPending();
-
- List<Archive> installed = mImpl.mUpdaterData.updateOrInstallAll_WithGUI(
- archives,
- mCheckFilterObsolete.getSelection() /* includeObsoletes */,
- mContext == SdkInvocationContext.IDE ?
- UpdaterData.TOOLS_MSG_UPDATED_FROM_ADT :
- UpdaterData.TOOLS_MSG_UPDATED_FROM_SDKMAN);
- needsRefresh = installed != null && !installed.isEmpty();
- } finally {
- endOperationPending();
-
- if (needsRefresh) {
- // The local package list has changed, make sure to refresh it
- mImpl.localReload();
- }
- }
- }
- }
-
- /**
- * Selects the archives that can be installed.
- * This can be used with a null {@code outArchives} just to count the number of
- * installable archives.
- *
- * @param outArchives An archive list where to add the archives that can be installed.
- * This can be null.
- * @return The number of archives that can be installed.
- */
- private int getArchivesForInstall(List<Archive> outArchives) {
- if (mTreeViewer == null ||
- mTreeViewer.getTree() == null ||
- mTreeViewer.getTree().isDisposed()) {
- return 0;
- }
- Object[] checked = mTreeViewer.getCheckedElements();
- if (checked == null) {
- return 0;
- }
-
- int count = 0;
-
- // Give us a way to force install of incompatible archives.
- boolean checkIsCompatible =
- System.getenv(ArchiveInstaller.ENV_VAR_IGNORE_COMPAT) == null;
-
- if (mDisplayArchives) {
- // In detail mode, we display archives so we can install only the
- // archives that are actually selected.
-
- for (Object c : checked) {
- if (c instanceof Archive) {
- Archive a = (Archive) c;
- if (a != null) {
- if (checkIsCompatible && !a.isCompatible()) {
- continue;
- }
- count++;
- if (outArchives != null) {
- outArchives.add((Archive) c);
- }
- }
- }
- }
- } else {
- // In non-detail mode, we install all the compatible archives
- // found in the selected pkg items. We also automatically
- // select update packages rather than the root package if any.
-
- for (Object c : checked) {
- Package p = null;
- if (c instanceof Package) {
- // This is an update package
- p = (Package) c;
- } else if (c instanceof PkgItem) {
- p = ((PkgItem) c).getMainPackage();
-
- PkgItem pi = (PkgItem) c;
- if (pi.getState() == PkgState.INSTALLED) {
- // We don't allow installing items that are already installed
- // unless they have a pending update.
- p = pi.getUpdatePkg();
-
- } else if (pi.getState() == PkgState.NEW) {
- p = pi.getMainPackage();
- }
- }
- if (p != null) {
- for (Archive a : p.getArchives()) {
- if (a != null) {
- if (checkIsCompatible && !a.isCompatible()) {
- continue;
- }
- count++;
- if (outArchives != null) {
- outArchives.add(a);
- }
- }
- }
- }
- }
- }
-
- return count;
- }
-
- /**
- * Called when the Delete Package button is selected.
- * Collects the packages to be deleted, prompt the user for confirmation
- * and actually performs the deletion.
- */
- private void onButtonDelete() {
- final String title = "Delete SDK Package";
- StringBuilder msg = new StringBuilder("Are you sure you want to delete:");
-
- // A list of archives to delete
- final ArrayList<Archive> archives = new ArrayList<Archive>();
-
- getArchivesToDelete(msg, archives);
-
- if (!archives.isEmpty()) {
- msg.append("\n").append("This cannot be undone."); //$NON-NLS-1$
- if (MessageDialog.openQuestion(getShell(), title, msg.toString())) {
- try {
- beginOperationPending();
-
- mImpl.mUpdaterData.getTaskFactory().start("Delete Package", new ITask() {
- @Override
- public void run(ITaskMonitor monitor) {
- monitor.setProgressMax(archives.size() + 1);
- for (Archive a : archives) {
- monitor.setDescription("Deleting '%1$s' (%2$s)",
- a.getParentPackage().getShortDescription(),
- a.getLocalOsPath());
-
- // Delete the actual package
- a.deleteLocal();
-
- monitor.incProgress(1);
- if (monitor.isCancelRequested()) {
- break;
- }
- }
-
- monitor.incProgress(1);
- monitor.setDescription("Done");
- }
- });
- } finally {
- endOperationPending();
-
- // The local package list has changed, make sure to refresh it
- mImpl.localReload();
- }
- }
- }
- }
-
- /**
- * Selects the archives that can be deleted and collect their names.
- * This can be used with a null {@code outArchives} and a null {@code outMsg}
- * just to count the number of archives to be deleted.
- *
- * @param outMsg A StringBuilder where the names of the packages to be deleted is
- * accumulated. This is used to confirm deletion with the user.
- * @param outArchives An archive list where to add the archives that can be installed.
- * This can be null.
- * @return The number of archives that can be deleted.
- */
- private int getArchivesToDelete(StringBuilder outMsg, List<Archive> outArchives) {
- if (mTreeViewer == null ||
- mTreeViewer.getTree() == null ||
- mTreeViewer.getTree().isDisposed()) {
- return 0;
- }
- Object[] checked = mTreeViewer.getCheckedElements();
- if (checked == null) {
- // This should not happen since the button should be disabled
- return 0;
- }
-
- int count = 0;
-
- if (mDisplayArchives) {
- // In detail mode, select archives that can be deleted
-
- for (Object c : checked) {
- if (c instanceof Archive) {
- Archive a = (Archive) c;
- if (a != null && a.isLocal()) {
- count++;
- if (outMsg != null) {
- String osPath = a.getLocalOsPath();
- File dir = new File(osPath);
- Package p = a.getParentPackage();
- if (p != null && dir.isDirectory()) {
- outMsg.append("\n - ") //$NON-NLS-1$
- .append(p.getShortDescription());
- }
- }
- if (outArchives != null) {
- outArchives.add(a);
- }
- }
- }
- }
- } else {
- // In non-detail mode, select archives of selected packages that can be deleted.
-
- for (Object c : checked) {
- if (c instanceof PkgItem) {
- PkgItem pi = (PkgItem) c;
- PkgState state = pi.getState();
- if (state == PkgState.INSTALLED) {
- Package p = pi.getMainPackage();
-
- for (Archive a : p.getArchives()) {
- if (a != null && a.isLocal()) {
- count++;
- if (outMsg != null) {
- String osPath = a.getLocalOsPath();
- File dir = new File(osPath);
- if (dir.isDirectory()) {
- outMsg.append("\n - ") //$NON-NLS-1$
- .append(p.getShortDescription());
- }
- }
- if (outArchives != null) {
- outArchives.add(a);
- }
- }
- }
- }
- }
- }
- }
-
- return count;
- }
-
- // ----------------------
-
-
- // --- Implementation of ISdkChangeListener ---
-
- @Override
- public void onSdkLoaded() {
- onSdkReload();
- }
-
- @Override
- public void onSdkReload() {
- // The sdkmanager finished reloading its data. We must not call localReload() from here
- // since we don't want to alter the sdkmanager's data that just finished loading.
- mImpl.loadPackages();
- }
-
- @Override
- public void preInstallHook() {
- // nothing to be done for now.
- }
-
- @Override
- public void postInstallHook() {
- // nothing to be done for now.
- }
-
-
- // --- End of hiding from SWT Designer ---
- //$hide<<$
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/PackagesPageIcons.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/PackagesPageIcons.java
deleted file mode 100755
index 4fe8fca..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/PackagesPageIcons.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository.ui;
-
-
-/**
- * Icons used by {@link PackagesPage}.
- */
-public class PackagesPageIcons {
-
- public static final String ICON_CAT_OTHER = "pkgcat_other_16.png"; //$NON-NLS-1$
- public static final String ICON_CAT_PLATFORM = "pkgcat_16.png"; //$NON-NLS-1$
- public static final String ICON_SORT_BY_SOURCE = "source_icon16.png"; //$NON-NLS-1$
- public static final String ICON_SORT_BY_API = "platform_pkg_16.png"; //$NON-NLS-1$
- public static final String ICON_PKG_NEW = "pkg_new_16.png"; //$NON-NLS-1$
- public static final String ICON_PKG_INCOMPAT = "pkg_incompat_16.png"; //$NON-NLS-1$
- public static final String ICON_PKG_UPDATE = "pkg_update_16.png"; //$NON-NLS-1$
- public static final String ICON_PKG_INSTALLED = "pkg_installed_16.png"; //$NON-NLS-1$
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/PackagesPageImpl.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/PackagesPageImpl.java
deleted file mode 100755
index 96d9db2..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/PackagesPageImpl.java
+++ /dev/null
@@ -1,574 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository.ui;
-
-import com.android.SdkConstants;
-import com.android.sdklib.internal.repository.DownloadCache;
-import com.android.sdklib.internal.repository.DownloadCache.Strategy;
-import com.android.sdklib.internal.repository.IDescription;
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdkuilib.internal.repository.UpdaterData;
-import com.android.sdkuilib.internal.repository.core.PackageLoader;
-import com.android.sdkuilib.internal.repository.core.PackageLoader.ISourceLoadedCallback;
-import com.android.sdkuilib.internal.repository.core.PackagesDiffLogic;
-import com.android.sdkuilib.internal.repository.core.PkgCategory;
-import com.android.sdkuilib.internal.repository.core.PkgCategoryApi;
-import com.android.sdkuilib.internal.repository.core.PkgContentProvider;
-import com.android.sdkuilib.internal.repository.core.PkgItem;
-import com.android.sdkuilib.internal.repository.core.PkgItem.PkgState;
-import com.android.sdkuilib.internal.repository.icons.ImageFactory;
-
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.IInputProvider;
-import org.eclipse.jface.viewers.ITableFontProvider;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.List;
-
-/**
- * Base class for {@link PackagesPage} that holds most of the logic to display
- * the tree/list of packages. This class holds most of the logic and {@link PackagesPage}
- * holds most of the UI (creating the UI, dealing with menus and buttons and tree
- * selection.) This makes it easier to test the functionality by mocking only a
- * subset of the UI.
- */
-abstract class PackagesPageImpl {
-
- final UpdaterData mUpdaterData;
- final PackagesDiffLogic mDiffLogic;
-
- private ICheckboxTreeViewer mITreeViewer;
- private ITreeViewerColumn mIColumnName;
- private ITreeViewerColumn mIColumnApi;
- private ITreeViewerColumn mIColumnRevision;
- private ITreeViewerColumn mIColumnStatus;
-
- PackagesPageImpl(UpdaterData updaterData) {
- mUpdaterData = updaterData;
- mDiffLogic = new PackagesDiffLogic(updaterData);
- }
-
- /**
- * Utility method that derived classes can override to check whether the UI is disposed.
- * When the UI is disposed, most operations that affect the UI will be bypassed.
- * @return True if UI is not available and should not be touched.
- */
- abstract protected boolean isUiDisposed();
-
- /**
- * Utility method to execute a runnable on the main UI thread.
- * Will do nothing if {@link #isUiDisposed()} returns false.
- * @param runnable The runnable to execute on the main UI thread.
- */
- abstract protected void syncExec(Runnable runnable);
-
- /**
- * Synchronizes the 'checked' state of PkgItems in the tree with their internal isChecked state.
- */
- abstract protected void syncViewerSelection();
-
- void performFirstLoad() {
- // First a package loader is created that only checks
- // the local cache xml files. It populates the package
- // list based on what the client got last, essentially.
- loadPackages(true /*useLocalCache*/, false /*overrideExisting*/);
-
- // Next a regular package loader is created that will
- // respect the expiration and refresh parameters of the
- // download cache.
- loadPackages(false /*useLocalCache*/, true /*overrideExisting*/);
- }
-
- public void setITreeViewer(ICheckboxTreeViewer iTreeViewer) {
- mITreeViewer = iTreeViewer;
- }
-
- public void setIColumns(
- ITreeViewerColumn columnName,
- ITreeViewerColumn columnApi,
- ITreeViewerColumn columnRevision,
- ITreeViewerColumn columnStatus) {
- mIColumnName = columnName;
- mIColumnApi = columnApi;
- mIColumnRevision = columnRevision;
- mIColumnStatus = columnStatus;
- }
-
- void postCreate() {
- // Caller needs to call setITreeViewer before this.
- assert mITreeViewer != null;
- // Caller needs to call setIColumns before this.
- assert mIColumnApi != null;
- assert mIColumnName != null;
- assert mIColumnStatus != null;
- assert mIColumnRevision != null;
-
- mITreeViewer.setContentProvider(new PkgContentProvider(mITreeViewer));
-
- mIColumnApi.setLabelProvider(
- new PkgTreeColumnViewerLabelProvider(new PkgCellLabelProvider(mIColumnApi)));
- mIColumnName.setLabelProvider(
- new PkgTreeColumnViewerLabelProvider(new PkgCellLabelProvider(mIColumnName)));
- mIColumnStatus.setLabelProvider(
- new PkgTreeColumnViewerLabelProvider(new PkgCellLabelProvider(mIColumnStatus)));
- mIColumnRevision.setLabelProvider(
- new PkgTreeColumnViewerLabelProvider(new PkgCellLabelProvider(mIColumnRevision)));
- }
-
- /**
- * Performs a full reload by removing all cached packages data, including the platforms
- * and addons from the sdkmanager instance. This will perform a full local parsing
- * as well as a full reload of the remote data (by fetching all sources again.)
- */
- void fullReload() {
- // Clear all source information, forcing them to be refreshed.
- mUpdaterData.getSources().clearAllPackages();
- // Clear and reload all local data too.
- localReload();
- }
-
- /**
- * Performs a full reload of all the local package information, including the platforms
- * and addons from the sdkmanager instance. This will perform a full local parsing.
- * <p/>
- * This method does NOT force a new fetch of the remote sources.
- *
- * @see #fullReload()
- */
- void localReload() {
- // Clear all source caches, otherwise loading will use the cached data
- mUpdaterData.getLocalSdkParser().clearPackages();
- mUpdaterData.getSdkManager().reloadSdk(mUpdaterData.getSdkLog());
- loadPackages();
- }
-
- /**
- * Performs a "normal" reload of the package information, use the default download
- * cache and refreshing strategy as needed.
- */
- void loadPackages() {
- loadPackages(false /*useLocalCache*/, false /*overrideExisting*/);
- }
-
- /**
- * Performs a reload of the package information.
- *
- * @param useLocalCache When true, the {@link PackageLoader} is switched to use
- * a specific {@link DownloadCache} using the {@link Strategy#ONLY_CACHE}, meaning
- * it will only use data from the local cache. It will not try to fetch or refresh
- * manifests. This is used once the very first time the sdk manager window opens
- * and is typically followed by a regular load with refresh.
- */
- abstract protected void loadPackages(boolean useLocalCache, boolean overrideExisting);
-
- /**
- * Actual implementation of {@link #loadPackages(boolean, boolean)}.
- * Derived implementations must call this to do the actual work after setting up the UI.
- */
- void loadPackagesImpl(final boolean useLocalCache, final boolean overrideExisting) {
- if (mUpdaterData == null) {
- return;
- }
-
- final boolean displaySortByApi = isSortByApi();
-
- PackageLoader packageLoader = getPackageLoader(useLocalCache);
- assert packageLoader != null;
-
- mDiffLogic.updateStart();
- packageLoader.loadPackages(overrideExisting, new ISourceLoadedCallback() {
- @Override
- public boolean onUpdateSource(SdkSource source, Package[] newPackages) {
- // This runs in a thread and must not access UI directly.
- final boolean changed = mDiffLogic.updateSourcePackages(
- displaySortByApi, source, newPackages);
-
- syncExec(new Runnable() {
- @Override
- public void run() {
- if (changed ||
- mITreeViewer.getInput() != mDiffLogic.getCategories(isSortByApi())) {
- refreshViewerInput();
- }
- }
- });
-
- // Return true to tell the loader to continue with the next source.
- // Return false to stop the loader if any UI has been disposed, which can
- // happen if the user is trying to close the window during the load operation.
- return !isUiDisposed();
- }
-
- @Override
- public void onLoadCompleted() {
- // This runs in a thread and must not access UI directly.
- final boolean changed = mDiffLogic.updateEnd(displaySortByApi);
-
- syncExec(new Runnable() {
- @Override
- public void run() {
- if (changed ||
- mITreeViewer.getInput() != mDiffLogic.getCategories(isSortByApi())) {
- try {
- refreshViewerInput();
- } catch (Exception ignore) {}
- }
-
- if (!useLocalCache &&
- mDiffLogic.isFirstLoadComplete() &&
- !isUiDisposed()) {
- // At the end of the first load, if nothing is selected then
- // automatically select all new and update packages.
- Object[] checked = mITreeViewer.getCheckedElements();
- if (checked == null || checked.length == 0) {
- onSelectNewUpdates(
- false, //selectNew
- true, //selectUpdates,
- true); //selectTop
- }
- }
- }
- });
- }
- });
- }
-
- /**
- * Used by {@link #loadPackagesImpl(boolean, boolean)} to get the package
- * loader for the first or second pass update. When starting the manager
- * starts with a first pass that reads only from the local cache, with no
- * extra network access. That's {@code useLocalCache} being true.
- * <p/>
- * Leter it does a second pass with {@code useLocalCache} set to false
- * and actually uses the download cache specified in {@link UpdaterData}.
- *
- * This is extracted so that we can control this cache via unit tests.
- */
- protected PackageLoader getPackageLoader(boolean useLocalCache) {
- if (useLocalCache) {
- return new PackageLoader(mUpdaterData, new DownloadCache(Strategy.ONLY_CACHE));
- } else {
- return mUpdaterData.getPackageLoader();
- }
- }
-
- /**
- * Overridden by the UI to respond to a request to refresh the tree viewer
- * when the input has changed.
- * The implementation must call {@link #setViewerInput()} somehow and will
- * also need to adjust the expand state of the tree items and/or update
- * some buttons or other state.
- */
- abstract protected void refreshViewerInput();
-
- /**
- * Invoked from {@link #refreshViewerInput()} to actually either set the
- * input of the tree viewer or refresh it if it's the <em>same</em> input
- * object.
- */
- protected void setViewerInput() {
- List<PkgCategory> cats = mDiffLogic.getCategories(isSortByApi());
- if (mITreeViewer.getInput() != cats) {
- // set initial input
- mITreeViewer.setInput(cats);
- } else {
- // refresh existing, which preserves the expanded state, the selection
- // and the checked state.
- mITreeViewer.refresh();
- }
- }
-
- /**
- * Overridden by the UI to determine if the tree should display packages sorted
- * by API (returns true) or by repository source (returns false.)
- */
- abstract protected boolean isSortByApi();
-
- /**
- * Checks all PkgItems that are either new or have updates or select top platform
- * for initial run.
- */
- void onSelectNewUpdates(boolean selectNew, boolean selectUpdates, boolean selectTop) {
- // This does not update the tree itself, syncViewerSelection does it in the caller.
- mDiffLogic.checkNewUpdateItems(
- selectNew,
- selectUpdates,
- selectTop,
- SdkConstants.CURRENT_PLATFORM);
- syncViewerSelection();
- }
-
- /**
- * Deselect all checked PkgItems.
- */
- void onDeselectAll() {
- // This does not update the tree itself, syncViewerSelection does it in the caller.
- mDiffLogic.uncheckAllItems();
- }
-
- // ----------------------
-
- abstract protected Font getTreeFontItalic();
-
- class PkgCellLabelProvider extends ColumnLabelProvider implements ITableFontProvider {
-
- private final ITreeViewerColumn mColumn;
-
- public PkgCellLabelProvider(ITreeViewerColumn column) {
- super();
- mColumn = column;
- }
-
- @Override
- public String getText(Object element) {
-
- if (mColumn == mIColumnName) {
- if (element instanceof PkgCategory) {
- return ((PkgCategory) element).getLabel();
- } else if (element instanceof PkgItem) {
- return getPkgItemName((PkgItem) element);
- } else if (element instanceof IDescription) {
- return ((IDescription) element).getShortDescription();
- }
-
- } else if (mColumn == mIColumnApi) {
- int api = -1;
- if (element instanceof PkgItem) {
- api = ((PkgItem) element).getApi();
- }
- if (api >= 1) {
- return Integer.toString(api);
- }
-
- } else if (mColumn == mIColumnRevision) {
- if (element instanceof PkgItem) {
- PkgItem pkg = (PkgItem) element;
- return pkg.getRevision().toShortString();
- }
-
- } else if (mColumn == mIColumnStatus) {
- if (element instanceof PkgItem) {
- PkgItem pkg = (PkgItem) element;
-
- switch(pkg.getState()) {
- case INSTALLED:
- Package update = pkg.getUpdatePkg();
- if (update != null) {
- return String.format(
- "Update available: rev. %1$s",
- update.getRevision().toShortString());
- }
- return "Installed";
-
- case NEW:
- Package p = pkg.getMainPackage();
- if (p != null && p.hasCompatibleArchive()) {
- return "Not installed";
- } else {
- return String.format("Not compatible with %1$s",
- SdkConstants.currentPlatformName());
- }
- }
- return pkg.getState().toString();
-
- } else if (element instanceof Package) {
- // This is an update package.
- return "New revision " + ((Package) element).getRevision().toShortString();
- }
- }
-
- return ""; //$NON-NLS-1$
- }
-
- private String getPkgItemName(PkgItem item) {
- String name = item.getName().trim();
-
- if (isSortByApi()) {
- // When sorting by API, the package name might contains the API number
- // or the platform name at the end. If we find it, cut it out since it's
- // redundant.
-
- PkgCategoryApi cat = (PkgCategoryApi) findCategoryForItem(item);
- String apiLabel = cat.getApiLabel();
- String platLabel = cat.getPlatformName();
-
- if (platLabel != null && name.endsWith(platLabel)) {
- return name.substring(0, name.length() - platLabel.length());
-
- } else if (apiLabel != null && name.endsWith(apiLabel)) {
- return name.substring(0, name.length() - apiLabel.length());
-
- } else if (platLabel != null && item.isObsolete() && name.indexOf(platLabel) > 0) {
- // For obsolete items, the format is "<base name> <platform name> (Obsolete)"
- // so in this case only accept removing a platform name that is not at
- // the end.
- name = name.replace(platLabel, ""); //$NON-NLS-1$
- }
- }
-
- // Collapse potential duplicated spacing
- name = name.replaceAll(" +", " "); //$NON-NLS-1$ //$NON-NLS-2$
-
- return name;
- }
-
- private PkgCategory findCategoryForItem(PkgItem item) {
- List<PkgCategory> cats = mDiffLogic.getCategories(isSortByApi());
- for (PkgCategory cat : cats) {
- for (PkgItem i : cat.getItems()) {
- if (i == item) {
- return cat;
- }
- }
- }
-
- return null;
- }
-
- @Override
- public Image getImage(Object element) {
- ImageFactory imgFactory = mUpdaterData.getImageFactory();
-
- if (imgFactory != null) {
- if (mColumn == mIColumnName) {
- if (element instanceof PkgCategory) {
- return imgFactory.getImageForObject(((PkgCategory) element).getIconRef());
- } else if (element instanceof PkgItem) {
- return imgFactory.getImageForObject(((PkgItem) element).getMainPackage());
- }
- return imgFactory.getImageForObject(element);
-
- } else if (mColumn == mIColumnStatus && element instanceof PkgItem) {
- PkgItem pi = (PkgItem) element;
- switch(pi.getState()) {
- case INSTALLED:
- if (pi.hasUpdatePkg()) {
- return imgFactory.getImageByName(PackagesPageIcons.ICON_PKG_UPDATE);
- } else {
- return imgFactory.getImageByName(PackagesPageIcons.ICON_PKG_INSTALLED);
- }
- case NEW:
- Package p = pi.getMainPackage();
- if (p != null && p.hasCompatibleArchive()) {
- return imgFactory.getImageByName(PackagesPageIcons.ICON_PKG_NEW);
- } else {
- return imgFactory.getImageByName(PackagesPageIcons.ICON_PKG_INCOMPAT);
- }
- }
- }
- }
- return super.getImage(element);
- }
-
- // -- ITableFontProvider
-
- @Override
- public Font getFont(Object element, int columnIndex) {
- if (element instanceof PkgItem) {
- if (((PkgItem) element).getState() == PkgState.NEW) {
- return getTreeFontItalic();
- }
- } else if (element instanceof Package) {
- // update package
- return getTreeFontItalic();
- }
- return super.getFont(element);
- }
-
- // -- Tooltip support
-
- @Override
- public String getToolTipText(Object element) {
- PkgItem pi = element instanceof PkgItem ? (PkgItem) element : null;
- if (pi != null) {
- element = pi.getMainPackage();
- }
- if (element instanceof IDescription) {
- String s = getTooltipDescription((IDescription) element);
-
- if (pi != null && pi.hasUpdatePkg()) {
- s += "\n-----------------" + //$NON-NLS-1$
- "\nUpdate Available:\n" + //$NON-NLS-1$
- getTooltipDescription(pi.getUpdatePkg());
- }
-
- return s;
- }
- return super.getToolTipText(element);
- }
-
- private String getTooltipDescription(IDescription element) {
- String s = element.getLongDescription();
- if (element instanceof Package) {
- Package p = (Package) element;
-
- if (!p.isLocal()) {
- // For non-installed item, try to find a download size
- for (Archive a : p.getArchives()) {
- if (!a.isLocal() && a.isCompatible()) {
- s += '\n' + a.getSizeDescription();
- break;
- }
- }
- }
-
- // Display info about where this package comes/came from
- SdkSource src = p.getParentSource();
- if (src != null) {
- try {
- URL url = new URL(src.getUrl());
- String host = url.getHost();
- if (p.isLocal()) {
- s += String.format("\nInstalled from %1$s", host);
- } else {
- s += String.format("\nProvided by %1$s", host);
- }
- } catch (MalformedURLException ignore) {
- }
- }
- }
- return s;
- }
-
- @Override
- public Point getToolTipShift(Object object) {
- return new Point(15, 5);
- }
-
- @Override
- public int getToolTipDisplayDelayTime(Object object) {
- return 500;
- }
- }
-
- interface ICheckboxTreeViewer extends IInputProvider {
- void setContentProvider(PkgContentProvider pkgContentProvider);
- void refresh();
- void setInput(List<PkgCategory> cats);
- Object[] getCheckedElements();
- }
-
- interface ITreeViewerColumn {
- void setLabelProvider(ColumnLabelProvider labelProvider);
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/PkgTreeColumnViewerLabelProvider.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/PkgTreeColumnViewerLabelProvider.java
deleted file mode 100755
index 3323104..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/PkgTreeColumnViewerLabelProvider.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository.ui;
-
-import org.eclipse.jface.viewers.CellLabelProvider;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.TreeColumnViewerLabelProvider;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeViewerColumn;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-
-/**
- * A custom version of {@link TreeColumnViewerLabelProvider} which
- * handles {@link TreePath}s and delegates content to the given
- * {@link ColumnLabelProvider} for a given {@link TreeViewerColumn}.
- * <p/>
- * The implementation handles a variety of providers (table label, table
- * color, table font) but does not implement a tooltip provider, so we
- * delegate the calls here to the appropriate {@link ColumnLabelProvider}.
- * <p/>
- * Only {@link #getToolTipText(Object)} is really useful for us but we
- * delegate all the tooltip calls for completeness and avoid surprises later
- * if we ever decide to override more things in the label provider.
- */
-class PkgTreeColumnViewerLabelProvider extends TreeColumnViewerLabelProvider {
-
- private CellLabelProvider mTooltipProvider;
-
- public PkgTreeColumnViewerLabelProvider(ColumnLabelProvider columnLabelProvider) {
- super(columnLabelProvider);
- }
-
- @Override
- public void setProviders(Object provider) {
- super.setProviders(provider);
- if (provider instanceof CellLabelProvider) {
- mTooltipProvider = (CellLabelProvider) provider;
- }
- }
-
- @Override
- public Image getToolTipImage(Object object) {
- if (mTooltipProvider != null) {
- return mTooltipProvider.getToolTipImage(object);
- }
- return super.getToolTipImage(object);
- }
-
- @Override
- public String getToolTipText(Object element) {
- if (mTooltipProvider != null) {
- return mTooltipProvider.getToolTipText(element);
- }
- return super.getToolTipText(element);
- }
-
- @Override
- public Color getToolTipBackgroundColor(Object object) {
- if (mTooltipProvider != null) {
- return mTooltipProvider.getToolTipBackgroundColor(object);
- }
- return super.getToolTipBackgroundColor(object);
- }
-
- @Override
- public Color getToolTipForegroundColor(Object object) {
- if (mTooltipProvider != null) {
- return mTooltipProvider.getToolTipForegroundColor(object);
- }
- return super.getToolTipForegroundColor(object);
- }
-
- @Override
- public Font getToolTipFont(Object object) {
- if (mTooltipProvider != null) {
- return mTooltipProvider.getToolTipFont(object);
- }
- return super.getToolTipFont(object);
- }
-
- @Override
- public Point getToolTipShift(Object object) {
- if (mTooltipProvider != null) {
- return mTooltipProvider.getToolTipShift(object);
- }
- return super.getToolTipShift(object);
- }
-
- @Override
- public boolean useNativeToolTip(Object object) {
- if (mTooltipProvider != null) {
- return mTooltipProvider.useNativeToolTip(object);
- }
- return super.useNativeToolTip(object);
- }
-
- @Override
- public int getToolTipTimeDisplayed(Object object) {
- if (mTooltipProvider != null) {
- return mTooltipProvider.getToolTipTimeDisplayed(object);
- }
- return super.getToolTipTimeDisplayed(object);
- }
-
- @Override
- public int getToolTipDisplayDelayTime(Object object) {
- if (mTooltipProvider != null) {
- return mTooltipProvider.getToolTipDisplayDelayTime(object);
- }
- return super.getToolTipDisplayDelayTime(object);
- }
-
- @Override
- public int getToolTipStyle(Object object) {
- if (mTooltipProvider != null) {
- return mTooltipProvider.getToolTipStyle(object);
- }
- return super.getToolTipStyle(object);
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/SdkUpdaterWindowImpl2.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/SdkUpdaterWindowImpl2.java
deleted file mode 100755
index ae1bf6b..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/SdkUpdaterWindowImpl2.java
+++ /dev/null
@@ -1,590 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository.ui;
-
-
-import com.android.SdkConstants;
-import com.android.sdklib.internal.repository.ITaskFactory;
-import com.android.sdklib.internal.repository.sources.SdkSourceProperties;
-import com.android.sdkuilib.internal.repository.AboutDialog;
-import com.android.sdkuilib.internal.repository.ISdkUpdaterWindow;
-import com.android.sdkuilib.internal.repository.MenuBarWrapper;
-import com.android.sdkuilib.internal.repository.SettingsController;
-import com.android.sdkuilib.internal.repository.SettingsController.Settings;
-import com.android.sdkuilib.internal.repository.SettingsDialog;
-import com.android.sdkuilib.internal.repository.UpdaterData;
-import com.android.sdkuilib.internal.repository.icons.ImageFactory;
-import com.android.sdkuilib.internal.repository.ui.PackagesPage.MenuAction;
-import com.android.sdkuilib.internal.tasks.ILogUiProvider;
-import com.android.sdkuilib.internal.tasks.ProgressView;
-import com.android.sdkuilib.internal.tasks.ProgressViewFactory;
-import com.android.sdkuilib.internal.widgets.ImgDisabledButton;
-import com.android.sdkuilib.internal.widgets.ToggleButton;
-import com.android.sdkuilib.repository.AvdManagerWindow.AvdInvocationContext;
-import com.android.sdkuilib.repository.ISdkChangeListener;
-import com.android.sdkuilib.repository.SdkUpdaterWindow.SdkInvocationContext;
-import com.android.utils.ILogger;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.swt.widgets.ProgressBar;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * This is the private implementation of the UpdateWindow
- * for the second version of the SDK Manager.
- * <p/>
- * This window features only one embedded page, the combined installed+available package list.
- */
-public class SdkUpdaterWindowImpl2 implements ISdkUpdaterWindow {
-
- public static final String APP_NAME = "Android SDK Manager";
- private static final String SIZE_POS_PREFIX = "sdkman2"; //$NON-NLS-1$
-
- private final Shell mParentShell;
- private final SdkInvocationContext mContext;
- /** Internal data shared between the window and its pages. */
- private final UpdaterData mUpdaterData;
-
- // --- UI members ---
-
- protected Shell mShell;
- private PackagesPage mPkgPage;
- private ProgressBar mProgressBar;
- private Label mStatusText;
- private ImgDisabledButton mButtonStop;
- private ToggleButton mButtonShowLog;
- private SettingsController mSettingsController;
- private LogWindow mLogWindow;
-
- /**
- * Creates a new window. Caller must call open(), which will block.
- *
- * @param parentShell Parent shell.
- * @param sdkLog Logger. Cannot be null.
- * @param osSdkRoot The OS path to the SDK root.
- * @param context The {@link SdkInvocationContext} to change the behavior depending on who's
- * opening the SDK Manager.
- */
- public SdkUpdaterWindowImpl2(
- Shell parentShell,
- ILogger sdkLog,
- String osSdkRoot,
- SdkInvocationContext context) {
- mParentShell = parentShell;
- mContext = context;
- mUpdaterData = new UpdaterData(osSdkRoot, sdkLog);
- }
-
- /**
- * Creates a new window. Caller must call open(), which will block.
- * <p/>
- * This is to be used when the window is opened from {@link AvdManagerWindowImpl1}
- * to share the same {@link UpdaterData} structure.
- *
- * @param parentShell Parent shell.
- * @param updaterData The parent's updater data.
- * @param context The {@link SdkInvocationContext} to change the behavior depending on who's
- * opening the SDK Manager.
- */
- public SdkUpdaterWindowImpl2(
- Shell parentShell,
- UpdaterData updaterData,
- SdkInvocationContext context) {
- mParentShell = parentShell;
- mContext = context;
- mUpdaterData = updaterData;
- }
-
- /**
- * Opens the window.
- * @wbp.parser.entryPoint
- */
- @Override
- public void open() {
- if (mParentShell == null) {
- Display.setAppName(APP_NAME); //$hide$ (hide from SWT designer)
- }
-
- createShell();
- preCreateContent();
- createContents();
- createMenuBar();
- createLogWindow();
- mShell.open();
- mShell.layout();
-
- if (postCreateContent()) { //$hide$ (hide from SWT designer)
- Display display = Display.getDefault();
- while (!mShell.isDisposed()) {
- if (!display.readAndDispatch()) {
- display.sleep();
- }
- }
- }
-
- SdkSourceProperties p = new SdkSourceProperties();
- p.save();
-
- dispose(); //$hide$
- }
-
- private void createShell() {
- // The SDK Manager must use a shell trim when standalone
- // or a dialog trim when invoked from somewhere else.
- int style = SWT.SHELL_TRIM;
- if (mContext != SdkInvocationContext.STANDALONE) {
- style |= SWT.APPLICATION_MODAL;
- }
-
- mShell = new Shell(mParentShell, style);
- mShell.addDisposeListener(new DisposeListener() {
- @Override
- public void widgetDisposed(DisposeEvent e) {
- ShellSizeAndPos.saveSizeAndPos(mShell, SIZE_POS_PREFIX);
- onAndroidSdkUpdaterDispose(); //$hide$ (hide from SWT designer)
- }
- });
-
- GridLayout glShell = new GridLayout(2, false);
- glShell.verticalSpacing = 0;
- glShell.horizontalSpacing = 0;
- glShell.marginWidth = 0;
- glShell.marginHeight = 0;
- mShell.setLayout(glShell);
-
- mShell.setMinimumSize(new Point(600, 300));
- mShell.setSize(700, 500);
- mShell.setText(APP_NAME);
-
- ShellSizeAndPos.loadSizeAndPos(mShell, SIZE_POS_PREFIX);
- }
-
- private void createContents() {
- mPkgPage = new PackagesPage(mShell, SWT.NONE, mUpdaterData, mContext);
- mPkgPage.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
-
- Composite composite1 = new Composite(mShell, SWT.NONE);
- composite1.setLayout(new GridLayout(1, false));
- composite1.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-
- mProgressBar = new ProgressBar(composite1, SWT.NONE);
- mProgressBar.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-
- mStatusText = new Label(composite1, SWT.NONE);
- mStatusText.setText("Status Placeholder"); //$NON-NLS-1$ placeholder
- mStatusText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-
- Composite composite2 = new Composite(mShell, SWT.NONE);
- composite2.setLayout(new GridLayout(2, false));
-
- mButtonStop = new ImgDisabledButton(composite2, SWT.NONE,
- getImage("stop_enabled_16.png"), //$NON-NLS-1$
- getImage("stop_disabled_16.png"), //$NON-NLS-1$
- "Click to abort the current task",
- ""); //$NON-NLS-1$ nothing to abort
- mButtonStop.addListener(SWT.Selection, new Listener() {
- @Override
- public void handleEvent(Event event) {
- onStopSelected();
- }
- });
-
- mButtonShowLog = new ToggleButton(composite2, SWT.NONE,
- getImage("log_off_16.png"), //$NON-NLS-1$
- getImage("log_on_16.png"), //$NON-NLS-1$
- "Click to show the log window", // tooltip for state hidden=>shown
- "Click to hide the log window"); // tooltip for state shown=>hidden
- mButtonShowLog.addListener(SWT.Selection, new Listener() {
- @Override
- public void handleEvent(Event event) {
- onToggleLogWindow();
- }
- });
- }
-
- @SuppressWarnings("unused") // MenuItem works using side effects
- private void createMenuBar() {
-
- Menu menuBar = new Menu(mShell, SWT.BAR);
- mShell.setMenuBar(menuBar);
-
- MenuItem menuBarPackages = new MenuItem(menuBar, SWT.CASCADE);
- menuBarPackages.setText("Packages");
-
- Menu menuPkgs = new Menu(menuBarPackages);
- menuBarPackages.setMenu(menuPkgs);
-
- MenuItem showUpdatesNew = new MenuItem(menuPkgs,
- MenuAction.TOGGLE_SHOW_UPDATE_NEW_PKG.getMenuStyle());
- showUpdatesNew.setText(
- MenuAction.TOGGLE_SHOW_UPDATE_NEW_PKG.getMenuTitle());
- mPkgPage.registerMenuAction(
- MenuAction.TOGGLE_SHOW_UPDATE_NEW_PKG, showUpdatesNew);
-
- MenuItem showInstalled = new MenuItem(menuPkgs,
- MenuAction.TOGGLE_SHOW_INSTALLED_PKG.getMenuStyle());
- showInstalled.setText(
- MenuAction.TOGGLE_SHOW_INSTALLED_PKG.getMenuTitle());
- mPkgPage.registerMenuAction(
- MenuAction.TOGGLE_SHOW_INSTALLED_PKG, showInstalled);
-
- MenuItem showObsoletePackages = new MenuItem(menuPkgs,
- MenuAction.TOGGLE_SHOW_OBSOLETE_PKG.getMenuStyle());
- showObsoletePackages.setText(
- MenuAction.TOGGLE_SHOW_OBSOLETE_PKG.getMenuTitle());
- mPkgPage.registerMenuAction(
- MenuAction.TOGGLE_SHOW_OBSOLETE_PKG, showObsoletePackages);
-
- MenuItem showArchives = new MenuItem(menuPkgs,
- MenuAction.TOGGLE_SHOW_ARCHIVES.getMenuStyle());
- showArchives.setText(
- MenuAction.TOGGLE_SHOW_ARCHIVES.getMenuTitle());
- mPkgPage.registerMenuAction(
- MenuAction.TOGGLE_SHOW_ARCHIVES, showArchives);
-
- new MenuItem(menuPkgs, SWT.SEPARATOR);
-
- MenuItem sortByApi = new MenuItem(menuPkgs,
- MenuAction.SORT_API_LEVEL.getMenuStyle());
- sortByApi.setText(
- MenuAction.SORT_API_LEVEL.getMenuTitle());
- mPkgPage.registerMenuAction(
- MenuAction.SORT_API_LEVEL, sortByApi);
-
- MenuItem sortBySource = new MenuItem(menuPkgs,
- MenuAction.SORT_SOURCE.getMenuStyle());
- sortBySource.setText(
- MenuAction.SORT_SOURCE.getMenuTitle());
- mPkgPage.registerMenuAction(
- MenuAction.SORT_SOURCE, sortBySource);
-
- new MenuItem(menuPkgs, SWT.SEPARATOR);
-
- MenuItem reload = new MenuItem(menuPkgs,
- MenuAction.RELOAD.getMenuStyle());
- reload.setText(
- MenuAction.RELOAD.getMenuTitle());
- mPkgPage.registerMenuAction(
- MenuAction.RELOAD, reload);
-
- MenuItem menuBarTools = new MenuItem(menuBar, SWT.CASCADE);
- menuBarTools.setText("Tools");
-
- Menu menuTools = new Menu(menuBarTools);
- menuBarTools.setMenu(menuTools);
-
- if (mContext == SdkInvocationContext.STANDALONE) {
- MenuItem manageAvds = new MenuItem(menuTools, SWT.NONE);
- manageAvds.setText("Manage AVDs...");
- manageAvds.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent event) {
- onAvdManager();
- }
- });
- }
-
- MenuItem manageSources = new MenuItem(menuTools,
- MenuAction.SHOW_ADDON_SITES.getMenuStyle());
- manageSources.setText(
- MenuAction.SHOW_ADDON_SITES.getMenuTitle());
- mPkgPage.registerMenuAction(
- MenuAction.SHOW_ADDON_SITES, manageSources);
-
- if (mContext == SdkInvocationContext.STANDALONE || mContext == SdkInvocationContext.IDE) {
- try {
- new MenuBarWrapper(APP_NAME, menuTools) {
- @Override
- public void onPreferencesMenuSelected() {
-
- // capture a copy of the initial settings
- Settings settings1 = new Settings(mSettingsController.getSettings());
-
- // open the dialog and wait for it to close
- SettingsDialog sd = new SettingsDialog(mShell, mUpdaterData);
- sd.open();
-
- // get the new settings
- Settings settings2 = mSettingsController.getSettings();
-
- // We need to reload the package list if the http mode or the preview
- // modes have changed.
- if (settings1.getForceHttp() != settings2.getForceHttp() ||
- settings1.getEnablePreviews() != settings2.getEnablePreviews()) {
- mPkgPage.onSdkReload();
- }
- }
-
- @Override
- public void onAboutMenuSelected() {
- AboutDialog ad = new AboutDialog(mShell, mUpdaterData);
- ad.open();
- }
-
- @Override
- public void printError(String format, Object... args) {
- if (mUpdaterData != null) {
- mUpdaterData.getSdkLog().error(null, format, args);
- }
- }
- };
- } catch (Throwable e) {
- mUpdaterData.getSdkLog().error(e, "Failed to setup menu bar");
- e.printStackTrace();
- }
- }
- }
-
- private Image getImage(String filename) {
- if (mUpdaterData != null) {
- ImageFactory imgFactory = mUpdaterData.getImageFactory();
- if (imgFactory != null) {
- return imgFactory.getImageByName(filename);
- }
- }
- return null;
- }
-
- /**
- * Creates the log window.
- * <p/>
- * If this is invoked from an IDE, we also define a secondary logger so that all
- * messages flow to the IDE log. This may or may not be what we want in the end
- * (e.g. a middle ground would be to repeat error, and ignore normal/verbose)
- */
- private void createLogWindow() {
- mLogWindow = new LogWindow(mShell,
- mContext == SdkInvocationContext.IDE ? mUpdaterData.getSdkLog() : null);
- mLogWindow.open();
- }
-
-
- // -- Start of internal part ----------
- // Hide everything down-below from SWT designer
- //$hide>>$
-
- // --- Public API -----------
-
- /**
- * Adds a new listener to be notified when a change is made to the content of the SDK.
- */
- @Override
- public void addListener(ISdkChangeListener listener) {
- mUpdaterData.addListeners(listener);
- }
-
- /**
- * Removes a new listener to be notified anymore when a change is made to the content of
- * the SDK.
- */
- @Override
- public void removeListener(ISdkChangeListener listener) {
- mUpdaterData.removeListener(listener);
- }
-
- // --- Internals & UI Callbacks -----------
-
- /**
- * Called before the UI is created.
- */
- private void preCreateContent() {
- mUpdaterData.setWindowShell(mShell);
- // We need the UI factory to create the UI
- mUpdaterData.setImageFactory(new ImageFactory(mShell.getDisplay()));
- // Note: we can't create the TaskFactory yet because we need the UI
- // to be created first, so this is done in postCreateContent().
- }
-
- /**
- * Once the UI has been created, initializes the content.
- * This creates the pages, selects the first one, setups sources and scans for local folders.
- *
- * Returns true if we should show the window.
- */
- private boolean postCreateContent() {
- ProgressViewFactory factory = new ProgressViewFactory();
-
- // This class delegates all logging to the mLogWindow window
- // and filters errors to make sure the window is visible when
- // an error is logged.
- ILogUiProvider logAdapter = new ILogUiProvider() {
- @Override
- public void setDescription(String description) {
- mLogWindow.setDescription(description);
- }
-
- @Override
- public void log(String log) {
- mLogWindow.log(log);
- }
-
- @Override
- public void logVerbose(String log) {
- mLogWindow.logVerbose(log);
- }
-
- @Override
- public void logError(String log) {
- mLogWindow.logError(log);
-
- // Run the window visibility check/toggle on the UI thread.
- // Note: at least on Windows, it seems ok to check for the window visibility
- // on a sub-thread but that doesn't seem cross-platform safe. We shouldn't
- // have a lot of error logging, so this should be acceptable. If not, we could
- // cache the visibility state.
- if (mShell != null && !mShell.isDisposed()) {
- mShell.getDisplay().syncExec(new Runnable() {
- @Override
- public void run() {
- if (!mLogWindow.isVisible()) {
- // Don't toggle the window visibility directly.
- // Instead use the same action as the log-toggle button
- // so that the button's state be kept in sync.
- onToggleLogWindow();
- }
- }
- });
- }
- }
- };
-
- factory.setProgressView(
- new ProgressView(mStatusText, mProgressBar, mButtonStop, logAdapter));
- mUpdaterData.setTaskFactory(factory);
-
- setWindowImage(mShell);
-
- setupSources();
- initializeSettings();
-
- if (mUpdaterData.checkIfInitFailed()) {
- return false;
- }
-
- mUpdaterData.broadcastOnSdkLoaded();
-
- // Tell the one page its the selected one
- mPkgPage.performFirstLoad();
-
- return true;
- }
-
- /**
- * Creates the icon of the window shell.
- *
- * @param shell The shell on which to put the icon
- */
- private void setWindowImage(Shell shell) {
- String imageName = "android_icon_16.png"; //$NON-NLS-1$
- if (SdkConstants.currentPlatform() == SdkConstants.PLATFORM_DARWIN) {
- imageName = "android_icon_128.png"; //$NON-NLS-1$
- }
-
- if (mUpdaterData != null) {
- ImageFactory imgFactory = mUpdaterData.getImageFactory();
- if (imgFactory != null) {
- shell.setImage(imgFactory.getImageByName(imageName));
- }
- }
- }
-
- /**
- * Called by the main loop when the window has been disposed.
- */
- private void dispose() {
- mLogWindow.close();
- mUpdaterData.getSources().saveUserAddons(mUpdaterData.getSdkLog());
- }
-
- /**
- * Callback called when the window shell is disposed.
- */
- private void onAndroidSdkUpdaterDispose() {
- if (mUpdaterData != null) {
- ImageFactory imgFactory = mUpdaterData.getImageFactory();
- if (imgFactory != null) {
- imgFactory.dispose();
- }
- }
- }
-
- /**
- * Used to initialize the sources.
- */
- private void setupSources() {
- mUpdaterData.setupDefaultSources();
- }
-
- /**
- * Initializes settings.
- * This must be called after addExtraPages(), which created a settings page.
- * Iterate through all the pages to find the first (and supposedly unique) setting page,
- * and use it to load and apply these settings.
- */
- private void initializeSettings() {
- mSettingsController = mUpdaterData.getSettingsController();
- mSettingsController.loadSettings();
- mSettingsController.applySettings();
- }
-
- private void onToggleLogWindow() {
- // toggle visibility
- if (!mButtonShowLog.isDisposed()) {
- mLogWindow.setVisible(!mLogWindow.isVisible());
- mButtonShowLog.setState(mLogWindow.isVisible() ? 1 : 0);
- }
- }
-
- private void onStopSelected() {
- // TODO
- }
-
- private void onAvdManager() {
- ITaskFactory oldFactory = mUpdaterData.getTaskFactory();
-
- try {
- AvdManagerWindowImpl1 win = new AvdManagerWindowImpl1(
- mShell,
- mUpdaterData,
- AvdInvocationContext.DIALOG);
-
- win.open();
- } catch (Exception e) {
- mUpdaterData.getSdkLog().error(e, "AVD Manager window error");
- } finally {
- mUpdaterData.setTaskFactory(oldFactory);
- }
- }
-
- // End of hiding from SWT Designer
- //$hide<<$
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/ShellSizeAndPos.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/ShellSizeAndPos.java
deleted file mode 100755
index 4921ba0..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/ui/ShellSizeAndPos.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository.ui;
-
-
-import com.android.prefs.AndroidLocation;
-
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Monitor;
-import org.eclipse.swt.widgets.Shell;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Properties;
-
-/**
- * Utility to save & restore the size and position on a window
- * using a common config file.
- */
-public class ShellSizeAndPos {
-
- private static final String SETTINGS_FILENAME = "androidwin.cfg"; //$NON-NLS-1$
- private static final String PX = "_px"; //$NON-NLS-1$
- private static final String PY = "_py"; //$NON-NLS-1$
- private static final String SX = "_sx"; //$NON-NLS-1$
- private static final String SY = "_sy"; //$NON-NLS-1$
-
- public static void loadSizeAndPos(Shell shell, String prefix) {
- Properties props = loadProperties();
-
- try {
- int px = Integer.parseInt(props.getProperty(prefix + PX));
- int py = Integer.parseInt(props.getProperty(prefix + PY));
- int sx = Integer.parseInt(props.getProperty(prefix + SX));
- int sy = Integer.parseInt(props.getProperty(prefix + SY));
-
- Point p1 = new Point(px, py);
- Point p2 = new Point(px + sx, py + sy);
- Rectangle r = new Rectangle(px, py, sy, sy);
-
- Monitor bestMatch = null;
- int bestSurface = -1;
- for (Monitor monitor : shell.getDisplay().getMonitors()) {
- Rectangle area = monitor.getClientArea();
- if (area.contains(p1) && area.contains(p2)) {
- // The shell is fully visible on this monitor. Just use that.
- bestMatch = monitor;
- bestSurface = Integer.MAX_VALUE;
- break;
- } else {
- // Find which monitor displays the largest surface of the window.
- // We'll use this one to center the window there, to make sure we're not
- // starting split between several monitors.
- Rectangle i = area.intersection(r);
- int surface = i.width * i.height;
- if (surface > bestSurface) {
- bestSurface = surface;
- bestMatch = monitor;
- }
- }
- }
-
- if (bestMatch != null && bestSurface != Integer.MAX_VALUE) {
- // Recenter the window on this monitor and make sure it fits
- Rectangle area = bestMatch.getClientArea();
-
- sx = Math.min(sx, area.width);
- sy = Math.min(sy, area.height);
- px = area.x + (area.width - sx) / 2;
- py = area.y + (area.height - sy) / 2;
- }
-
- shell.setLocation(px, py);
- shell.setSize(sx, sy);
-
- } catch ( Exception e) {
- // Ignore exception. We could typically get NPE from the getProperty
- // or NumberFormatException from parseInt calls. Either way, do
- // nothing if anything goes wrong.
- }
- }
-
- public static void saveSizeAndPos(Shell shell, String prefix) {
- Properties props = loadProperties();
-
- Point loc = shell.getLocation();
- Point size = shell.getSize();
-
- props.setProperty(prefix + PX, Integer.toString(loc.x));
- props.setProperty(prefix + PY, Integer.toString(loc.y));
- props.setProperty(prefix + SX, Integer.toString(size.x));
- props.setProperty(prefix + SY, Integer.toString(size.y));
-
- saveProperties(props);
- }
-
- /**
- * Load properties saved in {@link #SETTINGS_FILENAME}.
- * If the file does not exists or doesn't load properly, just return an
- * empty set of properties.
- */
- private static Properties loadProperties() {
- Properties props = new Properties();
- FileInputStream fis = null;
-
- try {
- String folder = AndroidLocation.getFolder();
- File f = new File(folder, SETTINGS_FILENAME);
- if (f.exists()) {
- fis = new FileInputStream(f);
-
- props.load(fis);
- }
- } catch (Exception e) {
- // Ignore
- } finally {
- if (fis != null) {
- try {
- fis.close();
- } catch (IOException e) {
- }
- }
- }
-
- return props;
- }
-
- private static void saveProperties(Properties props) {
- FileOutputStream fos = null;
-
- try {
- String folder = AndroidLocation.getFolder();
- File f = new File(folder, SETTINGS_FILENAME);
- fos = new FileOutputStream(f);
-
- props.store(fos, "## Size and Pos for SDK Manager Windows"); //$NON-NLS-1$
-
- } catch (Exception e) {
- // ignore
- } finally {
- if (fos != null) {
- try {
- fos.close();
- } catch (IOException e) {
- }
- }
- }
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/ILogUiProvider.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/ILogUiProvider.java
deleted file mode 100755
index 8f77b7a..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/ILogUiProvider.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.tasks;
-
-
-/**
- * Interface for a user interface that displays the log from a task monitor.
- */
-public interface ILogUiProvider {
-
- /**
- * Sets the description in the current task dialog.
- * This method can be invoked from a non-UI thread.
- */
- public abstract void setDescription(String description);
-
- /**
- * Logs a "normal" information line.
- * This method can be invoked from a non-UI thread.
- */
- public abstract void log(String log);
-
- /**
- * Logs an "error" information line.
- * This method can be invoked from a non-UI thread.
- */
- public abstract void logError(String log);
-
- /**
- * Logs a "verbose" information line, that is extra details which are typically
- * not that useful for the end-user and might be hidden until explicitly shown.
- * This method can be invoked from a non-UI thread.
- */
- public abstract void logVerbose(String log);
-
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/IProgressUiProvider.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/IProgressUiProvider.java
deleted file mode 100755
index 4e2c131..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/IProgressUiProvider.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.tasks;
-
-import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.UserCredentials;
-
-import org.eclipse.swt.widgets.ProgressBar;
-
-/**
- * Interface for a user interface that displays both a task status
- * (e.g. via an {@link ITaskMonitor}) and the progress state of the
- * task (e.g. via a progress bar.)
- * <p/>
- * See {@link ITaskMonitor} for details on how a monitor expects to
- * be displayed.
- */
-interface IProgressUiProvider extends ILogUiProvider {
-
- public abstract boolean isCancelRequested();
-
- /**
- * Sets the description in the current task dialog.
- * This method can be invoked from a non-UI thread.
- */
- @Override
- public abstract void setDescription(String description);
-
- /**
- * Sets the max value of the progress bar.
- * This method can be invoked from a non-UI thread.
- *
- * @see ProgressBar#setMaximum(int)
- */
- public abstract void setProgressMax(int max);
-
- /**
- * Sets the current value of the progress bar.
- * This method can be invoked from a non-UI thread.
- */
- public abstract void setProgress(int value);
-
- /**
- * Returns the current value of the progress bar,
- * between 0 and up to {@link #setProgressMax(int)} - 1.
- * This method can be invoked from a non-UI thread.
- */
- public abstract int getProgress();
-
- /**
- * Display a yes/no question dialog box.
- *
- * This implementation allow this to be called from any thread, it
- * makes sure the dialog is opened synchronously in the ui thread.
- *
- * @param title The title of the dialog box
- * @param message The error message
- * @return true if YES was clicked.
- */
- public abstract boolean displayPrompt(String title, String message);
-
- /**
- * Launch an interface which asks for login credentials. Implementations
- * MUST allow this to be called from any thread, e.g. by making sure the
- * dialog is opened synchronously in the UI thread.
- *
- * @param title The title of the dialog box.
- * @param message The message to be displayed as an instruction.
- * @return Returns user provided credentials
- */
- public UserCredentials displayLoginCredentialsPrompt(String title, String message);
-
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/ProgressTask.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/ProgressTask.java
deleted file mode 100755
index d5404ae..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/ProgressTask.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.tasks;
-
-import com.android.sdklib.internal.repository.ITask;
-import com.android.sdklib.internal.repository.ITaskMonitor;
-
-import org.eclipse.swt.widgets.Shell;
-
-
-/**
- * An {@link ITaskMonitor} that displays a {@link ProgressTaskDialog}.
- */
-public final class ProgressTask extends TaskMonitorImpl {
-
- private final String mTitle;
- private final ProgressTaskDialog mDialog;
- private volatile boolean mAutoClose = true;
-
-
- /**
- * Creates a new {@link ProgressTask} with the given title.
- * This does NOT start the task. The caller must invoke {@link #start(ITask)}.
- */
- public ProgressTask(Shell parent, String title) {
- super(new ProgressTaskDialog(parent));
- mTitle = title;
- mDialog = (ProgressTaskDialog) getUiProvider();
- mDialog.setText(mTitle);
- }
-
- /**
- * Execute the given task in a separate thread (not the UI thread).
- * This blocks till the thread ends.
- * <p/>
- * The {@link ProgressTask} must not be reused after this call.
- */
- public void start(ITask task) {
- assert mDialog != null;
- mDialog.open(createTaskThread(mTitle, task));
- }
-
- /**
- * Changes the auto-close behavior of the dialog on task completion.
- *
- * @param autoClose True if the dialog should be closed automatically when the task
- * has completed.
- */
- public void setAutoClose(boolean autoClose) {
- if (autoClose != mAutoClose) {
- if (autoClose) {
- mDialog.setAutoCloseRequested();
- } else {
- mDialog.setManualCloseRequested();
- }
- mAutoClose = autoClose;
- }
- }
-
- /**
- * Creates a thread to run the task. The thread has not been started yet.
- * When the task completes, requests to close the dialog.
- *
- * @return A new thread that will run the task. The thread has not been started yet.
- */
- private Thread createTaskThread(String title, final ITask task) {
- if (task != null) {
- return new Thread(title) {
- @Override
- public void run() {
- task.run(ProgressTask.this);
- if (mAutoClose) {
- mDialog.setAutoCloseRequested();
- } else {
- mDialog.setManualCloseRequested();
- }
- }
- };
- }
- return null;
- }
-
- /**
- * {@inheritDoc}
- * <p/>
- * Sets the dialog to not auto-close since we want the user to see the error
- * (this is equivalent to calling {@code setAutoClose(false)}).
- */
- @Override
- public void logError(String format, Object...args) {
- setAutoClose(false);
- super.logError(format, args);
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/ProgressTaskDialog.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/ProgressTaskDialog.java
deleted file mode 100755
index 50f1e57..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/ProgressTaskDialog.java
+++ /dev/null
@@ -1,520 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.tasks;
-
-import com.android.SdkConstants;
-import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.UserCredentials;
-import com.android.sdkuilib.ui.AuthenticationDialog;
-import com.android.sdkuilib.ui.GridDialog;
-import com.android.utils.Pair;
-
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.ShellAdapter;
-import org.eclipse.swt.events.ShellEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Dialog;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.ProgressBar;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-
-/**
- * Implements a {@link ProgressTaskDialog}, used by the {@link ProgressTask} class.
- * This separates the dialog UI from the task logic.
- *
- * Note: this does not implement the {@link ITaskMonitor} interface to avoid confusing
- * SWT Designer.
- */
-final class ProgressTaskDialog extends Dialog implements IProgressUiProvider {
-
- /**
- * Min Y location for dialog. Need to deal with the menu bar on mac os.
- */
- private final static int MIN_Y = SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_DARWIN ?
- 20 : 0;
-
- private static enum CancelMode {
- /** Cancel button says "Cancel" and is enabled. Waiting for user to cancel. */
- ACTIVE,
- /** Cancel button has been clicked. Waiting for thread to finish. */
- CANCEL_PENDING,
- /** Close pending. Close button clicked or thread finished but there were some
- * messages so the user needs to manually close. */
- CLOSE_MANUAL,
- /** Close button clicked or thread finished. The window will automatically close. */
- CLOSE_AUTO
- }
-
- /** The current mode of operation of the dialog. */
- private CancelMode mCancelMode = CancelMode.ACTIVE;
-
- /** Last dialog size for this session. */
- private static Point sLastSize;
-
-
- // UI fields
- private Shell mDialogShell;
- private Composite mRootComposite;
- private Label mLabel;
- private ProgressBar mProgressBar;
- private Button mCancelButton;
- private Text mResultText;
-
-
- /**
- * Create the dialog.
- * @param parent Parent container
- */
- public ProgressTaskDialog(Shell parent) {
- super(parent, SWT.APPLICATION_MODAL);
- }
-
- /**
- * Open the dialog and blocks till it gets closed
- * @param taskThread The thread to run the task. Cannot be null.
- */
- public void open(Thread taskThread) {
- createContents();
- positionShell(); //$hide$ (hide from SWT designer)
- mDialogShell.open();
- mDialogShell.layout();
-
- startThread(taskThread); //$hide$ (hide from SWT designer)
-
- Display display = getParent().getDisplay();
- while (!mDialogShell.isDisposed() && mCancelMode != CancelMode.CLOSE_AUTO) {
- if (!display.readAndDispatch()) {
- display.sleep();
- }
- }
-
- setCancelRequested(); //$hide$ (hide from SWT designer)
-
- if (!mDialogShell.isDisposed()) {
- sLastSize = mDialogShell.getSize();
- mDialogShell.close();
- }
- }
-
- /**
- * Create contents of the dialog.
- */
- private void createContents() {
- mDialogShell = new Shell(getParent(), SWT.DIALOG_TRIM | SWT.RESIZE);
- mDialogShell.addShellListener(new ShellAdapter() {
- @Override
- public void shellClosed(ShellEvent e) {
- onShellClosed(e);
- }
- });
- mDialogShell.setLayout(new GridLayout(1, false));
- mDialogShell.setSize(450, 300);
- mDialogShell.setText(getText());
-
- mRootComposite = new Composite(mDialogShell, SWT.NONE);
- mRootComposite.setLayout(new GridLayout(2, false));
- mRootComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
-
- mLabel = new Label(mRootComposite, SWT.NONE);
- mLabel.setText("Task");
- mLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
-
- mProgressBar = new ProgressBar(mRootComposite, SWT.NONE);
- mProgressBar.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
- mCancelButton = new Button(mRootComposite, SWT.NONE);
- mCancelButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
- mCancelButton.setText("Cancel");
-
- mCancelButton.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- onCancelSelected(); //$hide$
- }
- });
-
- mResultText = new Text(mRootComposite,
- SWT.BORDER | SWT.READ_ONLY | SWT.WRAP |
- SWT.H_SCROLL | SWT.V_SCROLL | SWT.CANCEL | SWT.MULTI);
- mResultText.setEditable(true);
- mResultText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
- }
-
- // -- End of UI, Start of internal logic ----------
- // Hide everything down-below from SWT designer
- //$hide>>$
-
- @Override
- public boolean isCancelRequested() {
- return mCancelMode != CancelMode.ACTIVE;
- }
-
- /**
- * Sets the mode to cancel pending.
- * The first time this grays the cancel button, to let the user know that the
- * cancel operation is pending.
- */
- public void setCancelRequested() {
- if (!mDialogShell.isDisposed()) {
- // The dialog is not disposed, make sure to run all this in the UI thread
- // and lock on the cancel button mode.
- mDialogShell.getDisplay().syncExec(new Runnable() {
-
- @Override
- public void run() {
- synchronized (mCancelMode) {
- if (mCancelMode == CancelMode.ACTIVE) {
- mCancelMode = CancelMode.CANCEL_PENDING;
-
- if (!mCancelButton.isDisposed()) {
- mCancelButton.setEnabled(false);
- }
- }
- }
- }
- });
- } else {
- // The dialog is disposed. Just set the boolean. We shouldn't be here.
- if (mCancelMode == CancelMode.ACTIVE) {
- mCancelMode = CancelMode.CANCEL_PENDING;
- }
- }
- }
-
- /**
- * Sets the mode to close manual.
- * The first time, this also ungrays the pause button and converts it to a close button.
- */
- public void setManualCloseRequested() {
- if (!mDialogShell.isDisposed()) {
- // The dialog is not disposed, make sure to run all this in the UI thread
- // and lock on the cancel button mode.
- mDialogShell.getDisplay().syncExec(new Runnable() {
-
- @Override
- public void run() {
- synchronized (mCancelMode) {
- if (mCancelMode != CancelMode.CLOSE_MANUAL &&
- mCancelMode != CancelMode.CLOSE_AUTO) {
- mCancelMode = CancelMode.CLOSE_MANUAL;
-
- if (!mCancelButton.isDisposed()) {
- mCancelButton.setEnabled(true);
- mCancelButton.setText("Close");
- }
- }
- }
- }
- });
- } else {
- // The dialog is disposed. Just set the booleans. We shouldn't be here.
- if (mCancelMode != CancelMode.CLOSE_MANUAL &&
- mCancelMode != CancelMode.CLOSE_AUTO) {
- mCancelMode = CancelMode.CLOSE_MANUAL;
- }
- }
- }
-
- /**
- * Sets the mode to close auto.
- * The main loop will just exit and close the shell at the first opportunity.
- */
- public void setAutoCloseRequested() {
- synchronized (mCancelMode) {
- if (mCancelMode != CancelMode.CLOSE_AUTO) {
- mCancelMode = CancelMode.CLOSE_AUTO;
- }
- }
- }
-
- /**
- * Callback invoked when the cancel button is selected.
- * When in closing mode, this simply closes the shell. Otherwise triggers a cancel.
- */
- private void onCancelSelected() {
- if (mCancelMode == CancelMode.CLOSE_MANUAL) {
- setAutoCloseRequested();
- } else {
- setCancelRequested();
- }
- }
-
- /**
- * Callback invoked when the shell is closed either by clicking the close button
- * on by calling shell.close().
- * This does the same thing as clicking the cancel/close button unless the mode is
- * to auto close in which case we should do nothing to let the shell close normally.
- */
- private void onShellClosed(ShellEvent e) {
- if (mCancelMode != CancelMode.CLOSE_AUTO) {
- e.doit = false; // don't close directly
- onCancelSelected();
- }
- }
-
- /**
- * Sets the description in the current task dialog.
- * This method can be invoked from a non-UI thread.
- */
- @Override
- public void setDescription(final String description) {
- mDialogShell.getDisplay().syncExec(new Runnable() {
- @Override
- public void run() {
- if (!mLabel.isDisposed()) {
- mLabel.setText(description);
- }
- }
- });
- }
-
- /**
- * Adds to the log in the current task dialog.
- * This method can be invoked from a non-UI thread.
- */
- @Override
- public void log(final String info) {
- if (!mDialogShell.isDisposed()) {
- mDialogShell.getDisplay().syncExec(new Runnable() {
- @Override
- public void run() {
- if (!mResultText.isDisposed()) {
- mResultText.setVisible(true);
- String lastText = mResultText.getText();
- if (lastText != null &&
- lastText.length() > 0 &&
- !lastText.endsWith("\n") && //$NON-NLS-1$
- !info.startsWith("\n")) { //$NON-NLS-1$
- mResultText.append("\n"); //$NON-NLS-1$
- }
- mResultText.append(info);
- }
- }
- });
- }
- }
-
- @Override
- public void logError(String info) {
- log(info);
- }
-
- @Override
- public void logVerbose(String info) {
- log(info);
- }
-
- /**
- * Sets the max value of the progress bar.
- * This method can be invoked from a non-UI thread.
- *
- * @see ProgressBar#setMaximum(int)
- */
- @Override
- public void setProgressMax(final int max) {
- if (!mDialogShell.isDisposed()) {
- mDialogShell.getDisplay().syncExec(new Runnable() {
- @Override
- public void run() {
- if (!mProgressBar.isDisposed()) {
- mProgressBar.setMaximum(max);
- }
- }
- });
- }
- }
-
- /**
- * Sets the current value of the progress bar.
- * This method can be invoked from a non-UI thread.
- */
- @Override
- public void setProgress(final int value) {
- if (!mDialogShell.isDisposed()) {
- mDialogShell.getDisplay().syncExec(new Runnable() {
- @Override
- public void run() {
- if (!mProgressBar.isDisposed()) {
- mProgressBar.setSelection(value);
- }
- }
- });
- }
- }
-
- /**
- * Returns the current value of the progress bar,
- * between 0 and up to {@link #setProgressMax(int)} - 1.
- * This method can be invoked from a non-UI thread.
- */
- @Override
- public int getProgress() {
- final int[] result = new int[] { 0 };
-
- if (!mDialogShell.isDisposed()) {
- mDialogShell.getDisplay().syncExec(new Runnable() {
- @Override
- public void run() {
- if (!mProgressBar.isDisposed()) {
- result[0] = mProgressBar.getSelection();
- }
- }
- });
- }
-
- return result[0];
- }
-
- /**
- * Display a yes/no question dialog box.
- *
- * This implementation allow this to be called from any thread, it
- * makes sure the dialog is opened synchronously in the ui thread.
- *
- * @param title The title of the dialog box
- * @param message The error message
- * @return true if YES was clicked.
- */
- @Override
- public boolean displayPrompt(final String title, final String message) {
- Display display = mDialogShell.getDisplay();
-
- // we need to ask the user what he wants to do.
- final boolean[] result = new boolean[] { false };
- display.syncExec(new Runnable() {
- @Override
- public void run() {
- result[0] = MessageDialog.openQuestion(mDialogShell, title, message);
- }
- });
- return result[0];
- }
-
- /**
- * This method opens a pop-up window which requests for User Login and
- * password.
- *
- * @param title The title of the window.
- * @param message The message to displayed in the login/password window.
- * @return Returns a {@link Pair} holding the entered login and password.
- * The information must always be in the following order:
- * Login,Password. So in order to retrieve the <b>login</b> callers
- * should retrieve the first element, and the second value for the
- * <b>password</b>.
- * If operation is <b>canceled</b> by user the return value must be <b>null</b>.
- * @see ITaskMonitor#displayLoginCredentialsPrompt(String, String)
- */
- @Override
- public UserCredentials displayLoginCredentialsPrompt(
- final String title, final String message) {
- Display display = mDialogShell.getDisplay();
-
- // open dialog and request login and password
- GetUserCredentialsTask task = new GetUserCredentialsTask(mDialogShell, title, message);
- display.syncExec(task);
-
- return task.getUserCredentials();
- }
-
- private static class GetUserCredentialsTask implements Runnable {
- private UserCredentials mResult = null;
-
- private Shell mShell;
- private String mTitle;
- private String mMessage;
-
- public GetUserCredentialsTask(Shell shell, String title, String message) {
- mShell = shell;
- mTitle = title;
- mMessage = message;
- }
-
- @Override
- public void run() {
- AuthenticationDialog authenticationDialog = new AuthenticationDialog(mShell,
- mTitle, mMessage);
- int dlgResult= authenticationDialog.open();
- if(dlgResult == GridDialog.OK) {
- mResult = new UserCredentials(
- authenticationDialog.getLogin(),
- authenticationDialog.getPassword(),
- authenticationDialog.getWorkstation(),
- authenticationDialog.getDomain());
- }
- }
-
- public UserCredentials getUserCredentials() {
- return mResult;
- }
- }
-
- /**
- * Starts the thread that runs the task.
- * This is deferred till the UI is created.
- */
- private void startThread(Thread taskThread) {
- if (taskThread != null) {
- taskThread.start();
- }
- }
-
- /**
- * Centers the dialog in its parent shell.
- */
- private void positionShell() {
- // Centers the dialog in its parent shell
- Shell child = mDialogShell;
- Shell parent = getParent();
- if (child != null && parent != null) {
-
- // get the parent client area with a location relative to the display
- Rectangle parentArea = parent.getClientArea();
- Point parentLoc = parent.getLocation();
- int px = parentLoc.x;
- int py = parentLoc.y;
- int pw = parentArea.width;
- int ph = parentArea.height;
-
- // Reuse the last size if there's one, otherwise use the default
- Point childSize = sLastSize != null ? sLastSize : child.getSize();
- int cw = childSize.x;
- int ch = childSize.y;
-
- int x = px + (pw - cw) / 2;
- if (x < 0) x = 0;
-
- int y = py + (ph - ch) / 2;
- if (y < MIN_Y) y = MIN_Y;
-
- child.setLocation(x, y);
- child.setSize(cw, ch);
- }
- }
-
- // End of hiding from SWT Designer
- //$hide<<$
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/ProgressTaskFactory.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/ProgressTaskFactory.java
deleted file mode 100755
index 17cba7a..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/ProgressTaskFactory.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.tasks;
-
-import com.android.sdklib.internal.repository.ITask;
-import com.android.sdklib.internal.repository.ITaskFactory;
-import com.android.sdklib.internal.repository.ITaskMonitor;
-
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * An {@link ITaskFactory} that creates a new {@link ProgressTask} dialog
- * for each new task.
- */
-public final class ProgressTaskFactory implements ITaskFactory {
-
- private final Shell mShell;
-
- public ProgressTaskFactory(Shell shell) {
- mShell = shell;
- }
-
- @Override
- public void start(String title, ITask task) {
- start(title, null /*parentMonitor*/, task);
- }
-
- @Override
- public void start(String title, ITaskMonitor parentMonitor, ITask task) {
-
- if (parentMonitor == null) {
- ProgressTask p = new ProgressTask(mShell, title);
- p.start(task);
- } else {
- // Use all the reminder of the parent monitor.
- if (parentMonitor.getProgressMax() == 0) {
- parentMonitor.setProgressMax(1);
- }
-
- ITaskMonitor sub = parentMonitor.createSubMonitor(
- parentMonitor.getProgressMax() - parentMonitor.getProgress());
- try {
- task.run(sub);
- } finally {
- int delta =
- sub.getProgressMax() - sub.getProgress();
- if (delta > 0) {
- sub.incProgress(delta);
- }
- }
- }
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/ProgressView.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/ProgressView.java
deleted file mode 100755
index 8987351..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/ProgressView.java
+++ /dev/null
@@ -1,376 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.tasks;
-
-import com.android.sdklib.internal.repository.ITask;
-import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.UserCredentials;
-import com.android.sdkuilib.ui.AuthenticationDialog;
-import com.android.sdkuilib.ui.GridDialog;
-
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.ProgressBar;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Widget;
-
-import java.util.concurrent.atomic.AtomicReference;
-
-
-/**
- * Implements a "view" that uses an existing progress bar, status button and
- * status text to display a {@link ITaskMonitor}.
- */
-public final class ProgressView implements IProgressUiProvider {
-
- private static enum State {
- /** View created but there's no task running. Next state can only be ACTIVE. */
- IDLE,
- /** A task is currently running. Next state is either STOP_PENDING or IDLE. */
- ACTIVE,
- /** Stop button has been clicked. Waiting for thread to finish. Next state is IDLE. */
- STOP_PENDING,
- }
-
- /** The current mode of operation of the dialog. */
- private State mState = State.IDLE;
-
-
-
- // UI fields
- private final Label mLabel;
- private final Control mStopButton;
- private final ProgressBar mProgressBar;
-
- /** Logger object. Cannot not be null. */
- private final ILogUiProvider mLog;
-
- /**
- * Creates a new {@link ProgressView} object, a simple "holder" for the various
- * widgets used to display and update a progress + status bar.
- *
- * @param label The label to display titles of status updates (e.g. task titles and
- * calls to {@link #setDescription(String)}.) Must not be null.
- * @param progressBar The progress bar to update during a task. Must not be null.
- * @param stopButton The stop button. It will be disabled when there's no task that can
- * be interrupted. A selection listener will be attached to it. Optional. Can be null.
- * @param log A <em>mandatory</em> logger object that will be used to report all the log.
- * Must not be null.
- */
- public ProgressView(
- Label label,
- ProgressBar progressBar,
- Control stopButton,
- ILogUiProvider log) {
- mLabel = label;
- mProgressBar = progressBar;
- mLog = log;
- mProgressBar.setEnabled(false);
-
- mStopButton = stopButton;
- if (mStopButton != null) {
- mStopButton.addListener(SWT.Selection, new Listener() {
- @Override
- public void handleEvent(Event event) {
- if (mState == State.ACTIVE) {
- changeState(State.STOP_PENDING);
- }
- }
- });
- }
- }
-
- /**
- * Starts the task and block till it's either finished or canceled.
- * This can be called from a non-UI thread safely.
- * <p/>
- * When a task is started from within a monitor, it reuses the thread
- * from the parent. Otherwise it starts a new thread and runs it own
- * UI loop. This means the task can perform UI operations using
- * {@link Display#asyncExec(Runnable)}.
- * <p/>
- * In either case, the method only returns when the task has finished.
- */
- public void startTask(
- final String title,
- final ITaskMonitor parentMonitor,
- final ITask task) {
- if (task != null) {
- try {
- if (parentMonitor == null && !mProgressBar.isDisposed()) {
- mLabel.setText(title);
- mProgressBar.setSelection(0);
- mProgressBar.setEnabled(true);
- changeState(ProgressView.State.ACTIVE);
- }
-
- Runnable r = new Runnable() {
- @Override
- public void run() {
- if (parentMonitor == null) {
- task.run(new TaskMonitorImpl(ProgressView.this));
-
- } else {
- // Use all the reminder of the parent monitor.
- if (parentMonitor.getProgressMax() == 0) {
- parentMonitor.setProgressMax(1);
- }
- ITaskMonitor sub = parentMonitor.createSubMonitor(
- parentMonitor.getProgressMax() - parentMonitor.getProgress());
- try {
- task.run(sub);
- } finally {
- int delta =
- sub.getProgressMax() - sub.getProgress();
- if (delta > 0) {
- sub.incProgress(delta);
- }
- }
- }
- }
- };
-
- // If for some reason the UI has been disposed, just abort the thread.
- if (mProgressBar.isDisposed()) {
- return;
- }
-
- if (TaskMonitorImpl.isTaskMonitorImpl(parentMonitor)) {
- // If there's a parent monitor and it's our own class, we know this parent
- // is already running a thread and the base one is running an event loop.
- // We should thus not run a second event loop and we can process the
- // runnable right here instead of spawning a thread inside the thread.
- r.run();
-
- } else {
- // No parent monitor. This is the first one so we need a thread and
- // we need to process UI events.
-
- final Thread t = new Thread(r, title);
- t.start();
-
- // Process the app's event loop whilst we wait for the thread to finish
- while (!mProgressBar.isDisposed() && t.isAlive()) {
- Display display = mProgressBar.getDisplay();
- if (!mProgressBar.isDisposed() && !display.readAndDispatch()) {
- display.sleep();
- }
- }
- }
- } catch (Exception e) {
- // TODO log
-
- } finally {
- if (parentMonitor == null && !mProgressBar.isDisposed()) {
- changeState(ProgressView.State.IDLE);
- mProgressBar.setSelection(0);
- mProgressBar.setEnabled(false);
- }
- }
- }
- }
-
- private void syncExec(final Widget widget, final Runnable runnable) {
- if (widget != null && !widget.isDisposed()) {
- widget.getDisplay().syncExec(new Runnable() {
- @Override
- public void run() {
- // Check again whether the widget got disposed between the time where
- // we requested the syncExec and the time it actually happened.
- if (!widget.isDisposed()) {
- runnable.run();
- }
- }
- });
- }
- }
-
- private void changeState(State state) {
- if (mState != null ) {
- mState = state;
- }
-
- syncExec(mStopButton, new Runnable() {
- @Override
- public void run() {
- mStopButton.setEnabled(mState == State.ACTIVE);
- }
- });
-
- }
-
- // --- Implementation of ITaskUiProvider ---
-
- @Override
- public boolean isCancelRequested() {
- return mState != State.ACTIVE;
- }
-
- /**
- * Sets the description in the current task dialog.
- * This method can be invoked from a non-UI thread.
- */
- @Override
- public void setDescription(final String description) {
- syncExec(mLabel, new Runnable() {
- @Override
- public void run() {
- mLabel.setText(description);
- }
- });
-
- mLog.setDescription(description);
- }
-
- /**
- * Logs a "normal" information line.
- * This method can be invoked from a non-UI thread.
- */
- @Override
- public void log(String log) {
- mLog.log(log);
- }
-
- /**
- * Logs an "error" information line.
- * This method can be invoked from a non-UI thread.
- */
- @Override
- public void logError(String log) {
- mLog.logError(log);
- }
-
- /**
- * Logs a "verbose" information line, that is extra details which are typically
- * not that useful for the end-user and might be hidden until explicitly shown.
- * This method can be invoked from a non-UI thread.
- */
- @Override
- public void logVerbose(String log) {
- mLog.logVerbose(log);
- }
-
- /**
- * Sets the max value of the progress bar.
- * This method can be invoked from a non-UI thread.
- *
- * @see ProgressBar#setMaximum(int)
- */
- @Override
- public void setProgressMax(final int max) {
- syncExec(mProgressBar, new Runnable() {
- @Override
- public void run() {
- mProgressBar.setMaximum(max);
- }
- });
- }
-
- /**
- * Sets the current value of the progress bar.
- * This method can be invoked from a non-UI thread.
- */
- @Override
- public void setProgress(final int value) {
- syncExec(mProgressBar, new Runnable() {
- @Override
- public void run() {
- mProgressBar.setSelection(value);
- }
- });
- }
-
- /**
- * Returns the current value of the progress bar,
- * between 0 and up to {@link #setProgressMax(int)} - 1.
- * This method can be invoked from a non-UI thread.
- */
- @Override
- public int getProgress() {
- final int[] result = new int[] { 0 };
-
- if (!mProgressBar.isDisposed()) {
- mProgressBar.getDisplay().syncExec(new Runnable() {
- @Override
- public void run() {
- if (!mProgressBar.isDisposed()) {
- result[0] = mProgressBar.getSelection();
- }
- }
- });
- }
-
- return result[0];
- }
-
- @Override
- public boolean displayPrompt(final String title, final String message) {
- final boolean[] result = new boolean[] { false };
-
- syncExec(mProgressBar, new Runnable() {
- @Override
- public void run() {
- Shell shell = mProgressBar.getShell();
- result[0] = MessageDialog.openQuestion(shell, title, message);
- }
- });
-
- return result[0];
- }
-
- /**
- * This method opens a pop-up window which requests for User Credentials.
- *
- * @param title The title of the window.
- * @param message The message to displayed in the login/password window.
- * @return Returns user provided credentials.
- * If operation is <b>canceled</b> by user the return value must be <b>null</b>.
- * @see ITaskMonitor#displayLoginCredentialsPrompt(String, String)
- */
- @Override
- public UserCredentials
- displayLoginCredentialsPrompt(final String title, final String message) {
- final AtomicReference<UserCredentials> result = new AtomicReference<UserCredentials>(null);
-
- // open dialog and request login and password
- syncExec(mProgressBar, new Runnable() {
- @Override
- public void run() {
- Shell shell = mProgressBar.getShell();
- AuthenticationDialog authenticationDialog = new AuthenticationDialog(shell,
- title,
- message);
- int dlgResult = authenticationDialog.open();
- if (dlgResult == GridDialog.OK) {
- result.set(new UserCredentials(
- authenticationDialog.getLogin(),
- authenticationDialog.getPassword(),
- authenticationDialog.getWorkstation(),
- authenticationDialog.getDomain()));
- }
- }
- });
-
- return result.get();
- }
-}
-
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/ProgressViewFactory.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/ProgressViewFactory.java
deleted file mode 100755
index 2590169..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/ProgressViewFactory.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.tasks;
-
-import com.android.sdklib.internal.repository.ITask;
-import com.android.sdklib.internal.repository.ITaskFactory;
-import com.android.sdklib.internal.repository.ITaskMonitor;
-
-/**
- * An {@link ITaskFactory} that creates a new {@link ProgressTask} dialog
- * for each new task.
- */
-public final class ProgressViewFactory implements ITaskFactory {
-
- private ProgressView mProgressView;
-
- public ProgressViewFactory() {
- }
-
- public void setProgressView(ProgressView progressView) {
- mProgressView = progressView;
- }
-
- @Override
- public void start(String title, ITask task) {
- start(title, null /*monitor*/, task);
- }
-
- @Override
- public void start(String title, ITaskMonitor parentMonitor, ITask task) {
- assert mProgressView != null;
- mProgressView.startTask(title, parentMonitor, task);
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/TaskMonitorImpl.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/TaskMonitorImpl.java
deleted file mode 100755
index 4d4f3c9..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/tasks/TaskMonitorImpl.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.tasks;
-
-import com.android.annotations.NonNull;
-import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.UserCredentials;
-
-/**
- * Internal class that implements the logic of an {@link ITaskMonitor}.
- * It doesn't deal with any UI directly. Instead it delegates the UI to
- * the provided {@link IProgressUiProvider}.
- */
-class TaskMonitorImpl implements ITaskMonitor {
-
- private static final double MAX_COUNT = 10000.0;
-
- private interface ISubTaskMonitor extends ITaskMonitor {
- public void subIncProgress(double realDelta);
- }
-
- private double mIncCoef = 0;
- private double mValue = 0;
- private final IProgressUiProvider mUi;
-
- /**
- * Returns true if the given {@code monitor} is an instance of {@link TaskMonitorImpl}
- * or its private SubTaskMonitor.
- */
- public static boolean isTaskMonitorImpl(ITaskMonitor monitor) {
- return monitor instanceof TaskMonitorImpl || monitor instanceof SubTaskMonitor;
- }
-
- /**
- * Constructs a new {@link TaskMonitorImpl} that relies on the given
- * {@link IProgressUiProvider} to change the user interface.
- * @param ui The {@link IProgressUiProvider}. Cannot be null.
- */
- public TaskMonitorImpl(IProgressUiProvider ui) {
- mUi = ui;
- }
-
- /** Returns the {@link IProgressUiProvider} passed to the constructor. */
- public IProgressUiProvider getUiProvider() {
- return mUi;
- }
-
- /**
- * Sets the description in the current task dialog.
- * This method can be invoked from a non-UI thread.
- */
- @Override
- public void setDescription(String format, Object... args) {
- final String text = String.format(format, args);
- mUi.setDescription(text);
- }
-
- /**
- * Logs a "normal" information line.
- * This method can be invoked from a non-UI thread.
- */
- @Override
- public void log(String format, Object... args) {
- String text = String.format(format, args);
- mUi.log(text);
- }
-
- /**
- * Logs an "error" information line.
- * This method can be invoked from a non-UI thread.
- */
- @Override
- public void logError(String format, Object... args) {
- String text = String.format(format, args);
- mUi.logError(text);
- }
-
- /**
- * Logs a "verbose" information line, that is extra details which are typically
- * not that useful for the end-user and might be hidden until explicitly shown.
- * This method can be invoked from a non-UI thread.
- */
- @Override
- public void logVerbose(String format, Object... args) {
- String text = String.format(format, args);
- mUi.logVerbose(text);
- }
-
- /**
- * Sets the max value of the progress bar.
- * This method can be invoked from a non-UI thread.
- *
- * Weird things will happen if setProgressMax is called multiple times
- * *after* {@link #incProgress(int)}: we don't try to adjust it on the
- * fly.
- */
- @Override
- public void setProgressMax(int max) {
- assert max > 0;
- // Always set the dialog's progress max to 10k since it only handles
- // integers and we want to have a better inner granularity. Instead
- // we use the max to compute a coefficient for inc deltas.
- mUi.setProgressMax((int) MAX_COUNT);
- mIncCoef = max > 0 ? MAX_COUNT / max : 0;
- assert mIncCoef > 0;
- }
-
- @Override
- public int getProgressMax() {
- return mIncCoef > 0 ? (int) (MAX_COUNT / mIncCoef) : 0;
- }
-
- /**
- * Increments the current value of the progress bar.
- *
- * This method can be invoked from a non-UI thread.
- */
- @Override
- public void incProgress(int delta) {
- if (delta > 0 && mIncCoef > 0) {
- internalIncProgress(delta * mIncCoef);
- }
- }
-
- private void internalIncProgress(double realDelta) {
- mValue += realDelta;
- mUi.setProgress((int)mValue);
- }
-
- /**
- * Returns the current value of the progress bar,
- * between 0 and up to {@link #setProgressMax(int)} - 1.
- *
- * This method can be invoked from a non-UI thread.
- */
- @Override
- public int getProgress() {
- // mIncCoef is 0 if setProgressMax hasn't been used yet.
- return mIncCoef > 0 ? (int)(mUi.getProgress() / mIncCoef) : 0;
- }
-
- /**
- * Returns true if the "Cancel" button was selected.
- * It is up to the task thread to pool this and exit.
- */
- @Override
- public boolean isCancelRequested() {
- return mUi.isCancelRequested();
- }
-
- /**
- * Displays a yes/no question dialog box.
- *
- * This implementation allow this to be called from any thread, it
- * makes sure the dialog is opened synchronously in the ui thread.
- *
- * @param title The title of the dialog box
- * @param message The error message
- * @return true if YES was clicked.
- */
- @Override
- public boolean displayPrompt(final String title, final String message) {
- return mUi.displayPrompt(title, message);
- }
-
- /**
- * Displays a Login/Password dialog. This implementation allows this method to be
- * called from any thread, it makes sure the dialog is opened synchronously
- * in the ui thread.
- *
- * @param title The title of the dialog box
- * @param message Message to be displayed
- * @return Pair with entered login/password. Login is always the first
- * element and Password is always the second. If any error occurs a
- * pair with empty strings is returned.
- */
- @Override
- public UserCredentials displayLoginCredentialsPrompt(String title, String message) {
- return mUi.displayLoginCredentialsPrompt(title, message);
- }
-
- /**
- * Creates a sub-monitor that will use up to tickCount on the progress bar.
- * tickCount must be 1 or more.
- */
- @Override
- public ITaskMonitor createSubMonitor(int tickCount) {
- assert mIncCoef > 0;
- assert tickCount > 0;
- return new SubTaskMonitor(this, null, mValue, tickCount * mIncCoef);
- }
-
- // ----- ILogger interface ----
-
- @Override
- public void error(Throwable throwable, String errorFormat, Object... arg) {
- if (errorFormat != null) {
- logError("Error: " + errorFormat, arg);
- }
-
- if (throwable != null) {
- logError("%s", throwable.getMessage()); //$NON-NLS-1$
- }
- }
-
- @Override
- public void warning(@NonNull String warningFormat, Object... arg) {
- log("Warning: " + warningFormat, arg);
- }
-
- @Override
- public void info(@NonNull String msgFormat, Object... arg) {
- log(msgFormat, arg);
- }
-
- @Override
- public void verbose(@NonNull String msgFormat, Object... arg) {
- log(msgFormat, arg);
- }
-
- // ----- Sub Monitor -----
-
- private static class SubTaskMonitor implements ISubTaskMonitor {
-
- private final TaskMonitorImpl mRoot;
- private final ISubTaskMonitor mParent;
- private final double mStart;
- private final double mSpan;
- private double mSubValue;
- private double mSubCoef;
-
- /**
- * Creates a new sub task monitor which will work for the given range [start, start+span]
- * in its parent.
- *
- * @param taskMonitor The ProgressTask root
- * @param parent The immediate parent. Can be the null or another sub task monitor.
- * @param start The start value in the root's coordinates
- * @param span The span value in the root's coordinates
- */
- public SubTaskMonitor(TaskMonitorImpl taskMonitor,
- ISubTaskMonitor parent,
- double start,
- double span) {
- mRoot = taskMonitor;
- mParent = parent;
- mStart = start;
- mSpan = span;
- mSubValue = start;
- }
-
- @Override
- public boolean isCancelRequested() {
- return mRoot.isCancelRequested();
- }
-
- @Override
- public void setDescription(String format, Object... args) {
- mRoot.setDescription(format, args);
- }
-
- @Override
- public void log(String format, Object... args) {
- mRoot.log(format, args);
- }
-
- @Override
- public void logError(String format, Object... args) {
- mRoot.logError(format, args);
- }
-
- @Override
- public void logVerbose(String format, Object... args) {
- mRoot.logVerbose(format, args);
- }
-
- @Override
- public void setProgressMax(int max) {
- assert max > 0;
- mSubCoef = max > 0 ? mSpan / max : 0;
- assert mSubCoef > 0;
- }
-
- @Override
- public int getProgressMax() {
- return mSubCoef > 0 ? (int) (mSpan / mSubCoef) : 0;
- }
-
- @Override
- public int getProgress() {
- // subCoef can be 0 if setProgressMax() and incProgress() haven't been called yet
- assert mSubValue == mStart || mSubCoef > 0;
- return mSubCoef > 0 ? (int)((mSubValue - mStart) / mSubCoef) : 0;
- }
-
- @Override
- public void incProgress(int delta) {
- if (delta > 0 && mSubCoef > 0) {
- subIncProgress(delta * mSubCoef);
- }
- }
-
- @Override
- public void subIncProgress(double realDelta) {
- mSubValue += realDelta;
- if (mParent != null) {
- mParent.subIncProgress(realDelta);
- } else {
- mRoot.internalIncProgress(realDelta);
- }
- }
-
- @Override
- public boolean displayPrompt(String title, String message) {
- return mRoot.displayPrompt(title, message);
- }
-
- @Override
- public UserCredentials displayLoginCredentialsPrompt(String title, String message) {
- return mRoot.displayLoginCredentialsPrompt(title, message);
- }
-
- @Override
- public ITaskMonitor createSubMonitor(int tickCount) {
- assert mSubCoef > 0;
- assert tickCount > 0;
- return new SubTaskMonitor(mRoot,
- this,
- mSubValue,
- tickCount * mSubCoef);
- }
-
- // ----- ILogger interface ----
-
- @Override
- public void error(Throwable throwable, String errorFormat, Object... arg) {
- mRoot.error(throwable, errorFormat, arg);
- }
-
- @Override
- public void warning(@NonNull String warningFormat, Object... arg) {
- mRoot.warning(warningFormat, arg);
- }
-
- @Override
- public void info(@NonNull String msgFormat, Object... arg) {
- mRoot.info(msgFormat, arg);
- }
-
- @Override
- public void verbose(@NonNull String msgFormat, Object... arg) {
- mRoot.verbose(msgFormat, arg);
- }
- }
-}
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
deleted file mode 100644
index c583762..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdCreationDialog.java
+++ /dev/null
@@ -1,1392 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.widgets;
-
-import com.android.SdkConstants;
-import com.android.annotations.Nullable;
-import com.android.prefs.AndroidLocation.AndroidLocationException;
-import com.android.resources.Density;
-import com.android.resources.ScreenSize;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.ISystemImage;
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.devices.Camera;
-import com.android.sdklib.devices.CameraLocation;
-import com.android.sdklib.devices.Device;
-import com.android.sdklib.devices.DeviceManager;
-import com.android.sdklib.devices.Hardware;
-import com.android.sdklib.devices.Screen;
-import com.android.sdklib.devices.Software;
-import com.android.sdklib.devices.Storage;
-import com.android.sdklib.internal.avd.AvdInfo;
-import com.android.sdklib.internal.avd.AvdManager;
-import com.android.sdklib.internal.avd.AvdManager.AvdConflict;
-import com.android.sdklib.internal.avd.HardwareProperties;
-import com.android.sdkuilib.internal.repository.icons.ImageFactory;
-import com.android.sdkuilib.ui.GridDialog;
-import com.android.utils.ILogger;
-import com.android.utils.Pair;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.VerifyEvent;
-import org.eclipse.swt.events.VerifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class AvdCreationDialog extends GridDialog {
-
- private AvdManager mAvdManager;
- private ImageFactory mImageFactory;
- private ILogger mSdkLog;
- private AvdInfo mAvdInfo;
- private boolean mHaveSystemImage;
-
- private final TreeMap<String, IAndroidTarget> mCurrentTargets =
- new TreeMap<String, IAndroidTarget>();
-
- private Button mOkButton;
-
- private Text mAvdName;
-
- private Combo mDevice;
-
- private Combo mTarget;
- private Combo mAbi;
-
- private Button mKeyboard;
- private Button mSkin;
-
- private Combo mFrontCamera;
- private Combo mBackCamera;
-
- private Button mSnapshot;
- private Button mGpuEmulation;
-
- private Text mRam;
- private Text mVmHeap;
-
- private Text mDataPartition;
- private Combo mDataPartitionSize;
-
- private Button mSdCardSizeRadio;
- private Text mSdCardSize;
- private Combo mSdCardSizeCombo;
- private Button mSdCardFileRadio;
- private Text mSdCardFile;
- private Button mBrowseSdCard;
-
- private Button mForceCreation;
- private Composite mStatusComposite;
-
- private Label mStatusIcon;
- private Label mStatusLabel;
-
- private Device mInitWithDevice;
- private AvdInfo mCreatedAvd;
-
- /**
- * {@link VerifyListener} for {@link Text} widgets that should only contains
- * numbers.
- */
- private final VerifyListener mDigitVerifier = new VerifyListener() {
- @Override
- public void verifyText(VerifyEvent event) {
- int count = event.text.length();
- for (int i = 0; i < count; i++) {
- char c = event.text.charAt(i);
- if (c < '0' || c > '9') {
- event.doit = false;
- return;
- }
- }
- }
- };
-
- public AvdCreationDialog(Shell shell,
- AvdManager avdManager,
- ImageFactory imageFactory,
- ILogger log,
- AvdInfo editAvdInfo) {
-
- super(shell, 2, false);
- mAvdManager = avdManager;
- mImageFactory = imageFactory;
- mSdkLog = log;
- mAvdInfo = editAvdInfo;
- }
-
- /** Returns the AVD Created, if successful. */
- public AvdInfo getCreatedAvd() {
- return mCreatedAvd;
- }
-
- @Override
- protected Control createContents(Composite parent) {
- Control control = super.createContents(parent);
- getShell().setText(mAvdInfo == null ? "Create new Android Virtual Device (AVD)"
- : "Edit Android Virtual Device (AVD)");
-
- mOkButton = getButton(IDialogConstants.OK_ID);
-
- if (mAvdInfo != null) {
- fillExistingAvdInfo(mAvdInfo);
- } else if (mInitWithDevice != null) {
- fillInitialDeviceInfo(mInitWithDevice);
- }
-
- validatePage();
- return control;
- }
-
- @Override
- public void createDialogContent(Composite parent) {
-
- Label label;
- String tooltip;
- ValidateListener validateListener = new ValidateListener();
-
- // --- avd name
- label = new Label(parent, SWT.NONE);
- label.setText("AVD Name:");
- tooltip = "The name of the Android Virtual Device";
- label.setToolTipText(tooltip);
- mAvdName = new Text(parent, SWT.BORDER);
- mAvdName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mAvdName.addModifyListener(new CreateNameModifyListener());
-
- // --- device selection
- label = new Label(parent, SWT.NONE);
- label.setText("Device:");
- tooltip = "The device this AVD will be based on";
- mDevice = new Combo(parent, SWT.READ_ONLY | SWT.DROP_DOWN);
- mDevice.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- initializeDevices();
- mDevice.addSelectionListener(new DeviceSelectionListener());
-
- // --- api target
- label = new Label(parent, SWT.NONE);
- label.setText("Target:");
- tooltip = "The target API of the AVD";
- label.setToolTipText(tooltip);
- mTarget = new Combo(parent, SWT.READ_ONLY | SWT.DROP_DOWN);
- mTarget.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mTarget.setToolTipText(tooltip);
- mTarget.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- reloadAbiTypeCombo();
- validatePage();
- }
- });
-
- reloadTargetCombo();
-
- // --- avd ABIs
- label = new Label(parent, SWT.NONE);
- label.setText("CPU/ABI:");
- tooltip = "The CPU/ABI of the virtual device";
- label.setToolTipText(tooltip);
- mAbi = new Combo(parent, SWT.READ_ONLY | SWT.DROP_DOWN);
- mAbi.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mAbi.setToolTipText(tooltip);
- mAbi.addSelectionListener(validateListener);
-
- label = new Label(parent, SWT.NONE);
- label.setText("Keyboard:");
- mKeyboard = new Button(parent, SWT.CHECK);
- mKeyboard.setSelection(true); // default to having a keyboard irrespective of device
- mKeyboard.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mKeyboard.setText("Hardware keyboard present");
-
- label = new Label(parent, SWT.NONE);
- label.setText("Skin:");
- mSkin = new Button(parent, SWT.CHECK);
- mSkin.setSelection(true);
- mSkin.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mSkin.setText("Display a skin with hardware controls");
-
- label = new Label(parent, SWT.NONE);
- label.setText("Front Camera:");
- tooltip = "";
- label.setToolTipText(tooltip);
- mFrontCamera = new Combo(parent, SWT.READ_ONLY | SWT.DROP_DOWN);
- mFrontCamera.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mFrontCamera.add("None");
- mFrontCamera.add("Emulated");
- mFrontCamera.add("Webcam0");
- mFrontCamera.select(0);
-
- label = new Label(parent, SWT.NONE);
- label.setText("Back Camera:");
- tooltip = "";
- label.setToolTipText(tooltip);
- mBackCamera = new Combo(parent, SWT.READ_ONLY | SWT.DROP_DOWN);
- mBackCamera.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mBackCamera.add("None");
- mBackCamera.add("Emulated");
- mBackCamera.add("Webcam0");
- mBackCamera.select(0);
-
- toggleCameras();
-
- // --- memory options group
- label = new Label(parent, SWT.NONE);
- label.setText("Memory Options:");
-
-
- Group memoryGroup = new Group(parent, SWT.BORDER);
- memoryGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- memoryGroup.setLayout(new GridLayout(4, false));
-
- label = new Label(memoryGroup, SWT.NONE);
- label.setText("RAM:");
- tooltip = "The amount of RAM the emulated device should have in MiB";
- label.setToolTipText(tooltip);
- mRam = new Text(memoryGroup, SWT.BORDER);
- mRam.addVerifyListener(mDigitVerifier);
- mRam.addModifyListener(validateListener);
- mRam.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
- label = new Label(memoryGroup, SWT.NONE);
- label.setText("VM Heap:");
- tooltip = "The amount of memory, in MiB, available to typical Android applications";
- label.setToolTipText(tooltip);
- mVmHeap = new Text(memoryGroup, SWT.BORDER);
- mVmHeap.addVerifyListener(mDigitVerifier);
- mVmHeap.addModifyListener(validateListener);
- mVmHeap.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mVmHeap.setToolTipText(tooltip);
-
- // --- Data partition group
- label = new Label(parent, SWT.NONE);
- label.setText("Internal Storage:");
- tooltip = "The size of the data partition on the device.";
- Group storageGroup = new Group(parent, SWT.NONE);
- storageGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- storageGroup.setLayout(new GridLayout(2, false));
- mDataPartition = new Text(storageGroup, SWT.BORDER);
- mDataPartition.setText("200");
- mDataPartition.addVerifyListener(mDigitVerifier);
- mDataPartition.addModifyListener(validateListener);
- mDataPartition.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mDataPartitionSize = new Combo(storageGroup, SWT.READ_ONLY | SWT.DROP_DOWN);
- mDataPartitionSize.add("MiB");
- mDataPartitionSize.add("GiB");
- mDataPartitionSize.select(0);
- mDataPartitionSize.addModifyListener(validateListener);
-
- // --- sd card group
- label = new Label(parent, SWT.NONE);
- label.setText("SD Card:");
- label.setLayoutData(new GridData(GridData.BEGINNING, GridData.BEGINNING,
- false, false));
-
- final Group sdCardGroup = new Group(parent, SWT.NONE);
- sdCardGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- sdCardGroup.setLayout(new GridLayout(3, false));
-
- mSdCardSizeRadio = new Button(sdCardGroup, SWT.RADIO);
- mSdCardSizeRadio.setText("Size:");
- mSdCardSizeRadio.setToolTipText("Create a new SD Card file");
- mSdCardSizeRadio.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- boolean sizeMode = mSdCardSizeRadio.getSelection();
- enableSdCardWidgets(sizeMode);
- validatePage();
- }
- });
-
- mSdCardSize = new Text(sdCardGroup, SWT.BORDER);
- mSdCardSize.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mSdCardSize.addVerifyListener(mDigitVerifier);
- mSdCardSize.addModifyListener(validateListener);
- mSdCardSize.setToolTipText("Size of the new SD Card file (must be at least 9 MiB)");
-
- mSdCardSizeCombo = new Combo(sdCardGroup, SWT.DROP_DOWN | SWT.READ_ONLY);
- mSdCardSizeCombo.add("KiB");
- mSdCardSizeCombo.add("MiB");
- mSdCardSizeCombo.add("GiB");
- mSdCardSizeCombo.select(1);
- mSdCardSizeCombo.addSelectionListener(validateListener);
-
- mSdCardFileRadio = new Button(sdCardGroup, SWT.RADIO);
- mSdCardFileRadio.setText("File:");
- mSdCardFileRadio.setToolTipText("Use an existing file for the SD Card");
-
- mSdCardFile = new Text(sdCardGroup, SWT.BORDER);
- mSdCardFile.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mSdCardFile.addModifyListener(validateListener);
- mSdCardFile.setToolTipText("File to use for the SD Card");
-
- mBrowseSdCard = new Button(sdCardGroup, SWT.PUSH);
- mBrowseSdCard.setText("Browse...");
- mBrowseSdCard.setToolTipText("Select the file to use for the SD Card");
- mBrowseSdCard.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- onBrowseSdCard();
- validatePage();
- }
- });
-
- mSdCardSizeRadio.setSelection(true);
- enableSdCardWidgets(true);
-
- // --- avd options group
- label = new Label(parent, SWT.NONE);
- label.setText("Emulation Options:");
- Group optionsGroup = new Group(parent, SWT.NONE);
- optionsGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- optionsGroup.setLayout(new GridLayout(2, true));
- mSnapshot = new Button(optionsGroup, SWT.CHECK);
- mSnapshot.setText("Snapshot");
- mSnapshot.setToolTipText("Emulator's state will be persisted between emulator executions");
- mSnapshot.addSelectionListener(validateListener);
- mGpuEmulation = new Button(optionsGroup, SWT.CHECK);
- mGpuEmulation.setText("Use Host GPU");
- mGpuEmulation.setToolTipText("Enable hardware OpenGLES emulation");
- mGpuEmulation.addSelectionListener(validateListener);
-
- // --- force creation group
- mForceCreation = new Button(parent, SWT.CHECK);
- mForceCreation.setText("Override the existing AVD with the same name");
- mForceCreation
- .setToolTipText("There's already an AVD with the same name. Check this to delete it and replace it by the new AVD.");
- mForceCreation.setLayoutData(new GridData(GridData.BEGINNING, GridData.CENTER,
- true, false, 2, 1));
- mForceCreation.setEnabled(false);
- mForceCreation.addSelectionListener(validateListener);
-
- // add a separator to separate from the ok/cancel button
- label = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL);
- label.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 3, 1));
-
- // add stuff for the error display
- mStatusComposite = new Composite(parent, SWT.NONE);
- mStatusComposite.setLayoutData(new GridData(GridData.FILL, GridData.CENTER,
- true, false, 3, 1));
- GridLayout gl;
- mStatusComposite.setLayout(gl = new GridLayout(2, false));
- gl.marginHeight = gl.marginWidth = 0;
-
- mStatusIcon = new Label(mStatusComposite, SWT.NONE);
- mStatusIcon.setLayoutData(new GridData(GridData.BEGINNING, GridData.BEGINNING,
- false, false));
- mStatusLabel = new Label(mStatusComposite, SWT.NONE);
- mStatusLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mStatusLabel.setText(""); //$NON-NLS-1$
- }
-
- @Nullable
- private Device getSelectedDevice() {
- Device[] devices = (Device[]) mDevice.getData();
- if (devices != null) {
- int index = mDevice.getSelectionIndex();
- if (index != -1 && index < devices.length) {
- return devices[index];
- }
- }
-
- return null;
- }
-
- private void selectDevice(String manufacturer, String name) {
- Device[] devices = (Device[]) mDevice.getData();
- if (devices != null) {
- for (int i = 0, n = devices.length; i < n; i++) {
- Device device = devices[i];
- if (device.getManufacturer().equals(manufacturer)
- && device.getName().equals(name)) {
- mDevice.select(i);
- break;
- }
- }
- }
- }
-
- private void selectDevice(Device device) {
- Device[] devices = (Device[]) mDevice.getData();
- if (devices != null) {
- for (int i = 0, n = devices.length; i < n; i++) {
- if (devices[i].equals(device)) {
- mDevice.select(i);
- break;
- }
- }
- }
- }
-
- private void initializeDevices() {
- assert mDevice != null;
-
- SdkManager sdkManager = mAvdManager.getSdkManager();
- String location = sdkManager.getLocation();
- if (sdkManager != null && location != null) {
- DeviceManager deviceManager = DeviceManager.createInstance(location, mSdkLog);
- List<Device> deviceList = deviceManager.getDevices(DeviceManager.ALL_DEVICES);
-
- // Sort
- List<Device> nexus = new ArrayList<Device>(deviceList.size());
- List<Device> other = new ArrayList<Device>(deviceList.size());
- for (Device device : deviceList) {
- if (isNexus(device) && !isGeneric(device)) {
- nexus.add(device);
- } else {
- other.add(device);
- }
- }
- Collections.reverse(other);
- Collections.sort(nexus, new Comparator<Device>() {
- @Override
- public int compare(Device device1, Device device2) {
- // Descending order of age
- return nexusRank(device2) - nexusRank(device1);
- }
- });
- List<Device> all = nexus;
- all.addAll(other);
-
- Device[] devices = all.toArray(new Device[all.size()]);
- String[] labels = new String[devices.length];
- for (int i = 0, n = devices.length; i < n; i++) {
- Device device = devices[i];
- if (isNexus(device) && !isGeneric(device)) {
- labels[i] = getNexusLabel(device);
- } else {
- labels[i] = getGenericLabel(device);
- }
- }
- mDevice.setData(devices);
- mDevice.setItems(labels);
- }
- }
-
- /**
- * Can be called after the constructor to set the default device for this AVD.
- * Useful especially for new AVDs.
- * @param device
- */
- public void selectInitialDevice(Device device) {
- mInitWithDevice = device;
- }
-
- /**
- * {@link ModifyListener} used for live-validation of the fields content.
- */
- private class ValidateListener extends SelectionAdapter implements ModifyListener {
- @Override
- public void modifyText(ModifyEvent e) {
- validatePage();
- }
-
- @Override
- public void widgetSelected(SelectionEvent e) {
- super.widgetSelected(e);
- validatePage();
- }
- }
-
- /**
- * Callback when the AVD name is changed. When creating a new AVD, enables
- * the force checkbox if the name is a duplicate. When editing an existing
- * AVD, it's OK for the name to match the existing AVD.
- */
- private class CreateNameModifyListener implements ModifyListener {
- @Override
- public void modifyText(ModifyEvent e) {
- String name = mAvdName.getText().trim();
- if (mAvdInfo == null || !name.equals(mAvdInfo.getName())) {
- // Case where we're creating a new AVD or editing an existing
- // one
- // and the AVD name has been changed... check for name
- // uniqueness.
-
- Pair<AvdConflict, String> conflict = mAvdManager.isAvdNameConflicting(name);
- if (conflict.getFirst() != AvdManager.AvdConflict.NO_CONFLICT) {
- // If we're changing the state from disabled to enabled,
- // make sure
- // to uncheck the button, to force the user to voluntarily
- // re-enforce it.
- // This happens when editing an existing AVD and changing
- // the name from
- // the existing AVD to another different existing AVD.
- if (!mForceCreation.isEnabled()) {
- mForceCreation.setEnabled(true);
- mForceCreation.setSelection(false);
- }
- } else {
- mForceCreation.setEnabled(false);
- mForceCreation.setSelection(false);
- }
- } else {
- // Case where we're editing an existing AVD with the name
- // unchanged.
-
- mForceCreation.setEnabled(false);
- mForceCreation.setSelection(false);
- }
- validatePage();
- }
- }
-
- private class DeviceSelectionListener extends SelectionAdapter {
-
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- Device currentDevice = getSelectedDevice();
- if (currentDevice != null) {
- fillDeviceProperties(currentDevice);
- }
-
- toggleCameras();
- validatePage();
- }
- }
-
- private void fillDeviceProperties(Device device) {
- Hardware hw = device.getDefaultHardware();
- Long ram = hw.getRam().getSizeAsUnit(Storage.Unit.MiB);
- mRam.setText(Long.toString(ram));
-
- // Set the default VM heap size. This is based on the Android CDD minimums for each
- // screen size and density.
- Screen s = hw.getScreen();
- ScreenSize size = s.getSize();
- Density density = s.getPixelDensity();
- int vmHeapSize = 32;
- if (size.equals(ScreenSize.XLARGE)) {
- switch (density) {
- case LOW:
- case MEDIUM:
- vmHeapSize = 32;
- break;
- case TV:
- case HIGH:
- vmHeapSize = 64;
- break;
- case XHIGH:
- case XXHIGH:
- vmHeapSize = 128;
- break;
- case NODPI:
- break;
- }
- } else {
- switch (density) {
- case LOW:
- case MEDIUM:
- vmHeapSize = 16;
- break;
- case TV:
- case HIGH:
- vmHeapSize = 32;
- break;
- case XHIGH:
- case XXHIGH:
- vmHeapSize = 64;
- break;
- case NODPI:
- break;
- }
- }
- mVmHeap.setText(Integer.toString(vmHeapSize));
-
- List<Software> allSoftware = device.getAllSoftware();
- if (allSoftware != null && !allSoftware.isEmpty()) {
- Software first = allSoftware.get(0);
- int min = first.getMinSdkLevel();;
- int max = first.getMaxSdkLevel();;
- for (int i = 1; i < allSoftware.size(); i++) {
- min = Math.min(min, first.getMinSdkLevel());
- max = Math.max(max, first.getMaxSdkLevel());
- }
- if (mCurrentTargets != null) {
- int bestApiLevel = Integer.MAX_VALUE;
- IAndroidTarget bestTarget = null;
- for (IAndroidTarget target : mCurrentTargets.values()) {
- if (!target.isPlatform()) {
- continue;
- }
- int apiLevel = target.getVersion().getApiLevel();
- if (apiLevel >= min && apiLevel <= max) {
- if (bestTarget == null || apiLevel < bestApiLevel) {
- bestTarget = target;
- bestApiLevel = apiLevel;
- }
- }
- }
-
- if (bestTarget != null) {
- selectTarget(bestTarget);
- reloadAbiTypeCombo();
- }
- }
- }
- }
-
- private void toggleCameras() {
- mFrontCamera.setEnabled(false);
- mBackCamera.setEnabled(false);
- Device d = getSelectedDevice();
- if (d != null) {
- for (Camera c : d.getDefaultHardware().getCameras()) {
- if (CameraLocation.FRONT.equals(c.getLocation())) {
- mFrontCamera.setEnabled(true);
- }
- if (CameraLocation.BACK.equals(c.getLocation())) {
- mBackCamera.setEnabled(true);
- }
- }
- }
- }
-
- private void reloadTargetCombo() {
- String selected = null;
- int index = mTarget.getSelectionIndex();
- if (index >= 0) {
- selected = mTarget.getItem(index);
- }
-
- mCurrentTargets.clear();
- mTarget.removeAll();
-
- boolean found = false;
- index = -1;
-
- List<IAndroidTarget> targetData = new ArrayList<IAndroidTarget>();
- SdkManager sdkManager = mAvdManager.getSdkManager();
- if (sdkManager != null) {
- for (IAndroidTarget target : sdkManager.getTargets()) {
- String name;
- if (target.isPlatform()) {
- name = String.format("%s - API Level %s",
- target.getName(),
- target.getVersion().getApiString());
- } else {
- name = String.format("%s (%s) - API Level %s",
- target.getName(),
- target.getVendor(),
- target.getVersion().getApiString());
- }
- mCurrentTargets.put(name, target);
- mTarget.add(name);
- targetData.add(target);
- if (!found) {
- index++;
- found = name.equals(selected);
- }
- }
- }
-
- mTarget.setEnabled(mCurrentTargets.size() > 0);
- mTarget.setData(targetData.toArray(new IAndroidTarget[targetData.size()]));
-
- if (found) {
- mTarget.select(index);
- }
- }
-
- private void selectTarget(IAndroidTarget target) {
- IAndroidTarget[] targets = (IAndroidTarget[]) mTarget.getData();
- if (targets != null) {
- for (int i = 0; i < targets.length; i++) {
- if (target == targets[i]) {
- mTarget.select(i);
- break;
- }
- }
- }
- }
-
- @SuppressWarnings("unused")
- @Deprecated // FIXME unused, cleanup later
- private IAndroidTarget getSelectedTarget() {
- IAndroidTarget[] targets = (IAndroidTarget[]) mTarget.getData();
- int index = mTarget.getSelectionIndex();
- if (targets != null && index != -1 && index < targets.length) {
- return targets[index];
- }
-
- return null;
- }
-
- /**
- * Reload all the abi types in the selection list
- */
- private void reloadAbiTypeCombo() {
- String selected = null;
- boolean found = false;
-
- int index = mTarget.getSelectionIndex();
- if (index >= 0) {
- String targetName = mTarget.getItem(index);
- IAndroidTarget target = mCurrentTargets.get(targetName);
-
- ISystemImage[] systemImages = getSystemImages(target);
-
- mAbi.setEnabled(systemImages.length > 1);
-
- // If user explicitly selected an ABI before, preserve that option
- // If user did not explicitly select before (only one option before)
- // force them to select
- index = mAbi.getSelectionIndex();
- if (index >= 0 && mAbi.getItemCount() > 1) {
- selected = mAbi.getItem(index);
- }
-
- mAbi.removeAll();
-
- int i;
- for (i = 0; i < systemImages.length; i++) {
- String prettyAbiType = AvdInfo.getPrettyAbiType(systemImages[i].getAbiType());
- mAbi.add(prettyAbiType);
- if (!found) {
- found = prettyAbiType.equals(selected);
- if (found) {
- mAbi.select(i);
- }
- }
- }
-
- mHaveSystemImage = systemImages.length > 0;
- if (!mHaveSystemImage) {
- mAbi.add("No system images installed for this target.");
- mAbi.select(0);
- } else if (systemImages.length == 1) {
- mAbi.select(0);
- }
- }
- }
-
- /**
- * Enable or disable the sd card widgets.
- *
- * @param sizeMode if true the size-based widgets are to be enabled, and the
- * file-based ones disabled.
- */
- private void enableSdCardWidgets(boolean sizeMode) {
- mSdCardSize.setEnabled(sizeMode);
- mSdCardSizeCombo.setEnabled(sizeMode);
-
- mSdCardFile.setEnabled(!sizeMode);
- mBrowseSdCard.setEnabled(!sizeMode);
- }
-
- private void onBrowseSdCard() {
- FileDialog dlg = new FileDialog(getContents().getShell(), SWT.OPEN);
- dlg.setText("Choose SD Card image file.");
-
- String fileName = dlg.open();
- if (fileName != null) {
- mSdCardFile.setText(fileName);
- }
- }
-
- @Override
- public void okPressed() {
- if (createAvd()) {
- super.okPressed();
- }
- }
-
- private void validatePage() {
- String error = null;
- String warning = null;
- boolean valid = true;
-
- if (mAvdName.getText().isEmpty()) {
- error = "AVD Name cannot be empty";
- setPageValid(false, error, warning);
- return;
- }
-
- String avdName = mAvdName.getText();
- if (!AvdManager.RE_AVD_NAME.matcher(avdName).matches()) {
- error = String.format(
- "AVD name '%1$s' contains invalid characters.\nAllowed characters are: %2$s",
- avdName, AvdManager.CHARS_AVD_NAME);
- setPageValid(false, error, warning);
- return;
- }
-
- if (mDevice.getSelectionIndex() < 0) {
- setPageValid(false, error, warning);
- return;
- }
-
- if (mTarget.getSelectionIndex() < 0 ||
- !mHaveSystemImage || mAbi.getSelectionIndex() < 0) {
- setPageValid(false, error, warning);
- return;
- }
-
- if (mRam.getText().isEmpty()) {
- setPageValid(false, error, warning);
- return;
- }
-
- if (mVmHeap.getText().isEmpty()) {
- setPageValid(false, error, warning);
- return;
- }
-
- if (mDataPartition.getText().isEmpty() || mDataPartitionSize.getSelectionIndex() < 0) {
- error = "Invalid Data partition size.";
- setPageValid(false, error, warning);
- return;
- }
-
- // validate sdcard size or file
- if (mSdCardSizeRadio.getSelection()) {
- if (!mSdCardSize.getText().isEmpty() && mSdCardSizeCombo.getSelectionIndex() >= 0) {
- try {
- long sdSize = Long.parseLong(mSdCardSize.getText());
-
- int sizeIndex = mSdCardSizeCombo.getSelectionIndex();
- if (sizeIndex >= 0) {
- // index 0 shifts by 10 (1024=K), index 1 by 20, etc.
- sdSize <<= 10 * (1 + sizeIndex);
- }
-
- if (sdSize < AvdManager.SDCARD_MIN_BYTE_SIZE ||
- sdSize > AvdManager.SDCARD_MAX_BYTE_SIZE) {
- valid = false;
- error = "SD Card size is invalid. Range is 9 MiB..1023 GiB.";
- }
- } catch (NumberFormatException e) {
- valid = false;
- error = " SD Card size must be a valid integer between 9 MiB and 1023 GiB";
- }
- }
- } else {
- if (mSdCardFile.getText().isEmpty() || !new File(mSdCardFile.getText()).isFile()) {
- valid = false;
- error = "SD Card path isn't valid.";
- }
- }
- if (!valid) {
- setPageValid(valid, error, warning);
- return;
- }
-
- if (mForceCreation.isEnabled() && !mForceCreation.getSelection()) {
- valid = false;
- error = String.format(
- "The AVD name '%s' is already used.\n" +
- "Check \"Override the existing AVD\" to delete the existing one.",
- mAvdName.getText());
- }
-
- if (mAvdInfo != null && !mAvdInfo.getName().equals(mAvdName.getText())) {
- warning = String.format("The AVD '%1$s' will be duplicated into '%2$s'.",
- mAvdInfo.getName(),
- mAvdName.getText());
- }
-
- // On Windows, display a warning if attempting to create AVD's with RAM > 512 MB.
- // This restriction should go away when we switch to using a 64 bit emulator.
- if (SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_WINDOWS) {
- long ramSize = 0;
- try {
- ramSize = Long.parseLong(mRam.getText());
- } catch (NumberFormatException e) {
- // ignore
- }
-
- if (ramSize > 768) {
- warning = "On Windows, emulating RAM greater than 768M may fail depending on the"
- + " system load.\nTry progressively smaller values of RAM if the emulator"
- + " fails to launch.";
- }
- }
-
- if (mGpuEmulation.getSelection() && mSnapshot.getSelection()) {
- valid = false;
- error = "GPU Emulation and Snapshot cannot be used simultaneously";
- }
-
- setPageValid(valid, error, warning);
- return;
- }
-
- private void setPageValid(boolean valid, String error, String warning) {
- mOkButton.setEnabled(valid);
- if (error != null) {
- mStatusIcon.setImage(mImageFactory.getImageByName("reject_icon16.png")); //$NON-NLS-1$
- mStatusLabel.setText(error);
- } else if (warning != null) {
- mStatusIcon.setImage(mImageFactory.getImageByName("warning_icon16.png")); //$NON-NLS-1$
- mStatusLabel.setText(warning);
- } else {
- mStatusIcon.setImage(null);
- mStatusLabel.setText(" \n "); //$NON-NLS-1$
- }
-
- mStatusComposite.pack(true);
- }
-
- private boolean createAvd() {
-
- String avdName = mAvdName.getText();
- if (avdName == null || avdName.isEmpty()) {
- return false;
- }
-
- String targetName = mTarget.getItem(mTarget.getSelectionIndex());
- IAndroidTarget target = mCurrentTargets.get(targetName);
- if (target == null) {
- return false;
- }
-
- // get the abi type
- String abiType = SdkConstants.ABI_ARMEABI;
- ISystemImage[] systemImages = getSystemImages(target);
- if (systemImages.length > 0) {
- int abiIndex = mAbi.getSelectionIndex();
- if (abiIndex >= 0) {
- String prettyname = mAbi.getItem(abiIndex);
- // Extract the abi type
- int firstIndex = prettyname.indexOf("(");
- int lastIndex = prettyname.indexOf(")");
- abiType = prettyname.substring(firstIndex + 1, lastIndex);
- }
- }
-
- // get the SD card data from the UI.
- String sdName = null;
- if (mSdCardSizeRadio.getSelection()) {
- // size mode
- String value = mSdCardSize.getText().trim();
- if (value.length() > 0) {
- sdName = value;
- // add the unit
- switch (mSdCardSizeCombo.getSelectionIndex()) {
- case 0:
- sdName += "K"; //$NON-NLS-1$
- break;
- case 1:
- sdName += "M"; //$NON-NLS-1$
- break;
- case 2:
- sdName += "G"; //$NON-NLS-1$
- break;
- default:
- // shouldn't be here
- assert false;
- }
- }
- } else {
- // file mode.
- sdName = mSdCardFile.getText().trim();
- }
-
- // Get the device
- Device device = getSelectedDevice();
- if (device == null) {
- return false;
- }
-
- Screen s = device.getDefaultHardware().getScreen();
- String skinName = s.getXDimension() + "x" + s.getYDimension();
-
- ILogger log = mSdkLog;
- if (log == null || log instanceof MessageBoxLog) {
- // If the current logger is a message box, we use our own (to make sure
- // to display errors right away and customize the title).
- log = new MessageBoxLog(
- String.format("Result of creating AVD '%s':", avdName),
- getContents().getDisplay(),
- false /* logErrorsOnly */);
- }
-
- Map<String, String> hwProps = DeviceManager.getHardwareProperties(device);
- if (mGpuEmulation.getSelection()) {
- hwProps.put(AvdManager.AVD_INI_GPU_EMULATION, HardwareProperties.BOOLEAN_YES);
- }
-
- File avdFolder = null;
- try {
- avdFolder = AvdInfo.getDefaultAvdFolder(mAvdManager, avdName);
- } catch (AndroidLocationException e) {
- return false;
- }
-
- // Although the device has this information, some devices have more RAM than we'd want to
- // allocate to an emulator.
- hwProps.put(AvdManager.AVD_INI_RAM_SIZE, mRam.getText());
- hwProps.put(AvdManager.AVD_INI_VM_HEAP_SIZE, mVmHeap.getText());
-
- String suffix;
- switch (mDataPartitionSize.getSelectionIndex()) {
- case 0:
- suffix = "M";
- break;
- case 1:
- suffix = "G";
- break;
- default:
- suffix = "K";
- }
- hwProps.put(AvdManager.AVD_INI_DATA_PARTITION_SIZE, mDataPartition.getText()+suffix);
-
- hwProps.put(HardwareProperties.HW_KEYBOARD,
- mKeyboard.getSelection() ?
- HardwareProperties.BOOLEAN_YES : HardwareProperties.BOOLEAN_NO);
-
- hwProps.put(AvdManager.AVD_INI_SKIN_DYNAMIC,
- mSkin.getSelection() ?
- HardwareProperties.BOOLEAN_YES : HardwareProperties.BOOLEAN_NO);
-
- if (mFrontCamera.isEnabled()) {
- hwProps.put(AvdManager.AVD_INI_CAMERA_FRONT,
- mFrontCamera.getText().toLowerCase());
- }
-
- if (mBackCamera.isEnabled()) {
- hwProps.put(AvdManager.AVD_INI_CAMERA_BACK,
- mBackCamera.getText().toLowerCase());
- }
-
- if (sdName != null) {
- hwProps.put(HardwareProperties.HW_SDCARD, HardwareProperties.BOOLEAN_YES);
- }
-
- AvdInfo avdInfo = mAvdManager.createAvd(avdFolder,
- avdName,
- target,
- abiType,
- skinName,
- sdName,
- hwProps,
- mSnapshot.getSelection(),
- mForceCreation.getSelection(),
- mAvdInfo != null, // edit existing
- log);
-
- mCreatedAvd = avdInfo;
- boolean success = avdInfo != null;
-
- if (log instanceof MessageBoxLog) {
- ((MessageBoxLog) log).displayResult(success);
- }
- return success;
- }
-
- private void fillExistingAvdInfo(AvdInfo avd) {
- mAvdName.setText(avd.getName());
- selectDevice(avd.getDeviceManufacturer(), avd.getDeviceName());
- toggleCameras();
-
- IAndroidTarget target = avd.getTarget();
-
- if (target != null && !mCurrentTargets.isEmpty()) {
- // Try to select the target in the target combo.
- // This will fail if the AVD needs to be repaired.
- //
- // This is a linear search but the list is always
- // small enough and we only do this once.
- int n = mTarget.getItemCount();
- for (int i = 0; i < n; i++) {
- if (target.equals(mCurrentTargets.get(mTarget.getItem(i)))) {
- mTarget.select(i);
- reloadAbiTypeCombo();
- break;
- }
- }
- }
-
- ISystemImage[] systemImages = getSystemImages(target);
- if (target != null && systemImages.length > 0) {
- mAbi.setEnabled(systemImages.length > 1);
- String abiType = AvdInfo.getPrettyAbiType(avd.getAbiType());
- int n = mAbi.getItemCount();
- for (int i = 0; i < n; i++) {
- if (abiType.equals(mAbi.getItem(i))) {
- mAbi.select(i);
- break;
- }
- }
- }
-
- Map<String, String> props = avd.getProperties();
-
- if (props != null) {
- String snapshots = props.get(AvdManager.AVD_INI_SNAPSHOT_PRESENT);
- if (snapshots != null && snapshots.length() > 0) {
- mSnapshot.setSelection(snapshots.equals("true"));
- }
-
- String gpuEmulation = props.get(AvdManager.AVD_INI_GPU_EMULATION);
- mGpuEmulation.setSelection(gpuEmulation != null &&
- gpuEmulation.equals(HardwareProperties.BOOLEAN_VALUES[0]));
-
- String sdcard = props.get(AvdManager.AVD_INI_SDCARD_PATH);
- if (sdcard != null && sdcard.length() > 0) {
- enableSdCardWidgets(false);
- mSdCardSizeRadio.setSelection(false);
- mSdCardFileRadio.setSelection(true);
- mSdCardFile.setText(sdcard);
- }
-
- String ramSize = props.get(AvdManager.AVD_INI_RAM_SIZE);
- if (ramSize != null) {
- mRam.setText(ramSize);
- }
-
- String vmHeapSize = props.get(AvdManager.AVD_INI_VM_HEAP_SIZE);
- if (vmHeapSize != null) {
- mVmHeap.setText(vmHeapSize);
- }
-
- String dataPartitionSize = props.get(AvdManager.AVD_INI_DATA_PARTITION_SIZE);
- if (dataPartitionSize != null) {
- mDataPartition.setText(
- dataPartitionSize.substring(0, dataPartitionSize.length() - 1));
- switch (dataPartitionSize.charAt(dataPartitionSize.length() - 1)) {
- case 'M':
- mDataPartitionSize.select(0);
- break;
- case 'G':
- mDataPartitionSize.select(1);
- break;
- default:
- mDataPartitionSize.select(-1);
- }
- }
-
- mKeyboard.setSelection(
- HardwareProperties.BOOLEAN_YES.equalsIgnoreCase(
- props.get(HardwareProperties.HW_KEYBOARD)));
- mSkin.setSelection(
- HardwareProperties.BOOLEAN_YES.equalsIgnoreCase(
- props.get(AvdManager.AVD_INI_SKIN_DYNAMIC)));
-
- String cameraFront = props.get(AvdManager.AVD_INI_CAMERA_FRONT);
- if (cameraFront != null) {
- String[] items = mFrontCamera.getItems();
- for (int i = 0; i < items.length; i++) {
- if (items[i].toLowerCase().equals(cameraFront)) {
- mFrontCamera.select(i);
- break;
- }
- }
- }
-
- String cameraBack = props.get(AvdManager.AVD_INI_CAMERA_BACK);
- if (cameraBack != null) {
- String[] items = mBackCamera.getItems();
- for (int i = 0; i < items.length; i++) {
- if (items[i].toLowerCase().equals(cameraBack)) {
- mBackCamera.select(i);
- break;
- }
- }
- }
-
- sdcard = props.get(AvdManager.AVD_INI_SDCARD_SIZE);
- if (sdcard != null && sdcard.length() > 0) {
- String[] values = new String[2];
- long sdcardSize = AvdManager.parseSdcardSize(sdcard, values);
-
- if (sdcardSize != AvdManager.SDCARD_NOT_SIZE_PATTERN) {
- enableSdCardWidgets(true);
- mSdCardFileRadio.setSelection(false);
- mSdCardSizeRadio.setSelection(true);
-
- mSdCardSize.setText(values[0]);
-
- String suffix = values[1];
- int n = mSdCardSizeCombo.getItemCount();
- for (int i = 0; i < n; i++) {
- if (mSdCardSizeCombo.getItem(i).startsWith(suffix)) {
- mSdCardSizeCombo.select(i);
- }
- }
- }
- }
- }
- }
-
- private void fillInitialDeviceInfo(Device device) {
- String name = device.getManufacturer();
- if (!name.equals("Generic") && // TODO define & use constants
- !name.equals("User") &&
- device.getName().indexOf(name) == -1) {
- name = " by " + name;
- } else {
- name = "";
- }
- name = "AVD for " + device.getName() + name;
- // sanitize the name
- name = name.replaceAll("[^0-9a-zA-Z_-]+", " ").trim().replaceAll("[ _]+", "_");
- mAvdName.setText(name);
-
- // Select the device
- selectDevice(device);
- toggleCameras();
-
- // If there's only one target, select it by default.
- // TODO: if there are more than 1 target, select the higher platform target as
- // a likely default.
- if (mTarget.getItemCount() == 1) {
- mTarget.select(0);
- reloadAbiTypeCombo();
- }
-
- fillDeviceProperties(device);
- }
-
- /**
- * Returns the list of system images of a target.
- * <p/>
- * If target is null, returns an empty list. If target is an add-on with no
- * system images, return the list from its parent platform.
- *
- * @param target An IAndroidTarget. Can be null.
- * @return A non-null ISystemImage array. Can be empty.
- */
- private ISystemImage[] getSystemImages(IAndroidTarget target) {
- if (target != null) {
- ISystemImage[] images = target.getSystemImages();
-
- if ((images == null || images.length == 0) && !target.isPlatform()) {
- // If an add-on does not provide any system images, use the ones
- // from the parent.
- images = target.getParent().getSystemImages();
- }
-
- if (images != null) {
- return images;
- }
- }
-
- return new ISystemImage[0];
- }
-
- // Code copied from DeviceMenuListener in ADT; unify post release
-
- 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$
-
- private static int nexusRank(Device device) {
- String name = device.getName();
- if (name.endsWith(" One")) { //$NON-NLS-1$
- return 1;
- }
- if (name.endsWith(" S")) { //$NON-NLS-1$
- return 2;
- }
- if (name.startsWith("Galaxy")) { //$NON-NLS-1$
- return 3;
- }
- if (name.endsWith(" 7")) { //$NON-NLS-1$
- return 4;
- }
- if (name.endsWith(" 10")) { //$NON-NLS-1$
- return 5;
- }
- if (name.endsWith(" 4")) { //$NON-NLS-1$
- return 6;
- }
-
- return 7;
- }
-
- private static boolean isGeneric(Device device) {
- return device.getManufacturer().equals(GENERIC);
- }
-
- private static boolean isNexus(Device device) {
- return device.getName().contains(NEXUS);
- }
-
- private static String getGenericLabel(Device d) {
- // * Replace "'in'" with '"' (e.g. 2.7" QVGA instead of 2.7in QVGA)
- // * Use the same precision for all devices (all but one specify decimals)
- // * Add some leading space such that the dot ends up roughly in the
- // same space
- // * Add in screen resolution and density
- String name = d.getName();
- if (name.equals("3.7 FWVGA slider")) { //$NON-NLS-1$
- // Fix metadata: this one entry doesn't have "in" like the rest of them
- name = "3.7in FWVGA slider"; //$NON-NLS-1$
- }
-
- Matcher matcher = PATTERN.matcher(name);
- if (matcher.matches()) {
- String size = matcher.group(1);
- String n = matcher.group(2);
- int dot = size.indexOf('.');
- if (dot == -1) {
- size = size + ".0";
- dot = size.length() - 2;
- }
- for (int i = 0; i < 2 - dot; i++) {
- size = ' ' + size;
- }
- name = size + "\" " + n;
- }
-
- return String.format(java.util.Locale.US, "%1$s (%2$s)", name,
- getResolutionString(d));
- }
-
- private static String getNexusLabel(Device d) {
- String name = d.getName();
- Screen screen = d.getDefaultHardware().getScreen();
- float length = (float) screen.getDiagonalLength();
- return String.format(java.util.Locale.US, "%1$s (%3$s\", %2$s)",
- name, getResolutionString(d), Float.toString(length));
- }
-
- @Nullable
- private static String getResolutionString(Device device) {
- Screen screen = device.getDefaultHardware().getScreen();
- return String.format(java.util.Locale.US,
- "%1$d \u00D7 %2$d: %3$s", // U+00D7: Unicode multiplication sign
- screen.getXDimension(),
- screen.getYDimension(),
- screen.getPixelDensity().getResourceValue());
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdDetailsDialog.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdDetailsDialog.java
deleted file mode 100644
index ce40360..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdDetailsDialog.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.widgets;
-
-import com.android.sdklib.AndroidVersion;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.internal.avd.AvdInfo;
-import com.android.sdklib.internal.avd.AvdManager;
-import com.android.sdklib.internal.avd.AvdInfo.AvdStatus;
-import com.android.sdkuilib.ui.GridDataBuilder;
-import com.android.sdkuilib.ui.GridLayoutBuilder;
-import com.android.sdkuilib.ui.SwtBaseDialog;
-
-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;
-import org.eclipse.swt.widgets.Shell;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Dialog displaying the details of an AVD.
- */
-final class AvdDetailsDialog extends SwtBaseDialog {
-
- private final AvdInfo mAvdInfo;
-
- public AvdDetailsDialog(Shell shell, AvdInfo avdInfo) {
- super(shell, SWT.APPLICATION_MODAL, "AVD details");
- mAvdInfo = avdInfo;
- }
-
- /**
- * Create contents of the dialog.
- */
- @Override
- protected void createContents() {
- Shell shell = getShell();
- GridLayoutBuilder.create(shell).columns(2);
- GridDataBuilder.create(shell).fill();
-
- GridLayout gl;
-
- Composite c = new Composite(shell, SWT.NONE);
- c.setLayout(gl = new GridLayout(2, false));
- gl.marginHeight = gl.marginWidth = 0;
- c.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
- if (mAvdInfo != null) {
- displayValue(c, "Name:", mAvdInfo.getName());
- displayValue(c, "CPU/ABI:", AvdInfo.getPrettyAbiType(mAvdInfo.getAbiType()));
-
- displayValue(c, "Path:", mAvdInfo.getDataFolderPath());
-
- if (mAvdInfo.getStatus() != AvdStatus.OK) {
- displayValue(c, "Error:", mAvdInfo.getErrorMessage());
- } else {
- IAndroidTarget target = mAvdInfo.getTarget();
- AndroidVersion version = target.getVersion();
- displayValue(c, "Target:", String.format("%s (API level %s)",
- target.getName(), version.getApiString()));
-
- // display some extra values.
- Map<String, String> properties = mAvdInfo.getProperties();
- if (properties != null) {
- String skin = properties.get(AvdManager.AVD_INI_SKIN_NAME);
- if (skin != null) {
- displayValue(c, "Skin:", skin);
- }
-
- String sdcard = properties.get(AvdManager.AVD_INI_SDCARD_SIZE);
- if (sdcard == null) {
- sdcard = properties.get(AvdManager.AVD_INI_SDCARD_PATH);
- }
- if (sdcard != null) {
- displayValue(c, "SD Card:", sdcard);
- }
-
- String snapshot = properties.get(AvdManager.AVD_INI_SNAPSHOT_PRESENT);
- if (snapshot != null) {
- displayValue(c, "Snapshot:", snapshot);
- }
-
- // display other hardware
- HashMap<String, String> copy = new HashMap<String, String>(properties);
- // remove stuff we already displayed (or that we don't want to display)
- copy.remove(AvdManager.AVD_INI_ABI_TYPE);
- copy.remove(AvdManager.AVD_INI_CPU_ARCH);
- copy.remove(AvdManager.AVD_INI_SKIN_NAME);
- copy.remove(AvdManager.AVD_INI_SKIN_PATH);
- copy.remove(AvdManager.AVD_INI_SDCARD_SIZE);
- copy.remove(AvdManager.AVD_INI_SDCARD_PATH);
- copy.remove(AvdManager.AVD_INI_IMAGES_1);
- copy.remove(AvdManager.AVD_INI_IMAGES_2);
-
- if (copy.size() > 0) {
- Label l = new Label(shell, SWT.SEPARATOR | SWT.HORIZONTAL);
- l.setLayoutData(new GridData(
- GridData.FILL, GridData.CENTER, false, false, 2, 1));
-
- c = new Composite(shell, SWT.NONE);
- c.setLayout(gl = new GridLayout(2, false));
- gl.marginHeight = gl.marginWidth = 0;
- c.setLayoutData(new GridData(GridData.FILL_BOTH));
-
- for (Map.Entry<String, String> entry : copy.entrySet()) {
- displayValue(c, entry.getKey() + ":", entry.getValue());
- }
- }
- }
- }
- }
- }
-
- // -- Start of internal part ----------
- // Hide everything down-below from SWT designer
- //$hide>>$
-
-
- @Override
- protected void postCreate() {
- // pass
- }
-
- /**
- * Displays a value with a label.
- *
- * @param parent the parent Composite in which to display the value. This Composite must use a
- * {@link GridLayout} with 2 columns.
- * @param label the label of the value to display.
- * @param value the string value to display.
- */
- private void displayValue(Composite parent, String label, String value) {
- Label l = new Label(parent, SWT.NONE);
- l.setText(label);
- l.setLayoutData(new GridData(GridData.END, GridData.CENTER, false, false));
-
- l = new Label(parent, SWT.NONE);
- l.setText(value);
- l.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
- }
-
- // End of hiding from SWT Designer
- //$hide<<$
-}
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
deleted file mode 100644
index 67d161f..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdSelector.java
+++ /dev/null
@@ -1,1252 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.widgets;
-
-import com.android.SdkConstants;
-import com.android.annotations.Nullable;
-import com.android.prefs.AndroidLocation.AndroidLocationException;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.devices.Device;
-import com.android.sdklib.devices.DeviceManager;
-import com.android.sdklib.internal.avd.AvdInfo;
-import com.android.sdklib.internal.avd.AvdInfo.AvdStatus;
-import com.android.sdklib.internal.avd.AvdManager;
-import com.android.sdklib.internal.repository.ITask;
-import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.util.GrabProcessOutput;
-import com.android.sdklib.util.GrabProcessOutput.IProcessOutput;
-import com.android.sdklib.util.GrabProcessOutput.Wait;
-import com.android.sdkuilib.internal.repository.SettingsController;
-import com.android.sdkuilib.internal.repository.icons.ImageFactory;
-import com.android.sdkuilib.internal.repository.ui.AvdManagerWindowImpl1;
-import com.android.sdkuilib.internal.tasks.ProgressTask;
-import com.android.sdkuilib.repository.AvdManagerWindow.AvdInvocationContext;
-import com.android.sdkuilib.ui.GridDialog;
-import com.android.utils.ILogger;
-import com.android.utils.NullLogger;
-
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.Formatter;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-
-/**
- * The AVD selector is a table that is added to the given parent composite.
- * <p/>
- * After using one of the constructors, call {@link #setSelection(AvdInfo)},
- * {@link #setSelectionListener(SelectionListener)} and finally use
- * {@link #getSelected()} to retrieve the selection.
- */
-public final class AvdSelector {
- private static int NUM_COL = 2;
-
- private final DisplayMode mDisplayMode;
-
- private AvdManager mAvdManager;
- private final String mOsSdkPath;
-
- private Table mTable;
- private Button mDeleteButton;
- private Button mDetailsButton;
- private Button mNewButton;
- private Button mEditButton;
- private Button mRefreshButton;
- private Button mManagerButton;
- private Button mRepairButton;
- private Button mStartButton;
-
- private SelectionListener mSelectionListener;
- private IAvdFilter mTargetFilter;
-
- /** Defaults to true. Changed by the {@link #setEnabled(boolean)} method to represent the
- * "global" enabled state on this composite. */
- private boolean mIsEnabled = true;
-
- private ImageFactory mImageFactory;
- private Image mOkImage;
- private Image mBrokenImage;
- private Image mInvalidImage;
-
- private SettingsController mController;
-
- private final ILogger mSdkLog;
-
- private boolean mInternalRefresh;
-
-
- /**
- * The display mode of the AVD Selector.
- */
- public static enum DisplayMode {
- /**
- * Manager mode. Invalid AVDs are displayed. Buttons to create/delete AVDs
- */
- MANAGER,
-
- /**
- * Non manager mode. Only valid AVDs are displayed. Cannot create/delete AVDs, but
- * there is a button to open the AVD Manager.
- * In the "check" selection mode, checkboxes are displayed on each line
- * and {@link AvdSelector#getSelected()} returns the line that is checked
- * even if it is not the currently selected line. Only one line can
- * be checked at once.
- */
- SIMPLE_CHECK,
-
- /**
- * Non manager mode. Only valid AVDs are displayed. Cannot create/delete AVDs, but
- * there is a button to open the AVD Manager.
- * In the "select" selection mode, there are no checkboxes and
- * {@link AvdSelector#getSelected()} returns the line currently selected.
- * Only one line can be selected at once.
- */
- SIMPLE_SELECTION,
- }
-
- /**
- * A filter to control the whether or not an AVD should be displayed by the AVD Selector.
- */
- public interface IAvdFilter {
- /**
- * Called before {@link #accept(AvdInfo)} is called for any AVD.
- */
- void prepare();
-
- /**
- * Called to decided whether an AVD should be displayed.
- * @param avd the AVD to test.
- * @return true if the AVD should be displayed.
- */
- boolean accept(AvdInfo avd);
-
- /**
- * Called after {@link #accept(AvdInfo)} has been called on all the AVDs.
- */
- void cleanup();
- }
-
- /**
- * Internal implementation of {@link IAvdFilter} to filter out the AVDs that are not
- * running an image compatible with a specific target.
- */
- private final static class TargetBasedFilter implements IAvdFilter {
- private final IAndroidTarget mTarget;
-
- TargetBasedFilter(IAndroidTarget target) {
- mTarget = target;
- }
-
- @Override
- public void prepare() {
- // nothing to prepare
- }
-
- @Override
- public boolean accept(AvdInfo avd) {
- if (avd != null) {
- return mTarget.canRunOn(avd.getTarget());
- }
-
- return false;
- }
-
- @Override
- public void cleanup() {
- // nothing to clean up
- }
- }
-
- /**
- * Creates a new SDK Target Selector, and fills it with a list of {@link AvdInfo}, filtered
- * by a {@link IAndroidTarget}.
- * <p/>Only the {@link AvdInfo} able to run application developed for the given
- * {@link IAndroidTarget} will be displayed.
- *
- * @param parent The parent composite where the selector will be added.
- * @param osSdkPath The SDK root path. When not null, enables the start button to start
- * an emulator on a given AVD.
- * @param manager the AVD manager.
- * @param filter When non-null, will allow filtering the AVDs to display.
- * @param displayMode The display mode ({@link DisplayMode}).
- * @param sdkLog The logger. Cannot be null.
- */
- public AvdSelector(Composite parent,
- String osSdkPath,
- AvdManager manager,
- IAvdFilter filter,
- DisplayMode displayMode,
- ILogger sdkLog) {
- mOsSdkPath = osSdkPath;
- mAvdManager = manager;
- mTargetFilter = filter;
- mDisplayMode = displayMode;
- mSdkLog = sdkLog;
-
- // get some bitmaps.
- mImageFactory = new ImageFactory(parent.getDisplay());
- mOkImage = mImageFactory.getImageByName("accept_icon16.png");
- mBrokenImage = mImageFactory.getImageByName("broken_16.png");
- mInvalidImage = mImageFactory.getImageByName("reject_icon16.png");
-
- // Layout has 2 columns
- Composite group = new Composite(parent, SWT.NONE);
- GridLayout gl;
- group.setLayout(gl = new GridLayout(NUM_COL, false /*makeColumnsEqualWidth*/));
- gl.marginHeight = gl.marginWidth = 0;
- group.setLayoutData(new GridData(GridData.FILL_BOTH));
- group.setFont(parent.getFont());
- group.addDisposeListener(new DisposeListener() {
- @Override
- public void widgetDisposed(DisposeEvent arg0) {
- mImageFactory.dispose();
- }
- });
-
- int style = SWT.FULL_SELECTION | SWT.SINGLE | SWT.BORDER;
- if (displayMode == DisplayMode.SIMPLE_CHECK) {
- style |= SWT.CHECK;
- }
- mTable = new Table(group, style);
- mTable.setHeaderVisible(true);
- mTable.setLinesVisible(false);
- setTableHeightHint(0);
-
- Composite buttons = new Composite(group, SWT.NONE);
- buttons.setLayout(gl = new GridLayout(1, false /*makeColumnsEqualWidth*/));
- gl.marginHeight = gl.marginWidth = 0;
- buttons.setLayoutData(new GridData(GridData.FILL_VERTICAL));
- buttons.setFont(group.getFont());
-
- if (displayMode == DisplayMode.MANAGER) {
- mNewButton = new Button(buttons, SWT.PUSH | SWT.FLAT);
- mNewButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mNewButton.setText("New...");
- mNewButton.setToolTipText("Creates a new AVD.");
- mNewButton.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- onNew();
- }
- });
-
- mEditButton = new Button(buttons, SWT.PUSH | SWT.FLAT);
- mEditButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mEditButton.setText("Edit...");
- mEditButton.setToolTipText("Edit an existing AVD.");
- mEditButton.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- onEdit();
- }
- });
-
- mDeleteButton = new Button(buttons, SWT.PUSH | SWT.FLAT);
- mDeleteButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mDeleteButton.setText("Delete...");
- mDeleteButton.setToolTipText("Deletes the selected AVD.");
- mDeleteButton.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- onDelete();
- }
- });
-
- mRepairButton = new Button(buttons, SWT.PUSH | SWT.FLAT);
- mRepairButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mRepairButton.setText("Repair...");
- mRepairButton.setToolTipText("Repairs the selected AVD.");
- mRepairButton.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- onRepair();
- }
- });
-
- Label l = new Label(buttons, SWT.SEPARATOR | SWT.HORIZONTAL);
- l.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- }
-
- mDetailsButton = new Button(buttons, SWT.PUSH | SWT.FLAT);
- mDetailsButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mDetailsButton.setText("Details...");
- mDetailsButton.setToolTipText("Displays details of the selected AVD.");
- mDetailsButton.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- onDetails();
- }
- });
-
- mStartButton = new Button(buttons, SWT.PUSH | SWT.FLAT);
- mStartButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mStartButton.setText("Start...");
- mStartButton.setToolTipText("Starts the selected AVD.");
- mStartButton.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- onStart();
- }
- });
-
- Composite padding = new Composite(buttons, SWT.NONE);
- padding.setLayoutData(new GridData(GridData.FILL_VERTICAL));
-
- mRefreshButton = new Button(buttons, SWT.PUSH | SWT.FLAT);
- mRefreshButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mRefreshButton.setText("Refresh");
- mRefreshButton.setToolTipText("Reloads the list of AVD.\nUse this if you create AVDs from the command line.");
- mRefreshButton.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- refresh(true);
- }
- });
-
- if (displayMode != DisplayMode.MANAGER) {
- mManagerButton = new Button(buttons, SWT.PUSH | SWT.FLAT);
- mManagerButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mManagerButton.setText("Manager...");
- mManagerButton.setToolTipText("Launches the AVD manager.");
- mManagerButton.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- onAvdManager();
- }
- });
- } else {
- Composite legend = new Composite(group, SWT.NONE);
- legend.setLayout(gl = new GridLayout(4, false /*makeColumnsEqualWidth*/));
- gl.marginHeight = gl.marginWidth = 0;
- legend.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, true, false,
- NUM_COL, 1));
- legend.setFont(group.getFont());
-
- new Label(legend, SWT.NONE).setImage(mOkImage);
- new Label(legend, SWT.NONE).setText("A valid Android Virtual Device.");
- new Label(legend, SWT.NONE).setImage(mBrokenImage);
- new Label(legend, SWT.NONE).setText(
- "A repairable Android Virtual Device.");
- new Label(legend, SWT.NONE).setImage(mInvalidImage);
- Label l = new Label(legend, SWT.NONE);
- l.setText("An Android Virtual Device that failed to load. Click 'Details' to see the error.");
- GridData gd;
- l.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
- gd.horizontalSpan = 3;
- }
-
- // create the table columns
- final TableColumn column0 = new TableColumn(mTable, SWT.NONE);
- column0.setText("AVD Name");
- final TableColumn column1 = new TableColumn(mTable, SWT.NONE);
- column1.setText("Target Name");
- final TableColumn column2 = new TableColumn(mTable, SWT.NONE);
- column2.setText("Platform");
- final TableColumn column3 = new TableColumn(mTable, SWT.NONE);
- column3.setText("API Level");
- final TableColumn column4 = new TableColumn(mTable, SWT.NONE);
- column4.setText("CPU/ABI");
-
- adjustColumnsWidth(mTable, column0, column1, column2, column3, column4);
- setupSelectionListener(mTable);
- fillTable(mTable);
- setEnabled(true);
- }
-
- /**
- * Creates a new SDK Target Selector, and fills it with a list of {@link AvdInfo}.
- *
- * @param parent The parent composite where the selector will be added.
- * @param manager the AVD manager.
- * @param displayMode The display mode ({@link DisplayMode}).
- * @param sdkLog The logger. Cannot be null.
- */
- public AvdSelector(Composite parent,
- String osSdkPath,
- AvdManager manager,
- DisplayMode displayMode,
- ILogger sdkLog) {
- this(parent, osSdkPath, manager, (IAvdFilter)null /* filter */, displayMode, sdkLog);
- }
-
- /**
- * Creates a new SDK Target Selector, and fills it with a list of {@link AvdInfo}, filtered
- * by an {@link IAndroidTarget}.
- * <p/>Only the {@link AvdInfo} able to run applications developed for the given
- * {@link IAndroidTarget} will be displayed.
- *
- * @param parent The parent composite where the selector will be added.
- * @param manager the AVD manager.
- * @param filter Only shows the AVDs matching this target (must not be null).
- * @param displayMode The display mode ({@link DisplayMode}).
- * @param sdkLog The logger. Cannot be null.
- */
- public AvdSelector(Composite parent,
- String osSdkPath,
- AvdManager manager,
- IAndroidTarget filter,
- DisplayMode displayMode,
- ILogger sdkLog) {
- this(parent, osSdkPath, manager, new TargetBasedFilter(filter), displayMode, sdkLog);
- }
-
- /**
- * Sets an optional SettingsController.
- * @param controller the controller.
- */
- public void setSettingsController(SettingsController controller) {
- mController = controller;
- }
-
- /**
- * Sets the table grid layout data.
- *
- * @param heightHint If > 0, the height hint is set to the requested value.
- */
- public void setTableHeightHint(int heightHint) {
- GridData data = new GridData();
- if (heightHint > 0) {
- data.heightHint = heightHint;
- }
- data.grabExcessVerticalSpace = true;
- data.grabExcessHorizontalSpace = true;
- data.horizontalAlignment = GridData.FILL;
- data.verticalAlignment = GridData.FILL;
- mTable.setLayoutData(data);
- }
-
- /**
- * Refresh the display of Android Virtual Devices.
- * Tries to keep the selection.
- * <p/>
- * This must be called from the UI thread.
- *
- * @param reload if true, the AVD manager will reload the AVD from the disk.
- * @return false if the reloading failed. This is always true if <var>reload</var> is
- * <code>false</code>.
- */
- public boolean refresh(boolean reload) {
- if (!mInternalRefresh) {
- try {
- // 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;
- }
- }
- return false;
- }
-
- /**
- * Sets a new AVD manager
- * This does not refresh the display. Call {@link #refresh(boolean)} to do so.
- * @param manager the AVD manager.
- */
- public void setManager(AvdManager manager) {
- mAvdManager = manager;
- }
-
- /**
- * Sets a new AVD filter.
- * This does not refresh the display. Call {@link #refresh(boolean)} to do so.
- * @param filter An IAvdFilter. If non-null, this will filter out the AVD to not display.
- */
- public void setFilter(IAvdFilter filter) {
- mTargetFilter = filter;
- }
-
- /**
- * Sets a new Android Target-based AVD filter.
- * This does not refresh the display. Call {@link #refresh(boolean)} to do so.
- * @param target An IAndroidTarget. If non-null, only AVD whose target are compatible with the
- * filter target will displayed an available for selection.
- */
- public void setFilter(IAndroidTarget target) {
- if (target != null) {
- mTargetFilter = new TargetBasedFilter(target);
- } else {
- mTargetFilter = null;
- }
- }
-
- /**
- * Sets a selection listener. Set it to null to remove it.
- * The listener will be called <em>after</em> this table processed its selection
- * events so that the caller can see the updated state.
- * <p/>
- * The event's item contains a {@link TableItem}.
- * The {@link TableItem#getData()} contains an {@link IAndroidTarget}.
- * <p/>
- * It is recommended that the caller uses the {@link #getSelected()} method instead.
- * <p/>
- * The default behavior for double click (when not in {@link DisplayMode#SIMPLE_CHECK}) is to
- * display the details of the selected AVD.<br>
- * To disable it (when you provide your own double click action), set
- * {@link SelectionEvent#doit} to false in
- * {@link SelectionListener#widgetDefaultSelected(SelectionEvent)}
- *
- * @param selectionListener The new listener or null to remove it.
- */
- public void setSelectionListener(SelectionListener selectionListener) {
- mSelectionListener = selectionListener;
- }
-
- /**
- * Sets the current target selection.
- * <p/>
- * If the selection is actually changed, this will invoke the selection listener
- * (if any) with a null event.
- *
- * @param target the target to be selected. Use null to deselect everything.
- * @return true if the target could be selected, false otherwise.
- */
- public boolean setSelection(AvdInfo target) {
- boolean found = false;
- boolean modified = false;
-
- int selIndex = mTable.getSelectionIndex();
- int index = 0;
- for (TableItem i : mTable.getItems()) {
- if (mDisplayMode == DisplayMode.SIMPLE_CHECK) {
- if ((AvdInfo) i.getData() == target) {
- found = true;
- if (!i.getChecked()) {
- modified = true;
- i.setChecked(true);
- }
- } else if (i.getChecked()) {
- modified = true;
- i.setChecked(false);
- }
- } else {
- if ((AvdInfo) i.getData() == target) {
- found = true;
- if (index != selIndex) {
- mTable.setSelection(index);
- modified = true;
- }
- break;
- }
-
- index++;
- }
- }
-
- if (modified && mSelectionListener != null) {
- mSelectionListener.widgetSelected(null);
- }
-
- enableActionButtons();
-
- return found;
- }
-
- /**
- * Returns the currently selected item. In {@link DisplayMode#SIMPLE_CHECK} mode this will
- * return the {@link AvdInfo} that is checked instead of the list selection.
- *
- * @return The currently selected item or null.
- */
- public AvdInfo getSelected() {
- if (mDisplayMode == DisplayMode.SIMPLE_CHECK) {
- for (TableItem i : mTable.getItems()) {
- if (i.getChecked()) {
- return (AvdInfo) i.getData();
- }
- }
- } else {
- int selIndex = mTable.getSelectionIndex();
- if (selIndex >= 0) {
- return (AvdInfo) mTable.getItem(selIndex).getData();
- }
- }
-
- return null;
- }
-
- /**
- * Enables the receiver if the argument is true, and disables it otherwise.
- * A disabled control is typically not selectable from the user interface
- * and draws with an inactive or "grayed" look.
- *
- * @param enabled the new enabled state.
- */
- public void setEnabled(boolean enabled) {
- // We can only enable widgets if the AVD Manager is defined.
- mIsEnabled = enabled && mAvdManager != null;
-
- mTable.setEnabled(mIsEnabled);
- mRefreshButton.setEnabled(mIsEnabled);
-
- if (mNewButton != null) {
- mNewButton.setEnabled(mIsEnabled);
- }
- if (mManagerButton != null) {
- mManagerButton.setEnabled(mIsEnabled);
- }
-
- enableActionButtons();
- }
-
- public boolean isEnabled() {
- return mIsEnabled;
- }
-
- /**
- * Adds a listener to adjust the columns width when the parent is resized.
- * <p/>
- * If we need something more fancy, we might want to use this:
- * http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet77.java?view=co
- */
- private void adjustColumnsWidth(final Table table,
- final TableColumn column0,
- final TableColumn column1,
- final TableColumn column2,
- final TableColumn column3,
- final TableColumn column4) {
- // Add a listener to resize the column to the full width of the table
- table.addControlListener(new ControlAdapter() {
- @Override
- public void controlResized(ControlEvent e) {
- Rectangle r = table.getClientArea();
- column0.setWidth(r.width * 20 / 100); // 20%
- column1.setWidth(r.width * 30 / 100); // 30%
- column2.setWidth(r.width * 15 / 100); // 15%
- column3.setWidth(r.width * 15 / 100); // 15%
- column4.setWidth(r.width * 20 / 100); // 22%
- }
- });
- }
-
- /**
- * Creates a selection listener that will check or uncheck the whole line when
- * double-clicked (aka "the default selection").
- */
- private void setupSelectionListener(final Table table) {
- // Add a selection listener that will check/uncheck items when they are double-clicked
- table.addSelectionListener(new SelectionListener() {
-
- /**
- * Handles single-click selection on the table.
- * {@inheritDoc}
- */
- @Override
- public void widgetSelected(SelectionEvent e) {
- if (e.item instanceof TableItem) {
- TableItem i = (TableItem) e.item;
- enforceSingleSelection(i);
- }
-
- if (mSelectionListener != null) {
- mSelectionListener.widgetSelected(e);
- }
-
- enableActionButtons();
- }
-
- /**
- * Handles double-click selection on the table.
- * Note that the single-click handler will probably already have been called.
- *
- * On double-click, <em>always</em> check the table item.
- *
- * {@inheritDoc}
- */
- @Override
- public void widgetDefaultSelected(SelectionEvent e) {
- if (e.item instanceof TableItem) {
- TableItem i = (TableItem) e.item;
- if (mDisplayMode == DisplayMode.SIMPLE_CHECK) {
- i.setChecked(true);
- }
- enforceSingleSelection(i);
-
- }
-
- // whether or not we display details. default: true when not in SIMPLE_CHECK mode.
- boolean showDetails = mDisplayMode != DisplayMode.SIMPLE_CHECK;
-
- if (mSelectionListener != null) {
- mSelectionListener.widgetDefaultSelected(e);
- showDetails &= e.doit; // enforce false in SIMPLE_CHECK
- }
-
- if (showDetails) {
- onDetails();
- }
-
- enableActionButtons();
- }
-
- /**
- * To ensure single selection, uncheck all other items when this one is selected.
- * This makes the chekboxes act as radio buttons.
- */
- private void enforceSingleSelection(TableItem item) {
- if (mDisplayMode == DisplayMode.SIMPLE_CHECK) {
- if (item.getChecked()) {
- Table parentTable = item.getParent();
- for (TableItem i2 : parentTable.getItems()) {
- if (i2 != item && i2.getChecked()) {
- i2.setChecked(false);
- }
- }
- }
- } else {
- // pass
- }
- }
- });
- }
-
- /**
- * Fills the table with all AVD.
- * The table columns are:
- * <ul>
- * <li>column 0: sdk name
- * <li>column 1: sdk vendor
- * <li>column 2: sdk api name
- * <li>column 3: sdk version
- * </ul>
- */
- private void fillTable(final Table table) {
- table.removeAll();
-
- // get the AVDs
- AvdInfo avds[] = null;
- if (mAvdManager != null) {
- if (mDisplayMode == DisplayMode.MANAGER) {
- avds = mAvdManager.getAllAvds();
- } else {
- avds = mAvdManager.getValidAvds();
- }
- }
-
- if (avds != null && avds.length > 0) {
- Arrays.sort(avds, new Comparator<AvdInfo>() {
- @Override
- public int compare(AvdInfo o1, AvdInfo o2) {
- return o1.compareTo(o2);
- }
- });
-
- table.setEnabled(true);
-
- if (mTargetFilter != null) {
- mTargetFilter.prepare();
- }
-
- for (AvdInfo avd : avds) {
- if (mTargetFilter == null || mTargetFilter.accept(avd)) {
- TableItem item = new TableItem(table, SWT.NONE);
- item.setData(avd);
- item.setText(0, avd.getName());
- if (mDisplayMode == DisplayMode.MANAGER) {
- AvdStatus status = avd.getStatus();
- item.setImage(0, status == AvdStatus.OK ? mOkImage :
- isAvdRepairable(status) ? mBrokenImage : mInvalidImage);
- }
- IAndroidTarget target = avd.getTarget();
- if (target != null) {
- item.setText(1, target.getFullName());
- item.setText(2, target.getVersionName());
- item.setText(3, target.getVersion().getApiString());
- item.setText(4, AvdInfo.getPrettyAbiType(avd.getAbiType()));
- } else {
- item.setText(1, "?");
- item.setText(2, "?");
- item.setText(3, "?");
- item.setText(4, "?");
- }
- }
- }
-
- if (mTargetFilter != null) {
- mTargetFilter.cleanup();
- }
- }
-
- if (table.getItemCount() == 0) {
- table.setEnabled(false);
- TableItem item = new TableItem(table, SWT.NONE);
- item.setData(null);
- item.setText(0, "--");
- item.setText(1, "No AVD available");
- item.setText(2, "--");
- item.setText(3, "--");
- }
- }
-
- /**
- * Returns the currently selected AVD in the table.
- * <p/>
- * Unlike {@link #getSelected()} this will always return the item being selected
- * in the list, ignoring the check boxes state in {@link DisplayMode#SIMPLE_CHECK} mode.
- */
- private AvdInfo getTableSelection() {
- int selIndex = mTable.getSelectionIndex();
- if (selIndex >= 0) {
- return (AvdInfo) mTable.getItem(selIndex).getData();
- }
-
- return null;
- }
-
- /**
- * Updates the enable state of the Details, Start, Delete and Update buttons.
- */
- @SuppressWarnings("null")
- private void enableActionButtons() {
- if (mIsEnabled == false) {
- mDetailsButton.setEnabled(false);
- mStartButton.setEnabled(false);
-
- if (mEditButton != null) {
- mEditButton.setEnabled(false);
- }
- if (mDeleteButton != null) {
- mDeleteButton.setEnabled(false);
- }
- if (mRepairButton != null) {
- mRepairButton.setEnabled(false);
- }
- } else {
- AvdInfo selection = getTableSelection();
- boolean hasSelection = selection != null;
-
- mDetailsButton.setEnabled(hasSelection);
- mStartButton.setEnabled(mOsSdkPath != null &&
- hasSelection &&
- selection.getStatus() == AvdStatus.OK);
-
- if (mEditButton != null) {
- mEditButton.setEnabled(hasSelection);
- }
- if (mDeleteButton != null) {
- mDeleteButton.setEnabled(hasSelection);
- }
- if (mRepairButton != null) {
- mRepairButton.setEnabled(hasSelection && isAvdRepairable(selection.getStatus()));
- }
- }
- }
-
- private void onNew() {
- AvdCreationDialog dlg = new AvdCreationDialog(mTable.getShell(),
- mAvdManager,
- mImageFactory,
- mSdkLog,
- null);
-
- if (dlg.open() == Window.OK) {
- refresh(false /*reload*/);
- }
- }
-
- private void onEdit() {
- AvdInfo avdInfo = getTableSelection();
- GridDialog dlg;
- if(!avdInfo.getDeviceName().isEmpty()) {
- dlg = new AvdCreationDialog(mTable.getShell(),
- mAvdManager,
- mImageFactory,
- mSdkLog,
- avdInfo);
- } else {
- dlg = new LegacyAvdEditDialog(mTable.getShell(),
- mAvdManager,
- mImageFactory,
- mSdkLog,
- avdInfo);
- }
-
-
- if (dlg.open() == Window.OK) {
- refresh(false /*reload*/);
- }
- }
-
- private void onDetails() {
- AvdInfo avdInfo = getTableSelection();
-
- AvdDetailsDialog dlg = new AvdDetailsDialog(mTable.getShell(), avdInfo);
- dlg.open();
- }
-
- private void onDelete() {
- final AvdInfo avdInfo = getTableSelection();
-
- // get the current Display
- final Display display = mTable.getDisplay();
-
- // check if the AVD is running
- if (avdInfo.isRunning()) {
- display.asyncExec(new Runnable() {
- @Override
- public void run() {
- Shell shell = display.getActiveShell();
- MessageDialog.openError(shell,
- "Delete Android Virtual Device",
- String.format(
- "The Android Virtual Device '%1$s' is currently running in an emulator and cannot be deleted.",
- avdInfo.getName()));
- }
- });
- return;
- }
-
- // Confirm you want to delete this AVD
- final boolean[] result = new boolean[1];
- display.syncExec(new Runnable() {
- @Override
- public void run() {
- Shell shell = display.getActiveShell();
- result[0] = MessageDialog.openQuestion(shell,
- "Delete Android Virtual Device",
- String.format(
- "Please confirm that you want to delete the Android Virtual Device named '%s'. This operation cannot be reverted.",
- avdInfo.getName()));
- }
- });
-
- if (result[0] == false) {
- return;
- }
-
- // log for this action.
- ILogger log = mSdkLog;
- if (log == null || log instanceof MessageBoxLog) {
- // If the current logger is a message box, we use our own (to make sure
- // to display errors right away and customize the title).
- log = new MessageBoxLog(
- String.format("Result of deleting AVD '%s':", avdInfo.getName()),
- display,
- false /*logErrorsOnly*/);
- }
-
- // delete the AVD
- boolean success = mAvdManager.deleteAvd(avdInfo, log);
-
- // display the result
- if (log instanceof MessageBoxLog) {
- ((MessageBoxLog) log).displayResult(success);
- }
-
- if (success) {
- refresh(false /*reload*/);
- }
- }
-
- /**
- * Repairs the selected AVD.
- * <p/>
- * For now this only supports fixing the wrong value in image.sysdir.*
- */
- private void onRepair() {
- final AvdInfo avdInfo = getTableSelection();
-
- // get the current Display
- final Display display = mTable.getDisplay();
-
- // log for this action.
- ILogger log = mSdkLog;
- if (log == null || log instanceof MessageBoxLog) {
- // If the current logger is a message box, we use our own (to make sure
- // to display errors right away and customize the title).
- log = new MessageBoxLog(
- String.format("Result of updating AVD '%s':", avdInfo.getName()),
- display,
- false /*logErrorsOnly*/);
- }
-
- boolean success = true;
-
- if (avdInfo.getStatus() == AvdStatus.ERROR_IMAGE_DIR) {
- // delete the AVD
- try {
- mAvdManager.updateAvd(avdInfo, log);
- refresh(false /*reload*/);
- } catch (IOException e) {
- log.error(e, null);
- success = false;
- }
- } else if (avdInfo.getStatus() == AvdStatus.ERROR_DEVICE_CHANGED) {
- // Overwrite the properties derived from the device and nothing else
- Map<String, String> properties = new HashMap<String, String>(avdInfo.getProperties());
-
- 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);
-
- if (properties != null && devices != null && name != null && manufacturer != null) {
- for (Device d : devices) {
- if (d.getName().equals(name) && d.getManufacturer().equals(manufacturer)) {
- properties.putAll(DeviceManager.getHardwareProperties(d));
- try {
- mAvdManager.updateAvd(avdInfo, properties, AvdStatus.OK, log);
- } catch (IOException e) {
- log.error(e,null);
- success = false;
- }
- }
- }
- } else {
- log.error(null, "Base device information incomplete or missing.");
- success = false;
- }
-
- // display the result
- if (log instanceof MessageBoxLog) {
- ((MessageBoxLog) log).displayResult(success);
- }
- refresh(false /*reload*/);
- } else if (avdInfo.getStatus() == AvdStatus.ERROR_DEVICE_MISSING) {
- onEdit();
- }
- }
-
- private void onAvdManager() {
-
- // get the current Display
- Display display = mTable.getDisplay();
-
- // log for this action.
- ILogger log = mSdkLog;
- if (log == null || log instanceof MessageBoxLog) {
- // If the current logger is a message box, we use our own (to make sure
- // to display errors right away and customize the title).
- log = new MessageBoxLog("Result of SDK Manager", display, true /*logErrorsOnly*/);
- }
-
- try {
- AvdManagerWindowImpl1 win = new AvdManagerWindowImpl1(
- mTable.getShell(),
- log,
- mOsSdkPath,
- AvdInvocationContext.DIALOG);
-
- win.open();
- } catch (Exception ignore) {}
-
- refresh(true /*reload*/); // UpdaterWindow uses its own AVD manager so this one must reload.
-
- if (log instanceof MessageBoxLog) {
- ((MessageBoxLog) log).displayResult(true);
- }
- }
-
- private void onStart() {
- AvdInfo avdInfo = getTableSelection();
-
- if (avdInfo == null || mOsSdkPath == null) {
- return;
- }
-
- AvdStartDialog dialog = new AvdStartDialog(mTable.getShell(), avdInfo, mOsSdkPath,
- mController, mSdkLog);
- if (dialog.open() == Window.OK) {
- String path = mOsSdkPath + File.separator
- + SdkConstants.OS_SDK_TOOLS_FOLDER
- + SdkConstants.FN_EMULATOR;
-
- final String avdName = avdInfo.getName();
-
- // build the command line based on the available parameters.
- ArrayList<String> list = new ArrayList<String>();
- list.add(path);
- list.add("-avd"); //$NON-NLS-1$
- list.add(avdName);
- if (dialog.hasWipeData()) {
- list.add("-wipe-data"); //$NON-NLS-1$
- }
- if (dialog.hasSnapshot()) {
- if (!dialog.hasSnapshotLaunch()) {
- list.add("-no-snapshot-load");
- }
- if (!dialog.hasSnapshotSave()) {
- list.add("-no-snapshot-save");
- }
- }
- float scale = dialog.getScale();
- if (scale != 0.f) {
- // do the rounding ourselves. This is because %.1f will write .4899 as .4
- scale = Math.round(scale * 100);
- scale /= 100.f;
- list.add("-scale"); //$NON-NLS-1$
- // because the emulator expects English decimal values, don't use String.format
- // but a Formatter.
- Formatter formatter = new Formatter(Locale.US);
- formatter.format("%.2f", scale); //$NON-NLS-1$
- list.add(formatter.toString());
- formatter.close();
- }
-
- // convert the list into an array for the call to exec.
- final String[] command = list.toArray(new String[list.size()]);
-
- // launch the emulator
- final ProgressTask progress = new ProgressTask(mTable.getShell(),
- "Starting Android Emulator");
- progress.start(new ITask() {
- volatile ITaskMonitor mMonitor = null;
-
- @Override
- public void run(final ITaskMonitor monitor) {
- mMonitor = monitor;
- try {
- monitor.setDescription(
- "Starting emulator for AVD '%1$s'",
- avdName);
- monitor.log("Starting emulator for AVD '%1$s'", avdName);
-
- // we'll wait 100ms*100 = 10s. The emulator sometimes seem to
- // start mostly OK just to crash a few seconds later. 10 seconds
- // seems a good wait for that case.
- int n = 100;
- monitor.setProgressMax(n);
-
- Process process = Runtime.getRuntime().exec(command);
- GrabProcessOutput.grabProcessOutput(
- process,
- Wait.ASYNC,
- new IProcessOutput() {
- @Override
- public void out(@Nullable String line) {
- filterStdOut(line);
- }
-
- @Override
- public void err(@Nullable String line) {
- filterStdErr(line);
- }
- });
-
- // This small wait prevents the dialog from closing too fast:
- // When it works, the emulator returns immediately, even if
- // no UI is shown yet. And when it fails (because the AVD is
- // locked/running) this allows us to have time to capture the
- // error and display it.
- for (int i = 0; i < n; i++) {
- try {
- Thread.sleep(100);
- monitor.incProgress(1);
- } catch (InterruptedException e) {
- // ignore
- }
- }
- } catch (Exception e) {
- monitor.logError("Failed to start emulator: %1$s",
- e.getMessage());
- } finally {
- mMonitor = null;
- }
- }
-
- private void filterStdOut(String line) {
- ITaskMonitor m = mMonitor;
- if (line == null || m == null) {
- return;
- }
-
- // Skip some non-useful messages.
- if (line.indexOf("NSQuickDrawView") != -1) { //$NON-NLS-1$
- // Discard the MacOS warning:
- // "This application, or a library it uses, is using NSQuickDrawView,
- // which has been deprecated. Apps should cease use of QuickDraw and move
- // to Quartz."
- return;
- }
-
- if (line.toLowerCase().indexOf("error") != -1 || //$NON-NLS-1$
- line.indexOf("qemu: fatal") != -1) { //$NON-NLS-1$
- // Sometimes the emulator seems to output errors on stdout. Catch these.
- m.logError("%1$s", line); //$NON-NLS-1$
- return;
- }
-
- m.log("%1$s", line); //$NON-NLS-1$
- }
-
- private void filterStdErr(String line) {
- ITaskMonitor m = mMonitor;
- if (line == null || m == null) {
- return;
- }
-
- if (line.indexOf("emulator: device") != -1 || //$NON-NLS-1$
- line.indexOf("HAX is working") != -1) { //$NON-NLS-1$
- // These are not errors. Output them as regular stdout messages.
- m.log("%1$s", line); //$NON-NLS-1$
- return;
- }
-
- m.logError("%1$s", line); //$NON-NLS-1$
- }
- });
- }
- }
-
- private boolean isAvdRepairable(AvdStatus avdStatus) {
- return avdStatus == AvdStatus.ERROR_IMAGE_DIR
- || avdStatus == AvdStatus.ERROR_DEVICE_CHANGED
- || avdStatus == AvdStatus.ERROR_DEVICE_MISSING;
- }
-}
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
deleted file mode 100644
index 925b0cd..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdStartDialog.java
+++ /dev/null
@@ -1,630 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.widgets;
-
-import com.android.sdklib.devices.Device;
-import com.android.sdklib.devices.DeviceManager;
-import com.android.sdklib.internal.avd.AvdInfo;
-import com.android.sdklib.internal.avd.AvdManager;
-import com.android.sdkuilib.internal.repository.SettingsController;
-import com.android.sdkuilib.ui.GridDialog;
-import com.android.utils.ILogger;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.VerifyEvent;
-import org.eclipse.swt.events.VerifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-import java.awt.Toolkit;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Dialog dealing with emulator launch options. The following options are supported:
- * <ul>
- * <li>-wipe-data</li>
- * <li>-scale</li>
- * </ul>
- * Values are stored (in the class as static field) to be reused while the app is still running.
- * The Monitor dpi is stored in the settings if available.
- */
-final class AvdStartDialog extends GridDialog {
- // static field to reuse values during the same session.
- private static boolean sWipeData = false;
- private static boolean sSnapshotSave = true;
- private static boolean sSnapshotLaunch = true;
- private static int sMonitorDpi = 72; // used if there's no setting controller.
- private static final Map<String, String> sSkinScaling = new HashMap<String, String>();
-
- private static final Pattern sScreenSizePattern = Pattern.compile("\\d*(\\.\\d?)?");
-
- private final AvdInfo mAvd;
- private final String mSdkLocation;
- private final SettingsController mSettingsController;
- private final DeviceManager mDeviceManager;
-
- private Text mScreenSize;
- private Text mMonitorDpi;
- private Button mScaleButton;
-
- private float mScale = 0.f;
- private boolean mWipeData = false;
- private int mDensity = 160; // medium density
- private int mSize1 = -1;
- private int mSize2 = -1;
- private String mSkinDisplay;
- private boolean mEnableScaling = true;
- private Label mScaleField;
- private boolean mHasSnapshot = true;
- private boolean mSnapshotSave = true;
- private boolean mSnapshotLaunch = true;
- private Button mSnapshotLaunchCheckbox;
-
- AvdStartDialog(Shell parentShell, AvdInfo avd, String sdkLocation,
- SettingsController settingsController, ILogger sdkLog) {
- super(parentShell, 2, false);
- mAvd = avd;
- mSdkLocation = sdkLocation;
- mSettingsController = settingsController;
- mDeviceManager = DeviceManager.createInstance(mSdkLocation, sdkLog);
- if (mAvd == null) {
- throw new IllegalArgumentException("avd cannot be null");
- }
- if (mSdkLocation == null) {
- throw new IllegalArgumentException("sdkLocation cannot be null");
- }
-
- computeSkinData();
- }
-
- public boolean hasWipeData() {
- return mWipeData;
- }
-
- /**
- * Returns the scaling factor, or 0.f if none are set.
- */
- public float getScale() {
- return mScale;
- }
-
- @Override
- public void createDialogContent(final Composite parent) {
- GridData gd;
-
- Label l = new Label(parent, SWT.NONE);
- l.setText("Skin:");
-
- l = new Label(parent, SWT.NONE);
- l.setText(mSkinDisplay == null ? "None" : mSkinDisplay);
- l.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
- l = new Label(parent, SWT.NONE);
- l.setText("Density:");
-
- l = new Label(parent, SWT.NONE);
- l.setText(getDensityText());
- l.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
- mScaleButton = new Button(parent, SWT.CHECK);
- mScaleButton.setText("Scale display to real size");
- mScaleButton.setEnabled(mEnableScaling);
- boolean defaultState = mEnableScaling && sSkinScaling.get(mAvd.getName()) != null;
- mScaleButton.setSelection(defaultState);
- mScaleButton.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
- gd.horizontalSpan = 2;
- final Group scaleGroup = new Group(parent, SWT.NONE);
- scaleGroup.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
- gd.horizontalIndent = 30;
- gd.horizontalSpan = 2;
- scaleGroup.setLayout(new GridLayout(3, false));
-
- l = new Label(scaleGroup, SWT.NONE);
- l.setText("Screen Size (in):");
- mScreenSize = new Text(scaleGroup, SWT.BORDER);
- mScreenSize.setText(getScreenSize());
- mScreenSize.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mScreenSize.addVerifyListener(new VerifyListener() {
- @Override
- public void verifyText(VerifyEvent event) {
- // combine the current content and the new text
- String text = mScreenSize.getText();
- text = text.substring(0, event.start) + event.text + text.substring(event.end);
-
- // now make sure it's a match for the regex
- event.doit = sScreenSizePattern.matcher(text).matches();
- }
- });
- mScreenSize.addModifyListener(new ModifyListener() {
- @Override
- public void modifyText(ModifyEvent event) {
- onScaleChange();
- }
- });
-
- // empty composite, only 2 widgets on this line.
- new Composite(scaleGroup, SWT.NONE).setLayoutData(gd = new GridData());
- gd.widthHint = gd.heightHint = 0;
-
- l = new Label(scaleGroup, SWT.NONE);
- l.setText("Monitor dpi:");
- mMonitorDpi = new Text(scaleGroup, SWT.BORDER);
- mMonitorDpi.setText(Integer.toString(getMonitorDpi()));
- mMonitorDpi.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
- gd.widthHint = 50;
- mMonitorDpi.addVerifyListener(new VerifyListener() {
- @Override
- public void verifyText(VerifyEvent event) {
- // check for digit only.
- for (int i = 0 ; i < event.text.length(); i++) {
- char letter = event.text.charAt(i);
- if (letter < '0' || letter > '9') {
- event.doit = false;
- return;
- }
- }
- }
- });
- mMonitorDpi.addModifyListener(new ModifyListener() {
- @Override
- public void modifyText(ModifyEvent event) {
- onScaleChange();
- }
- });
-
- Button button = new Button(scaleGroup, SWT.PUSH | SWT.FLAT);
- button.setText("?");
- button.setToolTipText("Click to figure out your monitor's pixel density");
- button.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- ResolutionChooserDialog dialog = new ResolutionChooserDialog(parent.getShell());
- if (dialog.open() == Window.OK) {
- mMonitorDpi.setText(Integer.toString(dialog.getDensity()));
- }
- }
- });
-
- l = new Label(scaleGroup, SWT.NONE);
- l.setText("Scale:");
- mScaleField = new Label(scaleGroup, SWT.NONE);
- mScaleField.setLayoutData(new GridData(GridData.FILL, GridData.CENTER,
- true /*grabExcessHorizontalSpace*/,
- true /*grabExcessVerticalSpace*/,
- 2 /*horizontalSpan*/,
- 1 /*verticalSpan*/));
- setScale(mScale); // set initial text value
-
- enableGroup(scaleGroup, defaultState);
-
- mScaleButton.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent event) {
- boolean enabled = mScaleButton.getSelection();
- enableGroup(scaleGroup, enabled);
- if (enabled) {
- onScaleChange();
- } else {
- setScale(0);
- }
- }
- });
-
- final Button wipeButton = new Button(parent, SWT.CHECK);
- wipeButton.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
- gd.horizontalSpan = 2;
- wipeButton.setText("Wipe user data");
- wipeButton.setSelection(mWipeData = sWipeData);
- wipeButton.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- mWipeData = wipeButton.getSelection();
- updateSnapshotLaunchAvailability();
- }
- });
-
- Map<String, String> prop = mAvd.getProperties();
- String snapshotPresent = prop.get(AvdManager.AVD_INI_SNAPSHOT_PRESENT);
- mHasSnapshot = (snapshotPresent != null) && snapshotPresent.equals("true");
-
- mSnapshotLaunchCheckbox = new Button(parent, SWT.CHECK);
- mSnapshotLaunchCheckbox.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
- gd.horizontalSpan = 2;
- mSnapshotLaunchCheckbox.setText("Launch from snapshot");
- updateSnapshotLaunchAvailability();
- mSnapshotLaunchCheckbox.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- mSnapshotLaunch = mSnapshotLaunchCheckbox.getSelection();
- }
- });
-
- final Button snapshotSaveCheckbox = new Button(parent, SWT.CHECK);
- snapshotSaveCheckbox.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
- gd.horizontalSpan = 2;
- snapshotSaveCheckbox.setText("Save to snapshot");
- snapshotSaveCheckbox.setSelection((mSnapshotSave = sSnapshotSave) && mHasSnapshot);
- snapshotSaveCheckbox.setEnabled(mHasSnapshot);
- snapshotSaveCheckbox.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- mSnapshotSave = snapshotSaveCheckbox.getSelection();
- }
- });
-
- l = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL);
- l.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
- gd.horizontalSpan = 2;
-
- // if the scaling is enabled by default, we must initialize the value of mScale
- if (defaultState) {
- onScaleChange();
- }
- }
-
- /** On Windows we need to manually enable/disable the children of a group */
- private void enableGroup(final Group group, boolean enabled) {
- group.setEnabled(enabled);
- for (Control c : group.getChildren()) {
- c.setEnabled(enabled);
- }
- }
-
- @Override
- protected void configureShell(Shell newShell) {
- super.configureShell(newShell);
- newShell.setText("Launch Options");
- }
-
- @Override
- protected Button createButton(Composite parent, int id, String label, boolean defaultButton) {
- if (id == IDialogConstants.OK_ID) {
- label = "Launch";
- }
-
- return super.createButton(parent, id, label, defaultButton);
- }
-
- @Override
- protected void okPressed() {
- // override ok to store some info
- // first the monitor dpi
- String dpi = mMonitorDpi.getText();
- if (dpi.length() > 0) {
- sMonitorDpi = Integer.parseInt(dpi);
-
- // if there is a setting controller, save it
- if (mSettingsController != null) {
- mSettingsController.setMonitorDensity(sMonitorDpi);
- mSettingsController.saveSettings();
- }
- }
-
- // now the scale factor
- String key = mAvd.getName();
- sSkinScaling.remove(key);
- if (mScaleButton.getSelection()) {
- String size = mScreenSize.getText();
- if (size.length() > 0) {
- sSkinScaling.put(key, size);
- }
- }
-
- // and then the wipe-data checkbox
- sWipeData = mWipeData;
-
- // and the snapshot handling if those checkboxes are enabled.
- if (mHasSnapshot) {
- sSnapshotSave = mSnapshotSave;
- if (!mWipeData) {
- sSnapshotLaunch = mSnapshotLaunch;
- }
- }
-
- // finally continue with the ok action
- super.okPressed();
- }
-
- private void computeSkinData() {
- Map<String, String> prop = mAvd.getProperties();
- String dpi = prop.get("hw.lcd.density");
- if (dpi != null && dpi.length() > 0) {
- mDensity = Integer.parseInt(dpi);
- }
-
- findSkinResolution();
- }
-
- private void onScaleChange() {
- String sizeStr = mScreenSize.getText();
- if (sizeStr.length() == 0) {
- setScale(0);
- return;
- }
-
- String dpiStr = mMonitorDpi.getText();
- if (dpiStr.length() == 0) {
- setScale(0);
- return;
- }
-
- int dpi = Integer.parseInt(dpiStr);
- float size = Float.parseFloat(sizeStr);
- /*
- * We are trying to emulate the following device:
- * resolution: 'mSize1'x'mSize2'
- * density: 'mDensity'
- * screen diagonal: 'size'
- * ontop a monitor running at 'dpi'
- */
- // We start by computing the screen diagonal in pixels, if the density was really mDensity
- float diagonalPx = (float)Math.sqrt(mSize1*mSize1+mSize2*mSize2);
- // Now we would convert this in actual inches:
- // diagonalIn = diagonal / mDensity
- // the scale factor is a mix of adapting to the new density and to the new size.
- // (size/diagonalIn) * (dpi/mDensity)
- // this can be simplified to:
- setScale((size * dpi) / diagonalPx);
- }
-
- private void setScale(float scale) {
- mScale = scale;
-
- // Do the rounding exactly like AvdSelector will do.
- scale = Math.round(scale * 100);
- scale /= 100.f;
-
- if (scale == 0.f) {
- mScaleField.setText("default"); //$NON-NLS-1$
- } else {
- mScaleField.setText(String.format("%.2f", scale)); //$NON-NLS-1$
- }
- }
-
- /**
- * Returns the monitor dpi to start with.
- * This can be coming from the settings, the session-based storage, or the from whatever Java
- * can tell us.
- */
- private int getMonitorDpi() {
- if (mSettingsController != null) {
- sMonitorDpi = mSettingsController.getSettings().getMonitorDensity();
- }
-
- if (sMonitorDpi == -1) { // first time? try to get a value
- sMonitorDpi = Toolkit.getDefaultToolkit().getScreenResolution();
- }
-
- return sMonitorDpi;
- }
-
- /**
- * Returns the screen size to start with.
- * <p/>If an emulator with the same skin was already launched, scaled, the size used is reused.
- * <p/>If one hasn't been launched and the AVD is based on a device, use the device's screen
- * size. Otherwise, use the default (3).
- */
- private String getScreenSize() {
- String size = sSkinScaling.get(mAvd.getName());
- if (size != null) {
- return size;
- }
-
- Map<String, String> properties = mAvd.getProperties();
- if (properties != null) {
- 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(name, mfctr);
- if (d != null) {
- double screenSize =
- d.getDefaultHardware().getScreen().getDiagonalLength();
- return String.format("%.1f", screenSize);
- }
- }
- }
-
- return "3";
- }
-
- /**
- * Returns a display string for the density.
- */
- private String getDensityText() {
- switch (mDensity) {
- case 120:
- return "Low (120)";
- case 160:
- return "Medium (160)";
- case 240:
- return "High (240)";
- }
-
- return Integer.toString(mDensity);
- }
-
- /**
- * Finds the skin resolution and sets it in {@link #mSize1} and {@link #mSize2}.
- */
- private void findSkinResolution() {
- Map<String, String> prop = mAvd.getProperties();
- String skinName = prop.get(AvdManager.AVD_INI_SKIN_NAME);
-
- if (skinName != null) {
- Matcher m = AvdManager.NUMERIC_SKIN_SIZE.matcher(skinName);
- if (m != null && m.matches()) {
- mSize1 = Integer.parseInt(m.group(1));
- mSize2 = Integer.parseInt(m.group(2));
- mSkinDisplay = skinName;
- mEnableScaling = true;
- return;
- }
- }
-
- // The resolution is inside the layout file of the skin.
- mEnableScaling = false; // default to false for now.
-
- // path to the skin layout file.
- String skinPath = prop.get(AvdManager.AVD_INI_SKIN_PATH);
- if (skinPath != null) {
- File skinFolder = new File(mSdkLocation, skinPath);
- if (skinFolder.isDirectory()) {
- File layoutFile = new File(skinFolder, "layout");
- if (layoutFile.isFile()) {
- if (parseLayoutFile(layoutFile)) {
- mSkinDisplay = String.format("%1$s (%2$dx%3$d)", skinName, mSize1, mSize2);
- mEnableScaling = true;
- } else {
- mSkinDisplay = skinName;
- }
- }
- }
- }
- }
-
- /**
- * Parses a layout file.
- * <p/>
- * the format is relatively easy. It's a collection of items defined as
- * ≶name> {
- * ≶content>
- * }
- *
- * content is either 1+ items or 1+ properties
- * properties are defined as
- * ≶name>≶whitespace>≶value>
- *
- * We're going to look for an item called display, with 2 properties height and width.
- * This is very basic parser.
- *
- * @param layoutFile the file to parse
- * @return true if both sizes where found.
- */
- private boolean parseLayoutFile(File layoutFile) {
- BufferedReader input = null;
- try {
- input = new BufferedReader(new FileReader(layoutFile));
- String line;
-
- while ((line = input.readLine()) != null) {
- // trim to remove whitespace
- line = line.trim();
- int len = line.length();
- if (len == 0) continue;
-
- // check if this is a new item
- if (line.charAt(len-1) == '{') {
- // this is the start of a node
- String[] tokens = line.split(" ");
- if ("display".equals(tokens[0])) {
- // this is the one we're looking for!
- while ((mSize1 == -1 || mSize2 == -1) &&
- (line = input.readLine()) != null) {
- // trim to remove whitespace
- line = line.trim();
- len = line.length();
- if (len == 0) continue;
-
- if ("}".equals(line)) { // looks like we're done with the item.
- break;
- }
-
- tokens = line.split(" ");
- if (tokens.length >= 2) {
- // there can be multiple space between the name and value
- // in which case we'll get an extra empty token in the middle.
- if ("width".equals(tokens[0])) {
- mSize1 = Integer.parseInt(tokens[tokens.length-1]);
- } else if ("height".equals(tokens[0])) {
- mSize2 = Integer.parseInt(tokens[tokens.length-1]);
- }
- }
- }
-
- return mSize1 != -1 && mSize2 != -1;
- }
- }
-
- }
- // if it reaches here, display was not found.
- // false is returned below.
- } catch (IOException e) {
- // ignore.
- } finally {
- if (input != null) {
- try {
- input.close();
- } catch (IOException e) {
- // ignore
- }
- }
- }
-
- return false;
- }
-
- /**
- * @return Whether there's a snapshot file available.
- */
- public boolean hasSnapshot() {
- return mHasSnapshot;
- }
-
- /**
- * @return Whether to launch and load snapshot.
- */
- public boolean hasSnapshotLaunch() {
- return mSnapshotLaunch && !hasWipeData();
- }
-
- /**
- * @return Whether to preserve emulator state to snapshot.
- */
- public boolean hasSnapshotSave() {
- return mSnapshotSave;
- }
-
- /**
- * Updates snapshot launch availability, for when mWipeData value changes.
- */
- private void updateSnapshotLaunchAvailability() {
- boolean enabled = !mWipeData && mHasSnapshot;
- mSnapshotLaunchCheckbox.setEnabled(enabled);
- mSnapshotLaunch = enabled && sSnapshotLaunch;
- mSnapshotLaunchCheckbox.setSelection(mSnapshotLaunch);
- }
-}
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
deleted file mode 100644
index 68c4fd5..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/DeviceCreationDialog.java
+++ /dev/null
@@ -1,1074 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.widgets;
-
-import com.android.annotations.Nullable;
-import com.android.resources.Density;
-import com.android.resources.Keyboard;
-import com.android.resources.KeyboardState;
-import com.android.resources.Navigation;
-import com.android.resources.NavigationState;
-import com.android.resources.ResourceEnum;
-import com.android.resources.ScreenOrientation;
-import com.android.resources.ScreenRatio;
-import com.android.resources.ScreenSize;
-import com.android.resources.TouchScreen;
-import com.android.sdklib.devices.Abi;
-import com.android.sdklib.devices.ButtonType;
-import com.android.sdklib.devices.Camera;
-import com.android.sdklib.devices.CameraLocation;
-import com.android.sdklib.devices.Device;
-import com.android.sdklib.devices.DeviceManager;
-import com.android.sdklib.devices.Hardware;
-import com.android.sdklib.devices.Multitouch;
-import com.android.sdklib.devices.Network;
-import com.android.sdklib.devices.PowerType;
-import com.android.sdklib.devices.Screen;
-import com.android.sdklib.devices.ScreenType;
-import com.android.sdklib.devices.Sensor;
-import com.android.sdklib.devices.Software;
-import com.android.sdklib.devices.State;
-import com.android.sdklib.devices.Storage;
-import com.android.sdkuilib.internal.repository.icons.ImageFactory;
-import com.android.sdkuilib.ui.GridDataBuilder;
-import com.android.sdkuilib.ui.GridDialog;
-import com.android.sdkuilib.ui.GridLayoutBuilder;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-import java.util.List;
-
-public class DeviceCreationDialog extends GridDialog {
-
- private static final String MANUFACTURER = "User";
-
- private final ImageFactory mImageFactory;
- private final DeviceManager mManager;
- private List<Device> mUserDevices;
-
- private Device mDevice;
-
- private Text mDeviceName;
- private Text mDiagonalLength;
- private Text mXDimension;
- private Text mYDimension;
- private Button mKeyboard;
- private Button mDpad;
- private Button mTrackball;
- private Button mNoNav;
- private Text mRam;
- private Combo mRamCombo;
- private Combo mButtons;
- private Combo mSize;
- private Combo mDensity;
- private Combo mRatio;
- private Button mAccelerometer; // hw.accelerometer
- private Button mGyro; // hw.sensors.orientation
- private Button mGps; // hw.sensors.gps
- private Button mProximitySensor; // hw.sensors.proximity
- private Button mCameraFront;
- private Button mCameraRear;
- private Group mStateGroup;
- private Button mPortrait;
- private Label mPortraitLabel;
- private Button mPortraitNav;
- private Button mLandscape;
- private Label mLandscapeLabel;
- private Button mLandscapeNav;
- private Button mPortraitKeys;
- private Label mPortraitKeysLabel;
- private Button mPortraitKeysNav;
- private Button mLandscapeKeys;
- private Label mLandscapeKeysLabel;
- private Button mLandscapeKeysNav;
-
- private Button mForceCreation;
- private Label mStatusIcon;
- private Label mStatusLabel;
-
- private Button mOkButton;
-
- /** The hardware instance attached to each of the states of the created device. */
- private Hardware mHardware;
- /** The instance of the Device created by the dialog, if the user pressed {@code mOkButton}. */
- private Device mCreatedDevice;
-
- /**
- * This contains the Software for the device. Since it has no effect on the
- * emulator whatsoever, we just use a single instance with reasonable
- * defaults. */
- private static final Software mSoftware;
-
- static {
- mSoftware = new Software();
- mSoftware.setLiveWallpaperSupport(true);
- mSoftware.setGlVersion("2.0");
- }
-
- public DeviceCreationDialog(Shell parentShell,
- DeviceManager manager,
- ImageFactory imageFactory,
- @Nullable Device device) {
- super(parentShell, 3, false);
- mImageFactory = imageFactory;
- mDevice = device;
- mManager = manager;
- mUserDevices = mManager.getDevices(DeviceManager.USER_DEVICES);
- }
-
- /**
- * Returns the instance of the Device created by the dialog,
- * if the user pressed the OK|create|edit|clone button.
- * Typically only non-null if the dialog returns OK.
- */
- public Device getCreatedDevice() {
- return mCreatedDevice;
- }
-
- @Override
- protected Control createContents(Composite parent) {
- Control control = super.createContents(parent);
-
- mOkButton = getButton(IDialogConstants.OK_ID);
-
- if (mDevice == null) {
- getShell().setText("Create New Device");
- } else {
- if (mUserDevices.contains(mDevice)) {
- getShell().setText("Edit Device");
- } else {
- getShell().setText("Clone Device");
- }
- }
-
- Object ld = mOkButton.getLayoutData();
- if (ld instanceof GridData) {
- ((GridData) ld).widthHint = 100;
- }
-
- validatePage();
-
- return control;
- }
-
- @Override
- public void createDialogContent(Composite parent) {
-
- ValidationListener validator = new ValidationListener();
- SizeListener sizeListener = new SizeListener();
- NavStateListener navListener = new NavStateListener();
-
- Composite column1 = new Composite(parent, SWT.NONE);
- GridDataBuilder.create(column1).hFill().vTop();
- GridLayoutBuilder.create(column1).columns(2);
-
- // vertical separator between column 1 and 2
- Label label = new Label(parent, SWT.SEPARATOR | SWT.VERTICAL);
- GridDataBuilder.create(label).vFill().vGrab();
-
- Composite column2 = new Composite(parent, SWT.NONE);
- GridDataBuilder.create(column2).hFill().vTop();
- GridLayoutBuilder.create(column2).columns(2);
-
- // Column 1
-
- String tooltip = "Name of the new device";
- generateLabel("Name:", tooltip, column1);
- mDeviceName = generateText(column1, tooltip, new CreateNameModifyListener());
-
- tooltip = "Diagonal length of the screen in inches";
- generateLabel("Screen Size (in):", tooltip, column1);
- mDiagonalLength = generateText(column1, tooltip, sizeListener);
-
- tooltip = "The resolution of the device in pixels";
- generateLabel("Resolution (px):", tooltip, column1);
- Composite dimensionGroup = new Composite(column1, SWT.NONE); // Like a Group with no border
- GridDataBuilder.create(dimensionGroup).hFill();
- GridLayoutBuilder.create(dimensionGroup).columns(3).noMargins();
- mXDimension = generateText(dimensionGroup, tooltip, sizeListener);
- new Label(dimensionGroup, SWT.NONE).setText("x");
- mYDimension = generateText(dimensionGroup, tooltip, sizeListener);
-
- label = new Label(column1, SWT.None); // empty space holder
- GridDataBuilder.create(label).hFill().hGrab().hSpan(2);
-
- // Column 2
-
- tooltip = "The screen size bucket that the device falls into";
- generateLabel("Size:", tooltip, column2);
- mSize = generateCombo(column2, tooltip, ScreenSize.values(), 1, validator);
-
- tooltip = "The aspect ratio bucket the screen falls into. A \"long\" screen is wider.";
- generateLabel("Screen Ratio:", tooltip, column2);
- mRatio = generateCombo(column2, tooltip, ScreenRatio.values(), 1, validator);
-
- tooltip = "The pixel density bucket the device falls in";
- generateLabel("Density:", tooltip, column2);
- mDensity = generateCombo(column2, tooltip, Density.values(), 3, validator);
-
- label = new Label(column2, SWT.None); // empty space holder
- GridDataBuilder.create(label).hFill().hGrab().hSpan(2);
-
-
- // Column 1, second row
-
- generateLabel("Sensors:", "The sensors available on the device", column1);
- Group sensorGroup = new Group(column1, SWT.NONE);
- sensorGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- sensorGroup.setLayout(new GridLayout(2, false));
- mAccelerometer = generateButton(sensorGroup, "Accelerometer",
- "Presence of an accelerometer", SWT.CHECK, true, validator);
- mGyro = generateButton(sensorGroup, "Gyroscope",
- "Presence of a gyroscope", SWT.CHECK, true, validator);
- mGps = generateButton(sensorGroup, "GPS", "Presence of a GPS", SWT.CHECK, true, validator);
- mProximitySensor = generateButton(sensorGroup, "Proximity Sensor",
- "Presence of a proximity sensor", SWT.CHECK, true, validator);
-
- generateLabel("Cameras", "The cameras available on the device", column1);
- Group cameraGroup = new Group(column1, SWT.NONE);
- cameraGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- cameraGroup.setLayout(new GridLayout(2, false));
- mCameraFront = generateButton(cameraGroup, "Front", "Presence of a front camera",
- SWT.CHECK, false, validator);
- mCameraRear = generateButton(cameraGroup, "Rear", "Presence of a rear camera",
- SWT.CHECK, true, validator);
-
- generateLabel("Input:", "The input hardware on the given device", column1);
- Group inputGroup = new Group(column1, SWT.NONE);
- inputGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- inputGroup.setLayout(new GridLayout(3, false));
- mKeyboard = generateButton(inputGroup, "Keyboard", "Presence of a hardware keyboard",
- SWT.CHECK, false,
- new KeyboardListener());
- GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
- gridData.horizontalSpan = 3;
- mKeyboard.setLayoutData(gridData);
- mNoNav = generateButton(inputGroup, "No Nav", "No hardware navigation",
- SWT.RADIO, true, navListener);
- mDpad = generateButton(inputGroup, "DPad", "The device has a DPad navigation element",
- SWT.RADIO, false, navListener);
- mTrackball = generateButton(inputGroup, "Trackball",
- "The device has a trackball navigation element", SWT.RADIO, false, navListener);
-
- tooltip = "The amount of RAM on the device";
- generateLabel("RAM:", tooltip, column1);
- Group ramGroup = new Group(column1, SWT.NONE);
- ramGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- ramGroup.setLayout(new GridLayout(2, false));
- mRam = generateText(ramGroup, tooltip, validator);
- mRamCombo = new Combo(ramGroup, SWT.DROP_DOWN | SWT.READ_ONLY);
- mRamCombo.setToolTipText(tooltip);
- mRamCombo.add("MiB");
- mRamCombo.add("GiB");
- mRamCombo.select(0);
- mRamCombo.addModifyListener(validator);
-
- // Column 2, second row
-
- tooltip = "Type of buttons (Home, Menu, etc.) on the device. "
- + "This can be software buttons like on the Galaxy Nexus, or hardware buttons like "
- + "the capacitive buttons on the Nexus S.";
- generateLabel("Buttons:", tooltip, column2);
- mButtons = new Combo(column2, SWT.DROP_DOWN | SWT.READ_ONLY);
- mButtons.setToolTipText(tooltip);
- mButtons.add(ButtonType.SOFT.getDescription());
- mButtons.add(ButtonType.HARD.getDescription());
- mButtons.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mButtons.select(0);
- mButtons.addModifyListener(validator);
-
- generateLabel("Device States:", "The available states for the given device", column2);
-
- mStateGroup = new Group(column2, SWT.NONE);
- mStateGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mStateGroup.setLayout(new GridLayout(2, true));
-
- tooltip = "The device has a portait position with no keyboard available";
- mPortraitLabel = generateLabel("Portrait:", tooltip, mStateGroup);
- gridData = new GridData(GridData.FILL_HORIZONTAL);
- gridData.horizontalSpan = 2;
- mPortraitLabel.setLayoutData(gridData);
- mPortrait = generateButton(mStateGroup, "Enabled", tooltip, SWT.CHECK, true,
- navListener);
- mPortraitNav = generateButton(mStateGroup, "Navigation",
- "Hardware navigation is available in this state", SWT.CHECK, true, validator);
- mPortraitNav.setEnabled(false);
-
- tooltip = "The device has a landscape position with no keyboard available";
- mLandscapeLabel = generateLabel("Landscape:", tooltip, mStateGroup);
- gridData = new GridData(GridData.FILL_HORIZONTAL);
- gridData.horizontalSpan = 2;
- mLandscapeLabel.setLayoutData(gridData);
- mLandscape = generateButton(mStateGroup, "Enabled", tooltip, SWT.CHECK, true,
- navListener);
- mLandscapeNav = generateButton(mStateGroup, "Navigation",
- "Hardware navigation is available in this state", SWT.CHECK, true, validator);
- mLandscapeNav.setEnabled(false);
-
- tooltip = "The device has a portait position with a keyboard available";
- mPortraitKeysLabel = generateLabel("Portrait with keyboard:", tooltip, mStateGroup);
- gridData = new GridData(GridData.FILL_HORIZONTAL);
- gridData.horizontalSpan = 2;
- mPortraitKeysLabel.setLayoutData(gridData);
- mPortraitKeysLabel.setEnabled(false);
- mPortraitKeys = generateButton(mStateGroup, "Enabled", tooltip, SWT.CHECK, true,
- navListener);
- mPortraitKeys.setEnabled(false);
- mPortraitKeysNav = generateButton(mStateGroup, "Navigation",
- "Hardware navigation is available in this state", SWT.CHECK, true, validator);
- mPortraitKeysNav.setEnabled(false);
-
- tooltip = "The device has a landscape position with the keyboard open";
- mLandscapeKeysLabel = generateLabel("Landscape with keyboard:", tooltip, mStateGroup);
- gridData = new GridData(GridData.FILL_HORIZONTAL);
- gridData.horizontalSpan = 2;
- mLandscapeKeysLabel.setLayoutData(gridData);
- mLandscapeKeysLabel.setEnabled(false);
- mLandscapeKeys = generateButton(mStateGroup, "Enabled", tooltip, SWT.CHECK, true,
- navListener);
- mLandscapeKeys.setEnabled(false);
- mLandscapeKeysNav = generateButton(mStateGroup, "Navigation",
- "Hardware navigation is available in this state", SWT.CHECK, true, validator);
- mLandscapeKeysNav.setEnabled(false);
-
-
- mForceCreation = new Button(column2, SWT.CHECK);
- mForceCreation.setText("Override the existing device with the same name");
- mForceCreation.setToolTipText("There's already an AVD with the same name. Check this to delete it and replace it by the new AVD.");
- mForceCreation.setLayoutData(new GridData(GridData.BEGINNING, GridData.CENTER,
- true, false, 2, 1));
- mForceCreation.setEnabled(false);
- mForceCreation.addSelectionListener(validator);
-
-
- // -- third row
-
- // add a separator to separate from the ok/cancel button
- label = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL);
- label.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 3, 1));
-
- // add stuff for the error display
- Composite statusComposite = new Composite(parent, SWT.NONE);
- GridLayout gl;
- statusComposite.setLayoutData(
- new GridData(GridData.FILL, GridData.CENTER, true, false, 3, 1));
- statusComposite.setLayout(gl = new GridLayout(2, false));
- gl.marginHeight = gl.marginWidth = 0;
-
- mStatusIcon = new Label(statusComposite, SWT.NONE);
- mStatusIcon.setLayoutData(new GridData(GridData.BEGINNING, GridData.BEGINNING,
- false, false));
- mStatusLabel = new Label(statusComposite, SWT.NONE);
- mStatusLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mStatusLabel.setText(""); //$NON-NLS-1$
-
- prefillWithDevice(mDevice);
-
- validatePage();
- }
-
- private Button generateButton(Composite parent, String text, String tooltip, int type,
- boolean selected, SelectionListener listener) {
- Button b = new Button(parent, type);
- b.setText(text);
- b.setToolTipText(tooltip);
- b.setSelection(selected);
- b.addSelectionListener(listener);
- b.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- return b;
- }
-
- /**
- * Generates a combo widget attached to the given parent, then sets the
- * tooltip, adds all of the {@link String}s returned by
- * {@link ResourceEnum#getResourceValue()} for each {@link ResourceEnum},
- * sets the combo to the given index and adds the given
- * {@link ModifyListener}.
- */
- private Combo generateCombo(Composite parent, String tooltip, ResourceEnum[] values,
- int selection,
- ModifyListener validator) {
- Combo c = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
- c.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- c.setToolTipText(tooltip);
- for (ResourceEnum r : values) {
- c.add(r.getResourceValue());
- }
- c.select(selection);
- c.addModifyListener(validator);
- return c;
- }
-
- /** Generates a text widget with the given tooltip, parent and listener */
- private Text generateText(Composite parent, String tooltip, ModifyListener listener) {
- Text t = new Text(parent, SWT.BORDER);
- t.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- t.setToolTipText(tooltip);
- t.addModifyListener(listener);
- return t;
- }
-
- /** Generates a label and attaches it to the given parent */
- private Label generateLabel(String text, String tooltip, Composite parent) {
- Label label = new Label(parent, SWT.NONE);
- label.setText(text);
- label.setToolTipText(tooltip);
- label.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_CENTER));
- return label;
- }
-
- /**
- * Callback when the device name is changed. Enforces that device names
- * don't conflict with already existing devices unless we're editing that
- * device.
- */
- private class CreateNameModifyListener implements ModifyListener {
- @Override
- public void modifyText(ModifyEvent e) {
- String name = mDeviceName.getText();
- boolean nameCollision = false;
- for (Device d : mUserDevices) {
- if (MANUFACTURER.equals(d.getManufacturer()) && name.equals(d.getName())) {
- nameCollision = true;
- break;
- }
- }
- mForceCreation.setEnabled(nameCollision);
- mForceCreation.setSelection(!nameCollision);
-
- validatePage();
- }
- }
-
- /**
- * Callback attached to the diagonal length and resolution text boxes. Sets
- * the screen size and display density based on their values, then validates
- * the page.
- */
- private class SizeListener implements ModifyListener {
- @Override
- public void modifyText(ModifyEvent e) {
-
- if (!mDiagonalLength.getText().isEmpty()) {
- try {
- double diagonal = Double.parseDouble(mDiagonalLength.getText());
- double diagonalDp = 160.0 * diagonal;
-
- // Set the Screen Size
- if (diagonalDp >= 1200) {
- mSize.select(ScreenSize.getIndex(ScreenSize.getEnum("xlarge")));
- } else if (diagonalDp >= 800) {
- mSize.select(ScreenSize.getIndex(ScreenSize.getEnum("large")));
- } else if (diagonalDp >= 568) {
- mSize.select(ScreenSize.getIndex(ScreenSize.getEnum("normal")));
- } else {
- mSize.select(ScreenSize.getIndex(ScreenSize.getEnum("small")));
- }
- if (!mXDimension.getText().isEmpty() && !mYDimension.getText().isEmpty()) {
-
- // Set the density based on which bucket it's closest to
- double x = Double.parseDouble(mXDimension.getText());
- double y = Double.parseDouble(mYDimension.getText());
- double dpi = Math.sqrt(x * x + y * y) / diagonal;
- double difference = Double.MAX_VALUE;
- Density bucket = Density.MEDIUM;
- for (Density d : Density.values()) {
- if (Math.abs(d.getDpiValue() - dpi) < difference) {
- difference = Math.abs(d.getDpiValue() - dpi);
- bucket = d;
- }
- }
- mDensity.select(Density.getIndex(bucket));
- }
- } catch (NumberFormatException ignore) {}
- }
- }
- }
-
-
- /**
- * Callback attached to the keyboard checkbox.Enables / disables device
- * states based on the keyboard presence and then validates the page.
- */
- private class KeyboardListener extends SelectionAdapter {
- @Override
- public void widgetSelected(SelectionEvent event) {
- super.widgetSelected(event);
- if (mKeyboard.getSelection()) {
- mPortraitKeys.setEnabled(true);
- mPortraitKeysLabel.setEnabled(true);
- mLandscapeKeys.setEnabled(true);
- mLandscapeKeysLabel.setEnabled(true);
- } else {
- mPortraitKeys.setEnabled(false);
- mPortraitKeysLabel.setEnabled(false);
- mLandscapeKeys.setEnabled(false);
- mLandscapeKeysLabel.setEnabled(false);
- }
- toggleNav();
- validatePage();
- }
-
- }
-
- /**
- * Listens for changes on widgets that affect nav availability and toggles
- * the nav checkboxes for device states based on them.
- */
- private class NavStateListener extends SelectionAdapter {
- @Override
- public void widgetSelected(SelectionEvent event) {
- super.widgetSelected(event);
- toggleNav();
- validatePage();
- }
- }
-
- /**
- * Method that inspects all of the relevant dialog state and enables or disables the nav
- * elements accordingly.
- */
- private void toggleNav() {
- mPortraitNav.setEnabled(mPortrait.getSelection() && !mNoNav.getSelection());
- mLandscapeNav.setEnabled(mLandscape.getSelection() && !mNoNav.getSelection());
- mPortraitKeysNav.setEnabled(mPortraitKeys.getSelection() && mPortraitKeys.getEnabled()
- && !mNoNav.getSelection());
- mLandscapeKeysNav.setEnabled(mLandscapeKeys.getSelection()
- && mLandscapeKeys.getEnabled() && !mNoNav.getSelection());
- validatePage();
- }
-
- /**
- * Callback that validates the page on modification events or widget
- * selections
- */
- private class ValidationListener extends SelectionAdapter implements ModifyListener {
- @Override
- public void modifyText(ModifyEvent e) {
- validatePage();
- }
-
- @Override
- public void widgetSelected(SelectionEvent e) {
- super.widgetSelected(e);
- validatePage();
- }
- }
-
- /**
- * Validates all of the config options to ensure a valid device can be
- * created from them.
- *
- * @return Whether the config options will result in a valid device.
- */
- private boolean validatePage() {
- boolean valid = true;
- String error = null;
- String warning = null;
- setError(null);
-
- String name = mDeviceName.getText();
-
- /* If we're editing / cloning a device, this will get called when the name gets pre-filled
- * but the ok button won't be populated yet, so we need to skip the initial setting.
- */
- if (mOkButton != null) {
- if (mDevice == null) {
- getShell().setText("Create New Device");
- mOkButton.setText("Create Device");
- } else {
- if (mDevice.getName().equals(name)){
- if (mUserDevices.contains(mDevice)) {
- getShell().setText("Edit Device");
- mOkButton.setText("Edit Device");
- } else {
- warning = "Only user created devices are editable.\nA clone of it will be created under " +
- "the \"User\" category.";
- getShell().setText("Clone Device");
- mOkButton.setText("Clone Device");
- }
- } else {
- warning = "The device \"" + mDevice.getName() +"\" will be duplicated into\n" +
- "\"" + name + "\" under the \"User\" category";
- getShell().setText("Clone Device");
- mOkButton.setText("Clone Device");
- }
- }
- }
-
- if (valid && name.isEmpty()) {
- warning = "Please enter a name for the device.";
- valid = false;
- }
- if (valid && !validateFloat("Diagonal Length", mDiagonalLength.getText())) {
- warning = "Please enter a screen size.";
- valid = false;
- }
- if (valid && !validateInt("Resolution", mXDimension.getText())) {
- warning = "Please enter the screen resolution.";
- valid = false;
- }
- if (valid && !validateInt("Resolution", mYDimension.getText())) {
- warning = "Please enter the screen resolution.";
- valid = false;
- }
- if (valid && mSize.getSelectionIndex() < 0) {
- error = "A size bucket must be selected.";
- valid = false;
- }
- if (valid && mDensity.getSelectionIndex() < 0) {
- error = "A screen density bucket must be selected";
- valid = false;
- }
- if (valid && mRatio.getSelectionIndex() < 0) {
- error = "A screen ratio must be selected.";
- valid = false;
- }
- if (valid && !mNoNav.getSelection() && !mTrackball.getSelection() && !mDpad.getSelection()) {
- error = "A mode of hardware navigation, or no navigation, has to be selected.";
- valid = false;
- }
- if (valid && !validateInt("RAM", mRam.getText())) {
- warning = "Please enter a RAM amount.";
- valid = false;
- }
- if (valid && mRamCombo.getSelectionIndex() < 0) {
- error = "RAM must have a selected unit.";
- valid = false;
- }
- if (valid && mButtons.getSelectionIndex() < 0) {
- error = "A button type must be selected.";
- valid = false;
- }
- if (valid) {
- if (mKeyboard.getSelection()) {
- if (!mPortraitKeys.getSelection()
- && !mPortrait.getSelection()
- && !mLandscapeKeys.getSelection()
- && !mLandscape.getSelection()) {
- error = "At least one device state must be enabled.";
- valid = false;
- }
- } else {
- if (!mPortrait.getSelection() && !mLandscape.getSelection()) {
- error = "At least one device state must be enabled";
- valid = false;
- }
- }
- }
- if (mForceCreation.isEnabled() && !mForceCreation.getSelection()) {
- error = "Name conflicts with an existing device.";
- valid = false;
- }
-
- if (mOkButton != null) {
- mOkButton.setEnabled(valid);
- }
-
- if (error != null) {
- setError(error);
- } else if (warning != null) {
- setWarning(warning);
- }
-
- return valid;
- }
-
- /**
- * Validates the string is a valid, positive float. If not, it sets the
- * error at the bottom of the dialog and returns false. Note this does
- * <b>not</b> unset the error message, it's up to the caller to unset it iff
- * it knows there are no errors on the page.
- */
- private boolean validateFloat(String box, String value) {
- if (value == null || value.isEmpty()) {
- return false;
- }
- boolean ret = true;
- try {
- double val = Double.parseDouble(value);
- if (val <= 0) {
- ret = false;
- }
- } catch (NumberFormatException e) {
- ret = false;
- }
- if (!ret) {
- setError(box + " must be a valid, positive number.");
- }
- return ret;
- }
-
- /**
- * Validates the string is a valid, positive integer. If not, it sets the
- * error at the bottom of the dialog and returns false. Note this does
- * <b>not</b> unset the error message, it's up to the caller to unset it iff
- * it knows there are no errors on the page.
- */
- private boolean validateInt(String box, String value) {
- if (value == null || value.isEmpty()) {
- return false;
- }
- boolean ret = true;
- try {
- int val = Integer.parseInt(value);
- if (val <= 0) {
- ret = false;
- }
- } catch (NumberFormatException e) {
- ret = false;
- }
-
- if (!ret) {
- setError(box + " must be a valid, positive integer.");
- }
-
- return ret;
- }
-
- /**
- * Sets the error to the given string. If null, removes the error message.
- */
- private void setError(@Nullable String error) {
- if (error == null) {
- mStatusIcon.setImage(null);
- mStatusLabel.setText("");
- } else {
- mStatusIcon.setImage(mImageFactory.getImageByName("reject_icon16.png"));
- mStatusLabel.setText(error);
- }
- }
-
- /**
- * Sets the warning message to the given string. If null, removes the
- * warning message.
- */
- private void setWarning(@Nullable String warning) {
- if (warning == null) {
- mStatusIcon.setImage(null);
- mStatusLabel.setText("");
- } else {
- mStatusIcon.setImage(mImageFactory.getImageByName("warning_icon16.png"));
- mStatusLabel.setText(warning);
- }
- }
-
- /** Sets the hardware for the new device */
- private void prefillWithDevice(@Nullable Device device) {
- if (device == null) {
-
- // Setup the default hardware instance with reasonable values for
- // the things which are configurable via this dialog.
- mHardware = new Hardware();
-
- Screen s = new Screen();
- s.setXdpi(316);
- s.setYdpi(316);
- s.setMultitouch(Multitouch.JAZZ_HANDS);
- s.setMechanism(TouchScreen.FINGER);
- s.setScreenType(ScreenType.CAPACITIVE);
- mHardware.setScreen(s);
-
- mHardware.addNetwork(Network.BLUETOOTH);
- mHardware.addNetwork(Network.WIFI);
- mHardware.addNetwork(Network.NFC);
-
- mHardware.addSensor(Sensor.BAROMETER);
- mHardware.addSensor(Sensor.COMPASS);
- mHardware.addSensor(Sensor.LIGHT_SENSOR);
-
- mHardware.setHasMic(true);
- mHardware.addInternalStorage(new Storage(4, Storage.Unit.GiB));
- mHardware.setCpu("Generic CPU");
- mHardware.setGpu("Generic GPU");
-
- mHardware.addSupportedAbi(Abi.ARMEABI);
- mHardware.addSupportedAbi(Abi.ARMEABI_V7A);
- mHardware.addSupportedAbi(Abi.MIPS);
- mHardware.addSupportedAbi(Abi.X86);
-
- mHardware.setChargeType(PowerType.BATTERY);
- return;
- }
- mHardware = device.getDefaultHardware().deepCopy();
- mDeviceName.setText(device.getName());
- mForceCreation.setSelection(true);
- Screen s = mHardware.getScreen();
- mDiagonalLength.setText(Double.toString(s.getDiagonalLength()));
- mXDimension.setText(Integer.toString(s.getXDimension()));
- mYDimension.setText(Integer.toString(s.getYDimension()));
- String size = s.getSize().getResourceValue();
- for (int i = 0; i < mSize.getItemCount(); i++) {
- if (size.equals(mSize.getItem(i))) {
- mSize.select(i);
- break;
- }
- }
- String ratio = s.getRatio().getResourceValue();
- for (int i = 0; i < mRatio.getItemCount(); i++) {
- if (ratio.equals(mRatio.getItem(i))) {
- mRatio.select(i);
- break;
- }
- }
- String density = s.getPixelDensity().getResourceValue();
- for (int i = 0; i < mDensity.getItemCount(); i++) {
- if (density.equals(mDensity.getItem(i))) {
- mDensity.select(i);
- break;
- }
- }
- mKeyboard.setSelection(!Keyboard.NOKEY.equals(mHardware.getKeyboard()));
- mDpad.setSelection(Navigation.DPAD.equals(mHardware.getNav()));
- mTrackball.setSelection(Navigation.TRACKBALL.equals(mHardware.getNav()));
- mNoNav.setSelection(Navigation.NONAV.equals(mHardware.getNav()));
- mAccelerometer.setSelection(mHardware.getSensors().contains(Sensor.ACCELEROMETER));
- mGyro.setSelection(mHardware.getSensors().contains(Sensor.GYROSCOPE));
- mGps.setSelection(mHardware.getSensors().contains(Sensor.GPS));
- mProximitySensor.setSelection(mHardware.getSensors().contains(Sensor.PROXIMITY_SENSOR));
- mCameraFront.setSelection(false);
- mCameraRear.setSelection(false);
- for (Camera c : mHardware.getCameras()) {
- if (CameraLocation.FRONT.equals(c.getLocation())) {
- mCameraFront.setSelection(true);
- } else if (CameraLocation.BACK.equals(c.getLocation())) {
- mCameraRear.setSelection(true);
- }
- }
- mRam.setText(Long.toString(mHardware.getRam().getSizeAsUnit(Storage.Unit.MiB)));
- mRamCombo.select(0);
-
- for (int i = 0; i < mButtons.getItemCount(); i++) {
- if (mButtons.getItem(i).equals(mHardware.getButtonType().getDescription())) {
- mButtons.select(i);
- break;
- }
- }
-
- for (State state : device.getAllStates()) {
- Button nav = null;
- if (state.getOrientation().equals(ScreenOrientation.PORTRAIT)) {
- if (state.getKeyState().equals(KeyboardState.EXPOSED)) {
- mPortraitKeys.setSelection(true);
- nav = mPortraitKeysNav;
- } else {
- mPortrait.setSelection(true);
- nav = mPortraitNav;
- }
- } else {
- if (state.getKeyState().equals(KeyboardState.EXPOSED)) {
- mLandscapeKeys.setSelection(true);
- nav = mLandscapeKeysNav;
- } else {
- mLandscape.setSelection(true);
- nav = mLandscapeNav;
- }
- }
- nav.setSelection(state.getNavState().equals(NavigationState.EXPOSED)
- && !mHardware.getNav().equals(Navigation.NONAV));
- }
- }
-
- /**
- * If given a valid page, generates the corresponding device. The device is
- * then added to the user device list, replacing any previous device with
- * its given name and manufacturer, and the list is saved out to disk.
- */
- @Override
- protected void okPressed() {
- if (validatePage()) {
- Device.Builder builder = new Device.Builder();
- builder.setManufacturer("User");
- builder.setName(mDeviceName.getText());
- builder.addSoftware(mSoftware);
- Screen s = mHardware.getScreen();
- double diagonal = Double.parseDouble(mDiagonalLength.getText());
- int x = Integer.parseInt(mXDimension.getText());
- int y = Integer.parseInt(mYDimension.getText());
- s.setDiagonalLength(diagonal);
- s.setXDimension(x);
- s.setYDimension(y);
- // The diagonal DPI will be somewhere in between the X and Y dpi if
- // they differ
- double dpi = Math.sqrt(x * x + y * y) / diagonal;
- s.setXdpi(dpi);
- s.setYdpi(dpi);
- s.setPixelDensity(Density.getEnum(mDensity.getText()));
- s.setSize(ScreenSize.getEnum(mSize.getText()));
- s.setRatio(ScreenRatio.getEnum(mRatio.getText()));
- if (mAccelerometer.getSelection()) {
- mHardware.addSensor(Sensor.ACCELEROMETER);
- }
- if (mGyro.getSelection()) {
- mHardware.addSensor(Sensor.GYROSCOPE);
- }
- if (mGps.getSelection()) {
- mHardware.addSensor(Sensor.GPS);
- }
- if (mProximitySensor.getSelection()) {
- mHardware.addSensor(Sensor.PROXIMITY_SENSOR);
- }
- if (mCameraFront.getSelection()) {
- Camera c = new Camera();
- c.setAutofocus(true);
- c.setFlash(true);
- c.setLocation(CameraLocation.FRONT);
- mHardware.addCamera(c);
- }
- if (mCameraRear.getSelection()) {
- Camera c = new Camera();
- c.setAutofocus(true);
- c.setFlash(true);
- c.setLocation(CameraLocation.BACK);
- mHardware.addCamera(c);
- }
- if (mKeyboard.getSelection()) {
- mHardware.setKeyboard(Keyboard.QWERTY);
- } else {
- mHardware.setKeyboard(Keyboard.NOKEY);
- }
- if (mDpad.getSelection()) {
- mHardware.setNav(Navigation.DPAD);
- } else if (mTrackball.getSelection()) {
- mHardware.setNav(Navigation.TRACKBALL);
- } else {
- mHardware.setNav(Navigation.NONAV);
- }
- long ram = Long.parseLong(mRam.getText());
- Storage.Unit unit = Storage.Unit.getEnum(mRamCombo.getText());
- mHardware.setRam(new Storage(ram, unit));
- if (mButtons.getText().equals(ButtonType.HARD.getDescription())) {
- mHardware.setButtonType(ButtonType.HARD);
- } else {
- mHardware.setButtonType(ButtonType.SOFT);
- }
-
- // Set the first enabled state to the default state
- boolean defaultSelected = false;
- if (mPortrait.getSelection()) {
- State state = new State();
- state.setName("Portrait");
- state.setDescription("The device in portrait orientation");
- state.setOrientation(ScreenOrientation.PORTRAIT);
- if (mHardware.getNav().equals(Navigation.NONAV) || !mPortraitNav.getSelection()) {
- state.setNavState(NavigationState.HIDDEN);
- } else {
- state.setNavState(NavigationState.EXPOSED);
- }
- if (mHardware.getKeyboard().equals(Keyboard.NOKEY)) {
- state.setKeyState(KeyboardState.SOFT);
- } else {
- state.setKeyState(KeyboardState.HIDDEN);
- }
- state.setHardware(mHardware);
- if (!defaultSelected) {
- state.setDefaultState(true);
- defaultSelected = true;
- }
- builder.addState(state);
- }
- if (mLandscape.getSelection()) {
- State state = new State();
- state.setName("Landscape");
- state.setDescription("The device in landscape orientation");
- state.setOrientation(ScreenOrientation.LANDSCAPE);
- if (mHardware.getNav().equals(Navigation.NONAV) || !mLandscapeNav.getSelection()) {
- state.setNavState(NavigationState.HIDDEN);
- } else {
- state.setNavState(NavigationState.EXPOSED);
- }
- if (mHardware.getKeyboard().equals(Keyboard.NOKEY)) {
- state.setKeyState(KeyboardState.SOFT);
- } else {
- state.setKeyState(KeyboardState.HIDDEN);
- }
- state.setHardware(mHardware);
- if (!defaultSelected) {
- state.setDefaultState(true);
- defaultSelected = true;
- }
- builder.addState(state);
- }
- if (mKeyboard.getSelection()) {
- if (mPortraitKeys.getSelection()) {
- State state = new State();
- state.setName("Portrait with keyboard");
- state.setDescription("The device in portrait orientation with a keyboard open");
- state.setOrientation(ScreenOrientation.LANDSCAPE);
- if (mHardware.getNav().equals(Navigation.NONAV)
- || !mPortraitKeysNav.getSelection()) {
- state.setNavState(NavigationState.HIDDEN);
- } else {
- state.setNavState(NavigationState.EXPOSED);
- }
- state.setKeyState(KeyboardState.EXPOSED);
- state.setHardware(mHardware);
- if (!defaultSelected) {
- state.setDefaultState(true);
- defaultSelected = true;
- }
- builder.addState(state);
- }
- if (mLandscapeKeys.getSelection()) {
- State state = new State();
- state.setName("Landscape with keyboard");
- state.setDescription("The device in landscape orientation with a keyboard open");
- state.setOrientation(ScreenOrientation.LANDSCAPE);
- if (mHardware.getNav().equals(Navigation.NONAV)
- || !mLandscapeKeysNav.getSelection()) {
- state.setNavState(NavigationState.HIDDEN);
- } else {
- state.setNavState(NavigationState.EXPOSED);
- }
- state.setKeyState(KeyboardState.EXPOSED);
- state.setHardware(mHardware);
- if (!defaultSelected) {
- state.setDefaultState(true);
- defaultSelected = true;
- }
- builder.addState(state);
- }
- }
- Device d = builder.build();
- if (mForceCreation.isEnabled() && mForceCreation.getSelection()) {
- mManager.replaceUserDevice(d);
- } else {
- mManager.addUserDevice(d);
- }
- mManager.saveUserDevices();
- mCreatedDevice = d;
- super.okPressed();
- }
- }
-
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/HardwarePropertyChooser.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/HardwarePropertyChooser.java
deleted file mode 100644
index a07768c..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/HardwarePropertyChooser.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.widgets;
-
-import com.android.sdklib.internal.avd.HardwareProperties.HardwareProperty;
-import com.android.sdklib.internal.avd.HardwareProperties.HardwarePropertyType;
-import com.android.sdkuilib.ui.GridDialog;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.TreeSet;
-
-/**
- * Dialog to choose a hardware property
- */
-class HardwarePropertyChooser extends GridDialog {
-
- private final Map<String, HardwareProperty> mProperties;
- private final Collection<String> mExceptProperties;
- private HardwareProperty mChosenProperty;
- private Label mTypeLabel;
- private Label mDescriptionLabel;
-
- HardwarePropertyChooser(Shell parentShell,
- Map<String, HardwareProperty> properties,
- Collection<String> exceptProperties) {
- super(parentShell, 2, false);
- mProperties = properties;
- mExceptProperties = exceptProperties;
- }
-
- public HardwareProperty getProperty() {
- return mChosenProperty;
- }
-
- @Override
- public void createDialogContent(Composite parent) {
- Label l = new Label(parent, SWT.NONE);
- l.setText("Property:");
-
- final Combo c = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
- // simple list for index->name resolution.
- final ArrayList<String> indexToName = new ArrayList<String>();
-
- // Sort the combo entries by display name if available, otherwise by hardware name.
- Set<Entry<String, HardwareProperty>> entries =
- new TreeSet<Map.Entry<String,HardwareProperty>>(
- new Comparator<Map.Entry<String,HardwareProperty>>() {
- @Override
- public int compare(Entry<String, HardwareProperty> entry0,
- Entry<String, HardwareProperty> entry1) {
- String s0 = entry0.getValue().getAbstract();
- String s1 = entry1.getValue().getAbstract();
- if (s0 != null && s1 != null) {
- return s0.compareTo(s1);
- }
- return entry0.getKey().compareTo(entry1.getKey());
- }
- });
- entries.addAll(mProperties.entrySet());
-
- for (Entry<String, HardwareProperty> entry : entries) {
- if (entry.getValue().isValidForUi() &&
- mExceptProperties.contains(entry.getKey()) == false) {
- c.add(entry.getValue().getAbstract());
- indexToName.add(entry.getKey());
- }
- }
- boolean hasValues = true;
- if (indexToName.size() == 0) {
- hasValues = false;
- c.add("No properties");
- c.select(0);
- c.setEnabled(false);
- }
-
- c.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent event) {
- int index = c.getSelectionIndex();
- String name = indexToName.get(index);
- processSelection(name, true /* pack */);
- }
- });
-
- l = new Label(parent, SWT.NONE);
- l.setText("Type:");
-
- mTypeLabel = new Label(parent, SWT.NONE);
-
- l = new Label(parent, SWT.NONE);
- l.setText("Description:");
-
- mDescriptionLabel = new Label(parent, SWT.NONE);
-
- if (hasValues) {
- c.select(0);
- processSelection(indexToName.get(0), false /* pack */);
- }
- }
-
- private void processSelection(String name, boolean pack) {
- mChosenProperty = name == null ? null : mProperties.get(name);
-
- String type = "Unknown";
- String desc = "Unknown";
-
- if (mChosenProperty != null) {
- desc = mChosenProperty.getDescription();
- HardwarePropertyType vt = mChosenProperty.getType();
- if (vt != null) {
- type = vt.getName();
- }
- }
-
- mTypeLabel.setText(type);
- mDescriptionLabel.setText(desc);
-
- if (pack) {
- getShell().pack();
- }
- }
-
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/ImgDisabledButton.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/ImgDisabledButton.java
deleted file mode 100755
index 62973a4..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/ImgDisabledButton.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.widgets;
-
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * A label that can display 2 images depending on its enabled/disabled state.
- * This acts as a button by firing the {@link SWT#Selection} listener.
- */
-public class ImgDisabledButton extends ToggleButton {
- public ImgDisabledButton(
- Composite parent,
- int style,
- Image imageEnabled,
- Image imageDisabled,
- String tooltipEnabled,
- String tooltipDisabled) {
- super(parent,
- style,
- imageEnabled,
- imageDisabled,
- tooltipEnabled,
- tooltipDisabled);
- }
-
- @Override
- public void setEnabled(boolean enabled) {
- super.setEnabled(enabled);
- updateImageAndTooltip();
- redraw();
- }
-
- @Override
- public void setState(int state) {
- throw new UnsupportedOperationException(); // not available for this type of button
- }
-
- @Override
- public int getState() {
- return (isDisposed() || !isEnabled()) ? 1 : 0;
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/LegacyAvdEditDialog.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/LegacyAvdEditDialog.java
deleted file mode 100644
index 91f45c8..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/LegacyAvdEditDialog.java
+++ /dev/null
@@ -1,1425 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.widgets;
-
-import com.android.SdkConstants;
-import com.android.io.FileWrapper;
-import com.android.prefs.AndroidLocation.AndroidLocationException;
-import com.android.sdklib.IAndroidTarget;
-import com.android.sdklib.ISystemImage;
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.internal.avd.AvdInfo;
-import com.android.sdklib.internal.avd.AvdManager;
-import com.android.sdklib.internal.avd.AvdManager.AvdConflict;
-import com.android.sdklib.internal.avd.HardwareProperties;
-import com.android.sdklib.internal.avd.HardwareProperties.HardwareProperty;
-import com.android.sdklib.internal.project.ProjectProperties;
-import com.android.sdkuilib.internal.repository.icons.ImageFactory;
-import com.android.sdkuilib.ui.GridDialog;
-import com.android.utils.ILogger;
-import com.android.utils.Pair;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.CellLabelProvider;
-import org.eclipse.jface.viewers.ComboBoxCellEditor;
-import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerCell;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.VerifyEvent;
-import org.eclipse.swt.events.VerifyListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.Text;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.TreeMap;
-import java.util.regex.Matcher;
-
-/**
- * AVD creation or edit dialog.
- *
- * TODO:
- * - use SdkTargetSelector instead of Combo
- * - tooltips on widgets.
- *
- */
-final class LegacyAvdEditDialog extends GridDialog {
-
- private final AvdManager mAvdManager;
- private final TreeMap<String, IAndroidTarget> mCurrentTargets =
- new TreeMap<String, IAndroidTarget>();
-
- private final Map<String, HardwareProperty> mHardwareMap;
- private final Map<String, String> mProperties = new HashMap<String, String>();
- // a list of user-edited properties.
- private final ArrayList<String> mEditedProperties = new ArrayList<String>();
- private final ImageFactory mImageFactory;
- private final ILogger mSdkLog;
- /**
- * The original AvdInfo if we're editing an existing AVD.
- * Null when we're creating a new AVD.
- */
- private final AvdInfo mEditAvdInfo;
-
- private Text mAvdName;
- private Combo mTargetCombo;
-
- private Combo mAbiTypeCombo;
- private String mAbiType;
-
- private Button mSdCardSizeRadio;
- private Text mSdCardSize;
- private Combo mSdCardSizeCombo;
-
- private Text mSdCardFile;
- private Button mBrowseSdCard;
- private Button mSdCardFileRadio;
-
- private Button mSnapshotCheck;
-
- private Button mSkinListRadio;
- private Combo mSkinCombo;
-
- private Button mSkinSizeRadio;
- private Text mSkinSizeWidth;
- private Text mSkinSizeHeight;
-
- private TableViewer mHardwareViewer;
- private Button mDeleteHardwareProp;
-
- private Button mForceCreation;
- private Button mOkButton;
- private Label mStatusIcon;
- private Label mStatusLabel;
- private Composite mStatusComposite;
-
- /**
- * {@link VerifyListener} for {@link Text} widgets that should only contains numbers.
- */
- private final VerifyListener mDigitVerifier = new VerifyListener() {
- @Override
- public void verifyText(VerifyEvent event) {
- int count = event.text.length();
- for (int i = 0 ; i < count ; i++) {
- char c = event.text.charAt(i);
- if (c < '0' || c > '9') {
- event.doit = false;
- return;
- }
- }
- }
- };
-
- /**
- * Callback when the AVD name is changed.
- * When creating a new AVD, enables the force checkbox if the name is a duplicate.
- * When editing an existing AVD, it's OK for the name to match the existing AVD.
- */
- private class CreateNameModifyListener implements ModifyListener {
- @Override
- public void modifyText(ModifyEvent e) {
- String name = mAvdName.getText().trim();
- if (mEditAvdInfo == null || !name.equals(mEditAvdInfo.getName())) {
- // Case where we're creating a new AVD or editing an existing one
- // and the AVD name has been changed... check for name uniqueness.
-
- Pair<AvdConflict, String> conflict = mAvdManager.isAvdNameConflicting(name);
- if (conflict.getFirst() != AvdManager.AvdConflict.NO_CONFLICT) {
- // If we're changing the state from disabled to enabled, make sure
- // to uncheck the button, to force the user to voluntarily re-enforce it.
- // This happens when editing an existing AVD and changing the name from
- // the existing AVD to another different existing AVD.
- if (!mForceCreation.isEnabled()) {
- mForceCreation.setEnabled(true);
- mForceCreation.setSelection(false);
- }
- } else {
- mForceCreation.setEnabled(false);
- mForceCreation.setSelection(false);
- }
- } else {
- // Case where we're editing an existing AVD with the name unchanged.
-
- mForceCreation.setEnabled(false);
- mForceCreation.setSelection(false);
- }
- validatePage();
- }
- }
-
- /**
- * {@link ModifyListener} used for live-validation of the fields content.
- */
- private class ValidateListener extends SelectionAdapter implements ModifyListener {
- @Override
- public void modifyText(ModifyEvent e) {
- validatePage();
- }
-
- @Override
- public void widgetSelected(SelectionEvent e) {
- super.widgetSelected(e);
- validatePage();
- }
- }
-
- /**
- * Creates the dialog. Caller should then use {@link Window#open()} and
- * refresh if the status is {@link Window#OK}.
- *
- * @param parentShell The parent shell.
- * @param avdManager The existing {@link AvdManager} to use. Must not be null.
- * @param imageFactory An existing {@link ImageFactory} to use. Must not be null.
- * @param log An existing {@link ILogger} where output will go. Must not be null.
- * @param editAvdInfo An optional {@link AvdInfo}. When null, the dialog is used
- * to create a new AVD. When non-null, the dialog is used to <em>edit</em> this AVD.
- */
- protected LegacyAvdEditDialog(Shell parentShell,
- AvdManager avdManager,
- ImageFactory imageFactory,
- ILogger log,
- AvdInfo editAvdInfo) {
- super(parentShell, 2, false);
- mAvdManager = avdManager;
- mImageFactory = imageFactory;
- mSdkLog = log;
- mEditAvdInfo = editAvdInfo;
-
- File hardwareDefs = null;
-
- SdkManager sdkMan = avdManager.getSdkManager();
- if (sdkMan != null) {
- String sdkPath = sdkMan.getLocation();
- if (sdkPath != null) {
- hardwareDefs = new File (sdkPath + File.separator +
- SdkConstants.OS_SDK_TOOLS_LIB_FOLDER, SdkConstants.FN_HARDWARE_INI);
- }
- }
-
- if (hardwareDefs == null) {
- log.error(null, "Failed to load file %s from SDK", SdkConstants.FN_HARDWARE_INI);
- mHardwareMap = new HashMap<String, HardwareProperty>();
- } else {
- mHardwareMap = HardwareProperties.parseHardwareDefinitions(
- hardwareDefs, null /*sdkLog*/);
- }
- }
-
- @Override
- public void create() {
- super.create();
-
- Point p = getShell().getSize();
- if (p.x < 400) {
- p.x = 400;
- }
- getShell().setSize(p);
- }
-
- @Override
- protected Control createContents(Composite parent) {
- Control control = super.createContents(parent);
- getShell().setText(mEditAvdInfo == null ? "Create new Android Virtual Device (AVD)"
- : "Edit Android Virtual Device (AVD)");
-
- mOkButton = getButton(IDialogConstants.OK_ID);
-
- fillExistingAvdInfo();
- validatePage();
-
- return control;
- }
-
- @Override
- public void createDialogContent(final Composite parent) {
- GridData gd;
- GridLayout gl;
-
- Label label = new Label(parent, SWT.NONE);
- label.setText("Name:");
- String tooltip = "Name of the new Android Virtual Device";
- label.setToolTipText(tooltip);
-
- mAvdName = new Text(parent, SWT.BORDER);
- mAvdName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mAvdName.addModifyListener(new CreateNameModifyListener());
- mAvdName.setToolTipText(tooltip);
-
- label = new Label(parent, SWT.NONE);
- label.setText("Target:");
- tooltip = "The version of Android to use in the virtual device";
- label.setToolTipText(tooltip);
-
- mTargetCombo = new Combo(parent, SWT.READ_ONLY | SWT.DROP_DOWN);
- mTargetCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mTargetCombo.setToolTipText(tooltip);
- mTargetCombo.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- super.widgetSelected(e);
- reloadSkinCombo();
- reloadAbiTypeCombo();
- validatePage();
- }
- });
-
- //ABI group
- label = new Label(parent, SWT.NONE);
- label.setText("CPU/ABI:");
- tooltip = "The CPU/ABI to use in the virtual device";
- label.setToolTipText(tooltip);
-
- mAbiTypeCombo = new Combo(parent, SWT.READ_ONLY | SWT.DROP_DOWN);
- mAbiTypeCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mAbiTypeCombo.setToolTipText(tooltip);
- mAbiTypeCombo.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- super.widgetSelected(e);
- validatePage();
- }
- });
- mAbiTypeCombo.setEnabled(false);
-
- // --- sd card group
- label = new Label(parent, SWT.NONE);
- label.setText("SD Card:");
- label.setLayoutData(new GridData(GridData.BEGINNING, GridData.BEGINNING,
- false, false));
-
- final Group sdCardGroup = new Group(parent, SWT.NONE);
- sdCardGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- sdCardGroup.setLayout(new GridLayout(3, false));
-
- mSdCardSizeRadio = new Button(sdCardGroup, SWT.RADIO);
- mSdCardSizeRadio.setText("Size:");
- mSdCardSizeRadio.setToolTipText("Create a new SD Card file");
- mSdCardSizeRadio.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- boolean sizeMode = mSdCardSizeRadio.getSelection();
- enableSdCardWidgets(sizeMode);
- validatePage();
- }
- });
-
- ValidateListener validateListener = new ValidateListener();
-
- mSdCardSize = new Text(sdCardGroup, SWT.BORDER);
- mSdCardSize.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mSdCardSize.addVerifyListener(mDigitVerifier);
- mSdCardSize.addModifyListener(validateListener);
- mSdCardSize.setToolTipText("Size of the new SD Card file (must be at least 9 MiB)");
-
- mSdCardSizeCombo = new Combo(sdCardGroup, SWT.DROP_DOWN | SWT.READ_ONLY);
- mSdCardSizeCombo.add("KiB");
- mSdCardSizeCombo.add("MiB");
- mSdCardSizeCombo.add("GiB");
- mSdCardSizeCombo.select(1);
- mSdCardSizeCombo.addSelectionListener(validateListener);
-
- mSdCardFileRadio = new Button(sdCardGroup, SWT.RADIO);
- mSdCardFileRadio.setText("File:");
- mSdCardFileRadio.setToolTipText("Use an existing file for the SD Card");
-
- mSdCardFile = new Text(sdCardGroup, SWT.BORDER);
- mSdCardFile.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mSdCardFile.addModifyListener(validateListener);
- mSdCardFile.setToolTipText("File to use for the SD Card");
-
- mBrowseSdCard = new Button(sdCardGroup, SWT.PUSH);
- mBrowseSdCard.setText("Browse...");
- mBrowseSdCard.setToolTipText("Select the file to use for the SD Card");
- mBrowseSdCard.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- onBrowseSdCard();
- validatePage();
- }
- });
-
- mSdCardSizeRadio.setSelection(true);
- enableSdCardWidgets(true);
-
- // --- snapshot group
-
- label = new Label(parent, SWT.NONE);
- label.setText("Snapshot:");
- label.setLayoutData(new GridData(GridData.BEGINNING, GridData.BEGINNING,
- false, false));
-
- final Group snapshotGroup = new Group(parent, SWT.NONE);
- snapshotGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- snapshotGroup.setLayout(new GridLayout(3, false));
-
- mSnapshotCheck = new Button(snapshotGroup, SWT.CHECK);
- mSnapshotCheck.setText("Enabled");
- mSnapshotCheck.setToolTipText(
- "Emulator's state will be persisted between emulator executions");
-
- // --- skin group
- label = new Label(parent, SWT.NONE);
- label.setText("Skin:");
- label.setLayoutData(new GridData(GridData.BEGINNING, GridData.BEGINNING,
- false, false));
-
- final Group skinGroup = new Group(parent, SWT.NONE);
- skinGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- skinGroup.setLayout(new GridLayout(4, false));
-
- mSkinListRadio = new Button(skinGroup, SWT.RADIO);
- mSkinListRadio.setText("Built-in:");
- mSkinListRadio.setToolTipText("Select an emulated screen size provided by the current Android target");
- mSkinListRadio.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- boolean listMode = mSkinListRadio.getSelection();
- enableSkinWidgets(listMode);
- validatePage();
- }
- });
-
- mSkinCombo = new Combo(skinGroup, SWT.READ_ONLY | SWT.DROP_DOWN);
- mSkinCombo.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
- gd.horizontalSpan = 3;
- mSkinCombo.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- // get the skin info
- loadSkin();
- }
- });
-
- mSkinSizeRadio = new Button(skinGroup, SWT.RADIO);
- mSkinSizeRadio.setText("Resolution:");
- mSkinSizeRadio.setToolTipText("Select a custom emulated screen size");
-
- mSkinSizeWidth = new Text(skinGroup, SWT.BORDER);
- mSkinSizeWidth.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mSkinSizeWidth.addVerifyListener(mDigitVerifier);
- mSkinSizeWidth.addModifyListener(validateListener);
- mSkinSizeWidth.setToolTipText("Width in pixels of the emulated screen size");
-
- new Label(skinGroup, SWT.NONE).setText("x");
-
- mSkinSizeHeight = new Text(skinGroup, SWT.BORDER);
- mSkinSizeHeight.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mSkinSizeHeight.addVerifyListener(mDigitVerifier);
- mSkinSizeHeight.addModifyListener(validateListener);
- mSkinSizeHeight.setToolTipText("Height in pixels of the emulated screen size");
-
- mSkinListRadio.setSelection(true);
- enableSkinWidgets(true);
-
- // --- hardware group
- label = new Label(parent, SWT.NONE);
- label.setText("Hardware:");
- label.setLayoutData(new GridData(GridData.BEGINNING, GridData.BEGINNING,
- false, false));
-
- final Group hwGroup = new Group(parent, SWT.NONE);
- hwGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- hwGroup.setLayout(new GridLayout(2, false));
-
- createHardwareTable(hwGroup);
-
- // composite for the side buttons
- Composite hwButtons = new Composite(hwGroup, SWT.NONE);
- hwButtons.setLayoutData(new GridData(GridData.FILL_VERTICAL));
- hwButtons.setLayout(gl = new GridLayout(1, false));
- gl.marginHeight = gl.marginWidth = 0;
-
- Button b = new Button(hwButtons, SWT.PUSH | SWT.FLAT);
- b.setText("New...");
- b.setToolTipText("Add a new hardware property");
- b.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- b.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent event) {
- HardwarePropertyChooser dialog = new HardwarePropertyChooser(parent.getShell(),
- mHardwareMap, mProperties.keySet());
- if (dialog.open() == Window.OK) {
- HardwareProperty choice = dialog.getProperty();
- if (choice != null) {
- mProperties.put(choice.getName(), choice.getDefault());
- mHardwareViewer.refresh();
- }
- }
- }
- });
- mDeleteHardwareProp = new Button(hwButtons, SWT.PUSH | SWT.FLAT);
- mDeleteHardwareProp.setText("Delete");
- mDeleteHardwareProp.setToolTipText("Delete the selected hardware property");
- mDeleteHardwareProp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mDeleteHardwareProp.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- ISelection selection = mHardwareViewer.getSelection();
- if (selection instanceof IStructuredSelection) {
- String hwName = (String)((IStructuredSelection)selection).getFirstElement();
- mProperties.remove(hwName);
- mHardwareViewer.refresh();
- }
- }
- });
- mDeleteHardwareProp.setEnabled(false);
-
- // --- end hardware group
-
- mForceCreation = new Button(parent, SWT.CHECK);
- mForceCreation.setText("Override the existing AVD with the same name");
- mForceCreation.setToolTipText("There's already an AVD with the same name. Check this to delete it and replace it by the new AVD.");
- mForceCreation.setLayoutData(new GridData(GridData.BEGINNING, GridData.CENTER,
- true, false, 2, 1));
- mForceCreation.setEnabled(false);
- mForceCreation.addSelectionListener(validateListener);
-
- // add a separator to separate from the ok/cancel button
- label = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL);
- label.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 3, 1));
-
- // add stuff for the error display
- mStatusComposite = new Composite(parent, SWT.NONE);
- mStatusComposite.setLayoutData(new GridData(GridData.FILL, GridData.CENTER,
- true, false, 3, 1));
- mStatusComposite.setLayout(gl = new GridLayout(2, false));
- gl.marginHeight = gl.marginWidth = 0;
-
- mStatusIcon = new Label(mStatusComposite, SWT.NONE);
- mStatusIcon.setLayoutData(new GridData(GridData.BEGINNING, GridData.BEGINNING,
- false, false));
- mStatusLabel = new Label(mStatusComposite, SWT.NONE);
- mStatusLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
- mStatusLabel.setText(" \n "); //$NON-NLS-1$
-
- reloadTargetCombo();
- }
-
- /**
- * Creates the UI for the hardware properties table.
- * This creates the {@link Table}, and several viewers ({@link TableViewer},
- * {@link TableViewerColumn}) and adds edit support for the 2nd column
- */
- private void createHardwareTable(Composite parent) {
- final Table hardwareTable = new Table(parent, SWT.SINGLE | SWT.FULL_SELECTION);
- GridData gd = new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL);
- gd.widthHint = 200;
- gd.heightHint = 100;
- hardwareTable.setLayoutData(gd);
- hardwareTable.setHeaderVisible(true);
- hardwareTable.setLinesVisible(true);
-
- // -- Table viewer
- mHardwareViewer = new TableViewer(hardwareTable);
- mHardwareViewer.addSelectionChangedListener(new ISelectionChangedListener() {
- @Override
- public void selectionChanged(SelectionChangedEvent event) {
- // it's a single selection mode, we can just access the selection index
- // from the table directly.
- mDeleteHardwareProp.setEnabled(hardwareTable.getSelectionIndex() != -1);
- }
- });
-
- // only a content provider. Use viewers per column below (for editing support)
- mHardwareViewer.setContentProvider(new IStructuredContentProvider() {
- @Override
- public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
- // we can just ignore this. we just use mProperties directly.
- }
-
- @Override
- public Object[] getElements(Object arg0) {
- return mProperties.keySet().toArray();
- }
-
- @Override
- public void dispose() {
- // pass
- }
- });
-
- // -- column 1: prop abstract name
- TableColumn col1 = new TableColumn(hardwareTable, SWT.LEFT);
- col1.setText("Property");
- col1.setWidth(150);
- TableViewerColumn tvc1 = new TableViewerColumn(mHardwareViewer, col1);
- tvc1.setLabelProvider(new CellLabelProvider() {
- @Override
- public void update(ViewerCell cell) {
- String name = cell.getElement().toString();
- HardwareProperty prop = mHardwareMap.get(name);
- if (prop != null) {
- cell.setText(prop.getAbstract());
- } else {
- cell.setText(String.format("%1$s (Unknown)", name));
- }
- }
- });
-
- // -- column 2: prop value
- TableColumn col2 = new TableColumn(hardwareTable, SWT.LEFT);
- col2.setText("Value");
- col2.setWidth(50);
- TableViewerColumn tvc2 = new TableViewerColumn(mHardwareViewer, col2);
- tvc2.setLabelProvider(new CellLabelProvider() {
- @Override
- public void update(ViewerCell cell) {
- String value = mProperties.get(cell.getElement());
- cell.setText(value != null ? value : "");
- }
- });
-
- // add editing support to the 2nd column
- tvc2.setEditingSupport(new EditingSupport(mHardwareViewer) {
- @Override
- protected void setValue(Object element, Object value) {
- String hardwareName = (String)element;
- HardwareProperty property = mHardwareMap.get(hardwareName);
- int index;
- switch (property.getType()) {
- case INTEGER:
- mProperties.put((String)element, (String)value);
- break;
- case DISKSIZE:
- if (HardwareProperties.DISKSIZE_PATTERN.matcher((String)value).matches()) {
- mProperties.put((String)element, (String)value);
- }
- break;
- case BOOLEAN:
- index = (Integer)value;
- mProperties.put((String)element, HardwareProperties.BOOLEAN_VALUES[index]);
- break;
- case STRING_ENUM:
- case INTEGER_ENUM:
- // For a combo, value is the index of the enum to use.
- index = (Integer)value;
- String[] values = property.getEnum();
- if (values != null && values.length > index) {
- mProperties.put((String)element, values[index]);
- }
- break;
- }
- mHardwareViewer.refresh(element);
- }
-
- @Override
- protected Object getValue(Object element) {
- String hardwareName = (String)element;
- HardwareProperty property = mHardwareMap.get(hardwareName);
- String value = mProperties.get(hardwareName);
- switch (property.getType()) {
- case INTEGER:
- // intended fall-through.
- case DISKSIZE:
- return value;
- case BOOLEAN:
- return HardwareProperties.getBooleanValueIndex(value);
- case STRING_ENUM:
- case INTEGER_ENUM:
- // For a combo, we need to return the index of the value in the enum
- String[] values = property.getEnum();
- if (values != null) {
- for (int i = 0; i < values.length; i++) {
- if (values[i].equals(value)) {
- return i;
- }
- }
- }
- }
-
- return null;
- }
-
- @Override
- protected CellEditor getCellEditor(Object element) {
- String hardwareName = (String)element;
- HardwareProperty property = mHardwareMap.get(hardwareName);
- switch (property.getType()) {
- // TODO: custom TextCellEditor that restrict input.
- case INTEGER:
- // intended fall-through.
- case DISKSIZE:
- return new TextCellEditor(hardwareTable);
- case BOOLEAN:
- return new ComboBoxCellEditor(hardwareTable,
- HardwareProperties.BOOLEAN_VALUES,
- SWT.READ_ONLY | SWT.DROP_DOWN);
- case STRING_ENUM:
- case INTEGER_ENUM:
- String[] values = property.getEnum();
- if (values != null && values.length > 0) {
- return new ComboBoxCellEditor(hardwareTable,
- values,
- SWT.READ_ONLY | SWT.DROP_DOWN);
- }
- }
- return null;
- }
-
- @Override
- protected boolean canEdit(Object element) {
- String hardwareName = (String)element;
- HardwareProperty property = mHardwareMap.get(hardwareName);
- return property != null;
- }
- });
-
-
- mHardwareViewer.setInput(mProperties);
- }
-
- // -- Start of internal part ----------
- // Hide everything down-below from SWT designer
- //$hide>>$
-
- /**
- * When editing an existing AVD info, fill the UI that has just been created with
- * the values from the AVD.
- */
- public void fillExistingAvdInfo() {
- if (mEditAvdInfo == null) {
- return;
- }
-
- mAvdName.setText(mEditAvdInfo.getName());
-
- Map<String, String> props = mEditAvdInfo.getProperties();
-
- IAndroidTarget target = mEditAvdInfo.getTarget();
- if (target != null && !mCurrentTargets.isEmpty()) {
- // Try to select the target in the target combo.
- // This will fail if the AVD needs to be repaired.
- //
- // This is a linear search but the list is always
- // small enough and we only do this once.
- int n = mTargetCombo.getItemCount();
- for (int i = 0;i < n; i++) {
- if (target.equals(mCurrentTargets.get(mTargetCombo.getItem(i)))) {
- mTargetCombo.select(i);
- reloadAbiTypeCombo();
- reloadSkinCombo();
- break;
- }
- }
- }
-
- // select the abi type
- ISystemImage[] systemImages = getSystemImages(target);
- if (target != null && systemImages.length > 0) {
- mAbiTypeCombo.setEnabled(systemImages.length > 1);
- String abiType = AvdInfo.getPrettyAbiType(mEditAvdInfo.getAbiType());
- int n = mAbiTypeCombo.getItemCount();
- for (int i = 0; i < n; i++) {
- if (abiType.equals(mAbiTypeCombo.getItem(i))) {
- mAbiTypeCombo.select(i);
- reloadSkinCombo();
- break;
- }
- }
- }
-
- if (props != null) {
-
- // First try the skin name and if it doesn't work fallback on the skin path
- nextSkin: for (int s = 0; s < 2; s++) {
- String skin = props.get(s == 0 ? AvdManager.AVD_INI_SKIN_NAME
- : AvdManager.AVD_INI_SKIN_PATH);
- if (skin != null && skin.length() > 0) {
- Matcher m = AvdManager.NUMERIC_SKIN_SIZE.matcher(skin);
- if (m.matches() && m.groupCount() == 2) {
- enableSkinWidgets(false);
- mSkinListRadio.setSelection(false);
- mSkinSizeRadio.setSelection(true);
- mSkinSizeWidth.setText(m.group(1));
- mSkinSizeHeight.setText(m.group(2));
- break nextSkin;
- } else {
- enableSkinWidgets(true);
- mSkinSizeRadio.setSelection(false);
- mSkinListRadio.setSelection(true);
-
- int n = mSkinCombo.getItemCount();
- for (int i = 0; i < n; i++) {
- if (skin.equals(mSkinCombo.getItem(i))) {
- mSkinCombo.select(i);
- break nextSkin;
- }
- }
- }
- }
- }
-
- String sdcard = props.get(AvdManager.AVD_INI_SDCARD_PATH);
- if (sdcard != null && sdcard.length() > 0) {
- enableSdCardWidgets(false);
- mSdCardSizeRadio.setSelection(false);
- mSdCardFileRadio.setSelection(true);
- mSdCardFile.setText(sdcard);
- }
-
- sdcard = props.get(AvdManager.AVD_INI_SDCARD_SIZE);
- if (sdcard != null && sdcard.length() > 0) {
- String[] values = new String[2];
- long sdcardSize = AvdManager.parseSdcardSize(sdcard, values);
-
- if (sdcardSize != AvdManager.SDCARD_NOT_SIZE_PATTERN) {
- enableSdCardWidgets(true);
- mSdCardFileRadio.setSelection(false);
- mSdCardSizeRadio.setSelection(true);
-
- mSdCardSize.setText(values[0]);
-
- String suffix = values[1];
- int n = mSdCardSizeCombo.getItemCount();
- for (int i = 0; i < n; i++) {
- if (mSdCardSizeCombo.getItem(i).startsWith(suffix)) {
- mSdCardSizeCombo.select(i);
- }
- }
- }
- }
-
- String snapshots = props.get(AvdManager.AVD_INI_SNAPSHOT_PRESENT);
- if (snapshots != null && snapshots.length() > 0) {
- mSnapshotCheck.setSelection(snapshots.equals("true"));
- }
- }
-
- mProperties.clear();
-
- if (props != null) {
- for (Entry<String, String> entry : props.entrySet()) {
- HardwareProperty prop = mHardwareMap.get(entry.getKey());
- if (prop != null && prop.isValidForUi()) {
- mProperties.put(entry.getKey(), entry.getValue());
- }
- }
- }
-
- // Cleanup known non-hardware properties
- mProperties.remove(AvdManager.AVD_INI_ABI_TYPE);
- mProperties.remove(AvdManager.AVD_INI_CPU_ARCH);
- mProperties.remove(AvdManager.AVD_INI_SKIN_PATH);
- mProperties.remove(AvdManager.AVD_INI_SKIN_NAME);
- mProperties.remove(AvdManager.AVD_INI_SDCARD_SIZE);
- mProperties.remove(AvdManager.AVD_INI_SDCARD_PATH);
- mProperties.remove(AvdManager.AVD_INI_SNAPSHOT_PRESENT);
- mProperties.remove(AvdManager.AVD_INI_IMAGES_1);
- mProperties.remove(AvdManager.AVD_INI_IMAGES_2);
-
- mHardwareViewer.refresh();
- }
-
- @Override
- protected void okPressed() {
- if (createAvd()) {
- super.okPressed();
- }
- }
-
- /**
- * Enable or disable the sd card widgets.
- * @param sizeMode if true the size-based widgets are to be enabled, and the file-based ones
- * disabled.
- */
- private void enableSdCardWidgets(boolean sizeMode) {
- mSdCardSize.setEnabled(sizeMode);
- mSdCardSizeCombo.setEnabled(sizeMode);
-
- mSdCardFile.setEnabled(!sizeMode);
- mBrowseSdCard.setEnabled(!sizeMode);
- }
-
- /**
- * Enable or disable the skin widgets.
- * @param listMode if true the list-based widgets are to be enabled, and the size-based ones
- * disabled.
- */
- private void enableSkinWidgets(boolean listMode) {
- mSkinCombo.setEnabled(listMode);
-
- mSkinSizeWidth.setEnabled(!listMode);
- mSkinSizeHeight.setEnabled(!listMode);
- }
-
-
- private void onBrowseSdCard() {
- FileDialog dlg = new FileDialog(getContents().getShell(), SWT.OPEN);
- dlg.setText("Choose SD Card image file.");
-
- String fileName = dlg.open();
- if (fileName != null) {
- mSdCardFile.setText(fileName);
- }
- }
-
-
-
- private void reloadTargetCombo() {
- String selected = null;
- int index = mTargetCombo.getSelectionIndex();
- if (index >= 0) {
- selected = mTargetCombo.getItem(index);
- }
-
- mCurrentTargets.clear();
- mTargetCombo.removeAll();
-
- boolean found = false;
- index = -1;
-
- SdkManager sdkManager = mAvdManager.getSdkManager();
- if (sdkManager != null) {
- for (IAndroidTarget target : sdkManager.getTargets()) {
- String name;
- if (target.isPlatform()) {
- name = String.format("%s - API Level %s",
- target.getName(),
- target.getVersion().getApiString());
- } else {
- name = String.format("%s (%s) - API Level %s",
- target.getName(),
- target.getVendor(),
- target.getVersion().getApiString());
- }
- mCurrentTargets.put(name, target);
- mTargetCombo.add(name);
- if (!found) {
- index++;
- found = name.equals(selected);
- }
- }
- }
-
- mTargetCombo.setEnabled(mCurrentTargets.size() > 0);
-
- if (found) {
- mTargetCombo.select(index);
- }
-
- reloadSkinCombo();
- }
-
- private void reloadSkinCombo() {
- String selected = null;
- int index = mSkinCombo.getSelectionIndex();
- if (index >= 0) {
- selected = mSkinCombo.getItem(index);
- }
-
- mSkinCombo.removeAll();
- mSkinCombo.setEnabled(false);
-
- index = mTargetCombo.getSelectionIndex();
- if (index >= 0) {
-
- String targetName = mTargetCombo.getItem(index);
-
- boolean found = false;
- IAndroidTarget target = mCurrentTargets.get(targetName);
- if (target != null) {
- mSkinCombo.add(String.format("Default (%s)", target.getDefaultSkin()));
-
- index = -1;
- for (String skin : target.getSkins()) {
- mSkinCombo.add(skin);
- if (!found) {
- index++;
- found = skin.equals(selected);
- }
- }
-
- mSkinCombo.setEnabled(true);
-
- if (found) {
- mSkinCombo.select(index);
- } else {
- mSkinCombo.select(0); // default
- loadSkin();
- }
- }
- }
- }
-
- /**
- * Reload all the abi types in the selection list
- */
- private void reloadAbiTypeCombo() {
- String selected = null;
- boolean found = false;
-
- int index = mTargetCombo.getSelectionIndex();
- if (index >= 0) {
- String targetName = mTargetCombo.getItem(index);
- IAndroidTarget target = mCurrentTargets.get(targetName);
-
- ISystemImage[] systemImages = getSystemImages(target);
-
- mAbiTypeCombo.setEnabled(systemImages.length > 1);
-
- // If user explicitly selected an ABI before, preserve that option
- // If user did not explicitly select before (only one option before)
- // force them to select
- index = mAbiTypeCombo.getSelectionIndex();
- if (index >= 0 && mAbiTypeCombo.getItemCount() > 1) {
- selected = mAbiTypeCombo.getItem(index);
- }
-
- mAbiTypeCombo.removeAll();
-
- int i;
- for ( i = 0; i < systemImages.length ; i++ ) {
- String prettyAbiType = AvdInfo.getPrettyAbiType(systemImages[i].getAbiType());
- mAbiTypeCombo.add(prettyAbiType);
- if (!found) {
- found = prettyAbiType.equals(selected);
- if (found) {
- mAbiTypeCombo.select(i);
- }
- }
- }
-
- if (systemImages.length == 1) {
- mAbiTypeCombo.select(0);
- }
- }
- }
-
- /**
- * Validates the fields, displays errors and warnings.
- * Enables the finish button if there are no errors.
- */
- private void validatePage() {
- String error = null;
- String warning = null;
-
- // Validate AVD name
- String avdName = mAvdName.getText().trim();
- boolean hasAvdName = avdName.length() > 0;
- boolean isCreate = mEditAvdInfo == null || !avdName.equals(mEditAvdInfo.getName());
-
- if (hasAvdName && !AvdManager.RE_AVD_NAME.matcher(avdName).matches()) {
- error = String.format(
- "AVD name '%1$s' contains invalid characters.\nAllowed characters are: %2$s",
- avdName, AvdManager.CHARS_AVD_NAME);
- }
-
- // Validate target
- if (hasAvdName && error == null && mTargetCombo.getSelectionIndex() < 0) {
- error = "A target must be selected in order to create an AVD.";
- }
-
- // validate abi type if the selected target supports multi archs.
- if (hasAvdName && error == null && mTargetCombo.getSelectionIndex() > 0) {
- int index = mTargetCombo.getSelectionIndex();
- String targetName = mTargetCombo.getItem(index);
- IAndroidTarget target = mCurrentTargets.get(targetName);
- ISystemImage[] systemImages = getSystemImages(target);
- if (systemImages.length > 1 && mAbiTypeCombo.getSelectionIndex() < 0) {
- error = "An ABI type must be selected in order to create an AVD.";
- }
- }
-
- // Validate SDCard path or value
- if (error == null) {
- // get the mode. We only need to check the file since the
- // verifier on the size Text will prevent invalid input
- boolean sdcardFileMode = mSdCardFileRadio.getSelection();
- if (sdcardFileMode) {
- String sdName = mSdCardFile.getText().trim();
- if (sdName.length() > 0 && !new File(sdName).isFile()) {
- error = "SD Card path isn't valid.";
- }
- } else {
- String valueString = mSdCardSize.getText();
- if (valueString.length() > 0) {
- long value = 0;
- try {
- value = Long.parseLong(valueString);
-
- int sizeIndex = mSdCardSizeCombo.getSelectionIndex();
- if (sizeIndex >= 0) {
- // index 0 shifts by 10 (1024=K), index 1 by 20, etc.
- value <<= 10*(1 + sizeIndex);
- }
-
- if (value < AvdManager.SDCARD_MIN_BYTE_SIZE ||
- value > AvdManager.SDCARD_MAX_BYTE_SIZE) {
- value = 0;
- }
- } catch (Exception e) {
- // ignore, we'll test value below.
- }
- if (value <= 0) {
- error = "SD Card size is invalid. Range is 9 MiB..1023 GiB.";
- } else if (mEditAvdInfo != null) {
- // When editing an existing AVD, compare with the existing
- // sdcard size, if any. It only matters if there was an sdcard setting
- // before.
- Map<String, String> props = mEditAvdInfo.getProperties();
- if (props != null) {
- String original =
- mEditAvdInfo.getProperties().get(AvdManager.AVD_INI_SDCARD_SIZE);
- if (original != null && original.length() > 0) {
- long originalSize =
- AvdManager.parseSdcardSize(original, null/*parsedStrings*/);
- if (originalSize > 0 && value != originalSize) {
- warning = "A new SD Card file will be created.\nThe current SD Card file will be lost.";
- }
- }
- }
- }
- }
- }
- }
-
- // validate the skin
- if (error == null) {
- // get the mode, we should only check if it's in size mode since
- // the built-in list mode is always valid.
- if (mSkinSizeRadio.getSelection()) {
- // need both with and heigh to be non null
- String width = mSkinSizeWidth.getText(); // no need for trim, since the verifier
- String height = mSkinSizeHeight.getText(); // rejects non digit.
-
- if (width.length() == 0 || height.length() == 0) {
- error = "Skin size is incorrect.\nBoth dimensions must be > 0.";
- }
- }
- }
-
- // Check for duplicate AVD name
- if (isCreate && hasAvdName && error == null && !mForceCreation.getSelection()) {
- Pair<AvdConflict, String> conflict = mAvdManager.isAvdNameConflicting(avdName);
- assert conflict != null;
- switch(conflict.getFirst()) {
- case NO_CONFLICT:
- break;
- case CONFLICT_EXISTING_AVD:
- case CONFLICT_INVALID_AVD:
- error = String.format(
- "The AVD name '%s' is already used.\n" +
- "Check \"Override the existing AVD\" to delete the existing one.",
- avdName);
- break;
- case CONFLICT_EXISTING_PATH:
- error = String.format(
- "Conflict with %s\n" +
- "Check \"Override the existing AVD\" to delete the existing one.",
- conflict.getSecond());
- break;
- default:
- // Hmm not supposed to happen... probably someone expanded the
- // enum without adding something here. In this case just do an
- // assert and use a generic error message.
- error = String.format(
- "Conflict %s with %s.\n" +
- "Check \"Override the existing AVD\" to delete the existing one.",
- conflict.getFirst().toString(),
- conflict.getSecond());
- assert false;
- break;
- }
- }
-
- if (error == null && mEditAvdInfo != null && isCreate) {
- warning = String.format("The AVD '%1$s' will be duplicated into '%2$s'.",
- mEditAvdInfo.getName(),
- avdName);
- }
-
- // Validate the create button
- boolean can_create = hasAvdName && error == null;
- if (can_create) {
- can_create &= mTargetCombo.getSelectionIndex() >= 0;
- }
- mOkButton.setEnabled(can_create);
-
- // Adjust the create button label as needed
- if (isCreate) {
- mOkButton.setText("Create AVD");
- } else {
- mOkButton.setText("Edit AVD");
- }
-
- // -- update UI
- if (error != null) {
- mStatusIcon.setImage(mImageFactory.getImageByName("reject_icon16.png")); //$NON-NLS-1$
- mStatusLabel.setText(error);
- } else if (warning != null) {
- mStatusIcon.setImage(mImageFactory.getImageByName("warning_icon16.png")); //$NON-NLS-1$
- mStatusLabel.setText(warning);
- } else {
- mStatusIcon.setImage(null);
- mStatusLabel.setText(" \n "); //$NON-NLS-1$
- }
-
- mStatusComposite.pack(true);
- }
-
- private void loadSkin() {
- int targetIndex = mTargetCombo.getSelectionIndex();
- if (targetIndex < 0) {
- return;
- }
-
- // resolve the target.
- String targetName = mTargetCombo.getItem(targetIndex);
- IAndroidTarget target = mCurrentTargets.get(targetName);
- if (target == null) {
- return;
- }
-
- // get the skin name
- String skinName = null;
- int skinIndex = mSkinCombo.getSelectionIndex();
- if (skinIndex < 0) {
- return;
- } else if (skinIndex == 0) { // default skin for the target
- skinName = target.getDefaultSkin();
- } else {
- skinName = mSkinCombo.getItem(skinIndex);
- }
-
- // load the skin properties
- String path = target.getPath(IAndroidTarget.SKINS);
- File skin = new File(path, skinName);
- if (skin.isDirectory() == false && target.isPlatform() == false) {
- // it's possible the skin is in the parent target
- path = target.getParent().getPath(IAndroidTarget.SKINS);
- skin = new File(path, skinName);
- }
-
- if (skin.isDirectory() == false) {
- return;
- }
-
- // now get the hardware.ini from the add-on (if applicable) and from the skin
- // (if applicable)
- HashMap<String, String> hardwareValues = new HashMap<String, String>();
- if (target.isPlatform() == false) {
- FileWrapper targetHardwareFile = new FileWrapper(target.getLocation(),
- AvdManager.HARDWARE_INI);
- if (targetHardwareFile.isFile()) {
- Map<String, String> targetHardwareConfig = ProjectProperties.parsePropertyFile(
- targetHardwareFile, null /*log*/);
-
- if (targetHardwareConfig != null) {
- hardwareValues.putAll(targetHardwareConfig);
- }
- }
- }
-
- // from the skin
- FileWrapper skinHardwareFile = new FileWrapper(skin, AvdManager.HARDWARE_INI);
- if (skinHardwareFile.isFile()) {
- Map<String, String> skinHardwareConfig = ProjectProperties.parsePropertyFile(
- skinHardwareFile, null /*log*/);
-
- if (skinHardwareConfig != null) {
- hardwareValues.putAll(skinHardwareConfig);
- }
- }
-
- // now set those values in the list of properties for the AVD.
- // We just check that none of those properties have been edited by the user yet.
- for (Entry<String, String> entry : hardwareValues.entrySet()) {
- if (mEditedProperties.contains(entry.getKey()) == false) {
- mProperties.put(entry.getKey(), entry.getValue());
- }
- }
-
- mHardwareViewer.refresh();
- }
-
- /**
- * Creates an AVD from the values in the UI. Called when the user presses the OK button.
- */
- private boolean createAvd() {
- String avdName = mAvdName.getText().trim();
- int index = mTargetCombo.getSelectionIndex();
-
- // quick check on the name and the target selection
- if (avdName.length() == 0 || index < 0) {
- return false;
- }
-
- // resolve the target.
- String targetName = mTargetCombo.getItem(index);
- IAndroidTarget target = mCurrentTargets.get(targetName);
- if (target == null) {
- return false;
- }
-
- // get the abi type
- mAbiType = SdkConstants.ABI_ARMEABI;
- ISystemImage[] systemImages = getSystemImages(target);
- if (systemImages.length > 0) {
- int abiIndex = mAbiTypeCombo.getSelectionIndex();
- if (abiIndex >= 0) {
- String prettyname = mAbiTypeCombo.getItem(abiIndex);
- //Extract the abi type
- int firstIndex = prettyname.indexOf("(");
- int lastIndex = prettyname.indexOf(")");
- mAbiType = prettyname.substring(firstIndex+1, lastIndex);
- }
- }
-
- // get the SD card data from the UI.
- String sdName = null;
- if (mSdCardSizeRadio.getSelection()) {
- // size mode
- String value = mSdCardSize.getText().trim();
- if (value.length() > 0) {
- sdName = value;
- // add the unit
- switch (mSdCardSizeCombo.getSelectionIndex()) {
- case 0:
- sdName += "K"; //$NON-NLS-1$
- break;
- case 1:
- sdName += "M"; //$NON-NLS-1$
- break;
- case 2:
- sdName += "G"; //$NON-NLS-1$
- break;
- default:
- // shouldn't be here
- assert false;
- }
- }
- } else {
- // file mode.
- sdName = mSdCardFile.getText().trim();
- }
-
- // get the Skin data from the UI
- String skinName = null;
- if (mSkinListRadio.getSelection()) {
- // built-in list provides the skin
- int skinIndex = mSkinCombo.getSelectionIndex();
- if (skinIndex > 0) {
- // index 0 is the default, we don't use it
- skinName = mSkinCombo.getItem(skinIndex);
- }
- } else {
- // size mode. get both size and writes it as a skin name
- // thanks to validatePage() we know the content of the fields is correct
- skinName = mSkinSizeWidth.getText() + "x" + mSkinSizeHeight.getText(); //$NON-NLS-1$
- }
-
- ILogger log = mSdkLog;
- if (log == null || log instanceof MessageBoxLog) {
- // If the current logger is a message box, we use our own (to make sure
- // to display errors right away and customize the title).
- log = new MessageBoxLog(
- String.format("Result of creating AVD '%s':", avdName),
- getContents().getDisplay(),
- false /*logErrorsOnly*/);
- }
-
- File avdFolder = null;
- try {
- avdFolder = AvdInfo.getDefaultAvdFolder(mAvdManager, avdName);
- } catch (AndroidLocationException e) {
- return false;
- }
-
- boolean force = mForceCreation.getSelection();
- boolean snapshot = mSnapshotCheck.getSelection();
-
- boolean success = false;
- AvdInfo avdInfo = mAvdManager.createAvd(
- avdFolder,
- avdName,
- target,
- mAbiType,
- skinName,
- sdName,
- mProperties,
- snapshot,
- force,
- mEditAvdInfo != null, //edit existing
- log);
-
- success = avdInfo != null;
-
- if (log instanceof MessageBoxLog) {
- ((MessageBoxLog) log).displayResult(success);
- }
- return success;
- }
-
- /**
- * Returns the list of system images of a target.
- * <p/>
- * If target is null, returns an empty list.
- * If target is an add-on with no system images, return the list from its parent platform.
- *
- * @param target An IAndroidTarget. Can be null.
- * @return A non-null ISystemImage array. Can be empty.
- */
- private ISystemImage[] getSystemImages(IAndroidTarget target) {
- if (target != null) {
- ISystemImage[] images = target.getSystemImages();
-
- if ((images == null || images.length == 0) && !target.isPlatform()) {
- // If an add-on does not provide any system images, use the ones from the parent.
- images = target.getParent().getSystemImages();
- }
-
- if (images != null) {
- return images;
- }
- }
-
- return new ISystemImage[0];
- }
-
- // End of hiding from SWT Designer
- //$hide<<$
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/MessageBoxLog.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/MessageBoxLog.java
deleted file mode 100755
index f5b75e0..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/MessageBoxLog.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.widgets;
-
-import com.android.annotations.NonNull;
-import com.android.utils.ILogger;
-
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-import java.util.ArrayList;
-
-
-/**
- * Collects all log and displays it in a message box dialog.
- * <p/>
- * This is good if only a few lines of log are expected.
- * If you pass <var>logErrorsOnly</var> to the constructor, the message box
- * will be shown only if errors were generated, which is the typical use-case.
- * <p/>
- * To use this: </br>
- * - Construct a new {@link MessageBoxLog}. </br>
- * - Pass the logger to the action. </br>
- * - Once the action is completed, call {@link #displayResult(boolean)}
- * indicating whether the operation was successful or not.
- *
- * When <var>logErrorsOnly</var> is true, if the operation was not successful or errors
- * were generated, this will display the message box.
- */
-public final class MessageBoxLog implements ILogger {
-
- final ArrayList<String> logMessages = new ArrayList<String>();
- private final String mMessage;
- private final Display mDisplay;
- private final boolean mLogErrorsOnly;
-
- /**
- * Creates a logger that will capture all logs and eventually display them
- * in a simple message box.
- *
- * @param message
- * @param display
- * @param logErrorsOnly
- */
- public MessageBoxLog(String message, Display display, boolean logErrorsOnly) {
- mMessage = message;
- mDisplay = display;
- mLogErrorsOnly = logErrorsOnly;
- }
-
- @Override
- public void error(Throwable throwable, String errorFormat, Object... arg) {
- if (errorFormat != null) {
- logMessages.add(String.format("Error: " + errorFormat, arg));
- }
-
- if (throwable != null) {
- logMessages.add(throwable.getMessage());
- }
- }
-
- @Override
- public void warning(@NonNull String warningFormat, Object... arg) {
- if (!mLogErrorsOnly) {
- logMessages.add(String.format("Warning: " + warningFormat, arg));
- }
- }
-
- @Override
- public void info(@NonNull String msgFormat, Object... arg) {
- if (!mLogErrorsOnly) {
- logMessages.add(String.format(msgFormat, arg));
- }
- }
-
- @Override
- public void verbose(@NonNull String msgFormat, Object... arg) {
- if (!mLogErrorsOnly) {
- logMessages.add(String.format(msgFormat, arg));
- }
- }
-
- /**
- * Displays the log if anything was captured.
- * <p/>
- * @param success Used only when the logger was constructed with <var>logErrorsOnly</var>==true.
- * In this case the dialog will only be shown either if success if false or some errors
- * where captured.
- */
- public void displayResult(final boolean success) {
- if (logMessages.size() > 0) {
- final StringBuilder sb = new StringBuilder(mMessage + "\n\n");
- for (String msg : logMessages) {
- if (msg.length() > 0) {
- if (msg.charAt(0) != '\n') {
- int n = sb.length();
- if (n > 0 && sb.charAt(n-1) != '\n') {
- sb.append('\n');
- }
- }
- sb.append(msg);
- }
- }
-
- // display the message
- // dialog box only run in ui thread..
- if (mDisplay != null && !mDisplay.isDisposed()) {
- mDisplay.asyncExec(new Runnable() {
- @Override
- public void run() {
- // This is typically displayed at the end, so make sure the UI
- // instances are not disposed.
- Shell shell = null;
- if (mDisplay != null && !mDisplay.isDisposed()) {
- shell = mDisplay.getActiveShell();
- }
- if (shell == null || shell.isDisposed()) {
- return;
- }
- // Use the success icon if the call indicates success.
- // However just use the error icon if the logger was only recording errors.
- if (success && !mLogErrorsOnly) {
- MessageDialog.openInformation(shell, "Android Virtual Devices Manager",
- sb.toString());
- } else {
- MessageDialog.openError(shell, "Android Virtual Devices Manager",
- sb.toString());
-
- }
- }
- });
- }
- }
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/ResolutionChooserDialog.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/ResolutionChooserDialog.java
deleted file mode 100644
index 7454437..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/ResolutionChooserDialog.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.widgets;
-
-import com.android.sdkuilib.ui.GridDialog;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Monitor;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Small dialog to let a user choose a screen size (from a fixed list) and a resolution
- * (as returned by {@link Display#getMonitors()}).
-
- * After the dialog as returned, one can query {@link #getDensity()} to get the chosen monitor
- * pixel density.
- */
-public class ResolutionChooserDialog extends GridDialog {
- public final static float[] MONITOR_SIZES = new float[] {
- 13.3f, 14, 15.4f, 15.6f, 17, 19, 20, 21, 24, 30,
- };
-
- private Button mButton;
- private Combo mScreenSizeCombo;
- private Combo mMonitorCombo;
-
- private Monitor[] mMonitors;
- private int mScreenSizeIndex = -1;
- private int mMonitorIndex = 0;
-
- public ResolutionChooserDialog(Shell parentShell) {
- super(parentShell, 2, false);
- }
-
- /**
- * Returns the pixel density of the user-chosen monitor.
- */
- public int getDensity() {
- float size = MONITOR_SIZES[mScreenSizeIndex];
- Rectangle rect = mMonitors[mMonitorIndex].getBounds();
-
- // compute the density
- double d = Math.sqrt(rect.width * rect.width + rect.height * rect.height) / size;
- return (int)Math.round(d);
- }
-
- @Override
- protected void configureShell(Shell newShell) {
- newShell.setText("Monitor Density");
- super.configureShell(newShell);
- }
-
- @Override
- protected Control createContents(Composite parent) {
- Control control = super.createContents(parent);
- mButton = getButton(IDialogConstants.OK_ID);
- mButton.setEnabled(false);
- return control;
- }
-
- @Override
- public void createDialogContent(Composite parent) {
- Label l = new Label(parent, SWT.NONE);
- l.setText("Screen Size:");
-
- mScreenSizeCombo = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
- for (float size : MONITOR_SIZES) {
- if (Math.round(size) == size) {
- mScreenSizeCombo.add(String.format("%.0f\"", size));
- } else {
- mScreenSizeCombo.add(String.format("%.1f\"", size));
- }
- }
- mScreenSizeCombo.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent arg0) {
- mScreenSizeIndex = mScreenSizeCombo.getSelectionIndex();
- mButton.setEnabled(mScreenSizeIndex != -1);
- }
- });
-
- l = new Label(parent, SWT.NONE);
- l.setText("Resolution:");
-
- mMonitorCombo = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
- mMonitors = parent.getDisplay().getMonitors();
- for (Monitor m : mMonitors) {
- Rectangle r = m.getBounds();
- mMonitorCombo.add(String.format("%d x %d", r.width, r.height));
- }
- mMonitorCombo.select(mMonitorIndex);
- mMonitorCombo.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetDefaultSelected(SelectionEvent arg0) {
- mMonitorIndex = mMonitorCombo.getSelectionIndex();
- }
- });
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/SdkTargetSelector.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/SdkTargetSelector.java
deleted file mode 100644
index 7d2e90f..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/SdkTargetSelector.java
+++ /dev/null
@@ -1,460 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.widgets;
-
-import com.android.SdkConstants;
-import com.android.sdklib.IAndroidTarget;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-
-import java.util.Arrays;
-import java.util.Comparator;
-
-
-/**
- * The SDK target selector is a table that is added to the given parent composite.
- * <p/>
- * To use, create it using {@link #SdkTargetSelector(Composite, IAndroidTarget[], boolean)} then
- * call {@link #setSelection(IAndroidTarget)}, {@link #setSelectionListener(SelectionListener)}
- * and finally use {@link #getSelected()} to retrieve the
- * selection.
- */
-public class SdkTargetSelector {
-
- private IAndroidTarget[] mTargets;
- private final boolean mAllowSelection;
- private SelectionListener mSelectionListener;
- private Table mTable;
- private Label mDescription;
- private Composite mInnerGroup;
-
- /** Cache for {@link #getCheckboxWidth()} */
- private static int sCheckboxWidth = -1;
-
- /**
- * Creates a new SDK Target Selector.
- *
- * @param parent The parent composite where the selector will be added.
- * @param targets The list of targets. This is <em>not</em> copied, the caller must not modify.
- * Targets can be null or an empty array, in which case the table is disabled.
- */
- public SdkTargetSelector(Composite parent, IAndroidTarget[] targets) {
- this(parent, targets, true /*allowSelection*/);
- }
-
- /**
- * Creates a new SDK Target Selector.
- *
- * @param parent The parent composite where the selector will be added.
- * @param targets The list of targets. This is <em>not</em> copied, the caller must not modify.
- * Targets can be null or an empty array, in which case the table is disabled.
- * @param allowSelection True if selection is enabled.
- */
- public SdkTargetSelector(Composite parent, IAndroidTarget[] targets, boolean allowSelection) {
- // Layout has 1 column
- mInnerGroup = new Composite(parent, SWT.NONE);
- mInnerGroup.setLayout(new GridLayout());
- mInnerGroup.setLayoutData(new GridData(GridData.FILL_BOTH));
- mInnerGroup.setFont(parent.getFont());
-
- mAllowSelection = allowSelection;
- int style = SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION;
- if (allowSelection) {
- style |= SWT.CHECK;
- }
- mTable = new Table(mInnerGroup, style);
- mTable.setHeaderVisible(true);
- mTable.setLinesVisible(false);
-
- GridData data = new GridData();
- data.grabExcessVerticalSpace = true;
- data.grabExcessHorizontalSpace = true;
- data.horizontalAlignment = GridData.FILL;
- data.verticalAlignment = GridData.FILL;
- mTable.setLayoutData(data);
-
- mDescription = new Label(mInnerGroup, SWT.WRAP);
- mDescription.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
- // create the table columns
- final TableColumn column0 = new TableColumn(mTable, SWT.NONE);
- column0.setText("Target Name");
- final TableColumn column1 = new TableColumn(mTable, SWT.NONE);
- column1.setText("Vendor");
- final TableColumn column2 = new TableColumn(mTable, SWT.NONE);
- column2.setText("Platform");
- final TableColumn column3 = new TableColumn(mTable, SWT.NONE);
- column3.setText("API Level");
-
- adjustColumnsWidth(mTable, column0, column1, column2, column3);
- setupSelectionListener(mTable);
- setTargets(targets);
- setupTooltip(mTable);
- }
-
- /**
- * Returns the layout data of the inner composite widget that contains the target selector.
- * By default the layout data is set to a {@link GridData} with a {@link GridData#FILL_BOTH}
- * mode.
- * <p/>
- * This can be useful if you want to change the {@link GridData#horizontalSpan} for example.
- */
- public Object getLayoutData() {
- return mInnerGroup.getLayoutData();
- }
-
- /**
- * Returns the list of known targets.
- * <p/>
- * This is not a copy. Callers must <em>not</em> modify this array.
- */
- public IAndroidTarget[] getTargets() {
- return mTargets;
- }
-
- /**
- * Changes the targets of the SDK Target Selector.
- *
- * @param targets The list of targets. This is <em>not</em> copied, the caller must not modify.
- */
- public void setTargets(IAndroidTarget[] targets) {
- mTargets = targets;
- if (mTargets != null) {
- Arrays.sort(mTargets, new Comparator<IAndroidTarget>() {
- @Override
- public int compare(IAndroidTarget o1, IAndroidTarget o2) {
- return o1.compareTo(o2);
- }
- });
- }
-
- fillTable(mTable);
- }
-
- /**
- * Sets a selection listener. Set it to null to remove it.
- * The listener will be called <em>after</em> this table processed its selection
- * events so that the caller can see the updated state.
- * <p/>
- * The event's item contains a {@link TableItem}.
- * The {@link TableItem#getData()} contains an {@link IAndroidTarget}.
- * <p/>
- * It is recommended that the caller uses the {@link #getSelected()} method instead.
- *
- * @param selectionListener The new listener or null to remove it.
- */
- public void setSelectionListener(SelectionListener selectionListener) {
- mSelectionListener = selectionListener;
- }
-
- /**
- * Sets the current target selection.
- * <p/>
- * If the selection is actually changed, this will invoke the selection listener
- * (if any) with a null event.
- *
- * @param target the target to be selection
- * @return true if the target could be selected, false otherwise.
- */
- public boolean setSelection(IAndroidTarget target) {
- if (!mAllowSelection) {
- return false;
- }
-
- boolean found = false;
- boolean modified = false;
-
- if (mTable != null && !mTable.isDisposed()) {
- for (TableItem i : mTable.getItems()) {
- if ((IAndroidTarget) i.getData() == target) {
- found = true;
- if (!i.getChecked()) {
- modified = true;
- i.setChecked(true);
- }
- } else if (i.getChecked()) {
- modified = true;
- i.setChecked(false);
- }
- }
- }
-
- if (modified && mSelectionListener != null) {
- mSelectionListener.widgetSelected(null);
- }
-
- return found;
- }
-
- /**
- * Returns the selected item.
- *
- * @return The selected item or null.
- */
- public IAndroidTarget getSelected() {
- if (mTable == null || mTable.isDisposed()) {
- return null;
- }
-
- for (TableItem i : mTable.getItems()) {
- if (i.getChecked()) {
- return (IAndroidTarget) i.getData();
- }
- }
- return null;
- }
-
- /**
- * Adds a listener to adjust the columns width when the parent is resized.
- * <p/>
- * If we need something more fancy, we might want to use this:
- * http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet77.java?view=co
- */
- private void adjustColumnsWidth(final Table table,
- final TableColumn column0,
- final TableColumn column1,
- final TableColumn column2,
- final TableColumn column3) {
- // Add a listener to resize the column to the full width of the table
- table.addControlListener(new ControlAdapter() {
- @Override
- public void controlResized(ControlEvent e) {
- Rectangle r = table.getClientArea();
- int width = r.width;
-
- // On the Mac, the width of the checkbox column is not included (and checkboxes
- // are shown if mAllowSelection=true). Subtract this size from the available
- // width to be distributed among the columns.
- if (mAllowSelection
- && SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_DARWIN) {
- width -= getCheckboxWidth();
- }
-
- column0.setWidth(width * 30 / 100); // 30%
- column1.setWidth(width * 45 / 100); // 45%
- column2.setWidth(width * 15 / 100); // 15%
- column3.setWidth(width * 10 / 100); // 10%
- }
- });
- }
-
-
- /**
- * Creates a selection listener that will check or uncheck the whole line when
- * double-clicked (aka "the default selection").
- */
- private void setupSelectionListener(final Table table) {
- if (!mAllowSelection) {
- return;
- }
-
- // Add a selection listener that will check/uncheck items when they are double-clicked
- table.addSelectionListener(new SelectionListener() {
- /** Default selection means double-click on "most" platforms */
- @Override
- public void widgetDefaultSelected(SelectionEvent e) {
- if (e.item instanceof TableItem) {
- TableItem i = (TableItem) e.item;
- i.setChecked(!i.getChecked());
- enforceSingleSelection(i);
- updateDescription(i);
- }
-
- if (mSelectionListener != null) {
- mSelectionListener.widgetDefaultSelected(e);
- }
- }
-
- @Override
- public void widgetSelected(SelectionEvent e) {
- if (e.item instanceof TableItem) {
- TableItem i = (TableItem) e.item;
- enforceSingleSelection(i);
- updateDescription(i);
- }
-
- if (mSelectionListener != null) {
- mSelectionListener.widgetSelected(e);
- }
- }
-
- /**
- * If we're not in multiple selection mode, uncheck all other
- * items when this one is selected.
- */
- private void enforceSingleSelection(TableItem item) {
- if (item.getChecked()) {
- Table parentTable = item.getParent();
- for (TableItem i2 : parentTable.getItems()) {
- if (i2 != item && i2.getChecked()) {
- i2.setChecked(false);
- }
- }
- }
- }
- });
- }
-
-
- /**
- * Fills the table with all SDK targets.
- * The table columns are:
- * <ul>
- * <li>column 0: sdk name
- * <li>column 1: sdk vendor
- * <li>column 2: sdk api name
- * <li>column 3: sdk version
- * </ul>
- */
- private void fillTable(final Table table) {
-
- if (table == null || table.isDisposed()) {
- return;
- }
-
- table.removeAll();
-
- if (mTargets != null && mTargets.length > 0) {
- table.setEnabled(true);
- for (IAndroidTarget target : mTargets) {
- TableItem item = new TableItem(table, SWT.NONE);
- item.setData(target);
- item.setText(0, target.getName());
- item.setText(1, target.getVendor());
- item.setText(2, target.getVersionName());
- item.setText(3, target.getVersion().getApiString());
- }
- } else {
- table.setEnabled(false);
- TableItem item = new TableItem(table, SWT.NONE);
- item.setData(null);
- item.setText(0, "--");
- item.setText(1, "No target available");
- item.setText(2, "--");
- item.setText(3, "--");
- }
- }
-
- /**
- * Sets up a tooltip that displays the current item description.
- * <p/>
- * Displaying a tooltip over the table looks kind of odd here. Instead we actually
- * display the description in a label under the table.
- */
- private void setupTooltip(final Table table) {
-
- if (table == null || table.isDisposed()) {
- return;
- }
-
- /*
- * Reference:
- * http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet125.java?view=markup
- */
-
- final Listener listener = new Listener() {
- @Override
- public void handleEvent(Event event) {
-
- switch(event.type) {
- case SWT.KeyDown:
- case SWT.MouseExit:
- case SWT.MouseDown:
- return;
-
- case SWT.MouseHover:
- updateDescription(table.getItem(new Point(event.x, event.y)));
- break;
-
- case SWT.Selection:
- if (event.item instanceof TableItem) {
- updateDescription((TableItem) event.item);
- }
- break;
-
- default:
- return;
- }
-
- }
- };
-
- table.addListener(SWT.Dispose, listener);
- table.addListener(SWT.KeyDown, listener);
- table.addListener(SWT.MouseMove, listener);
- table.addListener(SWT.MouseHover, listener);
- }
-
- /**
- * Updates the description label with the description of the item's android target, if any.
- */
- private void updateDescription(TableItem item) {
- if (item != null) {
- Object data = item.getData();
- if (data instanceof IAndroidTarget) {
- String newTooltip = ((IAndroidTarget) data).getDescription();
- mDescription.setText(newTooltip == null ? "" : newTooltip); //$NON-NLS-1$
- }
- }
- }
-
- /** Enables or disables the controls. */
- public void setEnabled(boolean enabled) {
- if (mInnerGroup != null && mTable != null && !mTable.isDisposed()) {
- enableControl(mInnerGroup, enabled);
- }
- }
-
- /** Enables or disables controls; recursive for composite controls. */
- private void enableControl(Control c, boolean enabled) {
- c.setEnabled(enabled);
- if (c instanceof Composite)
- for (Control c2 : ((Composite) c).getChildren()) {
- enableControl(c2, enabled);
- }
- }
-
- /** Computes the width of a checkbox */
- private int getCheckboxWidth() {
- if (sCheckboxWidth == -1) {
- Shell shell = new Shell(mTable.getShell(), SWT.NO_TRIM);
- Button checkBox = new Button(shell, SWT.CHECK);
- sCheckboxWidth = checkBox.computeSize(SWT.DEFAULT, SWT.DEFAULT).x;
- shell.dispose();
- }
-
- return sCheckboxWidth;
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/ToggleButton.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/ToggleButton.java
deleted file mode 100755
index 7c66bcf..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/ToggleButton.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.widgets;
-
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.MouseTrackListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-
-/**
- * A label that can display 2 images depending on its internal state.
- * This acts as a button by firing the {@link SWT#Selection} listener.
- */
-public class ToggleButton extends CLabel {
- private Image[] mImage = new Image[2];
- private String[] mTooltip = new String[2];
- private boolean mMouseIn;
- private int mState = 0;
-
-
- public ToggleButton(
- Composite parent,
- int style,
- Image image1,
- Image image2,
- String tooltip1,
- String tooltip2) {
- super(parent, style);
- mImage[0] = image1;
- mImage[1] = image2;
- mTooltip[0] = tooltip1;
- mTooltip[1] = tooltip2;
- updateImageAndTooltip();
-
- addMouseListener(new MouseListener() {
- @Override
- public void mouseDown(MouseEvent e) {
- // pass
- }
-
- @Override
- public void mouseUp(MouseEvent e) {
- // We select on mouse-up, as it should be properly done since this is the
- // only way a user can cancel a button click by moving out of the button.
- if (mMouseIn && e.button == 1) {
- notifyListeners(SWT.Selection, new Event());
- }
- }
-
- @Override
- public void mouseDoubleClick(MouseEvent e) {
- if (mMouseIn && e.button == 1) {
- notifyListeners(SWT.DefaultSelection, new Event());
- }
- }
- });
-
- addMouseTrackListener(new MouseTrackListener() {
- @Override
- public void mouseExit(MouseEvent e) {
- if (mMouseIn) {
- mMouseIn = false;
- redraw();
- }
- }
-
- @Override
- public void mouseEnter(MouseEvent e) {
- if (!mMouseIn) {
- mMouseIn = true;
- redraw();
- }
- }
-
- @Override
- public void mouseHover(MouseEvent e) {
- // pass
- }
- });
- }
-
- @Override
- public int getStyle() {
- int style = super.getStyle();
- if (mMouseIn) {
- style |= SWT.SHADOW_IN;
- }
- return style;
- }
-
- /**
- * Sets current state.
- * @param state A value 0 or 1.
- */
- public void setState(int state) {
- assert state == 0 || state == 1;
- mState = state;
- updateImageAndTooltip();
- redraw();
- }
-
- /**
- * Returns the current state
- * @return Returns the current state, either 0 or 1.
- */
- public int getState() {
- return mState;
- }
-
- protected void updateImageAndTooltip() {
- setImage(mImage[getState()]);
- setToolTipText(mTooltip[getState()]);
- }
-}
-
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/repository/AvdManagerWindow.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/repository/AvdManagerWindow.java
deleted file mode 100755
index dd34bef..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/repository/AvdManagerWindow.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.repository;
-
-import com.android.sdkuilib.internal.repository.ui.AvdManagerWindowImpl1;
-import com.android.sdkuilib.internal.widgets.AvdSelector;
-import com.android.utils.ILogger;
-
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Opens an AVD Manager Window.
- *
- * This is the public entry point for using the window.
- */
-public class AvdManagerWindow {
-
- /** The actual window implementation to which this class delegates. */
- private AvdManagerWindowImpl1 mWindow;
-
- /**
- * Enum giving some indication of what is invoking this window.
- * The behavior and UI will change slightly depending on the context.
- * <p/>
- * Note: if you add Android support to your specific IDE, you might want
- * to specialize this context enum.
- */
- public enum AvdInvocationContext {
- /**
- * The AVD Manager is invoked from the stand-alone 'android' tool.
- * In this mode, we present an about box, a settings page.
- * For SdkMan2, we also have a menu bar and link to the SDK Manager 2.
- */
- STANDALONE,
-
- /**
- * The AVD Manager is embedded as a dialog in the SDK Manager
- * or in the {@link AvdSelector}.
- * This is similar to the {@link #STANDALONE} mode except we don't need
- * to display a menu bar at all since we don't want a menu item linking
- * back to the SDK Manager and we don't need to redisplay the options
- * and about which are already on the root window.
- */
- DIALOG,
-
- /**
- * The AVD Manager is invoked from an IDE.
- * In this mode, we do not modify the menu bar.
- * There is no about box and no settings.
- */
- IDE,
- }
-
-
- /**
- * Creates a new window. Caller must call open(), which will block.
- *
- * @param parentShell Parent shell.
- * @param sdkLog Logger. Cannot be null.
- * @param osSdkRoot The OS path to the SDK root.
- * @param context The {@link AvdInvocationContext} to change the behavior depending on who's
- * opening the SDK Manager.
- */
- public AvdManagerWindow(
- Shell parentShell,
- ILogger sdkLog,
- String osSdkRoot,
- AvdInvocationContext context) {
- mWindow = new AvdManagerWindowImpl1(
- parentShell,
- sdkLog,
- osSdkRoot,
- context);
- }
-
- /**
- * Opens the window.
- */
- public void open() {
- mWindow.open();
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/repository/ISdkChangeListener.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/repository/ISdkChangeListener.java
deleted file mode 100755
index e221f98..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/repository/ISdkChangeListener.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.repository;
-
-
-/**
- * Interface for listeners on SDK modifications by the SDK Manager UI.
- * This notifies when the SDK manager is first loading the SDK or before/after it installed
- * a package.
- */
-public interface ISdkChangeListener {
- /**
- * Invoked when the content of the SDK is being loaded by the SDK Manager UI
- * for the first time.
- * This is generally followed by a call to {@link #onSdkReload()}
- * or by a call to {@link #preInstallHook()}.
- */
- void onSdkLoaded();
-
- /**
- * Invoked when the SDK Manager UI is about to start installing packages.
- * This will be followed by a call to {@link #postInstallHook()}.
- */
- void preInstallHook();
-
- /**
- * Invoked when the SDK Manager UI is done installing packages.
- * Some new packages might have been installed or the user might have cancelled the operation.
- * This is generally followed by a call to {@link #onSdkReload()}.
- */
- void postInstallHook();
-
- /**
- * Invoked when the content of the SDK is being reloaded by the SDK Manager UI,
- * typically after a package was installed. The SDK content might or might not
- * have changed.
- */
- void onSdkReload();
-}
-
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/repository/SdkUpdaterWindow.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/repository/SdkUpdaterWindow.java
deleted file mode 100755
index 6010e48..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/repository/SdkUpdaterWindow.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.repository;
-
-import com.android.sdkuilib.internal.repository.ISdkUpdaterWindow;
-import com.android.sdkuilib.internal.repository.ui.SdkUpdaterWindowImpl2;
-import com.android.utils.ILogger;
-
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Opens an SDK Manager Window.
- *
- * This is the public entry point for using the window.
- */
-public class SdkUpdaterWindow {
-
- /** The actual window implementation to which this class delegates. */
- private ISdkUpdaterWindow mWindow;
-
- /**
- * Enum giving some indication of what is invoking this window.
- * The behavior and UI will change slightly depending on the context.
- * <p/>
- * Note: if you add Android support to your specific IDE, you might want
- * to specialize this context enum.
- */
- public enum SdkInvocationContext {
- /**
- * The SDK Manager is invoked from the stand-alone 'android' tool.
- * In this mode, we present an about box, a settings page.
- * For SdkMan2, we also have a menu bar and link to the AVD manager.
- */
- STANDALONE,
-
- /**
- * The SDK Manager is invoked from the standalone AVD Manager.
- * This is similar to the standalone mode except that in this case we
- * don't display a menu item linking to the AVD Manager.
- */
- AVD_MANAGER,
-
- /**
- * The SDK Manager is invoked from an IDE.
- * In this mode, we do not modify the menu bar. There is no about box
- * and no settings (e.g. HTTP proxy settings are inherited from Eclipse.)
- */
- IDE,
-
- /**
- * The SDK Manager is invoked from the AVD Selector.
- * For SdkMan1, this means the AVD page will be displayed first.
- * For SdkMan2, we won't be using this.
- */
- AVD_SELECTOR
- }
-
- /**
- * Creates a new window. Caller must call open(), which will block.
- *
- * @param parentShell Parent shell.
- * @param sdkLog Logger. Cannot be null.
- * @param osSdkRoot The OS path to the SDK root.
- * @param context The {@link SdkInvocationContext} to change the behavior depending on who's
- * opening the SDK Manager.
- */
- public SdkUpdaterWindow(
- Shell parentShell,
- ILogger sdkLog,
- String osSdkRoot,
- SdkInvocationContext context) {
-
- mWindow = new SdkUpdaterWindowImpl2(parentShell, sdkLog, osSdkRoot, context);
- }
-
- /**
- * Adds a new listener to be notified when a change is made to the content of the SDK.
- * This should be called before {@link #open()}.
- */
- public void addListener(ISdkChangeListener listener) {
- mWindow.addListener(listener);
- }
-
- /**
- * Removes a new listener to be notified anymore when a change is made to the content of
- * the SDK.
- */
- public void removeListener(ISdkChangeListener listener) {
- mWindow.removeListener(listener);
- }
-
- /**
- * Opens the window.
- */
- public void open() {
- mWindow.open();
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/ui/AuthenticationDialog.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/ui/AuthenticationDialog.java
deleted file mode 100644
index 07e65b7..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/ui/AuthenticationDialog.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.ui;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Dialog which collects from the user his/her login and password.
- */
-public class AuthenticationDialog extends GridDialog {
- private Text mTxtLogin;
- private Text mTxtPassword;
- private Text mTxtWorkstation;
- private Text mTxtDomain;
-
- private String mTitle;
- private String mMessage;
-
- private static String sLogin = "";
- private static String sPassword = "";
- private static String sWorkstation = "";
- private static String sDomain = "";
-
- /**
- * Constructor which retrieves the parent {@link Shell} and the message to
- * be displayed in this dialog.
- *
- * @param parentShell Parent Shell
- * @param title Title of the window.
- * @param message Message the be displayed in this dialog.
- */
- public AuthenticationDialog(Shell parentShell, String title, String message) {
- super(parentShell, 1, false);
- // assign fields
- mTitle = title;
- mMessage = message;
- }
-
- @Override
- public void createDialogContent(Composite parent) {
- // Configure Dialog
- getShell().setText(mTitle);
- GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
- parent.setLayoutData(data);
-
- // Upper Composite
- Composite upperComposite = new Composite(parent, SWT.NONE);
- GridLayout layout = new GridLayout(2, false);
- layout.verticalSpacing = 10;
- upperComposite.setLayout(layout);
- data = new GridData(SWT.FILL, SWT.CENTER, true, true);
- upperComposite.setLayoutData(data);
-
- // add message label
- Label lblMessage = new Label(upperComposite, SWT.WRAP);
- lblMessage.setText(mMessage);
- data = new GridData(SWT.FILL, SWT.CENTER, true, true, 2, 1);
- data.widthHint = 500;
- lblMessage.setLayoutData(data);
-
- // add user name label and text field
- Label lblUserName = new Label(upperComposite, SWT.NONE);
- lblUserName.setText("Login:");
- data = new GridData(SWT.LEFT, SWT.CENTER, false, false);
- lblUserName.setLayoutData(data);
-
- mTxtLogin = new Text(upperComposite, SWT.SINGLE | SWT.BORDER);
- data = new GridData(SWT.FILL, SWT.CENTER, true, false);
- mTxtLogin.setLayoutData(data);
- mTxtLogin.setFocus();
- mTxtLogin.setText(sLogin);
- mTxtLogin.addModifyListener(new ModifyListener() {
- @Override
- public void modifyText(ModifyEvent arg0) {
- sLogin = mTxtLogin.getText().trim();
- }
- });
-
- // add password label and text field
- Label lblPassword = new Label(upperComposite, SWT.NONE);
- lblPassword.setText("Password:");
- data = new GridData(SWT.LEFT, SWT.CENTER, false, false);
- lblPassword.setLayoutData(data);
-
- mTxtPassword = new Text(upperComposite, SWT.SINGLE | SWT.PASSWORD | SWT.BORDER);
- data = new GridData(SWT.FILL, SWT.CENTER, true, false);
- mTxtPassword.setLayoutData(data);
- mTxtPassword.setText(sPassword);
- mTxtPassword.addModifyListener(new ModifyListener() {
- @Override
- public void modifyText(ModifyEvent arg0) {
- sPassword = mTxtPassword.getText();
- }
- });
-
- // add a label indicating that the following two fields are optional
- Label lblInfo = new Label(upperComposite, SWT.NONE);
- lblInfo.setText("Provide the following info if your proxy uses NTLM authentication. Leave blank otherwise.");
- data = new GridData();
- data.horizontalSpan = 2;
- lblInfo.setLayoutData(data);
-
- // add workstation label and text field
- Label lblWorkstation = new Label(upperComposite, SWT.NONE);
- lblWorkstation.setText("Workstation:");
- data = new GridData(SWT.LEFT, SWT.CENTER, false, false);
- lblWorkstation.setLayoutData(data);
-
- mTxtWorkstation = new Text(upperComposite, SWT.SINGLE | SWT.BORDER);
- data = new GridData(SWT.FILL, SWT.CENTER, true, false);
- mTxtWorkstation.setLayoutData(data);
- mTxtWorkstation.setText(sWorkstation);
- mTxtWorkstation.addModifyListener(new ModifyListener() {
- @Override
- public void modifyText(ModifyEvent arg0) {
- sWorkstation = mTxtWorkstation.getText().trim();
- }
- });
-
- // add domain label and text field
- Label lblDomain = new Label(upperComposite, SWT.NONE);
- lblDomain.setText("Domain:");
- data = new GridData(SWT.LEFT, SWT.CENTER, false, false);
- lblDomain.setLayoutData(data);
-
- mTxtDomain = new Text(upperComposite, SWT.SINGLE | SWT.BORDER);
- data = new GridData(SWT.FILL, SWT.CENTER, true, false);
- mTxtDomain.setLayoutData(data);
- mTxtDomain.setText(sDomain);
- mTxtDomain.addModifyListener(new ModifyListener() {
- @Override
- public void modifyText(ModifyEvent arg0) {
- sDomain = mTxtDomain.getText().trim();
- }
- });
- }
-
- /**
- * Retrieves the Login field information
- *
- * @return Login field value or empty String. Return value is never null
- */
- public String getLogin() {
- return sLogin;
- }
-
- /**
- * Retrieves the Password field information
- *
- * @return Password field value or empty String. Return value is never null
- */
- public String getPassword() {
- return sPassword;
- }
-
- /**
- * Retrieves the workstation field information
- *
- * @return Workstation field value or empty String. Return value is never null
- */
- public String getWorkstation() {
- return sWorkstation;
- }
-
- /**
- * Retrieves the domain field information
- *
- * @return Domain field value or empty String. Return value is never null
- */
- public String getDomain() {
- return sDomain;
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/ui/GridDataBuilder.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/ui/GridDataBuilder.java
deleted file mode 100755
index 381dea0..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/ui/GridDataBuilder.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.ui;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * A little helper to create a new {@link GridData} and set its properties.
- * <p/>
- * Example of usage: <br/>
- * <code>
- * GridDataHelper.create(myControl).hSpan(2).hAlignCenter().fill();
- * </code>
- */
-public final class GridDataBuilder {
-
- private GridData mGD;
-
- private GridDataBuilder() {
- mGD = new GridData();
- }
-
- /**
- * Creates new {@link GridData} and associates it on the <code>control</code> composite.
- */
- static public GridDataBuilder create(Control control) {
- GridDataBuilder gdh = new GridDataBuilder();
- control.setLayoutData(gdh.mGD);
- return gdh;
- }
-
- /** Sets <code>widthHint</code> to <code>w</code>. */
- public GridDataBuilder wHint(int w) {
- mGD.widthHint = w;
- return this;
- }
-
- /** Sets <code>heightHint</code> to <code>h</code>. */
- public GridDataBuilder hHint(int h) {
- mGD.heightHint = h;
- return this;
- }
-
- /** Sets <code>horizontalIndent</code> to <code>h</code>. */
- public GridDataBuilder hIndent(int h) {
- mGD.horizontalIndent = h;
- return this;
- }
-
- /** Sets <code>horizontalSpan</code> to <code>h</code>. */
- public GridDataBuilder hSpan(int h) {
- mGD.horizontalSpan = h;
- return this;
- }
-
- /** Sets <code>verticalSpan</code> to <code>v</code>. */
- public GridDataBuilder vSpan(int v) {
- mGD.verticalSpan = v;
- return this;
- }
-
- /** Sets <code>horizontalAlignment</code> to {@link SWT#CENTER}. */
- public GridDataBuilder hCenter() {
- mGD.horizontalAlignment = SWT.CENTER;
- return this;
- }
-
- /** Sets <code>verticalAlignment</code> to {@link SWT#CENTER}. */
- public GridDataBuilder vCenter() {
- mGD.verticalAlignment = SWT.CENTER;
- return this;
- }
-
- /** Sets <code>verticalAlignment</code> to {@link SWT#TOP}. */
- public GridDataBuilder vTop() {
- mGD.verticalAlignment = SWT.TOP;
- return this;
- }
-
- /** Sets <code>verticalAlignment</code> to {@link SWT#BOTTOM}. */
- public GridDataBuilder vBottom() {
- mGD.verticalAlignment = SWT.BOTTOM;
- return this;
- }
-
- /** Sets <code>horizontalAlignment</code> to {@link SWT#LEFT}. */
- public GridDataBuilder hLeft() {
- mGD.horizontalAlignment = SWT.LEFT;
- return this;
- }
-
- /** Sets <code>horizontalAlignment</code> to {@link SWT#RIGHT}. */
- public GridDataBuilder hRight() {
- mGD.horizontalAlignment = SWT.RIGHT;
- return this;
- }
-
- /** Sets <code>horizontalAlignment</code> to {@link GridData#FILL}. */
- public GridDataBuilder hFill() {
- mGD.horizontalAlignment = GridData.FILL;
- return this;
- }
-
- /** Sets <code>verticalAlignment</code> to {@link GridData#FILL}. */
- public GridDataBuilder vFill() {
- mGD.verticalAlignment = GridData.FILL;
- return this;
- }
-
- /**
- * Sets both <code>horizontalAlignment</code> and <code>verticalAlignment</code>
- * to {@link GridData#FILL}.
- */
- public GridDataBuilder fill() {
- mGD.horizontalAlignment = GridData.FILL;
- mGD.verticalAlignment = GridData.FILL;
- return this;
- }
-
- /** Sets <code>grabExcessHorizontalSpace</code> to true. */
- public GridDataBuilder hGrab() {
- mGD.grabExcessHorizontalSpace = true;
- return this;
- }
-
- /** Sets <code>grabExcessVerticalSpace</code> to true. */
- public GridDataBuilder vGrab() {
- mGD.grabExcessVerticalSpace = true;
- return this;
- }
-
- /**
- * Sets both <code>grabExcessHorizontalSpace</code> and
- * <code>grabExcessVerticalSpace</code> to true.
- */
- public GridDataBuilder grab() {
- mGD.grabExcessHorizontalSpace = true;
- mGD.grabExcessVerticalSpace = true;
- return this;
- }
-
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/ui/GridDialog.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/ui/GridDialog.java
deleted file mode 100644
index 9bf9c29..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/ui/GridDialog.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.ui;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-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.Control;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * JFace-based dialog that properly sets up a {@link GridLayout} top composite with the proper
- * margin.
- * <p/>
- * Implementing dialog must create the content of the dialog in
- * {@link #createDialogContent(Composite)}.
- * <p/>
- * A JFace dialog is perfect if you want a typical "OK | cancel" workflow, with the OK and
- * cancel things all handled for you using a predefined layout. If you want a different set
- * of buttons or a different layout, consider {@link SwtBaseDialog} instead.
- */
-public abstract class GridDialog extends Dialog {
-
- private final int mNumColumns;
- private final boolean mMakeColumnsEqualWidth;
-
- /**
- * Creates the dialog
- * @param parentShell the parent {@link Shell}.
- * @param numColumns the number of columns in the grid
- * @param makeColumnsEqualWidth whether or not the columns will have equal width
- */
- public GridDialog(Shell parentShell, int numColumns, boolean makeColumnsEqualWidth) {
- super(parentShell);
- mNumColumns = numColumns;
- mMakeColumnsEqualWidth = makeColumnsEqualWidth;
- }
-
- /**
- * Creates the content of the dialog. The <var>parent</var> composite is a {@link GridLayout}
- * created with the <var>numColumn</var> and <var>makeColumnsEqualWidth</var> parameters
- * passed to {@link #GridDialog(Shell, int, boolean)}.
- * @param parent the parent composite.
- */
- public abstract void createDialogContent(Composite parent);
-
- @Override
- protected Control createDialogArea(Composite parent) {
- Composite top = new Composite(parent, SWT.NONE);
- GridLayout layout = new GridLayout(mNumColumns, mMakeColumnsEqualWidth);
- layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
- layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
- layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
- layout.horizontalSpacing = convertHorizontalDLUsToPixels(
- IDialogConstants.HORIZONTAL_SPACING);
- top.setLayout(layout);
- top.setLayoutData(new GridData(GridData.FILL_BOTH));
-
- createDialogContent(top);
-
- applyDialogFont(top);
- return top;
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/ui/GridLayoutBuilder.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/ui/GridLayoutBuilder.java
deleted file mode 100755
index 7e8c161..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/ui/GridLayoutBuilder.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.ui;
-
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * A little helper to create a new {@link GridLayout}, associate to a {@link Composite}
- * and set its common attributes.
- * <p/>
- * Example of usage: <br/>
- * <code>
- * GridLayoutHelper.create(myComposite).noMargins().vSpacing(0).columns(2);
- * </code>
- */
-public final class GridLayoutBuilder {
-
- private GridLayout mGL;
-
- private GridLayoutBuilder() {
- mGL = new GridLayout();
- }
-
- /**
- * Creates new {@link GridLayout} and associates it on the <code>parent</code> composite.
- */
- static public GridLayoutBuilder create(Composite parent) {
- GridLayoutBuilder glh = new GridLayoutBuilder();
- parent.setLayout(glh.mGL);
- return glh;
- }
-
- /** Sets all margins to 0. */
- public GridLayoutBuilder noMargins() {
- mGL.marginHeight = 0;
- mGL.marginWidth = 0;
- mGL.marginLeft = 0;
- mGL.marginTop = 0;
- mGL.marginRight = 0;
- mGL.marginBottom = 0;
- return this;
- }
-
- /** Sets all margins to <code>n</code>. */
- public GridLayoutBuilder margins(int n) {
- mGL.marginHeight = n;
- mGL.marginWidth = n;
- mGL.marginLeft = n;
- mGL.marginTop = n;
- mGL.marginRight = n;
- mGL.marginBottom = n;
- return this;
- }
-
- /** Sets <code>numColumns</code> to <code>n</code>. */
- public GridLayoutBuilder columns(int n) {
- mGL.numColumns = n;
- return this;
- }
-
- /** Sets <code>makeColumnsEqualWidth</code> to true. */
- public GridLayoutBuilder columnsEqual() {
- mGL.makeColumnsEqualWidth = true;
- return this;
- }
-
- /** Sets <code>verticalSpacing</code> to <code>v</code>. */
- public GridLayoutBuilder vSpacing(int v) {
- mGL.verticalSpacing = v;
- return this;
- }
-
- /** Sets <code>horizontalSpacing</code> to <code>h</code>. */
- public GridLayoutBuilder hSpacing(int h) {
- mGL.horizontalSpacing = h;
- return this;
- }
-
- /**
- * Sets <code>horizontalSpacing</code> and <code>verticalSpacing</code>
- * to <code>s</code>.
- */
- public GridLayoutBuilder spacing(int s) {
- mGL.verticalSpacing = s;
- mGL.horizontalSpacing = s;
- return this;
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/ui/SwtBaseDialog.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/ui/SwtBaseDialog.java
deleted file mode 100755
index bb0210b..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/ui/SwtBaseDialog.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.ui;
-
-import com.android.SdkConstants;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Dialog;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * A base class for an SWT Dialog.
- * <p/>
- * The base class offers the following goodies: <br/>
- * - Dialog is automatically centered on its parent. <br/>
- * - Dialog size is reused during the session. <br/>
- * - A simple API with an {@link #open()} method that returns a boolean. <br/>
- * <p/>
- * A typical usage is:
- * <pre>
- * MyDialog extends SwtBaseDialog { ... }
- * MyDialog d = new MyDialog(parentShell, "My Dialog Title");
- * if (d.open()) {
- * ...do something like refresh parent list view
- * }
- * </pre>
- * We also have a JFace-base {@link GridDialog}.
- * The JFace dialog is good when you just want a typical OK/Cancel layout with the
- * buttons all managed for you.
- * This SWT base dialog has little decoration.
- * It's up to you to manage whatever buttons you want, if any.
- */
-public abstract class SwtBaseDialog extends Dialog {
-
- /**
- * Min Y location for dialog. Need to deal with the menu bar on mac os.
- */
- private final static int MIN_Y =
- SdkConstants.CURRENT_PLATFORM == SdkConstants.PLATFORM_DARWIN ? 20 : 0;
-
- /** Last dialog size for this session, different for each dialog class. */
- private static Map<Class<?>, Point> sLastSizeMap = new HashMap<Class<?>, Point>();
-
- private volatile boolean mQuitRequested = false;
- private boolean mReturnValue;
- private Shell mShell;
-
- /**
- * Create the dialog.
- *
- * @param parent The parent's shell
- * @param title The dialog title. Can be null.
- */
- public SwtBaseDialog(Shell parent, int swtStyle, String title) {
- super(parent, swtStyle);
- if (title != null) {
- setText(title);
- }
- }
-
- /**
- * Open the dialog.
- *
- * @return The last value set using {@link #setReturnValue(boolean)} or false by default.
- */
- public boolean open() {
- if (!mQuitRequested) {
- createShell();
- }
- if (!mQuitRequested) {
- createContents();
- }
- if (!mQuitRequested) {
- positionShell();
- }
- if (!mQuitRequested) {
- postCreate();
- }
- if (!mQuitRequested) {
- mShell.open();
- mShell.layout();
- eventLoop();
- }
-
- return mReturnValue;
- }
-
- /**
- * Creates the shell for this dialog.
- * The default shell has a size of 450x300, which is also its minimum size.
- * You might want to override these values.
- * <p/>
- * Called before {@link #createContents()}.
- */
- protected void createShell() {
- mShell = new Shell(getParent(), SWT.DIALOG_TRIM | SWT.RESIZE | SWT.APPLICATION_MODAL);
- mShell.setMinimumSize(new Point(450, 300));
- mShell.setSize(450, 300);
- if (getText() != null) {
- mShell.setText(getText());
- }
- mShell.addDisposeListener(new DisposeListener() {
- @Override
- public void widgetDisposed(DisposeEvent e) {
- saveSize();
- }
- });
- }
-
- /**
- * Creates the content and attaches it to the current shell (cf. {@link #getShell()}).
- * <p/>
- * Derived classes should consider creating the UI here and initializing their
- * state in {@link #postCreate()}.
- */
- protected abstract void createContents();
-
- /**
- * Called after {@link #createContents()} and after {@link #positionShell()}
- * just before the dialog is actually shown on screen.
- * <p/>
- * Derived classes should consider creating the UI in {@link #createContents()} and
- * initialize it here.
- */
- protected abstract void postCreate();
-
- /**
- * Run the event loop.
- * This is called from {@link #open()} after {@link #postCreate()} and
- * after the window has been shown on screen.
- * Derived classes might want to use this as a place to start automated
- * tasks that will update the UI.
- */
- protected void eventLoop() {
- Display display = getParent().getDisplay();
- while (!mQuitRequested && !mShell.isDisposed()) {
- if (!display.readAndDispatch()) {
- display.sleep();
- }
- }
- }
-
- /**
- * Returns the current value that {@link #open()} will return to the caller.
- * Default is false.
- */
- protected boolean getReturnValue() {
- return mReturnValue;
- }
-
- /**
- * Sets the value that {@link #open()} will return to the caller.
- * @param returnValue The new value to be returned by {@link #open()}.
- */
- protected void setReturnValue(boolean returnValue) {
- mReturnValue = returnValue;
- }
-
- /**
- * Returns the shell created by {@link #createShell()}.
- * @return The current {@link Shell}.
- */
- protected Shell getShell() {
- return mShell;
- }
-
- /**
- * Saves the dialog size and close the dialog.
- * The {@link #open()} method will given return value (see {@link #setReturnValue(boolean)}.
- * <p/>
- * It's safe to call this method before the shell is initialized,
- * in which case the dialog will close as soon as possible.
- */
- protected void close() {
- if (mShell != null && !mShell.isDisposed()) {
- saveSize();
- getShell().close();
- }
- mQuitRequested = true;
- }
-
- //-------
-
- /**
- * Centers the dialog in its parent shell.
- */
- private void positionShell() {
- // Centers the dialog in its parent shell
- Shell child = mShell;
- Shell parent = getParent();
- if (child != null && parent != null) {
- // get the parent client area with a location relative to the display
- Rectangle parentArea = parent.getClientArea();
- Point parentLoc = parent.getLocation();
- int px = parentLoc.x;
- int py = parentLoc.y;
- int pw = parentArea.width;
- int ph = parentArea.height;
-
- // Reuse the last size if there's one, otherwise use the default
- Point childSize = sLastSizeMap.get(this.getClass());
- if (childSize == null) {
- childSize = child.getSize();
- }
- int cw = childSize.x;
- int ch = childSize.y;
-
- int x = px + (pw - cw) / 2;
- if (x < 0) x = 0;
-
- int y = py + (ph - ch) / 2;
- if (y < MIN_Y) y = MIN_Y;
-
- child.setLocation(x, y);
- child.setSize(cw, ch);
- }
- }
-
- private void saveSize() {
- if (mShell != null && !mShell.isDisposed()) {
- sLastSizeMap.put(this.getClass(), mShell.getSize());
- }
- }
-
-}
diff --git a/sdkmanager/libs/sdkuilib/tests/Android.mk b/sdkmanager/libs/sdkuilib/tests/Android.mk
deleted file mode 100644
index a7ba9a7..0000000
--- a/sdkmanager/libs/sdkuilib/tests/Android.mk
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright (C) 2011 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
-#
-# 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.
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-# Only compile source java files in this lib.
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
-
-LOCAL_MODULE := sdkuilib-tests
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_JAVA_LIBRARIES := \
- sdklib \
- sdklib-tests \
- sdkuilib \
- junit \
- swt \
-
-include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/MockDownloadCache.java b/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/MockDownloadCache.java
deleted file mode 100755
index 04f2b04..0000000
--- a/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/MockDownloadCache.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository;
-
-import com.android.annotations.NonNull;
-import com.android.annotations.Nullable;
-import com.android.sdklib.internal.repository.CanceledByUserException;
-import com.android.sdklib.internal.repository.DownloadCache;
-import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.utils.Pair;
-
-import org.apache.http.Header;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.ProtocolVersion;
-import org.apache.http.message.BasicHttpResponse;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.TreeMap;
-
-/** A mock UpdaterData that simply records what would have been installed. */
-public class MockDownloadCache extends DownloadCache {
-
- private final File mCacheRoot;
-
- /** Map url => payload bytes, http code response.
- * If the payload pair is null, an exception such as FNF is thrown. */
- private final Map<String, Payload> mDirectPayloads = new HashMap<String, Payload>();
- /** Map url => payload bytes, http code response.
- * If the payload pair is null, an exception such as FNF is thrown. */
- private final Map<String, Payload> mCachedPayloads = new HashMap<String, Payload>();
-
- private final Map<String, Integer> mDirectHits = new TreeMap<String, Integer>();
- private final Map<String, Integer> mCachedHits = new TreeMap<String, Integer>();
-
- private Strategy mOverrideStrategy;
-
- public final static int THROW_FNF = -1;
-
- /**
- * Creates a download cache with a {@code DIRECT} strategy and
- * no root {@code $HOME/.android} folder, which effectively disables the cache.
- */
- public MockDownloadCache() {
- super(DownloadCache.Strategy.DIRECT);
- mCacheRoot = null;
- }
-
- /**
- * Creates a download with the given strategy and the given cache root.
- */
- public MockDownloadCache(DownloadCache.Strategy strategy, File cacheRoot) {
- super(strategy);
- mCacheRoot = cacheRoot;
- }
-
- @Override
- protected File initCacheRoot() {
- return mCacheRoot;
- }
-
- /**
- * Override the {@link DownloadCache.Strategy} of the cache.
- * This lets us set it temporarily to {@link DownloadCache.Strategy#ONLY_CACHE},
- * which will force {@link #openCachedUrl(String, ITaskMonitor)} to throw an FNF,
- * essentially simulating an empty cache at first.
- * <p/>
- * Setting it back to null reverts the behavior to its default.
- */
- public void overrideStrategy(DownloadCache.Strategy strategy) {
- mOverrideStrategy = strategy;
- }
-
- /**
- * Register a direct payload response.
- *
- * @param url The URL to match.
- * @param httpCode The expected response code.
- * Use {@link #THROW_FNF} to mean an FNF should be thrown (which is what the
- * httpClient stack seems to return instead of {@link HttpStatus#SC_NOT_FOUND}.)
- * @param content The payload to return.
- * As a shortcut a null will be replaced by an empty byte array.
- */
- public void registerDirectPayload(String url, int httpCode, byte[] content) {
- mDirectPayloads.put(url, new Payload(httpCode, content));
- }
-
- /**
- * Register a cached payload response.
- *
- * @param url The URL to match.
- * @param content The payload to return or null to throw a FNF.
- */
- public void registerCachedPayload(String url, byte[] content) {
- mCachedPayloads.put(url,
- new Payload(content == null ? THROW_FNF : HttpStatus.SC_OK, content));
- }
-
- public String[] getDirectHits() {
- ArrayList<String> list = new ArrayList<String>();
- synchronized (mDirectHits) {
- for (Entry<String, Integer> entry : mDirectHits.entrySet()) {
- list.add(String.format("<%1$s : %2$d>",
- entry.getKey(), entry.getValue().intValue()));
- }
- }
- return list.toArray(new String[list.size()]);
- }
-
- public String[] getCachedHits() {
- ArrayList<String> list = new ArrayList<String>();
- synchronized (mCachedHits) {
- for (Entry<String, Integer> entry : mCachedHits.entrySet()) {
- list.add(String.format("<%1$s : %2$d>",
- entry.getKey(), entry.getValue().intValue()));
- }
- }
- return list.toArray(new String[list.size()]);
- }
-
- public void clearDirectHits() {
- synchronized (mDirectHits) {
- mDirectHits.clear();
- }
- }
-
- public void clearCachedHits() {
- synchronized (mCachedHits) {
- mCachedHits.clear();
- }
- }
-
- /**
- * Override openDirectUrl to return one of the registered payloads or throw a FNF exception.
- * This totally ignores the cache's {@link DownloadCache.Strategy}.
- */
- @Override
- public Pair<InputStream, HttpResponse> openDirectUrl(
- @NonNull String urlString,
- @Nullable Header[] headers,
- @NonNull ITaskMonitor monitor) throws IOException, CanceledByUserException {
-
- synchronized (mDirectHits) {
- Integer count = mDirectHits.get(urlString);
- mDirectHits.put(urlString, (count == null ? 0 : count.intValue()) + 1);
- }
-
- Payload payload = mDirectPayloads.get(urlString);
-
- if (payload == null || payload.mHttpCode == THROW_FNF) {
- throw new FileNotFoundException(urlString);
- }
-
- byte[] content = payload.mContent;
- if (content == null) {
- content = new byte[0];
- }
-
- InputStream is = new ByteArrayInputStream(content);
- HttpResponse hr = new BasicHttpResponse(
- new ProtocolVersion("HTTP", 1, 1),
- payload.mHttpCode,
- "Http-Code-" + payload.mHttpCode);
-
- return Pair.of(is, hr);
- }
-
- /**
- * Override openCachedUrl to return one of the registered payloads or throw a FNF exception.
- * This totally ignores the cache's {@link DownloadCache.Strategy}.
- * It will however throw a FNF if {@link #overrideStrategy(Strategy)} is set to
- * {@link DownloadCache.Strategy#ONLY_CACHE}.
- */
- @Override
- public InputStream openCachedUrl(String urlString, ITaskMonitor monitor)
- throws IOException, CanceledByUserException {
-
- synchronized (mCachedHits) {
- Integer count = mCachedHits.get(urlString);
- mCachedHits.put(urlString, (count == null ? 0 : count.intValue()) + 1);
- }
-
- if (Strategy.ONLY_CACHE.equals(mOverrideStrategy)) {
- // Override the cache to read only "local cached" data.
- // In this first phase, we assume there's nothing cached.
- // TODO register first-pass files later.
- throw new FileNotFoundException(urlString);
- }
-
- Payload payload = mCachedPayloads.get(urlString);
-
- if (payload == null || payload.mHttpCode != HttpStatus.SC_OK) {
- throw new FileNotFoundException(urlString);
- }
-
- byte[] content = payload.mContent;
- if (content == null) {
- content = new byte[0];
- }
-
- return new ByteArrayInputStream(content);
- }
-
- private static class Payload {
- final byte[] mContent;
- final int mHttpCode;
-
- Payload(int httpCode, byte[] content) {
- mHttpCode = httpCode;
- mContent = content;
- }
- }
-
-}
diff --git a/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/MockUpdaterData.java b/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/MockUpdaterData.java
deleted file mode 100755
index f19bfcc..0000000
--- a/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/MockUpdaterData.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository;
-
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.internal.repository.DownloadCache;
-import com.android.sdklib.internal.repository.ITask;
-import com.android.sdklib.internal.repository.ITaskFactory;
-import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.MockEmptySdkManager;
-import com.android.sdklib.internal.repository.NullTaskMonitor;
-import com.android.sdklib.internal.repository.archives.ArchiveInstaller;
-import com.android.sdklib.internal.repository.archives.ArchiveReplacement;
-import com.android.sdklib.internal.repository.sources.SdkSourceCategory;
-import com.android.sdklib.internal.repository.sources.SdkSources;
-import com.android.sdklib.mock.MockLog;
-import com.android.sdkuilib.internal.repository.SettingsController.Settings;
-import com.android.sdkuilib.internal.repository.icons.ImageFactory;
-import com.android.utils.ILogger;
-import com.android.utils.NullLogger;
-
-import org.eclipse.swt.graphics.Image;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Properties;
-
-/** A mock UpdaterData that simply records what would have been installed. */
-public class MockUpdaterData extends UpdaterData {
-
- public final static String SDK_PATH = "/tmp/SDK";
-
- private final List<ArchiveReplacement> mInstalled = new ArrayList<ArchiveReplacement>();
-
- private DownloadCache mMockDownloadCache = new MockDownloadCache();
-
- private final SdkSources mMockSdkSources = new SdkSources() {
- @Override
- public void loadUserAddons(ILogger log) {
- // This source does not load user addons.
- removeAll(SdkSourceCategory.USER_ADDONS);
- };
- };
-
- /** Creates a {@link MockUpdaterData} using a {@link MockEmptySdkManager}. */
- public MockUpdaterData() {
- super(SDK_PATH, new MockLog());
-
- setTaskFactory(new MockTaskFactory());
- setImageFactory(new NullImageFactory());
- }
-
- /** Creates a {@link MockUpdaterData} using the given {@link SdkManager}. */
- public MockUpdaterData(SdkManager sdkManager) {
- super(sdkManager.getLocation(), new MockLog());
- setSdkManager(sdkManager);
- setTaskFactory(new MockTaskFactory());
- setImageFactory(new NullImageFactory());
- }
-
- /** Gives access to the internal {@link #installArchives(List, int)}. */
- public void _installArchives(List<ArchiveInfo> result) {
- installArchives(result, 0/*flags*/);
- }
-
- public ArchiveReplacement[] getInstalled() {
- return mInstalled.toArray(new ArchiveReplacement[mInstalled.size()]);
- }
-
- /** Overrides the sdk manager with our mock instance. */
- @Override
- protected void initSdk() {
- setSdkManager(new MockEmptySdkManager(SDK_PATH));
- }
-
- /** Overrides the settings controller with our mock instance. */
- @Override
- protected SettingsController initSettingsController() {
- return createSettingsController(getSdkLog());
- }
-
- /** Override original implementation to do nothing. */
- @Override
- public void reloadSdk() {
- // nop
- }
-
- /**
- * Override original implementation to return a mock SdkSources that
- * does not load user add-ons from the local .android/repository.cfg file.
- */
- @Override
- public SdkSources getSources() {
- return mMockSdkSources;
- }
-
- /** Returns a mock installer that simply records what would have been installed. */
- @Override
- protected ArchiveInstaller createArchiveInstaler() {
- return new ArchiveInstaller() {
- @Override
- public boolean install(
- ArchiveReplacement archiveInfo,
- String osSdkRoot,
- boolean forceHttp,
- SdkManager sdkManager,
- DownloadCache cache,
- ITaskMonitor monitor) {
- mInstalled.add(archiveInfo);
- return true;
- }
- };
- }
-
- /** Returns a mock download cache. */
- @Override
- public DownloadCache getDownloadCache() {
- return mMockDownloadCache;
- }
-
- /** Overrides the mock download cache. */
- public void setMockDownloadCache(DownloadCache mockDownloadCache) {
- mMockDownloadCache = mockDownloadCache;
- }
-
- public void overrideSetting(String key, boolean boolValue) {
- SettingsController sc = getSettingsController();
- assert sc instanceof MockSettingsController;
- ((MockSettingsController)sc).overrideSetting(key, boolValue);
- }
-
- //------------
-
- public static SettingsController createSettingsController(ILogger sdkLog) {
- Properties props = new Properties();
- Settings settings = new Settings(props) {}; // this constructor is protected
- MockSettingsController controller = new MockSettingsController(sdkLog, settings);
- controller.setProperties(props);
- return controller;
- }
-
- static class MockSettingsController extends SettingsController {
-
- private Properties mProperties;
-
- MockSettingsController(ILogger sdkLog, Settings settings) {
- super(sdkLog, settings);
- }
-
- void setProperties(Properties properties) {
- mProperties = properties;
- }
-
- public void overrideSetting(String key, boolean boolValue) {
- mProperties.setProperty(key, Boolean.valueOf(boolValue).toString());
- }
-
- @Override
- public void loadSettings() {
- // This mock setting controller does not load live file settings.
- }
-
- @Override
- public void saveSettings() {
- // This mock setting controller does not save live file settings.
- }
- }
-
- //------------
-
- private class MockTaskFactory implements ITaskFactory {
- @Override
- public void start(String title, ITask task) {
- start(title, null /*parentMonitor*/, task);
- }
-
- @SuppressWarnings("unused") // works by side-effect of creating a new MockTask.
- @Override
- public void start(String title, ITaskMonitor parentMonitor, ITask task) {
- new MockTask(task);
- }
- }
-
- //------------
-
- private static class MockTask extends NullTaskMonitor {
- public MockTask(ITask task) {
- super(NullLogger.getLogger());
- task.run(this);
- }
- }
-
- //------------
-
- private static class NullImageFactory extends ImageFactory {
- public NullImageFactory() {
- // pass
- super(null /*display*/);
- }
-
- @Override
- public Image getImageByName(String imageName) {
- return null;
- }
-
- @Override
- public Image getImageForObject(Object object) {
- return null;
- }
-
- @Override
- public void dispose() {
- // pass
- }
-
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/SdkUpdaterLogicTest.java b/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/SdkUpdaterLogicTest.java
deleted file mode 100755
index 6a93914..0000000
--- a/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/SdkUpdaterLogicTest.java
+++ /dev/null
@@ -1,495 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository;
-
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.internal.avd.AvdManager;
-import com.android.sdklib.internal.repository.DownloadCache;
-import com.android.sdklib.internal.repository.ITaskFactory;
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.packages.FullRevision;
-import com.android.sdklib.internal.repository.packages.MockAddonPackage;
-import com.android.sdklib.internal.repository.packages.MockBrokenPackage;
-import com.android.sdklib.internal.repository.packages.MockPlatformPackage;
-import com.android.sdklib.internal.repository.packages.MockPlatformToolPackage;
-import com.android.sdklib.internal.repository.packages.MockToolPackage;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.internal.repository.sources.SdkSources;
-import com.android.sdkuilib.internal.repository.icons.ImageFactory;
-import com.android.utils.ILogger;
-
-import org.eclipse.swt.widgets.Shell;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-public class SdkUpdaterLogicTest extends TestCase {
-
- private static class NullUpdaterData implements IUpdaterData {
-
- @Override
- public AvdManager getAvdManager() {
- return null;
- }
-
- @Override
- public ImageFactory getImageFactory() {
- return null;
- }
-
- @Override
- public ILogger getSdkLog() {
- return null;
- }
-
- @Override
- public DownloadCache getDownloadCache() {
- return null;
- }
-
- @Override
- public SdkManager getSdkManager() {
- return null;
- }
-
- @Override
- public SettingsController getSettingsController() {
- return null;
- }
-
- @Override
- public ITaskFactory getTaskFactory() {
- return null;
- }
-
- @Override
- public Shell getWindowShell() {
- return null;
- }
-
- }
-
- private static class MockSdkUpdaterLogic extends SdkUpdaterLogic {
- private final Package[] mRemotePackages;
-
- public MockSdkUpdaterLogic(IUpdaterData updaterData, Package[] remotePackages) {
- super(updaterData);
- mRemotePackages = remotePackages;
- }
-
- @Override
- protected void fetchRemotePackages(Collection<Package> remotePkgs,
- SdkSource[] remoteSources) {
- // Ignore remoteSources and instead uses the remotePackages list given to the
- // constructor.
- if (mRemotePackages != null) {
- remotePkgs.addAll(Arrays.asList(mRemotePackages));
- }
- }
- }
-
- /**
- * Addon packages depend on a base platform package.
- * This test checks that UpdaterLogic.findPlatformToolsDependency(...)
- * can find the base platform for a given addon.
- */
- public void testFindAddonDependency() {
- MockSdkUpdaterLogic mul = new MockSdkUpdaterLogic(new NullUpdaterData(), null);
-
- MockPlatformPackage p1 = new MockPlatformPackage(1, 1);
- MockPlatformPackage p2 = new MockPlatformPackage(2, 1);
-
- MockAddonPackage a1 = new MockAddonPackage(p1, 1);
- MockAddonPackage a2 = new MockAddonPackage(p2, 2);
-
- ArrayList<ArchiveInfo> out = new ArrayList<ArchiveInfo>();
- ArrayList<Archive> selected = new ArrayList<Archive>();
- ArrayList<Package> remote = new ArrayList<Package>();
-
- // a2 depends on p2, which is not in the locals
- Package[] localPkgs = { p1, a1 };
- ArchiveInfo[] locals = mul.createLocalArchives(localPkgs);
-
- SdkSource[] sources = null;
-
- // a2 now depends on a "fake" archive info with no newArchive that wraps the missing
- // underlying platform.
- ArchiveInfo fai = mul.findPlatformDependency(a2, out, selected, remote, sources, locals);
- assertNotNull(fai);
- assertNull(fai.getNewArchive());
- assertTrue(fai.isRejected());
- assertEquals(0, out.size());
-
- // p2 is now selected, and should be scheduled for install in out
- Archive p2_archive = p2.getArchives()[0];
- selected.add(p2_archive);
- ArchiveInfo ai2 = mul.findPlatformDependency(a2, out, selected, remote, sources, locals);
- assertNotNull(ai2);
- assertSame(p2_archive, ai2.getNewArchive());
- assertEquals(1, out.size());
- assertSame(p2_archive, out.get(0).getNewArchive());
- }
-
- /**
- * Broken add-on packages require an exact platform package to be present or installed.
- * This tests checks that findExactApiLevelDependency() can find a base
- * platform package for a given broken add-on package.
- */
- public void testFindExactApiLevelDependency() {
- MockSdkUpdaterLogic mul = new MockSdkUpdaterLogic(new NullUpdaterData(), null);
-
- MockPlatformPackage p1 = new MockPlatformPackage(1, 1);
- MockPlatformPackage p2 = new MockPlatformPackage(2, 1);
-
- MockBrokenPackage a1 = new MockBrokenPackage(0, 1);
- MockBrokenPackage a2 = new MockBrokenPackage(0, 2);
-
- ArrayList<ArchiveInfo> out = new ArrayList<ArchiveInfo>();
- ArrayList<Archive> selected = new ArrayList<Archive>();
- ArrayList<Package> remote = new ArrayList<Package>();
-
- // a2 depends on p2, which is not in the locals
- Package[] localPkgs = { p1, a1 };
- ArchiveInfo[] locals = mul.createLocalArchives(localPkgs);
-
- SdkSource[] sources = null;
-
- // a1 depends on p1, which can be found in the locals. p1 is already "installed"
- // so we donn't need to suggest it as a dependency to solve any problem.
- ArchiveInfo found = mul.findExactApiLevelDependency(
- a1, out, selected, remote, sources, locals);
- assertNull(found);
-
- // a2 now depends on a "fake" archive info with no newArchive that wraps the missing
- // underlying platform.
- found = mul.findExactApiLevelDependency(a2, out, selected, remote, sources, locals);
- assertNotNull(found);
- assertNull(found.getNewArchive());
- assertTrue(found.isRejected());
- assertEquals(0, out.size());
-
- // p2 is now selected, and should be scheduled for install in out
- Archive p2_archive = p2.getArchives()[0];
- selected.add(p2_archive);
- found = mul.findExactApiLevelDependency(a2, out, selected, remote, sources, locals);
- assertNotNull(found);
- assertSame(p2_archive, found.getNewArchive());
- assertEquals(1, out.size());
- assertSame(p2_archive, out.get(0).getNewArchive());
- }
-
- /**
- * Platform packages depend on a tool package.
- * This tests checks that UpdaterLogic.findToolsDependency() can find a base
- * tool package for a given platform package.
- */
- public void testFindPlatformDependency() {
- MockSdkUpdaterLogic mul = new MockSdkUpdaterLogic(new NullUpdaterData(), null);
-
- MockPlatformToolPackage pt1 = new MockPlatformToolPackage(1);
-
- MockToolPackage t1 = new MockToolPackage(1, 1);
- MockToolPackage t2 = new MockToolPackage(2, 1);
-
- MockPlatformPackage p2 = new MockPlatformPackage(2, 1, 2);
-
- ArrayList<ArchiveInfo> out = new ArrayList<ArchiveInfo>();
- ArrayList<Archive> selected = new ArrayList<Archive>();
- ArrayList<Package> remote = new ArrayList<Package>();
-
- // p2 depends on t2, which is not locally installed
- Package[] localPkgs = { t1, pt1 };
- ArchiveInfo[] locals = mul.createLocalArchives(localPkgs);
-
- SdkSource[] sources = null;
-
- // p2 now depends on a "fake" archive info with no newArchive that wraps the missing
- // underlying tool
- ArchiveInfo fai = mul.findToolsDependency(p2, out, selected, remote, sources, locals);
- assertNotNull(fai);
- assertNull(fai.getNewArchive());
- assertTrue(fai.isRejected());
- assertEquals(0, out.size());
-
- // t2 is now selected and can be used as a dependency
- Archive t2_archive = t2.getArchives()[0];
- selected.add(t2_archive);
- ArchiveInfo ai2 = mul.findToolsDependency(p2, out, selected, remote, sources, locals);
- assertNotNull(ai2);
- assertSame(t2_archive, ai2.getNewArchive());
- assertEquals(1, out.size());
- assertSame(t2_archive, out.get(0).getNewArchive());
- }
-
- /**
- * Tool packages require a platform-tool package to be present or installed.
- * This tests checks that UpdaterLogic.findPlatformToolsDependency() can find a base
- * platform-tool package for a given tool package.
- */
- public void testFindPlatformToolDependency() {
- MockSdkUpdaterLogic mul = new MockSdkUpdaterLogic(new NullUpdaterData(), null);
-
- MockPlatformToolPackage t1 = new MockPlatformToolPackage(1);
- MockPlatformToolPackage t2 = new MockPlatformToolPackage(2);
-
- MockToolPackage p2 = new MockToolPackage(2, 2);
-
- ArrayList<ArchiveInfo> out = new ArrayList<ArchiveInfo>();
- ArrayList<Archive> selected = new ArrayList<Archive>();
- ArrayList<Package> remote = new ArrayList<Package>();
-
- // p2 depends on t2, which is not locally installed
- Package[] localPkgs = { t1 };
- ArchiveInfo[] locals = mul.createLocalArchives(localPkgs);
-
- SdkSource[] sources = null;
-
- // p2 now depends on a "fake" archive info with no newArchive that wraps the missing
- // underlying tool
- ArchiveInfo fai = mul.findPlatformToolsDependency(
- p2, out, selected, remote, sources, locals);
- assertNotNull(fai);
- assertNull(fai.getNewArchive());
- assertTrue(fai.isRejected());
- assertEquals(0, out.size());
-
- // t2 is now selected and can be used as a dependency
- Archive t2_archive = t2.getArchives()[0];
- selected.add(t2_archive);
- ArchiveInfo ai2 = mul.findPlatformToolsDependency(
- p2, out, selected, remote, sources, locals);
- assertNotNull(ai2);
- assertSame(t2_archive, ai2.getNewArchive());
- assertEquals(1, out.size());
- assertSame(t2_archive, out.get(0).getNewArchive());
- }
-
- public void testComputeRevisionUpdate() {
- // Scenario:
- // - user has tools rev 7 installed + plat-tools rev 1 installed
- // - server has tools rev 8, depending on plat-tools rev 2
- // - server has tools rev 9, depending on plat-tools rev 3
- // - server has platform 9 that requires min-tools-rev 9
- //
- // If we do an update all, we want to the installer to pick up:
- // - the new platform 9
- // - the tools rev 9 (required by platform 9)
- // - the plat-tools rev 3 (required by tools rev 9)
-
- final MockPlatformToolPackage pt1 = new MockPlatformToolPackage(1);
- final MockPlatformToolPackage pt2 = new MockPlatformToolPackage(2);
- final MockPlatformToolPackage pt3 = new MockPlatformToolPackage(3);
-
- final MockToolPackage t7 = new MockToolPackage(7, 1 /*min-plat-tools*/);
- final MockToolPackage t8 = new MockToolPackage(8, 2 /*min-plat-tools*/);
- final MockToolPackage t9 = new MockToolPackage(9, 3 /*min-plat-tools*/);
-
- final MockPlatformPackage p9 = new MockPlatformPackage(9, 1, 9 /*min-tools*/);
-
- // Note: the mock updater logic gets the remotes packages from the array given
- // here and bypasses the source (to avoid fetching any actual URLs)
- MockSdkUpdaterLogic mul = new MockSdkUpdaterLogic(new NullUpdaterData(),
- new Package[] { t8, pt2, t9, pt3, p9 });
-
- SdkSources sources = new SdkSources();
- Package[] localPkgs = { t7, pt1 };
-
- List<ArchiveInfo> selected = mul.computeUpdates(
- null /*selectedArchives*/,
- sources,
- localPkgs,
- false /*includeObsoletes*/);
-
- assertEquals(
- "[Android SDK Platform-tools, revision 3, " +
- "Android SDK Tools, revision 9]",
- Arrays.toString(selected.toArray()));
-
- mul.addNewPlatforms(
- selected,
- sources,
- localPkgs,
- false /*includeObsoletes*/);
-
- assertEquals(
- "[Android SDK Platform-tools, revision 3, " +
- "Android SDK Tools, revision 9, " +
- "SDK Platform Android android-9, API 9, revision 1]",
- Arrays.toString(selected.toArray()));
-
- // Now try again but reverse the order of the remote package list.
-
- mul = new MockSdkUpdaterLogic(new NullUpdaterData(),
- new Package[] { p9, t9, pt3, t8, pt2 });
-
- selected = mul.computeUpdates(
- null /*selectedArchives*/,
- sources,
- localPkgs,
- false /*includeObsoletes*/);
-
- assertEquals(
- "[Android SDK Platform-tools, revision 3, " +
- "Android SDK Tools, revision 9]",
- Arrays.toString(selected.toArray()));
-
- mul.addNewPlatforms(
- selected,
- sources,
- localPkgs,
- false /*includeObsoletes*/);
-
- assertEquals(
- "[Android SDK Platform-tools, revision 3, " +
- "Android SDK Tools, revision 9, " +
- "SDK Platform Android android-9, API 9, revision 1]",
- Arrays.toString(selected.toArray()));
- }
-
- public void testComputeRevisionUpdate2() {
- // Scenario:
- // - user has tools rev 2 installed and NO platform-tools
- // - server has platform tools 1 rc 1 (a preview) and 2.
- // - server has platform 2 that requires min-tools 2 that requires min-plat-tools 1rc1.
- //
- // One issue is that when there was only one instance of platform-tools possible,
- // the computeUpdates() code would pick the first one. But now there can be 2 of
- // them (preview, non-preview) and thus we need to pick up the higher one even if
- // it's not the first choice.
-
- final MockPlatformToolPackage pt1rc = new MockPlatformToolPackage(
- null,
- new FullRevision(1, 0, 0, 1));
- final MockPlatformToolPackage pt2 = new MockPlatformToolPackage(2);
-
- // Tools rev 2 requires at least plat-tools 1rc1
- final MockToolPackage t2 = new MockToolPackage(null,
- new FullRevision(2), // tools rev
- new FullRevision(1, 0, 0, 1)); // min-pt-rev
-
- final MockPlatformPackage p2 = new MockPlatformPackage(2, 1, 2 /*min-tools*/);
-
- // Note: the mock updater logic gets the remotes packages from the array given
- // here and bypasses the source (to avoid fetching any actual URLs)
- // Remote available packages include both plat-tools 1rc1 and 2.
- //
- // Order DOES matter: the issue is that computeUpdates was selecting the first platform
- // tools (so 1rc1) and ignoring the newer revision 2 because originally there could be
- // only one platform-tool definition. Now with previews we can have 2 and we need to
- // select the higher one even if it's not the first choice.
- MockSdkUpdaterLogic mul = new MockSdkUpdaterLogic(new NullUpdaterData(),
- new Package[] { t2, pt1rc, pt2, p2 });
-
- // Local packages only have tools 2.
- SdkSources sources = new SdkSources();
- Package[] localPkgs = { t2 };
- List<Archive> selectedArchives = Arrays.asList( p2.getArchives() );
-
- List<ArchiveInfo> selected = mul.computeUpdates(
- selectedArchives,
- sources,
- localPkgs,
- false /*includeObsoletes*/);
-
- assertEquals(
- "[SDK Platform Android android-2, API 2, revision 1, " +
- "Android SDK Platform-tools, revision 2]",
- Arrays.toString(selected.toArray()));
-
- mul.addNewPlatforms(
- selected,
- sources,
- localPkgs,
- false /*includeObsoletes*/);
-
- assertEquals(
- "[SDK Platform Android android-2, API 2, revision 1, " +
- "Android SDK Platform-tools, revision 2]",
- Arrays.toString(selected.toArray()));
- }
-
- public void testComputeRevisionUpdate3() {
- // Scenario:
- // - user has tools rev 2 installed and NO platform-tools
- // - server has platform tools 1 rc 1 (a preview) and 2.
- // - server has platform 2 that requires min-tools 2 that requires min-plat-tools 1rc1.
- //
- // One issue is that when there was only one instance of tools possible,
- // the computeUpdates() code would pick the first one. But now there can be 2 of
- // them (preview, non-preview) and thus we need to pick up the higher one even if
- // it's not the first choice.
-
- final MockPlatformToolPackage pt1rc = new MockPlatformToolPackage(
- null,
- new FullRevision(1, 0, 0, 1));
- final MockPlatformToolPackage pt2 = new MockPlatformToolPackage(2);
-
- // Tools rev 1rc1 requires plat-tools 1rc1, and tools 2 requires plat-tools 2.
- final MockToolPackage t1rc = new MockToolPackage(null,
- new FullRevision(1, 0, 0, 1), // tools rev
- new FullRevision(1, 0, 0, 1)); // min-pt-rev
- final MockToolPackage t2 = new MockToolPackage(null, 2, 2);
-
- // Platform depends on min-tools 1rc1, so any of tools 1rc1 or 2 would satisfy.
- final MockPlatformPackage p2 = new MockPlatformPackage(2, 1, new FullRevision(1, 0, 0, 1));
-
- // Note: the mock updater logic gets the remotes packages from the array given
- // here and bypasses the source (to avoid fetching any actual URLs)
- // Remote available packages include both plat-tools 1rc1 and 2.
- //
- // Order DOES matter: the issue is that computeUpdates was selecting the first tools (1rc1)
- // and ignoring the newer revision 2 because originally there could be only one tool
- // definition. Now with previews we can have 2 and we need to select the higher version
- // available even if it's not the first choice.
- MockSdkUpdaterLogic mul = new MockSdkUpdaterLogic(new NullUpdaterData(),
- new Package[] { t1rc, pt1rc, t2, pt2, p2 });
-
- // Local packages only have tools 2.
- SdkSources sources = new SdkSources();
- Package[] localPkgs = { };
- List<Archive> selectedArchives = Arrays.asList( p2.getArchives() );
-
- List<ArchiveInfo> selected = mul.computeUpdates(
- selectedArchives,
- sources,
- localPkgs,
- false /*includeObsoletes*/);
-
- assertEquals(
- "[Android SDK Platform-tools, revision 2, " +
- "Android SDK Tools, revision 2, " +
- "SDK Platform Android android-2, API 2, revision 1]",
- Arrays.toString(selected.toArray()));
-
- mul.addNewPlatforms(
- selected,
- sources,
- localPkgs,
- false /*includeObsoletes*/);
-
- assertEquals(
- "[Android SDK Platform-tools, revision 2, " +
- "Android SDK Tools, revision 2, " +
- "SDK Platform Android android-2, API 2, revision 1]",
- Arrays.toString(selected.toArray()));
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/UpdaterDataTest.java b/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/UpdaterDataTest.java
deleted file mode 100755
index 6b8c850..0000000
--- a/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/UpdaterDataTest.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository;
-
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.packages.MockEmptyPackage;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-
-import junit.framework.TestCase;
-
-public class UpdaterDataTest extends TestCase {
-
- private MockUpdaterData m;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- m = new MockUpdaterData();
- assertEquals("[]", Arrays.toString(m.getInstalled()));
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- /**
- * Tests the case where we have nothing to install.
- */
- public void testInstallArchives_None() {
- m._installArchives(new ArrayList<ArchiveInfo>());
- assertEquals("[]", Arrays.toString(m.getInstalled()));
- }
-
-
- /**
- * Tests the case where there's a simple dependency, in the right order
- * (e.g. install A1 then A2 that depends on A1).
- */
- public void testInstallArchives_SimpleDependency() {
-
- ArrayList<ArchiveInfo> archives = new ArrayList<ArchiveInfo>();
-
- Archive a1 = new MockEmptyPackage("a1").getLocalArchive();
- ArchiveInfo ai1 = new ArchiveInfo(a1, null, null);
-
- Archive a2 = new MockEmptyPackage("a2").getLocalArchive();
- ArchiveInfo ai2 = new ArchiveInfo(a2, null, new ArchiveInfo[] { ai1 } );
-
- archives.add(ai1);
- archives.add(ai2);
-
- m._installArchives(archives);
- assertEquals(
- "[MockEmptyPackage 'a1', MockEmptyPackage 'a2']",
- Arrays.toString(m.getInstalled()));
- }
-
- /**
- * Tests the case where there's a simple dependency, in the wrong order
- * (e.g. install A2 then A1 which A2 depends on)
- */
- public void testInstallArchives_ReverseDependency() {
-
- ArrayList<ArchiveInfo> archives = new ArrayList<ArchiveInfo>();
-
- Archive a1 = new MockEmptyPackage("a1").getLocalArchive();
- ArchiveInfo ai1 = new ArchiveInfo(a1, null, null);
-
- Archive a2 = new MockEmptyPackage("a2").getLocalArchive();
- ArchiveInfo ai2 = new ArchiveInfo(a2, null, new ArchiveInfo[] { ai1 } );
-
- archives.add(ai2);
- archives.add(ai1);
-
- m._installArchives(archives);
- assertEquals(
- "[MockEmptyPackage 'a1', MockEmptyPackage 'a2']",
- Arrays.toString(m.getInstalled()));
- }
-
-}
diff --git a/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/core/PackagesDiffLogicTest.java b/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/core/PackagesDiffLogicTest.java
deleted file mode 100755
index 1f7a27a..0000000
--- a/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/core/PackagesDiffLogicTest.java
+++ /dev/null
@@ -1,1814 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository.core;
-
-import com.android.SdkConstants;
-import com.android.sdklib.internal.repository.packages.BrokenPackage;
-import com.android.sdklib.internal.repository.packages.FullRevision;
-import com.android.sdklib.internal.repository.packages.MockAddonPackage;
-import com.android.sdklib.internal.repository.packages.MockBrokenPackage;
-import com.android.sdklib.internal.repository.packages.MockEmptyPackage;
-import com.android.sdklib.internal.repository.packages.MockExtraPackage;
-import com.android.sdklib.internal.repository.packages.MockPlatformPackage;
-import com.android.sdklib.internal.repository.packages.MockPlatformToolPackage;
-import com.android.sdklib.internal.repository.packages.MockSystemImagePackage;
-import com.android.sdklib.internal.repository.packages.MockToolPackage;
-import com.android.sdklib.internal.repository.packages.Package;
-import com.android.sdklib.internal.repository.sources.SdkRepoSource;
-import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.repository.PkgProps;
-import com.android.sdkuilib.internal.repository.ISettingsPage;
-import com.android.sdkuilib.internal.repository.MockUpdaterData;
-import com.android.sdkuilib.internal.repository.core.PackagesDiffLogic;
-import com.android.sdkuilib.internal.repository.core.PkgCategory;
-import com.android.sdkuilib.internal.repository.core.PkgItem;
-
-import java.util.Properties;
-
-import junit.framework.TestCase;
-
-public class PackagesDiffLogicTest extends TestCase {
-
- private PackagesDiffLogic m;
- private MockUpdaterData u;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
-
- u = new MockUpdaterData();
- m = new PackagesDiffLogic(u);
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- // ----
- //
- // Test Details Note: the way load is implemented in PackageLoader, the
- // loader processes each source and then for each source the packages are added
- // to a list and the sorting algorithm is called with that list. Thus for
- // one load, many calls to the sortByX/Y happen, with the list progressively
- // being populated.
- // However when the user switches sorting algorithm, the package list is not
- // reloaded and is processed at once.
-
- public void testSortByApi_Empty() {
- m.updateStart();
- assertFalse(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[0]));
- assertFalse(m.updateEnd(true /*sortByApi*/));
-
- // We also keep these 2 categories even if they contain nothing
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n",
- getTree(m, true /*displaySortByApi*/));
- }
-
- public void testSortByApi_AddSamePackage() {
- SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1");
-
- m.updateStart();
- // First insert local packages
- assertTrue(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockEmptyPackage(src1, "some pkg", 1)
- }));
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'some pkg' rev=1>\n",
- getTree(m, true /*displaySortByApi*/));
-
- // Insert the next source
- // Same package as the one installed, so we don't display it
- assertFalse(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockEmptyPackage(src1, "some pkg", 1)
- }));
-
- assertFalse(m.updateEnd(true /*sortByApi*/));
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'some pkg' rev=1>\n",
- getTree(m, true /*displaySortByApi*/));
- }
-
- public void testSortByApi_AddOtherPackage() {
- SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1");
-
- m.updateStart();
- // First insert local packages
- assertTrue(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockEmptyPackage(src1, "some pkg", 1)
- }));
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'some pkg' rev=1>\n",
- getTree(m, true /*displaySortByApi*/));
-
- // Insert the next source
- // Not the same package as the one installed, so we'll display it
- assertTrue(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockEmptyPackage(src1, "other pkg", 1)
- }));
-
- assertFalse(m.updateEnd(true /*sortByApi*/));
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=2>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'some pkg' rev=1>\n" +
- "-- <NEW, pkg:MockEmptyPackage 'other pkg' rev=1>\n",
- getTree(m, true /*displaySortByApi*/));
- }
-
- public void testSortByApi_Update1() {
- SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1");
-
- // Typical case: user has a locally installed package in revision 1
- // The display list after sort should show that installed package.
- m.updateStart();
- // First insert local packages
- assertTrue(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockEmptyPackage(src1, "type1", 1)
- }));
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1>\n",
- getTree(m, true /*displaySortByApi*/));
-
- assertTrue(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockEmptyPackage(src1, "type1", 4),
- new MockEmptyPackage(src1, "type1", 2)
- }));
-
- assertFalse(m.updateEnd(true /*sortByApi*/));
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=4>\n",
- getTree(m, true /*displaySortByApi*/));
- }
-
- public void testSortByApi_Reload() {
- SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1");
-
- // First load reveals a package local package and its update
- m.updateStart();
- // First insert local packages
- assertTrue(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockEmptyPackage(src1, "type1", 1)
- }));
- assertTrue(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockEmptyPackage(src1, "type1", 2)
- }));
-
- assertFalse(m.updateEnd(true /*sortByApi*/));
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n",
- getTree(m, true /*displaySortByApi*/));
-
- // Now simulate a reload that clears the package list and creates similar
- // objects but not the same references. The only difference is that updateXyz
- // returns false since nothing changes.
-
- m.updateStart();
- // First insert local packages
- assertFalse(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockEmptyPackage(src1, "type1", 1)
- }));
- assertFalse(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockEmptyPackage(src1, "type1", 2)
- }));
-
- assertFalse(m.updateEnd(true /*sortByApi*/));
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n",
- getTree(m, true /*displaySortByApi*/));
- }
-
- public void testSortByApi_InstallPackage() {
- SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1");
-
- // First load reveals a new package
- m.updateStart();
- // No local packages at first
- assertFalse(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[0]));
- assertTrue(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockEmptyPackage(src1, "type1", 1)
- }));
-
- assertFalse(m.updateEnd(true /*sortByApi*/));
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" +
- "-- <NEW, pkg:MockEmptyPackage 'type1' rev=1>\n",
- getTree(m, true /*displaySortByApi*/));
-
- // Install it.
- m.updateStart();
- // local packages
- assertTrue(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockEmptyPackage(src1, "type1", 1)
- }));
- assertFalse(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockEmptyPackage(src1, "type1", 1)
- }));
-
- assertTrue(m.updateEnd(true /*sortByApi*/));
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1>\n",
- getTree(m, true /*displaySortByApi*/));
-
- // Load reveals an update
- m.updateStart();
- // local packages
- assertFalse(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockEmptyPackage(src1, "type1", 1)
- }));
- assertTrue(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockEmptyPackage(src1, "type1", 2)
- }));
-
- assertFalse(m.updateEnd(true /*sortByApi*/));
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n",
- getTree(m, true /*displaySortByApi*/));
- }
-
- public void testSortByApi_DeletePackage() {
- SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1");
-
- // We have an installed package
- m.updateStart();
- // local packages
- assertTrue(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockEmptyPackage(src1, "type1", 1)
- }));
- assertTrue(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockEmptyPackage(src1, "type1", 2)
- }));
-
- assertFalse(m.updateEnd(true /*sortByApi*/));
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n",
- getTree(m, true /*displaySortByApi*/));
-
- // User now deletes the installed package.
- m.updateStart();
- // No local packages
- assertTrue(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[0]));
- assertTrue(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockEmptyPackage(src1, "type1", 1)
- }));
-
- assertFalse(m.updateEnd(true /*sortByApi*/));
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" +
- "-- <NEW, pkg:MockEmptyPackage 'type1' rev=1>\n",
- getTree(m, true /*displaySortByApi*/));
- }
-
- public void testSortByApi_NoRemoteSources() {
- SdkSource src1 = new SdkRepoSource("http://example.com/url1", "repo1");
- SdkSource src2 = new SdkRepoSource("http://example.com/url2", "repo2");
-
- // We have a couple installed packages
- m.updateStart();
- // local packages
- assertTrue(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockToolPackage(src1, 10, 3),
- new MockPlatformToolPackage(src1, 3),
- new MockExtraPackage(src2, "carrier", "custom_rom", 1, 0),
- new MockExtraPackage(src2, "android", "usb_driver", 5, 3),
- }));
- // and no remote sources have been loaded (e.g. because there's no network)
- assertFalse(m.updateEnd(true /*sortByApi*/));
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 10>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=2>\n" +
- "-- <INSTALLED, pkg:Android USB Driver, revision 5>\n" +
- "-- <INSTALLED, pkg:Carrier Custom Rom, revision 1>\n",
- getTree(m, true /*displaySortByApi*/));
-
- assertEquals(
- "PkgCategorySource <source=repo1 (example.com), #items=2>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 10>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" +
- "PkgCategorySource <source=repo2 (example.com), #items=2>\n" +
- "-- <INSTALLED, pkg:Android USB Driver, revision 5>\n" +
- "-- <INSTALLED, pkg:Carrier Custom Rom, revision 1>\n",
- getTree(m, false /*displaySortByApi*/));
- }
-
- public void testSortByApi_CompleteUpdate() {
- SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1");
- SdkSource src2 = new SdkRepoSource("http://2.example.com/url2", "repo2");
-
- // Resulting categories are sorted by Tools, descending platform API and finally Extras.
- // Addons are sorted by name within their API.
- // Extras are sorted by vendor name.
- // The order packages are added to the mAllPkgItems list is purposedly different from
- // the final order we get.
-
- // First update has the typical tools and a couple extras
- m.updateStart();
-
- assertTrue(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockToolPackage(src1, 10, 3),
- new MockPlatformToolPackage(src1, 3),
- new MockExtraPackage(src1, "android", "usb_driver", 4, 3),
- }));
- assertTrue(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockToolPackage(src1, 10, 3),
- new MockPlatformToolPackage(src1, 3),
- new MockExtraPackage(src1, "carrier", "custom_rom", 1, 0),
- new MockExtraPackage(src1, "android", "usb_driver", 5, 3),
- }));
- assertFalse(m.updateEnd(true /*sortByApi*/));
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 10>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=2>\n" +
- "-- <INSTALLED, pkg:Android USB Driver, revision 4, updated by:Android USB Driver, revision 5>\n" +
- "-- <NEW, pkg:Carrier Custom Rom, revision 1>\n",
- getTree(m, true /*displaySortByApi*/));
-
- // Next update adds platforms and addon, sorted in a category based on their API level
- m.updateStart();
- MockPlatformPackage p1;
- MockPlatformPackage p2;
- @SuppressWarnings("unused") // keep p3 for clarity
- MockPlatformPackage p3;
-
- assertTrue(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockToolPackage(src1, 10, 3),
- new MockPlatformToolPackage(src1, 3),
- new MockExtraPackage(src1, "android", "usb_driver", 4, 3),
- // second update
- p1 = new MockPlatformPackage(src1, 1, 2, 3), // API 1
- p3 = new MockPlatformPackage(src1, 3, 6, 3),
- new MockAddonPackage(src2, "addon A", p1, 5),
- new MockAddonPackage(src2, "addon D", p1, 10),
- }));
- assertTrue(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockToolPackage(src1, 10, 3),
- new MockPlatformToolPackage(src1, 3),
- new MockExtraPackage(src1, "carrier", "custom_rom", 1, 0),
- new MockExtraPackage(src1, "android", "usb_driver", 5, 3),
- // second update
- p2 = new MockPlatformPackage(src1, 2, 4, 3), // API 2
- }));
- assertTrue(m.updateSourcePackages(true /*sortByApi*/, src2, new Package[] {
- new MockAddonPackage(src2, "addon C", p2, 9),
- new MockAddonPackage(src2, "addon A", p1, 6),
- // the rev 7+8 will be ignored since there's a rev 9 coming after
- new MockAddonPackage(src2, "addon B", p2, 7),
- new MockAddonPackage(src2, "addon B", p2, 8),
- new MockAddonPackage(src2, "addon B", p2, 9),
- // 11+12 should be ignored updates, 13 will update 10
- new MockAddonPackage(src2, "addon D", p1, 10),
- new MockAddonPackage(src2, "addon D", p1, 12), // note: 12 listed before 11
- new MockAddonPackage(src2, "addon D", p1, 11),
- new MockAddonPackage(src2, "addon D", p1, 13),
- }));
- assertFalse(m.updateEnd(true /*sortByApi*/));
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 10>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" +
- "PkgCategoryApi <API=API 3, label=Android android-3 (API 3), #items=1>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-3, API 3, revision 6>\n" +
- "PkgCategoryApi <API=API 2, label=Android android-2 (API 2), #items=3>\n" +
- "-- <NEW, pkg:SDK Platform Android android-2, API 2, revision 4>\n" +
- "-- <NEW, pkg:The addon B from vendor 2, Android API 2, revision 9>\n" +
- "-- <NEW, pkg:The addon C from vendor 2, Android API 2, revision 9>\n" +
- "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=3>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
- "-- <INSTALLED, pkg:The addon A from vendor 1, Android API 1, revision 5, updated by:The addon A from vendor 1, Android API 1, revision 6>\n" +
- "-- <INSTALLED, pkg:The addon D from vendor 1, Android API 1, revision 10, updated by:The addon D from vendor 1, Android API 1, revision 13>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=2>\n" +
- "-- <INSTALLED, pkg:Android USB Driver, revision 4, updated by:Android USB Driver, revision 5>\n" +
- "-- <NEW, pkg:Carrier Custom Rom, revision 1>\n",
- getTree(m, true /*displaySortByApi*/));
-
- // Reloading the same thing should have no impact except for the update methods
- // returning false when they don't change the current list.
- m.updateStart();
-
- assertFalse(m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockToolPackage(src1, 10, 3),
- new MockPlatformToolPackage(src1, 3),
- new MockExtraPackage(src1, "android", "usb_driver", 4, 3),
- // second update
- p1 = new MockPlatformPackage(src1, 1, 2, 3),
- p3 = new MockPlatformPackage(src1, 3, 6, 3),
- new MockAddonPackage(src2, "addon A", p1, 5),
- new MockAddonPackage(src2, "addon D", p1, 10),
- }));
- assertFalse(m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockToolPackage(src1, 10, 3),
- new MockPlatformToolPackage(src1, 3),
- new MockExtraPackage(src1, "carrier", "custom_rom", 1, 0),
- new MockExtraPackage(src1, "android", "usb_driver", 5, 3),
- // second update
- p2 = new MockPlatformPackage(src1, 2, 4, 3),
- }));
- assertTrue(m.updateSourcePackages(true /*sortByApi*/, src2, new Package[] {
- new MockAddonPackage(src2, "addon C", p2, 9),
- new MockAddonPackage(src2, "addon A", p1, 6),
- // the rev 7+8 will be ignored since there's a rev 9 coming after
- new MockAddonPackage(src2, "addon B", p2, 7),
- new MockAddonPackage(src2, "addon B", p2, 8),
- new MockAddonPackage(src2, "addon B", p2, 9),
- // 11+12 should be ignored updates, 13 will update 10
- new MockAddonPackage(src2, "addon D", p1, 10),
- new MockAddonPackage(src2, "addon D", p1, 12), // note: 12 listed before 11
- new MockAddonPackage(src2, "addon D", p1, 11),
- new MockAddonPackage(src2, "addon D", p1, 13),
- }));
- assertFalse(m.updateEnd(true /*sortByApi*/));
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 10>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" +
- "PkgCategoryApi <API=API 3, label=Android android-3 (API 3), #items=1>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-3, API 3, revision 6>\n" +
- "PkgCategoryApi <API=API 2, label=Android android-2 (API 2), #items=3>\n" +
- "-- <NEW, pkg:SDK Platform Android android-2, API 2, revision 4>\n" +
- "-- <NEW, pkg:The addon B from vendor 2, Android API 2, revision 9>\n" +
- "-- <NEW, pkg:The addon C from vendor 2, Android API 2, revision 9>\n" +
- "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=3>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
- "-- <INSTALLED, pkg:The addon A from vendor 1, Android API 1, revision 5, updated by:The addon A from vendor 1, Android API 1, revision 6>\n" +
- "-- <INSTALLED, pkg:The addon D from vendor 1, Android API 1, revision 10, updated by:The addon D from vendor 1, Android API 1, revision 13>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=2>\n" +
- "-- <INSTALLED, pkg:Android USB Driver, revision 4, updated by:Android USB Driver, revision 5>\n" +
- "-- <NEW, pkg:Carrier Custom Rom, revision 1>\n",
- getTree(m, true /*displaySortByApi*/));
- }
-
- // ----
-
- public void testSortBySource_Empty() {
- m.updateStart();
- assertFalse(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[0]));
- // UpdateEnd returns true since it removed the synthetic "unknown source" category
- assertTrue(m.updateEnd(false /*sortByApi*/));
-
- assertTrue(m.getCategories(false /*sortByApi*/).isEmpty());
-
- assertEquals(
- "",
- getTree(m, false /*displaySortByApi*/));
- }
-
- public void testSortBySource_AddPackages() {
- // Since we're sorting by source, items are grouped under their source
- // even if installed. The 'local' source is only for installed items for
- // which we don't know the source.
- SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1");
-
- m.updateStart();
- assertTrue(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[] {
- new MockEmptyPackage(src1, "known source", 2),
- new MockEmptyPackage(null, "unknown source", 3),
- }));
-
- assertEquals(
- "PkgCategorySource <source=Local Packages (no.source), #items=1>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'unknown source' rev=3>\n" +
- "PkgCategorySource <source=repo1 (example.com), #items=1>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'known source' rev=2>\n",
- getTree(m, false /*displaySortByApi*/));
-
- assertTrue(m.updateSourcePackages(false /*sortByApi*/, src1, new Package[] {
- new MockEmptyPackage(src1, "new", 1),
- }));
-
- assertFalse(m.updateEnd(false /*sortByApi*/));
-
- assertEquals(
- "PkgCategorySource <source=Local Packages (no.source), #items=1>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'unknown source' rev=3>\n" +
- "PkgCategorySource <source=repo1 (example.com), #items=2>\n" +
- "-- <NEW, pkg:MockEmptyPackage 'new' rev=1>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'known source' rev=2>\n",
- getTree(m, false /*displaySortByApi*/));
- }
-
- public void testSortBySource_Update1() {
-
- // Typical case: user has a locally installed package in revision 1
- // The display list after sort should show that instaled package.
- SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1");
- m.updateStart();
- assertTrue(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[] {
- new MockEmptyPackage(src1, "type1", 1),
- }));
-
- assertEquals(
- "PkgCategorySource <source=Local Packages (no.source), #items=0>\n" +
- "PkgCategorySource <source=repo1 (example.com), #items=1>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1>\n",
- getTree(m, false /*displaySortByApi*/));
-
- // Edge case: the source reveals an update in revision 2. It is ignored since
- // we already have a package in rev 4.
-
- assertTrue(m.updateSourcePackages(false /*sortByApi*/, src1, new Package[] {
- new MockEmptyPackage(src1, "type1", 4),
- new MockEmptyPackage(src1, "type1", 2),
- }));
-
- assertTrue(m.updateEnd(false /*sortByApi*/));
-
- assertEquals(
- "PkgCategorySource <source=repo1 (example.com), #items=1>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=4>\n",
- getTree(m, false /*displaySortByApi*/));
- }
-
- public void testSortBySource_Reload() {
-
- // First load reveals a package local package and its update
- SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1");
- m.updateStart();
- assertTrue(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[] {
- new MockEmptyPackage(src1, "type1", 1),
- }));
- assertTrue(m.updateSourcePackages(false /*sortByApi*/, src1, new Package[] {
- new MockEmptyPackage(src1, "type1", 2),
- }));
- assertTrue(m.updateEnd(false /*sortByApi*/));
-
- assertEquals(
- "PkgCategorySource <source=repo1 (example.com), #items=1>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n",
- getTree(m, false /*displaySortByApi*/));
-
- // Now simulate a reload that clears the package list and creates similar
- // objects but not the same references. Update methods return false since
- // they don't change anything.
- m.updateStart();
- assertFalse(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[] {
- new MockEmptyPackage(src1, "type1", 1),
- }));
- assertFalse(m.updateSourcePackages(false /*sortByApi*/, src1, new Package[] {
- new MockEmptyPackage(src1, "type1", 2),
- }));
- assertTrue(m.updateEnd(false /*sortByApi*/));
-
- assertEquals(
- "PkgCategorySource <source=repo1 (example.com), #items=1>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n",
- getTree(m, false /*displaySortByApi*/));
- }
-
- public void testSortBySource_InstallPackage() {
-
- // First load reveals a new package
- SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1");
- m.updateStart();
- // no local package
- assertFalse(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[0]));
- assertTrue(m.updateSourcePackages(false /*sortByApi*/, src1, new Package[] {
- new MockEmptyPackage(src1, "type1", 1),
- }));
- assertTrue(m.updateEnd(false /*sortByApi*/));
-
- assertEquals(
- "PkgCategorySource <source=repo1 (example.com), #items=1>\n" +
- "-- <NEW, pkg:MockEmptyPackage 'type1' rev=1>\n",
- getTree(m, false /*displaySortByApi*/));
-
-
- // Install it. The display only shows the installed one, 'hiding' the remote package
- m.updateStart();
- assertTrue(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[] {
- new MockEmptyPackage(src1, "type1", 1),
- }));
- assertFalse(m.updateSourcePackages(false /*sortByApi*/, src1, new Package[] {
- new MockEmptyPackage(src1, "type1", 1),
- }));
- assertTrue(m.updateEnd(false /*sortByApi*/));
-
- assertEquals(
- "PkgCategorySource <source=repo1 (example.com), #items=1>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1>\n",
- getTree(m, false /*displaySortByApi*/));
-
- // Now we have an update
- m.updateStart();
- assertFalse(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[] {
- new MockEmptyPackage(src1, "type1", 1),
- }));
- assertTrue(m.updateSourcePackages(false /*sortByApi*/, src1, new Package[] {
- new MockEmptyPackage(src1, "type1", 2),
- }));
- assertTrue(m.updateEnd(false /*sortByApi*/));
-
- assertEquals(
- "PkgCategorySource <source=repo1 (example.com), #items=1>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n",
- getTree(m, false /*displaySortByApi*/));
- }
-
- public void testSortBySource_DeletePackage() {
- SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1");
-
- // Start with an installed package and its matching remote package
- m.updateStart();
- assertTrue(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[] {
- new MockEmptyPackage(src1, "type1", 1),
- }));
- assertFalse(m.updateSourcePackages(false /*sortByApi*/, src1, new Package[] {
- new MockEmptyPackage(src1, "type1", 1),
- }));
- assertTrue(m.updateEnd(false /*sortByApi*/));
-
- assertEquals(
- "PkgCategorySource <source=repo1 (example.com), #items=1>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1>\n",
- getTree(m, false /*displaySortByApi*/));
-
- // User now deletes the installed package.
- m.updateStart();
- // no local package
- assertTrue(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[0]));
- assertTrue(m.updateSourcePackages(false /*sortByApi*/, src1, new Package[] {
- new MockEmptyPackage(src1, "type1", 1),
- }));
- assertTrue(m.updateEnd(false /*sortByApi*/));
-
- assertEquals(
- "PkgCategorySource <source=repo1 (example.com), #items=1>\n" +
- "-- <NEW, pkg:MockEmptyPackage 'type1' rev=1>\n",
- getTree(m, false /*displaySortByApi*/));
- }
-
- public void testSortBySource_CompleteUpdate() {
- SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1");
- SdkSource src2 = new SdkRepoSource("http://2.example.com/url2", "repo2");
-
- // First update has the typical tools and a couple extras
- m.updateStart();
-
- assertTrue(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[] {
- new MockToolPackage(src1, 10, 3),
- new MockPlatformToolPackage(src1, 3),
- new MockExtraPackage(src1, "android", "usb_driver", 4, 3),
- }));
- assertTrue(m.updateSourcePackages(false /*sortByApi*/, src1, new Package[] {
- new MockToolPackage(src1, 10, 3),
- new MockPlatformToolPackage(src1, 3),
- new MockExtraPackage(src1, "carrier", "custom_rom", 1, 0),
- new MockExtraPackage(src1, "android", "usb_driver", 5, 3),
- }));
- assertTrue(m.updateEnd(false /*sortByApi*/));
-
- assertEquals(
- "PkgCategorySource <source=repo1 (1.example.com), #items=4>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 10>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" +
- "-- <INSTALLED, pkg:Android USB Driver, revision 4, updated by:Android USB Driver, revision 5>\n" +
- "-- <NEW, pkg:Carrier Custom Rom, revision 1>\n",
- getTree(m, false /*displaySortByApi*/));
-
- // Next update adds platforms and addon, sorted in a category based on their API level
- m.updateStart();
- MockPlatformPackage p1;
- MockPlatformPackage p2;
- @SuppressWarnings("unused") // keep p3 for clarity
- MockPlatformPackage p3;
-
- assertTrue(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[] {
- new MockToolPackage(src1, 10, 3),
- new MockPlatformToolPackage(src1, 3),
- new MockExtraPackage(src1, "android", "usb_driver", 4, 3),
- // second update
- p1 = new MockPlatformPackage(src1, 1, 2, 3), // API 1
- p3 = new MockPlatformPackage(src1, 3, 6, 3),
- new MockPlatformPackage(src1, 3, 6, 3), // API 3
- new MockAddonPackage(src2, "addon A", p1, 5),
- new MockAddonPackage(src2, "addon D", p1, 10),
- }));
- assertTrue(m.updateSourcePackages(false /*sortByApi*/, src1, new Package[] {
- new MockToolPackage(src1, 10, 3),
- new MockPlatformToolPackage(src1, 3),
- new MockExtraPackage(src1, "carrier", "custom_rom", 1, 0),
- new MockExtraPackage(src1, "android", "usb_driver", 5, 3),
- // second update
- p2 = new MockPlatformPackage(src1, 2, 4, 3), // API 2
- }));
- assertTrue(m.updateSourcePackages(false /*sortByApi*/, src2, new Package[] {
- new MockAddonPackage(src2, "addon C", p2, 9),
- new MockAddonPackage(src2, "addon A", p1, 6),
- // the rev 7+8 will be ignored since there's a rev 9 coming after
- new MockAddonPackage(src2, "addon B", p2, 7),
- new MockAddonPackage(src2, "addon B", p2, 8),
- new MockAddonPackage(src2, "addon B", p2, 9),
- // 11+12 should be ignored updates, 13 will update 10
- new MockAddonPackage(src2, "addon D", p1, 10),
- new MockAddonPackage(src2, "addon D", p1, 12), // note: 12 listed before 11
- new MockAddonPackage(src2, "addon D", p1, 11),
- new MockAddonPackage(src2, "addon D", p1, 13),
- }));
- assertTrue(m.updateEnd(false /*sortByApi*/));
-
- assertEquals(
- "PkgCategorySource <source=repo1 (1.example.com), #items=7>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 10>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-3, API 3, revision 6>\n" +
- "-- <NEW, pkg:SDK Platform Android android-2, API 2, revision 4>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
- "-- <INSTALLED, pkg:Android USB Driver, revision 4, updated by:Android USB Driver, revision 5>\n" +
- "-- <NEW, pkg:Carrier Custom Rom, revision 1>\n" +
- "PkgCategorySource <source=repo2 (2.example.com), #items=4>\n" +
- "-- <NEW, pkg:The addon B from vendor 2, Android API 2, revision 9>\n" +
- "-- <NEW, pkg:The addon C from vendor 2, Android API 2, revision 9>\n" +
- "-- <INSTALLED, pkg:The addon A from vendor 1, Android API 1, revision 5, updated by:The addon A from vendor 1, Android API 1, revision 6>\n" +
- "-- <INSTALLED, pkg:The addon D from vendor 1, Android API 1, revision 10, updated by:The addon D from vendor 1, Android API 1, revision 13>\n",
- getTree(m, false /*displaySortByApi*/));
-
- // Reloading the same thing should have no impact except for the update methods
- // returning false when they don't change the current list.
- m.updateStart();
-
- assertFalse(m.updateSourcePackages(false /*sortByApi*/, null /*locals*/, new Package[] {
- new MockToolPackage(src1, 10, 3),
- new MockPlatformToolPackage(src1, 3),
- new MockExtraPackage(src1, "android", "usb_driver", 4, 3),
- // second update
- p1 = new MockPlatformPackage(src1, 1, 2, 3), // API 1
- p3 = new MockPlatformPackage(src1, 3, 6, 3),
- new MockPlatformPackage(src1, 3, 6, 3), // API 3
- new MockAddonPackage(src2, "addon A", p1, 5),
- new MockAddonPackage(src2, "addon D", p1, 10),
- }));
- assertFalse(m.updateSourcePackages(false /*sortByApi*/, src1, new Package[] {
- new MockToolPackage(src1, 10, 3),
- new MockPlatformToolPackage(src1, 3),
- new MockExtraPackage(src1, "carrier", "custom_rom", 1, 0),
- new MockExtraPackage(src1, "android", "usb_driver", 5, 3),
- // second update
- p2 = new MockPlatformPackage(src1, 2, 4, 3),
- }));
- assertTrue(m.updateSourcePackages(false /*sortByApi*/, src2, new Package[] {
- new MockAddonPackage(src2, "addon C", p2, 9),
- new MockAddonPackage(src2, "addon A", p1, 6),
- // the rev 7+8 will be ignored since there's a rev 9 coming after
- new MockAddonPackage(src2, "addon B", p2, 7),
- new MockAddonPackage(src2, "addon B", p2, 8),
- new MockAddonPackage(src2, "addon B", p2, 9),
- // 11+12 should be ignored updates, 13 will update 10
- new MockAddonPackage(src2, "addon D", p1, 10),
- new MockAddonPackage(src2, "addon D", p1, 12), // note: 12 listed before 11
- new MockAddonPackage(src2, "addon D", p1, 11),
- new MockAddonPackage(src2, "addon D", p1, 13),
- }));
- assertTrue(m.updateEnd(false /*sortByApi*/));
-
- assertEquals(
- "PkgCategorySource <source=repo1 (1.example.com), #items=7>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 10>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-3, API 3, revision 6>\n" +
- "-- <NEW, pkg:SDK Platform Android android-2, API 2, revision 4>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
- "-- <INSTALLED, pkg:Android USB Driver, revision 4, updated by:Android USB Driver, revision 5>\n" +
- "-- <NEW, pkg:Carrier Custom Rom, revision 1>\n" +
- "PkgCategorySource <source=repo2 (2.example.com), #items=4>\n" +
- "-- <NEW, pkg:The addon B from vendor 2, Android API 2, revision 9>\n" +
- "-- <NEW, pkg:The addon C from vendor 2, Android API 2, revision 9>\n" +
- "-- <INSTALLED, pkg:The addon A from vendor 1, Android API 1, revision 5, updated by:The addon A from vendor 1, Android API 1, revision 6>\n" +
- "-- <INSTALLED, pkg:The addon D from vendor 1, Android API 1, revision 10, updated by:The addon D from vendor 1, Android API 1, revision 13>\n",
- getTree(m, false /*displaySortByApi*/));
- }
-
- // ----
-
- public void testIsFirstLoadComplete() {
- // isFirstLoadComplete is a simple toggle that goes from true to false when read once
- assertTrue(m.isFirstLoadComplete());
- assertFalse(m.isFirstLoadComplete());
- assertFalse(m.isFirstLoadComplete());
- }
-
- public void testCheckNewUpdateItems_NewOnly() {
- // Populate the list with a few items and an update
- SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1");
- m.updateStart();
- m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockEmptyPackage(src1, "has update", 1),
- new MockEmptyPackage(src1, "no update", 4)
- });
- m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockEmptyPackage(src1, "has update", 2),
- new MockEmptyPackage(src1, "new stuff", 3),
- });
- m.updateEnd(true /*sortByApi*/);
- // Nothing is checked at first
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=3>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'has update' rev=1, updated by:MockEmptyPackage 'has update' rev=2>\n" +
- "-- <NEW, pkg:MockEmptyPackage 'new stuff' rev=3>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'no update' rev=4>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=repo1 (example.com), #items=3>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'has update' rev=1, updated by:MockEmptyPackage 'has update' rev=2>\n" +
- "-- <NEW, pkg:MockEmptyPackage 'new stuff' rev=3>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'no update' rev=4>\n",
- getTree(m, false /*displaySortByApi*/));
-
- // Now request to check new items only
- m.checkNewUpdateItems(true, false, false, SdkConstants.PLATFORM_LINUX);
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=3>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'has update' rev=1, updated by:MockEmptyPackage 'has update' rev=2>\n" +
- "-- < * NEW, pkg:MockEmptyPackage 'new stuff' rev=3>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'no update' rev=4>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=repo1 (example.com), #items=3>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'has update' rev=1, updated by:MockEmptyPackage 'has update' rev=2>\n" +
- "-- < * NEW, pkg:MockEmptyPackage 'new stuff' rev=3>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'no update' rev=4>\n",
- getTree(m, false /*displaySortByApi*/));
- }
-
- public void testCheckNewUpdateItems_UpdateOnly() {
- // Populate the list with a few items and an update
- SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1");
- m.updateStart();
- m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockEmptyPackage(src1, "has update", 1),
- new MockEmptyPackage(src1, "no update", 4)
- });
- m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockEmptyPackage(src1, "has update", 2),
- new MockEmptyPackage(src1, "new stuff", 3),
- });
- m.updateEnd(true /*sortByApi*/);
- // Nothing is checked at first
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=3>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'has update' rev=1, updated by:MockEmptyPackage 'has update' rev=2>\n" +
- "-- <NEW, pkg:MockEmptyPackage 'new stuff' rev=3>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'no update' rev=4>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=repo1 (example.com), #items=3>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'has update' rev=1, updated by:MockEmptyPackage 'has update' rev=2>\n" +
- "-- <NEW, pkg:MockEmptyPackage 'new stuff' rev=3>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'no update' rev=4>\n",
- getTree(m, false /*displaySortByApi*/));
-
- // Now request to check update items only
- m.checkNewUpdateItems(false, true, false, SdkConstants.PLATFORM_LINUX);
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=3>\n" +
- "-- < * INSTALLED, pkg:MockEmptyPackage 'has update' rev=1, updated by:MockEmptyPackage 'has update' rev=2>\n" +
- "-- <NEW, pkg:MockEmptyPackage 'new stuff' rev=3>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'no update' rev=4>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=repo1 (example.com), #items=3>\n" +
- "-- < * INSTALLED, pkg:MockEmptyPackage 'has update' rev=1, updated by:MockEmptyPackage 'has update' rev=2>\n" +
- "-- <NEW, pkg:MockEmptyPackage 'new stuff' rev=3>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'no update' rev=4>\n",
- getTree(m, false /*displaySortByApi*/));
- }
-
- public void testCheckNewUpdateItems_SelectInitial() {
- // Populate the list with typical items: tools, platforms tools, extras, 2 platforms.
- // With nothing installed, this should pick the top platform and its system images
- // (the mock platform claims to not have any included abi)
- // It's ok not to select the tools, since they are a dependency of all platforms.
-
- SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1");
- SdkSource src2 = new SdkRepoSource("http://2.example.com/url2", "repo2");
-
- m.updateStart();
- MockPlatformPackage p1;
- MockPlatformPackage p2;
-
- m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockToolPackage(src1, 10, 3),
- new MockPlatformToolPackage(src1, 3),
- new MockExtraPackage(src1, "google", "usb_driver", 5, 3),
- p1 = new MockPlatformPackage(src1, 1, 2, 3), // API 1
- p2 = new MockPlatformPackage(src1, 2, 4, 3), // API 2
- new MockSystemImagePackage(src1, p2, 1, "armeabi"),
- new MockSystemImagePackage(src1, p2, 1, "x86"),
- });
- m.updateSourcePackages(true /*sortByApi*/, src2, new Package[] {
- new MockAddonPackage(src2, "addon A", p1, 5),
- new MockAddonPackage(src2, "addon B", p2, 7),
- new MockExtraPackage(src2, "carrier", "custom_rom", 1, 0),
- });
- m.updateEnd(true /*sortByApi*/);
-
- m.checkNewUpdateItems(false, true, true, SdkConstants.PLATFORM_LINUX);
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" +
- "-- <NEW, pkg:Android SDK Tools, revision 10>\n" +
- "-- <NEW, pkg:Android SDK Platform-tools, revision 3>\n" +
- "PkgCategoryApi <API=API 2, label=Android android-2 (API 2), #items=4>\n" +
- "-- < * NEW, pkg:SDK Platform Android android-2, API 2, revision 4>\n" +
- "-- < * NEW, pkg:ARM EABI System Image, Android API 2, revision 1>\n" +
- "-- < * NEW, pkg:Intel x86 Atom System Image, Android API 2, revision 1>\n" +
- "-- < * NEW, pkg:The addon B from vendor 2, Android API 2, revision 7>\n" +
- "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=2>\n" +
- "-- <NEW, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
- "-- <NEW, pkg:The addon A from vendor 1, Android API 1, revision 5>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=2>\n" +
- "-- <NEW, pkg:Carrier Custom Rom, revision 1>\n" +
- "-- <NEW, pkg:Google USB Driver, revision 5>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=repo1 (1.example.com), #items=7>\n" +
- "-- <NEW, pkg:Android SDK Tools, revision 10>\n" +
- "-- <NEW, pkg:Android SDK Platform-tools, revision 3>\n" +
- "-- < * NEW, pkg:SDK Platform Android android-2, API 2, revision 4>\n" +
- "-- <NEW, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
- "-- < * NEW, pkg:ARM EABI System Image, Android API 2, revision 1>\n" +
- "-- < * NEW, pkg:Intel x86 Atom System Image, Android API 2, revision 1>\n" +
- "-- <NEW, pkg:Google USB Driver, revision 5>\n" +
- "PkgCategorySource <source=repo2 (2.example.com), #items=3>\n" +
- "-- < * NEW, pkg:The addon B from vendor 2, Android API 2, revision 7>\n" +
- "-- <NEW, pkg:The addon A from vendor 1, Android API 1, revision 5>\n" +
- "-- <NEW, pkg:Carrier Custom Rom, revision 1>\n",
- getTree(m, false /*displaySortByApi*/));
-
- // We don't install the USB driver by default on Mac or Linux, only on Windows
- m.clear();
- m.updateStart();
- m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockExtraPackage(src1, "google", "usb_driver", 5, 3),
- });
- m.updateEnd(true /*sortByApi*/);
- m.checkNewUpdateItems(false, true, true, SdkConstants.PLATFORM_LINUX);
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" +
- "-- <NEW, pkg:Google USB Driver, revision 5>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=repo1 (1.example.com), #items=1>\n" +
- "-- <NEW, pkg:Google USB Driver, revision 5>\n",
- getTree(m, false /*displaySortByApi*/));
-
- m.clear();
- m.updateStart();
- m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockExtraPackage(src1, "google", "usb_driver", 5, 3),
- });
- m.updateEnd(true /*sortByApi*/);
- m.checkNewUpdateItems(false, true, true, SdkConstants.PLATFORM_DARWIN);
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" +
- "-- <NEW, pkg:Google USB Driver, revision 5>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=repo1 (1.example.com), #items=1>\n" +
- "-- <NEW, pkg:Google USB Driver, revision 5>\n",
- getTree(m, false /*displaySortByApi*/));
-
- m.clear();
- m.updateStart();
- m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockExtraPackage(src1, "google", "usb_driver", 5, 3),
- });
- m.updateEnd(true /*sortByApi*/);
- m.checkNewUpdateItems(false, true, true, SdkConstants.PLATFORM_WINDOWS);
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" +
- "-- < * NEW, pkg:Google USB Driver, revision 5>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=repo1 (1.example.com), #items=1>\n" +
- "-- < * NEW, pkg:Google USB Driver, revision 5>\n",
- getTree(m, false /*displaySortByApi*/));
-
- }
-
- public void testCheckUncheckAllItems() {
- // Populate the list with a couple items and an update
- SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1");
- m.updateStart();
- m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockEmptyPackage(src1, "type1", 1)
- });
- m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockEmptyPackage(src1, "type1", 2),
- new MockEmptyPackage(src1, "type3", 3),
- });
- m.updateEnd(true /*sortByApi*/);
- // Nothing is checked at first
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=2>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n" +
- "-- <NEW, pkg:MockEmptyPackage 'type3' rev=3>\n",
- getTree(m, true /*displaySortByApi*/));
-
- // Manually check the items in the sort-by-API case, but not the source
- for (PkgItem item : m.getAllPkgItems(true /*byApi*/, false /*bySource*/)) {
- item.setChecked(true);
- }
-
- // by-api sort should be checked but not by source
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=2>\n" +
- "-- < * INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n" +
- "-- < * NEW, pkg:MockEmptyPackage 'type3' rev=3>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=repo1 (example.com), #items=2>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n" +
- "-- <NEW, pkg:MockEmptyPackage 'type3' rev=3>\n",
- getTree(m, false /*displaySortByApi*/));
-
- // now uncheck them all
- m.uncheckAllItems();
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=2>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n" +
- "-- <NEW, pkg:MockEmptyPackage 'type3' rev=3>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=repo1 (example.com), #items=2>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n" +
- "-- <NEW, pkg:MockEmptyPackage 'type3' rev=3>\n",
- getTree(m, false /*displaySortByApi*/));
-
- // Manually check the items in both by-api and by-source
- for (PkgItem item : m.getAllPkgItems(true /*byApi*/, true /*bySource*/)) {
- item.setChecked(true);
- }
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=2>\n" +
- "-- < * INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n" +
- "-- < * NEW, pkg:MockEmptyPackage 'type3' rev=3>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=repo1 (example.com), #items=2>\n" +
- "-- < * INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n" +
- "-- < * NEW, pkg:MockEmptyPackage 'type3' rev=3>\n",
- getTree(m, false /*displaySortByApi*/));
-
- // now uncheck them all
- m.uncheckAllItems();
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=2>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n" +
- "-- <NEW, pkg:MockEmptyPackage 'type3' rev=3>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=repo1 (example.com), #items=2>\n" +
- "-- <INSTALLED, pkg:MockEmptyPackage 'type1' rev=1, updated by:MockEmptyPackage 'type1' rev=2>\n" +
- "-- <NEW, pkg:MockEmptyPackage 'type3' rev=3>\n",
- getTree(m, false /*displaySortByApi*/));
- }
-
- // ----
-
- public void testLocalIsNewer() {
- // This tests an edge case that typically happens only during development where
- // one would have a local package which revision number is larger than what the
- // remove repositories can offer. In this case we don't want to offer the remote
- // package as an "upgrade" nor as a downgrade.
-
- // Populate the list with local revisions 5 and lower remote revisions 3
- SdkSource src1 = new SdkRepoSource("http://example.com/url", "repo1");
- m.updateStart();
- m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockToolPackage( src1, 5, 5),
- new MockPlatformToolPackage(src1, 5),
- });
- m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockToolPackage( src1, 3, 3),
- new MockPlatformToolPackage(src1, 3),
- });
- m.updateEnd(true /*sortByApi*/);
-
- // The remote packages in rev 3 are hidden by the local packages in rev 5
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 5>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 5>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=repo1 (example.com), #items=2>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 5>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 5>\n",
- getTree(m, false /*displaySortByApi*/));
- }
-
- public void testSourceDups() {
- // This tests an edge case were 2 remote repositories are giving the
- // same kind of packages. In rev 14, we didn't want to merge them together
- // unless they had the same hostname. In rev 15, we now treat them the same.
-
- // repo1, 2 and 3 have the same hostname so redundancy is ok
- SdkSource src1 = new SdkRepoSource("http://example.com/url1", "repo1");
- SdkSource src2 = new SdkRepoSource("http://example.com/url2", "repo2");
- SdkSource src3 = new SdkRepoSource("http://example.com/url3", "repo3");
- // repo4 has a different hostname but as of rev 15, the packages will be merged together.
- SdkSource src4 = new SdkRepoSource("http://4.example.com/url4", "repo4");
- MockPlatformPackage p1 = null;
-
- m.updateStart();
- m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockToolPackage( src1, 3, 3),
- new MockPlatformToolPackage(src1, 3),
- p1 = new MockPlatformPackage(src1, 1, 2, 3), // API 1
- });
- m.updateSourcePackages(true /*sortByApi*/, src2, new Package[] {
- new MockAddonPackage(src2, "addon A", p1, 5),
- new MockAddonPackage(src2, "addon B", p1, 6),
- });
- m.updateSourcePackages(true /*sortByApi*/, src3, new Package[] {
- new MockAddonPackage(src3, "addon A", p1, 5), // same as addon A rev 5 from src2
- new MockAddonPackage(src3, "addon B", p1, 7), // upgrades addon B rev 6 from src2
- });
- m.updateSourcePackages(true /*sortByApi*/, src4, new Package[] {
- new MockAddonPackage(src4, "addon A", p1, 5), // same as addon A rev 5 from src2
- new MockAddonPackage(src4, "addon B", p1, 7), // upgrades addon B rev 6 from src2
- });
- m.updateEnd(true /*sortByApi*/);
-
- // The remote packages in rev 3 are hidden by the local packages in rev 5.
- // When sorting by API, the user can tell where the packages come from by looking
- // at the UI tooltip on the packages.
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 3>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" +
- "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=3>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
- "-- <NEW, pkg:The addon A from vendor 1, Android API 1, revision 5>\n" + // from src2+3+4
- "-- <NEW, pkg:The addon B from vendor 1, Android API 1, revision 7>\n" + // from src3+4
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n",
- getTree(m, true /*displaySortByApi*/));
- // When sorting by source, the src4 source is listed, however since its
- // packages are the same as the ones from src2 or src3 the packages themselves
- // are not shown.
- assertEquals(
- "PkgCategorySource <source=repo1 (example.com), #items=3>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 3>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
- "PkgCategorySource <source=repo2 (example.com), #items=1>\n" +
- "-- <NEW, pkg:The addon A from vendor 1, Android API 1, revision 5>\n" + // from src2+3+4
- "PkgCategorySource <source=repo3 (example.com), #items=1>\n" +
- "-- <NEW, pkg:The addon B from vendor 1, Android API 1, revision 7>\n" + // from src3+4
- "PkgCategorySource <source=repo4 (4.example.com), #items=0>\n",
- getTree(m, false /*displaySortByApi*/));
- }
-
- public void testRenamedExtraPackage() {
- // Starting with schemas repo v5 and addon v3, an extra package can be renamed
- // using the "old-paths" attribute. This test checks that the diff logic will
- // match an old extra and its new name together.
-
- // First scenario: local pkg "old_path1" and remote pkg "new_path2".
- // Since the new package does not provide an old_paths attribute, the
- // new package is not treated as an update.
-
- SdkSource src1 = new SdkRepoSource("http://example.com/url1", "repo1");
- m.updateStart();
- m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockExtraPackage(src1, "vendor1", "old_path1", 1, 1),
- });
- m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockExtraPackage(src1, "vendor1", "new_path2", 2, 1),
- });
- m.updateEnd(true /*sortByApi*/);
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=2>\n" +
- "-- <NEW, pkg:Vendor1 New Path2, revision 2>\n" +
- "-- <INSTALLED, pkg:Vendor1 Old Path1, revision 1>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=repo1 (example.com), #items=2>\n" +
- "-- <NEW, pkg:Vendor1 New Path2, revision 2>\n" +
- "-- <INSTALLED, pkg:Vendor1 Old Path1, revision 1>\n",
- getTree(m, false /*displaySortByApi*/));
-
- // Now, start again, but this time the new package uses the old-path attribute
- Properties props = new Properties();
- props.setProperty(PkgProps.EXTRA_OLD_PATHS, "old_path1;oldpath2");
- m.clear();
-
- m.updateStart();
- m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockExtraPackage(src1, "vendor1", "old_path1", 1, 1),
- });
- m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockExtraPackage(src1, props, "vendor1", "new_path2", 2),
- });
- m.updateEnd(true /*sortByApi*/);
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" +
- "-- <INSTALLED, pkg:Vendor1 Old Path1, revision 1, updated by:Vendor1 New Path2, revision 2>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=repo1 (example.com), #items=1>\n" +
- "-- <INSTALLED, pkg:Vendor1 Old Path1, revision 1, updated by:Vendor1 New Path2, revision 2>\n",
- getTree(m, false /*displaySortByApi*/));
- }
-
- public void testBrokenAddon() {
- SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1");
- SdkSource src2 = new SdkRepoSource("http://2.example.com/url2", "repo2");
-
- MockPlatformPackage p1 = null;
- MockAddonPackage a1 = null;
-
- // User has a platform + addon locally installed
- m.updateStart();
- m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- p1 = new MockPlatformPackage(src1, 1, 2, 3), // API 1
- a1 = new MockAddonPackage(src2, "addon A", p1, 4),
- });
- m.updateSourcePackages(true /*sortByApi*/, src1 /*locals*/, new Package[] {
- p1
- });
- m.updateSourcePackages(true /*sortByApi*/, src2 /*locals*/, new Package[] {
- a1
- });
- m.updateEnd(true /*sortByApi*/);
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=2>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
- "-- <INSTALLED, pkg:The addon A from vendor 1, Android API 1, revision 4>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=repo1 (1.example.com), #items=1>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
- "PkgCategorySource <source=repo2 (2.example.com), #items=1>\n" +
- "-- <INSTALLED, pkg:The addon A from vendor 1, Android API 1, revision 4>\n",
- getTree(m, false /*displaySortByApi*/));
-
- // Now user deletes the platform on disk and reload.
- // The local package parser will only find a broken addon.
- m.updateStart();
- m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockBrokenPackage(BrokenPackage.MIN_API_LEVEL_NOT_SPECIFIED, 1),
- });
- m.updateSourcePackages(true /*sortByApi*/, src1 /*locals*/, new Package[] {
- new MockPlatformPackage(src1, 1, 2, 3)
- });
- m.updateSourcePackages(true /*sortByApi*/, src2 /*locals*/, new Package[] {
- new MockAddonPackage(src2, "addon A", p1, 4)
- });
- m.updateEnd(true /*sortByApi*/);
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=2>\n" +
- "-- <NEW, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
- "-- <NEW, pkg:The addon A from vendor 1, Android API 1, revision 4>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=1>\n" +
- "-- <INSTALLED, pkg:Broken package for API 1>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=repo1 (1.example.com), #items=1>\n" +
- "-- <NEW, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
- "PkgCategorySource <source=repo2 (2.example.com), #items=1>\n" +
- "-- <NEW, pkg:The addon A from vendor 1, Android API 1, revision 4>\n" +
- "PkgCategorySource <source=Local Packages (no.source), #items=1>\n" +
- "-- <INSTALLED, pkg:Broken package for API 1>\n",
- getTree(m, false /*displaySortByApi*/));
-
- // Now user restores the missing platform on disk.
- m.updateStart();
- m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- p1 = new MockPlatformPackage(src1, 1, 2, 3), // API 1
- a1 = new MockAddonPackage(src2, "addon A", p1, 4),
- });
- m.updateSourcePackages(true /*sortByApi*/, src1 /*locals*/, new Package[] {
- p1
- });
- m.updateSourcePackages(true /*sortByApi*/, src2 /*locals*/, new Package[] {
- a1
- });
- m.updateEnd(true /*sortByApi*/);
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=0>\n" +
- "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=2>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
- "-- <INSTALLED, pkg:The addon A from vendor 1, Android API 1, revision 4>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=repo1 (1.example.com), #items=1>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
- "PkgCategorySource <source=repo2 (2.example.com), #items=1>\n" +
- "-- <INSTALLED, pkg:The addon A from vendor 1, Android API 1, revision 4>\n",
- getTree(m, false /*displaySortByApi*/));
- }
-
- public void testToolsUpdate() {
- SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1");
- SdkSource src2 = new SdkRepoSource("http://2.example.com/url2", "repo2");
- MockPlatformPackage p1;
-
- m.updateStart();
- m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockToolPackage(3, 3), // tool package has no source defined
- new MockPlatformToolPackage(src1, 3),
- p1 = new MockPlatformPackage(src1, 1, 2, 3), // API 1
- });
- m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockToolPackage(src1, 4, 4),
- new MockPlatformToolPackage(src1, 4),
- });
- m.updateSourcePackages(true /*sortByApi*/, src2, new Package[] {
- new MockAddonPackage(src2, "addon A", p1, 5),
- new MockAddonPackage(src2, "addon B", p1, 6),
- });
- m.updateEnd(true /*sortByApi*/);
-
- // The remote packages in rev 3 are hidden by the local packages in rev 5
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 3, updated by:Android SDK Tools, revision 4>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3, updated by:Android SDK Platform-tools, revision 4>\n" +
- "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=3>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
- "-- <NEW, pkg:The addon A from vendor 1, Android API 1, revision 5>\n" +
- "-- <NEW, pkg:The addon B from vendor 1, Android API 1, revision 6>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=Local Packages (no.source), #items=1>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 3, updated by:Android SDK Tools, revision 4>\n" +
- "PkgCategorySource <source=repo1 (1.example.com), #items=2>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3, updated by:Android SDK Platform-tools, revision 4>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
- "PkgCategorySource <source=repo2 (2.example.com), #items=2>\n" +
- "-- <NEW, pkg:The addon A from vendor 1, Android API 1, revision 5>\n" +
- "-- <NEW, pkg:The addon B from vendor 1, Android API 1, revision 6>\n",
- getTree(m, false /*displaySortByApi*/));
- }
-
- public void testToolsMinorUpdate() {
- // Test: Check a minor revision updates an installed major revision.
-
- SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1");
-
- m.updateStart();
- m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockToolPackage(3, 3), // Tools 3.0.0
- new MockPlatformToolPackage(src1, 3),
- });
- m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockToolPackage(src1, new FullRevision(3, 0, 1), 3), // Tools 3.0.1
- });
- m.updateEnd(true /*sortByApi*/);
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 3, updated by:Android SDK Tools, revision 3.0.1>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=Local Packages (no.source), #items=1>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 3, updated by:Android SDK Tools, revision 3.0.1>\n" +
- "PkgCategorySource <source=repo1 (1.example.com), #items=1>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3>\n",
- getTree(m, false /*displaySortByApi*/));
- }
-
- public void testToolsPreviewsDisabled() {
- // Test: No local tools installed. The remote server has both tools and platforms
- // in release and RC versions. However the settings "enable previews" is disabled
- // (which is the default) so the previews are not actually loaded from the server.
-
- SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1");
-
- m.updateStart();
- m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockToolPackage(src1, new FullRevision(2, 0, 0), 3), // Tools 2
- new MockToolPackage(src1, new FullRevision(4, 0, 0, 1), 3), // Tools 4 rc1
- new MockPlatformToolPackage(src1, new FullRevision(3, 0, 0)), // Plat-T 3
- new MockPlatformToolPackage(src1, new FullRevision(5, 0, 0, 1)), // Plat-T 5 rc1
- });
- m.updateEnd(true /*sortByApi*/);
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" +
- "-- <NEW, pkg:Android SDK Tools, revision 2>\n" +
- "-- <NEW, pkg:Android SDK Platform-tools, revision 3>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=repo1 (1.example.com), #items=2>\n" +
- "-- <NEW, pkg:Android SDK Tools, revision 2>\n" +
- "-- <NEW, pkg:Android SDK Platform-tools, revision 3>\n",
- getTree(m, false /*displaySortByApi*/));
- }
-
- public void testToolsPreviews() {
- // Test: No local tools installed. The remote server has both tools and platforms
- // in release and RC versions.
-
- // Enable previews in the settings
- u.overrideSetting(ISettingsPage.KEY_ENABLE_PREVIEWS, true);
-
- SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1");
-
- m.updateStart();
- m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockToolPackage(src1, new FullRevision(2, 0, 0), 3), // Tools 2
- new MockToolPackage(src1, new FullRevision(4, 0, 0, 1), 3), // Tools 4 rc1
- new MockPlatformToolPackage(src1, new FullRevision(3, 0, 0)), // Plat-T 3
- new MockPlatformToolPackage(src1, new FullRevision(5, 0, 0, 1)), // Plat-T 5 rc1
- });
- m.updateEnd(true /*sortByApi*/);
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" +
- "-- <NEW, pkg:Android SDK Tools, revision 2>\n" +
- "-- <NEW, pkg:Android SDK Platform-tools, revision 3>\n" +
- "PkgCategoryApi <API=TOOLS-PREVIEW, label=Tools (Preview Channel), #items=2>\n" +
- "-- <NEW, pkg:Android SDK Tools, revision 4 rc1>\n" +
- "-- <NEW, pkg:Android SDK Platform-tools, revision 5 rc1>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=repo1 (1.example.com), #items=4>\n" +
- "-- <NEW, pkg:Android SDK Tools, revision 2>\n" +
- "-- <NEW, pkg:Android SDK Tools, revision 4 rc1>\n" +
- "-- <NEW, pkg:Android SDK Platform-tools, revision 3>\n" +
- "-- <NEW, pkg:Android SDK Platform-tools, revision 5 rc1>\n",
- getTree(m, false /*displaySortByApi*/));
- }
-
- public void testPreviewUpdateInstalledRelease() {
- // Test: Local release Tools 3.0.0 installed, server has both a release 3.0.1 available
- // and a Tools Preview 4.0.0 rc1 available.
- // => v3 is updated by 3.0.1
- // => v4.0.0rc1 does not update 3.0.0, instead it's a separate download.
-
- // Enable previews in the settings
- u.overrideSetting(ISettingsPage.KEY_ENABLE_PREVIEWS, true);
-
- SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1");
-
- m.updateStart();
- m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockToolPackage(3, 3), // tool package has no source defined
- new MockPlatformToolPackage(src1, 3),
- new MockPlatformPackage(src1, 1, 2, 3), // API 1
- });
- m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockToolPackage(src1, 3, 3), // Tools 3
- new MockToolPackage(src1, new FullRevision(3, 0, 1), 3), // Tools 3.0.1
- new MockToolPackage(src1, new FullRevision(4, 0, 0, 1), 3), // Tools 4 rc1
- new MockPlatformToolPackage(src1, new FullRevision(3, 0, 1)), // PT 3.0.1
- new MockPlatformToolPackage(src1, new FullRevision(4, 0, 0, 1)), // PT 4 rc1
- });
- m.updateEnd(true /*sortByApi*/);
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 3, updated by:Android SDK Tools, revision 3.0.1>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3, updated by:Android SDK Platform-tools, revision 3.0.1>\n" +
- "PkgCategoryApi <API=TOOLS-PREVIEW, label=Tools (Preview Channel), #items=2>\n" +
- "-- <NEW, pkg:Android SDK Tools, revision 4 rc1>\n" +
- "-- <NEW, pkg:Android SDK Platform-tools, revision 4 rc1>\n" +
- "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=1>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=Local Packages (no.source), #items=1>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 3, updated by:Android SDK Tools, revision 3.0.1>\n" +
- "PkgCategorySource <source=repo1 (1.example.com), #items=4>\n" +
- "-- <NEW, pkg:Android SDK Tools, revision 4 rc1>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 3, updated by:Android SDK Platform-tools, revision 3.0.1>\n" +
- "-- <NEW, pkg:Android SDK Platform-tools, revision 4 rc1>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n",
- getTree(m, false /*displaySortByApi*/));
-
- // Now request to check new items and updates:
- // Tools 4 rc1 is greater than the installed Tools 3, but it's a preview so we will NOT
- // auto-select it by default even though we requested to select "NEW" packages. We
- // want the user to manually opt-in into the rc/preview package.
- // However Tools 3 has a 3.0.1 update that we'll auto-select.
- m.checkNewUpdateItems(true, true, false, SdkConstants.PLATFORM_LINUX);
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" +
- "-- < * INSTALLED, pkg:Android SDK Tools, revision 3, updated by:Android SDK Tools, revision 3.0.1>\n" +
- "-- < * INSTALLED, pkg:Android SDK Platform-tools, revision 3, updated by:Android SDK Platform-tools, revision 3.0.1>\n" +
- "PkgCategoryApi <API=TOOLS-PREVIEW, label=Tools (Preview Channel), #items=2>\n" +
- "-- <NEW, pkg:Android SDK Tools, revision 4 rc1>\n" +
- "-- <NEW, pkg:Android SDK Platform-tools, revision 4 rc1>\n" +
- "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=1>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=Local Packages (no.source), #items=1>\n" +
- "-- < * INSTALLED, pkg:Android SDK Tools, revision 3, updated by:Android SDK Tools, revision 3.0.1>\n" +
- "PkgCategorySource <source=repo1 (1.example.com), #items=4>\n" +
- "-- <NEW, pkg:Android SDK Tools, revision 4 rc1>\n" +
- "-- < * INSTALLED, pkg:Android SDK Platform-tools, revision 3, updated by:Android SDK Platform-tools, revision 3.0.1>\n" +
- "-- <NEW, pkg:Android SDK Platform-tools, revision 4 rc1>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n",
- getTree(m, false /*displaySortByApi*/));
-
- }
-
- public void testPreviewUpdateInstalledPreview() {
- // Test: Local preview Tools 3.0.1rc1 installed, server has both a release 3.0.0 available
- // and a Tools Preview 3.0.1 rc2 available.
- // => Installed 3.0.1rc1 can be updated by 3.0.1rc2
- // => There's a separate "new" download for 3.0.0, not installed and NOT updating 3.0.1rc1.
-
- // Enable previews in the settings
- u.overrideSetting(ISettingsPage.KEY_ENABLE_PREVIEWS, true);
-
- SdkSource src1 = new SdkRepoSource("http://1.example.com/url1", "repo1");
-
- m.updateStart();
- m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockToolPackage(src1, new FullRevision(3, 0, 1, 1), 4), // T 3.0.1rc1
- new MockPlatformToolPackage(src1, new FullRevision(4, 0, 1, 1)), // PT 4.0.1rc1
- new MockPlatformPackage(src1, 1, 2, 3), // API 1
- });
- m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockToolPackage(src1, new FullRevision(3, 0, 0), 4), // T 3.0.0
- new MockToolPackage(src1, new FullRevision(3, 0, 1, 2), 4), // T 3.0.1rc2
- new MockPlatformToolPackage(src1, new FullRevision(4, 0, 0)), // PT 4.0.0
- new MockPlatformToolPackage(src1, new FullRevision(4, 0, 1, 2)), // PT 4.0.1 rc2
- });
- m.updateEnd(true /*sortByApi*/);
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" +
- "-- <NEW, pkg:Android SDK Tools, revision 3>\n" +
- "-- <NEW, pkg:Android SDK Platform-tools, revision 4>\n" +
- "PkgCategoryApi <API=TOOLS-PREVIEW, label=Tools (Preview Channel), #items=2>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 3.0.1 rc1, updated by:Android SDK Tools, revision 3.0.1 rc2>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1 rc1, updated by:Android SDK Platform-tools, revision 4.0.1 rc2>\n" +
- "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=1>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=repo1 (1.example.com), #items=5>\n" +
- "-- <NEW, pkg:Android SDK Tools, revision 3>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 3.0.1 rc1, updated by:Android SDK Tools, revision 3.0.1 rc2>\n" +
- "-- <NEW, pkg:Android SDK Platform-tools, revision 4>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1 rc1, updated by:Android SDK Platform-tools, revision 4.0.1 rc2>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n",
- getTree(m, false /*displaySortByApi*/));
-
- // Auto select new and update items. In this case:
- // - the previews have updates available.
- // - we're not selecting the non-installed "3.0" version that is older than the
- // currently installed "3.0.1rc1" version since that would be a downgrade.
- m.checkNewUpdateItems(true, true, false, SdkConstants.PLATFORM_LINUX);
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" +
- "-- <NEW, pkg:Android SDK Tools, revision 3>\n" +
- "-- <NEW, pkg:Android SDK Platform-tools, revision 4>\n" +
- "PkgCategoryApi <API=TOOLS-PREVIEW, label=Tools (Preview Channel), #items=2>\n" +
- "-- < * INSTALLED, pkg:Android SDK Tools, revision 3.0.1 rc1, updated by:Android SDK Tools, revision 3.0.1 rc2>\n" +
- "-- < * INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1 rc1, updated by:Android SDK Platform-tools, revision 4.0.1 rc2>\n" +
- "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=1>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=repo1 (1.example.com), #items=5>\n" +
- "-- <NEW, pkg:Android SDK Tools, revision 3>\n" +
- "-- < * INSTALLED, pkg:Android SDK Tools, revision 3.0.1 rc1, updated by:Android SDK Tools, revision 3.0.1 rc2>\n" +
- "-- <NEW, pkg:Android SDK Platform-tools, revision 4>\n" +
- "-- < * INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1 rc1, updated by:Android SDK Platform-tools, revision 4.0.1 rc2>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n",
- getTree(m, false /*displaySortByApi*/));
-
- // -----
-
- // Now simulate that the server has a final package (3.0.1) to replace the
- // installed 3.0.1rc1 package. It's not installed yet, just available.
- // - A new 3.0.1 will be available.
- // - The server no longer lists the RC since there's a final package, yet it is
- // still locally installed.
- // - The 3.0.1 rc1 is not listed as having an update, since we treat the previews
- // separately. TODO: consider having the 3.0.1 show up as both a new item /and/
- // as an update to the 3.0.1rc1. That may have some other side effects.
-
- m.uncheckAllItems();
- m.updateStart();
- m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockToolPackage(src1, new FullRevision(3, 0, 1, 1), 4), // T 3.0.1rc1
- new MockPlatformToolPackage(src1, new FullRevision(4, 0, 1, 1)), // PT 4.0.1rc1
- new MockPlatformPackage(src1, 1, 2, 3), // API 1
- });
- m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockToolPackage(src1, new FullRevision(3, 0, 1), 4), // T 3.0.1
- new MockPlatformToolPackage(src1, new FullRevision(4, 0, 1)), // PT 4.0.1
- });
- m.updateEnd(true /*sortByApi*/);
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" +
- "-- <NEW, pkg:Android SDK Tools, revision 3.0.1>\n" +
- "-- <NEW, pkg:Android SDK Platform-tools, revision 4.0.1>\n" +
- "PkgCategoryApi <API=TOOLS-PREVIEW, label=Tools (Preview Channel), #items=2>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 3.0.1 rc1>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1 rc1>\n" +
- "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=1>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=repo1 (1.example.com), #items=5>\n" +
- "-- <NEW, pkg:Android SDK Tools, revision 3.0.1>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 3.0.1 rc1>\n" +
- "-- <NEW, pkg:Android SDK Platform-tools, revision 4.0.1>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1 rc1>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n",
- getTree(m, false /*displaySortByApi*/));
-
- // Auto select new and update items. In this case the new items are considered
- // updates and yet new at the same time.
- // Test by selecting new items only:
- m.checkNewUpdateItems(true, false, false, SdkConstants.PLATFORM_LINUX);
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" +
- "-- < * NEW, pkg:Android SDK Tools, revision 3.0.1>\n" +
- "-- < * NEW, pkg:Android SDK Platform-tools, revision 4.0.1>\n" +
- "PkgCategoryApi <API=TOOLS-PREVIEW, label=Tools (Preview Channel), #items=2>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 3.0.1 rc1>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1 rc1>\n" +
- "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=1>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n",
- getTree(m, true /*displaySortByApi*/));
-
- // Test by selecting update items only:
- m.uncheckAllItems();
- m.checkNewUpdateItems(false, true, false, SdkConstants.PLATFORM_LINUX);
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" +
- "-- < * NEW, pkg:Android SDK Tools, revision 3.0.1>\n" +
- "-- < * NEW, pkg:Android SDK Platform-tools, revision 4.0.1>\n" +
- "PkgCategoryApi <API=TOOLS-PREVIEW, label=Tools (Preview Channel), #items=2>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 3.0.1 rc1>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1 rc1>\n" +
- "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=1>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n",
- getTree(m, true /*displaySortByApi*/));
-
-
- // -----
-
- // Now simulate that the user has installed the final package (3.0.1) to replace the
- // installed 3.0.1rc1 package.
- // - The 3.0.1 is installed.
- // - The 3.0.1 rc1 isn't listed anymore by the server.
-
- m.uncheckAllItems();
- m.updateStart();
- m.updateSourcePackages(true /*sortByApi*/, null /*locals*/, new Package[] {
- new MockToolPackage(src1, new FullRevision(3, 0, 1), 4), // T 3.0.1
- new MockPlatformToolPackage(src1, new FullRevision(4, 0, 1)), // PT 4.0.1
- new MockPlatformPackage(src1, 1, 2, 3), // API 1
- });
- m.updateSourcePackages(true /*sortByApi*/, src1, new Package[] {
- new MockToolPackage(src1, new FullRevision(3, 0, 1), 4), // T 3.0.1
- new MockPlatformToolPackage(src1, new FullRevision(4, 0, 1)), // PT 4.0.1
- });
- m.updateEnd(true /*sortByApi*/);
-
- assertEquals(
- "PkgCategoryApi <API=TOOLS, label=Tools, #items=2>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 3.0.1>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1>\n" +
- "PkgCategoryApi <API=API 1, label=Android android-1 (API 1), #items=1>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n" +
- "PkgCategoryApi <API=EXTRAS, label=Extras, #items=0>\n",
- getTree(m, true /*displaySortByApi*/));
- assertEquals(
- "PkgCategorySource <source=repo1 (1.example.com), #items=3>\n" +
- "-- <INSTALLED, pkg:Android SDK Tools, revision 3.0.1>\n" +
- "-- <INSTALLED, pkg:Android SDK Platform-tools, revision 4.0.1>\n" +
- "-- <INSTALLED, pkg:SDK Platform Android android-1, API 1, revision 2>\n",
- getTree(m, false /*displaySortByApi*/));
- }
-
-
-
- // ----
-
- /**
- * Simulates the display we would have in the Packages Tree.
- * This always depends on mCurrentCategories like the tree does.
- * The display format is something like:
- * <pre>
- * PkgCategory <description>
- * -- <PkgItem description>
- * </pre>
- */
- public String getTree(PackagesDiffLogic l, boolean displaySortByApi) {
- StringBuilder sb = new StringBuilder();
-
- for (PkgCategory cat : m.getCategories(displaySortByApi)) {
- sb.append(cat.toString()).append('\n');
- for (PkgItem item : cat.getItems()) {
- sb.append("-- ").append(item.toString()).append('\n');
- }
- }
-
- return sb.toString();
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/ui/MockPackagesPageImpl.java b/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/ui/MockPackagesPageImpl.java
deleted file mode 100755
index 04b3027..0000000
--- a/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/ui/MockPackagesPageImpl.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository.ui;
-
-import com.android.sdklib.internal.repository.DownloadCache;
-import com.android.sdklib.internal.repository.DownloadCache.Strategy;
-import com.android.sdklib.util.SparseIntArray;
-import com.android.sdkuilib.internal.repository.MockDownloadCache;
-import com.android.sdkuilib.internal.repository.UpdaterData;
-import com.android.sdkuilib.internal.repository.core.PackageLoader;
-import com.android.sdkuilib.internal.repository.core.PkgCategory;
-import com.android.sdkuilib.internal.repository.core.PkgContentProvider;
-
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.swt.graphics.Font;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class MockPackagesPageImpl extends PackagesPageImpl {
-
- public MockPackagesPageImpl(UpdaterData updaterData) {
- super(updaterData);
- }
-
- /** UI is never disposed in the unit test. */
- @Override
- protected boolean isUiDisposed() {
- return false;
- }
-
- /** Sync exec always executes immediately in the unit test, no threading is used. */
- @Override
- protected void syncExec(Runnable runnable) {
- runnable.run();
- }
-
- @Override
- protected void syncViewerSelection() {
- // No-op. There is no real tree viewer to synchronize.
- }
-
- private MockTreeViewer mTreeViewer;
-
- @Override
- void postCreate() {
- mTreeViewer = new MockTreeViewer();
- setITreeViewer(mTreeViewer);
-
- setIColumns(new MockTreeColumn(mTreeViewer), // columnName
- new MockTreeColumn(mTreeViewer), // columnApi
- new MockTreeColumn(mTreeViewer), // columnRevision
- new MockTreeColumn(mTreeViewer)); // columnStatus
-
- super.postCreate();
- }
-
- @Override
- protected void refreshViewerInput() {
- super.setViewerInput();
- }
-
- @Override
- protected boolean isSortByApi() {
- return true;
- }
-
- @Override
- protected Font getTreeFontItalic() {
- return null;
- }
-
- @Override
- protected void loadPackages(boolean useLocalCache, boolean overrideExisting) {
- super.loadPackagesImpl(useLocalCache, overrideExisting);
- }
-
- /**
- * In this mock version, we use the default {@link PackageLoader} which will
- * use the {@link DownloadCache} from the {@link UpdaterData}. This should be
- * the mock download cache, in which case we change the strategy at run-time
- * to set it to only-cache on the first manager update.
- */
- @Override
- protected PackageLoader getPackageLoader(boolean useLocalCache) {
- DownloadCache dc = mUpdaterData.getDownloadCache();
- assert dc instanceof MockDownloadCache;
- if (dc instanceof MockDownloadCache) {
- ((MockDownloadCache) dc).overrideStrategy(useLocalCache ? Strategy.ONLY_CACHE : null);
- }
- return mUpdaterData.getPackageLoader();
- }
-
- /**
- * Get a dump-out of the tree in a format suitable for unit testing.
- */
- public String getMockTreeDisplay() throws Exception {
- return mTreeViewer.getTreeDisplay();
- }
-
- private static class MockTreeViewer implements PackagesPageImpl.ICheckboxTreeViewer {
- private final SparseIntArray mWidths = new SparseIntArray();
- private final List<MockTreeColumn> mColumns = new ArrayList<MockTreeColumn>();
- private List<PkgCategory> mInput;
- private PkgContentProvider mPkgContentProvider;
- private String mLastRefresh;
- private static final String SPACE = " ";
-
- @Override
- public void setInput(List<PkgCategory> input) {
- mInput = input;
- refresh();
- }
-
- @Override
- public Object getInput() {
- return mInput;
- }
-
- @Override
- public void setContentProvider(PkgContentProvider pkgContentProvider) {
- mPkgContentProvider = pkgContentProvider;
- }
-
- @Override
- public void refresh() {
- // Recompute the display of the tree
- StringBuilder sb = new StringBuilder();
- boolean widthChanged = false;
-
- for (int render = 0; render < (widthChanged ? 2 : 1); render++) {
- widthChanged = false;
- sb.setLength(0);
- for (Object cat : mPkgContentProvider.getElements(mInput)) {
- if (cat == null) {
- continue;
- }
-
- if (sb.length() > 0) {
- sb.append('\n');
- }
-
- widthChanged |= rowAsString(cat, sb, 3);
-
- Object[] children = mPkgContentProvider.getElements(cat);
- if (children == null) {
- continue;
- }
- for (Object child : children) {
- sb.append("\n L_");
- widthChanged |= rowAsString(child, sb, 0);
- }
- }
- }
-
- mLastRefresh = sb.toString();
- }
-
- boolean rowAsString(Object element, StringBuilder sb, int space) {
- boolean widthChanged = false;
- sb.append("[] ");
- for (int col = 0; col < mColumns.size(); col++) {
- if (col > 0) {
- sb.append(" | ");
- }
- String t = mColumns.get(col).getLabelProvider().getText(element);
- if (t == null) {
- t = "(null)";
- }
- int len = t.length();
- int w = mWidths.get(col);
- if (len > w) {
- widthChanged = true;
- mWidths.put(col, len);
- w = len;
- }
- String pad = len >= w ? "" : SPACE.substring(SPACE.length() - w + len);
- if (col == 0 && space > 0) {
- sb.append(SPACE.substring(SPACE.length() - space));
- }
- if (col >= 1 && col <= 2) {
- sb.append(pad);
- }
- sb.append(t);
- if (col == 0 || col > 2) {
- sb.append(pad);
- }
- }
- return widthChanged;
- }
-
- @Override
- public Object[] getCheckedElements() {
- return null;
- }
-
- public void addColumn(MockTreeColumn mockTreeColumn) {
- mColumns.add(mockTreeColumn);
- }
-
- public String getTreeDisplay() {
- return mLastRefresh;
- }
- }
-
- private static class MockTreeColumn implements PackagesPageImpl.ITreeViewerColumn {
- private ColumnLabelProvider mLabelProvider;
-
- public MockTreeColumn(MockTreeViewer treeViewer) {
- treeViewer.addColumn(this);
- }
-
- @Override
- public void setLabelProvider(ColumnLabelProvider labelProvider) {
- mLabelProvider = labelProvider;
- }
-
- public ColumnLabelProvider getLabelProvider() {
- return mLabelProvider;
- }
- }
-}
diff --git a/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/ui/SdkManagerUpgradeTest.java b/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/ui/SdkManagerUpgradeTest.java
deleted file mode 100755
index 00d9684..0000000
--- a/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/ui/SdkManagerUpgradeTest.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.sdkuilib.internal.repository.ui;
-
-import com.android.sdklib.SdkManager;
-import com.android.sdklib.SdkManagerTestCase;
-import com.android.sdklib.repository.SdkRepoConstants;
-import com.android.sdkuilib.internal.repository.MockDownloadCache;
-import com.android.sdkuilib.internal.repository.MockUpdaterData;
-
-import java.util.Arrays;
-
-public class SdkManagerUpgradeTest extends SdkManagerTestCase {
-
- @Override
- public void setUp() throws Exception {
- super.setUp();
- }
-
- @Override
- public void tearDown() throws Exception {
- super.tearDown();
- }
-
- /**
- * Create a mock page and list the current SDK state
- */
- public void testPackagesPage1() throws Exception {
- SdkManager sdkman = getSdkManager();
-
- MockUpdaterData updaterData = new MockUpdaterData(sdkman);
- MockDownloadCache cache = (MockDownloadCache) updaterData.getDownloadCache();
- updaterData.setupDefaultSources();
-
- MockPackagesPageImpl pageImpl = new MockPackagesPageImpl(updaterData);
- pageImpl.postCreate();
- pageImpl.performFirstLoad();
-
- // We have no network access possible and no mock download cache items.
- // The only thing visible in the display are the local packages as set by
- // the fake locally-installed SDK.
- String actual = pageImpl.getMockTreeDisplay();
- assertEquals(
- "[] Tools | | | \n" +
- " L_[] Android SDK Tools | | 0 | Installed\n" +
- "[] Android 0.0 (API 0) | | | \n" +
- " L_[] SDK Platform | | 1 | Installed\n" +
- " L_[] Sources for Android SDK | | 0 | Installed\n" +
- "[] Extras | | | ",
- actual);
-
- assertEquals(
- "[]", // there are no direct downloads till we try to install.
- Arrays.toString(cache.getDirectHits()));
- assertEquals(
- "[<https://dl-ssl.google.com/android/repository/addons_list-1.xml : 1>, " +
- "<https://dl-ssl.google.com/android/repository/addons_list-2.xml : 1>, " +
- "<https://dl-ssl.google.com/android/repository/repository-5.xml : 2>, " +
- "<https://dl-ssl.google.com/android/repository/repository-6.xml : 2>, " +
- "<https://dl-ssl.google.com/android/repository/repository-7.xml : 2>, " +
- "<https://dl-ssl.google.com/android/repository/repository.xml : 2>]",
- Arrays.toString(cache.getCachedHits()));
-
-
- // Now prepare a tools update on the server and reload
- setupToolsXml1(cache);
- cache.clearDirectHits();
- cache.clearCachedHits();
- pageImpl.fullReload();
-
- actual = pageImpl.getMockTreeDisplay();
- assertEquals(
- "[] Tools | | | \n" +
- " L_[] Android SDK Tools | | 0 | Update available: rev. 20.0.3\n" +
- " L_[] Android SDK Platform-tools | | 14 | Not installed \n" +
- "[] Android 0.0 (API 0) | | | \n" +
- " L_[] SDK Platform | | 1 | Installed \n" +
- " L_[] Sources for Android SDK | | 0 | Installed \n" +
- "[] Extras | | | ",
- actual);
-
- assertEquals(
- "[]", // there are no direct downloads till we try to install.
- Arrays.toString(cache.getDirectHits()));
- assertEquals(
- "[<https://dl-ssl.google.com/android/repository/repository-5.xml : 1>, " +
- "<https://dl-ssl.google.com/android/repository/repository-6.xml : 1>, " +
- "<https://dl-ssl.google.com/android/repository/repository-7.xml : 1>, " +
- "<https://dl-ssl.google.com/android/repository/repository.xml : 1>]",
- Arrays.toString(cache.getCachedHits()));
-
-
- // We should get the same display if we restart the manager page from scratch
- // (e.g. simulate a first load)
-
- cache.clearDirectHits();
- cache.clearCachedHits();
- pageImpl = new MockPackagesPageImpl(updaterData);
- pageImpl.postCreate();
- pageImpl.performFirstLoad();
-
- actual = pageImpl.getMockTreeDisplay();
- assertEquals(
- "[] Tools | | | \n" +
- " L_[] Android SDK Tools | | 0 | Update available: rev. 20.0.3\n" +
- " L_[] Android SDK Platform-tools | | 14 | Not installed \n" +
- "[] Android 0.0 (API 0) | | | \n" +
- " L_[] SDK Platform | | 1 | Installed \n" +
- " L_[] Sources for Android SDK | | 0 | Installed \n" +
- "[] Extras | | | ",
- actual);
-
- assertEquals(
- "[]", // there are no direct downloads till we try to install.
- Arrays.toString(cache.getDirectHits()));
- assertEquals(
- "[<https://dl-ssl.google.com/android/repository/repository-5.xml : 1>, " +
- "<https://dl-ssl.google.com/android/repository/repository-6.xml : 1>, " +
- "<https://dl-ssl.google.com/android/repository/repository-7.xml : 1>, " +
- "<https://dl-ssl.google.com/android/repository/repository.xml : 1>]",
- Arrays.toString(cache.getCachedHits()));
- }
-
- private void setupToolsXml1(MockDownloadCache cache) throws Exception {
- String repoXml =
- "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
- "<sdk:sdk-repository xmlns:sdk=\"http://schemas.android.com/sdk/android/repository/7\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" +
- "<sdk:license id=\"android-sdk-license\" type=\"text\">Blah blah blah.</sdk:license>\n" +
- "\n" +
- "<sdk:platform-tool>\n" +
- " <sdk:revision>\n" +
- " <sdk:major>14</sdk:major>\n" +
- " </sdk:revision>\n" +
- " <sdk:archives>\n" +
- " <sdk:archive arch=\"any\" os=\"windows\">\n" +
- " <sdk:size>11159472</sdk:size>\n" +
- " <sdk:checksum type=\"sha1\">6028258d8f2fba14d8b40c3cf507afa0289aaa13</sdk:checksum>\n" +
- " <sdk:url>platform-tools_r14-windows.zip</sdk:url>\n" +
- " </sdk:archive>\n" +
- " <sdk:archive arch=\"any\" os=\"linux\">\n" +
- " <sdk:size>10985068</sdk:size>\n" +
- " <sdk:checksum type=\"sha1\">6e2bc329c9485eb383172cbc2cde8b0c0cd1843f</sdk:checksum>\n" +
- " <sdk:url>platform-tools_r14-linux.zip</sdk:url>\n" +
- " </sdk:archive>\n" +
- " <sdk:archive arch=\"any\" os=\"macosx\">\n" +
- " <sdk:size>11342461</sdk:size>\n" +
- " <sdk:checksum type=\"sha1\">4a015090c6a209fc33972acdbc65745e0b3c08b9</sdk:checksum>\n" +
- " <sdk:url>platform-tools_r14-macosx.zip</sdk:url>\n" +
- " </sdk:archive>\n" +
- " </sdk:archives>\n" +
- "</sdk:platform-tool>\n" +
- "\n" +
- "<sdk:tool>\n" +
- " <sdk:revision>\n" +
- " <sdk:major>20</sdk:major>\n" +
- " <sdk:minor>0</sdk:minor>\n" +
- " <sdk:micro>3</sdk:micro>\n" +
- " </sdk:revision>\n" +
- " <sdk:min-platform-tools-rev>\n" +
- " <sdk:major>12</sdk:major>\n" +
- " </sdk:min-platform-tools-rev>\n" +
- " <sdk:archives>\n" +
- " <sdk:archive arch=\"any\" os=\"windows\">\n" +
- " <sdk:size>90272048</sdk:size>\n" +
- " <sdk:checksum type=\"sha1\">54fb94168e631e211910f88aa40c532205730dd4</sdk:checksum>\n" +
- " <sdk:url>tools_r20.0.3-windows.zip</sdk:url>\n" +
- " </sdk:archive>\n" +
- " <sdk:archive arch=\"any\" os=\"linux\">\n" +
- " <sdk:size>82723559</sdk:size>\n" +
- " <sdk:checksum type=\"sha1\">09bc633b406ae81981e3a0db19426acbb01ef219</sdk:checksum>\n" +
- " <sdk:url>tools_r20.0.3-linux.zip</sdk:url>\n" +
- " </sdk:archive>\n" +
- " <sdk:archive arch=\"any\" os=\"macosx\">\n" +
- " <sdk:size>58197071</sdk:size>\n" +
- " <sdk:checksum type=\"sha1\">09cee5ff3226277a6f0c07dcd29cba4ffc2e1da4</sdk:checksum>\n" +
- " <sdk:url>tools_r20.0.3-macosx.zip</sdk:url>\n" +
- " </sdk:archive>\n" +
- " </sdk:archives>\n" +
- "</sdk:tool>\n" +
- "\n" +
- "</sdk:sdk-repository>\n";
-
- String url = SdkRepoConstants.URL_GOOGLE_SDK_SITE +
- String.format(SdkRepoConstants.URL_DEFAULT_FILENAME, SdkRepoConstants.NS_LATEST_VERSION);
-
- cache.registerCachedPayload(url, repoXml.getBytes("UTF-8"));
- }
-
-}
diff --git a/swtmenubar/Android.mk b/swtmenubar/Android.mk
index 321a78a..865c277 100644
--- a/swtmenubar/Android.mk
+++ b/swtmenubar/Android.mk
@@ -12,25 +12,21 @@
# 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.
-#
+
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_JAVA_RESOURCE_DIRS := src
-
-ifeq ($(HOST_OS),darwin)
-LOCAL_SRC_FILES += $(call all-java-files-under, src-$(HOST_OS))
-LOCAL_JAVA_RESOURCE_DIRS += src-$(HOST_OS)
-endif
+# The swtmenubar code has moved to tools/swt/swtmenubar.
+# The rule below uses the prebuilt swtmenubar.jar if found.
LOCAL_MODULE := swtmenubar
LOCAL_MODULE_TAGS := optional
-
LOCAL_JAVA_LIBRARIES := \
swt \
org.eclipse.jface_3.6.2.M20110210-1200
+LOCAL_PREBUILT_JAVA_LIBRARIES := \
+ ../../prebuilts/devtools/$(LOCAL_MODULE)/$(LOCAL_MODULE)$(COMMON_JAVA_PACKAGE_SUFFIX)
-include $(BUILD_HOST_JAVA_LIBRARY)
+include $(BUILD_HOST_PREBUILT)
diff --git a/swtmenubar/src-darwin/com/android/menubar/internal/MenuBarEnhancerCocoa.java b/swtmenubar/src-darwin/com/android/menubar/internal/MenuBarEnhancerCocoa.java
deleted file mode 100644
index 88d230f..0000000
--- a/swtmenubar/src-darwin/com/android/menubar/internal/MenuBarEnhancerCocoa.java
+++ /dev/null
@@ -1,341 +0,0 @@
-/*
- * 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.
- *
- * History:
- * Original code by the <a href="http://www.simidude.com/blog/2008/macify-a-swt-application-in-a-cross-platform-way/">CarbonUIEnhancer from Agynami</a>
- * with the implementation being modified from the <a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.ui.cocoa/src/org/eclipse/ui/internal/cocoa/CocoaUIEnhancer.java">org.eclipse.ui.internal.cocoa.CocoaUIEnhancer</a>,
- * then modified by http://www.transparentech.com/opensource/cocoauienhancer to use reflection
- * rather than 'link' to SWT cocoa, and finally modified to be usable by the SwtMenuBar project.
- */
-
-package com.android.menubar.internal;
-
-import com.android.menubar.IMenuBarCallback;
-import com.android.menubar.IMenuBarEnhancer;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.internal.C;
-import org.eclipse.swt.internal.Callback;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-public class MenuBarEnhancerCocoa implements IMenuBarEnhancer {
-
- private static final long kAboutMenuItem = 0;
- private static final long kPreferencesMenuItem = 2;
- // private static final long kServicesMenuItem = 4;
- // private static final long kHideApplicationMenuItem = 6;
- private static final long kQuitMenuItem = 10;
-
- static long mSelPreferencesMenuItemSelected;
- static long mSelAboutMenuItemSelected;
- static Callback mProc3Args;
-
- private String mAppName;
-
- /**
- * Class invoked via the Callback object to run the about and preferences
- * actions.
- * <p>
- * If you don't use JFace in your application (SWT only), change the
- * {@link org.eclipse.jface.action.IAction}s to
- * {@link org.eclipse.swt.widgets.Listener}s.
- * </p>
- */
- private static class ActionProctarget {
- private final IMenuBarCallback mCallbacks;
-
- public ActionProctarget(IMenuBarCallback callbacks) {
- mCallbacks = callbacks;
- }
-
- /**
- * Will be called on 32bit SWT.
- */
- @SuppressWarnings("unused")
- public int actionProc(int id, int sel, int arg0) {
- return (int) actionProc((long) id, (long) sel, (long) arg0);
- }
-
- /**
- * Will be called on 64bit SWT.
- */
- public long actionProc(long id, long sel, long arg0) {
- if (sel == mSelAboutMenuItemSelected) {
- mCallbacks.onAboutMenuSelected();
- } else if (sel == mSelPreferencesMenuItemSelected) {
- mCallbacks.onPreferencesMenuSelected();
- } else {
- // Unknown selection!
- }
- // Return value is not used.
- return 0;
- }
- }
-
- /**
- * Construct a new CocoaUIEnhancer.
- *
- * @param mAppName The name of the application. It will be used to customize
- * the About and Quit menu items. If you do not wish to customize
- * the About and Quit menu items, just pass <tt>null</tt> here.
- */
- public MenuBarEnhancerCocoa() {
- }
-
- public MenuBarMode getMenuBarMode() {
- return MenuBarMode.MAC_OS;
- }
-
- /**
- * Setup the About and Preferences native menut items with the
- * given application name and links them to the callback.
- *
- * @param appName The application name.
- * @param display The SWT display. Must not be null.
- * @param callbacks The callbacks invoked by the menus.
- */
- public void setupMenu(
- String appName,
- Display display,
- IMenuBarCallback callbacks) {
-
- mAppName = appName;
-
- // This is our callback object whose 'actionProc' method will be called
- // when the About or Preferences menuItem is invoked.
- ActionProctarget target = new ActionProctarget(callbacks);
-
- try {
- // Initialize the menuItems.
- initialize(target);
- } catch (Exception e) {
- throw new IllegalStateException(e);
- }
-
- // Schedule disposal of callback object
- display.disposeExec(new Runnable() {
- public void run() {
- invoke(mProc3Args, "dispose");
- }
- });
- }
-
- private void initialize(Object callbackObject)
- throws Exception {
-
- Class<?> osCls = classForName("org.eclipse.swt.internal.cocoa.OS");
-
- // Register names in objective-c.
- if (mSelAboutMenuItemSelected == 0) {
- mSelPreferencesMenuItemSelected = registerName(osCls, "preferencesMenuItemSelected:"); //$NON-NLS-1$
- mSelAboutMenuItemSelected = registerName(osCls, "aboutMenuItemSelected:"); //$NON-NLS-1$
- }
-
- // Create an SWT Callback object that will invoke the actionProc method
- // of our internal callback Object.
- mProc3Args = new Callback(callbackObject, "actionProc", 3); //$NON-NLS-1$
- Method getAddress = Callback.class.getMethod("getAddress", new Class[0]);
- Object object = getAddress.invoke(mProc3Args, (Object[]) null);
- long proc3 = convertToLong(object);
- if (proc3 == 0) {
- SWT.error(SWT.ERROR_NO_MORE_CALLBACKS);
- }
-
- Class<?> nsMenuCls = classForName("org.eclipse.swt.internal.cocoa.NSMenu");
- Class<?> nsMenuitemCls = classForName("org.eclipse.swt.internal.cocoa.NSMenuItem");
- Class<?> nsStringCls = classForName("org.eclipse.swt.internal.cocoa.NSString");
- Class<?> nsApplicationCls = classForName("org.eclipse.swt.internal.cocoa.NSApplication");
-
- // Instead of creating a new delegate class in objective-c,
- // just use the current SWTApplicationDelegate. An instance of this
- // is a field of the Cocoa Display object and is already the target
- // for the menuItems. So just get this class and add the new methods
- // to it.
- object = invoke(osCls, "objc_lookUpClass", new Object[] {
- "SWTApplicationDelegate"
- });
- long cls = convertToLong(object);
-
- // Add the action callbacks for Preferences and About menu items.
- invoke(osCls, "class_addMethod",
- new Object[] {
- wrapPointer(cls),
- wrapPointer(mSelPreferencesMenuItemSelected),
- wrapPointer(proc3), "@:@"}); //$NON-NLS-1$
- invoke(osCls, "class_addMethod",
- new Object[] {
- wrapPointer(cls),
- wrapPointer(mSelAboutMenuItemSelected),
- wrapPointer(proc3), "@:@"}); //$NON-NLS-1$
-
- // Get the Mac OS X Application menu.
- Object sharedApplication = invoke(nsApplicationCls, "sharedApplication");
- Object mainMenu = invoke(sharedApplication, "mainMenu");
- Object mainMenuItem = invoke(nsMenuCls, mainMenu, "itemAtIndex", new Object[] {
- wrapPointer(0)
- });
- Object appMenu = invoke(mainMenuItem, "submenu");
-
- // Create the About <application-name> menu command
- Object aboutMenuItem =
- invoke(nsMenuCls, appMenu, "itemAtIndex", new Object[] {
- wrapPointer(kAboutMenuItem)
- });
- if (mAppName != null) {
- Object nsStr = invoke(nsStringCls, "stringWith", new Object[] {
- "About " + mAppName
- });
- invoke(nsMenuitemCls, aboutMenuItem, "setTitle", new Object[] {
- nsStr
- });
- }
- // Rename the quit action.
- if (mAppName != null) {
- Object quitMenuItem =
- invoke(nsMenuCls, appMenu, "itemAtIndex", new Object[] {
- wrapPointer(kQuitMenuItem)
- });
- Object nsStr = invoke(nsStringCls, "stringWith", new Object[] {
- "Quit " + mAppName
- });
- invoke(nsMenuitemCls, quitMenuItem, "setTitle", new Object[] {
- nsStr
- });
- }
-
- // Enable the Preferences menuItem.
- Object prefMenuItem =
- invoke(nsMenuCls, appMenu, "itemAtIndex", new Object[] {
- wrapPointer(kPreferencesMenuItem)
- });
- invoke(nsMenuitemCls, prefMenuItem, "setEnabled", new Object[] {
- true
- });
-
- // Set the action to execute when the About or Preferences menuItem is
- // invoked.
- //
- // We don't need to set the target here as the current target is the
- // SWTApplicationDelegate and we have registered the new selectors on
- // it. So just set the new action to invoke the selector.
- invoke(nsMenuitemCls, prefMenuItem, "setAction",
- new Object[] {
- wrapPointer(mSelPreferencesMenuItemSelected)
- });
- invoke(nsMenuitemCls, aboutMenuItem, "setAction",
- new Object[] {
- wrapPointer(mSelAboutMenuItemSelected)
- });
- }
-
- private long registerName(Class<?> osCls, String name)
- throws IllegalArgumentException, SecurityException, IllegalAccessException,
- InvocationTargetException, NoSuchMethodException {
- Object object = invoke(osCls, "sel_registerName", new Object[] {
- name
- });
- return convertToLong(object);
- }
-
- private long convertToLong(Object object) {
- if (object instanceof Integer) {
- Integer i = (Integer) object;
- return i.longValue();
- }
- if (object instanceof Long) {
- Long l = (Long) object;
- return l.longValue();
- }
- return 0;
- }
-
- private static Object wrapPointer(long value) {
- Class<?> PTR_CLASS = C.PTR_SIZEOF == 8 ? long.class : int.class;
- if (PTR_CLASS == long.class) {
- return new Long(value);
- } else {
- return new Integer((int) value);
- }
- }
-
- private static Object invoke(Class<?> clazz, String methodName, Object[] args) {
- return invoke(clazz, null, methodName, args);
- }
-
- private static Object invoke(Class<?> clazz, Object target, String methodName, Object[] args) {
- try {
- Class<?>[] signature = new Class<?>[args.length];
- for (int i = 0; i < args.length; i++) {
- Class<?> thisClass = args[i].getClass();
- if (thisClass == Integer.class)
- signature[i] = int.class;
- else if (thisClass == Long.class)
- signature[i] = long.class;
- else if (thisClass == Byte.class)
- signature[i] = byte.class;
- else if (thisClass == Boolean.class)
- signature[i] = boolean.class;
- else
- signature[i] = thisClass;
- }
- Method method = clazz.getMethod(methodName, signature);
- return method.invoke(target, args);
- } catch (Exception e) {
- throw new IllegalStateException(e);
- }
- }
-
- private Class<?> classForName(String classname) {
- try {
- Class<?> cls = Class.forName(classname);
- return cls;
- } catch (ClassNotFoundException e) {
- throw new IllegalStateException(e);
- }
- }
-
- private Object invoke(Class<?> cls, String methodName) {
- return invoke(cls, methodName, (Class<?>[]) null, (Object[]) null);
- }
-
- private Object invoke(Class<?> cls, String methodName, Class<?>[] paramTypes,
- Object... arguments) {
- try {
- Method m = cls.getDeclaredMethod(methodName, paramTypes);
- return m.invoke(null, arguments);
- } catch (Exception e) {
- throw new IllegalStateException(e);
- }
- }
-
- private Object invoke(Object obj, String methodName) {
- return invoke(obj, methodName, (Class<?>[]) null, (Object[]) null);
- }
-
- private Object invoke(Object obj, String methodName, Class<?>[] paramTypes, Object... arguments) {
- try {
- Method m = obj.getClass().getDeclaredMethod(methodName, paramTypes);
- return m.invoke(obj, arguments);
- } catch (Exception e) {
- throw new IllegalStateException(e);
- }
- }
-}
diff --git a/swtmenubar/src/com/android/menubar/IMenuBarCallback.java b/swtmenubar/src/com/android/menubar/IMenuBarCallback.java
deleted file mode 100644
index b0d6568..0000000
--- a/swtmenubar/src/com/android/menubar/IMenuBarCallback.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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.menubar;
-
-
-
-/**
- * Callbacks used by {@link IMenuBarEnhancer}.
- */
-public interface IMenuBarCallback {
- /**
- * Invoked when the About menu item is selected by the user.
- */
- abstract public void onAboutMenuSelected();
-
- /**
- * Invoked when the Preferences or Options menu item is selected by the user.
- */
- abstract public void onPreferencesMenuSelected();
-
- /**
- * Used by the enhancer implementations to report errors.
- *
- * @param format A printf-like format string.
- * @param args The parameters for the printf-like format string.
- */
- abstract public void printError(String format, Object...args);
-}
diff --git a/swtmenubar/src/com/android/menubar/IMenuBarEnhancer.java b/swtmenubar/src/com/android/menubar/IMenuBarEnhancer.java
deleted file mode 100644
index d835bd6..0000000
--- a/swtmenubar/src/com/android/menubar/IMenuBarEnhancer.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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.menubar;
-
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Menu;
-
-
-/**
- * Interface to the platform-specific MenuBarEnhancer implementation returned by
- * {@link MenuBarEnhancer#setupMenu}.
- */
-public interface IMenuBarEnhancer {
-
- /** Values that indicate how the menu bar is being handlded. */
- public enum MenuBarMode {
- /**
- * The Mac-specific About and Preferences are being used.
- * No File > Exit menu should be provided by the application.
- */
- MAC_OS,
- /**
- * The provided SWT {@link Menu} is being used for About and Options.
- * The application should provide a File > Exit menu.
- */
- GENERIC
- }
-
- /**
- * Returns a {@link MenuBarMode} enum that indicates how the menu bar is going to
- * or has been modified. This is implementation specific and can be called before or
- * after {@link #setupMenu}.
- * <p/>
- * Callers would typically call that to know if they need to hide or display
- * menu items. For example when {@link MenuBarMode#MAC_OS} is used, an app
- * would typically not need to provide any "File > Exit" menu item.
- *
- * @return One of the {@link MenuBarMode} values.
- */
- public MenuBarMode getMenuBarMode();
-
- /**
- * Updates the menu bar to provide an About menu item and a Preferences menu item.
- * Depending on the platform, the menu items might be decorated with the
- * given {@code appName}.
- * <p/>
- * Users should not call this directly.
- * {@link MenuBarEnhancer#setupMenu} should be used instead.
- *
- * @param appName Name used for the About menu item and similar. Must not be null.
- * @param display The SWT display. Must not be null.
- * @param callbacks Callbacks called when "About" and "Preferences" menu items are invoked.
- * Must not be null.
- */
- public void setupMenu(
- String appName,
- Display display,
- IMenuBarCallback callbacks);
-}
diff --git a/swtmenubar/src/com/android/menubar/MenuBarEnhancer.java b/swtmenubar/src/com/android/menubar/MenuBarEnhancer.java
deleted file mode 100644
index 7575ecd..0000000
--- a/swtmenubar/src/com/android/menubar/MenuBarEnhancer.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * 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.menubar;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-
-import com.android.menubar.IMenuBarEnhancer.MenuBarMode;
-
-
-/**
- * On Mac, {@link MenuBarEnhancer#setupMenu} plugs a listener on the About and the
- * Preferences menu items of the standard "application" menu in the menu bar.
- * On Windows or Linux, it adds relevant items to a given {@link Menu} linked to
- * the same listeners.
- */
-public final class MenuBarEnhancer {
-
- private MenuBarEnhancer() {
- }
-
- /**
- * Creates an instance of {@link IMenuBarEnhancer} specific to the current platform
- * and invoke its {@link IMenuBarEnhancer#setupMenu} to updates the menu bar.
- * <p/>
- * Depending on the platform, this will either hook into the existing About menu item
- * and a Preferences or Options menu item or add new ones to the given {@code swtMenu}.
- * Depending on the platform, the menu items might be decorated with the
- * given {@code appName}.
- * <p/>
- * Potential errors are reported through {@link IMenuBarCallback}.
- *
- * @param appName Name used for the About menu item and similar. Must not be null.
- * @param swtMenu For non-mac platform this is the menu where the "About" and
- * the "Options" menu items are created. Typically the menu might be
- * called "Tools". Must not be null.
- * @param callbacks Callbacks called when "About" and "Preferences" menu items are invoked.
- * Must not be null.
- * @return An actual {@link IMenuBarEnhancer} implementation. Can be null on failure.
- * This is currently not of any use for the caller but is left in case
- * we want to expand the functionality later.
- */
- public static IMenuBarEnhancer setupMenu(
- String appName,
- final Menu swtMenu,
- IMenuBarCallback callbacks) {
-
- IMenuBarEnhancer enhancer = getEnhancer(callbacks, swtMenu.getDisplay());
-
- // Default implementation for generic platforms
- if (enhancer == null) {
- enhancer = getGenericEnhancer(swtMenu);
- }
-
- try {
- enhancer.setupMenu(appName, swtMenu.getDisplay(), callbacks);
- } catch (Exception e) {
- // If the enhancer failed, try to fall back on the generic one
- if (enhancer.getMenuBarMode() != MenuBarMode.GENERIC) {
- enhancer = getGenericEnhancer(swtMenu);
- try {
- enhancer.setupMenu(appName, swtMenu.getDisplay(), callbacks);
- } catch (Exception e2) {
- callbacks.printError("SWTMenuBar failed: %s", e2.toString());
- return null;
- }
- }
- }
- return enhancer;
- }
-
- private static IMenuBarEnhancer getGenericEnhancer(final Menu swtMenu) {
- IMenuBarEnhancer enhancer;
- enhancer = new IMenuBarEnhancer() {
-
- public MenuBarMode getMenuBarMode() {
- return MenuBarMode.GENERIC;
- }
-
- public void setupMenu(
- String appName,
- Display display,
- final IMenuBarCallback callbacks) {
- if (swtMenu.getItemCount() > 0) {
- new MenuItem(swtMenu, SWT.SEPARATOR);
- }
-
- // Note: we use "Preferences" on Mac and "Options" on Windows/Linux.
- final MenuItem pref = new MenuItem(swtMenu, SWT.NONE);
- pref.setText("&Options...");
-
- final MenuItem about = new MenuItem(swtMenu, SWT.NONE);
- about.setText("&About...");
-
- pref.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- try {
- pref.setEnabled(false);
- callbacks.onPreferencesMenuSelected();
- super.widgetSelected(e);
- } finally {
- pref.setEnabled(true);
- }
- }
- });
-
- about.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- try {
- about.setEnabled(false);
- callbacks.onAboutMenuSelected();
- super.widgetSelected(e);
- } finally {
- about.setEnabled(true);
- }
- }
- });
- }
- };
- return enhancer;
- }
-
-
- public static IMenuBarEnhancer setupMenuManager(
- String appName,
- Display display,
- final IMenuManager menuManager,
- final IAction aboutAction,
- final IAction preferencesAction,
- final IAction quitAction) {
-
- IMenuBarCallback callbacks = new IMenuBarCallback() {
- public void printError(String format, Object... args) {
- System.err.println(String.format(format, args));
- }
-
- public void onPreferencesMenuSelected() {
- if (preferencesAction != null) {
- preferencesAction.run();
- }
- }
-
- public void onAboutMenuSelected() {
- if (aboutAction != null) {
- aboutAction.run();
- }
- }
- };
-
- IMenuBarEnhancer enhancer = getEnhancer(callbacks, display);
-
- // Default implementation for generic platforms
- if (enhancer == null) {
- enhancer = new IMenuBarEnhancer() {
-
- public MenuBarMode getMenuBarMode() {
- return MenuBarMode.GENERIC;
- }
-
- public void setupMenu(
- String appName,
- Display display,
- final IMenuBarCallback callbacks) {
- if (!menuManager.isEmpty()) {
- menuManager.add(new Separator());
- }
-
- if (aboutAction != null) {
- menuManager.add(aboutAction);
- }
- if (preferencesAction != null) {
- menuManager.add(preferencesAction);
- }
- if (quitAction != null) {
- if (aboutAction != null || preferencesAction != null) {
- menuManager.add(new Separator());
- }
- menuManager.add(quitAction);
- }
- }
- };
- }
-
- enhancer.setupMenu(appName, display, callbacks);
- return enhancer;
- }
-
- private static IMenuBarEnhancer getEnhancer(IMenuBarCallback callbacks, Display display) {
- IMenuBarEnhancer enhancer = null;
- String p = SWT.getPlatform();
- String className = null;
- if ("cocoa".equals(p)) { //$NON-NLS-1$
- className = "com.android.menubar.internal.MenuBarEnhancerCocoa"; //$NON-NLS-1$
-
- if (SWT.getVersion() >= 3700 && MenuBarEnhancer37.isSupported(display)) {
- className = MenuBarEnhancer37.class.getName();
- }
- }
-
- if (System.getenv("DEBUG_SWTMENUBAR") != null) {
- callbacks.printError("DEBUG SwtMenuBar: SWT=%1$s, class=%2$s", p, className);
- }
-
- if (className != null) {
- try {
- Class<?> clazz = Class.forName(className);
- enhancer = (IMenuBarEnhancer) clazz.newInstance();
- } catch (Exception e) {
- // Log an error and fallback on the default implementation.
- callbacks.printError(
- "Failed to instantiate %1$s: %2$s", //$NON-NLS-1$
- className,
- e.toString());
- }
- }
- return enhancer;
- }
-}
diff --git a/swtmenubar/src/com/android/menubar/MenuBarEnhancer37.java b/swtmenubar/src/com/android/menubar/MenuBarEnhancer37.java
deleted file mode 100644
index 8560bfa..0000000
--- a/swtmenubar/src/com/android/menubar/MenuBarEnhancer37.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright (C) 2012 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.
- *
- * References:
- * Based on the SWT snippet example at
- * http://dev.eclipse.org/viewcvs/viewvc.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet354.java?view=co
- */
-
-package com.android.menubar;
-
-
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-
-import java.lang.reflect.Method;
-
-public class MenuBarEnhancer37 implements IMenuBarEnhancer {
-
- private static final int kAboutMenuItem = -1; // SWT.ID_ABOUT in SWT 3.7
- private static final int kPreferencesMenuItem = -2; // SWT.ID_PREFERENCES in SWT 3.7
- private static final int kQuitMenuItem = -6; // SWT.ID_QUIT in SWT 3.7
-
- public MenuBarEnhancer37() {
- }
-
- public MenuBarMode getMenuBarMode() {
- return MenuBarMode.MAC_OS;
- }
-
- /**
- * Setup the About and Preferences native menut items with the
- * given application name and links them to the callback.
- *
- * @param appName The application name.
- * @param display The SWT display. Must not be null.
- * @param callbacks The callbacks invoked by the menus.
- */
- public void setupMenu(
- String appName,
- Display display,
- IMenuBarCallback callbacks) {
-
- try {
- // Initialize the menuItems.
- initialize(display, appName, callbacks);
- } catch (Exception e) {
- throw new IllegalStateException(e);
- }
-
- // Schedule disposal of callback object
- display.disposeExec(new Runnable() {
- public void run() {
- }
- });
- }
-
- /**
- * Checks whether the required SWT 3.7 APIs are available.
- * <br/>
- * Calling this will load the class, which is OK since this class doesn't
- * directly use any SWT 3.7 API -- instead it uses reflection so that the
- * code can be loaded under SWT 3.6.
- *
- * @param display The current SWT display.
- * @return True if the SWT 3.7 API are available and this enhancer can be used.
- */
- public static boolean isSupported(Display display) {
- try {
- Object sysMenu = call0(display, "getSystemMenu");
- if (sysMenu instanceof Menu) {
- return findMenuById((Menu)sysMenu, kPreferencesMenuItem) != null &&
- findMenuById((Menu)sysMenu, kAboutMenuItem) != null;
- }
- } catch (Exception ignore) {}
- return false;
- }
-
- private void initialize(
- Display display,
- String appName,
- final IMenuBarCallback callbacks)
- throws Exception {
- Object sysMenu = call0(display, "getSystemMenu");
- if (sysMenu instanceof Menu) {
- MenuItem menu = findMenuById((Menu)sysMenu, kPreferencesMenuItem);
- if (menu != null) {
- menu.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent event) {
- callbacks.onPreferencesMenuSelected();
- }
- });
- }
-
- menu = findMenuById((Menu)sysMenu, kAboutMenuItem);
- if (menu != null) {
- menu.addSelectionListener(new SelectionAdapter() {
- @Override
- public void widgetSelected(SelectionEvent event) {
- callbacks.onAboutMenuSelected();
- }
- });
- menu.setText("About " + appName);
- }
-
- menu = findMenuById((Menu)sysMenu, kQuitMenuItem);
- if (menu != null) {
- // We already support the "quit" operation, no need for an extra handler here.
- menu.setText("Quit " + appName);
- }
-
- }
- }
-
- private static Object call0(Object obj, String method) {
- try {
- Method m = obj.getClass().getMethod(method, (Class<?>[])null);
- if (m != null) {
- return m.invoke(obj, (Object[])null);
- }
- } catch (Exception ignore) {}
- return null;
- }
-
- private static MenuItem findMenuById(Menu menu, int id) {
- MenuItem[] items = menu.getItems();
- for (int i = items.length - 1; i >= 0; i--) {
- MenuItem item = items[i];
- Object menuId = call0(item, "getID");
- if (menuId instanceof Integer) {
- if (((Integer) menuId).intValue() == id) {
- return item;
- }
- }
- }
- return null;
- }
-}