Enable jacoco, run even if tests fail

This CL enables jacoco test coverage for all debug builds
of all subprojects. It will produce the coverage report
even if the tests fail.
Next step is to make this an artifact of the TAP runner.

Change-Id: Id33a37e14898da40a501a240a05d084f8a1a6a51
diff --git a/build.gradle b/build.gradle
index 14a4c77..9aa0557 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,3 +1,6 @@
+import com.android.build.gradle.internal.coverage.JacocoReportTask
+import com.android.build.gradle.internal.tasks.DeviceProviderInstrumentTestTask
+
 buildscript {
     repositories {
         maven { url '../../prebuilts/gradle-plugin' }
@@ -183,6 +186,9 @@
     project.plugins.whenPluginAdded { plugin ->
         if ("com.android.build.gradle.LibraryPlugin".equals(plugin.class.name)) {
             project.android.buildToolsVersion = rootProject.buildToolsVersion
+            // enable code coverage for debug builds
+            // run createDebugCoverageReport to get the coverage
+            project.android.buildTypes.debug.testCoverageEnabled = true
         }
     }
 
@@ -202,6 +208,26 @@
             }
         }
     }
+
+    project.afterEvaluate { p ->
+        // remove dependency on the test so that we still get coverage even if some tests fail
+        p.tasks.findAll { it instanceof JacocoReportTask}.each { task ->
+            def toBeRemoved = new ArrayList()
+            def dependencyList = task.taskDependencies.values
+            dependencyList.each { dep ->
+                if (dep instanceof String) {
+                    def t = tasks.findByName(dep)
+                    if (t instanceof DeviceProviderInstrumentTestTask) {
+                        toBeRemoved.add(dep)
+                        task.mustRunAfter(t)
+                    }
+                }
+            }
+            toBeRemoved.each { dep ->
+                dependencyList.remove(dep)
+            }
+        }
+    }
 }
 
 project.gradle.buildFinished { buildResult ->