Create AndroidLibraryPlugin to share common module configuration.

First step in cleaning up duplicate code in build.gradle config files.

This CL relands ag/1746409 that had to be reverted due to not listing all the maven
repositories in buildSrc/build.gradle.

Bug: 33845666
Test: ./gradlew clean assemble assembleAndroidTest continues to work
Change-Id: I335c4366a015efa7eab880cd8d01659c41f1abb2
diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle
new file mode 100644
index 0000000..0fc5a1e
--- /dev/null
+++ b/buildSrc/build.gradle
@@ -0,0 +1,12 @@
+apply plugin: 'groovy'
+
+repositories {
+    maven { url '../../../prebuilts/gradle-plugin' }
+    maven { url '../../../prebuilts/tools/common/m2/repository' }
+    maven { url '../../../prebuilts/tools/common/m2/internal' }
+    maven { url "../../../prebuilts/maven_repo/android" }
+}
+dependencies {
+    // Keep gradle plugin version in sync with ub_supportlib-master manifest.
+    compile 'com.android.tools.build:gradle:2.2.4'
+}
diff --git a/buildSrc/src/main/groovy/android/support/SupportLibraryPlugin.java b/buildSrc/src/main/groovy/android/support/SupportLibraryPlugin.java
new file mode 100644
index 0000000..90dbae6
--- /dev/null
+++ b/buildSrc/src/main/groovy/android/support/SupportLibraryPlugin.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2016 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 android.support;
+
+import com.android.build.gradle.LibraryExtension;
+import com.android.build.gradle.api.AndroidSourceSet;
+
+import com.google.common.collect.ImmutableMap;
+
+import org.gradle.api.JavaVersion;
+import org.gradle.api.Plugin;
+import org.gradle.api.Project;
+
+/**
+ * Support library specific com.android.library plugin that sets common configurations needed for
+ * support library modules.
+ */
+public class SupportLibraryPlugin implements Plugin<Project> {
+    private static final String INSTRUMENTATION_RUNNER =
+            "android.support.test.runner.AndroidJUnitRunner";
+
+    @Override
+    public void apply(Project project) {
+        project.apply(ImmutableMap.of("plugin", "com.android.library"));
+        LibraryExtension library =
+                project.getExtensions().findByType(LibraryExtension.class);
+
+        // Main sourceSet related options
+        AndroidSourceSet mainSet = library.getSourceSets().findByName("main");
+        mainSet.getManifest().srcFile("AndroidManifest.xml");
+
+        // Set test related options
+        library.getDefaultConfig().setTestInstrumentationRunner(INSTRUMENTATION_RUNNER);
+
+        AndroidSourceSet sourceSet = library.getSourceSets().findByName("androidTest");
+        sourceSet.setRoot("tests");
+        sourceSet.getJava().srcDir("tests/src");
+        sourceSet.getRes().srcDir("tests/res");
+        sourceSet.getManifest().srcFile("tests/AndroidManifest.xml");
+
+        // Set compile options
+        library.getCompileOptions().setSourceCompatibility(JavaVersion.VERSION_1_7);
+        library.getCompileOptions().setTargetCompatibility(JavaVersion.VERSION_1_7);
+    }
+}
diff --git a/compat/build.gradle b/compat/build.gradle
index 78e86d1..dc493b5 100644
--- a/compat/build.gradle
+++ b/compat/build.gradle
@@ -1,4 +1,4 @@
-apply plugin: 'com.android.library'
+apply plugin: android.support.SupportLibraryPlugin
 archivesBaseName = 'support-compat'
 
 dependencies {
@@ -20,11 +20,9 @@
 
     defaultConfig {
         minSdkVersion 9
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
     }
 
     sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = [
                 'gingerbread',
                 'honeycomb',
@@ -45,16 +43,6 @@
                 'java'
         ]
         main.aidl.srcDirs = ['java']
-
-        androidTest.setRoot('tests')
-        androidTest.java.srcDir 'tests/java'
-        androidTest.res.srcDir 'tests/res'
-        androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
-    }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
     }
 }
 
