apply plugin: 'android-library'

archivesBaseName = 'support-v13'

// --------------------------
// TO ADD NEW PLATFORM SPECIFIC CODE, UPDATE THIS:
// create and configure the sourcesets/dependencies for platform-specific code.
// values are: sourceset name, source folder name, api level, previous sourceset.

ext.allSS = []

def icsSS          = createApiSourceset('ics',          'ics',           '14',      null)
def icsMr1SS       = createApiSourceset('icsmr1',       'ics-mr1',       '15',      icsSS)

def createApiSourceset(String name, String folder, String apiLevel, SourceSet previousSource) {
    def sourceSet = sourceSets.create(name)
    sourceSet.java.srcDirs = [folder]

    def configName = sourceSet.getCompileConfigurationName()

    project.getDependencies().add(configName, getAndroidPrebuilt(apiLevel))
    if (previousSource != null) {
        setupDependencies(configName, previousSource)
    }
    ext.allSS.add(sourceSet)
    return sourceSet
}

def setupDependencies(String configName, SourceSet previousSourceSet) {
    project.getDependencies().add(configName, previousSourceSet.output)
    project.getDependencies().add(configName, previousSourceSet.compileClasspath)
}

// create a jar task for the code above
tasks.create(name: "internalJar", type: Jar) {
    baseName "internal_impl"
}

ext.allSS.each { ss ->
    internalJar.from ss.output
}

dependencies {
    compile project(':support-v4')

    // add the internal implementation as a dependency.
    // this is not enough to make the regular compileJava task
    // depend on the generation of this jar. This is done below
    // when manipulating the libraryVariants.
    compile files(internalJar.archivePath)
}

android {
    compileSdkVersion 13
    buildToolsVersion "19.0.1"

    defaultConfig {
        minSdkVersion 13
        // TODO: get target from branch
        //targetSdkVersion 19
    }


    sourceSets {
        main.manifest.srcFile 'AndroidManifest.xml'
        main.java.srcDirs = ['java']
        main.aidl.srcDirs = ['java']

        androidTest.setRoot('tests')
        androidTest.java.srcDir 'tests/java'
    }

    lintOptions {
        // TODO: fix errors and reenable.
        abortOnError false
    }
}

android.libraryVariants.all { variant ->
    variant.javaCompile.dependsOn internalJar

    def name = variant.buildType.name

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

    def jarTask = project.tasks.create(name: "jar${suffix}", type: Jar){
        dependsOn variant.javaCompile
        from variant.javaCompile.destinationDir
        from 'LICENSE.txt'
    }
    def javadocTask = project.tasks.create(name: "javadoc${suffix}", type: Javadoc) {
        source android.sourceSets.main.allJava
        classpath = files(variant.javaCompile.classpath.files) + files(
                "${android.plugin.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar")
    }

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

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

    project.ext.allSS.each { ss ->
        javadocTask.source ss.allJava
        sourcesJarTask.from ss.allSource
    }

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

uploadArchives {
    repositories {
        mavenDeployer {

            repository(url: uri(rootProject.ext.supportRepoOut)) {
            }

            pom.project {
                name 'Android Support Library v13'
                description "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 13 or later."
                url 'http://developer.android.com/tools/extras/support-library.html'
                inceptionYear '2011'

                licenses {
                    license {
                        name 'The Apache Software License, Version 2.0'
                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                        distribution 'repo'
                    }
                }

                scm {
                    url "http://source.android.com"
                    connection "scm:git:https://android.googlesource.com/platform/frameworks/support"
                }
                developers {
                    developer {
                        name 'The Android Open Source Project'
                    }
                }
            }
        }
    }
}
