import org.gradle.tooling.events.FinishEvent import org.gradle.tooling.events.OperationCompletionListener pluginManagement { if (!gradle.root.hasProperty("mozconfig")){ apply from: file('mobile/android/gradle/mozconfig.gradle') } else { gradle.ext.mozconfig = gradle.root.mozconfig } repositories { gradle.mozconfig.substs.GRADLE_MAVEN_REPOSITORIES.each { repository -> maven { url = repository if (gradle.mozconfig.substs.ALLOW_INSECURE_GRADLE_REPOSITORIES) { allowInsecureProtocol = true } } } } includeBuild("${rootProject.projectDir.absolutePath}/mobile/android/android-components/plugins/config") includeBuild("${rootProject.projectDir.absolutePath}/mobile/android/android-components/plugins/dependencies") includeBuild("${rootProject.projectDir.absolutePath}/mobile/android/android-components/plugins/publicsuffixlist") includeBuild("${rootProject.projectDir.absolutePath}/mobile/android/fenix/plugins/apksize") } plugins { id 'mozac.DependenciesPlugin' } // You might think topsrcdir is '.', but that's not true when the Gradle build // is launched from within IntelliJ. ext.topsrcdir = rootProject.projectDir.absolutePath apply from: "${topsrcdir}/mobile/android/shared-settings.gradle" apply from: "${topsrcdir}/mobile/android/autopublish-settings.gradle" // Set the Android SDK location. This is the *least specific* mechanism, which // is unfortunate: we'd prefer to use the *most specific* mechanism. That is, // local.properties (first 'sdk.dir', then 'android.dir') and then the // environment variable ANDROID_HOME will override this. That's unfortunate, // but it's hard to automatically arrange better. System.setProperty('android.home', gradle.mozconfig.substs.ANDROID_SDK_ROOT) include ':annotations', ':messaging_example', ':port_messaging_example' include ':geckoview' include ':exoplayer2' include ':android-components' project(':annotations').projectDir = new File("${gradle.mozconfig.topsrcdir}/mobile/android/annotations") project(':geckoview').projectDir = new File("${gradle.mozconfig.topsrcdir}/mobile/android/geckoview") project(':exoplayer2').projectDir = new File("${gradle.mozconfig.topsrcdir}/mobile/android/exoplayer2") project(':android-components').projectDir = new File("${gradle.mozconfig.topsrcdir}/mobile/android/android-components") if (!gradle.mozconfig.substs.MOZ_ANDROID_SUBPROJECT || gradle.mozconfig.substs.MOZ_ANDROID_SUBPROJECT == "fenix") { include ':fenix' project(':fenix').projectDir = new File("${gradle.mozconfig.topsrcdir}/mobile/android/fenix/app") } if (!gradle.mozconfig.substs.MOZ_ANDROID_SUBPROJECT || gradle.mozconfig.substs.MOZ_ANDROID_SUBPROJECT == "focus") { include ':focus-android' project(':focus-android').projectDir = new File("${gradle.mozconfig.topsrcdir}/mobile/android/focus-android/app") } if (!gradle.mozconfig.substs.MOZ_ANDROID_SUBPROJECT || gradle.mozconfig.substs.MOZ_ANDROID_SUBPROJECT == "geckoview_example") { include ':samples-browser' include ':compose-browser' include ':toolbar' include ':geckoview_example' include ':test_runner' project(':test_runner').projectDir = new File("${gradle.mozconfig.topsrcdir}/mobile/android/test_runner") project(':geckoview_example').projectDir = new File("${gradle.mozconfig.topsrcdir}/mobile/android/geckoview_example") project(':samples-browser').projectDir = new File("${gradle.mozconfig.topsrcdir}/mobile/android/android-components/samples/browser") project(':compose-browser').projectDir = new File("${gradle.mozconfig.topsrcdir}/mobile/android/android-components/samples/compose-browser") project(':toolbar').projectDir = new File("${gradle.mozconfig.topsrcdir}/mobile/android/android-components/samples/toolbar") } if (hasProperty("androidFormatLintTest")) { include ':androidFormatLintTest' project(':androidFormatLintTest').projectDir = new File("${gradle.mozconfig.topsrcdir}/tools/lint/test/files/android-format") } project(':messaging_example').projectDir = new File('mobile/android/examples/messaging_example/app') project(':port_messaging_example').projectDir = new File('mobile/android/examples/port_messaging_example/app') // Print BUILDSTATUS lines for build profile markers. // // Listeners configured here are "more" global: they get events for (isolated) // projects that use `includeBuild`. // // In addition, build events listeners implemented as build services are // "configuration cache friendly"; task actions (`doFirst`, `doLast`, etc) are // not. def now() { Instant now = Instant.now(); return BigDecimal.valueOf(now.getNano(), 9).add(now.getEpochSecond()); } abstract class BuildStatusListener implements BuildService, OperationCompletionListener { interface Params extends BuildServiceParameters { } void onFinish(FinishEvent event) { def operationResult = event.result println("BUILDSTATUS ${BigDecimal.valueOf(operationResult.startTime, 3)} START_gradle-task ${event.descriptor.name}") println("BUILDSTATUS ${BigDecimal.valueOf(operationResult.endTime, 3)} END_gradle-task ${event.descriptor.name}") } } def shouldPrintBuildStatus = System.getenv("MACH") && !System.getenv("NO_BUILDSTATUS_MESSAGES") if (shouldPrintBuildStatus) { gradle.services.get(BuildEventsListenerRegistry).onTaskCompletion( gradle.sharedServices.registerIfAbsent("buildStatus", BuildStatusListener.class) {} ) gradle.addProjectEvaluationListener(new ProjectEvaluationListener() { @Override void beforeEvaluate(Project p) { println("BUILDSTATUS ${now()} START_gradle:evaluate-project ${p.name}") } @Override void afterEvaluate(Project p, ProjectState projectState) { println("BUILDSTATUS ${now()} END_gradle:evaluate-project ${p.name}") } }) }