diff --git a/core-ui/build.gradle b/core-ui/build.gradle
index 0b94a96..e1e74cd 100644
--- a/core-ui/build.gradle
+++ b/core-ui/build.gradle
@@ -1,4 +1,4 @@
-apply plugin: 'com.android.library'
+apply plugin: android.support.SupportLibraryPlugin
 archivesBaseName = 'support-core-ui'
 
 dependencies {
@@ -21,11 +21,9 @@
 
     defaultConfig {
         minSdkVersion 9
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
     }
 
     sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = [
                 'honeycomb',
                 'ics',
@@ -33,22 +31,12 @@
                 'api21',
                 'java'
         ]
-
-        androidTest.setRoot('tests')
-        androidTest.java.srcDir 'tests/java'
-        androidTest.res.srcDir 'tests/res'
-        androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
     }
 
     buildTypes.all {
         consumerProguardFiles 'proguard-rules.pro'
     }
 
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
-    }
-
     testOptions {
         unitTests.returnDefaultValues = true
     }
diff --git a/core-utils/build.gradle b/core-utils/build.gradle
index d40781d..cb72680 100644
--- a/core-utils/build.gradle
+++ b/core-utils/build.gradle
@@ -1,4 +1,4 @@
-apply plugin: 'com.android.library'
+apply plugin: android.support.SupportLibraryPlugin
 archivesBaseName = 'support-core-utils'
 
 dependencies {
@@ -21,12 +21,9 @@
 
     defaultConfig {
         minSdkVersion 9
-
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
     }
 
     sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = [
                 'gingerbread',
                 'honeycomb',
@@ -38,15 +35,6 @@
                 'api24',
                 'java'
         ]
-
-        androidTest.setRoot('tests')
-        androidTest.java.srcDir 'tests/java'
-        androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
-    }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
     }
 }
 
diff --git a/customtabs/build.gradle b/customtabs/build.gradle
index e427d1e..3a3975e 100644
--- a/customtabs/build.gradle
+++ b/customtabs/build.gradle
@@ -1,4 +1,4 @@
-apply plugin: 'com.android.library'
+apply plugin: android.support.SupportLibraryPlugin
 archivesBaseName = 'customtabs'
 
 dependencies {
@@ -18,24 +18,15 @@
     compileSdkVersion project.ext.currentSdk
 
     defaultConfig {
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+        minSdkVersion 15
     }
 
     sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = ['src']
         main.aidl.srcDirs = ['src']
         main.res.srcDir 'res'
         main.assets.srcDir 'assets'
         main.resources.srcDir 'java'
-
-        androidTest.setRoot('tests')
-        androidTest.java.srcDir('tests/src/')
-    }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
     }
 }
 
diff --git a/design/build.gradle b/design/build.gradle
index 37e6625..ddd9e3e 100644
--- a/design/build.gradle
+++ b/design/build.gradle
@@ -1,5 +1,4 @@
-apply plugin: 'com.android.library'
-
+apply plugin: android.support.SupportLibraryPlugin
 archivesBaseName = 'design'
 
 dependencies {
@@ -31,7 +30,6 @@
 
     defaultConfig {
         minSdkVersion 9
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
         // This disables the builds tools automatic vector -> PNG generation
         generatedDensities = []
     }
@@ -53,19 +51,9 @@
         ]
         main.resources.srcDir 'src'
 
-        androidTest.setRoot('tests')
-        androidTest.java.srcDir 'tests/src'
-        androidTest.res.srcDir 'tests/res'
-        androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
-
         test.java.srcDir 'jvm-tests/src'
     }
 
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
-    }
-
     buildTypes.all {
         consumerProguardFiles 'proguard-rules.pro'
     }
diff --git a/exifinterface/build.gradle b/exifinterface/build.gradle
index f6fd633..aa99603 100644
--- a/exifinterface/build.gradle
+++ b/exifinterface/build.gradle
@@ -1,4 +1,4 @@
-apply plugin: 'com.android.library'
+apply plugin: android.support.SupportLibraryPlugin
 archivesBaseName = 'exifinterface'
 
 dependencies {
@@ -13,15 +13,9 @@
     }
 
     sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = ['src']
         main.res.srcDir 'res'
     }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
-    }
 }
 
 android.libraryVariants.all { variant ->
diff --git a/fragment/build.gradle b/fragment/build.gradle
index 4beb3ee..134cd67 100644
--- a/fragment/build.gradle
+++ b/fragment/build.gradle
@@ -1,4 +1,4 @@
-apply plugin: 'com.android.library'
+apply plugin: android.support.SupportLibraryPlugin
 archivesBaseName = 'support-fragment'
 
 dependencies {
@@ -22,12 +22,9 @@
 
     defaultConfig {
         minSdkVersion 9
-
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
     }
 
     sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = [
                 'gingerbread',
                 'honeycomb',
@@ -35,16 +32,6 @@
                 'api21',
                 'java'
         ]
-
-        androidTest.setRoot('tests')
-        androidTest.java.srcDir 'tests/java'
-        androidTest.res.srcDir 'tests/res'
-        androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
-    }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
     }
 }
 
