Move minSdkVersion default into AndroidX plugin

This changes the beahvior to set the minimum to the default (currently 14) and allow overriding using the normal mechanism of the android.defaultConfig { } DSL.

Library with default:

    $ cat ../../out/host/gradle/frameworks/support/core/build/intermediates/merged_manifests/release/processReleaseManifest/merged/AndroidManifest.xml | \grep minSdk
        <uses-sdk android:minSdkVersion="14" />

Library with custom value:

    $ cat ../../out/host/gradle/frameworks/support/heifwriter/build/intermediates/merged_manifests/release/processReleaseManifest/merged/AndroidManifest.xml | \grep minSdk
        <uses-sdk android:minSdkVersion="28" />

Test: ./gradlew :core:assemble :heifwriter:assemble (and manual verification above)
Change-Id: I5dfac73f480b49b697aff4bc3243b845e1449f98
diff --git a/browser/build.gradle b/browser/build.gradle
index ec2f1dc..1336b63 100644
--- a/browser/build.gradle
+++ b/browser/build.gradle
@@ -6,6 +6,12 @@
     id("SupportAndroidLibraryPlugin")
 }
 
+android {
+    defaultConfig {
+        minSdkVersion 15
+    }
+}
+
 dependencies {
     api(project(":core"))
     api(project(":annotation"))
@@ -26,5 +32,4 @@
     mavenGroup = LibraryGroups.BROWSER
     inceptionYear = "2015"
     description = "Android Support Custom Tabs"
-    minSdkVersion = 15
 }
diff --git a/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt b/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
index ec222fd..0e00a35 100644
--- a/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
@@ -16,10 +16,12 @@
 
 package androidx.build
 
+import androidx.build.SupportConfig.DEFAULT_MIN_SDK_VERSION
 import androidx.build.gradle.getByType
 import androidx.build.license.configureExternalDependencyLicenseCheck
 import com.android.build.gradle.AppExtension
 import com.android.build.gradle.AppPlugin
+import com.android.build.gradle.BaseExtension
 import com.android.build.gradle.LibraryExtension
 import com.android.build.gradle.LibraryPlugin
 import org.gradle.api.JavaVersion.VERSION_1_7
@@ -56,6 +58,7 @@
 
                     project.configureErrorProneForAndroid(extension.libraryVariants)
                     project.configureSourceJarForAndroid(extension)
+                    project.configureDefaultMinSdkVersion(extension)
 
                     extension.compileOptions.apply {
                         setSourceCompatibility(VERSION_1_7)
@@ -78,6 +81,7 @@
                 is AppPlugin -> {
                     val extension = project.extensions.getByType<AppExtension>()
                     project.configureErrorProneForAndroid(extension.applicationVariants)
+                    project.configureDefaultMinSdkVersion(extension)
                 }
             }
         }
@@ -91,4 +95,15 @@
             isPreserveFileTimestamps = false
         }
     }
+
+    private fun Project.configureDefaultMinSdkVersion(extension: BaseExtension) {
+        extension.defaultConfig.minSdkVersion(DEFAULT_MIN_SDK_VERSION)
+
+        afterEvaluate {
+            val minSdkVersion = extension.defaultConfig.minSdkVersion.apiLevel
+            check(minSdkVersion >= DEFAULT_MIN_SDK_VERSION) {
+                "minSdkVersion $minSdkVersion lower than the default of $DEFAULT_MIN_SDK_VERSION"
+            }
+        }
+    }
 }
diff --git a/buildSrc/src/main/kotlin/androidx/build/SupportAndroidLibraryPlugin.kt b/buildSrc/src/main/kotlin/androidx/build/SupportAndroidLibraryPlugin.kt
index 9d7fb83..b51af64 100644
--- a/buildSrc/src/main/kotlin/androidx/build/SupportAndroidLibraryPlugin.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/SupportAndroidLibraryPlugin.kt
@@ -19,6 +19,7 @@
 import androidx.build.SupportConfig.INSTRUMENTATION_RUNNER
 import androidx.build.metalava.Metalava
 import com.android.build.gradle.LibraryExtension
+import com.android.build.gradle.LibraryPlugin
 import com.android.build.gradle.tasks.GenerateBuildConfig
 import org.gradle.api.Plugin
 import org.gradle.api.Project
