diff options
author | Yigit Boyar <yboyar@google.com> | 2015-05-16 15:42:45 -0700 |
---|---|---|
committer | Yigit Boyar <yboyar@google.com> | 2015-05-18 13:32:28 -0700 |
commit | 9399cb4e3d86a88507fb06ad57661105b1eaa69a (patch) | |
tree | 4c686452cbb3162437d1326b2224c4f8ecdf72a2 /gradlePlugin/src | |
parent | 17cfa0bf8bf0b35f36f13f7dfb561856d9ad8420 (diff) | |
download | data-binding-9399cb4e3d86a88507fb06ad57661105b1eaa69a.tar.gz |
Configure dependencies using the plugin
This CL changes gradle plugin to automatically include necessary
dependencies for data binding. This way, just applying data
binding to a project will be sufficient.
I've also updated version to .9 to get ready for preview release
Bug: 21262586
Change-Id: I12ba64915e69b383b507d155c1a16267356e059b
Diffstat (limited to 'gradlePlugin/src')
-rw-r--r-- | gradlePlugin/src/main/kotlin/plugin.kt | 69 |
1 files changed, 58 insertions, 11 deletions
diff --git a/gradlePlugin/src/main/kotlin/plugin.kt b/gradlePlugin/src/main/kotlin/plugin.kt index ec731f77..ec0e2dc8 100644 --- a/gradlePlugin/src/main/kotlin/plugin.kt +++ b/gradlePlugin/src/main/kotlin/plugin.kt @@ -16,6 +16,8 @@ package android.databinding.tool +import android.databinding.parser.log +import android.databinding.tool.expr.Dependency import org.gradle.api.Plugin import org.gradle.api.Project import com.android.build.gradle.AppExtension @@ -37,34 +39,78 @@ import com.android.build.gradle.api.TestVariant import com.android.build.gradle.internal.variant.TestVariantData import com.android.build.gradle.internal.api.TestVariantImpl import com.android.ide.common.res2.ResourceSet +import org.apache.commons.io.IOUtils +import org.gradle.api.artifacts +import org.gradle.api.internal.artifacts.dependencies.DefaultExternalModuleDependency +import org.gradle.api.logging.LogLevel import java.io.FileFilter import java.io.FilenameFilter import java.util.ArrayList +import javax.inject.Inject import javax.xml.xpath.XPathFactory import kotlin.dom.elements import kotlin.dom.parseXml +import kotlin.properties.Delegates +import org.gradle.api.logging.Logger +import org.gradle.api.plugins.ExtraPropertiesExtension -class DataBinderPlugin : Plugin<Project> { + +open class DataBinderPlugin : Plugin<Project> { val XPATH_BINDING_CLASS = "/layout/data/@class" + var logger : Logger by Delegates.notNull() inner class GradleFileWriter(var outputBase: String) : JavaFileWriter() { override fun writeToFile(canonicalName: String, contents: String) { val f = File("$outputBase/${canonicalName.replaceAll("\\.", "/")}.java") - log("Asked to write to ${canonicalName}. outputting to:${f.getAbsolutePath()}") + logD("Asked to write to ${canonicalName}. outputting to:${f.getAbsolutePath()}") f.getParentFile().mkdirs() f.writeText(contents, "utf-8") } } + fun readMyVersion() : String { + val stream = javaClass.getResourceAsStream("/data_binding_build_info") + return IOUtils.toString(stream, "utf-8").trim() + } + override fun apply(project: Project?) { if (project == null) return + + logger = project.getLogger() + + var myVersion = readMyVersion() + logD("data binding plugin version is ${myVersion}") + if (myVersion == "") { + throw IllegalStateException("cannot read version of the plugin :/") + } + + project.getDependencies().add("compile", "com.android.databinding:library:$myVersion") + var addAdapters = true + if (project.hasProperty("ext")) { + val ext = project.getProperties().get("ext") + if (ext is ExtraPropertiesExtension) { + if (ext.has("addDataBindingAdapters")) { + addAdapters = ext.get("addDataBindingAdapters") as Boolean + } + } + } + if (addAdapters) { + project.getDependencies().add("compile", "com.android.databinding:adapters:$myVersion") + } + project.getDependencies().add("provided", "com.android.databinding:annotationprocessor:$myVersion") project.afterEvaluate { createXmlProcessor(project) } } - fun log(s: String) { - System.out.println("[qwqw data binding]: $s") + fun logD(s: String) { + log(LogLevel.DEBUG, s) + } + fun logE(s: String) { + log(LogLevel.ERROR, s) + } + fun log(level : LogLevel, s: String) { + logger.log(level, "[data binding plugin]: $s") } fun createXmlProcessor(p: Project) { @@ -77,19 +123,20 @@ class DataBinderPlugin : Plugin<Project> { } else if (androidExt is LibraryExtension) { createXmlProcessorForLibrary(p, androidExt) } else { - throw RuntimeException("cannot understand android extension. What is it? ${androidExt}") + logE("unsupported android extension. What is it? ${androidExt}") + throw RuntimeException("unsupported android extension. What is it? ${androidExt}") } } fun createXmlProcessorForLibrary(project : Project, lib : LibraryExtension) { val sdkDir = lib.getSdkDirectory() lib.getTestVariants().forEach { variant -> - log("test variant $variant. dir name ${variant.getDirName()}") + logD("test variant $variant. dir name ${variant.getDirName()}") val variantData = getVariantData(variant) attachXmlProcessor(project, variantData, sdkDir, false)//tests extend apk variant } lib.getLibraryVariants().forEach { variant -> - log("lib variant $variant . dir name ${variant.getDirName()}") + logD("lib variant $variant . dir name ${variant.getDirName()}") val variantData = getVariantData(variant) attachXmlProcessor(project, variantData, sdkDir, true) } @@ -144,7 +191,7 @@ class DataBinderPlugin : Plugin<Project> { minSdkVersion.getApiLevel(), isLibrary) val processResTask = generateRTask val xmlOutDir = File("${project.getBuildDir()}/layout-info/${configuration.getDirName()}") - log("xml output for ${variantData} is ${xmlOutDir}") + logD("xml output for ${variantData} is ${xmlOutDir}") val layoutTaskName = "dataBindingLayouts${processResTask.getName().capitalize()}" val infoClassTaskName = "dataBindingInfoClass${processResTask.getName().capitalize()}" @@ -157,10 +204,10 @@ class DataBinderPlugin : Plugin<Project> { task.xmlProcessor = xmlProcessor task.sdkDir = sdkDir task.xmlOutFolder = xmlOutDir - Log.d { "TASK adding dependency on ${task} for ${processResTask}" } + logD("TASK adding dependency on ${task} for ${processResTask}") processResTask.dependsOn(task) processResTask.getDependsOn().filterNot { it == task }.forEach { - Log.d { "adding dependency on ${it} for ${task}" } + logD("adding dependency on ${it} for ${task}") task.dependsOn(it) } processResTask.doLast { @@ -198,7 +245,7 @@ class DataBinderPlugin : Plugin<Project> { customBindings.forEach { packageTask.exclude("${it.replace('.', '/')}.class") } - log("excludes ${packageTask.getExcludes()}") + logD("excludes ${packageTask.getExcludes()}") } } |