diff --git a/graphics/drawable/animated/build.gradle b/graphics/drawable/animated/build.gradle
index 10d112a..ab44d58 100644
--- a/graphics/drawable/animated/build.gradle
+++ b/graphics/drawable/animated/build.gradle
@@ -1,4 +1,4 @@
-apply plugin: 'com.android.library'
+apply plugin: android.support.SupportLibraryPlugin
 archivesBaseName = 'animated-vector-drawable'
 
 dependencies {
@@ -14,9 +14,9 @@
 
 android {
     compileSdkVersion project.ext.currentSdk
+
     defaultConfig {
         minSdkVersion 11
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
         // This disables the builds tools automatic vector -> PNG generation
         generatedDensities = []
     }
@@ -24,16 +24,6 @@
     sourceSets {
         main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDir 'src'
-
-        androidTest.setRoot('tests')
-        androidTest.java.srcDir 'tests/src'
-        androidTest.res.srcDir 'tests/res'
-        androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
-    }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
     }
 
     aaptOptions {
diff --git a/graphics/drawable/static/build.gradle b/graphics/drawable/static/build.gradle
index fdb306c..3523c08 100644
--- a/graphics/drawable/static/build.gradle
+++ b/graphics/drawable/static/build.gradle
@@ -1,4 +1,4 @@
-apply plugin: 'com.android.library'
+apply plugin: android.support.SupportLibraryPlugin
 archivesBaseName = 'support-vector-drawable'
 
 dependencies {
@@ -18,25 +18,12 @@
 
     defaultConfig {
         minSdkVersion 9
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
-
         // This disables the builds tools automatic vector -> PNG generation
         generatedDensities = []
     }
 
     sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDir 'src'
-
-        androidTest.setRoot('tests')
-        androidTest.java.srcDir 'tests/src'
-        androidTest.res.srcDir 'tests/res'
-        androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
-    }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
     }
 
     aaptOptions {
diff --git a/media-compat/build.gradle b/media-compat/build.gradle
index b4af71f..0b61da8 100644
--- a/media-compat/build.gradle
+++ b/media-compat/build.gradle
@@ -1,4 +1,4 @@
-apply plugin: 'com.android.library'
+apply plugin: android.support.SupportLibraryPlugin
 archivesBaseName = 'support-media-compat'
 
 dependencies {
@@ -25,7 +25,6 @@
     }
 
     sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = [
                 'ics',
                 'jellybean-mr2',
@@ -44,11 +43,6 @@
         androidTest.res.srcDir 'tests/res'
         androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
     }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
-    }
 }
 
 android.libraryVariants.all { variant ->
diff --git a/percent/build.gradle b/percent/build.gradle
index b120075..519266e 100644
--- a/percent/build.gradle
+++ b/percent/build.gradle
@@ -1,4 +1,4 @@
-apply plugin: 'com.android.library'
+apply plugin: android.support.SupportLibraryPlugin
 archivesBaseName = 'percent'
 
 dependencies {
@@ -18,29 +18,13 @@
 
     defaultConfig {
         minSdkVersion 9
-
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
     }
 
     sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = ['src']
         main.res.srcDir 'res'
         main.assets.srcDir 'assets'
         main.resources.srcDir 'src'
-
-        // this moves src/instrumentTest to tests so all folders follow:
-        // tests/java, tests/res, tests/assets, ...
-        // This is a *reset* so it replaces the default paths
-        androidTest.setRoot('tests')
-        androidTest.java.srcDir 'tests/java'
-        androidTest.res.srcDir 'tests/res'
-        androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
-    }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
     }
 }
 
diff --git a/recommendation/build.gradle b/recommendation/build.gradle
index dadad58..d97c1b3 100644
--- a/recommendation/build.gradle
+++ b/recommendation/build.gradle
@@ -1,4 +1,4 @@
-apply plugin: 'com.android.library'
+apply plugin: android.support.SupportLibraryPlugin
 archivesBaseName = 'recommendation'
 
 dependencies {
@@ -13,23 +13,12 @@
     }
 
     sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = ['src']
         main.res.srcDir 'res'
         main.assets.srcDir 'assets'
         main.resources.srcDir 'src'