@@ -42,8 +43,6 @@
             val library = project.extensions.findByType(LibraryExtension::class.java)
                     ?: return@afterEvaluate
 
-            library.defaultConfig.minSdkVersion(supportLibraryExtension.minSdkVersion)
-
             VersionFileWriterTask.setUpAndroidLibrary(project, library)
 
             if (supportLibraryExtension.useMetalava) {
@@ -67,7 +66,7 @@
             }
         }
 
-        project.apply(mapOf("plugin" to "com.android.library"))
+        project.apply<LibraryPlugin>()
 
         project.afterEvaluate {
             project.tasks.all({
diff --git a/buildSrc/src/main/kotlin/androidx/build/SupportAndroidTestAppExtension.kt b/buildSrc/src/main/kotlin/androidx/build/SupportAndroidTestAppExtension.kt
deleted file mode 100644
index f908a02..0000000
--- a/buildSrc/src/main/kotlin/androidx/build/SupportAndroidTestAppExtension.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.
- */
-
-package androidx.build
-
-import androidx.build.SupportConfig.DEFAULT_MIN_SDK_VERSION
-import org.gradle.api.Project
-
-/**
- * Extension for [SupportAndroidTestAppPlugin].
- */
-open class SupportAndroidTestAppExtension(val project: Project) {
-    /**
-     * If unset minSdkVersion will be [DEFAULT_MIN_SDK_VERSION].
-     */
-    var minSdkVersion: Int = DEFAULT_MIN_SDK_VERSION
-}
diff --git a/buildSrc/src/main/kotlin/androidx/build/SupportAndroidTestAppPlugin.kt b/buildSrc/src/main/kotlin/androidx/build/SupportAndroidTestAppPlugin.kt
index 8c4055f..efaff72 100644
--- a/buildSrc/src/main/kotlin/androidx/build/SupportAndroidTestAppPlugin.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/SupportAndroidTestAppPlugin.kt
@@ -18,6 +18,7 @@
 
 import androidx.build.SupportConfig.INSTRUMENTATION_RUNNER
 import com.android.build.gradle.AppExtension
+import com.android.build.gradle.AppPlugin
 import org.gradle.api.JavaVersion
 import org.gradle.api.Plugin
 import org.gradle.api.Project
@@ -30,16 +31,7 @@
 class SupportAndroidTestAppPlugin : Plugin<Project> {
     override fun apply(project: Project) {
         project.apply<AndroidXPlugin>()
-
-        val testAppExtension = project.extensions.create("supportTestApp",
-                SupportAndroidTestAppExtension::class.java, project)
-        project.afterEvaluate {
-            val application = project.extensions.findByType(AppExtension::class.java)
-                    ?: throw Exception("Failed to find Android extension")
-            application.defaultConfig.minSdkVersion(testAppExtension.minSdkVersion)
-        }
-
-        project.apply(mapOf("plugin" to "com.android.application"))
+        project.apply<AppPlugin>()
 
         val application = project.extensions.findByType(AppExtension::class.java)
                 ?: throw Exception("Failed to find Android extension")
diff --git a/buildSrc/src/main/kotlin/androidx/build/SupportLibraryExtension.kt b/buildSrc/src/main/kotlin/androidx/build/SupportLibraryExtension.kt
index dbdef64..7886ebb 100644
--- a/buildSrc/src/main/kotlin/androidx/build/SupportLibraryExtension.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/SupportLibraryExtension.kt
@@ -16,7 +16,6 @@
 
 package androidx.build
 
-import androidx.build.SupportConfig.DEFAULT_MIN_SDK_VERSION
 import groovy.lang.Closure
 import org.gradle.api.Project
 import java.util.ArrayList
@@ -45,11 +44,6 @@
      */
     var toolingProject = false
 
-    /**
-     * If unset minSdkVersion will be [DEFAULT_MIN_SDK_VERSION].
-     */
-    var minSdkVersion: Int = DEFAULT_MIN_SDK_VERSION
-
     fun license(closure: Closure<*>): License {
         val license = project.configure(License(), closure) as License
         licenses.add(license)
diff --git a/car/build.gradle b/car/build.gradle
index 398a434..3b7c964 100644
--- a/car/build.gradle
+++ b/car/build.gradle
@@ -34,6 +34,10 @@
 }
 
 android {
+    defaultConfig {
+        minSdkVersion 24
+    }
+
     compileOptions {
         sourceCompatibility = JavaVersion.VERSION_1_8
         targetCompatibility = JavaVersion.VERSION_1_8
@@ -51,6 +55,5 @@
     mavenGroup = LibraryGroups.CAR
     inceptionYear = "2017"
     description = "Android Car Support UI"
-    minSdkVersion = 24
     failOnUncheckedWarnings = false
 }
diff --git a/docs-fake/build.gradle b/docs-fake/build.gradle
index ea70dfa..9c9dd5a 100644
--- a/docs-fake/build.gradle
+++ b/docs-fake/build.gradle
@@ -34,6 +34,10 @@
 }
 
 android {
+    defaultConfig {
+        minSdkVersion SupportConfig.CURRENT_SDK_VERSION
+    }
+
     sourceSets {
         main {
             manifest.srcFile "AndroidManifest.xml"
@@ -41,8 +45,3 @@
     }
     flavorDimensions("library-group")
 }
-
-
-supportTestApp {
-    minSdkVersion = SupportConfig.CURRENT_SDK_VERSION
-}
\ No newline at end of file
diff --git a/heifwriter/build.gradle b/heifwriter/build.gradle
index 810c395..7728023 100644
--- a/heifwriter/build.gradle
+++ b/heifwriter/build.gradle
@@ -6,6 +6,12 @@
     id("SupportAndroidLibraryPlugin")
 }
 
+android {
+    defaultConfig {
+        minSdkVersion 28
+    }
+}
+
 dependencies {
     api(project(":annotation"))
 
@@ -20,6 +26,5 @@
     mavenVersion = LibraryVersions.SUPPORT_LIBRARY
     mavenGroup = LibraryGroups.HEIFWRITER
     inceptionYear = "2018"
-    minSdkVersion = 28
     description = "Android Support HeifWriter for writing HEIF still images"
 }
diff --git a/leanback-preference/build.gradle b/leanback-preference/build.gradle
index 4f49bef..7dd6e53 100644
--- a/leanback-preference/build.gradle
+++ b/leanback-preference/build.gradle
@@ -15,6 +15,10 @@
 }
 
 android {
+    defaultConfig {
+        minSdkVersion 17
+    }
+
     sourceSets {
         main.java.srcDirs += [
                 'api21'
@@ -29,6 +33,5 @@
     mavenGroup = LibraryGroups.LEANBACK
     inceptionYear = "2015"
     description = "Android Support Leanback Preference v17"
-    minSdkVersion = 17
     failOnDeprecationWarnings = false
-}
\ No newline at end of file
+}
diff --git a/leanback/build.gradle b/leanback/build.gradle
index 5cd60f6..1d4b834 100644
--- a/leanback/build.gradle
+++ b/leanback/build.gradle
@@ -21,6 +21,10 @@
 }
 
 android {
+    defaultConfig {
+        minSdkVersion 17
+    }
+
     sourceSets {
         main.java.srcDirs += [
                 'common',
@@ -37,7 +41,6 @@
     mavenGroup = LibraryGroups.LEANBACK
     inceptionYear = "2014"
     description = "Android Support Leanback v17"
-    minSdkVersion = 17
     failOnUncheckedWarnings = false
     failOnDeprecationWarnings = false
 }
diff --git a/media-widget/build.gradle b/media-widget/build.gradle
index d6fb71a..b8e2aa9 100644
--- a/media-widget/build.gradle
+++ b/media-widget/build.gradle
@@ -36,6 +36,12 @@
     androidTestImplementation project(':internal-testutils')
 }
 
+android {
+    defaultConfig {
+        minSdkVersion 19
+    }
+}
+
 supportLibrary {
     name = "Android Support Media Widget"
     publish = true
@@ -43,7 +49,6 @@
     mavenGroup = LibraryGroups.MEDIA
     inceptionYear = "2011"
     description = "Android Support Media Widget"
-    minSdkVersion = 19
     failOnDeprecationWarnings = false
     failOnDeprecationWarnings = false
 }
diff --git a/recommendation/build.gradle b/recommendation/build.gradle
index 684726e..3b4ea70 100644
--- a/recommendation/build.gradle
+++ b/recommendation/build.gradle
@@ -9,6 +9,12 @@
     api(project(":annotation"))
 }
 
+android {
+    defaultConfig {
+        minSdkVersion 21
+    }
+}
+
 supportLibrary {
     name = "Android Support Recommendation"
     publish = true
@@ -16,6 +22,5 @@
     mavenGroup = LibraryGroups.RECOMMENDATION
     inceptionYear = "2015"
     description = "Android Support Recommendation"
-    minSdkVersion = 21
     failOnDeprecationWarnings = false
 }
diff --git a/samples/SupportCarDemos/build.gradle b/samples/SupportCarDemos/build.gradle
index bb553b2..c0817f1 100644
--- a/samples/SupportCarDemos/build.gradle
+++ b/samples/SupportCarDemos/build.gradle
@@ -8,6 +8,8 @@
     compileOnly fileTree(dir: '../../car/car-stubs', include: ['android.car.jar'])
 }
 
-supportTestApp {
-    minSdkVersion = 24
+android {
+    defaultConfig {
+        minSdkVersion 24
+    }
 }
diff --git a/samples/SupportLeanbackDemos/build.gradle b/samples/SupportLeanbackDemos/build.gradle
index 89faeb2..556d511 100644
--- a/samples/SupportLeanbackDemos/build.gradle
+++ b/samples/SupportLeanbackDemos/build.gradle
@@ -8,6 +8,8 @@
     implementation 'com.google.code.gson:gson:2.6.2'
 }
 
-supportTestApp {
-    minSdkVersion = 17
+android {
+    defaultConfig {
+        minSdkVersion 17
+    }
 }
diff --git a/samples/SupportMediaDemos/build.gradle b/samples/SupportMediaDemos/build.gradle
index fecf2a5..4291cf8 100644
--- a/samples/SupportMediaDemos/build.gradle
+++ b/samples/SupportMediaDemos/build.gradle
@@ -25,7 +25,6 @@
 
 android {
     defaultConfig {
-        minSdkVersion = 19
-        targetSdkVersion = 26
+        minSdkVersion 19
     }
 }
diff --git a/samples/SupportSliceDemos/build.gradle b/samples/SupportSliceDemos/build.gradle
index bcffb46..658080d2 100644
--- a/samples/SupportSliceDemos/build.gradle
+++ b/samples/SupportSliceDemos/build.gradle
@@ -38,11 +38,7 @@
 
 android {
     defaultConfig {
-        minSdkVersion = 19
+        minSdkVersion 19
         applicationId "com.example.androidx.slice.demos"
     }
 }
-
-supportTestApp {
-    minSdkVersion = 19
-}
diff --git a/samples/SupportWearDemos/build.gradle b/samples/SupportWearDemos/build.gradle
index 15cf35c..281fa02 100644
--- a/samples/SupportWearDemos/build.gradle
+++ b/samples/SupportWearDemos/build.gradle
@@ -23,6 +23,8 @@
     implementation project(path: ':appcompat')
 }
 
-supportTestApp {
-    minSdkVersion = 24
+android {
+    defaultConfig {
+        minSdkVersion 24
+    }
 }
diff --git a/slices/builders/build.gradle b/slices/builders/build.gradle
index 139220b5..6cff98a 100644
--- a/slices/builders/build.gradle
+++ b/slices/builders/build.gradle
@@ -35,7 +35,6 @@
     mavenGroup = LibraryGroups.SLICE
     inceptionYear = "2017"
     description = "A set of builders to create templates using SliceProvider APIs"
-    minSdkVersion = 14
     failOnUncheckedWarnings = false
     failOnDeprecationWarnings = false
 }
diff --git a/slices/builders/ktx/build.gradle b/slices/builders/ktx/build.gradle
index ec08ded..bd15782 100644
--- a/slices/builders/ktx/build.gradle
+++ b/slices/builders/ktx/build.gradle
@@ -24,6 +24,10 @@
 }
 
 android {
+    defaultConfig {
+        minSdkVersion 19
+    }
+
     buildTypes {
         debug {
             testCoverageEnabled = false // Breaks Kotlin compiler.
@@ -49,7 +53,6 @@
     mavenGroup = LibraryGroups.SLICE
     inceptionYear = "2018"
     description = "A set of Kotlin extension methods built on top of slice-builders APIs."
-    minSdkVersion = 19
     failOnUncheckedWarnings = false
     failOnDeprecationWarnings = false
     useMetalava = true
diff --git a/slices/core/build.gradle b/slices/core/build.gradle
index 70d2b08..586bda2 100644
--- a/slices/core/build.gradle
+++ b/slices/core/build.gradle
@@ -41,7 +41,6 @@
     mavenGroup = LibraryGroups.SLICE
     inceptionYear = "2017"
     description = "The slices core library provides utilities for the slices view and provider libraries"
-    minSdkVersion = 14
     failOnUncheckedWarnings = false
     failOnDeprecationWarnings = false
 }
diff --git a/slices/test/build.gradle b/slices/test/build.gradle
index e4da09f..a0d6494 100644
--- a/slices/test/build.gradle
+++ b/slices/test/build.gradle
@@ -41,7 +41,6 @@
     mavenGroup = LibraryGroups.SLICE
     inceptionYear = "2017"
     description = "A library that holds common code for testing slices"
-    minSdkVersion = 14
     failOnUncheckedWarnings = false
     failOnDeprecationWarnings = false
 }
diff --git a/slices/view/build.gradle b/slices/view/build.gradle
index 69648f4..dfdc8d4 100644
--- a/slices/view/build.gradle
+++ b/slices/view/build.gradle
@@ -43,7 +43,6 @@
     mavenGroup = LibraryGroups.SLICE
     inceptionYear = "2017"
     description = "A library that handles rendering of slice content into supported templates"
-    minSdkVersion = 14
     failOnUncheckedWarnings = false
     failOnDeprecationWarnings = false
 }
diff --git a/textclassifier/build.gradle b/textclassifier/build.gradle
index ac86cc1..6c50702 100644
--- a/textclassifier/build.gradle
+++ b/textclassifier/build.gradle
@@ -18,6 +18,12 @@
     androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy)
 }
 
