boolean getBooleanValue(Project proj, String propertyName, boolean defaultValue) {
    return proj.providers.gradleProperty(propertyName)
            .map { Boolean.valueOf(it) }
            .orElse(defaultValue)
            .get()
}

/**
 * Helper build script that reads data binding variables and sets up the projects.
 */
def root = ext.dataBindingRootFolder
Properties databindingProperties = new Properties()
databindingProperties.load(new FileInputStream("${root}/databinding.properties"))

// load android gradle plugin's version file
apply from: "${root}/../buildSrc/base/version.gradle"
databindingProperties.version = ext.buildVersion
databindingProperties.androidPluginVersion=ext.buildVersion
databindingProperties.isIndependent = rootProject.name.equals("data-binding")
databindingProperties.compileSdkVersion = databindingProperties.compileSdkVersionStr.trim()

ext.dataBindingConfig = databindingProperties
databindingProperties.artifactOutFolder = "${root}/../../out/repo"
def addRemoteRepos = getBooleanValue(project, "addRemoteRepos", false)
ext.dataBindingConfig.addRemoteRepos = addRemoteRepos
def dataBindingConfig = ext.dataBindingConfig

def localRepositories = ["${root}/../../prebuilts/tools/common/offline-m2",
                         "${root}/../../prebuilts/gradle-plugin",
                         "${root}/../../prebuilts/tools/common/m2/repository",
                         "${root}/../../prebuilts/maven_repo/android",
                         databindingProperties.artifactOutFolder]
ext.dataBindingConfig.localRepositories = localRepositories
ext.dataBindingConfig.mavenRepoDir = rootProject.file("${databindingProperties.mavenRepoDir}").absolutePath
def addRepos(RepositoryHandler handler) {
    dataBindingConfig.localRepositories.each { repo ->
        handler.maven {
            url repo
        }
    }
    if (dataBindingConfig.addRemoteRepos) {
        handler.jcenter()
        handler.mavenCentral()
    }
}
ext.addRepos = this.&addRepos
subprojects {
    buildscript {
        addRepos(repositories)
    }
    repositories {
        addRepos(repositories)
    }
}

def enablePublishing(p, addJavadoc) {
    if (!dataBindingConfig.isIndependent) {
        p.plugins.apply('com.android.tools.publish')
    }
}
ext.enablePublishing = this.&enablePublishing
