/*
 * Copyright 2018 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.
 */

import androidx.build.SupportConfig
import static androidx.build.dependencies.DependenciesKt.GUAVA

buildscript {
    // TODO: Remove this when this test app no longer depends on 1.0.0 of vectordrawable-animated.
    // vectordrawable and vectordrawable-animated were accidentally using the same package name
    // which is no longer valid in namespaced resource world.
    project.ext['android.uniquePackageNames'] = false
}

plugins {
    id("AndroidXPlugin")
    id("com.android.application")
}

// replace all tests etc with empty task, so we don't run anything
// it is more effective then task.enabled = false, because we avoid executing deps as well
def reentrance = false
project.tasks.whenTaskAdded { task ->
    if (task instanceof org.gradle.api.tasks.testing.Test
            || task.name.startsWith("assemble")
            || task.name == "lint"
            || task.name == "transformDexArchiveWithExternalLibsDexMergerForPublicDebug"
            || task.name == "transformResourcesWithMergeJavaResForPublicDebug"
            || task.name == "checkPublicDebugDuplicateClasses") {
        if (!reentrance) {
            reentrance = true
            project.tasks.named(task.name) {
                actions = []
                dependsOn = []
            }
            reentrance = false
        }
    }
}

// Also replace some tasks that will have already been created (and not trigger `whenTaskAdded`)
project.tasks.named("lint") {
    actions = []
    dependsOn = []
}

android {
    defaultConfig {
        minSdkVersion SupportConfig.TARGET_SDK_VERSION
        javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = false
    }

    sourceSets {
        main {
            manifest.srcFile "AndroidManifest.xml"
        }
    }
    flavorDimensions "library-group"
}

configurations.all {
    /*
    * Room uses auto-common which depends on a version of Guava which strictly depends on a
    * version of checkerframework that is different from the one we specify. This forces the same
    * resolution strategy for Guava that is used by room and media already so that the compatible
    * version of checkerframeworks is also used
    */
    resolutionStrategy {
        force GUAVA
    }
}

