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" == System.getenv("CI")
def preDexEnabled = "true" == 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 29

    defaultConfig {
        versionCode 1012051
        versionName getVersionName()

        testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
        minSdkVersion 14
        //noinspection ExpiredTargetSdkVersion
        targetSdkVersion 25
        /*
          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
            shrinkResources true
            buildConfigField "String", "PRIVILEGED_EXTENSION_PACKAGE_NAME", privilegedExtensionApplicationId
            buildConfigField "String", "ACRA_REPORT_EMAIL", '"reports@f-droid.org"' // String needs both quotes
            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"
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_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
                }
                systemProperty 'robolectric.dependency.repo.url', 'https://repo1.maven.org/maven2'

                // hack to avoid memory leak crashes
                forkEvery = 1
            }
        }
    }

    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 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.preference:preference:1.1.1'
    implementation 'androidx.gridlayout:gridlayout:1.0.0'
    implementation 'androidx.annotation:annotation:1.1.0'
    implementation 'androidx.recyclerview:recyclerview:1.1.0'
    implementation 'androidx.cardview:cardview:1.0.0'
    implementation 'androidx.vectordrawable:vectordrawable:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'androidx.palette:palette:1.0.0'
    implementation 'androidx.work:work-runtime:2.4.0'

    implementation 'com.google.android.material:material:1.1.0'

    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.11.1'
    implementation 'com.fasterxml.jackson.core:jackson-annotations:2.11.1'
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.1'

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

    testImplementation 'androidx.test:core:1.3.0'
    testImplementation 'junit:junit:4.13.1'
    testImplementation 'org.robolectric:robolectric:4.3'
    testImplementation 'org.mockito:mockito-core:3.3.3'
    testImplementation 'org.hamcrest:hamcrest:2.2'
    testImplementation 'org.bouncycastle:bcprov-jdk15on:1.65'

    androidTestImplementation 'androidx.arch.core:core-testing:2.1.0'
    androidTestImplementation 'androidx.test:core:1.3.0'
    androidTestImplementation 'androidx.test:runner:1.3.0'
    androidTestImplementation 'androidx.test:rules:1.3.0'
    androidTestImplementation 'androidx.test:monitor:1.3.0'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
    androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
    androidTestImplementation 'androidx.work:work-testing:2.4.0'
}

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]) {}
