apply plugin: 'com.android.library'

group = "io.grpc"
version = "1.20.0-SNAPSHOT" // CURRENT_GRPC_VERSION
description = 'gRPC: Android'

buildscript {
    repositories {
        google()
        jcenter()
        mavenCentral()
        maven { url "https://plugins.gradle.org/m2/" }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
        classpath "net.ltgt.gradle:gradle-errorprone-plugin:0.6"
        classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
    }
}

apply plugin: "net.ltgt.errorprone"
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: "signing"

android {
    compileSdkVersion 27
    defaultConfig {
        consumerProguardFiles "proguard-rules.txt"
        minSdkVersion 14
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    lintOptions { abortOnError false }
}

repositories {
    mavenCentral()
    mavenLocal()
}

dependencies {
    errorprone 'com.google.errorprone:error_prone_core:2.3.2'
    errorproneJavac 'com.google.errorprone:javac:9+181-r4173-1'

    implementation 'io.grpc:grpc-core:1.20.0-SNAPSHOT' // CURRENT_GRPC_VERSION

    testImplementation 'io.grpc:grpc-okhttp:1.20.0-SNAPSHOT' // CURRENT_GRPC_VERSION
    testImplementation 'junit:junit:4.12'
    testImplementation 'org.robolectric:robolectric:3.7.1'
    testImplementation 'com.google.truth:truth:0.39'
}

signing {
    required false
    sign configurations.archives
}

task javadocs(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    // TODO(ericgribkoff) Fix javadoc errors
    failOnError false
    options {
        // Disable JavaDoc doclint on Java 8.
        if (JavaVersion.current().isJava8Compatible()) {
            addStringOption('Xdoclint:none', '-quiet')
        }
    }
}

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

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

artifacts {
    archives sourcesJar
    archives javadocsJar
}

uploadArchives.repositories.mavenDeployer {
    beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
    if (rootProject.hasProperty('repositoryDir')) {
        repository(url: new File(rootProject.repositoryDir).toURI())
    } else {
        String stagingUrl
        if (rootProject.hasProperty('repositoryId')) {
            stagingUrl = 'https://oss.sonatype.org/service/local/staging/deployByRepositoryId/' +
                    rootProject.repositoryId
        } else {
            stagingUrl = 'https://oss.sonatype.org/service/local/staging/deploy/maven2/'
        }
        def configureAuth = {
            if (rootProject.hasProperty('ossrhUsername') && rootProject.hasProperty('ossrhPassword')) {
                authentication(userName: rootProject.ossrhUsername, password: rootProject.ossrhPassword)
            }
        }
        repository(url: stagingUrl, configureAuth)
        snapshotRepository(url: 'https://oss.sonatype.org/content/repositories/snapshots/', configureAuth)
    }
}

[
    install.repositories.mavenInstaller,
    uploadArchives.repositories.mavenDeployer,
]*.pom*.whenConfigured { pom ->
    pom.project {
        name "$project.group:$project.name"
        description project.description
        url 'https://conscrypt.org/'

        scm {
            connection 'scm:git:https://github.com/grpc/grpc-java.git'
            developerConnection 'scm:git:git@github.com:grpc/grpc-java.git'
            url 'https://github.com/grpc/grpc-java'
        }

        licenses {
            license {
                name 'Apache 2.0'
                url 'https://opensource.org/licenses/Apache-2.0'
            }
        }

        developers {
            developer {
                id "grpc.io"
                name "gRPC Contributors"
                email "grpc-io@googlegroups.com"
                url "https://grpc.io/"
                organization = "gRPC Authors"
                organizationUrl "https://www.google.com"
            }
        }
    }
    def core = pom.dependencies.find {dep -> dep.artifactId == 'grpc-core'}
    if (core != null) {
        // Depend on specific version of grpc-core because internal package is unstable
        core.version = "[" + core.version + "]"
    }
}
