/*
 * 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'
        }
    }

    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"
    }
}