-
-        // this moves src/instrumentTest to tests so all folders follow:
-        // tests/java, tests/res, tests/assets, ...
-        // This is a *reset* so it replaces the default paths
-        androidTest.setRoot('tests')
-        androidTest.java.srcDir 'tests/src'
     }
 
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
-    }
 }
 
 android.libraryVariants.all { variant ->
diff --git a/transition/build.gradle b/transition/build.gradle
index 7335b23..751477a 100644
--- a/transition/build.gradle
+++ b/transition/build.gradle
@@ -1,4 +1,4 @@
-apply plugin: 'com.android.library'
+apply plugin: android.support.SupportLibraryPlugin
 
 archivesBaseName = 'transition'
 
@@ -23,11 +23,9 @@
 
     defaultConfig {
         minSdkVersion 14
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
     }
 
     sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = [
                 'base',
                 'api14',
@@ -39,16 +37,6 @@
                 'res',
                 'res-public'
         ]
-
-        androidTest.setRoot('tests')
-        androidTest.java.srcDir 'tests/src'
-        androidTest.res.srcDir 'tests/res'
-        androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
-    }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
     }
 }
 
diff --git a/v13/build.gradle b/v13/build.gradle
index fb1c25d..d6f2254 100644
--- a/v13/build.gradle
+++ b/v13/build.gradle
@@ -1,4 +1,4 @@
-apply plugin: 'com.android.library'
+apply plugin: android.support.SupportLibraryPlugin
 archivesBaseName = 'support-v13'
 
 dependencies {
@@ -21,11 +21,9 @@
 
     defaultConfig {
         minSdkVersion 13
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
     }
 
     sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = [
                 'ics',
                 'ics-mr1',
@@ -34,16 +32,6 @@
                 'api25',
                 'java'
         ]
-
-        androidTest.setRoot('tests')
-        androidTest.java.srcDir 'tests/java'
-        androidTest.res.srcDir 'tests/res'
-        androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
-    }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
     }
 }
 
diff --git a/v14/preference/build.gradle b/v14/preference/build.gradle
index 5583e93..3cc25f3 100644
--- a/v14/preference/build.gradle
+++ b/v14/preference/build.gradle
@@ -14,7 +14,7 @@
  * limitations under the License
  */
 
-apply plugin: 'com.android.library'
+apply plugin: android.support.SupportLibraryPlugin
 archivesBaseName = 'preference-v14'
 
 dependencies {
@@ -32,22 +32,10 @@
     }
 
     sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDir 'src'
         main.res.srcDir 'res'
         main.assets.srcDir 'assets'
         main.resources.srcDir 'src'
-
-        // this moves src/instrumentTest to tests so all folders follow:
-        // tests/java, tests/res, tests/assets, ...
-        // This is a *reset* so it replaces the default paths
-        androidTest.setRoot('tests')
-        androidTest.java.srcDir 'tests/src'
-    }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
     }
 }
 
diff --git a/v17/leanback/build.gradle b/v17/leanback/build.gradle
index 9ed65a8..b9b17bc 100644
--- a/v17/leanback/build.gradle
+++ b/v17/leanback/build.gradle
@@ -1,4 +1,4 @@
-apply plugin: 'com.android.library'
+apply plugin: android.support.SupportLibraryPlugin
 archivesBaseName = 'leanback-v17'
 
 dependencies {
@@ -24,11 +24,9 @@
 
     defaultConfig {
         minSdkVersion 17
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
     }
 
     sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = [
                 'common',
                 'jbmr2',
@@ -38,22 +36,12 @@
                 'src'
         ]
         main.res.srcDir 'res'
-
-        androidTest.setRoot('tests')
-        androidTest.java.srcDir 'tests/java'
-        androidTest.res.srcDir 'tests/res'
-        androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
     }
 
     lintOptions {
         // Remove this once all NewApi breakages have been fixed.
         disable "NewApi"
     }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
