/*
 * SPDX-FileCopyrightText: 2021 The Calyx Institute
 * SPDX-License-Identifier: Apache-2.0
 */

plugins {
    id 'com.android.library'
    id 'com.google.protobuf'
    id 'org.jetbrains.kotlin.android'
    id 'org.jetbrains.kotlin.kapt'
    id 'org.jetbrains.dokka'
    id 'org.jlleitschuh.gradle.ktlint'
}

android {
    compileSdkVersion rootProject.ext.compileSdkVersion

    defaultConfig {
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        testInstrumentationRunnerArguments disableAnalytics: 'true'

        consumerProguardFiles "consumer-rules.pro"
    }

    buildTypes {
        all {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    }
    kotlinOptions {
        jvmTarget = JavaVersion.VERSION_11.toString()
        languageVersion = "1.7"
        freeCompilerArgs += '-opt-in=kotlin.RequiresOptIn'
        freeCompilerArgs += '-Xexplicit-api=strict'
    }
    protobuf {
        protoc {
            artifact = "com.google.protobuf:protoc:$protobuf_version"
        }
        generateProtoTasks {
            all().each { task ->
                task.builtins {
                    java {
                        option "lite"
                    }
                }
            }
        }
    }
    lintOptions {
        disable "DialogFragmentCallbacksDetector",
                "InvalidFragmentVersionForActivityResult",
                "CheckedExceptions"
    }
}

kotlin {
    explicitApi = 'strict'
}

dependencies {
    implementation rootProject.ext.kotlin_libs.std

    implementation rootProject.ext.std_libs.androidx_core
    // A newer version gets pulled in with AOSP via core, so we include fragment here explicitly
    implementation rootProject.ext.std_libs.androidx_fragment
    implementation rootProject.ext.std_libs.androidx_activity
    implementation rootProject.ext.std_libs.androidx_lifecycle_viewmodel_ktx
    implementation rootProject.ext.std_libs.androidx_lifecycle_livedata_ktx
    implementation rootProject.ext.std_libs.androidx_constraintlayout
    implementation rootProject.ext.std_libs.androidx_documentfile
    implementation rootProject.ext.std_libs.com_google_android_material

    implementation rootProject.ext.storage_libs.androidx_room_runtime
    implementation rootProject.ext.storage_libs.com_google_protobuf_javalite
    implementation rootProject.ext.storage_libs.com_google_crypto_tink_android
    kapt('androidx.room:room-compiler') {
        version { strictly "$room_version" }
    }

    lintChecks rootProject.ext.lint_libs.exceptions

    testImplementation "junit:junit:$junit4_version"
    testImplementation "io.mockk:mockk:$mockk_version"
    testImplementation "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"

    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation "androidx.test.espresso:espresso-core:$espresso_version"
}

apply from: "${rootProject.rootDir}/gradle/ktlint.gradle"
