/*
 * Copyright (C) 2020 The Dagger Authors.
 *
 * 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'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    defaultConfig {
        applicationId "dagger.hilt.android.gradleConfigCache"
        minSdkVersion 15
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "dagger.hilt.android.gradleConfigCache.TestRunner"
    }
    compileOptions {
        sourceCompatibility 1.8
        targetCompatibility 1.8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
    testOptions {
        unitTests.includeAndroidResources = true
    }
}

hilt {
    enableTransformForLocalTests = true
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'androidx.activity:activity-ktx:1.1.0'
    implementation 'androidx.multidex:multidex:2.0.0'
    implementation 'com.google.dagger:hilt-android:LOCAL-SNAPSHOT'
    kapt 'com.google.dagger:hilt-compiler:LOCAL-SNAPSHOT'

    testImplementation 'junit:junit:4.13'
    testImplementation 'androidx.test.ext:junit:1.1.2'
    testImplementation 'androidx.test:runner:1.3.0'
    testImplementation 'org.robolectric:robolectric:4.5-alpha-3'
    testImplementation 'com.google.dagger:hilt-android-testing:LOCAL-SNAPSHOT'
    kaptTest 'com.google.dagger:hilt-compiler:LOCAL-SNAPSHOT'

    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test:runner:1.3.0'
    androidTestImplementation 'com.google.dagger:hilt-android-testing:LOCAL-SNAPSHOT'
    kaptAndroidTest 'com.google.dagger:hilt-compiler:LOCAL-SNAPSHOT'
}