-    }
 }
 
 android.libraryVariants.all { variant ->
diff --git a/v17/preference-leanback/build.gradle b/v17/preference-leanback/build.gradle
index e58fa8b..2400168 100644
--- a/v17/preference-leanback/build.gradle
+++ b/v17/preference-leanback/build.gradle
@@ -1,4 +1,4 @@
-apply plugin: 'com.android.library'
+apply plugin: android.support.SupportLibraryPlugin
 archivesBaseName = 'preference-leanback-v17'
 
 dependencies {
@@ -13,19 +13,17 @@
 android {
     compileSdkVersion project.ext.currentSdk
 
+    defaultConfig {
+        minSdkVersion 17
+    }
+
     sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = [
                 'api21',
                 'src'
         ]
         main.res.srcDir 'res'
     }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
-    }
 }
 
 android.libraryVariants.all { variant ->
diff --git a/v4/build.gradle b/v4/build.gradle
index f226a87..4eae740 100644
--- a/v4/build.gradle
+++ b/v4/build.gradle
@@ -1,4 +1,4 @@
-apply plugin: 'com.android.library'
+apply plugin: android.support.SupportLibraryPlugin
 archivesBaseName = 'support-v4'
 
 dependencies {
@@ -14,19 +14,9 @@
 
     defaultConfig {
         minSdkVersion 9
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
         // This disables the builds tools automatic vector -> PNG generation
         generatedDensities = []
     }
-
-    sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
-    }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
-    }
 }
 
 uploadArchives {
diff --git a/v7/appcompat/build.gradle b/v7/appcompat/build.gradle
index 4935085..34095da 100644
--- a/v7/appcompat/build.gradle
+++ b/v7/appcompat/build.gradle
@@ -1,4 +1,4 @@
-apply plugin: 'com.android.library'
+apply plugin: android.support.SupportLibraryPlugin
 archivesBaseName = 'appcompat-v7'
 
 dependencies {
@@ -24,27 +24,15 @@
 
     defaultConfig {
         minSdkVersion 9
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
         // This disables the builds tools automatic vector -> PNG generation
         generatedDensities = []
     }
 
     sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDir 'src'
         main.res.srcDirs 'res', 'res-public'
         main.assets.srcDir 'assets'
         main.resources.srcDir 'src'
-
-        androidTest.setRoot('tests')
-        androidTest.java.srcDir 'tests/src'
-        androidTest.res.srcDir 'tests/res'
-        androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
-    }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
     }
 
     aaptOptions {
diff --git a/v7/cardview/build.gradle b/v7/cardview/build.gradle
index ce3f28d..9d2de43 100644
--- a/v7/cardview/build.gradle
+++ b/v7/cardview/build.gradle
@@ -1,4 +1,4 @@
-apply plugin: 'com.android.library'
+apply plugin: android.support.SupportLibraryPlugin
 archivesBaseName = 'cardview-v7'
 
 dependencies {
@@ -13,7 +13,6 @@
     }
 
     sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = [
                 'base',
                 'gingerbread',
@@ -23,11 +22,6 @@
         ]
         main.res.srcDir 'res'
     }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
-    }
 }
 
 android.libraryVariants.all { variant ->
diff --git a/v7/gridlayout/build.gradle b/v7/gridlayout/build.gradle
index 56f320f..ead7845 100644
--- a/v7/gridlayout/build.gradle
+++ b/v7/gridlayout/build.gradle
@@ -1,4 +1,4 @@
-apply plugin: 'com.android.library'
+apply plugin: android.support.SupportLibraryPlugin
 archivesBaseName = 'gridlayout-v7'
 
 dependencies {
@@ -18,28 +18,14 @@
     compileSdkVersion project.ext.currentSdk
 
     defaultConfig {
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+        minSdkVersion 9
     }
 
     sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDir 'src'
         main.res.srcDir 'res'
         main.assets.srcDir 'assets'
         main.resources.srcDir 'src'
-
-        // this moves src/instrumentTest to tests so all folders follow:
-        // tests/java, tests/res, tests/assets, ...
-        // This is a *reset* so it replaces the default paths
-        androidTest.setRoot('tests')
-        androidTest.java.srcDir 'tests/src'
-        androidTest.res.srcDir 'tests/res'
-        androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
-    }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
     }
 }
 
diff --git a/v7/mediarouter/build.gradle b/v7/mediarouter/build.gradle
index 7796565..973c989 100644
--- a/v7/mediarouter/build.gradle
+++ b/v7/mediarouter/build.gradle
@@ -1,4 +1,4 @@
-apply plugin: 'com.android.library'
+apply plugin: android.support.SupportLibraryPlugin
 archivesBaseName = 'mediarouter-v7'
 
 dependencies {
@@ -14,12 +14,9 @@
 
     defaultConfig {
         minSdkVersion 9
-
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
     }
 
     sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDirs = [
                 'jellybean',
                 'jellybean-mr1',
@@ -28,16 +25,6 @@
                 'src'
         ]
         main.res.srcDir 'res'
-
-        androidTest.setRoot('tests')
-        androidTest.java.srcDir 'tests/src'
-        androidTest.res.srcDir 'tests/res'
-        androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
-    }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
     }
 }
 
