/* * 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.api; import com.android.annotations.NonNull; import com.android.annotations.Nullable; import com.android.build.gradle.BasePlugin; import com.android.build.gradle.api.BaseVariant; import com.android.build.gradle.api.BaseVariantOutput; import com.android.build.gradle.api.GroupableProductFlavor; import com.android.build.gradle.internal.variant.BaseVariantData; import com.android.build.gradle.tasks.AidlCompile; import com.android.build.gradle.tasks.GenerateBuildConfig; import com.android.build.gradle.tasks.ManifestProcessorTask; import com.android.build.gradle.tasks.MergeAssets; import com.android.build.gradle.tasks.MergeResources; import com.android.build.gradle.tasks.NdkCompile; import com.android.build.gradle.tasks.ProcessAndroidResources; import com.android.build.gradle.tasks.RenderscriptCompile; import com.android.builder.model.BuildType; import com.android.builder.model.ProductFlavor; import com.android.builder.model.SourceProvider; import com.google.common.collect.Lists; import org.gradle.api.Task; import org.gradle.api.tasks.Copy; import org.gradle.api.tasks.compile.JavaCompile; import java.io.File; import java.util.Collection; import java.util.List; /** * Base class for variants. * * This is a wrapper around the internal data model, in order to control what is accessible * through the external API. */ abstract class BaseVariantImpl implements BaseVariant { /** * STOPSHIP remove when we don't need to display deprecation warnings */ @NonNull protected BasePlugin plugin; @NonNull protected ReadOnlyObjectProvider readOnlyObjectProvider; protected List<BaseVariantOutput> outputs = Lists.newArrayListWithExpectedSize(1); BaseVariantImpl( @NonNull BasePlugin plugin, @NonNull ReadOnlyObjectProvider readOnlyObjectProvider) { this.plugin = plugin; this.readOnlyObjectProvider = readOnlyObjectProvider; } @NonNull protected abstract BaseVariantData<?> getVariantData(); public void addOutputs(@NonNull List<BaseVariantOutput> outputs) { this.outputs.addAll(outputs); } @Override @NonNull public String getName() { return getVariantData().getVariantConfiguration().getFullName(); } @Override @NonNull public String getDescription() { return getVariantData().getDescription(); } @Override @NonNull public String getDirName() { return getVariantData().getVariantConfiguration().getDirName(); } @Override @NonNull public String getBaseName() { return getVariantData().getVariantConfiguration().getBaseName(); } @NonNull @Override public String getFlavorName() { return getVariantData().getVariantConfiguration().getFlavorName(); } @NonNull @Override public List<BaseVariantOutput> getOutputs() { return outputs; } @Override @NonNull public BuildType getBuildType() { return readOnlyObjectProvider.getBuildType( getVariantData().getVariantConfiguration().getBuildType()); } @Override @NonNull public List<GroupableProductFlavor> getProductFlavors() { return new ImmutableFlavorList( getVariantData().getVariantConfiguration().getProductFlavors(), readOnlyObjectProvider); } @Override @NonNull public ProductFlavor getMergedFlavor() { return getVariantData().getVariantConfiguration().getMergedFlavor(); } @NonNull @Override public List<SourceProvider> getSourceSets() { return getVariantData().getVariantConfiguration().getSortedSourceProviders(); } @Override @NonNull public String getApplicationId() { return getVariantData().getApplicationId(); } @Override @NonNull public Task getPreBuild() { return getVariantData().preBuildTask; } @Override @NonNull public Task getCheckManifest() { return getVariantData().checkManifestTask; } @Override @NonNull public AidlCompile getAidlCompile() { return getVariantData().aidlCompileTask; } @Override @NonNull public RenderscriptCompile getRenderscriptCompile() { return getVariantData().renderscriptCompileTask; } @Override public MergeResources getMergeResources() { return getVariantData().mergeResourcesTask; } @Override public MergeAssets getMergeAssets() { return getVariantData().mergeAssetsTask; } @Override public GenerateBuildConfig getGenerateBuildConfig() { return getVariantData().generateBuildConfigTask; } @Override @NonNull public JavaCompile getJavaCompile() { return getVariantData().javaCompileTask; } @NonNull @Override public NdkCompile getNdkCompile() { return getVariantData().ndkCompileTask; } @Nullable @Override public Task getObfuscation() { return getVariantData().obfuscationTask; } @Nullable @Override public File getMappingFile() { return getVariantData().mappingFile; } @Override @NonNull public Copy getProcessJavaResources() { return getVariantData().processJavaResourcesTask; } @Override @Nullable public Task getAssemble() { return getVariantData().assembleVariantTask; } @Override public void addJavaSourceFoldersToModel(@NonNull File... generatedSourceFolders) { getVariantData().addJavaSourceFoldersToModel(generatedSourceFolders); } @Override public void addJavaSourceFoldersToModel(@NonNull Collection<File> generatedSourceFolders) { getVariantData().addJavaSourceFoldersToModel(generatedSourceFolders); } @Override public void registerJavaGeneratingTask(@NonNull Task task, @NonNull File... sourceFolders) { getVariantData().registerJavaGeneratingTask(task, sourceFolders); } @Override public void registerJavaGeneratingTask(@NonNull Task task, @NonNull Collection<File> sourceFolders) { getVariantData().registerJavaGeneratingTask(task, sourceFolders); } // ---- Deprecated, will be removed in 1.0 //STOPSHIP @Override @NonNull public String getPackageName() { // deprecation warning. plugin.displayDeprecationWarning("variant.getPackageName() is deprecated. Use getApplicationId() instead"); return getApplicationId(); } @Override @Deprecated public void setOutputFile(@NonNull File outputFile) { // if more than one output, refuse to use this method if (outputs.size() > 1) { throw new RuntimeException(String.format( "More than one output on variant '%s', cannot call setOutput() on it. Call it on one of its outputs instead.", getName())); } // deprecation warning. plugin.displayDeprecationWarning("variant.setOutputFile() is deprecated. Call it on one of variant.getOutputs() instead."); // use the single output for compatibility. outputs.get(0).setOutputFile(outputFile); } @Override @NonNull @Deprecated public File getOutputFile() { // if more than one output, refuse to use this method if (outputs.size() > 1) { throw new RuntimeException(String.format( "More than one output on variant '%s', cannot call getOutputFile() on it. Call it on one of its outputs instead.", getName())); } // deprecation warning. plugin.displayDeprecationWarning("variant.getOutputFile() is deprecated. Call it on one of variant.getOutputs() instead."); // use the single output for compatibility. return outputs.get(0).getOutputFile(); } @Override @NonNull @Deprecated public ManifestProcessorTask getProcessManifest() { // if more than one output, refuse to use this method if (outputs.size() > 1) { throw new RuntimeException(String.format( "More than one output on variant '%s', cannot call getProcessManifest() on it. Call it on one of its outputs instead.", getName())); } // deprecation warning. plugin.displayDeprecationWarning("variant.getProcessManifest() is deprecated. Call it on one of variant.getOutputs() instead."); // use the single output for compatibility. return outputs.get(0).getProcessManifest(); } @Override @NonNull @Deprecated public ProcessAndroidResources getProcessResources() { // if more than one output, refuse to use this method if (outputs.size() > 1) { throw new RuntimeException(String.format( "More than one output on variant '%s', cannot call getProcessResources() on it. Call it on one of its outputs instead.", getName())); } // deprecation warning. plugin.displayDeprecationWarning("variant.getProcessResources() is deprecated. Call it on one of variant.getOutputs() instead."); // use the single output for compatibility. return outputs.get(0).getProcessResources(); } }