/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// Library-level build file

apply plugin: 'com.android.library'
apply plugin: 'jacoco'

android {
    compileSdkVersion 30

    defaultConfig {
        minSdkVersion 28
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    sourceSets {
        main {
            res.srcDirs = [
                    'src/main/res',
                    'src/main/res-private'
            ]
        }
    }

    testOptions {
        unitTests {
            includeAndroidResources = true
        }
        animationsDisabled = true
    }

    buildTypes {
        debug {
            testCoverageEnabled = true
        }
    }

    project.gradle.taskGraph.whenReady {
        connectedDebugAndroidTest {
            ignoreFailures = true
        }
    }

    // This is the gradle equivalent of the libs: ["android.car"] in the Android.bp
    useLibrary 'android.car'

    useLibrary 'android.test.runner'
    useLibrary 'android.test.base'
    useLibrary 'android.test.mock'
}

dependencies {
    compileOnly project(':oem-apis')
    api project(':car-rotary-lib')
    api 'androidx.annotation:annotation:1.2.0'
    api 'androidx.appcompat:appcompat:1.2.0'
    api 'androidx.constraintlayout:constraintlayout:2.0.4'
    api 'androidx.preference:preference:1.1.1'
    api 'androidx.recyclerview:recyclerview:1.2.0'
    api 'androidx.core:core:1.3.2'
    api "androidx.asynclayoutinflater:asynclayoutinflater:1.0.0"
    implementation 'com.android.support:support-annotations:28.0.0'

    testImplementation "androidx.test.ext:junit:1.1.2"
    testImplementation 'org.robolectric:robolectric:4.3.1'
    testImplementation "org.mockito:mockito-core:2.19.0"
    testImplementation "com.google.truth:truth:1.1.2"
    testImplementation "org.testng:testng:6.9.9"
    // Required for local unit tests (JUnit 4 framework)
    testImplementation 'junit:junit:4.13.2'

    androidTestImplementation 'org.hamcrest:hamcrest-library:1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
    androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.3.0'
    androidTestImplementation "com.google.truth:truth:1.1.2"
    androidTestImplementation "androidx.test.ext:junit:1.1.2"
    androidTestImplementation "org.mockito:mockito-core:2.19.0"
    androidTestImplementation 'androidx.test:runner:1.3.0'
    androidTestImplementation 'androidx.test:rules:1.3.0'
    // This is needed to be able to spy certain classes with Mockito
    // It's major/minor version must match Mockito's.
    androidTestImplementation 'com.linkedin.dexmaker:dexmaker-mockito-inline:2.19.0'
    // Required for instrumented tests
    androidTestImplementation 'com.android.support:support-annotations:28.0.0'
}