+android {
+    defaultConfig {
+        minSdkVersion 19
+    }
+}
+
 supportLibrary {
     name = "Android TextClassifier Support Library"
     publish = false
@@ -25,6 +31,5 @@
     mavenGroup = LibraryGroups.TEXTCLASSIFIER
     inceptionYear = "2018"
     description = "The TextClassifier Support Library can be added to an Android application in order to use the TextClassifier API introduced in Android O on all devices with API level 14 or later."
-    minSdkVersion = 19
     failOnUncheckedWarnings = false
 }
diff --git a/tv-provider/build.gradle b/tv-provider/build.gradle
index 1df3a5b..7bb5478 100644
--- a/tv-provider/build.gradle
+++ b/tv-provider/build.gradle
@@ -15,6 +15,12 @@
     androidTestImplementation(MOCKITO_CORE)
 }
 
+android {
+    defaultConfig {
+        minSdkVersion 21
+    }
+}
+
 supportLibrary {
     name = "Android Support TV Provider"
     publish = true
@@ -22,7 +28,6 @@
     mavenGroup = LibraryGroups.TVPROVIDER
     inceptionYear = "2017"
     description = "Android Support Library for TV Provider"
-    minSdkVersion = 21
     failOnUncheckedWarnings = false
     failOnDeprecationWarnings = false
-}
\ No newline at end of file
+}
diff --git a/versionedparcelable/build.gradle b/versionedparcelable/build.gradle
index ab40747..5ea3116 100644
--- a/versionedparcelable/build.gradle
+++ b/versionedparcelable/build.gradle
@@ -45,7 +45,6 @@
     mavenGroup = LibraryGroups.VERSIONEDPARCELABLE
     inceptionYear = "2018"
     description = "Provides a stable but relatively compact binary serialization format that can be passed across processes or persisted safely."
-    minSdkVersion = 14
     failOnUncheckedWarnings = false
     failOnDeprecationWarnings = false
 }
diff --git a/wear/build.gradle b/wear/build.gradle
index 4dfb67d..278ce0c 100644
--- a/wear/build.gradle
+++ b/wear/build.gradle
@@ -23,6 +23,10 @@
 }
 
 android {
+    defaultConfig {
+        minSdkVersion 23
+    }
+
     sourceSets {
         main.res.srcDirs 'res', 'res-public'
         main.resources {
@@ -38,6 +42,5 @@
     mavenGroup = LibraryGroups.WEAR
     inceptionYear = "2016"
     description = "Android Wear Support UI"
-    minSdkVersion = 23
     failOnDeprecationWarnings = false
 }