/*
 * 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.application'

android {
    compileSdkVersion gradle.ext.aaosLatestSDK
    defaultConfig {
        applicationId "com.android.car.messenger"
        minSdkVersion 30
        targetSdkVersion gradle.ext.aaosLatestSDK
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    lintOptions {
        abortOnError false
    }
    buildTypes {
        release {
            minifyEnabled false
        }
    }

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

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

    testOptions {
        animationsDisabled = true
    }

    buildTypes {
        debug {
            testCoverageEnabled = true
        }
    }

    signingConfigs {
        debug {
            // The following signs the apk with platform key.
            storeFile file('../../../../vendor/google/certs/devkeys/platform.keystore')
            storePassword 'android'
        }
    }
}

dependencies {
    implementation files(gradle.ext.lib_car_system_stubs)

    implementation "androidx.constraintlayout:constraintlayout:2.0.0-beta8"

    def lifecycle_version = "2.2.0"
    implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
    // Not available in 2.3+
    implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"

    implementation "androidx.legacy:legacy-support-v4:1.0.0"
    implementation "androidx.preference:preference:1.1.1"
    implementation "androidx.annotation:annotation:1.0.1"

    implementation project(":car-assist-lib")
    implementation project(":car-messenger-common:model")
    implementation project(":car-telephony-common")
    implementation project(":car-ui-lib")

    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test:core:1.4.0'
    androidTestImplementation 'androidx.test:rules:1.4.0'
    androidTestImplementation 'androidx.test:runner:1.4.0'
    androidTestImplementation 'com.google.truth:truth:1.1.3'
    androidTestImplementation 'com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.1'
}
