// You should change this after releasing a new version of the Baku Toolkit. See the
// list of published versions at https://repo1.maven.org/maven2/io/v/baku-toolkit.
version = '0.7.0'
group = 'io.v'

def siteUrl = 'https://github.com/vanadium/java'
def gitUrl = 'https://github.com/vanadium/java.git'
def pkgDesc = 'Utilities for writing applications with distributed user interfaces'

apply plugin: 'android-sdk-manager'
apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
/*
You might have to download JDK8 and set JAVA8_HOME (or set the jdk to Java 8 via Project Structure).
For detailed instructions, see https://github.com/evant/gradle-retrolambda
 */
apply plugin: 'me.tatarka.retrolambda'

archivesBaseName = 'baku-toolkit'

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        minSdkVersion 21
    }

    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
    }
}

dependencies {
    provided(
            /*
            https://projectlombok.org/setup/android.html
            Follow Android Studio instructions at the bottom of the page to install the Lombok
            Plugin.
             */
            'org.projectlombok:lombok:1.16.6',
            'org.slf4j:slf4j-api:1.7.12'
    )

    androidTestCompile 'org.slf4j:slf4j-android:1.7.12'

    testCompile(
            'org.mockito:mockito-core:1.10.19',
            'org.powermock:powermock-classloading-xstream:1.6.3',
            'org.powermock:powermock-module-junit4:1.6.3',
            'org.powermock:powermock-module-junit4-rule:1.6.3',
            'org.slf4j:slf4j-simple:1.7.12'
    )

    testCompile('org.powermock:powermock-api-mockito:1.6.3') {
        exclude module: 'mockito-all'
    }

    compile(
            /*
            Ideally this would be optional, but this unexpectedly becomes required if you touch
            the Baku CollectionBinding Builder, even if you don't actually try to bind to a
            RecyclerView.
             */
            'com.android.support:recyclerview-v7:23.0.1',
            'com.jakewharton.rxbinding:rxbinding:0.3.0',
            'commons-io:commons-io:2.4',
            'io.reactivex:rxandroid:1.1.0',
            'io.reactivex:rxjava:1.0.17',
            'io.reactivex:rxjava-async-util:0.21.0',
            'io.v:vanadium-android:1.7',
            'net.javacrumbs.future-converter:future-converter-guava-rxjava:0.3.0',
            'net.sourceforge.streamsupport:streamsupport:1.3.2',
            'org.robotninjas:fluent-futures:1.0'
    )

    compile fileTree(dir: 'libs', include: ['*.jar'])

    /*
    Word of caution: for local unit tests, Android log statements fail with
    UnsatisfiedLinkError (hence the slf4j-simple implementation for testCompile).

    Applications should include a suitable runtime binding, such as
    apk ('org.slf4j:slf4j-android:1.7.12')
    */
}

install {
    repositories.mavenInstaller {
        pom {
            project {
                packaging 'aar'

                name 'Baku Toolkit'
                description pkgDesc
                url siteUrl

                licenses {
                    license {
                        name 'New BSD License'
                        url 'https://github.com/vanadium/java/blob/master/LICENSE'
                        distribution 'repo'
                    }
                }
                scm {
                    connection gitUrl
                    url siteUrl
                }
                developers {
                    developer {
                        id 'vanadium'
                        name 'The Vanadium Contributors'
                        email 'vanadium-discuss@v.io'
                    }
                }
            }
        }
    }
}

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

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

    if (JavaVersion.current().isJava8Compatible()) {
        // TODO(rosswang): Can we get rid of this?
        options.addStringOption('Xdoclint:none', '-quiet')
    }
}

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

artifacts {
    archives javadocJar
    archives sourcesJar
}

tasks.bintrayUpload.dependsOn(tasks.install)

def artifactPrefix = archivesBaseName + '-' + version

bintray {
    user = project.properties.bintrayUsername
    key = project.properties.bintrayApiKey

    configurations = ['archives']

    pkg {
        desc = pkgDesc
        websiteUrl = siteUrl
        vcsUrl = gitUrl
        repo = group
        name = archivesBaseName
        licenses = ['BSD New']
        userOrg = 'vanadium'
        publish = true

        version {
            name = project.version
            gpg {
                sign = true
            }
        }
    }
}