diff --git a/v7/palette/Android.mk b/v7/palette/Android.mk
index c21dad3..f823d30 100644
--- a/v7/palette/Android.mk
+++ b/v7/palette/Android.mk
@@ -29,7 +29,7 @@
 LOCAL_SDK_VERSION := $(SUPPORT_CURRENT_SDK_VERSION)
 LOCAL_SRC_FILES := $(call all-java-files-under, src/main)
 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/src/main/res
-LOCAL_MANIFEST_FILE := src/main/AndroidManifest.xml
+LOCAL_MANIFEST_FILE := AndroidManifest.xml
 LOCAL_SHARED_ANDROID_LIBRARIES := \
     android-support-compat \
     android-support-core-utils \
diff --git a/v7/palette/src/main/AndroidManifest.xml b/v7/palette/AndroidManifest.xml
similarity index 100%
rename from v7/palette/src/main/AndroidManifest.xml
rename to v7/palette/AndroidManifest.xml
diff --git a/v7/palette/build.gradle b/v7/palette/build.gradle
index 686fe71..8759713 100644
--- a/v7/palette/build.gradle
+++ b/v7/palette/build.gradle
@@ -1,4 +1,4 @@
-apply plugin: 'com.android.library'
+apply plugin: android.support.SupportLibraryPlugin
 archivesBaseName = 'palette-v7'
 
 dependencies {
@@ -16,12 +16,6 @@
 
     defaultConfig {
         minSdkVersion 9
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
-    }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
     }
 }
 
diff --git a/v7/preference/build.gradle b/v7/preference/build.gradle
index b5fd656..e4d0158 100644
--- a/v7/preference/build.gradle
+++ b/v7/preference/build.gradle
@@ -14,7 +14,7 @@
  * limitations under the License
  */
 
-apply plugin: 'com.android.library'
+apply plugin: android.support.SupportLibraryPlugin
 archivesBaseName = 'preference-v7'
 
 dependencies {
@@ -35,30 +35,15 @@
     compileSdkVersion project.ext.currentSdk
 
     defaultConfig {
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
         minSdkVersion 9
     }
 
     sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDir 'src'
         main.java.srcDir 'constants'
         main.res.srcDir 'res'
         main.assets.srcDir 'assets'
         main.resources.srcDir 'src'
-
-        // this moves src/instrumentTest to tests so all folders follow:
-        // tests/java, tests/res, tests/assets, ...
-        // This is a *reset* so it replaces the default paths
-        androidTest.setRoot('tests')
-        androidTest.java.srcDir 'tests/src'
-        androidTest.res.srcDir 'tests/res'
-        androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
-    }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
     }
 
     lintOptions {
diff --git a/v7/recyclerview/build.gradle b/v7/recyclerview/build.gradle
index e262ec7..5882b34 100644
--- a/v7/recyclerview/build.gradle
+++ b/v7/recyclerview/build.gradle
@@ -1,4 +1,4 @@
-apply plugin: 'com.android.library'
+apply plugin: android.support.SupportLibraryPlugin
 archivesBaseName = 'recyclerview-v7'
 
 dependencies {
@@ -26,24 +26,13 @@
 
     defaultConfig {
         minSdkVersion 9
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
     }
 
     sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDir 'src'
         main.res.srcDirs 'res', 'res-public'
 
-        androidTest.setRoot('tests')
         test.java.srcDir 'jvm-tests/src'
-        androidTest.java.srcDir 'tests/src'
-        androidTest.res.srcDir 'tests/res'
-        androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
-    }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
     }
 
     testOptions {
diff --git a/wearable/build.gradle b/wearable/build.gradle
index 3741584..f247d8c 100644
--- a/wearable/build.gradle
+++ b/wearable/build.gradle
@@ -1,4 +1,4 @@
-apply plugin: 'com.android.library'
+apply plugin: android.support.SupportLibraryPlugin
 archivesBaseName = 'wearable'
 
 dependencies {
@@ -25,23 +25,11 @@
 
     defaultConfig {
         minSdkVersion 20
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
     }
 
     sourceSets {
-        main.manifest.srcFile 'AndroidManifest.xml'
         main.java.srcDir 'src'
         main.res.srcDirs 'res', 'res-public'
-
-        androidTest.setRoot('tests')
-        androidTest.java.srcDir 'tests/src'
-        androidTest.res.srcDir 'tests/res'
-        androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
-    }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
     }
 
     buildTypes.all {