Unify top-level API task configuration

Explicitly disables API tasks for camera modules that are missing API
files -- filed b/161377155 to track fix.

Bug: 129362030
Test: ./gradlew bOS
Change-Id: Ibf71bb38177f3cbdc1078cfddf3f4488d176ad5c
diff --git a/buildSrc/src/main/kotlin/androidx/build/AndroidXExtension.kt b/buildSrc/src/main/kotlin/androidx/build/AndroidXExtension.kt
index 4bbab44..3204992 100644
--- a/buildSrc/src/main/kotlin/androidx/build/AndroidXExtension.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/AndroidXExtension.kt
@@ -96,6 +96,12 @@
         }
     private var licenses: MutableCollection<License> = ArrayList()
     var publish: Publish = Publish.NONE
+
+    /**
+     * Whether to run API tasks such as tracking and linting. The default value is
+     * [RunApiTasks.Auto], which automatically picks based on the project's properties.
+     */
+    var runApiTasks: RunApiTasks = RunApiTasks.Auto
     var failOnDeprecationWarnings = true
     var compilationTarget: CompilationTarget = CompilationTarget.DEVICE
 
@@ -154,6 +160,15 @@
     fun shouldPublish() = this == SNAPSHOT_ONLY || this == SNAPSHOT_AND_RELEASE
 }
 
+sealed class RunApiTasks {
+    /** Automatically determine whether API tasks should be run. */
+    object Auto : RunApiTasks()
+    /** Always run API tasks regardless of other project properties. */
+    data class Yes(val reason: String? = null) : RunApiTasks()
+    /** Do not run any API tasks. */
+    data class No(val reason: String) : RunApiTasks()
+}
+
 class License {
     var name: String? = null
     var url: String? = null
diff --git a/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt b/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
index 0781d14..c0555f6c 100644
--- a/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
@@ -31,9 +31,9 @@
 import androidx.build.gradle.isRoot
 import androidx.build.jacoco.Jacoco
 import androidx.build.license.configureExternalDependencyLicenseCheck
-import androidx.build.metalava.MetalavaTasks.configureAndroidProjectForMetalava
-import androidx.build.metalava.MetalavaTasks.configureJavaProjectForMetalava
-import androidx.build.resources.ResourceTasks.configureAndroidProjectForResourceTasks
+import androidx.build.checkapi.JavaApiTaskConfig
+import androidx.build.checkapi.LibraryApiTaskConfig
+import androidx.build.checkapi.configureProjectForApiTasks
 import androidx.build.studio.StudioTask
 import com.android.build.gradle.AppExtension
 import com.android.build.gradle.AppPlugin
@@ -276,8 +276,11 @@
         if (project.isDocumentationEnabled()) {
             project.configureAndroidProjectForDokka(libraryExtension, androidXExtension)
         }
-        project.configureAndroidProjectForMetalava(libraryExtension, androidXExtension)
-        project.configureAndroidProjectForResourceTasks(libraryExtension, androidXExtension)
+
+        project.configureProjectForApiTasks(
+            LibraryApiTaskConfig(libraryExtension),
+            androidXExtension
+        )
 
         project.addToProjectMap(androidXExtension)
     }
@@ -314,7 +317,11 @@
         if (project.isDocumentationEnabled()) {
             project.configureJavaProjectForDokka(extension)
         }
