buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.0.0"
    }
}

// apply the plugin with its class name rather than its Id to work around gradle limitation of
// not being able to find the plugin by Id despite the dependencies being added right above. Gradle
// is currently not capable of loading plugins by Id if the dependency is anywhere else than
// in the main project build.gradle. This file is "imported" into the project's build.gradle
// through a "apply from:".
apply plugin: org.jfrog.gradle.plugin.artifactory.ArtifactoryPlugin
apply plugin: 'maven-publish'

def bintrayInfoFilePath = "$buildDir/outputs/bintray-descriptor.bintray-info.json"

project.ext.version = '1.1.0-SNAPSHOT'

task sourcesJar(type: Jar) {
    classifier = 'sources'
    from android.sourceSets.main.java.srcDirs
}

task javadoc(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}

task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}

task bintrayInfoFile {
    outputs.file(bintrayInfoFilePath)
    doLast {
        println 'Creating bintray-info.json'
        String fileContent = new File("$rootDir/bintray-info-template.json").getText('UTF-8')
        fileContent = fileContent.replace('$VERSION$', project.ext.version)
        ((new File(bintrayInfoFilePath))).write(fileContent)
    }
}

artifacts {
    archives javadocJar
    archives sourcesJar
}

publishing {
    publications {
        library(MavenPublication) {
            groupId 'com.android.volley'
            artifactId 'volley'
            version project.ext.version
            pom {
                packaging 'aar'
            }

            // Release AAR, Sources, and JavaDoc
            artifact "$buildDir/outputs/aar/volley-release.aar"
            artifact sourcesJar
            artifact javadocJar
            artifact(bintrayInfoFilePath) {
                builtBy bintrayInfoFile
                extension "bintray-info.json"
            }
        }
    }
}

artifactory {
    contextUrl = "https://oss.jfrog.org"
    publish {
        repository {
            repoKey = 'oss-snapshot-local'
            username = System.env.CI_DEPLOY_USERNAME
            password = System.env.CI_DEPLOY_PASSWORD
        }
        defaults {
            publications('library')
            publishArtifacts = true
        }
    }
    resolve {
        repoKey = 'jcenter'
    }
}
