/*
 * Copyright (C) 2021 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.
 */

apply plugin: 'com.android.library'

android {
    compileSdkVersion gradle.ext.aaosLatestSDK

    defaultConfig {
        minSdkVersion 28
        targetSdkVersion gradle.ext.aaosTargetSDK
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

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

        androidTest.setRoot('tests/unittests')
        androidTest.java.srcDirs = ['tests/unittests/src']
    }

    testOptions {
        animationsDisabled = true
    }
}

dependencies {
    runtimeOnly 'androidx.legacy:legacy-support-v4:1.0.0'

    implementation 'com.github.bumptech.glide:glide:4.12.0'
    implementation 'com.google.guava:guava:30.1.1-android'
    implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.31'

    implementation project(':car-apps-common')

    implementation files(gradle.ext.lib_car_system_stubs)

    androidTestImplementation 'com.google.truth:truth:1.1.3'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'org.mockito:mockito-android:3.12.4'
    androidTestImplementation 'androidx.test:runner:1.4.0'
    androidTestImplementation 'androidx.test:rules:1.4.0'
    androidTestImplementation 'androidx.test:core:1.4.0'
}
