def r8RootDir = System.properties['r8.root.dir']

allprojects {
    buildscript {
        repositories {
            maven { url r8RootDir+ '/third_party/gradle-plugin' }
            // We don't use 'google()' in order to support projects using gradle
            // lower to 4.1 version.
            maven { url 'https://maven.google.com' }
            jcenter()
        }
        dependencies {
            classpath files(r8RootDir + '/build/libs/r8.jar')
            classpath 'com.android.tools.build:gradle:3.2.0-dev'
        }
    }
    repositories {
        maven { url r8RootDir+ '/third_party/gradle-plugin' }
        maven { url 'https://maven.google.com' }
        jcenter()
        mavenCentral()
    }
}

//
// Dump detailed timings per subtask
//
import java.util.concurrent.TimeUnit;
class TimingsListener implements TaskExecutionListener, BuildListener {
    private long startTimeInNs;
    private timings = []

    @Override
    void beforeExecute(Task task) {
        startTimeInNs = System.nanoTime();
    }

    @Override
    void afterExecute(Task task, TaskState taskState) {
        def ms = TimeUnit.MILLISECONDS.convert(
                System.nanoTime() - startTimeInNs, TimeUnit.NANOSECONDS);
        timings.add([task.path,ms])
    }

    @Override
    void buildStarted(Gradle gradle) {
    }

    @Override
    void buildFinished(BuildResult result) {
        def total=0
        for (timing in timings) {
            total += timing[1]
        }

        for (timing in timings) {
            printf "BENCH,%s,%s\n", timing
        }

        printf "BENCH,totalGradleTasks,%s\n", total

    }

    @Override
    void projectsEvaluated(Gradle gradle) {}

    @Override
    void projectsLoaded(Gradle gradle) {}

    @Override
    void settingsEvaluated(Settings settings) {}
}

gradle.addListener new TimingsListener()