apply plugin: 'com.android.application'
apply plugin: 'witness'
apply plugin: 'checkstyle'
apply plugin: 'pmd'

repositories {
    jcenter()
}

dependencies {
    compile project(':privileged-api-lib')

    compile 'com.android.support:support-v4:23.2.1'
    compile 'com.android.support:appcompat-v7:23.2.1'
    compile 'com.android.support:support-annotations:23.2.1'

    compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
    compile 'com.google.zxing:core:3.2.1'
    compile 'eu.chainfire:libsuperuser:1.0.0.201602271131'
    compile 'cc.mvdan.accesspoint:library:0.1.3'
    compile 'info.guardianproject.netcipher:netcipher:1.2.1'
    compile 'commons-net:commons-net:3.4'
    compile 'org.openhab.jmdns:jmdns:3.4.2'
    compile('ch.acra:acra:4.8.2') {
        exclude module: 'support-v4'
        exclude module: 'support-annotations'
    }
    compile 'io.reactivex:rxjava:1.1.0'
    compile 'io.reactivex:rxandroid:0.23.0'

    androidTestCompile 'commons-io:commons-io:2.4'
}

if (!hasProperty('sourceDeps')) {

    repositories {
        // This is here until we sort out all dependencies from mavenCentral/jcenter. Once all of
        // the dependencies below have been sorted out, this can be removed.
        flatDir {
            dirs 'libs/binaryDeps'
        }
    }

    dependencies {
        compile 'com.madgag.spongycastle:pkix:1.53.0.0'
        compile 'com.madgag.spongycastle:prov:1.53.0.0'
        compile 'com.madgag.spongycastle:core:1.53.0.0'

        // Upstream doesn't have a binary on mavenCentral/jcenter yet:
        // https://github.com/kolavar/android-support-v4-preferencefragment/issues/13
        compile(name: 'support-v4-preferencefragment-release', ext: 'aar')

        // Fork for F-Droid, including support for https. Not merged into upstream
        // yet (seems to be a little unsupported as of late), so not using mavenCentral/jcenter.
        compile(name: 'nanohttpd-2.1.0')

        // Upstream doesn't have a binary on mavenCentral, and it is an SVN repo on
        // Google Code.  We include this code directly in this repo, and have made
        // modifications that should be pushed to anyone who wants to maintain it.
        compile(name: 'zipsigner')
    }

    // Only do the libraries imported from maven repositories. Our own libraries
    // (like privileged-api-lib) and the prebuilt jars already checked into the
    // source code don't need to be here.
    dependencyVerification {
        verify = [
            'com.android.support:support-v4:81ce890f26d35c75ad17d0f998a7e3230330c3b41e0b629566bc744bee89e448',
            'com.android.support:appcompat-v7:00f9d93acacd6731f309724054bf51492814b4b2869f16d7d5c0038dcb8c9a0d',
            'com.android.support:support-annotations:786ab0d060774fb95cfdaf4878771e14b85733b1af9d72a4aae762dc7c1dff9f',
            'com.nostra13.universalimageloader:universal-image-loader:dbd5197ffec3a8317533190870a7c00ff3750dd6a31241448c6a5522d51b65b4',
            'com.google.zxing:core:b4d82452e7a6bf6ec2698904b332431717ed8f9a850224f295aec89de80f2259',
            'eu.chainfire:libsuperuser:018344ff19ee94d252c14b4a503ee8b519184db473a5af83513f5837c413b128',
            'cc.mvdan.accesspoint:library:dc89a085d6bc40381078b8dd7776b12bde0dbaf8ffbcddb17ec4ebc3edecc7ba',
            'commons-net:commons-net:38cf2eca826b8bcdb236fc1f2e79e0c6dd8e7e0f5c44a3b8e839a1065b2fbe2e',
            'info.guardianproject.netcipher:netcipher:611ec5bde9d799fd57e1efec5c375f9f460de2cdda98918541decc9a7d02f2ad',
            'org.openhab.jmdns:jmdns:7a4b34b5606bbd2aff7fdfe629edcb0416fccd367fb59a099f210b9aba4f0bce',
            'com.madgag.spongycastle:pkix:6aba9b2210907a3d46dd3dcac782bb3424185290468d102d5207ebdc9796a905',
            'com.madgag.spongycastle:prov:029f26cd6b67c06ffa05702d426d472c141789001bcb15b7262ed86c868e5643',
            'com.madgag.spongycastle:core:9b6b7ac856b91bcda2ede694eccd26cefb0bf0b09b89f13cda05b5da5ff68c6b',
            'ch.acra:acra:bc12400f7fe0c86d238c0daa269bff2b785e5403d601d6874622d87e8be64771',
            'io.reactivex:rxjava:2c162afd78eba217cdfee78b60e85d3bfb667db61e12bc95e3cf2ddc5beeadf6',
            'io.reactivex:rxandroid:35c1a90f8c1f499db3c1f3d608e1f191ac8afddb10c02dd91ef04c03a0a4bcda',
        ]
    }

} else {

    logger.info "Setting up *source* dependencies for F-Droid (because you passed in the -PsourceDeps argument to gradle while building)."

    dependencies {
        compile(project(':extern:support-v4-preferencefragment')) {
            exclude module: 'support-v4'
        }
        compile project(':extern:nanohttpd:core')
        compile project(':extern:zipsigner')
    }

    task binaryDeps(type: Copy, dependsOn: ':F-Droid:prepareReleaseDependencies') {

        enabled = project.hasProperty('sourceDeps')
        description = "Copies .jar and .aar files from subproject dependencies in extern/ to F-Droid/libs. Requires the sourceDeps property to be set (\"gradle -PsourceDeps binaryDeps\")"

        from('../extern/') {
            include 'support-v4-preferencefragment/build/outputs/aar/support-v4-preferencefragment-release.aar'
            include 'nanohttpd/core/build/libs/nanohttpd-2.1.0.jar'
            include 'zipsigner/build/libs/zipsigner.jar'
        }

        into 'libs/binaryDeps'
        includeEmptyDirs false

        eachFile { FileCopyDetails details ->
            // Don't copy to a sub folder such as libs/binaryDeps/Project/build/outputs/aar/project.aar, but
            // rather libs/binaryDeps/project.aar.
            details.path = details.name
        }
    }
}