-        project.configureJavaProjectForMetalava(extension)
+
+        project.configureProjectForApiTasks(
+            JavaApiTaskConfig,
+            extension
+        )
 
         project.afterEvaluate {
             if (extension.publish.shouldRelease()) {
diff --git a/buildSrc/src/main/kotlin/androidx/build/checkapi/ApiTasks.kt b/buildSrc/src/main/kotlin/androidx/build/checkapi/ApiTasks.kt
new file mode 100644
index 0000000..ac67782
--- /dev/null
+++ b/buildSrc/src/main/kotlin/androidx/build/checkapi/ApiTasks.kt
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2020 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.
+ */
+
+package androidx.build.checkapi
+
+import androidx.build.AndroidXExtension
+import androidx.build.Release
+import androidx.build.RunApiTasks
+import androidx.build.isVersionedApiFileWritingEnabled
+import androidx.build.java.JavaCompileInputs
+import androidx.build.metalava.MetalavaTasks
+import androidx.build.resources.ResourceTasks
+import com.android.build.gradle.LibraryExtension
+import com.android.build.gradle.tasks.ProcessLibraryManifest
+import org.gradle.api.GradleException
+import org.gradle.api.Project
+import org.gradle.api.plugins.JavaPluginConvention
+import org.gradle.kotlin.dsl.getPlugin
+
+sealed class ApiTaskConfig
+data class LibraryApiTaskConfig(val library: LibraryExtension) : ApiTaskConfig()
+object JavaApiTaskConfig : ApiTaskConfig()
+
+private fun AndroidXExtension.shouldConfigureApiTasks(): Boolean {
+    if (!project.state.executed) {
+        throw GradleException("Project ${project.name} has not been evaluated. Extension" +
+                "properties may only be accessed after the project has been evaluated.")
+    }
+
+    when (runApiTasks) {
+        is RunApiTasks.No -> {
+            project.logger.info("Project ${project.name} has explicitly disabled API tasks with " +
+                    "reason: ${(runApiTasks as RunApiTasks.No).reason}")
+            return false
+        }
+        is RunApiTasks.Yes -> {
+            (runApiTasks as RunApiTasks.Yes).reason?.let { reason ->
+                project.logger.info("Project ${project.name} has explicitly enabled API tasks " +
+                        "with reason: $reason")
+            }
+            return true
+        }
+        else -> {}
+    }
+
+    // Tooling projects cannot track APIs.
+    if (toolingProject) {
+        project.logger.info("Project ${project.name} is tooling project, ignoring API tasks.")
+        return false
+    }
+
+    if (mavenVersion == null) {
+        project.logger.info("Project ${project.name} has no version set, ignoring API tasks.")
+        return false
+    }
+
+    // If the project has an "api" directory, either because they used to track APIs or they
+    // added one manually to force tracking (as recommended below), continue tracking APIs.
+    if (project.hasApiFileDirectory() && !publish.shouldRelease()) {
+        project.logger.error("Project ${project.name} is not published, but has an existing API " +
+                "directory. Forcing API tasks enabled. Please migrate to runApiTasks=Yes.")
+        return true
+    }
+
+    if (!publish.shouldRelease()) {
+        project.logger.info("Project ${project.name} is not published, ignoring API tasks. " +
+                "If you still want to track APIs, create an \"api\" directory in your project" +
+                " root and run the updateApi task.")
+        return false
+    }
+
+    if (publish.shouldRelease() && mavenVersion!!.isFinalApi()) {
+        throw GradleException("Project ${project.name} must track APIs before stabilizing " +
+                "for release. To do that, create an \"api\" directory in your project root " +
+                "and run the updateApi task.")
+    }
+
+    return true
+}
+
+fun Project.configureProjectForApiTasks(
+    config: ApiTaskConfig,
+    extension: AndroidXExtension
+) {
+    // afterEvaluate required to read extension properties
+    afterEvaluate {
+        if (!extension.shouldConfigureApiTasks()) {
+            return@afterEvaluate
+        }
+
+        val builtApiLocation = project.getBuiltApiLocation()
+        val versionedApiLocation = project.getVersionedApiLocation()
+        val currentApiLocation = project.getCurrentApiLocation()
+        val outputApiLocations = if (project.isVersionedApiFileWritingEnabled()) {
+            listOf(
+                versionedApiLocation,
+                currentApiLocation
+            )
+        } else {
+            listOf(
+                currentApiLocation
+            )
+        }
+
+        val javaInputs: JavaCompileInputs
+        val processManifest: ProcessLibraryManifest?
+        when (config) {
+            is LibraryApiTaskConfig -> {
+                val variant = config.library.libraryVariants.find {
+                    it.name == Release.DEFAULT_PUBLISH_CONFIG
+                } ?: return@afterEvaluate
+
+                javaInputs = JavaCompileInputs.fromLibraryVariant(
+                    config.library,
+                    variant,
+                    project
+                )
+                processManifest = config.library.buildOutputs.getByName(variant.name)
+                    .processManifestProvider.get() as ProcessLibraryManifest
+            }
+            is JavaApiTaskConfig -> {
+                val javaPluginConvention = convention.getPlugin<JavaPluginConvention>()
+                val mainSourceSet = javaPluginConvention.sourceSets.getByName("main")
+                javaInputs = JavaCompileInputs.fromSourceSet(mainSourceSet, this)
+                processManifest = null
+            }
+        }
+
+        // Note that the use of a versioned baseline file conflicts with the "don't generate
+        // versioned API files" bit. We'll cross the bridge when we get to it.
+        val baselinesApiLocation = ApiBaselinesLocation.fromApiLocation(versionedApiLocation)
+
+        MetalavaTasks.setupProject(
+            project, javaInputs, extension, processManifest, baselinesApiLocation,
+            builtApiLocation, outputApiLocations
+        )
+
+        if (config is LibraryApiTaskConfig) {
+            ResourceTasks.setupProject(
+                project, Release.DEFAULT_PUBLISH_CONFIG,
+                builtApiLocation, outputApiLocations
+            )
+        }
+    }
+}
diff --git a/buildSrc/src/main/kotlin/androidx/build/checkapi/CheckApi.kt b/buildSrc/src/main/kotlin/androidx/build/checkapi/CheckApi.kt
index bbe37d5..9f499d5 100644
--- a/buildSrc/src/main/kotlin/androidx/build/checkapi/CheckApi.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/checkapi/CheckApi.kt
@@ -16,7 +16,6 @@
 
 package androidx.build.checkapi
 
-import androidx.build.AndroidXExtension
 import androidx.build.Version
 import androidx.build.checkapi.ApiLocation.Companion.isResourceApiFile
 import androidx.build.version
@@ -29,30 +28,6 @@
     RESOURCEAPI
 }
 
-fun hasApiTasks(project: Project, extension: AndroidXExtension): Boolean {
-    if (extension.toolingProject) {
-        project.logger.info("Project ${project.name} is tooling project ignoring API tasks.")
-        return false
-    }
-
-    if (project.hasApiFileDirectory()) {
-        return true
-    }
-
-    if (!extension.publish.shouldRelease()) {
-        project.logger.info("Project ${project.name} is not published, ignoring API tasks." +
-                "If you still want to trackApi, simply create \"api\" folder in your project path")
-        return false
-    }
-
-    if (extension.publish.shouldRelease() && project.version().isFinalApi()) {
-        throw GradleException("Project ${project.name} must track API before stabilizing API\n." +
-                "To do that create \"api\" in your project directory and " +
-                "run \"./gradlew updateApi\" command")
-    }
-    return false
-}
-
 /**
  * Returns the API file containing the public API that this library promises to support
  * This is API file that checkApiRelease validates against
diff --git a/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaTasks.kt b/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaTasks.kt
index 9575ebb..a331afc 100644
--- a/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaTasks.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaTasks.kt
@@ -20,109 +20,32 @@
 import androidx.build.addToBuildOnServer
 import androidx.build.addToCheckTask
 import androidx.build.checkapi.ApiBaselinesLocation
-import androidx.build.checkapi.getBuiltApiLocation
-import androidx.build.checkapi.getVersionedApiLocation
-import androidx.build.checkapi.getCurrentApiLocation
+import androidx.build.checkapi.ApiLocation
 import androidx.build.checkapi.getRequiredCompatibilityApiLocation
-import androidx.build.checkapi.hasApiFileDirectory
-import androidx.build.checkapi.hasApiTasks
-import androidx.build.defaultPublishVariant
 import androidx.build.java.JavaCompileInputs
-import androidx.build.isVersionedApiFileWritingEnabled
 import androidx.build.uptodatedness.cacheEvenIfNoOutputs
-import com.android.build.gradle.LibraryExtension
 import com.android.build.gradle.api.LibraryVariant
 import com.android.build.gradle.tasks.ProcessLibraryManifest
 import org.gradle.api.Project
-import org.gradle.api.plugins.JavaPluginConvention
 import org.gradle.api.tasks.TaskProvider
 import org.gradle.api.tasks.bundling.Zip
 import org.gradle.api.tasks.compile.JavaCompile
-import org.gradle.kotlin.dsl.getPlugin
 import java.io.File
 
 const val CREATE_STUB_API_JAR_TASK = "createStubApiJar"
 
 object MetalavaTasks {
 
-    fun Project.configureAndroidProjectForMetalava(
-        library: LibraryExtension,
-        extension: AndroidXExtension
-    ) {
-        afterEvaluate {
-            if (!hasApiTasks(this, extension)) {
-                return@afterEvaluate
-            }
-
-            library.defaultPublishVariant { variant ->
-                if (!project.hasApiFileDirectory()) {
-                    logger.info(
-                        "Project $name doesn't have an api folder, ignoring API tasks."
-                    )
-                    return@defaultPublishVariant
-                }
-
-                val javaInputs = JavaCompileInputs.fromLibraryVariant(library, variant, project)
-                val processManifest = library.buildOutputs.getByName(variant.name)
-                    .processManifestProvider.get() as ProcessLibraryManifest
-                setupProject(this, javaInputs, extension, processManifest)
-                // TODO(aurimas): reenable this when kotlin stubs generation is working.
-                // setupStubs(this, javaInputs, variant)
-            }
-        }
-    }
-
-    fun Project.configureJavaProjectForMetalava(
-        extension: AndroidXExtension
-    ) {
-        afterEvaluate {
-            if (!hasApiTasks(this, extension)) {
-                return@afterEvaluate
-            }
-            if (!project.hasApiFileDirectory()) {
-                logger.info(
-                    "Project $name doesn't have an api folder, ignoring API tasks."
-                )
-                return@afterEvaluate
-            }
-
-            val javaPluginConvention = convention.getPlugin<JavaPluginConvention>()
-            val mainSourceSet = javaPluginConvention.sourceSets.getByName("main")
-            val javaInputs = JavaCompileInputs.fromSourceSet(mainSourceSet, this)
-            setupProject(this, javaInputs, extension)
-        }
-    }
-
-    fun applyInputs(inputs: JavaCompileInputs, task: MetalavaTask) {
-        task.sourcePaths = inputs.sourcePaths.files
-        task.dependsOn(inputs.sourcePaths)
-        task.dependencyClasspath = inputs.dependencyClasspath
-        task.bootClasspath = inputs.bootClasspath
-    }
-
     fun setupProject(
         project: Project,
         javaCompileInputs: JavaCompileInputs,
         extension: AndroidXExtension,
-        processManifest: ProcessLibraryManifest? = null
+        processManifest: ProcessLibraryManifest? = null,
+        baselinesApiLocation: ApiBaselinesLocation,
+        builtApiLocation: ApiLocation,
+        outputApiLocations: List<ApiLocation>
     ) {
         val metalavaConfiguration = project.getMetalavaConfiguration()
-        val versionedApiLocation = project.getVersionedApiLocation()
-        val currentApiLocation = project.getCurrentApiLocation()
-        val builtApiLocation = project.getBuiltApiLocation()
-
-        val outputApiLocations = if (project.isVersionedApiFileWritingEnabled()) {
-            listOf(
-                versionedApiLocation,
-                currentApiLocation
-            )
-        } else {
-            listOf(
-                currentApiLocation
-            )
-        }
-
-        val baselines = ApiBaselinesLocation.fromApiLocation(versionedApiLocation)
 
         // Policy: If the artifact belongs to an atomic (e.g. same-version) group, we don't enforce
         // binary compatibility for APIs annotated with @RestrictTo(LIBRARY_GROUP). This is
@@ -135,7 +58,7 @@
             task.apiLocation.set(builtApiLocation)
             task.configuration = metalavaConfiguration
             task.generateRestrictToLibraryGroupAPIs = generateRestrictToLibraryGroupAPIs
-            task.baselines.set(baselines)
+            task.baselines.set(baselinesApiLocation)
             task.dependsOn(metalavaConfiguration)
             processManifest?.let {
                 task.manifestPath.set(processManifest.manifestOutputFile)
@@ -154,7 +77,7 @@
             ) { task ->
                 task.configuration = metalavaConfiguration
                 task.referenceApi.set(lastReleasedApiFile)
-                task.baselines.set(baselines)
+                task.baselines.set(baselinesApiLocation)
                 task.dependsOn(metalavaConfiguration)
                 task.api.set(builtApiLocation)
                 task.dependencyClasspath = javaCompileInputs.dependencyClasspath
@@ -179,7 +102,7 @@
             UpdateApiLintBaselineTask::class.java
         ) { task ->
             task.configuration = metalavaConfiguration
-            task.baselines.set(baselines)
+            task.baselines.set(baselinesApiLocation)
             processManifest?.let {
                 task.manifestPath.set(processManifest.manifestOutputFile)
             }
@@ -249,6 +172,13 @@
         project.addToBuildOnServer(checkApi)
     }
 
+    private fun applyInputs(inputs: JavaCompileInputs, task: MetalavaTask) {
+        task.sourcePaths = inputs.sourcePaths.files
+        task.dependsOn(inputs.sourcePaths)
+        task.dependencyClasspath = inputs.dependencyClasspath
+        task.bootClasspath = inputs.bootClasspath
+    }
+
     @Suppress("unused")
     private fun setupStubs(
         project: Project,
diff --git a/buildSrc/src/main/kotlin/androidx/build/resources/ResourceTasks.kt b/buildSrc/src/main/kotlin/androidx/build/resources/ResourceTasks.kt
index dcb0014..69f4e8e 100644
--- a/buildSrc/src/main/kotlin/androidx/build/resources/ResourceTasks.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/resources/ResourceTasks.kt
@@ -16,21 +16,13 @@
 
 package androidx.build.resources
 
-import androidx.build.AndroidXExtension
 import androidx.build.AndroidXPlugin.Companion.TASK_GROUP_API
 import androidx.build.addToBuildOnServer
 import androidx.build.addToCheckTask
-import androidx.build.checkapi.getBuiltApiLocation
-import androidx.build.checkapi.getCurrentApiLocation
+import androidx.build.checkapi.ApiLocation
 import androidx.build.checkapi.getRequiredCompatibilityApiLocation
-import androidx.build.checkapi.getVersionedApiLocation
-import androidx.build.checkapi.hasApiFileDirectory
-import androidx.build.checkapi.hasApiTasks
-import androidx.build.defaultPublishVariant
-import androidx.build.isVersionedApiFileWritingEnabled
 import androidx.build.metalava.UpdateApiTask
 import androidx.build.uptodatedness.cacheEvenIfNoOutputs
-import com.android.build.gradle.LibraryExtension
 import org.gradle.api.Project
 import java.util.Locale
 
@@ -40,32 +32,11 @@
     private const val CHECK_RESOURCE_API_TASK = "checkResourceApi"
     private const val UPDATE_RESOURCE_API_TASK = "updateResourceApi"
 
-    @Suppress("UnstableApiUsage")
-    fun Project.configureAndroidProjectForResourceTasks(
-        library: LibraryExtension,
-        extension: AndroidXExtension
-    ) {
-        afterEvaluate { project ->
-            if (!hasApiTasks(this, extension)) {
-                return@afterEvaluate
-            }
-
-            library.defaultPublishVariant { variant ->
-                if (!project.hasApiFileDirectory()) {
-                    logger.info(
-                        "Project $name doesn't have an api folder, ignoring API tasks."
-                    )
-                    return@defaultPublishVariant
-                }
-
-                setupProject(project, variant.name)
-            }
-        }
-    }
-
-    private fun setupProject(
+    fun setupProject(
         project: Project,
-        variantName: String
+        variantName: String,
+        builtApiLocation: ApiLocation,
+        outputApiLocations: List<ApiLocation>
     ) {
         @OptIn(ExperimentalStdlibApi::class)
         val packageResTask = project.tasks
@@ -75,21 +46,6 @@
             (task as com.android.build.gradle.tasks.MergeResources).publicFile
         }
 
-        val versionedApiLocation = project.getVersionedApiLocation()
-        val currentApiLocation = project.getCurrentApiLocation()
-        val builtApiLocation = project.getBuiltApiLocation()
-
-        val outputApiLocations = if (project.isVersionedApiFileWritingEnabled()) {
-            listOf(
-                versionedApiLocation,
-                currentApiLocation
-            )
-        } else {
-            listOf(
-                currentApiLocation
-            )
-        }
-
         val outputApiFiles = outputApiLocations.map { location ->
             location.resourceFile
         }
diff --git a/camera/camera-extensions/build.gradle b/camera/camera-extensions/build.gradle
index b0401cc..0633ff5 100644
--- a/camera/camera-extensions/build.gradle
+++ b/camera/camera-extensions/build.gradle
@@ -18,6 +18,7 @@
 import androidx.build.LibraryVersions
 import androidx.build.LibraryGroups
 import androidx.build.Publish
+import androidx.build.RunApiTasks
 
 plugins {
     id("AndroidXPlugin")
@@ -73,6 +74,7 @@
 androidx {
     name = "Jetpack Camera Library OEM Extensions"
     publish = Publish.SNAPSHOT_AND_RELEASE
+    runApiTasks = new RunApiTasks.No("Temporary policy violation, see b/161377155")
     mavenVersion = LibraryVersions.CAMERA_EXTENSIONS
     mavenGroup = LibraryGroups.CAMERA
     inceptionYear = "2019"
diff --git a/camera/camera-view/build.gradle b/camera/camera-view/build.gradle
index 5b88118..2c08f9a 100644
--- a/camera/camera-view/build.gradle
+++ b/camera/camera-view/build.gradle
@@ -18,6 +18,7 @@
 import androidx.build.LibraryVersions
 import androidx.build.LibraryGroups
 import androidx.build.Publish
+import androidx.build.RunApiTasks
 
 plugins {
     id("AndroidXPlugin")
@@ -64,6 +65,7 @@
 androidx {
     name = "Jetpack Camera View Library"
     publish = Publish.SNAPSHOT_AND_RELEASE
+    runApiTasks = new RunApiTasks.No("Temporary policy violation, see b/161377155")
     mavenVersion = LibraryVersions.CAMERA_VIEW
     mavenGroup = LibraryGroups.CAMERA
     inceptionYear = "2019"
diff --git a/lifecycle/lifecycle-extensions/build.gradle b/lifecycle/lifecycle-extensions/build.gradle
index 95a24ba..12f7761 100644
--- a/lifecycle/lifecycle-extensions/build.gradle
+++ b/lifecycle/lifecycle-extensions/build.gradle
@@ -15,10 +15,11 @@
  */
 
 import static androidx.build.dependencies.DependenciesKt.*
+
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
-import androidx.build.AndroidXExtension
 import androidx.build.Publish
+import androidx.build.RunApiTasks
 
 plugins {
     id("AndroidXPlugin")
@@ -55,6 +56,7 @@
 androidx {
     name = "Android Lifecycle Extensions"
     publish = Publish.NONE
+    runApiTasks = new RunApiTasks.Yes("Need to track API surface before moving to publish")
     mavenVersion = LibraryVersions.LIFECYCLE_EXTENSIONS
     mavenGroup = LibraryGroups.LIFECYCLE
     inceptionYear = "2017"
diff --git a/security/identity-credential/build.gradle b/security/identity-credential/build.gradle
index d580e44..20bfd56 100644
--- a/security/identity-credential/build.gradle
+++ b/security/identity-credential/build.gradle
@@ -14,10 +14,10 @@
  * limitations under the License.
  */
 
-import static androidx.build.dependencies.DependenciesKt.*
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 import androidx.build.Publish
+import androidx.build.RunApiTasks
 
 plugins {
     id("AndroidXPlugin")
@@ -38,6 +38,7 @@
 androidx {
     name = "AndroidX Security"
     publish = Publish.NONE
+    runApiTasks = new RunApiTasks.Yes("Need to track API surface before moving to publish")
     mavenVersion = LibraryVersions.SECURITY_IDENTITY_CREDENTIAL
     mavenGroup = LibraryGroups.SECURITY
     inceptionYear = "2019"
diff --git a/window/window-extensions/build.gradle b/window/window-extensions/build.gradle
index 67bcdc5..799b82e 100644
--- a/window/window-extensions/build.gradle
+++ b/window/window-extensions/build.gradle
@@ -17,9 +17,7 @@
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 import androidx.build.Publish
-
-import static androidx.build.dependencies.DependenciesKt.AUTO_VALUE
-import static androidx.build.dependencies.DependenciesKt.AUTO_VALUE_ANNOTATIONS
+import androidx.build.RunApiTasks
 
 plugins {
     id("AndroidXPlugin")
@@ -39,6 +37,7 @@
 androidx {
     name = "Jetpack WindowManager library Extensions"
     publish = Publish.NONE
+    runApiTasks = new RunApiTasks.Yes("Need to track API surface before moving to publish")
     mavenGroup = LibraryGroups.WINDOW
     mavenVersion = LibraryVersions.WINDOW
     inceptionYear = "2020"
diff --git a/window/window-sidecar/build.gradle b/window/window-sidecar/build.gradle
index 930dca2..5c704f4 100644
--- a/window/window-sidecar/build.gradle
+++ b/window/window-sidecar/build.gradle
@@ -17,9 +17,7 @@
 import androidx.build.LibraryGroups
 import androidx.build.LibraryVersions
 import androidx.build.Publish
-
-import static androidx.build.dependencies.DependenciesKt.AUTO_VALUE
-import static androidx.build.dependencies.DependenciesKt.AUTO_VALUE_ANNOTATIONS
+import androidx.build.RunApiTasks
 
 plugins {
     id("AndroidXPlugin")
@@ -39,6 +37,7 @@
 androidx {
     name = "Jetpack WindowManager library Sidecar"
     publish = Publish.NONE
+    runApiTasks = new RunApiTasks.Yes("Need to track API surface but should never publish")
     mavenGroup = LibraryGroups.WINDOW
     mavenVersion = LibraryVersions.WINDOW_SIDECAR
     inceptionYear = "2020"