blob: e0c47c89a3bc398be76a25278ba2f48e6c6f8992 [file] [log] [blame]
/*
* Copyright (C) 2014 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.annotations.Nullable;
import com.android.build.FilterData;
import com.android.build.OutputFile;
import com.android.build.VariantOutput;
import com.android.build.gradle.api.ApkOutputFile;
import com.android.build.gradle.internal.scope.VariantOutputScope;
import com.android.build.gradle.tasks.ManifestProcessorTask;
import com.android.build.gradle.tasks.PackageSplitAbi;
import com.android.build.gradle.tasks.PackageSplitRes;
import com.android.build.gradle.tasks.ProcessAndroidResources;
import com.android.utils.StringHelper;
import com.google.common.collect.ImmutableList;
import org.gradle.api.Task;
import java.io.File;
import java.util.Collection;
import java.util.concurrent.Callable;
/**
* Base output data about a variant.
*/
public abstract class BaseVariantOutputData implements VariantOutput {
private static final String UNIVERSAL = "universal";
@NonNull
public final BaseVariantData<?> variantData;
@NonNull
private final ApkOutputFile mainApkOutputFile;
private boolean multiOutput = false;
public ManifestProcessorTask manifestProcessorTask;
public ProcessAndroidResources processResourcesTask;
public PackageSplitRes packageSplitResourcesTask;
public PackageSplitAbi packageSplitAbiTask;
public Task assembleTask;
@NonNull
private final VariantOutputScope scope;
public BaseVariantOutputData(
@NonNull OutputFile.OutputType outputType,
@NonNull Collection<FilterData> filters,
@NonNull BaseVariantData<?> variantData) {
this.variantData = variantData;
this.mainApkOutputFile = new ApkOutputFile(
outputType, filters, getOutputFilePromise());
scope = new VariantOutputScope(variantData.getScope(), this);
}
@Nullable
@Override
public ApkOutputFile getMainOutputFile() {
return mainApkOutputFile;
}
private Callable<File> getOutputFilePromise() {
return new Callable<File>() {
@Override
public File call() throws Exception {
return getOutputFile();
}
};
}
public abstract void setOutputFile(@NonNull File file);
@Nullable
public abstract File getOutputFile();
@NonNull
@Override
public abstract ImmutableList<ApkOutputFile> getOutputs();
@NonNull
public String getFullName() {
if (!multiOutput) {
return variantData.getVariantConfiguration().getFullName();
}
return variantData.getVariantConfiguration().computeFullNameWithSplits(getFilterName());
}
@NonNull
public String getBaseName() {
if (!multiOutput) {
return variantData.getVariantConfiguration().getBaseName();
}
return variantData.getVariantConfiguration().computeBaseNameWithSplits(getFilterName());
}
@NonNull
public String getDirName() {
if (!multiOutput) {
return variantData.getVariantConfiguration().getDirName();
}
return variantData.getVariantConfiguration().computeDirNameWithSplits(
mainApkOutputFile.getFilter(OutputFile.DENSITY),
mainApkOutputFile.getFilter(OutputFile.ABI));
}
@NonNull
private String getFilterName() {
if (mainApkOutputFile.getFilters().isEmpty()) {
return UNIVERSAL;
}
StringBuilder sb = new StringBuilder();
String densityFilter = mainApkOutputFile.getFilter(OutputFile.DENSITY);
if (densityFilter != null) {
sb.append(densityFilter);
}
String abiFilter = mainApkOutputFile.getFilter(OutputFile.ABI);
if (abiFilter != null) {
if (sb.length() > 0) {
sb.append(StringHelper.capitalize(abiFilter));
} else {
sb.append(abiFilter);
}
}
return sb.toString();
}
@NonNull
@Override
public File getSplitFolder() {
return getOutputFile().getParentFile();
}
void setMultiOutput(boolean multiOutput) {
this.multiOutput = multiOutput;
}
@NonNull
public VariantOutputScope getScope() {
return scope;
}
}