buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2"
    }
}

// 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: com.jfrog.bintray.gradle.BintrayPlugin
apply plugin: 'maven-publish'

project.ext.group = 'com.android.volley'
project.ext.archivesBaseName = 'volley'
project.ext.version = '1.0.0'
project.ext.pomDesc = 'Volley Android library'

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
}

artifacts {
    archives javadocJar
    archives sourcesJar
}

publishing {
    publications {
        library(MavenPublication) {
            groupId project.ext.group
            artifactId project.ext.archivesBaseName
            version project.ext.version

            // Release AAR, Sources, and JavaDoc
            artifact "$buildDir/outputs/aar/volley-release.aar"
            artifact sourcesJar
            artifact javadocJar
        }
    }
}

bintray {
    user = System.env.BINTRAY_USER
    key = System.env.BINTRAY_USER_KEY

    publications = [ 'library' ]

    publish = project.has("release")
    pkg {
        userOrg = 'android'
        repo = 'android-utils'
        group = project.ext.group
        name = project.ext.group + '.' + project.ext.archivesBaseName
        desc = project.ext.pomDesc
        licenses = [ 'Apache-2.0' ]
        websiteUrl = 'https://tools.android.com'
        issueTrackerUrl = 'https://code.google.com/p/android/'
        vcsUrl = 'https://android.googlesource.com/platform/frameworks/volley.git'
        labels = ['android', 'volley', 'network']
        publicDownloadNumbers = true

        version {
            name = project.ext.version
            desc = project.ext.pomDesc + ' version ' + project.ext.version
            gpg {
                sign = true
                passphrase = System.env.GPG_PASSPHRASE
            }
        }
    }
}
