blob: 29e6a372f66702c30a0b3e78828488d543a62d2c [file] [log] [blame]
/*
* Copyright (C) 2012 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.SdkConstants
import com.android.build.gradle.api.AndroidSourceDirectorySet
import com.android.build.gradle.api.AndroidSourceFile
import com.android.build.gradle.api.AndroidSourceSet
import com.android.build.gradle.internal.api.artifact.SourceArtifactType
import com.android.build.gradle.internal.dependency.VariantDependencies.CONFIG_NAME_ANNOTATION_PROCESSOR
import com.android.build.gradle.internal.dependency.VariantDependencies.CONFIG_NAME_API
import com.android.build.gradle.internal.dependency.VariantDependencies.CONFIG_NAME_APK
import com.android.build.gradle.internal.dependency.VariantDependencies.CONFIG_NAME_COMPILE
import com.android.build.gradle.internal.dependency.VariantDependencies.CONFIG_NAME_COMPILE_ONLY
import com.android.build.gradle.internal.dependency.VariantDependencies.CONFIG_NAME_IMPLEMENTATION
import com.android.build.gradle.internal.dependency.VariantDependencies.CONFIG_NAME_PROVIDED
import com.android.build.gradle.internal.dependency.VariantDependencies.CONFIG_NAME_PUBLISH
import com.android.build.gradle.internal.dependency.VariantDependencies.CONFIG_NAME_RUNTIME_ONLY
import com.android.build.gradle.internal.dependency.VariantDependencies.CONFIG_NAME_WEAR_APP
import com.android.builder.model.SourceProvider
import com.android.utils.appendCapitalized
import groovy.lang.Closure
import org.gradle.api.Project
import org.gradle.api.tasks.SourceSet
import org.gradle.util.ConfigureUtil
import org.gradle.util.GUtil
import java.io.File
import javax.inject.Inject
open class DefaultAndroidSourceSet @Inject constructor(
private val name: String,
project: Project,
private val publishPackage: Boolean
) : AndroidSourceSet, SourceProvider {
private val javaSource: AndroidSourceDirectorySet
private val javaResources: AndroidSourceDirectorySet
private val manifest: AndroidSourceFile
private val assets: AndroidSourceDirectorySet
private val res: AndroidSourceDirectorySet
private val aidl: AndroidSourceDirectorySet
private val renderscript: AndroidSourceDirectorySet
private val jni: AndroidSourceDirectorySet
private val jniLibs: AndroidSourceDirectorySet
private val shaders: AndroidSourceDirectorySet
private val displayName : String = GUtil.toWords(this.name)
init {
javaSource = DefaultAndroidSourceDirectorySet(
"$displayName Java source", project, SourceArtifactType.JAVA_SOURCES
)
javaSource.filter.include("**/*.java")
javaResources = DefaultAndroidSourceDirectorySet(
"$displayName Java resources",
project,
SourceArtifactType.JAVA_RESOURCES
)
javaResources.filter.exclude("**/*.java", "**/*.kt")
manifest = DefaultAndroidSourceFile("$displayName manifest", project)
assets = DefaultAndroidSourceDirectorySet(
"$displayName assets", project, SourceArtifactType.ASSETS
)
res = DefaultAndroidSourceDirectorySet(
"$displayName resources",
project,
SourceArtifactType.ANDROID_RESOURCES
)
aidl = DefaultAndroidSourceDirectorySet(
"$displayName aidl", project, SourceArtifactType.AIDL
)
renderscript = DefaultAndroidSourceDirectorySet(
"$displayName renderscript",
project,
SourceArtifactType.RENDERSCRIPT
)
jni = DefaultAndroidSourceDirectorySet(
"$displayName jni", project, SourceArtifactType.JNI
)
jniLibs = DefaultAndroidSourceDirectorySet(
"$displayName jniLibs", project, SourceArtifactType.JNI_LIBS
)
shaders = DefaultAndroidSourceDirectorySet(
"$displayName shaders", project, SourceArtifactType.SHADERS
)
initRoot("src/$name")
}
override fun getName(): String {
return name
}
override fun toString(): String {
return "source set $displayName"
}
private fun getName(config: String): String {
return if (name == SourceSet.MAIN_SOURCE_SET_NAME) {
config
} else {
name.appendCapitalized(config)
}
}
override fun getApiConfigurationName() = getName(CONFIG_NAME_API)
override fun getCompileOnlyConfigurationName() = getName(CONFIG_NAME_COMPILE_ONLY)
override fun getImplementationConfigurationName() = getName(CONFIG_NAME_IMPLEMENTATION)
override fun getRuntimeOnlyConfigurationName() = getName(CONFIG_NAME_RUNTIME_ONLY)
@Suppress("OverridingDeprecatedMember")
override fun getCompileConfigurationName() = getName(CONFIG_NAME_COMPILE)
@Suppress("OverridingDeprecatedMember")
override fun getPackageConfigurationName(): String {
if (publishPackage) {
return getName(CONFIG_NAME_PUBLISH)
}
return getName(CONFIG_NAME_APK)
}
@Suppress("OverridingDeprecatedMember")
override fun getProvidedConfigurationName() = getName(CONFIG_NAME_PROVIDED)
override fun getWearAppConfigurationName() = getName(CONFIG_NAME_WEAR_APP)
override fun getAnnotationProcessorConfigurationName()
= getName(CONFIG_NAME_ANNOTATION_PROCESSOR)
override fun getManifest(): AndroidSourceFile {
return manifest
}
override fun manifest(configureClosure: Closure<*>): AndroidSourceSet {
ConfigureUtil.configure(configureClosure, getManifest())
return this
}
override fun getRes(): AndroidSourceDirectorySet {
return res
}
override fun res(configureClosure: Closure<*>): AndroidSourceSet {
ConfigureUtil.configure(configureClosure, getRes())
return this
}
override fun getAssets(): AndroidSourceDirectorySet {
return assets
}
override fun assets(configureClosure: Closure<*>): AndroidSourceSet {
ConfigureUtil.configure(configureClosure, getAssets())
return this
}
override fun getAidl(): AndroidSourceDirectorySet {
return aidl
}
override fun aidl(configureClosure: Closure<*>): AndroidSourceSet {
ConfigureUtil.configure(configureClosure, getAidl())
return this
}
override fun getRenderscript(): AndroidSourceDirectorySet {
return renderscript
}
override fun renderscript(configureClosure: Closure<*>): AndroidSourceSet {
ConfigureUtil.configure(configureClosure, getRenderscript())
return this
}
override fun getJni(): AndroidSourceDirectorySet {
return jni
}
override fun jni(configureClosure: Closure<*>): AndroidSourceSet {
ConfigureUtil.configure(configureClosure, getJni())
return this
}
override fun getJniLibs(): AndroidSourceDirectorySet {
return jniLibs
}
override fun jniLibs(configureClosure: Closure<*>): AndroidSourceSet {
ConfigureUtil.configure(configureClosure, getJniLibs())
return this
}
override fun shaders(configureClosure: Closure<*>): AndroidSourceSet {
ConfigureUtil.configure(configureClosure, getShaders())
return this
}
override fun getShaders(): AndroidSourceDirectorySet {
return shaders
}
override fun getJava(): AndroidSourceDirectorySet {
return javaSource
}
override fun java(configureClosure: Closure<*>): AndroidSourceSet {
ConfigureUtil.configure(configureClosure, java)
return this
}
override fun getResources(): AndroidSourceDirectorySet {
return javaResources
}
override fun resources(configureClosure: Closure<*>): AndroidSourceSet {
ConfigureUtil.configure(configureClosure, resources)
return this
}
override fun setRoot(path: String): AndroidSourceSet {
return initRoot(path)
}
private fun initRoot(path: String): AndroidSourceSet {
javaSource.setSrcDirs(listOf("$path/java"))
javaResources.setSrcDirs(listOf("$path/resources"))
res.setSrcDirs(listOf("$path/${SdkConstants.FD_RES}"))
assets.setSrcDirs(listOf("$path/${SdkConstants.FD_ASSETS}"))
manifest.srcFile("$path/${SdkConstants.FN_ANDROID_MANIFEST_XML}")
aidl.setSrcDirs(listOf("$path/aidl"))
renderscript.setSrcDirs(listOf("$path/rs"))
jni.setSrcDirs(listOf("$path/jni"))
jniLibs.setSrcDirs(listOf("$path/jniLibs"))
shaders.setSrcDirs(listOf("$path/shaders"))
return this
}
// --- SourceProvider
override fun getJavaDirectories(): Set<File> {
return java.srcDirs
}
override fun getResourcesDirectories(): Set<File> {
return resources.srcDirs
}
override fun getManifestFile(): File {
return getManifest().srcFile
}
override fun getAidlDirectories(): Set<File> {
return getAidl().srcDirs
}
override fun getRenderscriptDirectories(): Set<File> {
return getRenderscript().srcDirs
}
override fun getCDirectories(): Set<File> {
return getJni().srcDirs
}
override fun getCppDirectories(): Set<File> {
// The C and C++ directories are currently the same. This may change in the future when
// we use Gradle's native source sets.
return getJni().srcDirs
}
override fun getResDirectories(): Set<File> {
return getRes().srcDirs
}
override fun getAssetsDirectories(): Set<File> {
return getAssets().srcDirs
}
override fun getJniLibsDirectories(): Collection<File> {
return getJniLibs().srcDirs
}
override fun getShadersDirectories(): Collection<File> {
return getShaders().srcDirs
}
}