/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
buildscript {
    dependencies {
        classpath "com.android.tools.build:gradle:${dataBindingConfig.androidPluginVersion}"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
apply plugin: 'com.android.library'

android {
    compileSdkVersion dataBindingConfig.compileSdkVersion
    buildToolsVersion dataBindingConfig.buildToolsVersion
    dataBinding {
        enabled = true
        addDefaultAdapters = false
    }
    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility dataBindingConfig.javaTargetCompatibility
        targetCompatibility dataBindingConfig.javaSourceCompatibility
    }
    packagingOptions {
        exclude 'META-INF/services/javax.annotation.processing.Processor'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
    }
}

dependencies {
    provided 'com.android.support:support-v4:+'
    provided 'com.android.support:cardview-v7:+'
    provided 'com.android.support:appcompat-v7:+'
}

//create jar tasks
android.libraryVariants.all { variant ->
    def name = variant.buildType.name

    if (name.equals(com.android.builder.core.BuilderConstants.DEBUG)) {
        return; // Skip debug builds.
    }
    def suffix = name.capitalize()

    def javadocTask = project.tasks.create(name: "javadoc${suffix}", type: Javadoc) {
        source variant.javaCompile.source
        classpath = files(variant.javaCompile.classpath.files) + files(
                "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar")
    }

    def javadocJarTask = project.tasks.create(name: "javadocJar${suffix}", type: Jar) {
        classifier = 'javadoc'
        from 'build/docs/javadoc'
    }
    javadocJarTask.dependsOn javadocTask

    def sourcesJarTask = project.tasks.create(name: "sourceJar${suffix}", type: Jar) {
        classifier = 'sources'
        from android.sourceSets.main.java.srcDirs
    }

    artifacts.add('archives', javadocJarTask);
    artifacts.add('archives', sourcesJarTask);
}

uploadArchives {
    repositories {
        mavenDeployer {
            pom.artifactId = "adapters"
            pom.project {
                licenses {
                    license {
                        name dataBindingConfig.licenseName
                        url dataBindingConfig.licenseUrl
                        distribution dataBindingConfig.licenseDistribution
                    }
                }
            }
        }
    }
}


task prebuild(type : Copy) {
    dependsOn uploadArchives
    from "$buildDir/outputs/aar/baseAdapters-release.aar"
    into dataBindingConfig.prebuildFolder
    rename { String fileName ->
        "databinding-adapters.aar"
    }
}