diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt')
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 -Xms128m -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; + } +} |