aboutsummaryrefslogtreecommitdiffstats
path: root/eclipse/plugins/com.android.ide.eclipse.adt
diff options
context:
space:
mode:
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/.classpath30
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/.gitignore1
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/META-INF/MANIFEST.MF10
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/adt-platform-juno-sr2.target25
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/adt.launch33
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/build.properties3
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/libs/.gitignore1
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/pom.xml17
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtPlugin.java43
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtUtils.java52
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/VersionCheck.java2
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/AddSupportJarAction.java111
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/AvdManagerAction.java2
-rwxr-xr-xeclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/DexDumpAction.java19
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/SdkManagerAction.java10
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/BuildHelper.java12
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/DexWrapper.java3
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/BaseBuilder.java1
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PreCompilerBuilder.java15
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/ResourceManagerBuilder.java31
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/Hyperlinks.java2
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/AndroidXmlFormattingStrategy.java5
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/ProjectCallback.java69
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/Configuration.java8
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationChooser.java8
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationDescription.java8
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ThemeMenuAction.java43
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java40
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LintOverlay.java3
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderService.java15
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestInfo.java171
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/DeviceChooserDialog.java2
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/EmulatorConfigTab.java2
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/InstrumentationRunnerValidator.java8
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/EclipseLintClient.java194
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintFix.java4
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/SetAttributeFix.java8
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/BaseClasspathContainerInitializer.java97
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ExportHelper.java24
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/LibraryClasspathContainerInitializer.java4
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ProjectHelper.java23
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/Sdk.java46
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/welcome/AdtStartup.java6
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/ExportWizard.java22
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/BuildFileCreator.java100
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/GradleExportWizard.java1
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ImportInsteadPage.java56
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewActivityWizard.java29
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewProjectPage.java8
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewProjectWizard.java30
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewTemplateWizard.java8
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewTemplateWizardState.java2
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateHandler.java147
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateManager.java9
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateMetadata.java39
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateWizard.java19
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TypedVariable.java50
57 files changed, 1329 insertions, 402 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/.classpath b/eclipse/plugins/com.android.ide.eclipse.adt/.classpath
index 89b762f..fcf27a5 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/.classpath
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/.classpath
@@ -3,20 +3,20 @@
<classpathentry excluding="Makefile|resources/" kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
- <classpathentry exported="true" kind="lib" path="libs/ninepatch.jar" sourcepath="/ninepatch"/>
- <classpathentry exported="true" kind="lib" path="libs/sdkuilib.jar" sourcepath="/sdkuilib"/>
- <classpathentry exported="true" kind="lib" path="libs/rule-api.jar" sourcepath="/rule-api"/>
- <classpathentry exported="true" kind="lib" path="libs/lint-api.jar" sourcepath="/lint-api"/>
- <classpathentry exported="true" kind="lib" path="libs/lint-checks.jar" sourcepath="/lint-checks"/>
- <classpathentry exported="true" kind="lib" path="libs/asset-studio.jar" sourcepath="/asset-studio"/>
- <classpathentry exported="true" kind="lib" path="libs/ant-glob.jar"/>
- <classpathentry exported="true" kind="lib" path="libs/freemarker-2.3.19.jar"/>
- <classpathentry exported="true" kind="lib" path="libs/manifest-merger.jar" sourcepath="/ManifestMerger"/>
- <classpathentry exported="true" kind="lib" path="libs/lombok-ast-0.2.jar"/>
- <classpathentry exported="true" kind="lib" path="libs/propertysheet.jar"/>
- <classpathentry exported="true" kind="lib" path="libs/asm-4.0.jar"/>
- <classpathentry exported="true" kind="lib" path="libs/asm-analysis-4.0.jar"/>
- <classpathentry exported="true" kind="lib" path="libs/asm-tree-4.0.jar"/>
- <classpathentry exported="true" kind="lib" path="libs/swtmenubar.jar"/>
+ <classpathentry exported="true" kind="lib" path="libs/ninepatch.jar" sourcepath="/ninepatch"/>
+ <classpathentry exported="true" kind="lib" path="libs/sdkuilib.jar" sourcepath="/sdkuilib"/>
+ <classpathentry exported="true" kind="lib" path="libs/rule-api.jar" sourcepath="/rule-api"/>
+ <classpathentry exported="true" kind="lib" path="libs/lint-api.jar" sourcepath="/lint-api"/>
+ <classpathentry exported="true" kind="lib" path="libs/lint-checks.jar" sourcepath="/lint-checks"/>
+ <classpathentry exported="true" kind="lib" path="libs/asset-studio.jar" sourcepath="/asset-studio"/>
+ <classpathentry exported="true" kind="lib" path="libs/ant-glob.jar"/>
+ <classpathentry exported="true" kind="lib" path="libs/freemarker-2.3.20.jar"/>
+ <classpathentry exported="true" kind="lib" path="libs/manifest-merger.jar" sourcepath="/ManifestMerger"/>
+ <classpathentry exported="true" kind="lib" path="libs/lombok-ast-0.2.2.jar"/>
+ <classpathentry exported="true" kind="lib" path="libs/propertysheet.jar"/>
+ <classpathentry exported="true" kind="lib" path="libs/asm-4.0.jar"/>
+ <classpathentry exported="true" kind="lib" path="libs/asm-analysis-4.0.jar"/>
+ <classpathentry exported="true" kind="lib" path="libs/asm-tree-4.0.jar"/>
+ <classpathentry exported="true" kind="lib" path="libs/swtmenubar.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/.gitignore b/eclipse/plugins/com.android.ide.eclipse.adt/.gitignore
deleted file mode 100644
index d392f0e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*.jar
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/META-INF/MANIFEST.MF b/eclipse/plugins/com.android.ide.eclipse.adt/META-INF/MANIFEST.MF
index bd72b31..77eb219 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/META-INF/MANIFEST.MF
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/META-INF/MANIFEST.MF
@@ -2,16 +2,16 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Android Development Toolkit
Bundle-SymbolicName: com.android.ide.eclipse.adt;singleton:=true
-Bundle-Version: 22.3.0.qualifier
+Bundle-Version: 23.0.2.qualifier
Bundle-ClassPath: .,
libs/sdkuilib.jar,
libs/ninepatch.jar,
- libs/freemarker-2.3.19.jar,
+ libs/freemarker-2.3.20.jar,
libs/rule-api.jar,
libs/asset-studio.jar,
libs/lint-api.jar,
libs/lint-checks.jar,
- libs/lombok-ast-0.2.jar,
+ libs/lombok-ast-0.2.2.jar,
libs/asm-4.0.jar,
libs/asm-tree-4.0.jar,
libs/asm-analysis-4.0.jar,
@@ -53,9 +53,7 @@ Require-Bundle: com.android.ide.eclipse.base,
org.eclipse.core.expressions,
org.eclipse.compare
Bundle-ActivationPolicy: lazy
-Export-Package: com.android.assetstudiolib;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.common.api;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.common.layout;x-friends:="com.android.ide.eclipse.tests",
+Export-Package: com.android.ide.common.layout;x-friends:="com.android.ide.eclipse.tests",
com.android.ide.common.layout.grid;x-friends:="com.android.ide.eclipse.tests",
com.android.ide.common.layout.relative;x-friends:="com.android.ide.eclipse.tests",
com.android.ide.common.resources.platform;x-friends:="com.android.ide.eclipse.tests",
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/adt-platform-juno-sr2.target b/eclipse/plugins/com.android.ide.eclipse.adt/adt-platform-juno-sr2.target
new file mode 100644
index 0000000..b63f382
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/adt-platform-juno-sr2.target
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?pde version="3.8"?>
+
+<target name="adt-platform-juno-sr2" sequenceNumber="4">
+<locations>
+<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
+<unit id="org.eclipse.platform.ide" version="4.2.2.M20130204-1200"/>
+<unit id="org.eclipse.gef.feature.group" version="3.9.0.201212170307"/>
+<unit id="org.eclipse.wst.xml_ui.feature.feature.group" version="3.4.2.v201211061806-7H7GFeJDxumUrsn5qkiQgOEhsz0p60HAmPyU6VX"/>
+<unit id="org.eclipse.pde.source.feature.group" version="3.8.2.v20130116-091538-7c7wFj0FFt6Zr9bd4AM1JEQMS"/>
+<unit id="org.eclipse.emf.codegen.feature.group" version="2.8.0.v20130125-0826"/>
+<unit id="org.eclipse.jdt.feature.group" version="3.8.2.v20130116-090414-8-8nFu3FNOfwKLRuqgXKIy9z0I83"/>
+<unit id="org.eclipse.emf.ecore.feature.group" version="2.8.3.v20130125-0546"/>
+<unit id="org.eclipse.emf.common.feature.group" version="2.8.0.v20130125-0546"/>
+<unit id="org.eclipse.jdt.source.feature.group" version="3.8.2.v20130116-090414-8-8nFu3FNOfwKLRuqgXKIy9z0I83"/>
+<unit id="org.eclipse.emf.feature.group" version="2.8.3.v20130125-0826"/>
+<unit id="org.eclipse.cdt.feature.group" version="8.1.2.201302132326"/>
+<unit id="org.eclipse.egit.feature.group" version="2.2.0.201212191850-r"/>
+<unit id="org.eclipse.emf.common.ui.feature.group" version="2.7.0.v20130125-0826"/>
+<unit id="org.eclipse.emf.codegen.ui.feature.group" version="2.7.0.v20130125-0826"/>
+<unit id="org.eclipse.wb.core.xml.feature.feature.group" version="1.5.2.r42x201302111919"/>
+<repository location="http://download.eclipse.org/releases/juno"/>
+</location>
+</locations>
+</target>
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/adt.launch b/eclipse/plugins/com.android.ide.eclipse.adt/adt.launch
new file mode 100644
index 0000000..5699837
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/adt.launch
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.RuntimeWorkbench">
+<booleanAttribute key="append.args" value="true"/>
+<booleanAttribute key="askclear" value="true"/>
+<booleanAttribute key="automaticAdd" value="true"/>
+<booleanAttribute key="automaticValidate" value="false"/>
+<stringAttribute key="bootstrap" value=""/>
+<stringAttribute key="checked" value="[NONE]"/>
+<booleanAttribute key="clearConfig" value="false"/>
+<booleanAttribute key="clearws" value="false"/>
+<booleanAttribute key="clearwslog" value="false"/>
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/adt"/>
+<booleanAttribute key="default" value="false"/>
+<stringAttribute key="deselected_workspace_plugins" value="com.android.ide.eclipse.monitor"/>
+<booleanAttribute key="includeOptional" value="true"/>
+<stringAttribute key="location" value="${workspace_loc}/../runtime-adt-idea133-ksr2"/>
+<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-XX:MaxPermSize=256m&#10;-Xms128m&#10;-Xmx1024m"/>
+<stringAttribute key="pde.version" value="3.3"/>
+<stringAttribute key="product" value="org.eclipse.platform.ide"/>
+<stringAttribute key="selected_target_plugins" value="com.android.tools.asset-studio@default:default,com.android.tools.build.er-model@default:default,com.android.tools.build.manifest-merger@default:default,com.android.tools.common@default:default,com.android.tools.ddms.ddmlib@default:default,com.android.tools.ddms.ddmuilib@default:default,com.android.tools.dvlib@default:default,com.android.tools.external.ant-glob@default:default,com.android.tools.external.liblzf@default:default,com.android.tools.external.libprotobuf-java-lite@default:default,com.android.tools.external.lombok.ast@default:default,com.android.tools.external.propertysheet@default:default,com.android.tools.hierarchyviewer2lib@default:default,com.android.tools.layoutlib.api@default:default,com.android.tools.lint.api@default:default,com.android.tools.lint.checks@default:default,com.android.tools.ninepatch@default:default,com.android.tools.rule-api@default:default,com.android.tools.sdk-common@default:default,com.android.tools.sdklib@default:default,com.android.tools.sdkstats@default:default,com.android.tools.sdkuilib@default:default,com.android.tools.swtmenubar@default:default,com.android.tools.testutils@default:default,com.android.tools.traceview@default:default,com.android.tools.uiautomatorviewer@default:default,com.google.guava@default:default,com.ibm.icu@default:default,com.jcraft.jsch@default:default,com.sun.el@default:default,commons-logging@default:default,java_cup.runtime@default:default,javax.activation@default:default,javax.annotation@default:default,javax.el@default:default,javax.inject@default:default,javax.jws@default:default,javax.mail@default:default,javax.persistence@default:default,javax.servlet.jsp@default:default,javax.servlet@default:default,javax.wsdl*1.5.1.v201012040544@default:default,javax.wsdl*1.6.2.v201012040545@default:default,javax.xml.bind@default:default,javax.xml.rpc@default:default,javax.xml.soap@default:default,javax.xml.stream@default:default,javax.xml.ws@default:default,javax.xml@default:default,jfree.chart-swt@default:default,jfree.chart@default:default,jfree.jcommon@default:default,junit@default:default,net.sf.kxml.2@default:default,net.sourceforge.lpg.lpgjavaruntime@default:default,org.apache.ant@default:default,org.apache.axis@default:default,org.apache.batik.css@default:default,org.apache.batik.util.gui@default:default,org.apache.batik.util@default:default,org.apache.bcel@default:default,org.apache.commons.codec*1.4.0.v201209201156@default:default,org.apache.commons.codec*1.4.0@default:default,org.apache.commons.collections@default:default,org.apache.commons.compress@default:default,org.apache.commons.discovery@default:default,org.apache.commons.lang@default:default,org.apache.commons.logging*1.0.4.v201101211617@default:default,org.apache.commons.logging*1.1.1.v201101211721@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.httpcomponents.httpclient*4.1.1@default:default,org.apache.httpcomponents.httpclient*4.1.3.v201209201135@default:default,org.apache.httpcomponents.httpcore*4.1.0@default:default,org.apache.httpcomponents.httpcore*4.1.4.v201203221030@default:default,org.apache.httpcomponents.httpmime@default:default,org.apache.jasper.glassfish@default:default,org.apache.log4j@default:default,org.apache.lucene.analysis@default:default,org.apache.lucene.core@default:default,org.apache.velocity@default:default,org.apache.wsil4j@default:default,org.apache.xalan@default:default,org.apache.xerces@default:default,org.apache.xml.resolver@default:default,org.apache.xml.serializer@default:default,org.eclipse.ant.core@default:default,org.eclipse.ant.launching@default:default,org.eclipse.ant.ui@default:default,org.eclipse.cdt.autotools.core@default:default,org.eclipse.cdt.autotools.docs@default:default,org.eclipse.cdt.autotools.ui@default:default,org.eclipse.cdt.build.crossgcc@default:default,org.eclipse.cdt.codan.checkers.ui@default:default,org.eclipse.cdt.codan.checkers@default:default,org.eclipse.cdt.codan.core.cxx@default:default,org.eclipse.cdt.codan.core@default:default,org.eclipse.cdt.codan.ui.cxx@default:default,org.eclipse.cdt.codan.ui@default:default,org.eclipse.cdt.core.aix@default:false,org.eclipse.cdt.core.linux.ppc64@default:false,org.eclipse.cdt.core.linux.x86@default:false,org.eclipse.cdt.core.linux.x86_64@default:false,org.eclipse.cdt.core.linux@default:false,org.eclipse.cdt.core.lrparser.xlc@default:default,org.eclipse.cdt.core.lrparser@default:default,org.eclipse.cdt.core.macosx@default:false,org.eclipse.cdt.core.parser.upc@default:default,org.eclipse.cdt.core.solaris@default:false,org.eclipse.cdt.core.win32.x86@default:false,org.eclipse.cdt.core.win32.x86_64@default:false,org.eclipse.cdt.core.win32@default:false,org.eclipse.cdt.core@default:default,org.eclipse.cdt.debug.core@default:default,org.eclipse.cdt.debug.gdbjtag.core@default:default,org.eclipse.cdt.debug.gdbjtag.ui@default:default,org.eclipse.cdt.debug.gdbjtag@default:default,org.eclipse.cdt.debug.mi.core@default:default,org.eclipse.cdt.debug.mi.ui@default:default,org.eclipse.cdt.debug.ui.memory.floatingpoint@default:default,org.eclipse.cdt.debug.ui.memory.memorybrowser@default:default,org.eclipse.cdt.debug.ui.memory.search@default:default,org.eclipse.cdt.debug.ui.memory.traditional@default:default,org.eclipse.cdt.debug.ui.memory.transport@default:default,org.eclipse.cdt.debug.ui@default:default,org.eclipse.cdt.doc.isv@default:default,org.eclipse.cdt.doc.user@default:default,org.eclipse.cdt.dsf.gdb.multicorevisualizer.ui@default:default,org.eclipse.cdt.dsf.gdb.ui@default:default,org.eclipse.cdt.dsf.gdb@default:default,org.eclipse.cdt.dsf.ui@default:default,org.eclipse.cdt.dsf@default:default,org.eclipse.cdt.errorparsers.xlc@default:default,org.eclipse.cdt.examples.dsf.pda.ui@default:default,org.eclipse.cdt.examples.dsf.pda@default:default,org.eclipse.cdt.examples.dsf@default:default,org.eclipse.cdt.gdb.ui@default:default,org.eclipse.cdt.gdb@default:default,org.eclipse.cdt.launch.remote@default:default,org.eclipse.cdt.launch@default:default,org.eclipse.cdt.make.core@default:default,org.eclipse.cdt.make.ui@default:default,org.eclipse.cdt.make.xlc.core@default:default,org.eclipse.cdt.managedbuilder.bupc.ui@default:default,org.eclipse.cdt.managedbuilder.core@default:default,org.eclipse.cdt.managedbuilder.gnu.ui@default:default,org.eclipse.cdt.managedbuilder.llvm.ui@default:default,org.eclipse.cdt.managedbuilder.ui@default:default,org.eclipse.cdt.managedbuilder.xlc.core@default:default,org.eclipse.cdt.managedbuilder.xlc.ui@default:default,org.eclipse.cdt.managedbuilder.xlupc.ui@default:default,org.eclipse.cdt.msw.build@default:default,org.eclipse.cdt.qt.core@default:default,org.eclipse.cdt.qt.ui@default:default,org.eclipse.cdt.sdk@default:default,org.eclipse.cdt.testsrunner.boost@default:default,org.eclipse.cdt.testsrunner.gtest@default:default,org.eclipse.cdt.testsrunner.qttest@default:default,org.eclipse.cdt.testsrunner@default:default,org.eclipse.cdt.ui@default:default,org.eclipse.cdt.util@default:default,org.eclipse.cdt.visualizer.core@default:default,org.eclipse.cdt.visualizer.ui@default:default,org.eclipse.cdt@default:default,org.eclipse.compare.core@default:default,org.eclipse.compare@default:default,org.eclipse.core.commands@default:default,org.eclipse.core.contenttype@default:default,org.eclipse.core.databinding.beans@default:default,org.eclipse.core.databinding.observable@default:default,org.eclipse.core.databinding.property@default:default,org.eclipse.core.databinding@default:default,org.eclipse.core.expressions@default:default,org.eclipse.core.externaltools@default:default,org.eclipse.core.filebuffers@default:default,org.eclipse.core.filesystem.linux.x86_64@default:false,org.eclipse.core.filesystem@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.net.linux.x86_64@default:false,org.eclipse.core.net@default:default,org.eclipse.core.resources@default:default,org.eclipse.core.runtime.compatibility.registry@default:false,org.eclipse.core.runtime.compatibility@default:default,org.eclipse.core.runtime@default:true,org.eclipse.core.variables@default:default,org.eclipse.debug.core@default:default,org.eclipse.debug.ui@default:default,org.eclipse.draw2d.doc.isv@default:default,org.eclipse.draw2d@default:default,org.eclipse.e4.core.commands@default:default,org.eclipse.e4.core.contexts@default:default,org.eclipse.e4.core.di.extensions@default:default,org.eclipse.e4.core.di@default:default,org.eclipse.e4.core.services@default:default,org.eclipse.e4.ui.bindings@default:default,org.eclipse.e4.ui.css.core@default:default,org.eclipse.e4.ui.css.swt.theme@default:default,org.eclipse.e4.ui.css.swt@default:default,org.eclipse.e4.ui.di@default:default,org.eclipse.e4.ui.model.workbench@default:default,org.eclipse.e4.ui.services@default:default,org.eclipse.e4.ui.widgets@default:default,org.eclipse.e4.ui.workbench.addons.swt@default:default,org.eclipse.e4.ui.workbench.renderers.swt@default:default,org.eclipse.e4.ui.workbench.swt@default:default,org.eclipse.e4.ui.workbench3@default:default,org.eclipse.e4.ui.workbench@default:default,org.eclipse.ecf.filetransfer@default:default,org.eclipse.ecf.identity@default:default,org.eclipse.ecf.provider.filetransfer.httpclient4.ssl@default:false,org.eclipse.ecf.provider.filetransfer.httpclient4@default:default,org.eclipse.ecf.provider.filetransfer.ssl@default:false,org.eclipse.ecf.provider.filetransfer@default:default,org.eclipse.ecf.ssl@default:false,org.eclipse.ecf@default:default,org.eclipse.emf.activities@default:default,org.eclipse.emf.ant@default:default,org.eclipse.emf.cheatsheets@default:default,org.eclipse.emf.codegen.ecore.ui@default:default,org.eclipse.emf.codegen.ecore@default:default,org.eclipse.emf.codegen.ui@default:default,org.eclipse.emf.codegen@default:default,org.eclipse.emf.common.ui@default:default,org.eclipse.emf.common@default:default,org.eclipse.emf.converter@default:default,org.eclipse.emf.databinding.edit@default:default,org.eclipse.emf.databinding@default:default,org.eclipse.emf.doc@default:default,org.eclipse.emf.ecore.change.edit@default:default,org.eclipse.emf.ecore.change@default:default,org.eclipse.emf.ecore.edit@default:default,org.eclipse.emf.ecore.editor@default:default,org.eclipse.emf.ecore.xmi@default:default,org.eclipse.emf.ecore@default:default,org.eclipse.emf.edit.ui@default:default,org.eclipse.emf.edit@default:default,org.eclipse.emf.example.installer@default:default,org.eclipse.emf.examples.databinding.project.core.model@default:default,org.eclipse.emf.examples.databinding.project.core@default:default,org.eclipse.emf.examples.databinding.project.ui.rcp@default:default,org.eclipse.emf.examples.generator.validator@default:default,org.eclipse.emf.examples.jet.article2@default:default,org.eclipse.emf.examples.library.edit@default:default,org.eclipse.emf.examples.library.editor@default:default,org.eclipse.emf.examples.library@default:default,org.eclipse.emf.examples@default:default,org.eclipse.emf.exporter.html@default:default,org.eclipse.emf.exporter@default:default,org.eclipse.emf.importer.ecore@default:default,org.eclipse.emf.importer.java@default:default,org.eclipse.emf.importer.rose@default:default,org.eclipse.emf.importer@default:default,org.eclipse.emf.java.edit@default:default,org.eclipse.emf.java.editor@default:default,org.eclipse.emf.java@default:default,org.eclipse.emf.mapping.ecore.editor@default:default,org.eclipse.emf.mapping.ecore2ecore.editor@default:default,org.eclipse.emf.mapping.ecore2ecore@default:default,org.eclipse.emf.mapping.ecore2xml.ui@default:default,org.eclipse.emf.mapping.ecore2xml@default:default,org.eclipse.emf.mapping.ecore@default:default,org.eclipse.emf.mapping.ui@default:default,org.eclipse.emf.mapping.xsd2ecore.editor@default:default,org.eclipse.emf.mapping.xsd2ecore@default:default,org.eclipse.emf.mapping@default:default,org.eclipse.emf@default:default,org.eclipse.equinox.app@default:default,org.eclipse.equinox.bidi@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.event@default:default,org.eclipse.equinox.frameworkadmin.equinox@default:default,org.eclipse.equinox.frameworkadmin@default:default,org.eclipse.equinox.http.jetty@default:default,org.eclipse.equinox.http.registry@default:default,org.eclipse.equinox.http.servlet@default:default,org.eclipse.equinox.jsp.jasper.registry@default:default,org.eclipse.equinox.jsp.jasper@default:default,org.eclipse.equinox.launcher.gtk.linux.x86_64@default:false,org.eclipse.equinox.launcher@default:default,org.eclipse.equinox.p2.artifact.repository@default:default,org.eclipse.equinox.p2.console@default:default,org.eclipse.equinox.p2.core@default:default,org.eclipse.equinox.p2.director.app@default:default,org.eclipse.equinox.p2.director@default:default,org.eclipse.equinox.p2.directorywatcher@default:default,org.eclipse.equinox.p2.engine@default:default,org.eclipse.equinox.p2.extensionlocation@default:default,org.eclipse.equinox.p2.garbagecollector@default:default,org.eclipse.equinox.p2.jarprocessor@default:default,org.eclipse.equinox.p2.metadata.repository@default:default,org.eclipse.equinox.p2.metadata@default:default,org.eclipse.equinox.p2.operations@default:default,org.eclipse.equinox.p2.publisher.eclipse@default:default,org.eclipse.equinox.p2.publisher@default:default,org.eclipse.equinox.p2.ql@default:default,org.eclipse.equinox.p2.reconciler.dropins@default:default,org.eclipse.equinox.p2.repository.tools@default:default,org.eclipse.equinox.p2.repository@default:default,org.eclipse.equinox.p2.touchpoint.eclipse@default:default,org.eclipse.equinox.p2.touchpoint.natives@default:default,org.eclipse.equinox.p2.transport.ecf@default:default,org.eclipse.equinox.p2.ui.importexport@default:default,org.eclipse.equinox.p2.ui.sdk.scheduler@default:default,org.eclipse.equinox.p2.ui.sdk@default:default,org.eclipse.equinox.p2.ui@default:default,org.eclipse.equinox.p2.updatechecker@default:default,org.eclipse.equinox.p2.updatesite@default:default,org.eclipse.equinox.preferences@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.security.ui@default:default,org.eclipse.equinox.security@default:default,org.eclipse.equinox.simpleconfigurator.manipulator@default:default,org.eclipse.equinox.simpleconfigurator@1:true,org.eclipse.equinox.util@default:default,org.eclipse.gef.doc.isv@default:default,org.eclipse.gef.examples.flow@default:default,org.eclipse.gef.examples.logic@default:default,org.eclipse.gef.examples.shapes@default:default,org.eclipse.gef.examples.text@default:default,org.eclipse.gef.examples.ui.pde@default:default,org.eclipse.gef@default:default,org.eclipse.help.base@default:default,org.eclipse.help.ui@default:default,org.eclipse.help.webapp@default:default,org.eclipse.help@default:default,org.eclipse.jdt.annotation@default:default,org.eclipse.jdt.apt.core@default:default,org.eclipse.jdt.apt.pluggable.core@default:default,org.eclipse.jdt.apt.ui@default:default,org.eclipse.jdt.compiler.apt@default:false,org.eclipse.jdt.compiler.tool@default:false,org.eclipse.jdt.core.manipulation@default:default,org.eclipse.jdt.core@default:default,org.eclipse.jdt.debug.ui@default:default,org.eclipse.jdt.debug@default:default,org.eclipse.jdt.doc.isv@default:default,org.eclipse.jdt.doc.user@default:default,org.eclipse.jdt.junit.core@default:default,org.eclipse.jdt.junit.runtime@default:default,org.eclipse.jdt.junit4.runtime@default:default,org.eclipse.jdt.junit@default:default,org.eclipse.jdt.launching@default:default,org.eclipse.jdt.ui@default:default,org.eclipse.jdt@default:default,org.eclipse.jem.beaninfo.vm.common@default:default,org.eclipse.jem.beaninfo.vm@default:default,org.eclipse.jem.beaninfo@default:default,org.eclipse.jem.proxy@default:default,org.eclipse.jem.util@default:default,org.eclipse.jem.workbench@default:default,org.eclipse.jem@default:default,org.eclipse.jetty.continuation@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.jface.databinding@default:default,org.eclipse.jface.text@default:default,org.eclipse.jface@default:default,org.eclipse.jpt.common.branding@default:default,org.eclipse.jpt.common.core@default:default,org.eclipse.jpt.common.eclipselink.branding@default:default,org.eclipse.jpt.common.eclipselink.core@default:default,org.eclipse.jpt.common.ui@default:default,org.eclipse.jpt.common.utility@default:default,org.eclipse.jpt.dbws.eclipselink.branding@default:default,org.eclipse.jpt.dbws.eclipselink.core.gen@default:default,org.eclipse.jpt.dbws.eclipselink.ui@default:default,org.eclipse.jpt.doc.isv@default:default,org.eclipse.jpt.doc.user@default:default,org.eclipse.jpt.jaxb.branding@default:default,org.eclipse.jpt.jaxb.core.schemagen@default:default,org.eclipse.jpt.jaxb.core@default:default,org.eclipse.jpt.jaxb.eclipselink.branding@default:default,org.eclipse.jpt.jaxb.eclipselink.core.schemagen@default:default,org.eclipse.jpt.jaxb.eclipselink.core@default:default,org.eclipse.jpt.jaxb.eclipselink.ui@default:default,org.eclipse.jpt.jaxb.ui@default:default,org.eclipse.jpt.jpa.annotate@default:default,org.eclipse.jpt.jpa.branding@default:default,org.eclipse.jpt.jpa.core@default:default,org.eclipse.jpt.jpa.db.ui@default:default,org.eclipse.jpt.jpa.db@default:default,org.eclipse.jpt.jpa.eclipselink.branding@default:default,org.eclipse.jpt.jpa.eclipselink.core.ddlgen@default:default,org.eclipse.jpt.jpa.eclipselink.core@default:default,org.eclipse.jpt.jpa.eclipselink.ui@default:default,org.eclipse.jpt.jpa.gen@default:default,org.eclipse.jpt.jpa.ui@default:default,org.eclipse.jpt.jpadiagrameditor.branding@default:default,org.eclipse.jpt.jpadiagrameditor.doc.user@default:default,org.eclipse.jpt.jpadiagrameditor.ui@default:default,org.eclipse.jsch.core@default:default,org.eclipse.jsch.ui@default:default,org.eclipse.jsf.branding@default:default,org.eclipse.jst.common.annotations.controller@default:default,org.eclipse.jst.common.annotations.core@default:default,org.eclipse.jst.common.annotations.ui@default:default,org.eclipse.jst.common.fproj.enablement.jdt.sdk@default:default,org.eclipse.jst.common.frameworks@default:default,org.eclipse.jst.common.project.facet.core@default:default,org.eclipse.jst.common.project.facet.ui@default:default,org.eclipse.jst.common.ui@default:default,org.eclipse.jst.ejb.doc.user@default:default,org.eclipse.jst.ejb.ui.infopop@default:default,org.eclipse.jst.ejb.ui@default:default,org.eclipse.jst.j2ee.core@default:default,org.eclipse.jst.j2ee.doc.user@default:default,org.eclipse.jst.j2ee.ejb.annotation.model@default:default,org.eclipse.jst.j2ee.ejb.annotations.emitter@default:default,org.eclipse.jst.j2ee.ejb.annotations.ui@default:default,org.eclipse.jst.j2ee.ejb.annotations.xdoclet@default:default,org.eclipse.jst.j2ee.ejb@default:default,org.eclipse.jst.j2ee.infopop@default:default,org.eclipse.jst.j2ee.jca.ui@default:default,org.eclipse.jst.j2ee.jca@default:default,org.eclipse.jst.j2ee.navigator.ui@default:default,org.eclipse.jst.j2ee.ui@default:default,org.eclipse.jst.j2ee.web@default:default,org.eclipse.jst.j2ee.webservice.ui@default:default,org.eclipse.jst.j2ee.webservice@default:default,org.eclipse.jst.j2ee.xdoclet.runtime@default:default,org.eclipse.jst.j2ee@default:default,org.eclipse.jst.jee.ejb@default:default,org.eclipse.jst.jee.ui@default:default,org.eclipse.jst.jee.web@default:default,org.eclipse.jst.jee@default:default,org.eclipse.jst.jsf.apache.trinidad.tagsupport@default:default,org.eclipse.jst.jsf.common.runtime@default:default,org.eclipse.jst.jsf.common.ui@default:default,org.eclipse.jst.jsf.common@default:default,org.eclipse.jst.jsf.core@default:default,org.eclipse.jst.jsf.doc.dev@default:default,org.eclipse.jst.jsf.doc.user@default:default,org.eclipse.jst.jsf.facelet.core@default:default,org.eclipse.jst.jsf.facelet.ui@default:default,org.eclipse.jst.jsf.facesconfig.ui@default:default,org.eclipse.jst.jsf.facesconfig@default:default,org.eclipse.jst.jsf.standard.tagsupport@default:default,org.eclipse.jst.jsf.ui@default:default,org.eclipse.jst.jsp.core@default:default,org.eclipse.jst.jsp.ui.infopop@default:default,org.eclipse.jst.jsp.ui@default:default,org.eclipse.jst.pagedesigner.jsf.ui@default:default,org.eclipse.jst.pagedesigner.jsp.core@default:default,org.eclipse.jst.pagedesigner@default:default,org.eclipse.jst.server.core@default:default,org.eclipse.jst.server.generic.core@default:default,org.eclipse.jst.server.generic.jboss@default:default,org.eclipse.jst.server.generic.jonas@default:default,org.eclipse.jst.server.generic.ui@default:default,org.eclipse.jst.server.preview.adapter@default:default,org.eclipse.jst.server.tomcat.core@default:default,org.eclipse.jst.server.tomcat.ui@default:default,org.eclipse.jst.server.ui.doc.user@default:default,org.eclipse.jst.server.ui.infopop@default:default,org.eclipse.jst.server.ui@default:default,org.eclipse.jst.servlet.ui.infopop@default:default,org.eclipse.jst.servlet.ui@default:default,org.eclipse.jst.standard.schemas@default:default,org.eclipse.jst.ws.annotations.core@default:default,org.eclipse.jst.ws.axis.consumption.core@default:default,org.eclipse.jst.ws.axis.consumption.ui@default:default,org.eclipse.jst.ws.axis.creation.ui@default:default,org.eclipse.jst.ws.axis.infopop@default:default,org.eclipse.jst.ws.axis.ui.doc.user@default:default,org.eclipse.jst.ws.axis2.consumption.core@default:default,org.eclipse.jst.ws.axis2.consumption.ui@default:default,org.eclipse.jst.ws.axis2.core@default:default,org.eclipse.jst.ws.axis2.creation.core@default:default,org.eclipse.jst.ws.axis2.creation.ui@default:default,org.eclipse.jst.ws.axis2.ui.doc.user@default:default,org.eclipse.jst.ws.axis2.ui@default:default,org.eclipse.jst.ws.consumption.infopop@default:default,org.eclipse.jst.ws.consumption.ui.doc.user@default:default,org.eclipse.jst.ws.consumption.ui@default:default,org.eclipse.jst.ws.consumption@default:default,org.eclipse.jst.ws.creation.ejb.ui@default:default,org.eclipse.jst.ws.creation.ui@default:default,org.eclipse.jst.ws.cxf.consumption.core@default:default,org.eclipse.jst.ws.cxf.consumption.ui@default:default,org.eclipse.jst.ws.cxf.core@default:default,org.eclipse.jst.ws.cxf.creation.core@default:default,org.eclipse.jst.ws.cxf.creation.ui@default:default,org.eclipse.jst.ws.cxf.doc.user@default:default,org.eclipse.jst.ws.cxf.ui@default:default,org.eclipse.jst.ws.doc.user@default:default,org.eclipse.jst.ws.infopop@default:default,org.eclipse.jst.ws.jaxb.core@default:default,org.eclipse.jst.ws.jaxrs.core@default:default,org.eclipse.jst.ws.jaxrs.ui@default:default,org.eclipse.jst.ws.jaxws.core@default:default,org.eclipse.jst.ws.jaxws.doc.isv@default:default,org.eclipse.jst.ws.jaxws.doc.user@default:default,org.eclipse.jst.ws.jaxws.dom.doc.isv@default:default,org.eclipse.jst.ws.jaxws.dom.integration@default:default,org.eclipse.jst.ws.jaxws.dom.runtime@default:default,org.eclipse.jst.ws.jaxws.dom.ui@default:default,org.eclipse.jst.ws.jaxws.ui@default:default,org.eclipse.jst.ws.jaxws.utils@default:default,org.eclipse.jst.ws.uddiregistry@default:default,org.eclipse.jst.ws.ui@default:default,org.eclipse.jst.ws@default:default,org.eclipse.linuxtools.cdt.autotools.core@default:default,org.eclipse.ltk.core.refactoring@default:default,org.eclipse.ltk.ui.refactoring@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi.util@default:default,org.eclipse.osgi@-1:true,org.eclipse.persistence.antlr@default:default,org.eclipse.persistence.asm@default:default,org.eclipse.persistence.core@default:default,org.eclipse.persistence.dbws.builder@default:default,org.eclipse.persistence.dbws@default:default,org.eclipse.persistence.jpa.jpql@default:default,org.eclipse.persistence.jpa@default:default,org.eclipse.persistence.moxy@default:default,org.eclipse.platform.doc.user@default:default,org.eclipse.platform@default:default,org.eclipse.rcp@default:default,org.eclipse.search@default:default,org.eclipse.servertools.doc.isv@default:default,org.eclipse.swt.gtk.linux.x86_64@default:false,org.eclipse.swt@default:default,org.eclipse.team.core@default:default,org.eclipse.team.ui@default:default,org.eclipse.text@default:default,org.eclipse.ui.browser@default:default,org.eclipse.ui.cheatsheets@default:default,org.eclipse.ui.console@default:default,org.eclipse.ui.editors@default:default,org.eclipse.ui.externaltools@default:default,org.eclipse.ui.forms@default:default,org.eclipse.ui.ide.application@default:default,org.eclipse.ui.ide@default:default,org.eclipse.ui.intro.universal@default:default,org.eclipse.ui.intro@default:default,org.eclipse.ui.navigator.resources@default:default,org.eclipse.ui.navigator@default:default,org.eclipse.ui.net@default:default,org.eclipse.ui.views.properties.tabbed@default:default,org.eclipse.ui.views@default:default,org.eclipse.ui.workbench.texteditor@default:default,org.eclipse.ui.workbench@default:default,org.eclipse.ui@default:default,org.eclipse.update.configurator@3:true,org.eclipse.wst.command.env.core@default:default,org.eclipse.wst.command.env.doc.user@default:default,org.eclipse.wst.command.env.infopop@default:default,org.eclipse.wst.command.env.ui@default:default,org.eclipse.wst.command.env@default:default,org.eclipse.wst.common.api.doc@default:default,org.eclipse.wst.common.core@default:default,org.eclipse.wst.common.emf@default:default,org.eclipse.wst.common.emfworkbench.integration@default:default,org.eclipse.wst.common.environment@default:default,org.eclipse.wst.common.fproj.sdk@default:default,org.eclipse.wst.common.frameworks.ui@default:default,org.eclipse.wst.common.frameworks@default:default,org.eclipse.wst.common.infopop@default:default,org.eclipse.wst.common.modulecore.ui@default:default,org.eclipse.wst.common.modulecore@default:default,org.eclipse.wst.common.project.facet.core@default:default,org.eclipse.wst.common.project.facet.doc.api@default:default,org.eclipse.wst.common.project.facet.ui@default:default,org.eclipse.wst.common.snippets@default:default,org.eclipse.wst.common.ui@default:default,org.eclipse.wst.common.uriresolver@default:default,org.eclipse.wst.css.core@default:default,org.eclipse.wst.css.ui@default:default,org.eclipse.wst.doc.user@default:default,org.eclipse.wst.dtd.core@default:default,org.eclipse.wst.dtd.ui.infopop@default:default,org.eclipse.wst.dtd.ui@default:default,org.eclipse.wst.dtdeditor.doc.user@default:default,org.eclipse.wst.html.core@default:default,org.eclipse.wst.html.ui.infopop@default:default,org.eclipse.wst.html.ui@default:default,org.eclipse.wst.internet.cache@default:default,org.eclipse.wst.internet.monitor.core@default:default,org.eclipse.wst.internet.monitor.ui@default:default,org.eclipse.wst.jsdt.core@default:default,org.eclipse.wst.jsdt.debug.core@default:default,org.eclipse.wst.jsdt.debug.crossfire@default:default,org.eclipse.wst.jsdt.debug.rhino.debugger@default:default,org.eclipse.wst.jsdt.debug.rhino.ui@default:default,org.eclipse.wst.jsdt.debug.rhino@default:default,org.eclipse.wst.jsdt.debug.transport@default:default,org.eclipse.wst.jsdt.debug.ui@default:default,org.eclipse.wst.jsdt.doc@default:default,org.eclipse.wst.jsdt.manipulation@default:default,org.eclipse.wst.jsdt.support.firefox@default:default,org.eclipse.wst.jsdt.support.ie@default:default,org.eclipse.wst.jsdt.ui@default:default,org.eclipse.wst.jsdt.web.core@default:default,org.eclipse.wst.jsdt.web.support.jsp@default:default,org.eclipse.wst.jsdt.web.ui@default:default,org.eclipse.wst.server.core@default:default,org.eclipse.wst.server.discovery@default:default,org.eclipse.wst.server.http.core@default:default,org.eclipse.wst.server.http.ui@default:default,org.eclipse.wst.server.preview.adapter@default:default,org.eclipse.wst.server.preview@default:default,org.eclipse.wst.server.ui.doc.user@default:default,org.eclipse.wst.server.ui.infopop@default:default,org.eclipse.wst.server.ui@default:default,org.eclipse.wst.sse.core@default:default,org.eclipse.wst.sse.doc.user@default:default,org.eclipse.wst.sse.ui.infopop@default:default,org.eclipse.wst.sse.ui@default:default,org.eclipse.wst.standard.schemas@default:default,org.eclipse.wst.validation.doc.isv@default:default,org.eclipse.wst.validation.infopop@default:default,org.eclipse.wst.validation.ui@default:default,org.eclipse.wst.validation@default:default,org.eclipse.wst.web.ui.infopop@default:default,org.eclipse.wst.web.ui@default:default,org.eclipse.wst.web@default:default,org.eclipse.wst.webtools.doc.user@default:default,org.eclipse.wst.ws.api.doc@default:default,org.eclipse.wst.ws.explorer@default:default,org.eclipse.wst.ws.infopop@default:default,org.eclipse.wst.ws.parser@default:default,org.eclipse.wst.ws.service.policy.ui@default:default,org.eclipse.wst.ws.service.policy@default:default,org.eclipse.wst.ws.ui@default:default,org.eclipse.wst.ws@default:default,org.eclipse.wst.wsdl.doc.isv@default:default,org.eclipse.wst.wsdl.ui.doc.user@default:default,org.eclipse.wst.wsdl.ui@default:default,org.eclipse.wst.wsdl.validation@default:default,org.eclipse.wst.wsdl@default:default,org.eclipse.wst.wsi.ui.doc.user@default:default,org.eclipse.wst.wsi.ui@default:default,org.eclipse.wst.wsi@default:default,org.eclipse.wst.xml.core@default:default,org.eclipse.wst.xml.ui.infopop@default:default,org.eclipse.wst.xml.ui@default:default,org.eclipse.wst.xml.xpath.core@default:default,org.eclipse.wst.xml.xpath.ui@default:default,org.eclipse.wst.xml.xpath2.processor.doc.user@default:default,org.eclipse.wst.xml.xpath2.processor@default:default,org.eclipse.wst.xml.xpath2.wtptypes@default:default,org.eclipse.wst.xml.xpath2@default:default,org.eclipse.wst.xmleditor.doc.user@default:default,org.eclipse.wst.xsd.core@default:default,org.eclipse.wst.xsd.ui@default:default,org.eclipse.wst.xsdeditor.doc.user@default:default,org.eclipse.wst.xsl.core@default:default,org.eclipse.wst.xsl.debug.ui@default:default,org.eclipse.wst.xsl.doc@default:default,org.eclipse.wst.xsl.exslt.core@default:default,org.eclipse.wst.xsl.exslt.ui@default:default,org.eclipse.wst.xsl.jaxp.debug.ui@default:default,org.eclipse.wst.xsl.jaxp.debug@default:default,org.eclipse.wst.xsl.jaxp.launching@default:default,org.eclipse.wst.xsl.launching@default:default,org.eclipse.wst.xsl.saxon@default:default,org.eclipse.wst.xsl.sdk.documentation@default:default,org.eclipse.wst.xsl.ui@default:default,org.eclipse.wst.xsl.xalan@default:default,org.eclipse.wst.xsl@default:default,org.eclipse.xsd.cheatsheets@default:default,org.eclipse.xsd.doc@default:default,org.eclipse.xsd.ecore.converter@default:default,org.eclipse.xsd.ecore.exporter@default:default,org.eclipse.xsd.ecore.importer@default:default,org.eclipse.xsd.edit@default:default,org.eclipse.xsd.editor@default:default,org.eclipse.xsd.example.installer@default:default,org.eclipse.xsd.mapping.editor@default:default,org.eclipse.xsd.mapping@default:default,org.eclipse.xsd@default:default,org.eclipse.zest.core@default:default,org.eclipse.zest.doc.isv@default:default,org.eclipse.zest.layouts@default:default,org.freemarker.freemarker@default:default,org.hamcrest.core@default:default,org.jdom@default:default,org.junit@default:default,org.mozilla.javascript@default:default,org.ow2.asm.analysis@default:default,org.ow2.asm.tree@default:default,org.ow2.asm@default:default,org.sat4j.core@default:default,org.sat4j.pb@default:default,org.uddi4j@default:default,org.w3c.css.sac@default:default,org.w3c.dom.smil@default:default,org.w3c.dom.svg@default:default"/>
+<stringAttribute key="selected_workspace_plugins" value="com.android.ide.eclipse.adt.package@default:default,com.android.ide.eclipse.adt@default:default,com.android.ide.eclipse.base@default:default,com.android.ide.eclipse.ddms@default:default,com.android.ide.eclipse.gldebugger.tests@default:default,com.android.ide.eclipse.gldebugger@default:default,com.android.ide.eclipse.hierarchyviewer@default:default,com.android.ide.eclipse.ndk@default:default,com.android.ide.eclipse.pdt@default:default,com.android.ide.eclipse.tests@default:false,com.android.ide.eclipse.traceview@default:default,overlay.com.android.ide.eclipse.adt.overlay@default:default"/>
+<booleanAttribute key="show_selected_only" value="false"/>
+<stringAttribute key="templateConfig" value="${target_home}/configuration/config.ini"/>
+<booleanAttribute key="tracing" value="false"/>
+<booleanAttribute key="useCustomFeatures" value="false"/>
+<booleanAttribute key="useDefaultConfig" value="true"/>
+<booleanAttribute key="useDefaultConfigArea" value="true"/>
+<booleanAttribute key="useProduct" value="true"/>
+</launchConfiguration>
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/build.properties b/eclipse/plugins/com.android.ide.eclipse.adt/build.properties
index 9eb0d29..32d7d7e 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/build.properties
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/build.properties
@@ -2,12 +2,11 @@ bin.includes = plugin.xml,\
META-INF/,\
icons/,\
.,\
+ libs/,\
templates/,\
about.ini,\
- libs/,\
about.properties,\
NOTICE,\
about.html
source.. = src/
output.. = bin/
-bin.excludes = libs/.gitignore
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/libs/.gitignore b/eclipse/plugins/com.android.ide.eclipse.adt/libs/.gitignore
deleted file mode 100644
index d392f0e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/libs/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*.jar
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/pom.xml b/eclipse/plugins/com.android.ide.eclipse.adt/pom.xml
new file mode 100644
index 0000000..2ca92f7
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/pom.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <version>23.0.2-SNAPSHOT</version>
+ <artifactId>com.android.ide.eclipse.adt</artifactId>
+ <packaging>eclipse-plugin</packaging>
+ <name>adt</name>
+
+ <parent>
+ <relativePath>../../pom.xml</relativePath>
+ <groupId>adt.group</groupId>
+ <artifactId>parent</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </parent>
+</project>
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtPlugin.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtPlugin.java
index cbeb274..f7ef41f 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtPlugin.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtPlugin.java
@@ -378,11 +378,6 @@ public class AdtPlugin extends AbstractUIPlugin implements ILogger {
return SdkConstants.OS_SDK_PLATFORM_TOOLS_FOLDER + SdkConstants.FN_ADB;
}
- /** Returns the zipalign path relative to the sdk folder */
- public static String getOsRelativeZipAlign() {
- return SdkConstants.OS_SDK_TOOLS_FOLDER + SdkConstants.FN_ZIPALIGN;
- }
-
/** Returns the emulator path relative to the sdk folder */
public static String getOsRelativeEmulator() {
return SdkConstants.OS_SDK_TOOLS_FOLDER + SdkConstants.FN_EMULATOR;
@@ -398,11 +393,6 @@ public class AdtPlugin extends AbstractUIPlugin implements ILogger {
return getOsSdkFolder() + getOsRelativeAdb();
}
- /** Returns the absolute zipalign path */
- public static String getOsAbsoluteZipAlign() {
- return getOsSdkFolder() + getOsRelativeZipAlign();
- }
-
/** Returns the absolute traceview path */
public static String getOsAbsoluteTraceview() {
return getOsSdkFolder() + SdkConstants.OS_SDK_TOOLS_FOLDER +
@@ -415,7 +405,7 @@ public class AdtPlugin extends AbstractUIPlugin implements ILogger {
}
public static String getOsAbsoluteHprofConv() {
- return getOsSdkFolder() + SdkConstants.OS_SDK_TOOLS_FOLDER +
+ return getOsSdkFolder() + SdkConstants.OS_SDK_PLATFORM_TOOLS_FOLDER +
AdtConstants.FN_HPROF_CONV;
}
@@ -1810,6 +1800,12 @@ public class AdtPlugin extends AbstractUIPlugin implements ILogger {
* and updates opened projects.
* <p/>
* The operation is asynchronous and happens in a background eclipse job.
+ * <p/>
+ * This operation is called in multiple places and should be reasonably
+ * cheap and conservative. The goal is to automatically refresh the SDK
+ * when it is obvious it has changed so when not sure the code should
+ * tend to not reload and avoid reloading too often (which is an expensive
+ * operation that has a lot of user impact.)
*/
public void refreshSdk() {
// SDK can't have changed if we haven't loaded it yet.
@@ -1822,8 +1818,29 @@ public class AdtPlugin extends AbstractUIPlugin implements ILogger {
@Override
protected IStatus run(IProgressMonitor monitor) {
// SDK has changed if its location path is different.
- boolean changed = sdk.getSdkLocation() == null ||
- !sdk.getSdkLocation().equals(AdtPrefs.getPrefs().getOsSdkFolder());
+ File location = sdk.getSdkFileLocation();
+ boolean changed = location == null || !location.isDirectory();
+
+ if (!changed) {
+ assert location != null;
+ File prefLocation = new File(AdtPrefs.getPrefs().getOsSdkFolder());
+ changed = !location.equals(prefLocation);
+
+ if (changed) {
+ // Basic file path comparison indicates they are not the same.
+ // Let's dig a bit deeper.
+ try {
+ location = location.getCanonicalFile();
+ prefLocation = prefLocation.getCanonicalFile();
+ changed = !location.equals(prefLocation);
+ } catch (IOException ignore) {
+ // There's no real reason for the canonicalization to fail
+ // if the paths map to actual directories. And if they don't
+ // this should have been caught above.
+ }
+ }
+ }
+
if (!changed) {
// Check whether the target directories has potentially changed.
changed = sdk.haveTargetsChanged();
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtUtils.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtUtils.java
index 697a0bc..11896d8 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtUtils.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtUtils.java
@@ -20,7 +20,6 @@ import static com.android.SdkConstants.TOOLS_PREFIX;
import static com.android.SdkConstants.TOOLS_URI;
import static org.eclipse.ui.IWorkbenchPage.MATCH_INPUT;
-import com.android.SdkConstants;
import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
import com.android.ide.common.sdk.SdkVersionInfo;
@@ -940,46 +939,25 @@ public class AdtUtils {
* @return a suitable version display name
*/
public static String getAndroidName(int api) {
- // See http://source.android.com/source/build-numbers.html
- switch (api) {
- case 1: return "API 1: Android 1.0";
- case 2: return "API 2: Android 1.1";
- case 3: return "API 3: Android 1.5 (Cupcake)";
- case 4: return "API 4: Android 1.6 (Donut)";
- case 5: return "API 5: Android 2.0 (Eclair)";
- case 6: return "API 6: Android 2.0.1 (Eclair)";
- case 7: return "API 7: Android 2.1 (Eclair)";
- case 8: return "API 8: Android 2.2 (Froyo)";
- case 9: return "API 9: Android 2.3 (Gingerbread)";
- case 10: return "API 10: Android 2.3.3 (Gingerbread)";
- case 11: return "API 11: Android 3.0 (Honeycomb)";
- case 12: return "API 12: Android 3.1 (Honeycomb)";
- case 13: return "API 13: Android 3.2 (Honeycomb)";
- case 14: return "API 14: Android 4.0 (IceCreamSandwich)";
- case 15: return "API 15: Android 4.0.3 (IceCreamSandwich)";
- case 16: return "API 16: Android 4.1 (Jelly Bean)";
- case 17: return "API 17: Android 4.2 (Jelly Bean)";
- // If you add more versions here, also update LintUtils#getBuildCodes and
- // SdkConstants#HIGHEST_KNOWN_API
-
- default: {
- // Consult SDK manager to see if we know any more (later) names,
- // installed by user
- Sdk sdk = Sdk.getCurrent();
- if (sdk != null) {
- for (IAndroidTarget target : sdk.getTargets()) {
- if (target.isPlatform()) {
- AndroidVersion version = target.getVersion();
- if (version.getApiLevel() == api) {
- return getTargetLabel(target);
- }
- }
+ if (api <= SdkVersionInfo.HIGHEST_KNOWN_API) {
+ return SdkVersionInfo.getAndroidName(api);
+ }
+
+ // Consult SDK manager to see if we know any more (later) names,
+ // installed by user
+ Sdk sdk = Sdk.getCurrent();
+ if (sdk != null) {
+ for (IAndroidTarget target : sdk.getTargets()) {
+ if (target.isPlatform()) {
+ AndroidVersion version = target.getVersion();
+ if (version.getApiLevel() == api) {
+ return getTargetLabel(target);
}
}
-
- return "API " + api;
}
}
+
+ return "API " + api;
}
/**
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/VersionCheck.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/VersionCheck.java
index 45e350d..19d933d 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/VersionCheck.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/VersionCheck.java
@@ -51,7 +51,7 @@ public final class VersionCheck {
/**
* The minimum version of the SDK Tools that this version of ADT requires.
*/
- private final static FullRevision MIN_TOOLS_REV = new FullRevision(22, 2, 1, 0);
+ private final static FullRevision MIN_TOOLS_REV = new FullRevision(23, 0, 0, 0);
/**
* Pattern to get the minimum plugin version supported by the SDK. This is read from
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/AddSupportJarAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/AddSupportJarAction.java
index c21c8a4..f0af8bb 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/AddSupportJarAction.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/AddSupportJarAction.java
@@ -87,7 +87,13 @@ public class AddSupportJarAction implements IObjectActionDelegate {
private static final String FD_GRIDLAYOUT = "gridlayout"; //$NON-NLS-1$
private static final String FD_V7 = "v7"; //$NON-NLS-1$
private static final String FD_V4 = "v4"; //$NON-NLS-1$
+ private static final String FD_V13 = "v13"; //$NON-NLS-1$
+ private static final String FD_APPCOMPAT = "appcompat"; //$NON-NLS-1$
+ private static final String FD_LIBS = "libs"; //$NON-NLS-1$
private static final String ANDROID_SUPPORT_V4_JAR = "android-support-v4.jar"; //$NON-NLS-1$
+ private static final String ANDROID_SUPPORT_V13_JAR = "android-support-v13.jar";//$NON-NLS-1$
+ private static final String APPCOMPAT_V7_JAR = "android-support-v7-appcompat.jar";//$NON-NLS-1$
+ private static final String APP_COMPAT_LIB_NAME = "appcompat_v7"; //$NON-NLS-1$
private ISelection mSelection;
/**
@@ -166,7 +172,7 @@ public class AddSupportJarAction implements IObjectActionDelegate {
return null;
}
- String sdkLocation = sdk.getSdkLocation();
+ String sdkLocation = sdk.getSdkOsLocation();
if (minimumRevision > 0) {
File path = getSupportJarFile();
if (path != null) {
@@ -223,7 +229,7 @@ public class AddSupportJarAction implements IObjectActionDelegate {
public static int getInstalledRevision() {
final Sdk sdk = Sdk.getCurrent();
if (sdk != null) {
- String sdkLocation = sdk.getSdkLocation();
+ String sdkLocation = sdk.getSdkOsLocation();
SdkManager manager = SdkManager.createManager(sdkLocation, NullLogger.getLogger());
Map<String, Integer> versions = manager.getExtrasVersions();
Integer version = versions.get(VENDOR_ID + '/' + SUPPORT_ID);
@@ -238,7 +244,7 @@ public class AddSupportJarAction implements IObjectActionDelegate {
}
}
- return -1;
+ return -1;
}
/**
@@ -278,7 +284,73 @@ public class AddSupportJarAction implements IObjectActionDelegate {
}
// Create workspace copy of the project and add library dependency
- IProject libraryProject = createLibraryProject(libraryPath, project, waitForFinish);
+ IProject libraryProject = createLibraryProject(libraryPath, project,
+ "gridlayout_v7", waitForFinish); //$NON-NLS-1$
+ if (libraryProject != null) {
+ return addLibraryDependency(libraryProject, project, waitForFinish);
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Similar to {@link #install}, but rather than copy a jar into the given
+ * project, it creates a new library project in the workspace for the
+ * support library, and adds a library dependency on the newly
+ * installed library from the given project.
+ *
+ * @param project the project to add a dependency on the library to
+ * @param waitForFinish If true, block until the task has finished
+ * @return true if the installation was successful (or if
+ * <code>waitForFinish</code> is false, if the installation is
+ * likely to be successful - e.g. the user has at least agreed to
+ * all installation prompts.)
+ */
+ public static boolean installAppCompatLibrary(final IProject project, boolean waitForFinish) {
+ final IJavaProject javaProject = JavaCore.create(project);
+ if (javaProject != null) {
+
+ // Don't add in the library if it already exists
+ ProjectState state = Sdk.getProjectState(project);
+ ProjectPropertiesWorkingCopy copy = state.getProperties().makeWorkingCopy();
+ for (String property : copy.keySet()) {
+ if (property.startsWith(ProjectProperties.PROPERTY_LIB_REF)) {
+ String libraryReference = copy.getProperty(property);
+ if (libraryReference != null && libraryReference.contains(APP_COMPAT_LIB_NAME)) {
+ return true;
+ }
+ }
+ }
+
+ File supportPath = getSupportPackageDir();
+ if (!supportPath.isDirectory()) {
+ File path = installSupport(7);
+ if (path == null) {
+ return false;
+ }
+ assert path.equals(supportPath);
+ }
+ File libraryPath = new File(supportPath, FD_V7 + File.separator + FD_APPCOMPAT);
+ if (!libraryPath.isDirectory()) {
+ // Upgrade support package: it's out of date. The SDK manager will
+ // perform an upgrade to the latest version if the package is already installed.
+ File path = installSupport(-1);
+ if (path == null) {
+ return false;
+ }
+ assert path.equals(libraryPath) : path;
+ }
+
+ // Check to see if there's already a version of the library available
+ IWorkspace workspace = ResourcesPlugin.getWorkspace();
+ IWorkspaceRoot root = workspace.getRoot();
+ IProject libraryProject = root.getProject(APP_COMPAT_LIB_NAME);
+ if (!libraryProject.exists()) {
+ // Create workspace copy of the project and add library dependency
+ libraryProject = createLibraryProject(libraryPath, project,
+ APP_COMPAT_LIB_NAME, waitForFinish);
+ }
if (libraryProject != null) {
return addLibraryDependency(libraryProject, project, waitForFinish);
}
@@ -296,7 +368,7 @@ public class AddSupportJarAction implements IObjectActionDelegate {
private static File getSupportPackageDir() {
final Sdk sdk = Sdk.getCurrent();
if (sdk != null) {
- String sdkLocation = sdk.getSdkLocation();
+ String sdkLocation = sdk.getSdkOsLocation();
SdkManager manager = SdkManager.createManager(sdkLocation, NullLogger.getLogger());
Map<String, Integer> versions = manager.getExtrasVersions();
Integer version = versions.get(VENDOR_ID + '/' + SUPPORT_ID);
@@ -343,6 +415,25 @@ public class AddSupportJarAction implements IObjectActionDelegate {
}
/**
+ * Returns a path to the installed jar file for the support library,
+ * or null if it does not exist
+ *
+ * @return a path to the v13.jar or null
+ */
+ @Nullable
+ public static File getSupport13JarFile() {
+ File supportDir = getSupportPackageDir();
+ if (supportDir != null) {
+ File path = new File(supportDir, FD_V13 + File.separator + ANDROID_SUPPORT_V13_JAR);
+ if (path.exists()) {
+ return path;
+ }
+ }
+
+ return null;
+ }
+
+ /**
* Creates a library project in the Eclipse workspace out of the grid layout project
* in the SDK tree.
*
@@ -354,6 +445,7 @@ public class AddSupportJarAction implements IObjectActionDelegate {
private static IProject createLibraryProject(
final File libraryPath,
final IProject project,
+ final String libraryName,
boolean waitForFinish) {
// Install a new library into the workspace. This is a copy rather than
@@ -367,7 +459,7 @@ public class AddSupportJarAction implements IObjectActionDelegate {
IWorkspaceRoot root = workspace.getRoot();
String name = AdtUtils.getUniqueProjectName(
- "gridlayout_v7", "_"); //$NON-NLS-1$ //$NON-NLS-2$
+ libraryName, "_"); //$NON-NLS-1$
newProject = root.getProject(name);
IProjectDescription description = workspace.newProjectDescription(name);
String[] natures = new String[] { AdtConstants.NATURE_DEFAULT, JavaCore.NATURE_ID };
@@ -381,13 +473,14 @@ public class AddSupportJarAction implements IObjectActionDelegate {
sourceDir.copy(destDir, EFS.OVERWRITE, null);
// Make sure the src folder exists
- destDir.getChild("src").mkdir(0, null /*monitor*/);
+ destDir.getChild(SdkConstants.SRC_FOLDER).mkdir(0, null /*monitor*/);
// Set the android platform to the same level as the calling project
ProjectState state = Sdk.getProjectState(project);
String target = state.getProperties().getProperty(ProjectProperties.PROPERTY_TARGET);
if (target != null && target.length() > 0) {
- ProjectProperties properties = ProjectProperties.load(libraryPath.getPath(),
+ ProjectProperties properties = ProjectProperties.load(
+ destDir.toLocalFile(EFS.NONE, new NullProgressMonitor()).getPath(),
PropertyType.PROJECT);
ProjectPropertiesWorkingCopy copy = properties.makeWorkingCopy();
copy.setProperty(ProjectProperties.PROPERTY_TARGET, target);
@@ -478,7 +571,7 @@ public class AddSupportJarAction implements IObjectActionDelegate {
return Status.OK_STATUS;
} catch (Exception e) {
return new Status(Status.ERROR, AdtPlugin.PLUGIN_ID, Status.ERROR,
- "Failed", e); //$NON-NLS-1$
+ "Failed", e); //$NON-NLS-1$
} finally {
if (monitor != null) {
monitor.done();
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/AvdManagerAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/AvdManagerAction.java
index 2597090..86f2d3c 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/AvdManagerAction.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/AvdManagerAction.java
@@ -57,7 +57,7 @@ public class AvdManagerAction implements IWorkbenchWindowActionDelegate, IObject
AvdManagerWindow window = new AvdManagerWindow(
AdtPlugin.getShell(),
new AdtConsoleSdkLog(),
- sdk.getSdkLocation(),
+ sdk.getSdkOsLocation(),
AvdInvocationContext.IDE);
window.open();
} else {
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/DexDumpAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/DexDumpAction.java
index a483e9b..78fcfd4 100755
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/DexDumpAction.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/DexDumpAction.java
@@ -21,9 +21,10 @@ import com.android.annotations.Nullable;
import com.android.ide.eclipse.adt.AdtPlugin;
import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs.BuildVerbosity;
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.sdklib.util.GrabProcessOutput;
-import com.android.sdklib.util.GrabProcessOutput.IProcessOutput;
-import com.android.sdklib.util.GrabProcessOutput.Wait;
+import com.android.sdklib.BuildToolInfo;
+import com.android.utils.GrabProcessOutput;
+import com.android.utils.GrabProcessOutput.IProcessOutput;
+import com.android.utils.GrabProcessOutput.Wait;
import com.android.utils.SdkUtils;
import org.eclipse.core.filesystem.EFS;
@@ -126,9 +127,15 @@ public class DexDumpAction implements IObjectActionDelegate {
return Status.OK_STATUS;
}
- String sdkOsPath = current.getSdkLocation();
- File dexDumpFile = new File(new File(sdkOsPath, SdkConstants.FD_PLATFORM_TOOLS),
- SdkConstants.FN_DEXDUMP);
+ BuildToolInfo buildToolInfo = current.getLatestBuildTool();
+ if (buildToolInfo == null) {
+ AdtPlugin.printErrorToConsole(project,
+ "SDK missing build tools. Please install build tools using SDK Manager.");
+ return Status.OK_STATUS;
+ }
+
+ File buildToolsFolder = buildToolInfo.getLocation();
+ File dexDumpFile = new File(buildToolsFolder, SdkConstants.FN_DEXDUMP);
IPath binPath = project.getFolder(SdkConstants.FD_OUTPUT).getLocation();
if (binPath == null) {
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/SdkManagerAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/SdkManagerAction.java
index 9d33230..48667be 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/SdkManagerAction.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/actions/SdkManagerAction.java
@@ -25,9 +25,9 @@ import com.android.ide.eclipse.adt.internal.sdk.AdtConsoleSdkLog;
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import com.android.sdklib.io.FileOp;
import com.android.sdklib.repository.ISdkChangeListener;
-import com.android.sdklib.util.GrabProcessOutput;
-import com.android.sdklib.util.GrabProcessOutput.IProcessOutput;
-import com.android.sdklib.util.GrabProcessOutput.Wait;
+import com.android.utils.GrabProcessOutput;
+import com.android.utils.GrabProcessOutput.IProcessOutput;
+import com.android.utils.GrabProcessOutput.Wait;
import com.android.sdkuilib.repository.SdkUpdaterWindow;
import com.android.sdkuilib.repository.SdkUpdaterWindow.SdkInvocationContext;
@@ -147,7 +147,7 @@ public class SdkManagerAction implements IWorkbenchWindowActionDelegate, IObject
// Get the SDK locatiom from the current SDK or as fallback
// directly from the ADT preferences.
Sdk sdk = Sdk.getCurrent();
- String osSdkLocation = sdk == null ? null : sdk.getSdkLocation();
+ String osSdkLocation = sdk == null ? null : sdk.getSdkOsLocation();
if (osSdkLocation == null || !new File(osSdkLocation).isDirectory()) {
osSdkLocation = AdtPrefs.getPrefs().getOsSdkFolder();
}
@@ -272,7 +272,7 @@ public class SdkManagerAction implements IWorkbenchWindowActionDelegate, IObject
// Do not show non-error/warning log in Eclipse.
};
},
- sdk.getSdkLocation(),
+ sdk.getSdkOsLocation(),
SdkInvocationContext.IDE);
ISdkChangeListener listener = new ISdkChangeListener() {
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/BuildHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/BuildHelper.java
index 8e831b7..867e39d 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/BuildHelper.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/BuildHelper.java
@@ -40,9 +40,9 @@ import com.android.sdklib.build.RenderScriptProcessor;
import com.android.sdklib.build.SealedApkException;
import com.android.sdklib.internal.build.DebugKeyProvider;
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 com.android.utils.GrabProcessOutput;
+import com.android.utils.GrabProcessOutput.IProcessOutput;
+import com.android.utils.GrabProcessOutput.Wait;
import com.google.common.hash.HashCode;
import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;
@@ -581,9 +581,9 @@ public class BuildHelper {
String[] envp = null;
Map<String, String> envMap = new TreeMap<String, String>(System.getenv());
if (!envMap.containsKey("PROGUARD_HOME")) { //$NON-NLS-1$
- envMap.put("PROGUARD_HOME", Sdk.getCurrent().getSdkLocation() + //$NON-NLS-1$
- SdkConstants.FD_TOOLS + File.separator +
- SdkConstants.FD_PROGUARD);
+ envMap.put("PROGUARD_HOME", Sdk.getCurrent().getSdkOsLocation() + //$NON-NLS-1$
+ SdkConstants.FD_TOOLS + File.separator +
+ SdkConstants.FD_PROGUARD);
envp = new String[envMap.size()];
int i = 0;
for (Map.Entry<String, String> entry : envMap.entrySet()) {
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/DexWrapper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/DexWrapper.java
index 1c7c2e3..3f88284 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/DexWrapper.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/DexWrapper.java
@@ -76,7 +76,8 @@ public final class DexWrapper {
}
URL url = f.toURI().toURL();
- URLClassLoader loader = new URLClassLoader(new URL[] { url },
+ @SuppressWarnings("resource")
+ URLClassLoader loader = new URLClassLoader(new URL[] { url },
DexWrapper.class.getClassLoader());
// get the classes.
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/BaseBuilder.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/BaseBuilder.java
index 9882a0c..1625914 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/BaseBuilder.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/BaseBuilder.java
@@ -35,6 +35,7 @@ import com.android.io.IAbstractFile;
import com.android.io.StreamException;
import com.android.sdklib.BuildToolInfo;
import com.android.sdklib.IAndroidTarget;
+import com.android.sdklib.repository.FullRevision;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PreCompilerBuilder.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PreCompilerBuilder.java
index 2554c79..0d9ee48 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PreCompilerBuilder.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/PreCompilerBuilder.java
@@ -28,6 +28,7 @@ import com.android.ide.eclipse.adt.internal.build.Messages;
import com.android.ide.eclipse.adt.internal.build.RenderScriptLauncher;
import com.android.ide.eclipse.adt.internal.build.RsSourceChangeHandler;
import com.android.ide.eclipse.adt.internal.build.SourceProcessor;
+import com.android.ide.eclipse.adt.internal.build.builders.BaseBuilder.AbortBuildException;
import com.android.ide.eclipse.adt.internal.lint.EclipseLintClient;
import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs.BuildVerbosity;
@@ -57,6 +58,7 @@ import com.android.sdklib.internal.build.SymbolLoader;
import com.android.sdklib.internal.build.SymbolWriter;
import com.android.sdklib.internal.project.ProjectProperties;
import com.android.sdklib.io.FileOp;
+import com.android.sdklib.repository.FullRevision;
import com.android.utils.ILogger;
import com.android.utils.Pair;
import com.android.xml.AndroidManifest;
@@ -431,6 +433,17 @@ public class PreCompilerBuilder extends BaseBuilder {
return result;
}
+ if (projectState.getRenderScriptSupportMode()) {
+ FullRevision minBuildToolsRev = new FullRevision(19,0,3);
+ if (mBuildToolInfo.getRevision().compareTo(minBuildToolsRev) == -1) {
+ String msg = "RenderScript support mode requires Build-Tools 19.0.3 or later.";
+ AdtPlugin.printErrorToConsole(project, msg);
+ markProject(AdtConstants.MARKER_ADT, msg, IMarker.SEVERITY_ERROR);
+
+ return result;
+ }
+ }
+
// get the manifest file
IFile manifestFile = ProjectHelper.getManifest(project);
@@ -1326,7 +1339,7 @@ public class PreCompilerBuilder extends BaseBuilder {
&& new File(aaptPath).exists()
&& new File("/usr/bin/apt-get").exists()) { //$NON-NLS-1$
markProject(AdtConstants.MARKER_ADT,
- "Hint: On 64-bit systems, make sure the 32-bit libraries are installed: sudo apt-get install ia32-libs",
+ "Hint: On 64-bit systems, make sure the 32-bit libraries are installed: \"sudo apt-get install ia32-libs\" or on some systems, \"sudo apt-get install lib32z1\"",
IMarker.SEVERITY_ERROR);
// Note - this uses SEVERITY_ERROR even though it's really SEVERITY_INFO because
// we want this error message to show up adjacent to the aapt error message
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/ResourceManagerBuilder.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/ResourceManagerBuilder.java
index 770710d..8e01cca 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/ResourceManagerBuilder.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/build/builders/ResourceManagerBuilder.java
@@ -24,6 +24,10 @@ import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs.BuildVerbosity;
import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
+import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
+import com.android.ide.eclipse.adt.internal.sdk.Sdk;
+import com.android.sdklib.BuildToolInfo;
+import com.android.sdklib.IAndroidTarget;
import com.android.utils.Pair;
import org.eclipse.core.resources.IFolder;
@@ -110,6 +114,33 @@ public class ResourceManagerBuilder extends BaseBuilder {
errorMessage = String.format(errorMessage,
result.getSecond() == null ? "(no value)" : result.getSecond());
+ if (JavaCore.VERSION_1_7.equals(result.getSecond())) {
+ // If the user is trying to target 1.7 but compiling with something older,
+ // the error message can be a bit misleading; instead point them in the
+ // direction of updating the project's build target.
+ Sdk currentSdk = Sdk.getCurrent();
+ if (currentSdk != null) {
+ IAndroidTarget target = currentSdk.getTarget(project.getProject());
+ if (target != null && target.getVersion().getApiLevel() < 19) {
+ errorMessage = "Using 1.7 requires compiling with Android 4.4 " +
+ "(KitKat); currently using " + target.getVersion();
+ }
+
+ ProjectState projectState = Sdk.getProjectState(project);
+ if (projectState != null) {
+ BuildToolInfo buildToolInfo = projectState.getBuildToolInfo();
+ if (buildToolInfo == null) {
+ buildToolInfo = currentSdk.getLatestBuildTool();
+ }
+ if (buildToolInfo != null && buildToolInfo.getRevision().getMajor() < 19) {
+ errorMessage = "Using 1.7 requires using Android Build Tools " +
+ "version 19 or later; currently using " +
+ buildToolInfo.getRevision();
+ }
+ }
+ }
+ }
+
markProject(AdtConstants.MARKER_ADT, errorMessage, IMarker.SEVERITY_ERROR);
AdtPlugin.printErrorToConsole(project, errorMessage);
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/Hyperlinks.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/Hyperlinks.java
index 1df2e4d..95cec47 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/Hyperlinks.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/Hyperlinks.java
@@ -445,7 +445,7 @@ public class Hyperlinks {
*/
private static URL getDocUrl(String relative) {
// First try to find locally installed documentation
- File sdkLocation = new File(Sdk.getCurrent().getSdkLocation());
+ File sdkLocation = new File(Sdk.getCurrent().getSdkOsLocation());
File docs = new File(sdkLocation, FD_DOCS + File.separator + FD_DOCS_REFERENCE);
try {
if (docs.exists()) {
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/AndroidXmlFormattingStrategy.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/AndroidXmlFormattingStrategy.java
index 9f69e41..4cab419 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/AndroidXmlFormattingStrategy.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/formatting/AndroidXmlFormattingStrategy.java
@@ -559,6 +559,11 @@ public class AndroidXmlFormattingStrategy extends ContextBasedFormattingStrategy
String[] segments = resourceFolder.split("-"); //$NON-NLS-1$
ResourceType type = ResourceType.getEnum(segments[0]);
if (type != null) {
+ // <resources> files found in res/xml/ should be formatted as
+ // resource files!
+ if (type == ResourceType.XML && style == XmlFormatStyle.RESOURCE) {
+ return style;
+ }
style = EclipseXmlPrettyPrinter.get(type);
}
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/ProjectCallback.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/ProjectCallback.java
index 41361a5..28b1689 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/ProjectCallback.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/ProjectCallback.java
@@ -31,6 +31,7 @@ import static com.android.SdkConstants.VIEW_INCLUDE;
import com.android.SdkConstants;
import com.android.ide.common.rendering.LayoutLibrary;
import com.android.ide.common.rendering.RenderSecurityManager;
+import com.android.ide.common.rendering.api.ActionBarCallback;
import com.android.ide.common.rendering.api.AdapterBinding;
import com.android.ide.common.rendering.api.DataBindingItem;
import com.android.ide.common.rendering.api.ILayoutPullParser;
@@ -168,7 +169,6 @@ public final class ProjectCallback extends LegacyCallback {
// RenderSecurityManager
boolean token = RenderSecurityManager.enterSafeRegion(mCredential);
try {
- System.setSecurityManager(null);
mLoader = new ProjectClassLoader(mParentClassLoader, mProject);
} finally {
RenderSecurityManager.exitSafeRegion(token);
@@ -198,7 +198,7 @@ public final class ProjectCallback extends LegacyCallback {
e = e.getCause();
}
- AdtPlugin.log(e, "%1$s failed to instantiate.", className); //$NON-NLS-1$
+ appendToIdeLog(e, "%1$s failed to instantiate.", className); //$NON-NLS-1$
// Add the missing class to the list so that the renderer can print them later.
if (mLogger instanceof RenderLogger) {
@@ -289,10 +289,15 @@ public final class ProjectCallback extends LegacyCallback {
@Override
public String getNamespace() {
if (mNamespace == null) {
- ManifestData manifestData = AndroidManifestHelper.parseForData(mProject);
- if (manifestData != null) {
- String javaPackage = manifestData.getPackage();
- mNamespace = String.format(AdtConstants.NS_CUSTOM_RESOURCES, javaPackage);
+ boolean token = RenderSecurityManager.enterSafeRegion(mCredential);
+ try {
+ ManifestData manifestData = AndroidManifestHelper.parseForData(mProject);
+ if (manifestData != null) {
+ String javaPackage = manifestData.getPackage();
+ mNamespace = String.format(AdtConstants.NS_CUSTOM_RESOURCES, javaPackage);
+ }
+ } finally {
+ RenderSecurityManager.exitSafeRegion(token);
}
}
@@ -440,23 +445,33 @@ public final class ProjectCallback extends LegacyCallback {
@Override
public ILayoutPullParser getParser(String layoutName) {
- // Try to compute the ResourceValue for this layout since layoutlib
- // must be an older version which doesn't pass the value:
- if (mResourceResolver != null) {
- ResourceValue value = mResourceResolver.getProjectResource(ResourceType.LAYOUT,
- layoutName);
- if (value != null) {
- return getParser(value);
+ boolean token = RenderSecurityManager.enterSafeRegion(mCredential);
+ try {
+ // Try to compute the ResourceValue for this layout since layoutlib
+ // must be an older version which doesn't pass the value:
+ if (mResourceResolver != null) {
+ ResourceValue value = mResourceResolver.getProjectResource(ResourceType.LAYOUT,
+ layoutName);
+ if (value != null) {
+ return getParser(value);
+ }
}
- }
- return getParser(layoutName, null);
+ return getParser(layoutName, null);
+ } finally {
+ RenderSecurityManager.exitSafeRegion(token);
+ }
}
@Override
public ILayoutPullParser getParser(ResourceValue layoutResource) {
- return getParser(layoutResource.getName(),
- new File(layoutResource.getValue()));
+ boolean token = RenderSecurityManager.enterSafeRegion(mCredential);
+ try {
+ return getParser(layoutResource.getName(),
+ new File(layoutResource.getValue()));
+ } finally {
+ RenderSecurityManager.exitSafeRegion(token);
+ }
}
private ILayoutPullParser getParser(String layoutName, File xml) {
@@ -480,11 +495,11 @@ public final class ProjectCallback extends LegacyCallback {
parser.setInput(new StringReader(xmlText));
return parser;
} catch (XmlPullParserException e) {
- AdtPlugin.log(e, null);
+ appendToIdeLog(e, null);
} catch (FileNotFoundException e) {
// Shouldn't happen since we check isFile() above
} catch (IOException e) {
- AdtPlugin.log(e, null);
+ appendToIdeLog(e, null);
}
}
@@ -649,4 +664,20 @@ public final class ProjectCallback extends LegacyCallback {
public void setResourceResolver(ResourceResolver resolver) {
mResourceResolver = resolver;
}
+
+ // Append the given message to the ADT log. Bypass the sandbox if necessary
+ // such that we can write to the log file.
+ private void appendToIdeLog(Throwable exception, String format, Object ... args) {
+ boolean token = RenderSecurityManager.enterSafeRegion(mCredential);
+ try {
+ AdtPlugin.log(exception, format, args);
+ } finally {
+ RenderSecurityManager.exitSafeRegion(token);
+ }
+ }
+
+ @Override
+ public ActionBarCallback getActionBarCallback() {
+ return new ActionBarCallback();
+ }
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/Configuration.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/Configuration.java
index 2260303..44faf71 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/Configuration.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/Configuration.java
@@ -39,6 +39,7 @@ import com.android.ide.common.resources.configuration.VersionQualifier;
import com.android.ide.eclipse.adt.AdtPlugin;
import com.android.ide.eclipse.adt.internal.editors.layout.gle2.RenderService;
import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
+import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo.ActivityAttributes;
import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
import com.android.ide.eclipse.adt.internal.resources.ResourceHelper;
import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources;
@@ -63,7 +64,6 @@ import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.QualifiedName;
import java.util.List;
-import java.util.Map;
/**
* A {@linkplain Configuration} is a selection of device, orientation, theme,
@@ -707,8 +707,10 @@ public class Configuration {
String activity = getActivity();
if (activity != null) {
- Map<String, String> activityThemes = manifest.getActivityThemes();
- preferred = activityThemes.get(activity);
+ ActivityAttributes attributes = manifest.getActivityAttributes(activity);
+ if (attributes != null) {
+ preferred = attributes.getTheme();
+ }
}
if (preferred == null) {
preferred = defaultTheme;
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationChooser.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationChooser.java
index ebd1fb9..5b8e70b 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationChooser.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationChooser.java
@@ -58,6 +58,7 @@ import com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorP
import com.android.ide.eclipse.adt.internal.editors.layout.gle2.IncludeFinder.Reference;
import com.android.ide.eclipse.adt.internal.editors.layout.gle2.LayoutCanvas;
import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
+import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo.ActivityAttributes;
import com.android.ide.eclipse.adt.internal.resources.ResourceHelper;
import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources;
import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
@@ -1586,8 +1587,11 @@ public class ConfigurationChooser extends Composite
// See if there is a default theme assigned to this activity, and if so, use it
ManifestInfo manifest = ManifestInfo.get(mEditedFile.getProject());
- Map<String, String> activityThemes = manifest.getActivityThemes();
- String preferred = activityThemes.get(activity);
+ String preferred = null;
+ ActivityAttributes attributes = manifest.getActivityAttributes(activity);
+ if (attributes != null) {
+ preferred = attributes.getTheme();
+ }
if (preferred != null && !Objects.equal(preferred, mConfiguration.getTheme())) {
// Yes, switch to it
selectTheme(preferred);
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationDescription.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationDescription.java
index 7141f94..cc50398 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationDescription.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ConfigurationDescription.java
@@ -32,6 +32,7 @@ import com.android.ide.common.resources.configuration.RegionQualifier;
import com.android.ide.common.resources.configuration.ScreenSizeQualifier;
import com.android.ide.eclipse.adt.AdtPlugin;
import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
+import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo.ActivityAttributes;
import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import com.android.resources.NightMode;
@@ -50,7 +51,6 @@ import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.util.List;
-import java.util.Map;
/** A description of a configuration, used for persistence */
public class ConfigurationDescription {
@@ -349,8 +349,10 @@ public class ConfigurationDescription {
// from the outer layout instead
if (activity != null) {
- Map<String, String> activityThemes = manifest.getActivityThemes();
- preferred = activityThemes.get(activity);
+ ActivityAttributes attributes = manifest.getActivityAttributes(activity);
+ if (attributes != null) {
+ preferred = attributes.getTheme();
+ }
}
if (preferred == null) {
preferred = defaultTheme;
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ThemeMenuAction.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ThemeMenuAction.java
index 0f6c9eb..b1ce21d 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ThemeMenuAction.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/configuration/ThemeMenuAction.java
@@ -21,6 +21,7 @@ import static com.android.SdkConstants.ANDROID_STYLE_RESOURCE_PREFIX;
import com.android.ide.eclipse.adt.internal.editors.Hyperlinks;
import com.android.ide.eclipse.adt.internal.editors.layout.gle2.SubmenuAction;
import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
+import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo.ActivityAttributes;
import com.android.ide.eclipse.adt.internal.resources.ResourceHelper;
import com.android.sdklib.IAndroidTarget;
@@ -41,7 +42,6 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
-import java.util.Map;
import java.util.Set;
/**
@@ -180,30 +180,39 @@ class ThemeMenuAction extends SubmenuAction {
case MENU_MANIFEST: {
IProject project = mConfigChooser.getEditedFile().getProject();
ManifestInfo manifest = ManifestInfo.get(project);
- Map<String, String> activityThemes = manifest.getActivityThemes();
Configuration configuration = mConfigChooser.getConfiguration();
String activity = configuration.getActivity();
if (activity != null) {
- String theme = activityThemes.get(activity);
- if (theme != null) {
- addMenuItem(menu, theme, isSelectedTheme(theme));
+ ActivityAttributes attributes = manifest.getActivityAttributes(activity);
+ if (attributes != null) {
+ String theme = attributes.getTheme();
+ if (theme != null) {
+ addMenuItem(menu, theme, isSelectedTheme(theme));
+ }
}
}
String manifestTheme = manifest.getManifestTheme();
- if (activityThemes.size() > 0 || manifestTheme != null) {
- Set<String> allThemes = new HashSet<String>(activityThemes.values());
- if (manifestTheme != null) {
- allThemes.add(manifestTheme);
- }
- List<String> sorted = new ArrayList<String>(allThemes);
- Collections.sort(sorted);
- String current = configuration.getTheme();
- for (String theme : sorted) {
- boolean selected = theme.equals(current);
- addMenuItem(menu, theme, selected);
+ boolean found = false;
+ Set<String> allThemes = new HashSet<String>();
+ if (manifestTheme != null) {
+ found = true;
+ allThemes.add(manifestTheme);
+ }
+ for (ActivityAttributes info : manifest.getActivityAttributesMap().values()) {
+ if (info.getTheme() != null) {
+ found = true;
+ allThemes.add(info.getTheme());
}
- } else {
+ }
+ List<String> sorted = new ArrayList<String>(allThemes);
+ Collections.sort(sorted);
+ String current = configuration.getTheme();
+ for (String theme : sorted) {
+ boolean selected = theme.equals(current);
+ addMenuItem(menu, theme, selected);
+ }
+ if (!found) {
addDisabledMessageItem("No themes are registered in the manifest");
}
break;
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java
index 327279b..b54d5bc 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java
@@ -178,6 +178,8 @@ import org.eclipse.wb.internal.core.editor.structure.PageSiteComposite;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
+import java.io.File;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -1855,6 +1857,44 @@ public class GraphicalEditorPart extends EditorPart
if (throwable instanceof RenderSecurityException) {
addActionLink(mErrorLabel, ActionLinkStyleRange.LINK_DISABLE_SANDBOX,
"\nTurn off custom view rendering sandbox\n");
+
+ StringBuilder builder = new StringBuilder(200);
+ String lastFailedPath = RenderSecurityManager.getLastFailedPath();
+ if (lastFailedPath != null) {
+ builder.append("Diagnostic info for ADT bug report:\n");
+ builder.append("Failed path: ").append(lastFailedPath).append('\n');
+ String tempDir = System.getProperty("java.io.tmpdir");
+ builder.append("Normal temp dir: ").append(tempDir).append('\n');
+ File normalized = new File(tempDir);
+ builder.append("Normalized temp dir: ").append(normalized.getPath()).append('\n');
+ try {
+ builder.append("Canonical temp dir: ").append(normalized.getCanonicalPath())
+ .append('\n');
+ } catch (IOException e) {
+ // ignore
+ }
+ builder.append("os.name: ").append(System.getProperty("os.name")).append('\n');
+ builder.append("os.version: ").append(System.getProperty("os.version"));
+ builder.append('\n');
+ builder.append("java.runtime.version: ");
+ builder.append(System.getProperty("java.runtime.version"));
+ }
+ if (throwable.getMessage().equals("Unable to create temporary file")) {
+ String javaVersion = System.getProperty("java.version");
+ if (javaVersion.startsWith("1.7.0_")) {
+ int version = Integer
+ .parseInt(javaVersion.substring(javaVersion.indexOf('_') + 1));
+ if (version > 0 && version < 45) {
+ builder.append('\n');
+ builder.append("Tip: This may be caused by using an older version " +
+ "of JDK 1.7.0; try using at least 1.7.0_45 (you are using " +
+ javaVersion + ")");
+ }
+ }
+ }
+ if (builder.length() > 0) {
+ addText(mErrorLabel, builder.toString());
+ }
}
StackTraceElement[] frames = throwable.getStackTrace();
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LintOverlay.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LintOverlay.java
index bce1512..ca74493 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LintOverlay.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LintOverlay.java
@@ -19,6 +19,7 @@ package com.android.ide.eclipse.adt.internal.editors.layout.gle2;
import com.android.ide.eclipse.adt.internal.editors.IconFactory;
import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
+import com.google.common.collect.Lists;
import org.eclipse.core.resources.IMarker;
import org.eclipse.swt.graphics.GC;
@@ -29,8 +30,6 @@ import org.w3c.dom.Node;
import java.util.Collection;
-import lombok.ast.libs.org.parboiled.google.collect.Lists;
-
/**
* The {@link LintOverlay} paints an icon over each view that contains at least one
* lint error (unless the view is smaller than the icon)
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderService.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderService.java
index c274d3c..ffcb258 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderService.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderService.java
@@ -51,6 +51,7 @@ import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeFactory;
import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeProxy;
import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
+import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo.ActivityAttributes;
import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
@@ -167,7 +168,7 @@ public class RenderService {
if (RenderSecurityManager.RESTRICT_READS) {
projectPath = AdtUtils.getAbsolutePath(mProject).toFile().getPath();
Sdk sdk = Sdk.getCurrent();
- sdkPath = sdk != null ? sdk.getSdkLocation() : null;
+ sdkPath = sdk != null ? sdk.getSdkOsLocation() : null;
}
RenderSecurityManager securityManager = new RenderSecurityManager(sdkPath, projectPath);
securityManager.setLogger(AdtPlugin.getDefault());
@@ -483,6 +484,18 @@ public class RenderService {
try {
params.setAppLabel(manifestInfo.getApplicationLabel());
params.setAppIcon(manifestInfo.getApplicationIcon());
+ String activity = mEditor.getConfigurationChooser().getConfiguration().getActivity();
+ if (activity != null) {
+ ActivityAttributes info = manifestInfo.getActivityAttributes(activity);
+ if (info != null) {
+ if (info.getLabel() != null) {
+ params.setAppLabel(info.getLabel());
+ }
+ if (info.getIcon() != null) {
+ params.setAppIcon(info.getIcon());
+ }
+ }
+ }
} catch (Exception e) {
// ignore.
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestInfo.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestInfo.java
index 9b26057..6d2d1c1 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestInfo.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestInfo.java
@@ -24,11 +24,16 @@ import static com.android.xml.AndroidManifest.ATTRIBUTE_LABEL;
import static com.android.xml.AndroidManifest.ATTRIBUTE_MIN_SDK_VERSION;
import static com.android.xml.AndroidManifest.ATTRIBUTE_NAME;
import static com.android.xml.AndroidManifest.ATTRIBUTE_PACKAGE;
+import static com.android.xml.AndroidManifest.ATTRIBUTE_PARENT_ACTIVITY_NAME;
import static com.android.xml.AndroidManifest.ATTRIBUTE_SUPPORTS_RTL;
import static com.android.xml.AndroidManifest.ATTRIBUTE_TARGET_SDK_VERSION;
import static com.android.xml.AndroidManifest.ATTRIBUTE_THEME;
+import static com.android.xml.AndroidManifest.ATTRIBUTE_UI_OPTIONS;
+import static com.android.xml.AndroidManifest.ATTRIBUTE_VALUE;
import static com.android.xml.AndroidManifest.NODE_ACTIVITY;
+import static com.android.xml.AndroidManifest.NODE_METADATA;
import static com.android.xml.AndroidManifest.NODE_USES_SDK;
+import static com.android.xml.AndroidManifest.VALUE_PARENT_ACTIVITY;
import static org.eclipse.jdt.core.search.IJavaSearchConstants.REFERENCES;
import com.android.SdkConstants;
@@ -99,6 +104,123 @@ import javax.xml.xpath.XPathExpressionException;
* @see AndroidManifest
*/
public class ManifestInfo {
+
+ public static class ActivityAttributes {
+ @Nullable
+ private final String mIcon;
+ @Nullable
+ private final String mLabel;
+ @NonNull
+ private final String mName;
+ @Nullable
+ private final String mParentActivity;
+ @Nullable
+ private final String mTheme;
+ @Nullable
+ private final String mUiOptions;
+
+ public ActivityAttributes(Element activity, String packageName) {
+
+ // Get activity name.
+ String name = activity.getAttributeNS(NS_RESOURCES, ATTRIBUTE_NAME);
+ if (name == null || name.length() == 0) {
+ throw new RuntimeException("Activity name cannot be empty");
+ }
+ int index = name.indexOf('.');
+ if (index <= 0 && packageName != null && !packageName.isEmpty()) {
+ name = packageName + (index == -1 ? "." : "") + name;
+ }
+ mName = name;
+
+ // Get activity icon.
+ String value = activity.getAttributeNS(NS_RESOURCES, ATTRIBUTE_ICON);
+ if (value != null && value.length() > 0) {
+ mIcon = value;
+ } else {
+ mIcon = null;
+ }
+
+ // Get activity label.
+ value = activity.getAttributeNS(NS_RESOURCES, ATTRIBUTE_LABEL);
+ if (value != null && value.length() > 0) {
+ mLabel = value;
+ } else {
+ mLabel = null;
+ }
+
+ // Get activity parent. Also search the meta-data for parent info.
+ value = activity.getAttributeNS(NS_RESOURCES, ATTRIBUTE_PARENT_ACTIVITY_NAME);
+ if (value == null || value.length() == 0) {
+ // TODO: Not sure if meta data can be used for API Level > 16
+ NodeList metaData = activity.getElementsByTagName(NODE_METADATA);
+ for (int j = 0, m = metaData.getLength(); j < m; j++) {
+ Element data = (Element) metaData.item(j);
+ String metadataName = data.getAttributeNS(NS_RESOURCES, ATTRIBUTE_NAME);
+ if (VALUE_PARENT_ACTIVITY.equals(metadataName)) {
+ value = data.getAttributeNS(NS_RESOURCES, ATTRIBUTE_VALUE);
+ if (value != null) {
+ index = value.indexOf('.');
+ if (index <= 0 && packageName != null && !packageName.isEmpty()) {
+ value = packageName + (index == -1 ? "." : "") + value;
+ break;
+ }
+ }
+ }
+ }
+ }
+ if (value != null && value.length() > 0) {
+ mParentActivity = value;
+ } else {
+ mParentActivity = null;
+ }
+
+ // Get activity theme.
+ value = activity.getAttributeNS(NS_RESOURCES, ATTRIBUTE_THEME);
+ if (value != null && value.length() > 0) {
+ mTheme = value;
+ } else {
+ mTheme = null;
+ }
+
+ // Get UI options.
+ value = activity.getAttributeNS(NS_RESOURCES, ATTRIBUTE_UI_OPTIONS);
+ if (value != null && value.length() > 0) {
+ mUiOptions = value;
+ } else {
+ mUiOptions = null;
+ }
+ }
+
+ @Nullable
+ public String getIcon() {
+ return mIcon;
+ }
+
+ @Nullable
+ public String getLabel() {
+ return mLabel;
+ }
+
+ public String getName() {
+ return mName;
+ }
+
+ @Nullable
+ public String getParentActivity() {
+ return mParentActivity;
+ }
+
+ @Nullable
+ public String getTheme() {
+ return mTheme;
+ }
+
+ @Nullable
+ public String getUiOptions() {
+ return mUiOptions;
+ }
+ }
+
/**
* The maximum number of milliseconds to search for an activity in the codebase when
* attempting to associate layouts with activities in
@@ -109,7 +231,7 @@ public class ManifestInfo {
private final IProject mProject;
private String mPackage;
private String mManifestTheme;
- private Map<String, String> mActivityThemes;
+ private Map<String, ActivityAttributes> mActivityAttributes;
private IAbstractFile mManifestFile;
private long mLastModified;
private long mLastChecked;
@@ -201,7 +323,7 @@ public class ManifestInfo {
}
mLastModified = fileModified;
- mActivityThemes = new HashMap<String, String>();
+ mActivityAttributes = new HashMap<String, ActivityAttributes>();
mManifestTheme = null;
mTargetSdk = 1; // Default when not specified
mMinSdk = 1; // Default when not specified
@@ -226,15 +348,8 @@ public class ManifestInfo {
NodeList activities = document.getElementsByTagName(NODE_ACTIVITY);
for (int i = 0, n = activities.getLength(); i < n; i++) {
Element activity = (Element) activities.item(i);
- String theme = activity.getAttributeNS(NS_RESOURCES, ATTRIBUTE_THEME);
- if (theme != null && theme.length() > 0) {
- String name = activity.getAttributeNS(NS_RESOURCES, ATTRIBUTE_NAME);
- int index = name.indexOf('.');
- if (index <= 0 && mPackage != null && !mPackage.isEmpty()) {
- name = mPackage + (index == -1 ? "." : "") + name;
- }
- mActivityThemes.put(name, theme);
- }
+ ActivityAttributes info = new ActivityAttributes(activity, mPackage);
+ mActivityAttributes.put(info.getName(), info);
}
NodeList applications = root.getElementsByTagName(AndroidManifest.NODE_APPLICATION);
@@ -318,15 +433,22 @@ public class ManifestInfo {
}
/**
- * Returns a map from activity full class names to the corresponding theme style to be
- * used
+ * Returns a map from activity full class names to the corresponding {@link ActivityAttributes}.
*
- * @return a map from activity fqcn to theme style
+ * @return a map from activity fqcn to ActivityAttributes
*/
@NonNull
- public Map<String, String> getActivityThemes() {
+ public Map<String, ActivityAttributes> getActivityAttributesMap() {
sync();
- return mActivityThemes;
+ return mActivityAttributes;
+ }
+
+ /**
+ * Returns the attributes of an activity given its full class name.
+ */
+ @Nullable
+ public ActivityAttributes getActivityAttributes(String activity) {
+ return getActivityAttributesMap().get(activity);
}
/**
@@ -402,6 +524,7 @@ public class ManifestInfo {
sync();
return mApplicationSupportsRtl;
}
+
/**
* Returns the target SDK version
*
@@ -808,11 +931,19 @@ public class ManifestInfo {
}
}
- Integer i = AndroidManifest.getTargetSdkVersion(manifestFile);
- if (i == null) {
+ value = AndroidManifest.getTargetSdkVersion(manifestFile);
+ if (value == null) {
mTargetSdkVersion = mMinSdkVersion;
- } else {
- mTargetSdkVersion = i.intValue();
+ } else if (value instanceof String) {
+ // handle codename, only if we can resolve it.
+ if (Sdk.getCurrent() != null) {
+ IAndroidTarget target = Sdk.getCurrent().getTargetFromHashString(
+ "android-" + value); //$NON-NLS-1$
+ if (target != null) {
+ // codename future API level is current api + 1
+ mTargetSdkVersion = target.getVersion().getApiLevel() + 1;
+ }
+ }
}
} catch (XPathExpressionException e) {
// do nothing we'll use 1 below.
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/DeviceChooserDialog.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/DeviceChooserDialog.java
index 1b850c9..995ccdf 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/DeviceChooserDialog.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/DeviceChooserDialog.java
@@ -479,7 +479,7 @@ public class DeviceChooserDialog extends Dialog implements IDeviceChangeListener
offsetComp.setLayout(layout);
mPreferredAvdSelector = new AvdSelector(offsetComp,
- mSdk.getSdkLocation(),
+ mSdk.getSdkOsLocation(),
mSdk.getAvdManager(),
new NonRunningAvdFilter(),
DisplayMode.SIMPLE_SELECTION,
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/EmulatorConfigTab.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/EmulatorConfigTab.java
index 248cb7a..779dfa1 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/EmulatorConfigTab.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/EmulatorConfigTab.java
@@ -233,7 +233,7 @@ public class EmulatorConfigTab extends AbstractLaunchConfigurationTab {
// displayed to ensure we have the latest one (dialog is reused but SDK could have
// been changed in between.
mPreferredAvdSelector = new AvdSelector(avdOffsetComp,
- Sdk.getCurrent().getSdkLocation(),
+ Sdk.getCurrent().getSdkOsLocation(),
null /* avd manager */,
DisplayMode.SIMPLE_CHECK,
new AdtConsoleSdkLog());
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/InstrumentationRunnerValidator.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/InstrumentationRunnerValidator.java
index b494f62..54fd207 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/InstrumentationRunnerValidator.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/launch/junit/InstrumentationRunnerValidator.java
@@ -134,13 +134,15 @@ class InstrumentationRunnerValidator {
}
// check if this instrumentation is the standard test runner
if (!instrumentation.equals(SdkConstants.CLASS_INSTRUMENTATION_RUNNER)) {
- // check if it extends the standard test runner
+ // Ideally, we'd check if the class extends instrumentation test runner.
+ // However, the Google Instrumentation Test Runner extends Google Instrumentation, and not a test runner,
+ // so we just check that the super class is Instrumentation.
String result = BaseProjectHelper.testClassForManifest(mJavaProject,
- instrumentation, SdkConstants.CLASS_INSTRUMENTATION_RUNNER, true);
+ instrumentation, SdkConstants.CLASS_INSTRUMENTATION, true);
if (result != BaseProjectHelper.TEST_CLASS_OK) {
return String.format(
LaunchMessages.InstrValidator_WrongRunnerTypeMsg_s,
- SdkConstants.CLASS_INSTRUMENTATION_RUNNER);
+ SdkConstants.CLASS_INSTRUMENTATION);
}
}
return INSTRUMENTATION_OK;
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/EclipseLintClient.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/EclipseLintClient.java
index 45ae2c5..fd8125e 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/EclipseLintClient.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/EclipseLintClient.java
@@ -33,10 +33,10 @@ import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import com.android.sdklib.IAndroidTarget;
import com.android.tools.lint.checks.BuiltinIssueRegistry;
import com.android.tools.lint.client.api.Configuration;
-import com.android.tools.lint.client.api.IDomParser;
-import com.android.tools.lint.client.api.IJavaParser;
import com.android.tools.lint.client.api.IssueRegistry;
+import com.android.tools.lint.client.api.JavaParser;
import com.android.tools.lint.client.api.LintClient;
+import com.android.tools.lint.client.api.XmlParser;
import com.android.tools.lint.detector.api.ClassContext;
import com.android.tools.lint.detector.api.Context;
import com.android.tools.lint.detector.api.DefaultPosition;
@@ -105,7 +105,6 @@ import java.util.List;
import java.util.Map;
import java.util.WeakHashMap;
-import lombok.ast.TypeReference;
import lombok.ast.ecj.EcjTreeConverter;
import lombok.ast.grammar.ParseProblem;
import lombok.ast.grammar.Source;
@@ -114,7 +113,7 @@ import lombok.ast.grammar.Source;
* Eclipse implementation for running lint on workspace files and projects.
*/
@SuppressWarnings("restriction") // DOM model
-public class EclipseLintClient extends LintClient implements IDomParser {
+public class EclipseLintClient extends LintClient {
static final String MARKER_CHECKID_PROPERTY = "checkid"; //$NON-NLS-1$
private static final String MODEL_PROPERTY = "model"; //$NON-NLS-1$
private final List<? extends IResource> mResources;
@@ -206,51 +205,103 @@ public class EclipseLintClient extends LintClient implements IDomParser {
}
@Override
- public IDomParser getDomParser() {
- return this;
- }
+ public XmlParser getXmlParser() {
+ return new XmlParser() {
+ @Override
+ public Document parseXml(@NonNull XmlContext context) {
+ // Map File to IFile
+ IFile file = AdtUtils.fileToIFile(context.file);
+ if (file == null || !file.exists()) {
+ String path = context.file.getPath();
+ AdtPlugin.log(IStatus.ERROR, "Can't find file %1$s in workspace", path);
+ return null;
+ }
- @Override
- public IJavaParser getJavaParser() {
- if (mJavaParser == null) {
- mJavaParser = new EclipseJavaParser();
- }
+ IStructuredModel model = null;
+ try {
+ IModelManager modelManager = StructuredModelManager.getModelManager();
+ if (modelManager == null) {
+ // This can happen if incremental lint is running right as Eclipse is
+ // shutting down
+ return null;
+ }
+ model = modelManager.getModelForRead(file);
+ if (model instanceof IDOMModel) {
+ context.setProperty(MODEL_PROPERTY, model);
+ IDOMModel domModel = (IDOMModel) model;
+ return domModel.getDocument();
+ }
+ } catch (IOException e) {
+ AdtPlugin.log(e, "Cannot read XML file");
+ } catch (CoreException e) {
+ AdtPlugin.log(e, null);
+ }
- return mJavaParser;
- }
+ return null;
+ }
- // ----- Implements IDomParser -----
+ @Override
+ public @NonNull Location getLocation(@NonNull XmlContext context, @NonNull Node node) {
+ IStructuredModel model = (IStructuredModel) context.getProperty(MODEL_PROPERTY);
+ return new LazyLocation(context.file, model.getStructuredDocument(),
+ (IndexedRegion) node);
+ }
- @Override
- public Document parseXml(@NonNull XmlContext context) {
- // Map File to IFile
- IFile file = AdtUtils.fileToIFile(context.file);
- if (file == null || !file.exists()) {
- String path = context.file.getPath();
- AdtPlugin.log(IStatus.ERROR, "Can't find file %1$s in workspace", path);
- return null;
- }
+ @Override
+ public @NonNull Location getLocation(@NonNull XmlContext context, @NonNull Node node,
+ int start, int end) {
+ IndexedRegion region = (IndexedRegion) node;
+ int nodeStart = region.getStartOffset();
+
+ IStructuredModel model = (IStructuredModel) context.getProperty(MODEL_PROPERTY);
+ // Get line number
+ LazyLocation location = new LazyLocation(context.file,
+ model.getStructuredDocument(), region);
+ int line = location.getStart().getLine();
+
+ Position startPos = new DefaultPosition(line, -1, nodeStart + start);
+ Position endPos = new DefaultPosition(line, -1, nodeStart + end);
+ return Location.create(context.file, startPos, endPos);
+ }
- IStructuredModel model = null;
- try {
- IModelManager modelManager = StructuredModelManager.getModelManager();
- if (modelManager == null) {
- // This can happen if incremental lint is running right as Eclipse is shutting down
- return null;
+ @Override
+ public int getNodeStartOffset(@NonNull XmlContext context, @NonNull Node node) {
+ IndexedRegion region = (IndexedRegion) node;
+ return region.getStartOffset();
}
- model = modelManager.getModelForRead(file);
- if (model instanceof IDOMModel) {
- context.setProperty(MODEL_PROPERTY, model);
- IDOMModel domModel = (IDOMModel) model;
- return domModel.getDocument();
+
+ @Override
+ public int getNodeEndOffset(@NonNull XmlContext context, @NonNull Node node) {
+ IndexedRegion region = (IndexedRegion) node;
+ return region.getEndOffset();
}
- } catch (IOException e) {
- AdtPlugin.log(e, "Cannot read XML file");
- } catch (CoreException e) {
- AdtPlugin.log(e, null);
+
+ @Override
+ public @NonNull Handle createLocationHandle(final @NonNull XmlContext context,
+ final @NonNull Node node) {
+ IStructuredModel model = (IStructuredModel) context.getProperty(MODEL_PROPERTY);
+ return new LazyLocation(context.file, model.getStructuredDocument(),
+ (IndexedRegion) node);
+ }
+
+ @Override
+ public void dispose(@NonNull XmlContext context, @NonNull Document document) {
+ IStructuredModel model = (IStructuredModel) context.getProperty(MODEL_PROPERTY);
+ assert model != null : context.file;
+ if (model != null) {
+ model.releaseFromRead();
+ }
+ }
+ };
+ }
+
+ @Override
+ public JavaParser getJavaParser(@Nullable Project project) {
+ if (mJavaParser == null) {
+ mJavaParser = new EclipseJavaParser();
}
- return null;
+ return mJavaParser;
}
// Cache for {@link getProject}
@@ -735,36 +786,6 @@ public class EclipseLintClient extends LintClient implements IDomParser {
}
}
- @Override
- public @NonNull Location getLocation(@NonNull XmlContext context, @NonNull Node node) {
- IStructuredModel model = (IStructuredModel) context.getProperty(MODEL_PROPERTY);
- return new LazyLocation(context.file, model.getStructuredDocument(), (IndexedRegion) node);
- }
-
- @Override
- public @NonNull Location getLocation(@NonNull XmlContext context, @NonNull Node node,
- int start, int end) {
- IndexedRegion region = (IndexedRegion) node;
- int nodeStart = region.getStartOffset();
-
- IStructuredModel model = (IStructuredModel) context.getProperty(MODEL_PROPERTY);
- // Get line number
- LazyLocation location = new LazyLocation(context.file, model.getStructuredDocument(),
- region);
- int line = location.getStart().getLine();
-
- Position startPos = new DefaultPosition(line, -1, nodeStart + start);
- Position endPos = new DefaultPosition(line, -1, nodeStart + end);
- return Location.create(context.file, startPos, endPos);
- }
-
- @Override
- public @NonNull Handle createLocationHandle(final @NonNull XmlContext context,
- final @NonNull Node node) {
- IStructuredModel model = (IStructuredModel) context.getProperty(MODEL_PROPERTY);
- return new LazyLocation(context.file, model.getStructuredDocument(), (IndexedRegion) node);
- }
-
private Map<Project, ClassPathInfo> mProjectInfo;
@Override
@@ -890,15 +911,6 @@ public class EclipseLintClient extends LintClient implements IDomParser {
}
@Override
- public void dispose(@NonNull XmlContext context, @NonNull Document document) {
- IStructuredModel model = (IStructuredModel) context.getProperty(MODEL_PROPERTY);
- assert model != null : context.file;
- if (model != null) {
- model.releaseFromRead();
- }
- }
-
- @Override
@NonNull
public IAndroidTarget[] getTargets() {
return Sdk.getCurrent().getTargets();
@@ -1090,18 +1102,20 @@ public class EclipseLintClient extends LintClient implements IDomParser {
}
}
- private static class EclipseJavaParser implements IJavaParser {
+ private static class EclipseJavaParser extends JavaParser {
private static final boolean USE_ECLIPSE_PARSER = true;
private final Parser mParser;
EclipseJavaParser() {
if (USE_ECLIPSE_PARSER) {
CompilerOptions options = new CompilerOptions();
- // Read settings from project? Note that this doesn't really matter because
- // we will only be parsing, not actually compiling.
- options.complianceLevel = ClassFileConstants.JDK1_6;
- options.sourceLevel = ClassFileConstants.JDK1_6;
- options.targetJDK = ClassFileConstants.JDK1_6;
+ // Always using JDK 7 rather than basing it on project metadata since we
+ // don't do compilation error validation in lint (we leave that to the IDE's
+ // error parser or the command line build's compilation step); we want an
+ // AST that is as tolerant as possible.
+ options.complianceLevel = ClassFileConstants.JDK1_7;
+ options.sourceLevel = ClassFileConstants.JDK1_7;
+ options.targetJDK = ClassFileConstants.JDK1_7;
options.parseLiteralExpressionsAsConstants = true;
ProblemReporter problemReporter = new ProblemReporter(
DefaultErrorHandlingPolicies.exitOnFirstError(),
@@ -1115,6 +1129,11 @@ public class EclipseLintClient extends LintClient implements IDomParser {
}
@Override
+ public void prepareJavaParse(@NonNull List<JavaContext> contexts) {
+ // TODO: Use batch compiler from lint-cli.jar
+ }
+
+ @Override
public lombok.ast.Node parseJava(@NonNull JavaContext context) {
if (USE_ECLIPSE_PARSER) {
// Use Eclipse's compiler
@@ -1216,14 +1235,15 @@ public class EclipseLintClient extends LintClient implements IDomParser {
@Override
@Nullable
- public lombok.ast.Node resolve(@NonNull JavaContext context,
+ public ResolvedNode resolve(@NonNull JavaContext context,
@NonNull lombok.ast.Node node) {
return null;
}
@Override
@Nullable
- public TypeReference getType(@NonNull JavaContext context, @NonNull lombok.ast.Node node) {
+ public TypeDescriptor getType(@NonNull JavaContext context,
+ @NonNull lombok.ast.Node node) {
return null;
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintFix.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintFix.java
index 401703e..658e409 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintFix.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/LintFix.java
@@ -24,7 +24,7 @@ import com.android.tools.lint.checks.DetectMissingPrefix;
import com.android.tools.lint.checks.DosLineEndingDetector;
import com.android.tools.lint.checks.HardcodedValuesDetector;
import com.android.tools.lint.checks.InefficientWeightDetector;
-import com.android.tools.lint.checks.ManifestOrderDetector;
+import com.android.tools.lint.checks.ManifestDetector;
import com.android.tools.lint.checks.MissingIdDetector;
import com.android.tools.lint.checks.ObsoleteLayoutParamsDetector;
import com.android.tools.lint.checks.PxUsageDetector;
@@ -152,7 +152,7 @@ abstract class LintFix implements ICompletionProposal {
LinearLayoutWeightFix.class);
sFixes.put(AccessibilityDetector.ISSUE.getId(), SetAttributeFix.class);
sFixes.put(InefficientWeightDetector.BASELINE_WEIGHTS.getId(), SetAttributeFix.class);
- sFixes.put(ManifestOrderDetector.ALLOW_BACKUP.getId(), SetAttributeFix.class);
+ sFixes.put(ManifestDetector.ALLOW_BACKUP.getId(), SetAttributeFix.class);
sFixes.put(MissingIdDetector.ISSUE.getId(), SetAttributeFix.class);
sFixes.put(HardcodedValuesDetector.ISSUE.getId(), ExtractStringFix.class);
sFixes.put(UselessViewDetector.USELESS_LEAF.getId(), RemoveUselessViewFix.class);
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/SetAttributeFix.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/SetAttributeFix.java
index 627eeb8..ea73b9a 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/SetAttributeFix.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/lint/SetAttributeFix.java
@@ -31,7 +31,7 @@ import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
import com.android.tools.lint.checks.AccessibilityDetector;
import com.android.tools.lint.checks.InefficientWeightDetector;
-import com.android.tools.lint.checks.ManifestOrderDetector;
+import com.android.tools.lint.checks.ManifestDetector;
import com.android.tools.lint.checks.MissingIdDetector;
import com.android.tools.lint.checks.SecurityDetector;
import com.android.tools.lint.checks.TextFieldDetector;
@@ -59,7 +59,7 @@ final class SetAttributeFix extends SetPropertyFix {
return ATTR_INPUT_TYPE;
} else if (mId.equals(TranslationDetector.MISSING.getId())) {
return ATTR_TRANSLATABLE;
- } else if (mId.equals(ManifestOrderDetector.ALLOW_BACKUP.getId())) {
+ } else if (mId.equals(ManifestDetector.ALLOW_BACKUP.getId())) {
return ATTR_ALLOW_BACKUP;
} else if (mId.equals(MissingIdDetector.ISSUE.getId())) {
return ATTR_ID;
@@ -90,7 +90,7 @@ final class SetAttributeFix extends SetPropertyFix {
return "Add permission attribute";
} else if (mId.equals(TranslationDetector.MISSING.getId())) {
return "Mark this as a non-translatable resource";
- } else if (mId.equals(ManifestOrderDetector.ALLOW_BACKUP.getId())) {
+ } else if (mId.equals(ManifestDetector.ALLOW_BACKUP.getId())) {
return "Set the allowBackup attribute to true or false";
} else if (mId.equals(MissingIdDetector.ISSUE.getId())) {
return "Set the ID attribute";
@@ -115,7 +115,7 @@ final class SetAttributeFix extends SetPropertyFix {
protected boolean invokeCodeCompletion() {
return mId.equals(SecurityDetector.EXPORTED_SERVICE.getId())
|| mId.equals(TextFieldDetector.ISSUE.getId())
- || mId.equals(ManifestOrderDetector.ALLOW_BACKUP.getId());
+ || mId.equals(ManifestDetector.ALLOW_BACKUP.getId());
}
@Override
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/BaseClasspathContainerInitializer.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/BaseClasspathContainerInitializer.java
index 362fe28..a58f27d 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/BaseClasspathContainerInitializer.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/BaseClasspathContainerInitializer.java
@@ -51,68 +51,53 @@ abstract class BaseClasspathContainerInitializer extends ClasspathContainerIniti
AdtPlugin.printErrorToConsole(project, errorMessage);
}
- try {
- BaseProjectHelper.markProject(project, markerType,
- errorMessage, IMarker.SEVERITY_ERROR, IMarker.PRIORITY_HIGH);
- } catch (CoreException e) {
- // In some cases, the workspace may be locked for modification when we
- // pass here.
- // We schedule a new job to put the marker after.
- final String fmessage = errorMessage;
- Job markerJob = new Job("Android SDK: Resolving error markers") {
- @Override
- protected IStatus run(IProgressMonitor monitor) {
- try {
- BaseProjectHelper.markProject(project,
- markerType,
- fmessage, IMarker.SEVERITY_ERROR,
- IMarker.PRIORITY_HIGH);
- } catch (CoreException e2) {
- AdtPlugin.log(e2, null);
- // Don't return e2.getStatus(); the job control will then produce
- // a popup with this error, which isn't very interesting for the
- // user.
- }
-
- return Status.OK_STATUS;
+ // Use a job to prevent requiring a workspace lock in this thread.
+ final String fmessage = errorMessage;
+ Job markerJob = new Job("Android SDK: Resolving error markers") {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ BaseProjectHelper.markProject(project,
+ markerType,
+ fmessage, IMarker.SEVERITY_ERROR,
+ IMarker.PRIORITY_HIGH);
+ } catch (CoreException e2) {
+ AdtPlugin.log(e2, null);
+ // Don't return e2.getStatus(); the job control will then produce
+ // a popup with this error, which isn't very interesting for the
+ // user.
}
- };
- // build jobs are run after other interactive jobs
- markerJob.setPriority(Job.BUILD);
- markerJob.setRule(ResourcesPlugin.getWorkspace().getRoot());
- markerJob.schedule();
- }
- } else {
- // no error, remove existing markers.
- try {
- if (project.isAccessible()) {
- project.deleteMarkers(markerType, true,
- IResource.DEPTH_INFINITE);
+ return Status.OK_STATUS;
}
- } catch (CoreException ce) {
- // In some cases, the workspace may be locked for modification when we pass
- // here, so we schedule a new job to put the marker after.
- Job markerJob = new Job("Android SDK: Resolving error markers") {
- @Override
- protected IStatus run(IProgressMonitor monitor) {
- try {
- if (project.isAccessible()) {
- project.deleteMarkers(markerType, true,
- IResource.DEPTH_INFINITE);
- }
- } catch (CoreException e2) {
- AdtPlugin.log(e2, null);
- }
+ };
- return Status.OK_STATUS;
+ // build jobs are run after other interactive jobs
+ markerJob.setPriority(Job.BUILD);
+ markerJob.setRule(ResourcesPlugin.getWorkspace().getRoot());
+ markerJob.schedule();
+ } else {
+ // Use a job to prevent requiring a workspace lock in this thread.
+ Job markerJob = new Job("Android SDK: Resolving error markers") {
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ try {
+ if (project.isAccessible()) {
+ project.deleteMarkers(markerType, true,
+ IResource.DEPTH_INFINITE);
+ }
+ } catch (CoreException e2) {
+ AdtPlugin.log(e2, null);
}
- };
- // build jobs are run after other interactive jobs
- markerJob.setPriority(Job.BUILD);
- markerJob.schedule();
- }
+ return Status.OK_STATUS;
+ }
+ };
+
+ // build jobs are run after other interactive jobs
+ markerJob.setPriority(Job.BUILD);
+ markerJob.setRule(ResourcesPlugin.getWorkspace().getRoot());
+ markerJob.schedule();
}
}
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ExportHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ExportHelper.java
index 8168590..56e0c09 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ExportHelper.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ExportHelper.java
@@ -133,15 +133,7 @@ public final class ExportHelper {
String dexMergerStr = projectState.getProperty(AdtConstants.DEX_OPTIONS_DISABLE_MERGER);
Boolean dexMerger = Boolean.valueOf(dexMergerStr);
- BuildToolInfo buildToolInfo = projectState.getBuildToolInfo();
- if (buildToolInfo == null) {
- buildToolInfo = Sdk.getCurrent().getLatestBuildTool();
- }
-
- if (buildToolInfo == null) {
- throw new CoreException(new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
- "No Build Tools installed in the SDK."));
- }
+ BuildToolInfo buildToolInfo = getBuildTools(projectState);
BuildHelper helper = new BuildHelper(
projectState,
@@ -339,6 +331,20 @@ public final class ExportHelper {
}
}
+ public static BuildToolInfo getBuildTools(ProjectState projectState)
+ throws CoreException {
+ BuildToolInfo buildToolInfo = projectState.getBuildToolInfo();
+ if (buildToolInfo == null) {
+ buildToolInfo = Sdk.getCurrent().getLatestBuildTool();
+ }
+
+ if (buildToolInfo == null) {
+ throw new CoreException(new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
+ "No Build Tools installed in the SDK."));
+ }
+ return buildToolInfo;
+ }
+
/**
* Exports an unsigned release APK after prompting the user for a location.
*
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/LibraryClasspathContainerInitializer.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/LibraryClasspathContainerInitializer.java
index 1e0ada0..525e2fd 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/LibraryClasspathContainerInitializer.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/LibraryClasspathContainerInitializer.java
@@ -326,7 +326,7 @@ public class LibraryClasspathContainerInitializer extends BaseClasspathContainer
// annotations support for older version of android
if (state.getTarget() != null && state.getTarget().getVersion().getApiLevel() <= 15) {
- File annotationsJar = new File(Sdk.getCurrent().getSdkLocation(),
+ File annotationsJar = new File(Sdk.getCurrent().getSdkOsLocation(),
SdkConstants.FD_TOOLS + File.separator + SdkConstants.FD_SUPPORT +
File.separator + SdkConstants.FN_ANNOTATIONS_JAR);
@@ -338,7 +338,7 @@ public class LibraryClasspathContainerInitializer extends BaseClasspathContainer
return null;
}
BuildToolInfo buildToolInfo = state.getBuildToolInfo();
- if (buildToolInfo == null) {
+ if (buildToolInfo != null) {
buildToolInfo = Sdk.getCurrent().getLatestBuildTool();
if (buildToolInfo == null) {
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ProjectHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ProjectHelper.java
index 44827a0..a32b4ca 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ProjectHelper.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/ProjectHelper.java
@@ -28,6 +28,7 @@ import com.android.ide.eclipse.adt.internal.build.builders.PreCompilerBuilder;
import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
+import com.android.sdklib.BuildToolInfo;
import com.android.sdklib.IAndroidTarget;
import com.android.utils.Pair;
@@ -875,13 +876,27 @@ public final class ProjectHelper {
}
if (JavaCore.VERSION_1_7.equals(optionValue)) {
- // Requires API 19
+ // Requires API 19 and buildTools 19
Sdk currentSdk = Sdk.getCurrent();
if (currentSdk != null) {
- IAndroidTarget target = currentSdk.getTarget(project.getProject());
- if (target != null && target.getVersion().getApiLevel() >= 19) {
- return true;
+ IProject p = project.getProject();
+ IAndroidTarget target = currentSdk.getTarget(p);
+ if (target == null || target.getVersion().getApiLevel() < 19) {
+ return false;
}
+
+ ProjectState projectState = Sdk.getProjectState(p);
+ if (projectState != null) {
+ BuildToolInfo buildToolInfo = projectState.getBuildToolInfo();
+ if (buildToolInfo == null) {
+ buildToolInfo = currentSdk.getLatestBuildTool();
+ }
+ if (buildToolInfo == null || buildToolInfo.getRevision().getMajor() < 19) {
+ return false;
+ }
+ }
+
+ return true;
}
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/Sdk.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/Sdk.java
index c8faa5e..8e40f1c 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/Sdk.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/sdk/Sdk.java
@@ -282,7 +282,7 @@ public final class Sdk {
// create the AVD Manager
AvdManager avdManager = null;
try {
- avdManager = AvdManager.getInstance(manager, log);
+ avdManager = AvdManager.getInstance(manager.getLocalSdk(), log);
} catch (AndroidLocationException e) {
log.error(e, "Error parsing the AVDs");
}
@@ -321,15 +321,47 @@ public final class Sdk {
}
/**
- * Returns the location (OS path) of the current SDK.
+ * Returns the location of the current SDK as an OS path string.
+ * Guaranteed to be terminated by a platform-specific path separator.
+ * <p/>
+ * Due to {@link File} canonicalization, this MAY differ from the string used to initialize
+ * the SDK path.
+ *
+ * @return The SDK OS path or null if no SDK is setup.
+ * @deprecated Consider using {@link #getSdkFileLocation()} instead.
+ * @see #getSdkFileLocation()
*/
- public String getSdkLocation() {
- return mManager.getLocation();
+ @Deprecated
+ @Nullable
+ public String getSdkOsLocation() {
+ String path = mManager == null ? null : mManager.getLocation();
+ if (path != null) {
+ // For backward compatibility make sure it ends with a separator.
+ // This used to be the case when the SDK Manager was created from a String path
+ // but now that a File is internally used the trailing dir separator is lost.
+ if (path.length() > 0 && !path.endsWith(File.separator)) {
+ path = path + File.separator;
+ }
+ }
+ return path;
+ }
+
+ /**
+ * Returns the location of the current SDK as a {@link File} or null.
+ *
+ * @return The SDK OS path or null if no SDK is setup.
+ */
+ @Nullable
+ public File getSdkFileLocation() {
+ if (mManager == null || mManager.getLocalSdk() == null) {
+ return null;
+ }
+ return mManager.getLocalSdk().getLocation();
}
/**
* Returns a <em>new</em> {@link SdkManager} that can parse the SDK located
- * at the current {@link #getSdkLocation()}.
+ * at the current {@link #getSdkOsLocation()}.
* <p/>
* Implementation detail: The {@link Sdk} has its own internal manager with
* a custom logger which is not designed to be useful for outsiders. Callers
@@ -343,7 +375,7 @@ public final class Sdk {
* @return A new {@link SdkManager} parsing the same location.
*/
public @Nullable SdkManager getNewSdkManager(@NonNull ILogger log) {
- return SdkManager.createManager(getSdkLocation(), log);
+ return SdkManager.createManager(getSdkOsLocation(), log);
}
/**
@@ -901,7 +933,7 @@ public final class Sdk {
mDocBaseUrl = getDocumentationBaseUrl(manager.getLocation() +
SdkConstants.OS_SDK_DOCS_FOLDER);
- mDeviceManager = DeviceManager.createInstance(manager.getLocation(),
+ mDeviceManager = DeviceManager.createInstance(manager.getLocalSdk().getLocation(),
AdtPlugin.getDefault());
// update whatever ProjectState is already present with new IAndroidTarget objects.
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/welcome/AdtStartup.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/welcome/AdtStartup.java
index 65eee94..b07893d 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/welcome/AdtStartup.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/welcome/AdtStartup.java
@@ -23,9 +23,9 @@ import com.android.ide.eclipse.adt.AdtPlugin.CheckSdkErrorHandler;
import com.android.ide.eclipse.adt.internal.editors.layout.gle2.LayoutWindowCoordinator;
import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
import com.android.ide.eclipse.base.InstallDetails;
-import com.android.sdklib.util.GrabProcessOutput;
-import com.android.sdklib.util.GrabProcessOutput.IProcessOutput;
-import com.android.sdklib.util.GrabProcessOutput.Wait;
+import com.android.utils.GrabProcessOutput;
+import com.android.utils.GrabProcessOutput.IProcessOutput;
+import com.android.utils.GrabProcessOutput.Wait;
import com.android.sdkstats.DdmsPreferenceStore;
import com.android.sdkstats.SdkStatsService;
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/ExportWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/ExportWizard.java
index 62090d4..170da6d 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/ExportWizard.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/export/ExportWizard.java
@@ -18,15 +18,19 @@ package com.android.ide.eclipse.adt.internal.wizards.export;
import com.android.annotations.Nullable;
import com.android.ide.eclipse.adt.AdtPlugin;
+import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
+import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import com.android.ide.eclipse.adt.internal.utils.FingerprintUtils;
import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs.BuildVerbosity;
import com.android.ide.eclipse.adt.internal.project.ExportHelper;
import com.android.ide.eclipse.adt.internal.project.ProjectHelper;
+import com.android.sdklib.BuildToolInfo;
+import com.android.sdklib.BuildToolInfo.PathId;
import com.android.sdklib.internal.build.DebugKeyProvider.IKeyGenOutput;
import com.android.sdklib.internal.build.KeystoreHelper;
-import com.android.sdklib.util.GrabProcessOutput;
-import com.android.sdklib.util.GrabProcessOutput.IProcessOutput;
-import com.android.sdklib.util.GrabProcessOutput.Wait;
+import com.android.utils.GrabProcessOutput;
+import com.android.utils.GrabProcessOutput.IProcessOutput;
+import com.android.utils.GrabProcessOutput.Wait;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
@@ -290,10 +294,14 @@ public final class ExportWizard extends Wizard implements IExportWizard {
// check the private key/certificate again since it may have been created just above.
if (mPrivateKey != null && mCertificate != null) {
+ // check whether we can run zipalign.
boolean runZipAlign = false;
- String path = AdtPlugin.getOsAbsoluteZipAlign();
- File zipalign = new File(path);
- runZipAlign = zipalign.isFile();
+
+ ProjectState projectState = Sdk.getProjectState(mProject);
+ BuildToolInfo buildToolInfo = ExportHelper.getBuildTools(projectState);
+
+ String zipAlignPath = buildToolInfo.getPath(PathId.ZIP_ALIGN);
+ runZipAlign = zipAlignPath != null && new File(zipAlignPath).isFile();
File apkExportFile = mDestinationFile;
if (runZipAlign) {
@@ -307,7 +315,7 @@ public final class ExportWizard extends Wizard implements IExportWizard {
// align if we can
if (runZipAlign) {
- String message = zipAlign(path, apkExportFile, mDestinationFile);
+ String message = zipAlign(zipAlignPath, apkExportFile, mDestinationFile);
if (message != null) {
displayError(message);
return false;
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/BuildFileCreator.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/BuildFileCreator.java
index 096b0b1..e749e71 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/BuildFileCreator.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/BuildFileCreator.java
@@ -16,8 +16,14 @@
package com.android.ide.eclipse.adt.internal.wizards.exportgradle;
+import static com.android.SdkConstants.GRADLE_LATEST_VERSION;
+import static com.android.SdkConstants.GRADLE_PLUGIN_LATEST_VERSION;
+import static com.android.SdkConstants.GRADLE_PLUGIN_NAME;
+
import com.android.SdkConstants;
import com.android.annotations.NonNull;
+import com.android.annotations.Nullable;
+import com.android.ide.eclipse.adt.internal.project.BaseProjectHelper;
import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import com.android.ide.eclipse.adt.io.IFolderWrapper;
@@ -27,6 +33,7 @@ import com.android.xml.AndroidManifest;
import com.google.common.base.Charsets;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
+import com.google.common.io.Closeables;
import com.google.common.io.Files;
import org.eclipse.core.resources.IFile;
@@ -40,17 +47,22 @@ import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Shell;
import java.io.ByteArrayInputStream;
import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
+import java.util.Properties;
import java.util.Set;
import java.util.TreeSet;
@@ -66,7 +78,7 @@ public class BuildFileCreator {
private static final String GRADLE_WRAPPER_LOCATION =
"tools/templates/gradle/wrapper"; //$NON-NLS-1$
static final String PLUGIN_CLASSPATH =
- "classpath 'com.android.tools.build:gradle:0.5.+'"; //$NON-NLS-1$
+ "classpath '" + GRADLE_PLUGIN_NAME + GRADLE_PLUGIN_LATEST_VERSION + "'"; //$NON-NLS-1$
static final String MAVEN_REPOSITORY = "mavenCentral()"; //$NON-NLS-1$
private static final String[] GRADLE_WRAPPER_FILES = new String[] {
@@ -98,7 +110,7 @@ public class BuildFileCreator {
@NonNull Shell shell,
@NonNull IProgressMonitor pm) {
- File gradleLocation = new File(Sdk.getCurrent().getSdkLocation(), GRADLE_WRAPPER_LOCATION);
+ File gradleLocation = new File(Sdk.getCurrent().getSdkOsLocation(), GRADLE_WRAPPER_LOCATION);
SubMonitor localmonitor = null;
try {
@@ -307,6 +319,10 @@ public class BuildFileCreator {
File src = new File(from, file);
dest.getParentFile().mkdirs();
new FileOp().copyFile(src, dest);
+
+ if (src.getName().equals(GRADLE_PROPERTIES)) {
+ updateGradleDistributionUrl(GRADLE_LATEST_VERSION, dest);
+ }
dest.setExecutable(src.canExecute());
status.addFileStatus(ExportStatus.FileStatus.OK, dest);
} catch (IOException e) {
@@ -377,6 +393,22 @@ public class BuildFileCreator {
mBuildFile.append(" compileSdkVersion " + buildApi + "\n"); //$NON-NLS-1$
mBuildFile.append(" buildToolsVersion \"" + toolsVersion + "\"\n"); //$NON-NLS-1$
mBuildFile.append("\n"); //$NON-NLS-1$
+
+ try {
+ IJavaProject javaProject = BaseProjectHelper.getJavaProject(projectState.getProject());
+ // otherwise we check source compatibility
+ String source = javaProject.getOption(JavaCore.COMPILER_SOURCE, true);
+ if (JavaCore.VERSION_1_7.equals(source)) {
+ mBuildFile.append(
+ " compileOptions {\n" + //$NON-NLS-1$
+ " sourceCompatibility JavaVersion.VERSION_1_7\n" + //$NON-NLS-1$
+ " targetCompatibility JavaVersion.VERSION_1_7\n" + //$NON-NLS-1$
+ " }\n" + //$NON-NLS-1$
+ "\n"); //$NON-NLS-1$
+ }
+ } catch (CoreException e) {
+ // Ignore compliance level, go with default
+ }
}
/**
@@ -541,4 +573,68 @@ public class BuildFileCreator {
return confirmedFiles;
}
+
+ // -------------------------------------------------------------------------------
+ // Fix gradle wrapper version. This code is from GradleUtil in the Studio plugin:
+ // -------------------------------------------------------------------------------
+
+ private static final String GRADLE_PROPERTIES = "gradle-wrapper.properties";
+ private static final String GRADLEW_PROPERTIES_PATH =
+ "gradle" + File.separator + "wrapper" + File.separator + GRADLE_PROPERTIES;
+ private static final String GRADLEW_DISTRIBUTION_URL_PROPERTY_NAME = "distributionUrl";
+
+ @NonNull
+ private static File getGradleWrapperPropertiesFilePath(@NonNull File projectRootDir) {
+ return new File(projectRootDir, GRADLEW_PROPERTIES_PATH);
+ }
+
+ @Nullable
+ public static File findWrapperPropertiesFile(@NonNull File projectRootDir) {
+ File wrapperPropertiesFile = getGradleWrapperPropertiesFilePath(projectRootDir);
+ return wrapperPropertiesFile.isFile() ? wrapperPropertiesFile : null;
+ }
+
+ private static boolean updateGradleDistributionUrl(
+ @NonNull String gradleVersion,
+ @NonNull File propertiesFile) throws IOException {
+ Properties properties = loadGradleWrapperProperties(propertiesFile);
+ String gradleDistributionUrl = getGradleDistributionUrl(gradleVersion, false);
+ String property = properties.getProperty(GRADLEW_DISTRIBUTION_URL_PROPERTY_NAME);
+ if (property != null
+ && (property.equals(gradleDistributionUrl) || property
+ .equals(getGradleDistributionUrl(gradleVersion, true)))) {
+ return false;
+ }
+ properties.setProperty(GRADLEW_DISTRIBUTION_URL_PROPERTY_NAME, gradleDistributionUrl);
+ FileOutputStream out = null;
+ try {
+ out = new FileOutputStream(propertiesFile);
+ properties.store(out, null);
+ return true;
+ } finally {
+ Closeables.close(out, true);
+ }
+ }
+
+ @NonNull
+ private static Properties loadGradleWrapperProperties(@NonNull File propertiesFile)
+ throws IOException {
+ Properties properties = new Properties();
+ FileInputStream fileInputStream = null;
+ try {
+ fileInputStream = new FileInputStream(propertiesFile);
+ properties.load(fileInputStream);
+ return properties;
+ } finally {
+ Closeables.close(fileInputStream, true);
+ }
+ }
+
+ @NonNull
+ private static String getGradleDistributionUrl(@NonNull String gradleVersion,
+ boolean binOnly) {
+ String suffix = binOnly ? "bin" : "all";
+ return String.format("http://services.gradle.org/distributions/gradle-%1$s-" + suffix
+ + ".zip", gradleVersion);
+ }
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/GradleExportWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/GradleExportWizard.java
index 29f8802..8c74187 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/GradleExportWizard.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/GradleExportWizard.java
@@ -54,6 +54,7 @@ public class GradleExportWizard extends Wizard implements IExportWizard {
@Override
public void addPages() {
+ addPage(new ImportInsteadPage());
mFirstPage = new ProjectSelectionPage(mBuilder);
addPage(mFirstPage);
mSecondPage = new ConfirmationPage(mBuilder);
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ImportInsteadPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ImportInsteadPage.java
new file mode 100644
index 0000000..73d4937
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/exportgradle/ImportInsteadPage.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2014 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.ide.eclipse.adt.internal.wizards.exportgradle;
+
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+
+class ImportInsteadPage extends WizardPage {
+ public ImportInsteadPage() {
+ super("importInstead");
+ setTitle("Import Instead?");
+ setDescription("Consider importing directly into Android Studio instead of exporting from Eclipse");
+ }
+
+ @Override
+ public void createControl(Composite parent) {
+ Composite container = new Composite(parent, SWT.NULL);
+ setControl(container);
+ container.setLayout(new GridLayout(1, false));
+
+ CLabel label = new CLabel(container, SWT.NONE);
+ label.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, false, 1, 1));
+ label.setText(
+ "Recent versions of Android Studio now support direct import of ADT projects.\n" +
+ "\n" +
+ "There are advantages to importing from Studio instead of exporting from Eclipse:\n" +
+ "- It can replace jars and library projects with Gradle dependencies instead\n" +
+ "- On import, it creates a new copy of the project and changes the project structure\n" +
+ " to the new Gradle directory layout which better supports multiple resource directories.\n" +
+ "- It can merge instrumentation test projects into the same project\n" +
+ "- Android Studio is released more frequently than the ADT plugin, so the import\n" +
+ " mechanism more closely tracks the rapidly evolving requirements of Studio Gradle\n" +
+ " projects.\n" +
+ "\n" +
+ "If you want to preserve your Eclipse directory structure, or if for some reason import\n" +
+ "in Studio doesn't work (please let us know by filing a bug), continue to export from\n" +
+ "Eclipse instead.");
+ }
+}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewActivityWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewActivityWizard.java
index 101027a..b33d65b 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewActivityWizard.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewActivityWizard.java
@@ -20,17 +20,25 @@ import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectW
import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.ATTR_MIN_API_LEVEL;
import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.ATTR_PACKAGE_NAME;
import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.ATTR_TARGET_API;
+import static org.eclipse.core.resources.IResource.DEPTH_INFINITE;
import com.android.annotations.NonNull;
+import com.android.ide.eclipse.adt.AdtPlugin;
import com.android.ide.eclipse.adt.AdtUtils;
import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.ltk.core.refactoring.Change;
+import org.eclipse.ltk.core.refactoring.CompositeChange;
import org.eclipse.ui.IWorkbench;
+import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Set;
@@ -131,6 +139,20 @@ public class NewActivityWizard extends TemplateWizard {
}
@Override
+ public boolean performFinish(IProgressMonitor monitor) throws InvocationTargetException {
+ boolean success = super.performFinish(monitor);
+
+ if (success) {
+ List<Runnable> finalizingTasks = getFinalizingActions();
+ for (Runnable r : finalizingTasks) {
+ r.run();
+ }
+ return true;
+ }
+ return false;
+ }
+
+ @Override
@NonNull
protected IProject getProject() {
return mActivityValues.project;
@@ -144,6 +166,13 @@ public class NewActivityWizard extends TemplateWizard {
}
@Override
+ @NonNull
+ protected List<Runnable> getFinalizingActions() {
+ TemplateHandler activityTemplate = mActivityValues.getTemplateHandler();
+ return activityTemplate.getFinalizingActions();
+ }
+
+ @Override
protected List<Change> computeChanges() {
return mActivityValues.computeChanges();
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewProjectPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewProjectPage.java
index 0b003f3..60dd0f2 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewProjectPage.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewProjectPage.java
@@ -21,6 +21,7 @@ import static com.android.ide.eclipse.adt.AdtUtils.extractClassName;
import static com.android.ide.eclipse.adt.internal.wizards.templates.NewTemplatePage.WIZARD_PAGE_WIDTH;
import com.android.annotations.Nullable;
+import com.android.ide.common.sdk.SdkVersionInfo;
import com.android.ide.eclipse.adt.AdtPlugin;
import com.android.ide.eclipse.adt.AdtUtils;
import com.android.ide.eclipse.adt.internal.editors.IconFactory;
@@ -29,6 +30,7 @@ import com.android.ide.eclipse.adt.internal.wizards.newproject.ApplicationInfoPa
import com.android.ide.eclipse.adt.internal.wizards.newproject.ProjectNamePage;
import com.android.sdklib.AndroidVersion;
import com.android.sdklib.IAndroidTarget;
+import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.eclipse.core.resources.IResource;
@@ -63,8 +65,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-import lombok.ast.libs.org.parboiled.google.collect.Lists;
-
/**
* First wizard page in the "New Project From Template" wizard
*/
@@ -551,7 +551,9 @@ public class NewProjectPage extends WizardPage
try {
minSdk = Integer.parseInt(mValues.minSdk);
} catch (NumberFormatException nufe) {
- minSdk = 1;
+ // If not a number, then the string is a codename, so treat it
+ // as a preview version.
+ minSdk = SdkVersionInfo.HIGHEST_KNOWN_API + 1;
}
}
mValues.iconState.minSdk = minSdk.intValue();
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewProjectWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewProjectWizard.java
index 84de9a4..d350a00 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewProjectWizard.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewProjectWizard.java
@@ -23,6 +23,7 @@ import com.android.annotations.VisibleForTesting;
import com.android.assetstudiolib.GraphicGenerator;
import com.android.ide.eclipse.adt.AdtPlugin;
import com.android.ide.eclipse.adt.AdtUtils;
+import com.android.ide.eclipse.adt.internal.actions.AddSupportJarAction;
import com.android.ide.eclipse.adt.internal.assetstudio.AssetType;
import com.android.ide.eclipse.adt.internal.assetstudio.ConfigureAssetSetPage;
import com.android.ide.eclipse.adt.internal.assetstudio.CreateAssetSetWizardState;
@@ -38,6 +39,7 @@ import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
@@ -74,6 +76,7 @@ public class NewProjectWizard extends TemplateWizard {
static final String CATEGORY_PROJECTS = "projects"; //$NON-NLS-1$
static final String CATEGORY_ACTIVITIES = "activities"; //$NON-NLS-1$
static final String CATEGORY_OTHER = "other"; //$NON-NLS-1$
+ static final String ATTR_APP_COMPAT = "appCompat"; //$NON-NLS-1$
/**
* Reserved file name for the launcher icon, resolves to the xhdpi version
*
@@ -266,6 +269,18 @@ public class NewProjectWizard extends TemplateWizard {
// Generate basic output skeleton
Map<String, Object> paramMap = new HashMap<String, Object>();
addProjectInfo(paramMap);
+ TemplateHandler.addDirectoryParameters(paramMap, getProject());
+ // We don't know at this point whether the activity is going to need
+ // AppCompat so we just assume that it will.
+ if (mValues.createActivity && mValues.minSdkLevel < 14) {
+ paramMap.put(ATTR_APP_COMPAT, true);
+ getFinalizingActions().add(new Runnable() {
+ @Override
+ public void run() {
+ AddSupportJarAction.installAppCompatLibrary(mProject, true);
+ }
+ });
+ }
return template.render(mProject, paramMap);
}
@@ -357,6 +372,11 @@ public class NewProjectWizard extends TemplateWizard {
AdtPlugin.log(e, null);
}
+ List<Runnable> finalizingTasks = getFinalizingActions();
+ for (Runnable r : finalizingTasks) {
+ r.run();
+ }
+
return true;
} catch (Exception ioe) {
AdtPlugin.log(ioe, null);
@@ -391,6 +411,7 @@ public class NewProjectWizard extends TemplateWizard {
// Ensure that activities created as part of a new project are marked as
// launcher activities
parameters.put(IS_LAUNCHER, true);
+ TemplateHandler.addDirectoryParameters(parameters, project);
TemplateHandler activityTemplate = activityValues.getTemplateHandler();
activityTemplate.setBackupMergedFiles(false);
@@ -411,6 +432,9 @@ public class NewProjectWizard extends TemplateWizard {
List<String> filesToOpen = activityTemplate.getFilesToOpen();
projectTemplate.getFilesToOpen().addAll(filesToOpen);
+
+ List<Runnable> finalizingActions = activityTemplate.getFinalizingActions();
+ projectTemplate.getFinalizingActions().addAll(finalizingActions);
}
private void addProjectInfo(Map<String, Object> parameters) {
@@ -423,4 +447,10 @@ public class NewProjectWizard extends TemplateWizard {
parameters.put(ATTR_COPY_ICONS, !mValues.createIcon);
parameters.putAll(mValues.parameters);
}
+
+ @Override
+ @NonNull
+ protected List<Runnable> getFinalizingActions() {
+ return mValues.template.getFinalizingActions();
+ }
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewTemplateWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewTemplateWizard.java
index 098beea..99814f7 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewTemplateWizard.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewTemplateWizard.java
@@ -28,6 +28,7 @@ import com.android.ide.eclipse.adt.AdtUtils;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
@@ -140,6 +141,13 @@ public class NewTemplateWizard extends TemplateWizard {
}
@Override
+ @NonNull
+ protected List<Runnable> getFinalizingActions() {
+ TemplateHandler activityTemplate = mValues.getTemplateHandler();
+ return activityTemplate.getFinalizingActions();
+ }
+
+ @Override
protected List<Change> computeChanges() {
return mValues.computeChanges();
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewTemplateWizardState.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewTemplateWizardState.java
index 805399b..2c97003 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewTemplateWizardState.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/NewTemplateWizardState.java
@@ -161,6 +161,8 @@ public class NewTemplateWizardState {
parameters.put(IS_LIBRARY_PROJECT,
projectState != null ? projectState.isLibrary() : false);
+ TemplateHandler.addDirectoryParameters(parameters, project);
+
List<Change> changes = getTemplateHandler().render(project, parameters);
if (mIconState != null) {
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateHandler.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateHandler.java
index a875712..8e11841 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateHandler.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateHandler.java
@@ -70,6 +70,7 @@ import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.ToolFactory;
import org.eclipse.jdt.core.formatter.CodeFormatter;
import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.ltk.core.refactoring.Change;
@@ -99,6 +100,7 @@ import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
+import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
@@ -124,9 +126,10 @@ class TemplateHandler {
* proper Booleans. Templates which rely on this should specify format >= 2.
* <li> 3: The wizard infrastructure passes the {@code isNewProject} boolean variable
* to indicate whether a wizard is created as part of a new blank project
+ * <li> 4: The templates now specify dependencies in the recipe file.
* </ul>
*/
- static final int CURRENT_FORMAT = 3;
+ static final int CURRENT_FORMAT = 4;
/**
* Special marker indicating that this path refers to the special shared
@@ -165,6 +168,8 @@ class TemplateHandler {
static final String TAG_THUMBS = "thumbs"; //$NON-NLS-1$
static final String TAG_DEPENDENCY = "dependency"; //$NON-NLS-1$
static final String TAG_ICONS = "icons"; //$NON-NLS-1$
+ static final String TAG_FORMFACTOR = "formfactor"; //$NON-NLS-1$
+ static final String TAG_CATEGORY = "category"; //$NON-NLS-1$
static final String ATTR_FORMAT = "format"; //$NON-NLS-1$
static final String ATTR_REVISION = "revision"; //$NON-NLS-1$
static final String ATTR_VALUE = "value"; //$NON-NLS-1$
@@ -187,11 +192,25 @@ class TemplateHandler {
static final String ATTR_SOURCE_TYPE = "source"; //$NON-NLS-1$
static final String ATTR_CLIPART_NAME = "clipartName";//$NON-NLS-1$
static final String ATTR_TEXT = "text"; //$NON-NLS-1$
+ static final String ATTR_SRC_DIR = "srcDir"; //$NON-NLS-1$
+ static final String ATTR_SRC_OUT = "srcOut"; //$NON-NLS-1$
+ static final String ATTR_RES_DIR = "resDir"; //$NON-NLS-1$
+ static final String ATTR_RES_OUT = "resOut"; //$NON-NLS-1$
+ static final String ATTR_MANIFEST_DIR = "manifestDir";//$NON-NLS-1$
+ static final String ATTR_MANIFEST_OUT = "manifestOut";//$NON-NLS-1$
+ static final String ATTR_PROJECT_DIR = "projectDir"; //$NON-NLS-1$
+ static final String ATTR_PROJECT_OUT = "projectOut"; //$NON-NLS-1$
+ static final String ATTR_MAVEN_URL = "mavenUrl"; //$NON-NLS-1$
+ static final String ATTR_DEBUG_KEYSTORE_SHA1 =
+ "debugKeystoreSha1"; //$NON-NLS-1$
static final String CATEGORY_ACTIVITIES = "activities";//$NON-NLS-1$
static final String CATEGORY_PROJECTS = "projects"; //$NON-NLS-1$
static final String CATEGORY_OTHER = "other"; //$NON-NLS-1$
+ static final String MAVEN_SUPPORT_V4 = "support-v4"; //$NON-NLS-1$
+ static final String MAVEN_SUPPORT_V13 = "support-v13"; //$NON-NLS-1$
+ static final String MAVEN_APPCOMPAT = "appcompat-v7"; //$NON-NLS-1$
/** Default padding to apply in wizards around the thumbnail preview images */
static final int PREVIEW_PADDING = 10;
@@ -205,6 +224,11 @@ class TemplateHandler {
*/
private final List<String> mOpen = Lists.newArrayList();
+ /**
+ * List of actions to perform after the wizard has finished.
+ */
+ protected List<Runnable> mFinalizingActions = Lists.newArrayList();
+
/** Path to the directory containing the templates */
@NonNull
private final File mRootPath;
@@ -237,7 +261,7 @@ class TemplateHandler {
*/
private TemplateMetadata mTemplate;
- private TemplateManager mManager;
+ private final TemplateManager mManager;
/** Creates a new {@link TemplateHandler} for the given root path */
static TemplateHandler createFromPath(File rootPath) {
@@ -339,6 +363,23 @@ class TemplateHandler {
return paramMap;
}
+ static void addDirectoryParameters(Map<String, Object> parameters, IProject project) {
+ IPath srcDir = project.getFile(SdkConstants.SRC_FOLDER).getProjectRelativePath();
+ parameters.put(ATTR_SRC_DIR, srcDir.toString());
+
+ IPath resDir = project.getFile(SdkConstants.RES_FOLDER).getProjectRelativePath();
+ parameters.put(ATTR_RES_DIR, resDir.toString());
+
+ IPath manifestDir = project.getProjectRelativePath();
+ parameters.put(ATTR_MANIFEST_DIR, manifestDir.toString());
+ parameters.put(ATTR_MANIFEST_OUT, manifestDir.toString());
+
+ parameters.put(ATTR_PROJECT_DIR, manifestDir.toString());
+ parameters.put(ATTR_PROJECT_OUT, manifestDir.toString());
+
+ parameters.put(ATTR_DEBUG_KEYSTORE_SHA1, "");
+ }
+
@Nullable
public TemplateMetadata getTemplate() {
if (mTemplate == null) {
@@ -353,7 +394,7 @@ class TemplateHandler {
return new File(mRootPath.getPath(), templateName).getPath();
}
- /**
+ /**
* Load a text resource for the given relative path within the template
*
* @param relativePath relative path within the template
@@ -431,7 +472,7 @@ class TemplateHandler {
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes)
- throws SAXException {
+ throws SAXException {
if (TAG_PARAMETER.equals(name)) {
String id = attributes.getValue(ATTR_ID);
if (!paramMap.containsKey(id)) {
@@ -448,8 +489,7 @@ class TemplateHandler {
} else if (TAG_GLOBAL.equals(name)) {
String id = attributes.getValue(ATTR_ID);
if (!paramMap.containsKey(id)) {
- String value = attributes.getValue(ATTR_VALUE);
- paramMap.put(id, value);
+ paramMap.put(id, TypedVariable.parseGlobal(attributes));
}
} else if (TAG_GLOBALS.equals(name)) {
// Handle evaluation of variables
@@ -477,9 +517,10 @@ class TemplateHandler {
}
}
}
- } else if (!name.equals("template") && !name.equals("category")
- && !name.equals("option") && !name.equals(TAG_THUMBS) &&
- !name.equals(TAG_THUMB) && !name.equals(TAG_ICONS)) {
+ } else if (!name.equals("template") && !name.equals(TAG_CATEGORY) &&
+ !name.equals(TAG_FORMFACTOR) && !name.equals("option") &&
+ !name.equals(TAG_THUMBS) && !name.equals(TAG_THUMB) &&
+ !name.equals(TAG_ICONS)) {
System.err.println("WARNING: Unknown template directive " + name);
}
}
@@ -499,27 +540,27 @@ class TemplateHandler {
String.format(
"%1$s already exists.\nWould you like to replace it?",
file.getPath()),
- MessageDialog.QUESTION, new String[] {
- // Yes will be moved to the end because it's the default
- "Yes", "No", "Cancel", "Yes to All"
- }, 0);
+ MessageDialog.QUESTION, new String[] {
+ // Yes will be moved to the end because it's the default
+ "Yes", "No", "Cancel", "Yes to All"
+ }, 0);
int result = dialog.open();
switch (result) {
- case 0:
- // Yes
- break;
- case 3:
- // Yes to all
- mYesToAll = true;
- break;
- case 1:
- // No
- return false;
- case SWT.DEFAULT:
- case 2:
- // Cancel
- mNoToAll = true;
- return false;
+ case 0:
+ // Yes
+ break;
+ case 3:
+ // Yes to all
+ mYesToAll = true;
+ break;
+ case 1:
+ // No
+ return false;
+ case SWT.DEFAULT:
+ case 2:
+ // Cancel
+ mNoToAll = true;
+ return false;
}
}
@@ -556,7 +597,7 @@ class TemplateHandler {
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes)
- throws SAXException {
+ throws SAXException {
if (mNoToAll) {
return;
}
@@ -592,6 +633,36 @@ class TemplateHandler {
if (relativePath != null && !relativePath.isEmpty()) {
mOpen.add(relativePath);
}
+ } else if (TAG_DEPENDENCY.equals(name)) {
+ String dependencyUrl = attributes.getValue(ATTR_MAVEN_URL);
+ File path;
+ if (dependencyUrl.contains(MAVEN_SUPPORT_V4)) {
+ // We assume the revision requirement has been satisfied
+ // by the wizard
+ path = AddSupportJarAction.getSupportJarFile();
+ } else if (dependencyUrl.contains(MAVEN_SUPPORT_V13)) {
+ path = AddSupportJarAction.getSupport13JarFile();
+ } else if (dependencyUrl.contains(MAVEN_APPCOMPAT)) {
+ path = null;
+ mFinalizingActions.add(new Runnable() {
+ @Override
+ public void run() {
+ AddSupportJarAction.installAppCompatLibrary(mProject, true);
+ }
+ });
+ } else {
+ path = null;
+ System.err.println("WARNING: Unknown dependency type");
+ }
+
+ if (path != null) {
+ IPath to = getTargetPath(FD_NATIVE_LIBS +'/' + path.getName());
+ try {
+ copy(path, to);
+ } catch (IOException ioe) {
+ AdtPlugin.log(ioe, null);
+ }
+ }
} else if (!name.equals("recipe") && !name.equals(TAG_DEPENDENCY)) { //$NON-NLS-1$
System.err.println("WARNING: Unknown template directive " + name);
}
@@ -1002,6 +1073,16 @@ class TemplateHandler {
return mOpen;
}
+ /**
+ * Returns the list of actions to perform when the template has been created
+ *
+ * @return the list of actions to perform
+ */
+ @NonNull
+ public List<Runnable> getFinalizingActions() {
+ return mFinalizingActions;
+ }
+
/** Copy a template resource */
private final void copyTemplateResource(
@NonNull String relativeFrom,
@@ -1034,7 +1115,7 @@ class TemplateHandler {
IResource dest = mProject.getFile(path);
if (dest.exists() && !(dest instanceof IFile)) {// Don't attempt to overwrite a folder
assert false : dest.getClass().getName();
- return;
+ return;
}
IFile file = (IFile) dest;
String targetName = path.lastSegment();
@@ -1134,9 +1215,9 @@ class TemplateHandler {
Constants.BUNDLE_VERSION);
Version version = new Version(versionString);
return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
- String.format("This template requires a more recent version of the " +
- "Android Eclipse plugin. Please update from version %1$d.%2$d.%3$d.",
- version.getMajor(), version.getMinor(), version.getMicro()));
+ String.format("This template requires a more recent version of the " +
+ "Android Eclipse plugin. Please update from version %1$d.%2$d.%3$d.",
+ version.getMajor(), version.getMinor(), version.getMicro()));
}
int templateMinSdk = template.getMinSdk();
if (templateMinSdk > currentMinSdk && currentMinSdk >= 1) {
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateManager.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateManager.java
index de625e0..30dd09e 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateManager.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateManager.java
@@ -28,6 +28,7 @@ import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs;
import com.google.common.base.Charsets;
import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
import com.google.common.io.Files;
import org.w3c.dom.Document;
@@ -39,9 +40,13 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
+import java.util.Set;
/** Handles locating templates and providing template metadata */
public class TemplateManager {
+ private static final Set<String> EXCLUDED_CATEGORIES = Sets.newHashSet("Folder", "Google");
+ private static final Set<String> EXCLUDED_FORMFACTORS = Sets.newHashSet("Wear", "TV");
+
TemplateManager() {
}
@@ -239,6 +244,10 @@ public class TemplateManager {
Document doc = DomUtilities.parseDocument(xml, true);
if (doc != null && doc.getDocumentElement() != null) {
TemplateMetadata metadata = new TemplateMetadata(doc);
+ if (EXCLUDED_CATEGORIES.contains(metadata.getCategory()) ||
+ EXCLUDED_FORMFACTORS.contains(metadata.getFormFactor())) {
+ return null;
+ }
mTemplateMap.put(templateDir, metadata);
return metadata;
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateMetadata.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateMetadata.java
index cb184b8..4ce7d74 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateMetadata.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateMetadata.java
@@ -30,11 +30,14 @@ import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHan
import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_TEXT;
import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_TRIM;
import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_TYPE;
+import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.ATTR_VALUE;
import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.CURRENT_FORMAT;
import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.TAG_DEPENDENCY;
import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.TAG_ICONS;
import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.TAG_PARAMETER;
import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.TAG_THUMB;
+import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.TAG_FORMFACTOR;
+import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.TAG_CATEGORY;
import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
@@ -46,6 +49,7 @@ import com.android.ide.eclipse.adt.internal.assetstudio.CreateAssetSetWizardStat
import com.android.ide.eclipse.adt.internal.editors.IconFactory;
import com.android.ide.eclipse.adt.internal.editors.layout.gle2.ImageUtils;
import com.android.utils.Pair;
+import com.google.common.collect.Lists;
import org.eclipse.core.resources.IProject;
import org.eclipse.swt.graphics.Image;
@@ -64,8 +68,6 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
-import lombok.ast.libs.org.parboiled.google.collect.Lists;
-
/** An ADT template along with metadata */
class TemplateMetadata {
private final Document mDocument;
@@ -77,6 +79,8 @@ class TemplateMetadata {
private Integer mRevision;
private boolean mNoIcons;
private CreateAssetSetWizardState mIconState;
+ private String mFormFactor;
+ private String mCategory;
TemplateMetadata(@NonNull Document document) {
mDocument = document;
@@ -181,6 +185,37 @@ class TemplateMetadata {
return mRevision.intValue();
}
+
+ public String getFormFactor() {
+ if (mFormFactor == null) {
+ mFormFactor = "Mobile";
+
+ NodeList formfactorDeclarations = mDocument.getElementsByTagName(TAG_FORMFACTOR);
+ if (formfactorDeclarations.getLength() > 0) {
+ Element element = (Element) formfactorDeclarations.item(0);
+ String formFactor = element.getAttribute(ATTR_VALUE);
+ if (formFactor != null && !formFactor.isEmpty()) {
+ mFormFactor = formFactor;
+ }
+ }
+ }
+ return mFormFactor;
+ }
+
+ public String getCategory() {
+ if (mCategory == null) {
+ mCategory = "";
+ NodeList categories = mDocument.getElementsByTagName(TAG_CATEGORY);
+ if (categories.getLength() > 0) {
+ Element element = (Element) categories.item(0);
+ String category = element.getAttribute(ATTR_VALUE);
+ if (category != null && !category.isEmpty()) {
+ mCategory = category;
+ }
+ }
+ }
+ return mCategory;
+ }
/**
* Returns a suitable icon wizard state instance if this wizard requests
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateWizard.java
index 5f743bb3..7ca32f9 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateWizard.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TemplateWizard.java
@@ -22,6 +22,7 @@ import com.android.ide.eclipse.adt.AdtPlugin;
import com.android.ide.eclipse.adt.internal.assetstudio.ConfigureAssetSetPage;
import com.android.ide.eclipse.adt.internal.assetstudio.CreateAssetSetWizardState;
import com.android.ide.eclipse.adt.internal.editors.IconFactory;
+import com.google.common.collect.Lists;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
@@ -35,13 +36,17 @@ import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.CompositeChange;
+import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.actions.WorkspaceModifyOperation;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
+import javax.swing.SwingUtilities;
+
abstract class TemplateWizard extends Wizard implements INewWizard {
private static final String PROJECT_LOGO_LARGE = "android-64"; //$NON-NLS-1$
protected IWorkbench mWorkbench;
@@ -144,6 +149,15 @@ abstract class TemplateWizard extends Wizard implements INewWizard {
protected abstract List<String> getFilesToOpen();
/**
+ * Returns the list of files to open, which might be empty. This method will
+ * only be called <b>after</b> {@link #computeChanges()} has been called.
+ *
+ * @return a list of files to open
+ */
+ @NonNull
+ protected abstract List<Runnable> getFinalizingActions();
+
+ /**
* Computes the changes to the {@link #getProject()} this template should
* perform
*
@@ -173,7 +187,6 @@ abstract class TemplateWizard extends Wizard implements INewWizard {
} catch (CoreException e) {
AdtPlugin.log(e, null);
}
-
return true;
}
@@ -184,11 +197,12 @@ abstract class TemplateWizard extends Wizard implements INewWizard {
getContainer().run(true, false, new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor) throws InvocationTargetException,
- InterruptedException {
+ InterruptedException {
boolean ok = performFinish(monitor);
success.set(ok);
}
});
+
} catch (InvocationTargetException e) {
AdtPlugin.log(e, null);
return false;
@@ -200,7 +214,6 @@ abstract class TemplateWizard extends Wizard implements INewWizard {
if (success.get()) {
// Open the primary file/files
NewTemplateWizard.openFiles(getProject(), getFilesToOpen(), mWorkbench);
-
return true;
} else {
return false;
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TypedVariable.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TypedVariable.java
new file mode 100644
index 0000000..468a10c
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/TypedVariable.java
@@ -0,0 +1,50 @@
+package com.android.ide.eclipse.adt.internal.wizards.templates;
+
+import java.util.Locale;
+
+import org.xml.sax.Attributes;
+
+public class TypedVariable {
+ public enum Type {
+ STRING,
+ BOOLEAN,
+ INTEGER;
+
+ public static Type get(String name) {
+ if (name == null) {
+ return STRING;
+ }
+ try {
+ return valueOf(name.toUpperCase(Locale.US));
+ } catch (IllegalArgumentException e) {
+ System.err.println("Unexpected global type '" + name + "'");
+ System.err.println("Expected one of :");
+ for (Type s : Type.values()) {
+ System.err.println(" " + s.name().toLowerCase(Locale.US));
+ }
+ }
+
+ return STRING;
+ }
+ }
+
+ public static Object parseGlobal(Attributes attributes) {
+ String value = attributes.getValue(TemplateHandler.ATTR_VALUE);
+ Type type = Type.get(attributes.getValue(TemplateHandler.ATTR_TYPE));
+
+ switch (type) {
+ case STRING:
+ return value;
+ case BOOLEAN:
+ return Boolean.parseBoolean(value);
+ case INTEGER:
+ try {
+ return Integer.parseInt(value);
+ } catch (NumberFormatException e) {
+ return value;
+ }
+ }
+
+ return value;
+ }
+}