diff options
author | Xavier Ducrohet <xav@google.com> | 2013-12-03 23:20:10 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2013-12-03 23:20:10 +0000 |
commit | e2bee4d96ec7a492037e345fcc2c256eaa17efeb (patch) | |
tree | b18419b0c00c29ed4fc5ef22b5e54fd0b14e0afc /gradle | |
parent | 95740365fec6948f6110218bc35dbd57ef97de60 (diff) | |
parent | 2cae6225fe7c618afd5efc6bff9efd69d0e9a724 (diff) | |
download | build-e2bee4d96ec7a492037e345fcc2c256eaa17efeb.tar.gz |
Merge "Extensible model with extra artifacts per variants."
Diffstat (limited to 'gradle')
31 files changed, 1054 insertions, 258 deletions
diff --git a/gradle/src/build-test/groovy/com/android/build/gradle/ManualBuildTest.java b/gradle/src/build-test/groovy/com/android/build/gradle/ManualBuildTest.java index 423107a..6512f0d 100644 --- a/gradle/src/build-test/groovy/com/android/build/gradle/ManualBuildTest.java +++ b/gradle/src/build-test/groovy/com/android/build/gradle/ManualBuildTest.java @@ -32,23 +32,55 @@ import java.io.IOException; */ public class ManualBuildTest extends BuildTest { + private final static int RED = 0xFFFF0000; + private final static int GREEN = 0xFF00FF00; + private final static int BLUE = 0xFF0000FF; + public void testOverlay1Content() throws Exception { File project = buildProject("overlay1", BasePlugin.GRADLE_MIN_VERSION); File drawableOutput = new File(project, "build/res/all/debug/drawable"); - checkImageColor(drawableOutput, "no_overlay.png", (int) 0xFF00FF00); - checkImageColor(drawableOutput, "type_overlay.png", (int) 0xFF00FF00); + checkImageColor(drawableOutput, "no_overlay.png", GREEN); + checkImageColor(drawableOutput, "type_overlay.png", GREEN); } public void testOverlay2Content() throws Exception { File project = buildProject("overlay2", BasePlugin.GRADLE_MIN_VERSION); File drawableOutput = new File(project, "build/res/all/one/debug/drawable"); - checkImageColor(drawableOutput, "no_overlay.png", (int) 0xFF00FF00); - checkImageColor(drawableOutput, "type_overlay.png", (int) 0xFF00FF00); - checkImageColor(drawableOutput, "flavor_overlay.png", (int) 0xFF00FF00); - checkImageColor(drawableOutput, "type_flavor_overlay.png", (int) 0xFF00FF00); + checkImageColor(drawableOutput, "no_overlay.png", GREEN); + checkImageColor(drawableOutput, "type_overlay.png", GREEN); + checkImageColor(drawableOutput, "flavor_overlay.png", GREEN); + checkImageColor(drawableOutput, "type_flavor_overlay.png", GREEN); + checkImageColor(drawableOutput, "variant_type_flavor_overlay.png", GREEN); + } + + public void testOverlay3Content() throws Exception { + File project = buildProject("overlay3", BasePlugin.GRADLE_MIN_VERSION); + File drawableOutput = new File(project, "build/res/all/freebeta/debug/drawable"); + + checkImageColor(drawableOutput, "no_overlay.png", GREEN); + checkImageColor(drawableOutput, "debug_overlay.png", GREEN); + checkImageColor(drawableOutput, "beta_overlay.png", GREEN); + checkImageColor(drawableOutput, "free_beta_debug_overlay.png", GREEN); + checkImageColor(drawableOutput, "free_normal_overlay.png", RED); + + drawableOutput = new File(project, "build/res/all/freenormal/debug/drawable"); + + checkImageColor(drawableOutput, "no_overlay.png", GREEN); + checkImageColor(drawableOutput, "debug_overlay.png", GREEN); + checkImageColor(drawableOutput, "beta_overlay.png", RED); + checkImageColor(drawableOutput, "free_beta_debug_overlay.png", RED); + checkImageColor(drawableOutput, "free_normal_overlay.png", GREEN); + + drawableOutput = new File(project, "build/res/all/paidbeta/debug/drawable"); + + checkImageColor(drawableOutput, "no_overlay.png", GREEN); + checkImageColor(drawableOutput, "debug_overlay.png", GREEN); + checkImageColor(drawableOutput, "beta_overlay.png", GREEN); + checkImageColor(drawableOutput, "free_beta_debug_overlay.png", RED); + checkImageColor(drawableOutput, "free_normal_overlay.png", RED); } public void testRepo() { diff --git a/gradle/src/main/groovy/com/android/build/gradle/AppPlugin.groovy b/gradle/src/main/groovy/com/android/build/gradle/AppPlugin.groovy index 33db4c3..0cc4e35 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/AppPlugin.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/AppPlugin.groovy @@ -20,7 +20,6 @@ import com.android.annotations.Nullable import com.android.build.gradle.api.BaseVariant import com.android.build.gradle.internal.BuildTypeData import com.android.build.gradle.internal.ConfigurationProvider -import com.android.build.gradle.internal.ConfigurationProviderImpl import com.android.build.gradle.internal.ProductFlavorData import com.android.build.gradle.internal.api.ApplicationVariantImpl import com.android.build.gradle.internal.api.DefaultAndroidSourceSet @@ -451,9 +450,17 @@ class AppPlugin extends com.android.build.gradle.BasePlugin implements Plugin<Pr // create the variant and get its internal storage object. ApplicationVariantData appVariantData = new ApplicationVariantData(variantConfig) - DefaultAndroidSourceSet sourceSet = (DefaultAndroidSourceSet) extension.sourceSetsContainer.maybeCreate(variantConfig.fullName) - variantConfig.setVariantSourceProvider(sourceSet) - variantProviders.add(new ConfigurationProviderImpl(project, sourceSet)) + DefaultAndroidSourceSet variantSourceSet = (DefaultAndroidSourceSet) extension.sourceSetsContainer.maybeCreate(variantConfig.fullName) + variantConfig.setVariantSourceProvider(variantSourceSet) + // TODO: hmm this won't work + //variantProviders.add(new ConfigurationProviderImpl(project, variantSourceSet)) + + if (flavorDataList.size() > 1) { + DefaultAndroidSourceSet multiFlavorSourceSet = (DefaultAndroidSourceSet) extension.sourceSetsContainer.maybeCreate(variantConfig.flavorName) + variantConfig.setMultiFlavorSourceProvider(multiFlavorSourceSet) + // TODO: hmm this won't work + //variantProviders.add(new ConfigurationProviderImpl(project, multiFlavorSourceSet)) + } VariantDependencies variantDep = VariantDependencies.compute( project, appVariantData.variantConfiguration.fullName, diff --git a/gradle/src/main/groovy/com/android/build/gradle/BaseExtension.groovy b/gradle/src/main/groovy/com/android/build/gradle/BaseExtension.groovy index 889a70a..974fe16 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/BaseExtension.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/BaseExtension.groovy @@ -17,9 +17,12 @@ package com.android.build.gradle import com.android.SdkConstants import com.android.annotations.NonNull +import com.android.annotations.Nullable import com.android.build.gradle.api.AndroidSourceSet +import com.android.build.gradle.api.BaseVariant import com.android.build.gradle.api.TestVariant import com.android.build.gradle.internal.CompileOptions +import com.android.build.gradle.internal.SourceSetSourceProviderWrapper import com.android.build.gradle.internal.dsl.AaptOptionsImpl import com.android.build.gradle.internal.dsl.AndroidSourceSetFactory import com.android.build.gradle.internal.dsl.DexOptionsImpl @@ -27,6 +30,9 @@ import com.android.build.gradle.internal.dsl.ProductFlavorDsl import com.android.build.gradle.internal.test.TestOptions import com.android.builder.BuilderConstants import com.android.builder.DefaultProductFlavor +import com.android.builder.model.BuildType +import com.android.builder.model.ProductFlavor +import com.android.builder.model.SourceProvider import com.android.builder.testing.api.DeviceProvider import com.android.builder.testing.api.TestServer import com.android.sdklib.repository.FullRevision @@ -38,8 +44,8 @@ import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.ConfigurationContainer import org.gradle.api.internal.DefaultDomainObjectSet import org.gradle.api.internal.project.ProjectInternal +import org.gradle.api.tasks.SourceSet import org.gradle.internal.reflect.Instantiator - /** * Base android extension for all android plugins. */ @@ -201,6 +207,49 @@ public abstract class BaseExtension { testVariantList.add(testVariant) } + public void registerArtifactType(@NonNull String name, + boolean isTest, + int artifactType) { + plugin.registerArtifactType(name, isTest, artifactType) + } + + public void registerBuildTypeSourceProvider( + @NonNull String name, + @NonNull BuildType buildType, + @NonNull SourceProvider sourceProvider) { + plugin.registerBuildTypeSourceProvider(name, buildType, sourceProvider) + } + + public void registerProductFlavorSourceProvider( + @NonNull String name, + @NonNull ProductFlavor productFlavor, + @NonNull SourceProvider sourceProvider) { + plugin.registerProductFlavorSourceProvider(name, productFlavor, sourceProvider) + } + + public void registerJavaArtifact( + @NonNull String name, + @NonNull BaseVariant variant, + @NonNull String assembleTaskName, + @NonNull String javaCompileTaskName, + @NonNull File classesFolder, + @Nullable SourceProvider sourceProvider) { + plugin.registerJavaArtifact(name, variant, assembleTaskName, javaCompileTaskName, + classesFolder, sourceProvider) + } + + public void registerMultiFlavorSourceProvider( + @NonNull String name, + @NonNull String flavorName, + @NonNull SourceProvider sourceProvider) { + plugin.registerMultiFlavorSourceProvider(name, flavorName, sourceProvider) + } + + @NonNull + public SourceProvider wrapJavaSourceSet(@NonNull SourceSet sourceSet) { + return new SourceSetSourceProviderWrapper(sourceSet) + } + public String getCompileSdkVersion() { return target } diff --git a/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy b/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy index b407228..29bf0a2 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/BasePlugin.groovy @@ -18,6 +18,7 @@ package com.android.build.gradle import com.android.annotations.NonNull import com.android.annotations.Nullable import com.android.build.gradle.api.AndroidSourceSet +import com.android.build.gradle.api.BaseVariant import com.android.build.gradle.internal.BadPluginException import com.android.build.gradle.internal.LoggerWrapper import com.android.build.gradle.internal.ProductFlavorData @@ -29,6 +30,8 @@ import com.android.build.gradle.internal.dependency.ManifestDependencyImpl import com.android.build.gradle.internal.dependency.SymbolFileProviderImpl import com.android.build.gradle.internal.dependency.VariantDependencies import com.android.build.gradle.internal.dsl.SigningConfigDsl +import com.android.build.gradle.internal.model.ArtifactMetaDataImpl +import com.android.build.gradle.internal.model.JavaArtifactImpl import com.android.build.gradle.internal.model.ModelBuilder import com.android.build.gradle.internal.tasks.AndroidReportTask import com.android.build.gradle.internal.tasks.DependencyReportTask @@ -46,6 +49,7 @@ import com.android.build.gradle.internal.test.report.ReportType import com.android.build.gradle.internal.variant.ApkVariantData import com.android.build.gradle.internal.variant.ApplicationVariantData import com.android.build.gradle.internal.variant.BaseVariantData +import com.android.build.gradle.internal.variant.DefaultSourceProviderContainer import com.android.build.gradle.internal.variant.LibraryVariantData import com.android.build.gradle.internal.variant.TestVariantData import com.android.build.gradle.internal.variant.TestedVariantData @@ -69,15 +73,21 @@ import com.android.builder.SdkParser import com.android.builder.VariantConfiguration import com.android.builder.dependency.JarDependency import com.android.builder.dependency.LibraryDependency +import com.android.builder.model.AndroidArtifact import com.android.builder.model.AndroidProject +import com.android.builder.model.ArtifactMetaData +import com.android.builder.model.BuildType +import com.android.builder.model.JavaArtifact import com.android.builder.model.ProductFlavor import com.android.builder.model.SigningConfig import com.android.builder.model.SourceProvider +import com.android.builder.model.SourceProviderContainer import com.android.builder.testing.ConnectedDeviceProvider import com.android.builder.testing.api.DeviceProvider import com.android.builder.testing.api.TestServer import com.android.utils.ILogger import com.google.common.collect.ArrayListMultimap +import com.google.common.collect.ListMultimap import com.google.common.collect.Lists import com.google.common.collect.Maps import com.google.common.collect.Multimap @@ -668,7 +678,7 @@ public abstract class BasePlugin { ((AndroidSourceSet) variantConfiguration.buildTypeSourceSet).resources) } if (variantConfiguration.hasFlavors()) { - for (SourceProvider flavorSourceSet : variantConfiguration.flavorSourceSets) { + for (SourceProvider flavorSourceSet : variantConfiguration.flavorSourceProviders) { processResources.from(((AndroidSourceSet) flavorSourceSet).resources) } } @@ -723,8 +733,8 @@ public abstract class BasePlugin { sourceList.add(((AndroidSourceSet) config.buildTypeSourceSet).java) } if (config.hasFlavors()) { - for (SourceProvider flavorSourceSet : config.flavorSourceSets) { - sourceList.add(((AndroidSourceSet) flavorSourceSet).java) + for (SourceProvider flavorSourceProvider : config.flavorSourceProviders) { + sourceList.add(((AndroidSourceSet) flavorSourceProvider).java) } } compileTask.source = sourceList.toArray() @@ -892,7 +902,7 @@ public abstract class BasePlugin { for (int i = 0 ; i < count ; i++) { final BaseVariantData baseVariantData = variantDataList.get(i) String variantName = baseVariantData.variantConfiguration.fullName - Task lintCheck = project.tasks.create("lint" + variantName, Lint) + Lint lintCheck = project.tasks.create("lint" + variantName, Lint) lintCheck.dependsOn baseVariantData.javaCompileTask, lintCompile lint.dependsOn lintCheck lintCheck.setPlugin(this) @@ -900,11 +910,11 @@ public abstract class BasePlugin { String outputName = "$project.buildDir/lint/" + variantName VariantConfiguration config = baseVariantData.variantConfiguration List<LibraryDependency> depList = config.getAllLibraries() - List<Set<File>> javaSource = Lists.newArrayList() - List<Set<File>> resourceSource = Lists.newArrayList() + List<Collection<File>> javaSource = Lists.newArrayList() + List<Collection<File>> resourceSource = Lists.newArrayList() // set the java and res source of this variant's flavors - Iterator<SourceProvider> flavorSources = config.flavorSourceSets.iterator() + Iterator<SourceProvider> flavorSources = config.flavorSourceProviders.iterator() SourceProvider source while (flavorSources.hasNext()) { source = flavorSources.next() @@ -916,8 +926,15 @@ public abstract class BasePlugin { if (config.getType() != VariantConfiguration.Type.TEST) { javaSource.add(config.buildTypeSourceSet.javaDirectories) } - if (config.variantSourceProvider != null) { - javaSource.add(config.variantSourceProvider.javaDirectories) + SourceProvider sourceProvider = config.variantSourceProvider + if (sourceProvider != null) { + javaSource.add(sourceProvider.javaDirectories) + resourceSource.add(sourceProvider.resDirectories) + } + sourceProvider = config.multiFlavorSourceProvider + if (sourceProvider != null) { + javaSource.add(sourceProvider.javaDirectories) + resourceSource.add(sourceProvider.resDirectories) } resourceSource.add(config.defaultSourceSet.resDirectories) @@ -1566,6 +1583,112 @@ public abstract class BasePlugin { "generate${variantData.variantConfiguration.fullName.capitalize()}Sources") } + + private final Map<String, ArtifactMetaData> extraArtifactMap = Maps.newHashMap() + private final ListMultimap<String, AndroidArtifact> extraAndroidArtifacts = ArrayListMultimap.create() + private final ListMultimap<String, JavaArtifact> extraJavaArtifacts = ArrayListMultimap.create() + private final ListMultimap<String, SourceProviderContainer> extraVariantSourceProviders = ArrayListMultimap.create() + private final ListMultimap<String, SourceProviderContainer> extraBuildTypeSourceProviders = ArrayListMultimap.create() + private final ListMultimap<String, SourceProviderContainer> extraProductFlavorSourceProviders = ArrayListMultimap.create() + private final ListMultimap<String, SourceProviderContainer> extraMultiFlavorSourceProviders = ArrayListMultimap.create() + + + public Collection<ArtifactMetaData> getExtraArtifacts() { + return extraArtifactMap.values() + } + + public Collection<AndroidArtifact> getExtraAndroidArtifacts(@NonNull String variantName) { + return extraAndroidArtifacts.get(variantName) + } + + public Collection<JavaArtifact> getExtraJavaArtifacts(@NonNull String variantName) { + return extraJavaArtifacts.get(variantName) + } + + public Collection<SourceProviderContainer> getExtraVariantSourceProviders(@NonNull String variantName) { + return extraVariantSourceProviders.get(variantName) + } + + public Collection<SourceProviderContainer> getExtraFlavorSourceProviders(@NonNull String flavorName) { + return extraProductFlavorSourceProviders.get(flavorName) + } + + public Collection<SourceProviderContainer> getExtraBuildTypeSourceProviders(@NonNull String buildTypeName) { + return extraBuildTypeSourceProviders.get(buildTypeName) + } + + public void registerArtifactType(@NonNull String name, + boolean isTest, + int artifactType) { + + if (extraArtifactMap.get(name) != null) { + throw new IllegalArgumentException("Artifact with name $name already registered.") + } + + extraArtifactMap.put(name, new ArtifactMetaDataImpl(name, isTest, artifactType)) + } + + public void registerBuildTypeSourceProvider(@NonNull String name, + @NonNull BuildType buildType, + @NonNull SourceProvider sourceProvider) { + if (extraArtifactMap.get(name) == null) { + throw new IllegalArgumentException( + "Artifact with name $name is not yet registered. Use registerArtifactType()") + } + + extraBuildTypeSourceProviders.put(buildType.name, + new DefaultSourceProviderContainer(name, sourceProvider)) + + } + + public void registerProductFlavorSourceProvider(@NonNull String name, + @NonNull ProductFlavor productFlavor, + @NonNull SourceProvider sourceProvider) { + if (extraArtifactMap.get(name) == null) { + throw new IllegalArgumentException( + "Artifact with name $name is not yet registered. Use registerArtifactType()") + } + + extraProductFlavorSourceProviders.put(productFlavor.name, + new DefaultSourceProviderContainer(name, sourceProvider)) + + } + + public void registerMultiFlavorSourceProvider(@NonNull String name, + @NonNull String flavorName, + @NonNull SourceProvider sourceProvider) { + if (extraArtifactMap.get(name) == null) { + throw new IllegalArgumentException( + "Artifact with name $name is not yet registered. Use registerArtifactType()") + } + + extraMultiFlavorSourceProviders.put(flavorName, + new DefaultSourceProviderContainer(name, sourceProvider)) + } + + public void registerJavaArtifact( + @NonNull String name, + @NonNull BaseVariant variant, + @NonNull String assembleTaskName, + @NonNull String javaCompileTaskName, + @NonNull File classesFolder, + @Nullable SourceProvider sourceProvider) { + ArtifactMetaData artifactMetaData = extraArtifactMap.get(name) + if (artifactMetaData == null) { + throw new IllegalArgumentException( + "Artifact with name $name is not yet registered. Use registerArtifactType()") + } + if (artifactMetaData.type != ArtifactMetaData.TYPE_JAVA) { + throw new IllegalArgumentException( + "Artifact with name $name is not of type JAVA") + } + + JavaArtifact artifact = new JavaArtifactImpl( + name, assembleTaskName, javaCompileTaskName, classesFolder, + null, sourceProvider, null) + extraJavaArtifacts.put(variant.name, artifact) + } + //---------------------------------------------------------------------------------------------- //------------------------------ START DEPENDENCY STUFF ---------------------------------------- //---------------------------------------------------------------------------------------------- @@ -1857,18 +1980,22 @@ public abstract class BasePlugin { } private static String getLocalVersion() { - Class clazz = BasePlugin.class - String className = clazz.getSimpleName() + ".class" - String classPath = clazz.getResource(className).toString() - if (!classPath.startsWith("jar")) { - // Class not from JAR, unlikely - return null - } - String manifestPath = classPath.substring(0, classPath.lastIndexOf("!") + 1) + - "/META-INF/MANIFEST.MF"; - Manifest manifest = new Manifest(new URL(manifestPath).openStream()); - Attributes attr = manifest.getMainAttributes(); - return attr.getValue("Plugin-Version"); + try { + Class clazz = BasePlugin.class + String className = clazz.getSimpleName() + ".class" + String classPath = clazz.getResource(className).toString() + if (!classPath.startsWith("jar")) { + // Class not from JAR, unlikely + return null + } + String manifestPath = classPath.substring(0, classPath.lastIndexOf("!") + 1) + + "/META-INF/MANIFEST.MF"; + Manifest manifest = new Manifest(new URL(manifestPath).openStream()); + Attributes attr = manifest.getMainAttributes(); + return attr.getValue("Plugin-Version"); + } catch (Throwable t) { + return null; + } } public Project getProject() { diff --git a/gradle/src/main/groovy/com/android/build/gradle/api/BaseVariant.java b/gradle/src/main/groovy/com/android/build/gradle/api/BaseVariant.java index 297121d..4357456 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/api/BaseVariant.java +++ b/gradle/src/main/groovy/com/android/build/gradle/api/BaseVariant.java @@ -71,6 +71,14 @@ public interface BaseVariant { String getBaseName(); /** + * Returns the flavor name of the variant. This is a concatenation of all the + * applied flavors + * @return the name of the flavors, or an empty string if there is not flavors. + */ + @NonNull + String getFlavorName(); + + /** * Returns the {@link com.android.builder.DefaultBuildType} for this build variant. */ @NonNull diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/AndroidAsciiReportRenderer.java b/gradle/src/main/groovy/com/android/build/gradle/internal/AndroidAsciiReportRenderer.java index 25ea1ca..6704129 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/AndroidAsciiReportRenderer.java +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/AndroidAsciiReportRenderer.java @@ -31,6 +31,7 @@ import org.gradle.logging.StyledTextOutput; import org.gradle.util.GUtil; import java.io.IOException; +import java.util.Collection; import java.util.List; import static org.gradle.logging.StyledTextOutput.Style.Description; @@ -132,15 +133,16 @@ public class AndroidAsciiReportRenderer extends TextReportRenderer { } private void renderChildren(@NonNull List<LibraryDependency> libraries, - @Nullable List<JarDependency> localJars) { + @Nullable Collection<JarDependency> localJars) { renderer.startChildren(); if (localJars != null) { final boolean emptyChildren = libraries.isEmpty(); final int count = localJars.size(); - for (int i = 0; i < count; i++) { - JarDependency jarDependency = localJars.get(i); + int i = 0; + for (JarDependency jarDependency : localJars) { render(jarDependency, emptyChildren && i == count - 1); + i++; } } diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/SourceSetSourceProviderWrapper.java b/gradle/src/main/groovy/com/android/build/gradle/internal/SourceSetSourceProviderWrapper.java new file mode 100644 index 0000000..0cc3f7c --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/SourceSetSourceProviderWrapper.java @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.build.gradle.internal; + +import com.android.annotations.NonNull; +import com.android.builder.model.SourceProvider; +import org.gradle.api.tasks.SourceSet; + +import java.io.File; +import java.util.Collection; +import java.util.Collections; + +/** + * An implementation of SourceProvider that's wrapper around a Java SourceSet. + * This is useful for the case where we store SourceProviders but don't want to + * query the content of the SourceSet at the moment the SourceProvider is created. + */ +public class SourceSetSourceProviderWrapper implements SourceProvider { + + @NonNull + private final SourceSet sourceSet; + + public SourceSetSourceProviderWrapper(@NonNull SourceSet sourceSet) { + + this.sourceSet = sourceSet; + } + + @NonNull + @Override + public File getManifestFile() { + throw new IllegalAccessError("Shouldn't access manifest from SourceSetSourceProviderWrapper"); + } + + @NonNull + @Override + public Collection<File> getJavaDirectories() { + return sourceSet.getAllJava().getSrcDirs(); + } + + @NonNull + @Override + public Collection<File> getResourcesDirectories() { + return sourceSet.getResources().getSrcDirs(); + } + + @NonNull + @Override + public Collection<File> getAidlDirectories() { + return Collections.emptyList(); + } + + @NonNull + @Override + public Collection<File> getRenderscriptDirectories() { + return Collections.emptyList(); + } + + @NonNull + @Override + public Collection<File> getJniDirectories() { + return Collections.emptyList(); + } + + @NonNull + @Override + public Collection<File> getResDirectories() { + return Collections.emptyList(); + } + + @NonNull + @Override + public Collection<File> getAssetsDirectories() { + return Collections.emptyList(); + } +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/api/BaseVariantImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/api/BaseVariantImpl.java index 1e99d91..894fe8a 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/api/BaseVariantImpl.java +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/api/BaseVariantImpl.java @@ -64,6 +64,12 @@ abstract class BaseVariantImpl implements BaseVariant { return getVariantData().getVariantConfiguration().getBaseName(); } + @NonNull + @Override + public String getFlavorName() { + return getVariantData().getVariantConfiguration().getFlavorName(); + } + @Override @NonNull public DefaultBuildType getBuildType() { diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/AaptOptionsImpl.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/AaptOptionsImpl.groovy index 449a43f..d50371e 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/AaptOptionsImpl.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/AaptOptionsImpl.groovy @@ -45,7 +45,7 @@ public class AaptOptionsImpl implements AaptOptions { } @Override - List<String> getNoCompress() { + Collection<String> getNoCompress() { return noCompressList } diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/BuildTypeDsl.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/BuildTypeDsl.groovy index a4770b6..6b51bc4 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/BuildTypeDsl.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/BuildTypeDsl.groovy @@ -21,7 +21,7 @@ import com.android.annotations.VisibleForTesting import com.android.builder.AndroidBuilder import com.android.builder.BuilderConstants import com.android.builder.DefaultBuildType -import com.android.builder.NdkConfig +import com.android.builder.model.NdkConfig import com.android.builder.model.SigningConfig import org.gradle.api.Action import org.gradle.api.internal.file.FileResolver diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/NdkConfigDsl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/NdkConfigDsl.java index 64f704a..87b6dcd 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/NdkConfigDsl.java +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/NdkConfigDsl.java @@ -18,7 +18,7 @@ package com.android.build.gradle.internal.dsl; import com.android.annotations.NonNull; import com.android.annotations.Nullable; -import com.android.builder.NdkConfig; +import com.android.builder.model.NdkConfig; import com.google.common.collect.Sets; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.Optional; diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/ProductFlavorDsl.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/ProductFlavorDsl.groovy index 1645a03..cda61b0 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/ProductFlavorDsl.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/dsl/ProductFlavorDsl.groovy @@ -15,11 +15,12 @@ */ package com.android.build.gradle.internal.dsl + import com.android.annotations.NonNull import com.android.annotations.Nullable import com.android.builder.AndroidBuilder import com.android.builder.DefaultProductFlavor -import com.android.builder.NdkConfig +import com.android.builder.model.NdkConfig import org.gradle.api.Action import org.gradle.api.internal.file.FileResolver import org.gradle.internal.reflect.Instantiator diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/ArtifactInfoImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/AndroidArtifactImpl.java index d7bb7f9..f27a055 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/model/ArtifactInfoImpl.java +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/AndroidArtifactImpl.java @@ -18,17 +18,19 @@ package com.android.build.gradle.internal.model; import com.android.annotations.NonNull; import com.android.annotations.Nullable; -import com.android.builder.model.ArtifactInfo; +import com.android.builder.model.AndroidArtifact; import com.android.builder.model.Dependencies; +import com.android.builder.model.SourceProvider; import java.io.File; import java.io.Serializable; import java.util.List; /** - * Implementation of ArtifactInfo that is serializable + * Implementation of AndroidArtifact that is serializable */ -public class ArtifactInfoImpl implements ArtifactInfo, Serializable { +public class AndroidArtifactImpl extends BaseArtifactImpl implements AndroidArtifact, Serializable { + private static final long serialVersionUID = 1L; @NonNull private final File outputFile; @@ -36,49 +38,42 @@ public class ArtifactInfoImpl implements ArtifactInfo, Serializable { @Nullable private final String signingConfigName; @NonNull - private final String assembleTaskName; - @NonNull private final String packageName; @NonNull private final String sourceGenTaskName; @NonNull - private final String javaCompileTaskName; - @NonNull private final File generatedManifest; @NonNull private final List<File> generatedSourceFolders; @NonNull private final List<File> generatedResourceFolders; - @NonNull - private final File classesFolder; - @NonNull - private final Dependencies dependencies; + AndroidArtifactImpl(@NonNull String name, + @NonNull String assembleTaskName, + @NonNull File outputFile, + boolean isSigned, + @Nullable String signingConfigName, + @NonNull String packageName, + @NonNull String sourceGenTaskName, + @NonNull String javaCompileTaskName, + @NonNull File generatedManifest, + @NonNull List<File> generatedSourceFolders, + @NonNull List<File> generatedResourceFolders, + @NonNull File classesFolder, + @NonNull Dependencies dependencies, + @Nullable SourceProvider variantSourceProvider, + @Nullable SourceProvider multiFlavorSourceProviders) { + super(name, assembleTaskName, javaCompileTaskName, classesFolder, dependencies, + variantSourceProvider, multiFlavorSourceProviders); - ArtifactInfoImpl(@NonNull String assembleTaskName, - @NonNull File outputFile, - boolean isSigned, - @Nullable String signingConfigName, - @NonNull String packageName, - @NonNull String sourceGenTaskName, - @NonNull String javaCompileTaskName, - @NonNull File generatedManifest, - @NonNull List<File> generatedSourceFolders, - @NonNull List<File> generatedResourceFolders, - @NonNull File classesFolder, - @NonNull Dependencies dependencies) { - this.assembleTaskName = assembleTaskName; this.outputFile = outputFile; this.isSigned = isSigned; this.signingConfigName = signingConfigName; this.packageName = packageName; this.sourceGenTaskName = sourceGenTaskName; - this.javaCompileTaskName = javaCompileTaskName; this.generatedManifest = generatedManifest; this.generatedSourceFolders = generatedSourceFolders; this.generatedResourceFolders = generatedResourceFolders; - this.classesFolder = classesFolder; - this.dependencies = dependencies; } @NonNull @@ -112,18 +107,6 @@ public class ArtifactInfoImpl implements ArtifactInfo, Serializable { @NonNull @Override - public String getJavaCompileTaskName() { - return javaCompileTaskName; - } - - @NonNull - @Override - public String getAssembleTaskName() { - return assembleTaskName; - } - - @NonNull - @Override public File getGeneratedManifest() { return generatedManifest; } @@ -139,16 +122,4 @@ public class ArtifactInfoImpl implements ArtifactInfo, Serializable { public List<File> getGeneratedResourceFolders() { return generatedResourceFolders; } - - @NonNull - @Override - public File getClassesFolder() { - return classesFolder; - } - - @NonNull - @Override - public Dependencies getDependencies() { - return dependencies; - } } diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/AndroidLibraryImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/AndroidLibraryImpl.java index b3fc9d1..8635ce8 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/model/AndroidLibraryImpl.java +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/AndroidLibraryImpl.java @@ -23,6 +23,7 @@ import com.android.builder.model.AndroidLibrary; import java.io.File; import java.io.Serializable; +import java.util.Collection; import java.util.List; public class AndroidLibraryImpl implements AndroidLibrary, Serializable { @@ -39,7 +40,7 @@ public class AndroidLibraryImpl implements AndroidLibrary, Serializable { @NonNull private final File jarFile; @NonNull - private final List<File> localJars; + private final Collection<File> localJars; @NonNull private final File resFolder; @NonNull @@ -115,7 +116,7 @@ public class AndroidLibraryImpl implements AndroidLibrary, Serializable { @NonNull @Override - public List<File> getLocalJars() { + public Collection<File> getLocalJars() { return localJars; } diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/ArtifactMetaDataImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/ArtifactMetaDataImpl.java new file mode 100644 index 0000000..8f33c2d --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/ArtifactMetaDataImpl.java @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.build.gradle.internal.model; + +import com.android.annotations.NonNull; +import com.android.builder.model.ArtifactMetaData; + +import java.io.Serializable; + +/** + * Implementation of ArtifactMetaData that is serializable + */ +public class ArtifactMetaDataImpl implements ArtifactMetaData, Serializable { + private static final long serialVersionUID = 1L; + + @NonNull + private final String name; + private final boolean isTest; + private final int type; + + public ArtifactMetaDataImpl(@NonNull String name, boolean isTest, int type) { + this.name = name; + this.isTest = isTest; + this.type = type; + } + + @NonNull + @Override + public String getName() { + return name; + } + + @Override + public boolean isTest() { + return isTest; + } + + @Override + public int getType() { + return type; + } +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/BaseArtifactImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/BaseArtifactImpl.java new file mode 100644 index 0000000..65c0c87 --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/BaseArtifactImpl.java @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.build.gradle.internal.model; + +import com.android.annotations.NonNull; +import com.android.annotations.Nullable; +import com.android.builder.model.BaseArtifact; +import com.android.builder.model.Dependencies; +import com.android.builder.model.SourceProvider; + +import java.io.File; +import java.io.Serializable; + +/** + * Implementation of BaseArtifact that is serializable + */ +class BaseArtifactImpl implements BaseArtifact, Serializable { + private static final long serialVersionUID = 1L; + + private final String name; + @NonNull + private final String assembleTaskName; + @NonNull + private final String javaCompileTaskName; + @NonNull + private final File classesFolder; + @NonNull + private final Dependencies dependencies; + @Nullable + private final SourceProvider variantSourceProvider; + @Nullable + private final SourceProvider multiFlavorSourceProviders; + + + BaseArtifactImpl(@NonNull String name, + @NonNull String assembleTaskName, + @NonNull String javaCompileTaskName, + @NonNull File classesFolder, + @NonNull Dependencies dependencies, + @Nullable SourceProvider variantSourceProvider, + @Nullable SourceProvider multiFlavorSourceProviders) { + this.name = name; + this.assembleTaskName = assembleTaskName; + this.javaCompileTaskName = javaCompileTaskName; + this.classesFolder = classesFolder; + this.dependencies = dependencies; + this.variantSourceProvider = variantSourceProvider; + this.multiFlavorSourceProviders = multiFlavorSourceProviders; + } + + @NonNull + @Override + public String getName() { + return name; + } + + @NonNull + @Override + public String getJavaCompileTaskName() { + return javaCompileTaskName; + } + + @NonNull + @Override + public String getAssembleTaskName() { + return assembleTaskName; + } + + @NonNull + @Override + public File getClassesFolder() { + return classesFolder; + } + + @NonNull + @Override + public Dependencies getDependencies() { + return dependencies; + } + + @Nullable + @Override + public SourceProvider getVariantSourceProvider() { + return variantSourceProvider; + } + + @Nullable + @Override + public SourceProvider getMultiFlavorSourceProvider() { + return multiFlavorSourceProviders; + } +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/BuildTypeContainerImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/BuildTypeContainerImpl.java index db8dc17..a4c302f 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/model/BuildTypeContainerImpl.java +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/BuildTypeContainerImpl.java @@ -17,11 +17,14 @@ package com.android.build.gradle.internal.model; import com.android.annotations.NonNull; -import com.android.builder.model.BuildTypeContainer; +import com.android.build.gradle.internal.BuildTypeData; import com.android.builder.model.BuildType; +import com.android.builder.model.BuildTypeContainer; import com.android.builder.model.SourceProvider; +import com.android.builder.model.SourceProviderContainer; import java.io.Serializable; +import java.util.Collection; class BuildTypeContainerImpl implements BuildTypeContainer, Serializable { private static final long serialVersionUID = 1L; @@ -30,11 +33,35 @@ class BuildTypeContainerImpl implements BuildTypeContainer, Serializable { private final BuildType buildType; @NonNull private final SourceProvider sourceProvider; + @NonNull + private final Collection<SourceProviderContainer> extraSourceProviders; - BuildTypeContainerImpl(@NonNull BuildTypeImpl buildType, - @NonNull SourceProviderImpl sourceProvider) { + /** + * Create a BuildTypeContainer from a BuildTypeData + * + * @param buildTypeData the build type data + * @param sourceProviderContainers collection of extra source providers + * + * @return a non-null BuildTypeContainer + */ + @NonNull + static BuildTypeContainer createBTC( + @NonNull BuildTypeData buildTypeData, + @NonNull Collection<SourceProviderContainer> sourceProviderContainers) { + + return new BuildTypeContainerImpl( + BuildTypeImpl.cloneBuildType(buildTypeData.getBuildType()), + SourceProviderImpl.cloneProvider(buildTypeData.getSourceSet()), + SourceProviderContainerImpl.cloneCollection(sourceProviderContainers)); + } + + private BuildTypeContainerImpl( + @NonNull BuildTypeImpl buildType, + @NonNull SourceProviderImpl sourceProvider, + @NonNull Collection<SourceProviderContainer> extraSourceProviders) { this.buildType = buildType; this.sourceProvider = sourceProvider; + this.extraSourceProviders = extraSourceProviders; } @Override @@ -48,4 +75,10 @@ class BuildTypeContainerImpl implements BuildTypeContainer, Serializable { public SourceProvider getSourceProvider() { return sourceProvider; } + + @NonNull + @Override + public Collection<SourceProviderContainer> getExtraSourceProviders() { + return extraSourceProviders; + } } diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/BuildTypeImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/BuildTypeImpl.java index ccb1e8b..e3f5cdc 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/model/BuildTypeImpl.java +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/BuildTypeImpl.java @@ -18,9 +18,9 @@ package com.android.build.gradle.internal.model; import com.android.annotations.NonNull; import com.android.annotations.Nullable; -import com.android.builder.NdkConfig; import com.android.builder.model.BuildType; import com.android.builder.model.ClassField; +import com.android.builder.model.NdkConfig; import java.io.File; import java.io.Serializable; diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/DefaultAndroidProject.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/DefaultAndroidProject.java index 39e184d..fab28d1 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/model/DefaultAndroidProject.java +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/DefaultAndroidProject.java @@ -18,20 +18,19 @@ package com.android.build.gradle.internal.model; import com.android.annotations.NonNull; import com.android.build.gradle.internal.CompileOptions; +import com.android.builder.model.AaptOptions; import com.android.builder.model.AndroidProject; +import com.android.builder.model.ArtifactMetaData; import com.android.builder.model.BuildTypeContainer; import com.android.builder.model.JavaCompileOptions; import com.android.builder.model.ProductFlavorContainer; -import com.android.builder.model.Variant; -import com.android.builder.model.AaptOptions; import com.android.builder.model.SigningConfig; -import com.google.common.collect.Maps; +import com.android.builder.model.Variant; +import com.google.common.collect.Lists; import java.io.File; import java.io.Serializable; import java.util.Collection; -import java.util.List; -import java.util.Map; /** * Implementation of the AndroidProject model object. @@ -46,28 +45,32 @@ class DefaultAndroidProject implements AndroidProject, Serializable { @NonNull private final String compileTarget; @NonNull - private final List<String> bootClasspath; + private final Collection<String> bootClasspath; @NonNull - private final List<File> frameworkSource; + private final Collection<File> frameworkSource; @NonNull - private final Map<String, SigningConfig> signingConfigs; + private final Collection<SigningConfig> signingConfigs; + @NonNull + private final Collection<ArtifactMetaData> extraArtifacts; @NonNull private final Collection<String> unresolvedDependencies; @NonNull private final JavaCompileOptions javaCompileOptions; private final boolean isLibrary; - private final Map<String, BuildTypeContainer> buildTypes = Maps.newHashMap(); - private final Map<String, ProductFlavorContainer> productFlavors = Maps.newHashMap(); - private final Map<String, Variant> variants = Maps.newHashMap(); + private final Collection<BuildTypeContainer> buildTypes = Lists.newArrayList(); + private final Collection<ProductFlavorContainer> productFlavors = Lists.newArrayList(); + private final Collection<Variant> variants = Lists.newArrayList(); private ProductFlavorContainer defaultConfig; DefaultAndroidProject(@NonNull String modelVersion, - @NonNull String name, @NonNull String compileTarget, - @NonNull List<String> bootClasspath, - @NonNull List<File> frameworkSource, - @NonNull Map<String, SigningConfig> signingConfigs, + @NonNull String name, + @NonNull String compileTarget, + @NonNull Collection<String> bootClasspath, + @NonNull Collection<File> frameworkSource, + @NonNull Collection<SigningConfig> signingConfigs, + @NonNull Collection<ArtifactMetaData> extraArtifacts, @NonNull Collection<String> unresolvedDependencies, @NonNull CompileOptions compileOptions, boolean isLibrary) { @@ -77,6 +80,7 @@ class DefaultAndroidProject implements AndroidProject, Serializable { this.bootClasspath = bootClasspath; this.frameworkSource = frameworkSource; this.signingConfigs = signingConfigs; + this.extraArtifacts = extraArtifacts; this.unresolvedDependencies = unresolvedDependencies; javaCompileOptions = new DefaultJavaCompileOptions(compileOptions); this.isLibrary = isLibrary; @@ -90,26 +94,25 @@ class DefaultAndroidProject implements AndroidProject, Serializable { @NonNull DefaultAndroidProject addBuildType(@NonNull BuildTypeContainer buildTypeContainer) { - buildTypes.put(buildTypeContainer.getBuildType().getName(), buildTypeContainer); + buildTypes.add(buildTypeContainer); return this; } @NonNull DefaultAndroidProject addProductFlavors( @NonNull ProductFlavorContainer productFlavorContainer) { - productFlavors.put(productFlavorContainer.getProductFlavor().getName(), - productFlavorContainer); + productFlavors.add(productFlavorContainer); return this; } @NonNull DefaultAndroidProject addVariant(@NonNull VariantImpl variant) { - variants.put(variant.getName(), variant); + variants.add(variant); return this; } - @NonNull @Override + @NonNull public String getModelVersion() { return modelVersion; } @@ -120,72 +123,79 @@ class DefaultAndroidProject implements AndroidProject, Serializable { return name; } - @NonNull @Override + @NonNull public ProductFlavorContainer getDefaultConfig() { return defaultConfig; } - @NonNull @Override - public Map<String, BuildTypeContainer> getBuildTypes() { + @NonNull + public Collection<BuildTypeContainer> getBuildTypes() { return buildTypes; } - @NonNull @Override - public Map<String, ProductFlavorContainer> getProductFlavors() { + @NonNull + public Collection<ProductFlavorContainer> getProductFlavors() { return productFlavors; } - @NonNull @Override - public Map<String, Variant> getVariants() { + @NonNull + public Collection<Variant> getVariants() { return variants; } + @NonNull + @Override + public Collection<ArtifactMetaData> getExtraArtifacts() { + return extraArtifacts; + } + @Override public boolean isLibrary() { return isLibrary; } - @NonNull @Override + @NonNull public String getCompileTarget() { return compileTarget; } - @NonNull @Override - public List<String> getBootClasspath() { + @NonNull + public Collection<String> getBootClasspath() { return bootClasspath; } @Override - public List<File> getFrameworkSource() { + @NonNull + public Collection<File> getFrameworkSources() { return frameworkSource; } - @NonNull @Override - public Map<String,SigningConfig> getSigningConfigs() { + @NonNull + public Collection<SigningConfig> getSigningConfigs() { return signingConfigs; } - @NonNull @Override + @NonNull public AaptOptions getAaptOptions() { return null; } - @NonNull @Override + @NonNull public Collection<String> getUnresolvedDependencies() { return unresolvedDependencies; } - @NonNull @Override + @NonNull public JavaCompileOptions getJavaCompileOptions() { return javaCompileOptions; } diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/JavaArtifactImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/JavaArtifactImpl.java new file mode 100644 index 0000000..4c7584c --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/JavaArtifactImpl.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.build.gradle.internal.model; + +import com.android.annotations.NonNull; +import com.android.annotations.Nullable; +import com.android.builder.model.Dependencies; +import com.android.builder.model.JavaArtifact; +import com.android.builder.model.SourceProvider; + +import java.io.File; +import java.io.Serializable; + +/** + * Implementation of JavaArtifact that is serializable + */ +public class JavaArtifactImpl extends BaseArtifactImpl implements JavaArtifact, Serializable { + private static final long serialVersionUID = 1L; + + public static JavaArtifactImpl clone(@NonNull JavaArtifact javaArtifact) { + return new JavaArtifactImpl( + javaArtifact.getName(), + javaArtifact.getAssembleTaskName(), + javaArtifact.getJavaCompileTaskName(), + javaArtifact.getClassesFolder(), + javaArtifact.getDependencies(), // TODO:FixME + SourceProviderImpl.cloneProvider(javaArtifact.getVariantSourceProvider()), + SourceProviderImpl.cloneProvider(javaArtifact.getMultiFlavorSourceProvider())); + } + + public JavaArtifactImpl(@NonNull String name, + @NonNull String assembleTaskName, + @NonNull String javaCompileTaskName, + @NonNull File classesFolder, + @NonNull Dependencies dependencies, + @Nullable SourceProvider variantSourceProvider, + @Nullable SourceProvider multiFlavorSourceProviders) { + super(name, assembleTaskName, javaCompileTaskName, classesFolder, dependencies, + variantSourceProvider, multiFlavorSourceProviders); + } +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/ModelBuilder.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/model/ModelBuilder.groovy index c3ede88..9bf6c46 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/model/ModelBuilder.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/ModelBuilder.groovy @@ -26,23 +26,27 @@ import com.android.build.gradle.internal.variant.ApplicationVariantData import com.android.build.gradle.internal.variant.BaseVariantData import com.android.build.gradle.internal.variant.LibraryVariantData import com.android.build.gradle.internal.variant.TestVariantData -import com.android.builder.model.AndroidProject -import com.android.builder.model.ArtifactInfo -import com.android.builder.model.BuildTypeContainer -import com.android.builder.model.ProductFlavorContainer import com.android.builder.DefaultProductFlavor import com.android.builder.SdkParser import com.android.builder.VariantConfiguration +import com.android.builder.model.AndroidArtifact +import com.android.builder.model.AndroidProject +import com.android.builder.model.ArtifactMetaData +import com.android.builder.model.JavaArtifact import com.android.builder.model.SigningConfig import com.android.builder.model.SourceProvider +import com.android.builder.model.SourceProviderContainer import com.google.common.collect.Lists -import com.google.common.collect.Maps import org.gradle.api.Project import org.gradle.api.plugins.UnknownPluginException import org.gradle.tooling.provider.model.ToolingModelBuilder import java.util.jar.Attributes import java.util.jar.Manifest + +import static com.android.builder.model.AndroidProject.ARTIFACT_INSTRUMENT_TEST +import static com.android.builder.model.AndroidProject.ARTIFACT_MAIN + /** * Builder for the custom Android model. */ @@ -81,6 +85,15 @@ public class ModelBuilder implements ToolingModelBuilder { List<File> frameworkSource = Collections.emptyList(); String compileTarget = sdkParser.target.hashString() + // list of extra artifacts + List<ArtifactMetaData> artifactMetaDataList = Lists.newArrayList(basePlugin.extraArtifacts) + // plus the instrumentation test one. + artifactMetaDataList.add( + new ArtifactMetaDataImpl( + ARTIFACT_INSTRUMENT_TEST, + true /*isTest*/, + ArtifactMetaData.TYPE_ANDROID)); + //noinspection GroovyVariableNotAssigned DefaultAndroidProject androidProject = new DefaultAndroidProject( getModelVersion(), @@ -89,29 +102,40 @@ public class ModelBuilder implements ToolingModelBuilder { bootClasspath, frameworkSource, cloneSigningConfigs(signingConfigs), + artifactMetaDataList, basePlugin.unresolvedDependencies, basePlugin.extension.compileOptions, libPlugin != null) - .setDefaultConfig(createPFC(basePlugin.defaultConfigData)) + .setDefaultConfig(ProductFlavorContainerImpl.createPFC( + basePlugin.defaultConfigData, + basePlugin.getExtraFlavorSourceProviders(basePlugin.defaultConfigData.productFlavor.name))) if (appPlugin != null) { for (BuildTypeData btData : appPlugin.buildTypes.values()) { - androidProject.addBuildType(createBTC(btData)) + androidProject.addBuildType(BuildTypeContainerImpl.createBTC( + btData, + basePlugin.getExtraBuildTypeSourceProviders(btData.buildType.name))) } for (ProductFlavorData pfData : appPlugin.productFlavors.values()) { - androidProject.addProductFlavors(createPFC(pfData)) + androidProject.addProductFlavors(ProductFlavorContainerImpl.createPFC( + pfData, + basePlugin.getExtraFlavorSourceProviders(pfData.productFlavor.name))) } } else if (libPlugin != null) { - androidProject.addBuildType(createBTC(libPlugin.debugBuildTypeData)) - .addBuildType(createBTC(libPlugin.releaseBuildTypeData)) + androidProject.addBuildType(BuildTypeContainerImpl.createBTC( + libPlugin.debugBuildTypeData, + basePlugin.getExtraBuildTypeSourceProviders(libPlugin.debugBuildTypeData.buildType.name))) + .addBuildType(BuildTypeContainerImpl.createBTC( + libPlugin.releaseBuildTypeData, + basePlugin.getExtraBuildTypeSourceProviders(libPlugin.releaseBuildTypeData.buildType.name))) } Set<Project> gradleProjects = project.getRootProject().getAllprojects(); for (BaseVariantData variantData : basePlugin.variantDataList) { if (!(variantData instanceof TestVariantData)) { - androidProject.addVariant(createVariant(variantData, gradleProjects)) + androidProject.addVariant(createVariant(variantData, basePlugin, gradleProjects)) } } @@ -141,6 +165,7 @@ public class ModelBuilder implements ToolingModelBuilder { @NonNull private static VariantImpl createVariant(@NonNull BaseVariantData variantData, + @NonNull BasePlugin basePlugin, @NonNull Set<Project> gradleProjects) { TestVariantData testVariantData = null if (variantData instanceof ApplicationVariantData || @@ -148,30 +173,43 @@ public class ModelBuilder implements ToolingModelBuilder { testVariantData = variantData.testVariantData } - ArtifactInfo mainArtifact = createArtifactInfo(variantData, gradleProjects) - ArtifactInfo testArtifact = testVariantData != null ? - createArtifactInfo(testVariantData, gradleProjects) : null + AndroidArtifact mainArtifact = createArtifactInfo( + ARTIFACT_MAIN, variantData, basePlugin, gradleProjects) + + String variantName = variantData.variantConfiguration.fullName + + // extra Android Artifacts + AndroidArtifact testArtifact = testVariantData != null ? + createArtifactInfo(ARTIFACT_INSTRUMENT_TEST, testVariantData, basePlugin, gradleProjects) : null - SourceProvider sp = variantData.variantConfiguration.getVariantSourceProvider(); - if (sp != null) { - sp = SourceProviderImpl.cloneProvider(sp); + List<AndroidArtifact> extraAndroidArtifacts = Lists.newArrayList( + basePlugin.getExtraAndroidArtifacts(variantName)) + if (testArtifact != null) { + extraAndroidArtifacts.add(testArtifact) } + // extra Java Artifacts + List<JavaArtifact> extraJavaArtifacts = Lists.newArrayList( + basePlugin.getExtraJavaArtifacts(variantName)) + VariantImpl variant = new VariantImpl( - variantData.variantConfiguration.fullName, + variantName, variantData.variantConfiguration.baseName, variantData.variantConfiguration.buildType.name, getProductFlavorNames(variantData), ProductFlavorImpl.cloneFlavor(variantData.variantConfiguration.mergedFlavor), mainArtifact, - testArtifact, - sp) + extraAndroidArtifacts, + extraJavaArtifacts) return variant } - private static ArtifactInfo createArtifactInfo(@NonNull BaseVariantData variantData, - @NonNull Set<Project> gradleProjects) { + private static AndroidArtifact createArtifactInfo( + @NonNull String name, + @NonNull BaseVariantData variantData, + @NonNull BasePlugin basePlugin, + @NonNull Set<Project> gradleProjects) { VariantConfiguration vC = variantData.variantConfiguration SigningConfig signingConfig = vC.signingConfig @@ -180,7 +218,26 @@ public class ModelBuilder implements ToolingModelBuilder { signingConfigName = signingConfig.name } - return new ArtifactInfoImpl( + SourceProvider variantSourceProvider = null; + SourceProvider multiFlavorSourceProvider = null; + + if (ARTIFACT_MAIN.equals(name)) { + variantSourceProvider = variantData.variantConfiguration.variantSourceProvider + multiFlavorSourceProvider = variantData.variantConfiguration.multiFlavorSourceProvider + } else { + SourceProviderContainer container = getSourceProviderContainer( + basePlugin.getExtraVariantSourceProviders(variantData.getVariantConfiguration().getFullName()), + name) + if (container != null) { + variantSourceProvider = container.sourceProvider + } + } + + variantSourceProvider = variantSourceProvider != null ? SourceProviderImpl.cloneProvider(variantSourceProvider) : null + multiFlavorSourceProvider = multiFlavorSourceProvider != null ? SourceProviderImpl.cloneProvider(multiFlavorSourceProvider) : null + + return new AndroidArtifactImpl( + name, variantData.assembleTask.name, variantData.outputFile, vC.isSigningReady(), @@ -192,8 +249,9 @@ public class ModelBuilder implements ToolingModelBuilder { getGeneratedSourceFolders(variantData), getGeneratedResourceFolders(variantData), variantData.javaCompileTask.destinationDir, - DependenciesImpl.cloneDependencies(variantData.variantDependency, gradleProjects) - ) + DependenciesImpl.cloneDependencies(variantData.variantDependency, gradleProjects), + variantSourceProvider, + multiFlavorSourceProvider) } @NonNull @@ -237,54 +295,29 @@ public class ModelBuilder implements ToolingModelBuilder { return Collections.singletonList(variantData.renderscriptCompileTask.resOutputDir) } - /** - * Create a ProductFlavorContainer from a ProductFlavorData - * @param productFlavorData the product flavor data - * @return a non-null ProductFlavorContainer - */ - @NonNull - private static ProductFlavorContainer createPFC(@NonNull ProductFlavorData productFlavorData) { - return new ProductFlavorContainerImpl( - ProductFlavorImpl.cloneFlavor(productFlavorData.productFlavor), - SourceProviderImpl.cloneProvider((SourceProvider) productFlavorData.sourceSet), - SourceProviderImpl.cloneProvider((SourceProvider) productFlavorData.testSourceSet)) - } - - /** - * Create a BuildTypeContainer from a BuildTypeData - * @param buildTypeData the build type data - * @return a non-null BuildTypeContainer - */ @NonNull - private static BuildTypeContainer createBTC(@NonNull BuildTypeData buildTypeData) { - return new BuildTypeContainerImpl( - BuildTypeImpl.cloneBuildType(buildTypeData.buildType), - SourceProviderImpl.cloneProvider((SourceProvider) buildTypeData.sourceSet)) - } - - @NonNull - private static Map<String, SigningConfig> cloneSigningConfigs( + private static Collection<SigningConfig> cloneSigningConfigs( @NonNull Collection<SigningConfig> signingConfigs) { - Map<String, SigningConfig> results = Maps.newHashMapWithExpectedSize(signingConfigs.size()) + Collection<SigningConfig> results = Lists.newArrayListWithCapacity(signingConfigs.size()) for (SigningConfig signingConfig : signingConfigs) { - SigningConfig clonedSigningConfig = createSigningConfig(signingConfig) - results.put(clonedSigningConfig.name, clonedSigningConfig) + results.add(SigningConfigImpl.createSigningConfig(signingConfig)) } return results } - @NonNull - private static SigningConfig createSigningConfig(@NonNull SigningConfig signingConfig) { - return new SigningConfigImpl( - signingConfig.getName(), - signingConfig.getStoreFile(), - signingConfig.getStorePassword(), - signingConfig.getKeyAlias(), - signingConfig.getKeyPassword(), - signingConfig.getStoreType(), - signingConfig.isSigningReady()) + @Nullable + private static SourceProviderContainer getSourceProviderContainer( + @NonNull Collection<SourceProviderContainer> items, + @NonNull String name) { + for (SourceProviderContainer item : items) { + if (name.equals(item.getArtifactName())) { + return item; + } + } + + return null; } /** diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/ProductFlavorContainerImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/ProductFlavorContainerImpl.java index dac38e6..92fa794 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/model/ProductFlavorContainerImpl.java +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/ProductFlavorContainerImpl.java @@ -17,11 +17,16 @@ package com.android.build.gradle.internal.model; import com.android.annotations.NonNull; -import com.android.builder.model.ProductFlavorContainer; +import com.android.build.gradle.internal.ProductFlavorData; +import com.android.builder.model.AndroidProject; import com.android.builder.model.ProductFlavor; +import com.android.builder.model.ProductFlavorContainer; import com.android.builder.model.SourceProvider; +import com.android.builder.model.SourceProviderContainer; import java.io.Serializable; +import java.util.Collection; +import java.util.List; /** */ @@ -33,15 +38,43 @@ class ProductFlavorContainerImpl implements ProductFlavorContainer, Serializable @NonNull private final SourceProvider sourceProvider; @NonNull - private final SourceProvider testSourceProvider; + private final Collection<SourceProviderContainer> extraSourceProviders; + + /** + * Create a ProductFlavorContainer from a ProductFlavorData + * + * @param productFlavorData the product flavor data + * @param sourceProviderContainers collection of extra source providers + * + * @return a non-null ProductFlavorContainer + */ + @NonNull + static ProductFlavorContainer createPFC( + @NonNull ProductFlavorData productFlavorData, + @NonNull Collection<SourceProviderContainer> sourceProviderContainers) { + + List<SourceProviderContainer> clonedContainer = SourceProviderContainerImpl.cloneCollection(sourceProviderContainers); + + // instrument test Source Provider + SourceProviderContainer testASP = SourceProviderContainerImpl.create( + AndroidProject.ARTIFACT_INSTRUMENT_TEST, productFlavorData.getTestSourceSet()); + + clonedContainer.add(testASP); + + return new ProductFlavorContainerImpl( + ProductFlavorImpl.cloneFlavor(productFlavorData.getProductFlavor()), + SourceProviderImpl.cloneProvider(productFlavorData.getSourceSet()), + clonedContainer); + } - ProductFlavorContainerImpl(@NonNull ProductFlavorImpl productFlavor, - @NonNull SourceProviderImpl sourceProvider, - @NonNull SourceProviderImpl testSourceProvider) { + private ProductFlavorContainerImpl( + @NonNull ProductFlavorImpl productFlavor, + @NonNull SourceProviderImpl sourceProvider, + @NonNull Collection<SourceProviderContainer> extraSourceProviders) { this.productFlavor = productFlavor; this.sourceProvider = sourceProvider; - this.testSourceProvider = testSourceProvider; + this.extraSourceProviders = extraSourceProviders; } @NonNull @@ -58,7 +91,7 @@ class ProductFlavorContainerImpl implements ProductFlavorContainer, Serializable @NonNull @Override - public SourceProvider getTestSourceProvider() { - return testSourceProvider; + public Collection<SourceProviderContainer> getExtraSourceProviders() { + return extraSourceProviders; } } diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/ProductFlavorImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/ProductFlavorImpl.java index 8380ae3..cc7aad6 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/model/ProductFlavorImpl.java +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/ProductFlavorImpl.java @@ -18,8 +18,8 @@ package com.android.build.gradle.internal.model; import com.android.annotations.NonNull; import com.android.annotations.Nullable; -import com.android.builder.NdkConfig; import com.android.builder.model.ClassField; +import com.android.builder.model.NdkConfig; import com.android.builder.model.ProductFlavor; import java.io.File; @@ -182,5 +182,4 @@ class ProductFlavorImpl implements ProductFlavor, Serializable { ", mTestFunctionalTest='" + mTestFunctionalTest + '\'' + '}'; } - } diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/SigningConfigImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/SigningConfigImpl.java index 06e219c..19c867c 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/model/SigningConfigImpl.java +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/SigningConfigImpl.java @@ -44,7 +44,19 @@ class SigningConfigImpl implements SigningConfig, Serializable { private final String storeType; private final boolean signingReady; - SigningConfigImpl(@NonNull String name, + @NonNull + static SigningConfig createSigningConfig(@NonNull SigningConfig signingConfig) { + return new SigningConfigImpl( + signingConfig.getName(), + signingConfig.getStoreFile(), + signingConfig.getStorePassword(), + signingConfig.getKeyAlias(), + signingConfig.getKeyPassword(), + signingConfig.getStoreType(), + signingConfig.isSigningReady()); + } + + private SigningConfigImpl(@NonNull String name, @Nullable File storeFile, @Nullable String storePassword, @Nullable String keyAlias, diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/SourceProviderContainerImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/SourceProviderContainerImpl.java new file mode 100644 index 0000000..fe41180 --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/SourceProviderContainerImpl.java @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.build.gradle.internal.model; + +import com.android.annotations.NonNull; +import com.android.builder.model.SourceProvider; +import com.android.builder.model.SourceProviderContainer; +import com.google.common.collect.Lists; + +import java.io.Serializable; +import java.util.Collection; +import java.util.List; + +/** + * Implementation of SourceProviderContainer that is serializable and is meant to be used + * in the model sent to the tooling API. + * + * It also provides convenient methods to create an instance, cloning the original + * SourceProvider. + * + * When the source Provider is cloned, its values are queried and then statically stored. + * Any further change through the DSL will not be impact. Therefore instances of this class + * should only be used when the model is built. + * + * To create more dynamic isntances of SourceProviderContainer, use + * {@link com.android.build.gradle.internal.variant.DefaultSourceProviderContainer} + */ +class SourceProviderContainerImpl implements SourceProviderContainer, Serializable { + private static final long serialVersionUID = 1L; + + @NonNull + private final String name; + @NonNull + private final SourceProvider sourceProvider; + + /** + * Create a {@link SourceProviderContainer} that is serializable to + * use in the model sent through the tooling API. + * + * @param sourceProviderContainer the source provider + * + * @return a non-null SourceProviderContainer + */ + @NonNull + static SourceProviderContainer clone( + @NonNull SourceProviderContainer sourceProviderContainer) { + return create( + sourceProviderContainer.getArtifactName(), + sourceProviderContainer.getSourceProvider()); + } + + @NonNull + static List<SourceProviderContainer> cloneCollection(@NonNull Collection<SourceProviderContainer> containers) { + List<SourceProviderContainer> clones = Lists.newArrayListWithCapacity(containers.size()); + + for (SourceProviderContainer container : containers) { + clones.add(clone(container)); + } + + return clones; + } + + @NonNull + static SourceProviderContainer create( + @NonNull String name, + @NonNull SourceProvider sourceProvider) { + return new SourceProviderContainerImpl(name, + SourceProviderImpl.cloneProvider(sourceProvider)); + } + + private SourceProviderContainerImpl(@NonNull String name, + @NonNull SourceProvider sourceProvider) { + this.name = name; + this.sourceProvider = sourceProvider; + } + + @NonNull + @Override + public String getArtifactName() { + return name; + } + + @NonNull + @Override + public SourceProvider getSourceProvider() { + return sourceProvider; + } +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/SourceProviderImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/SourceProviderImpl.java index 7d0293b..de02737 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/model/SourceProviderImpl.java +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/SourceProviderImpl.java @@ -18,10 +18,11 @@ package com.android.build.gradle.internal.model; import com.android.annotations.NonNull; import com.android.builder.model.SourceProvider; +import com.google.common.collect.Lists; import java.io.File; import java.io.Serializable; -import java.util.Set; +import java.util.Collection; /** * Implementation of SourceProvider that is serializable. Objects used in the DSL cannot be @@ -31,13 +32,13 @@ class SourceProviderImpl implements SourceProvider, Serializable { private static final long serialVersionUID = 1L; private File manifestFile; - private Set<File> javaDirs; - private Set<File> resourcesDirs; - private Set<File> aidlDirs; - private Set<File> rsDirs; - private Set<File> jniDirs; - private Set<File> resDirs; - private Set<File> assetsDirs; + private Collection<File> javaDirs; + private Collection<File> resourcesDirs; + private Collection<File> aidlDirs; + private Collection<File> rsDirs; + private Collection<File> jniDirs; + private Collection<File> resDirs; + private Collection<File> assetsDirs; @NonNull static SourceProviderImpl cloneProvider(SourceProvider sourceProvider) { @@ -55,6 +56,17 @@ class SourceProviderImpl implements SourceProvider, Serializable { return sourceProviderClone; } + @NonNull + static Collection<SourceProvider> cloneCollection( + @NonNull Collection<SourceProvider> sourceProviders) { + Collection<SourceProvider> results = Lists.newArrayListWithCapacity(sourceProviders.size()); + for (SourceProvider sourceProvider : sourceProviders) { + results.add(SourceProviderImpl.cloneProvider(sourceProvider)); + } + + return results; + } + private SourceProviderImpl() { } @@ -66,43 +78,43 @@ class SourceProviderImpl implements SourceProvider, Serializable { @NonNull @Override - public Set<File> getJavaDirectories() { + public Collection<File> getJavaDirectories() { return javaDirs; } @NonNull @Override - public Set<File> getResourcesDirectories() { + public Collection<File> getResourcesDirectories() { return resourcesDirs; } @NonNull @Override - public Set<File> getAidlDirectories() { + public Collection<File> getAidlDirectories() { return aidlDirs; } @NonNull @Override - public Set<File> getRenderscriptDirectories() { + public Collection<File> getRenderscriptDirectories() { return rsDirs; } @NonNull @Override - public Set<File> getJniDirectories() { + public Collection<File> getJniDirectories() { return jniDirs; } @NonNull @Override - public Set<File> getResDirectories() { + public Collection<File> getResDirectories() { return resDirs; } @NonNull @Override - public Set<File> getAssetsDirectories() { + public Collection<File> getAssetsDirectories() { return assetsDirs; } diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/model/VariantImpl.java b/gradle/src/main/groovy/com/android/build/gradle/internal/model/VariantImpl.java index 2baef84..c15f480 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/model/VariantImpl.java +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/model/VariantImpl.java @@ -17,13 +17,13 @@ package com.android.build.gradle.internal.model; import com.android.annotations.NonNull; -import com.android.annotations.Nullable; -import com.android.builder.model.ArtifactInfo; -import com.android.builder.model.SourceProvider; -import com.android.builder.model.Variant; +import com.android.builder.model.AndroidArtifact; +import com.android.builder.model.JavaArtifact; import com.android.builder.model.ProductFlavor; +import com.android.builder.model.Variant; import java.io.Serializable; +import java.util.Collection; import java.util.Collections; import java.util.List; @@ -44,28 +44,28 @@ class VariantImpl implements Variant, Serializable { @NonNull private final ProductFlavor mergedFlavor; @NonNull - private final ArtifactInfo mainArtifactInfo; - @Nullable - private final ArtifactInfo testArtifactInfo; - @Nullable - private final SourceProvider variantSourceProvider; + private final AndroidArtifact mainArtifactInfo; + @NonNull + private final Collection<AndroidArtifact> extraAndroidArtifacts; + @NonNull + private final Collection<JavaArtifact> extraJavaArtifacts; - VariantImpl(@NonNull String name, - @NonNull String displayName, - @NonNull String buildTypeName, - @NonNull List<String> productFlavorNames, - @NonNull ProductFlavorImpl mergedFlavor, - @NonNull ArtifactInfo mainArtifactInfo, - @Nullable ArtifactInfo testArtifactInfo, - @Nullable SourceProvider variantSourceProvider) { + VariantImpl(@NonNull String name, + @NonNull String displayName, + @NonNull String buildTypeName, + @NonNull List<String> productFlavorNames, + @NonNull ProductFlavorImpl mergedFlavor, + @NonNull AndroidArtifact mainArtifactInfo, + @NonNull Collection<AndroidArtifact> extraAndroidArtifacts, + @NonNull Collection<JavaArtifact> extraJavaArtifacts) { this.name = name; this.displayName = displayName; this.buildTypeName = buildTypeName; this.productFlavorNames = productFlavorNames; this.mergedFlavor = mergedFlavor; this.mainArtifactInfo = mainArtifactInfo; - this.testArtifactInfo = testArtifactInfo; - this.variantSourceProvider = variantSourceProvider; + this.extraAndroidArtifacts = extraAndroidArtifacts; + this.extraJavaArtifacts = extraJavaArtifacts; } @Override @@ -100,25 +100,25 @@ class VariantImpl implements Variant, Serializable { @NonNull @Override - public ArtifactInfo getMainArtifactInfo() { + public AndroidArtifact getMainArtifact() { return mainArtifactInfo; } - @Nullable + @NonNull @Override - public ArtifactInfo getTestArtifactInfo() { - return testArtifactInfo; + public Collection<AndroidArtifact> getExtraAndroidArtifacts() { + return extraAndroidArtifacts; } - @Override @NonNull - public List<String> getResourceConfigurations() { - return Collections.emptyList(); + @Override + public Collection<JavaArtifact> getExtraJavaArtifacts() { + return extraJavaArtifacts; } @Override - @Nullable - public SourceProvider getSourceProvider() { - return variantSourceProvider; + @NonNull + public List<String> getResourceConfigurations() { + return Collections.emptyList(); } } diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/NdkTask.groovy b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/NdkTask.groovy index 05c56d8..ba48552 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/NdkTask.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/tasks/NdkTask.groovy @@ -15,7 +15,8 @@ */ package com.android.build.gradle.internal.tasks -import com.android.builder.NdkConfig + +import com.android.builder.model.NdkConfig import org.gradle.api.tasks.Input import org.gradle.api.tasks.Optional diff --git a/gradle/src/main/groovy/com/android/build/gradle/internal/variant/DefaultSourceProviderContainer.java b/gradle/src/main/groovy/com/android/build/gradle/internal/variant/DefaultSourceProviderContainer.java new file mode 100644 index 0000000..06f2e5f --- /dev/null +++ b/gradle/src/main/groovy/com/android/build/gradle/internal/variant/DefaultSourceProviderContainer.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.build.gradle.internal.variant; + +import com.android.annotations.NonNull; +import com.android.builder.model.SourceProvider; +import com.android.builder.model.SourceProviderContainer; + +/** + * Default implementation of a SourceProviderContainer that wraps an existing instance of a + * SourceProvider. + */ +public class DefaultSourceProviderContainer implements SourceProviderContainer { + + @NonNull + private final String name; + @NonNull + private final SourceProvider sourceProvider; + + public DefaultSourceProviderContainer(@NonNull String name, + @NonNull SourceProvider sourceProvider) { + this.name = name; + this.sourceProvider = sourceProvider; + } + + @NonNull + @Override + public String getArtifactName() { + return name; + } + + @NonNull + @Override + public SourceProvider getSourceProvider() { + return sourceProvider; + } +} diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/Lint.groovy b/gradle/src/main/groovy/com/android/build/gradle/tasks/Lint.groovy index d91f5b3..17d62cf 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/tasks/Lint.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/tasks/Lint.groovy @@ -37,9 +37,9 @@ public class Lint extends DefaultTask { @Nullable private File mConfigFile @Nullable private File mHtmlOutput @Nullable private File mXmlOutput - @Nullable private List<Set<File>> mSourceSets + @Nullable private List<Collection<File>> mSourceSets @Nullable private String mClassPath - @Nullable private List<Set<File>> mResourceSets + @Nullable private List<Collection<File>> mResourceSets private boolean mQuiet public void setPlugin(@NonNull BasePlugin plugin) { @@ -74,7 +74,7 @@ public class Lint extends DefaultTask { * * @param sourceSets files to be added to sources. */ - public void setSources(@NonNull List<Set<File>> sourceSets) { + public void setSources(@NonNull List<Collection<File>> sourceSets) { mSourceSets = sourceSets } @@ -164,7 +164,7 @@ public class Lint extends DefaultTask { // Flags: sources, resources, classes - for (Set<File> args : mSourceSets) { + for (Collection<File> args : mSourceSets) { for (File input : args) { if (input.exists()) { List<File> sources = flags.getSourcesOverride() @@ -190,7 +190,7 @@ public class Lint extends DefaultTask { classes.add(input); } - for (Set<File> args : mResourceSets) { + for (Collection<File> args : mResourceSets) { for (File input : args) { if (input.exists()) { List<File> resources = flags.getResourcesOverride() diff --git a/gradle/src/main/groovy/com/android/build/gradle/tasks/NdkCompile.groovy b/gradle/src/main/groovy/com/android/build/gradle/tasks/NdkCompile.groovy index d2a34d5..4526371 100644 --- a/gradle/src/main/groovy/com/android/build/gradle/tasks/NdkCompile.groovy +++ b/gradle/src/main/groovy/com/android/build/gradle/tasks/NdkCompile.groovy @@ -18,7 +18,7 @@ package com.android.build.gradle.tasks import com.android.annotations.NonNull import com.android.build.gradle.internal.tasks.NdkTask -import com.android.builder.NdkConfig +import com.android.builder.model.NdkConfig import com.android.sdklib.IAndroidTarget import com.google.common.base.Charsets import com.google.common.base.Joiner |