/**
 * This is *NOT* the main build script for F-Droid.  The main build.gradle
 * is in F-Droid/build.gradle. Usually multi-project builds don't have a
 * build.gradle in the top level directory (http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Dependencies-Android-Libraries-and-Multi-project-setup).
 *
 * This build script contains miscellaneous hacks to ensure that all of
 * F-Droids dependencies can be built from source.
 * Each hack should be documented, and in the future, may need to be changed
 * in order to ensure that we keep pace with any changes upstream makes to
 * their build processes.
 *
 *  - Some subprojects don't have gradle build scripts, so they are setup here.
 *
 *  - The android support libraries make a lot of dependencies about the project
 *    two folders up from themselves, which we will have to provide for them.
 */

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0'
    }
}

project(':extern:UniversalImageLoader:library') {

    apply plugin: 'android-library'

    android {
        compileSdkVersion 16
        buildToolsVersion '21.1.2'

        sourceSets {
            main {
                manifest.srcFile 'AndroidManifest.xml'
                java.srcDirs = ['src']
                resources.srcDirs = ['src']
                aidl.srcDirs = ['src']
                renderscript.srcDirs = ['src']
                res.srcDirs = ['res']
                assets.srcDirs = ['assets']
            }
        }
    }
}

// The support-annotations build.gradle uses the mavenDeployer method, which requires
// this plugin. Even though no artifacts are being deployed, this is still required
// for the build script to work.
project(':support-annotations') {

    apply plugin: 'maven'

}

project(':extern:zipsigner') {

    apply plugin: 'java'

    dependencies {
        compile project(':extern:spongycastle:core')
        compile project(':extern:spongycastle:pkix')
        compile project(':extern:spongycastle:prov')
    }
}

project(':support-v4') {

    apply plugin: 'maven'

    // The support-v4 library assumes certain things are defined in the
    // root project (which is usually the android-support project, but
    // this time it is the F-Droid project.
    rootProject.ext.supportRepoOut = ""

}

/**
 * Finds a reference to the prefered Android SDK directory.
 * Ideally we'd use "android.plugin.sdkFolder" to find this, however this is
 * only possible if we apply the android application plugin. This is not ideal,
 * because it will add a bunch of tasks to do with building an android app,
 * even tnough this build.gradle is not here to build F-Droid, it is here to
 * apply hacks to play nicely with various upstream projects.
 *
 * Adapted from https://android.googlesource.com/platform/tools/base/+/c8b776289ace4189406b59a9a9c8c9de63271cb0/build-system/gradle/src/main/groovy/com/android/build/gradle/internal/SdkHandler.java
 *   Copyright (C) 2014 The Android Open Source Project
 *   Licensed under the Apache License, Version 2.0
 *   http://www.apache.org/licenses/LICENSE-2.0i
 */
def findSdkPath() {

    Properties properties = new Properties()
    File propFile = file("local.properties")
    if (propFile.exists()) {
        propFile.withReader { properties.load(it) }
    }

    String sdkDirProp = properties.getProperty("sdk.dir");
    if (sdkDirProp != null) {
        return new File(sdkDirProp)
    }

    String envVar = System.getenv("ANDROID_HOME");
    if (envVar != null) {
        return new File(envVar);
    }

    String property = System.getProperty("android.home");
    if (property != null) {
        return new File(property);
    }

    def error = """
Couldn't find Android SDK. Looked for (in order of precedence):
 * sdk.dir in $propFile
 * ANDROID_HOME environment variable
 * android.home Java property
"""

    throw new RuntimeException(error)
}

// Used by the support-v4 libraries build script.
FileCollection getAndroidPrebuilt(String apiLevel) {

    def file = new File("${findSdkPath()}/platforms/android-$apiLevel/android.jar")
    if (!file.exists()) {
        def msg = """
Android SDK for android-$apiLevel not found (required for building support library).
Expected to find it at $file.
Do you have that SDK installed?
(If it is not visible in the Android SDK Manager, "Packages -> Show Obsolete Packages")
"""
        throw new RuntimeException(msg)
    }

    return files(file)

}

subprojects {

    // This is the hacky way which we force the subprojects to use the same build tools:
    // http://stackoverflow.com/a/21032272
    afterEvaluate {
        if ( it.hasProperty( 'android' ) ) {
            android {

                // The android build task only lets you configure the buildToolsVersion once, so if
                // we execute the closure below to configure our subprojects, it will fail when it
                // hits the second subproject. Therefore, we will only do it once, and I guess the
                // android plugin will re-use the existing value I set.
                // https://android.googlesource.com/platform/tools/build/+/master/gradle/src/main/groovy/com/android/build/gradle/BaseExtension.groovy
                try {
                    buildToolsVersion '21.1.2'
                    logger.info("Set buildToolsVersion to '21.1.2'")
                } catch (GradleException e) {
                    logger.info("Tried to set the buildToolsVersion, however we were not allowed to: $e.message")
                }

                // don't abort build on lint errors
                // http://stackoverflow.com/a/25149514
                configure(android.lintOptions) {
                    abortOnError false
                }
            }
        }
    }
}