android {
    compileSdkVersion 23
    buildToolsVersion '23.0.2'
    useLibrary 'org.apache.http.legacy'

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

        androidTest.setRoot('test')
        androidTest {
            manifest.srcFile 'test/AndroidManifest.xml'
            java.srcDirs = ['test/src']
            resources.srcDirs = ['test/src']
            aidl.srcDirs = ['test/src']
            renderscript.srcDirs = ['test/src']
            res.srcDirs = ['test/res']
            assets.srcDirs = ['test/assets']
        }
    }

    buildTypes {
        // use proguard on debug too since we have unknowingly broken
        // release builds before.
        all {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            testCoverageEnabled = true
        }
    }

    compileOptions {
        compileOptions.encoding = "UTF-8"

        // Use Java 1.7, requires minSdk 8
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }

    lintOptions {
        checkReleaseBuilds false
        abortOnError false

        htmlReport true
        xmlReport false
        textReport false

        // Our translations are crowd-sourced
        disable 'MissingTranslation'

        // We have locale folders like "values-he" and "values-id" as symlinks
        // since some devices ship deprecated locale codes
        disable 'LocaleFolder'

        // Like supportsRtl or parentActivityName. They are on purpose.
        disable 'UnusedAttribute'
    }

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

checkstyle {
    toolVersion = '6.16'
}

task checkstyle(type: Checkstyle) {
    configFile file("${project.rootDir}/config/checkstyle/checkstyle.xml")
    source 'src', 'test/src'
    include '**/*.java'

    classpath = files()
}

pmd {
    toolVersion = '5.4.1'
    consoleOutput = true
}

task pmd(type: Pmd, dependsOn: assembleDebug) {
    ruleSets = [
        //'java-basic',
        //'java-unusedcode',
        'java-android',
        'java-clone',
        'java-finalizers',
        'java-imports',
        'java-migrating',
    ]
    source 'src'
    include '**/org/fdroid/**/*.java'
}

// This person took the example code below from another blogpost online, however
// I lost the reference to it:
// http://stackoverflow.com/questions/23297562/gradle-javadoc-and-android-documentation
android.applicationVariants.all { variant ->

    task("generate${variant.name}Javadoc", type: Javadoc) {
        title = "$name $version API"
        description "Generates Javadoc for F-Droid."
        source = variant.javaCompile.source

        def sdkDir
        Properties properties = new Properties()
        File localProps = project.rootProject.file('local.properties')
        if (localProps.exists()) {
            properties.load(localProps.newDataInputStream())
            sdkDir = properties.getProperty('sdk.dir')
        } else {
            sdkDir = System.getenv('ANDROID_HOME')
        }
        if (!sdkDir) {
            throw new ProjectConfigurationException("Cannot find android sdk. Make sure sdk.dir is defined in local.properties or the environment variable ANDROID_HOME is set.", null)
        }

        ext.androidJar = "${sdkDir}/platforms/${android.compileSdkVersion}/android.jar"
        classpath = files(variant.javaCompile.classpath.files) + files(ext.androidJar)
        options.links("http://docs.oracle.com/javase/7/docs/api/");
        options.links("http://d.android.com/reference/");
        exclude '**/BuildConfig.java'
        exclude '**/R.java'
    }
}