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

/* gets the version name from the latest Git tag */
def getVersionName = { ->
    def stdout = new ByteArrayOutputStream()
    exec {
        commandLine 'git', 'describe', '--tags', '--always'
        standardOutput = stdout
    }
    return stdout.toString().trim()
}

def isCi = "true".equals(System.getenv("CI"))
def preDexEnabled = "true".equals(System.getProperty("pre-dex", "true"))

def fullApplicationId = "org.fdroid.fdroid"
def basicApplicationId = "org.fdroid.basic"
// yes, this actually needs both quotes https://stackoverflow.com/a/41391841
def privilegedExtensionApplicationId = '"org.fdroid.fdroid.privileged"'

android {
    compileSdkVersion 27
    buildToolsVersion '27.0.3'

    defaultConfig {
        versionCode 1008002
        versionName getVersionName()

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        /*
          The Android Testing Support Library collects analytics to continuously improve the testing
          experience. More specifically, it uploads a hash of the package name of the application
          under test for each invocation. If you do not wish to upload this data, you can opt-out by
          passing the following argument to the test runner: disableAnalytics "true".
         */
        testInstrumentationRunnerArguments disableAnalytics: 'true'
    }

    buildTypes {
        // use proguard on debug too since we have unknowingly broken
        // release builds before.
        all {
            minifyEnabled true
            useProguard true
            shrinkResources true
            buildConfigField "String", "PRIVILEGED_EXTENSION_PACKAGE_NAME", privilegedExtensionApplicationId
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            testProguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro', 'src/androidTest/proguard-rules.pro'
        }
        debug {
            applicationIdSuffix ".debug"
            resValue "string", "applicationId", fullApplicationId + applicationIdSuffix
            versionNameSuffix "-debug"
            println 'buildTypes.debug defaultConfig.versionCode ' + defaultConfig.versionCode
        }
    }

    flavorDimensions "base"
    productFlavors {
        full {
            dimension "base"
            applicationId fullApplicationId
            resValue "string", "applicationId", fullApplicationId
        }
        basic {
            dimension "base"
            applicationId basicApplicationId
            resValue "string", "applicationId", basicApplicationId
        }
    }

    compileOptions {
        compileOptions.encoding = "UTF-8"
    }

    aaptOptions {
        cruncherEnabled = false
    }

    dexOptions {
        // Improve build server performance by allowing disabling of pre-dexing
        // see http://tools.android.com/tech-docs/new-build-system/tips#TOC-Improving-Build-Server-performance
        // Skip pre-dexing when running on CI or when disabled via -Dpre-dex=false.
        preDexLibraries = preDexEnabled && !isCi
    }

    testOptions {
        unitTests {
            includeAndroidResources = true
            // prevent tests from dying on android.util.Log calls
            returnDefaultValues = true
            all {
                // All the usual Gradle options.
                testLogging {
                    events "skipped", "failed", "standardOut", "standardError"
                    showStandardStreams = true
                }
            }
        }
    }

    sourceSets {
        test {
            java.srcDirs += "$projectDir/src/testShared/java"
        }

        androidTest {
            java.srcDirs += "$projectDir/src/testShared/java"
        }
    }

    lintOptions {
        checkReleaseBuilds false
        abortOnError true

        htmlReport true
        xmlReport false
        textReport false

        lintConfig file("lint.xml")
    }

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

dependencies {
    implementation 'com.android.support:support-v4:27.1.1'
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support:gridlayout-v7:27.1.1'
    implementation 'com.android.support:support-annotations:27.1.1'
    implementation 'com.android.support:recyclerview-v7:27.1.1'
    implementation 'com.android.support:cardview-v7:27.1.1'
    implementation 'com.android.support:design:27.1.1'
    implementation 'com.android.support:support-vector-drawable:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.android.support:palette-v7:27.1.1'
    implementation 'com.android.support:preference-v14:27.1.1'

    implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
    implementation 'com.google.zxing:core:3.3.3'
    implementation 'info.guardianproject.netcipher:netcipher:2.0.0-beta1'
    implementation 'info.guardianproject.panic:panic:1.0'
    implementation 'commons-io:commons-io:2.6'
    implementation 'commons-net:commons-net:3.6'
    implementation 'ch.acra:acra:4.9.1'
    implementation 'io.reactivex:rxjava:1.1.0'
    implementation 'com.hannesdorfmann:adapterdelegates3:3.0.1'
    implementation 'com.ashokvarma.android:bottom-navigation-bar:2.0.5'

    implementation 'com.fasterxml.jackson.core:jackson-core:2.8.11'
    implementation 'com.fasterxml.jackson.core:jackson-annotations:2.8.11'
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.8.11'

    implementation 'org.bouncycastle:bcprov-jdk15on:1.60'
    fullImplementation 'org.bouncycastle:bcpkix-jdk15on:1.60'
    fullImplementation 'cc.mvdan.accesspoint:library:0.2.0'
    fullImplementation 'org.jmdns:jmdns:3.5.5'
    fullImplementation 'org.nanohttpd:nanohttpd:2.3.1'

    testImplementation 'org.robolectric:robolectric:3.8'
    testImplementation "com.android.support.test:monitor:1.0.2"
    testImplementation 'org.bouncycastle:bcprov-jdk15on:1.60'
    testImplementation 'junit:junit:4.12'
    testImplementation 'org.mockito:mockito-core:2.7.22'

    androidTestImplementation 'com.android.support:support-annotations:27.1.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test:rules:1.0.2'
    androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.3'
}

checkstyle {
    toolVersion = '7.2'
}

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

    classpath = files()
}

pmd {
    toolVersion = '6.20.0'
    consoleOutput = true
}

task pmdMain(type: Pmd) {
    dependsOn 'assembleDebug'
    ruleSetFiles = files("${project.rootDir}/config/pmd/rules.xml", "${project.rootDir}/config/pmd/rules-main.xml")
    ruleSets = [] // otherwise defaults clash with the list in rules.xml
    source 'src/main/java'
    include '**/*.java'
}

task pmdTest(type: Pmd) {
    dependsOn 'assembleDebug'
    ruleSetFiles = files("${project.rootDir}/config/pmd/rules.xml", "${project.rootDir}/config/pmd/rules-test.xml")
    ruleSets = [] // otherwise defaults clash with the list in rules.xml
    source 'src/test/java', 'src/androidTest/java'
    include '**/*.java'
}

task pmd(dependsOn: [pmdMain, pmdTest]) {}