1*fa44fe6aSInna Palant/* 2*fa44fe6aSInna Palant * Copyright 2020 The Android Open Source Project 3*fa44fe6aSInna Palant * 4*fa44fe6aSInna Palant * Licensed under the Apache License, Version 2.0 (the "License"); 5*fa44fe6aSInna Palant * you may not use this file except in compliance with the License. 6*fa44fe6aSInna Palant * You may obtain a copy of the License at 7*fa44fe6aSInna Palant * 8*fa44fe6aSInna Palant * https://www.apache.org/licenses/LICENSE-2.0 9*fa44fe6aSInna Palant * 10*fa44fe6aSInna Palant * Unless required by applicable law or agreed to in writing, software 11*fa44fe6aSInna Palant * distributed under the License is distributed on an "AS IS" BASIS, 12*fa44fe6aSInna Palant * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*fa44fe6aSInna Palant * See the License for the specific language governing permissions and 14*fa44fe6aSInna Palant * limitations under the License. 15*fa44fe6aSInna Palant */ 16*fa44fe6aSInna Palant 17*fa44fe6aSInna Palantbuildscript { 18*fa44fe6aSInna Palant repositories { 19*fa44fe6aSInna Palant google() 20*fa44fe6aSInna Palant mavenCentral() 21*fa44fe6aSInna Palant gradlePluginPortal() 22*fa44fe6aSInna Palant } 23*fa44fe6aSInna Palant 24*fa44fe6aSInna Palant dependencies { 25*fa44fe6aSInna Palant classpath libs.android.tools.build.gradle 26*fa44fe6aSInna Palant classpath libs.android.gradlePlugin 27*fa44fe6aSInna Palant classpath libs.kotlin.gradlePlugin 28*fa44fe6aSInna Palant 29*fa44fe6aSInna Palant classpath libs.gradleMavenPublishPlugin 30*fa44fe6aSInna Palant 31*fa44fe6aSInna Palant classpath libs.metalavaGradle 32*fa44fe6aSInna Palant 33*fa44fe6aSInna Palant classpath libs.affectedmoduledetector 34*fa44fe6aSInna Palant } 35*fa44fe6aSInna Palant} 36*fa44fe6aSInna Palant 37*fa44fe6aSInna Palantplugins { 38*fa44fe6aSInna Palant id "com.diffplug.spotless" version "6.5.2" 39*fa44fe6aSInna Palant alias(libs.plugins.jetbrains.dokka) 40*fa44fe6aSInna Palant} 41*fa44fe6aSInna Palant 42*fa44fe6aSInna Palantapply plugin: 'com.dropbox.affectedmoduledetector' 43*fa44fe6aSInna Palantapply plugin: 'com.diffplug.spotless' 44*fa44fe6aSInna Palant 45*fa44fe6aSInna Palanttasks.withType(org.jetbrains.dokka.gradle.DokkaMultiModuleTask).configureEach { 46*fa44fe6aSInna Palant outputDirectory = rootProject.file('docs/api') 47*fa44fe6aSInna Palant failOnWarning = true 48*fa44fe6aSInna Palant} 49*fa44fe6aSInna Palant 50*fa44fe6aSInna PalantaffectedModuleDetector { 51*fa44fe6aSInna Palant baseDir = "${project.rootDir}" 52*fa44fe6aSInna Palant pathsAffectingAllModules = [ 53*fa44fe6aSInna Palant "gradle/libs.versions.toml", 54*fa44fe6aSInna Palant ] 55*fa44fe6aSInna Palant excludedModules = [ 56*fa44fe6aSInna Palant "sample" 57*fa44fe6aSInna Palant ] 58*fa44fe6aSInna Palant 59*fa44fe6aSInna Palant logFilename = "output.log" 60*fa44fe6aSInna Palant logFolder = "${rootProject.buildDir}/affectedModuleDetector" 61*fa44fe6aSInna Palant 62*fa44fe6aSInna Palant String baseRef = findProperty("affected_base_ref") 63*fa44fe6aSInna Palant // If we have a base ref to diff against, extract the branch name and use it 64*fa44fe6aSInna Palant if (baseRef != null && !baseRef.isEmpty()) { 65*fa44fe6aSInna Palant // Remove the prefix from the head. 66*fa44fe6aSInna Palant // TODO: need to support other types of git refs 67*fa44fe6aSInna Palant specifiedBranch = baseRef.replace('refs/heads/', '') 68*fa44fe6aSInna Palant compareFrom = "SpecifiedBranchCommit" 69*fa44fe6aSInna Palant } else { 70*fa44fe6aSInna Palant // Otherwise we use the previous commit. This is mostly used for commits to main. 71*fa44fe6aSInna Palant compareFrom = "PreviousCommit" 72*fa44fe6aSInna Palant } 73*fa44fe6aSInna Palant} 74*fa44fe6aSInna Palant 75*fa44fe6aSInna Palantallprojects { 76*fa44fe6aSInna Palant repositories { 77*fa44fe6aSInna Palant google() 78*fa44fe6aSInna Palant mavenCentral() 79*fa44fe6aSInna Palant 80*fa44fe6aSInna Palant def composeSnapshot = libs.versions.composesnapshot.get() 81*fa44fe6aSInna Palant if (composeSnapshot.length() > 1) { 82*fa44fe6aSInna Palant maven { url "https://androidx.dev/snapshots/builds/$composeSnapshot/artifacts/repository/" } 83*fa44fe6aSInna Palant } 84*fa44fe6aSInna Palant } 85*fa44fe6aSInna Palant} 86*fa44fe6aSInna Palant 87*fa44fe6aSInna Palantsubprojects { 88*fa44fe6aSInna Palant apply plugin: 'com.diffplug.spotless' 89*fa44fe6aSInna Palant 90*fa44fe6aSInna Palant spotless { 91*fa44fe6aSInna Palant kotlin { 92*fa44fe6aSInna Palant target "**/*.kt" 93*fa44fe6aSInna Palant ktlint(libs.versions.ktlint.get()) 94*fa44fe6aSInna Palant licenseHeaderFile rootProject.file('spotless/copyright.txt') 95*fa44fe6aSInna Palant } 96*fa44fe6aSInna Palant 97*fa44fe6aSInna Palant groovyGradle { 98*fa44fe6aSInna Palant target '**/*.gradle' 99*fa44fe6aSInna Palant greclipse().configFile(rootProject.file('spotless/greclipse.properties')) 100*fa44fe6aSInna Palant licenseHeaderFile rootProject.file('spotless/copyright.txt'), 101*fa44fe6aSInna Palant '(buildscript|apply|import|plugins)' 102*fa44fe6aSInna Palant } 103*fa44fe6aSInna Palant } 104*fa44fe6aSInna Palant 105*fa44fe6aSInna Palant // Remove all test apps after running UI tests. 106*fa44fe6aSInna Palant // This is specially important in CI so that test emulators don't run out of space. 107*fa44fe6aSInna Palant tasks.whenTaskAdded { task -> 108*fa44fe6aSInna Palant if (task.name == 'connectedDebugAndroidTest') { 109*fa44fe6aSInna Palant task.finalizedBy 'uninstallDebugAndroidTest' 110*fa44fe6aSInna Palant } 111*fa44fe6aSInna Palant } 112*fa44fe6aSInna Palant 113*fa44fe6aSInna Palant configurations.configureEach { 114*fa44fe6aSInna Palant resolutionStrategy.eachDependency { DependencyResolveDetails details -> 115*fa44fe6aSInna Palant // Make sure that we're using the Android version of Guava 116*fa44fe6aSInna Palant if (details.requested.group == 'com.google.guava' 117*fa44fe6aSInna Palant && details.requested.module.name == 'guava' 118*fa44fe6aSInna Palant && details.requested.version.contains('jre')) { 119*fa44fe6aSInna Palant details.useVersion details.requested.version.replace('jre', 'android') 120*fa44fe6aSInna Palant } 121*fa44fe6aSInna Palant } 122*fa44fe6aSInna Palant } 123*fa44fe6aSInna Palant 124*fa44fe6aSInna Palant tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { compile -> 125*fa44fe6aSInna Palant kotlinOptions { 126*fa44fe6aSInna Palant // Treat all Kotlin warnings as errors 127*fa44fe6aSInna Palant allWarningsAsErrors = true 128*fa44fe6aSInna Palant // Set JVM target to 1.8 129*fa44fe6aSInna Palant jvmTarget = "1.8" 130*fa44fe6aSInna Palant // Allow use of @OptIn 131*fa44fe6aSInna Palant freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn" 132*fa44fe6aSInna Palant // Enable default methods in interfaces 133*fa44fe6aSInna Palant freeCompilerArgs += "-Xjvm-default=all" 134*fa44fe6aSInna Palant } 135*fa44fe6aSInna Palant } 136*fa44fe6aSInna Palant 137*fa44fe6aSInna Palant // Read in the signing.properties file if it is exists 138*fa44fe6aSInna Palant def signingPropsFile = rootProject.file('release/signing.properties') 139*fa44fe6aSInna Palant if (signingPropsFile.exists()) { 140*fa44fe6aSInna Palant def localProperties = new Properties() 141*fa44fe6aSInna Palant signingPropsFile.withInputStream { is -> localProperties.load(is) } 142*fa44fe6aSInna Palant localProperties.each { prop -> 143*fa44fe6aSInna Palant if (prop.key == "signing.secretKeyRingFile") { 144*fa44fe6aSInna Palant // If this is the key ring, treat it as a relative path 145*fa44fe6aSInna Palant project.ext.set(prop.key, rootProject.file(prop.value).absolutePath) 146*fa44fe6aSInna Palant } else { 147*fa44fe6aSInna Palant project.ext.set(prop.key, prop.value) 148*fa44fe6aSInna Palant } 149*fa44fe6aSInna Palant } 150*fa44fe6aSInna Palant } 151*fa44fe6aSInna Palant 152*fa44fe6aSInna Palant // Must be afterEvaluate or else com.vanniktech.maven.publish will overwrite our 153*fa44fe6aSInna Palant // dokka and version configuration. 154*fa44fe6aSInna Palant afterEvaluate { 155*fa44fe6aSInna Palant if (tasks.findByName('dokkaHtmlPartial') == null) { 156*fa44fe6aSInna Palant // If dokka isn't enabled on this module, skip 157*fa44fe6aSInna Palant return 158*fa44fe6aSInna Palant } 159*fa44fe6aSInna Palant 160*fa44fe6aSInna Palant tasks.named('dokkaHtmlPartial') { 161*fa44fe6aSInna Palant dokkaSourceSets.configureEach { 162*fa44fe6aSInna Palant reportUndocumented.set(true) 163*fa44fe6aSInna Palant skipEmptyPackages.set(true) 164*fa44fe6aSInna Palant skipDeprecated.set(true) 165*fa44fe6aSInna Palant jdkVersion.set(8) 166*fa44fe6aSInna Palant 167*fa44fe6aSInna Palant // Add Android SDK packages 168*fa44fe6aSInna Palant noAndroidSdkLink.set(false) 169*fa44fe6aSInna Palant 170*fa44fe6aSInna Palant // Add samples from :sample module 171*fa44fe6aSInna Palant samples.from(rootProject.file("sample/src/main/java/")) 172*fa44fe6aSInna Palant 173*fa44fe6aSInna Palant // AndroidX + Compose docs 174*fa44fe6aSInna Palant externalDocumentationLink { 175*fa44fe6aSInna Palant url.set(new URL("https://developer.android.com/reference/")) 176*fa44fe6aSInna Palant packageListUrl.set(new URL("https://developer.android.com/reference/androidx/package-list")) 177*fa44fe6aSInna Palant } 178*fa44fe6aSInna Palant externalDocumentationLink { 179*fa44fe6aSInna Palant url.set(new URL("https://developer.android.com/reference/kotlin/")) 180*fa44fe6aSInna Palant packageListUrl.set(new URL("https://developer.android.com/reference/kotlin/androidx/package-list")) 181*fa44fe6aSInna Palant } 182*fa44fe6aSInna Palant 183*fa44fe6aSInna Palant sourceLink { 184*fa44fe6aSInna Palant localDirectory.set(project.file("src/main/java")) 185*fa44fe6aSInna Palant // URL showing where the source code can be accessed through the web browser 186*fa44fe6aSInna Palant remoteUrl.set(new URL("https://github.com/google/accompanist/blob/main/${project.name}/src/main/java")) 187*fa44fe6aSInna Palant // Suffix which is used to append the line number to the URL. Use #L for GitHub 188*fa44fe6aSInna Palant remoteLineSuffix.set("#L") 189*fa44fe6aSInna Palant } 190*fa44fe6aSInna Palant } 191*fa44fe6aSInna Palant } 192*fa44fe6aSInna Palant } 193*fa44fe6aSInna Palant 194*fa44fe6aSInna Palant afterEvaluate { 195*fa44fe6aSInna Palant def composeSnapshot = libs.versions.composesnapshot.get() 196*fa44fe6aSInna Palant if (composeSnapshot.length() > 1) { 197*fa44fe6aSInna Palant // We're depending on a Jetpack Compose snapshot, update the library version name 198*fa44fe6aSInna Palant // to indicate it's from a Compose snapshot 199*fa44fe6aSInna Palant def versionName = project.properties.get('VERSION_NAME') 200*fa44fe6aSInna Palant if (versionName.contains("SNAPSHOT")) { 201*fa44fe6aSInna Palant version = versionName.replace('-SNAPSHOT', ".compose-${composeSnapshot}-SNAPSHOT") 202*fa44fe6aSInna Palant } 203*fa44fe6aSInna Palant } 204*fa44fe6aSInna Palant 205*fa44fe6aSInna Palant if (!version.endsWith('SNAPSHOT')) { 206*fa44fe6aSInna Palant // If we're not a SNAPSHOT library version, we fail the build if we're relying on 207*fa44fe6aSInna Palant // any snapshot dependencies 208*fa44fe6aSInna Palant configurations.configureEach { configuration -> 209*fa44fe6aSInna Palant configuration.dependencies.configureEach { dependency -> 210*fa44fe6aSInna Palant if (dependency instanceof ProjectDependency) { 211*fa44fe6aSInna Palant // We don't care about internal project dependencies 212*fa44fe6aSInna Palant return 213*fa44fe6aSInna Palant } 214*fa44fe6aSInna Palant 215*fa44fe6aSInna Palant def depVersion = dependency.version 216*fa44fe6aSInna Palant if (depVersion != null && depVersion.endsWith('SNAPSHOT')) { 217*fa44fe6aSInna Palant throw new IllegalArgumentException( 218*fa44fe6aSInna Palant "Using SNAPSHOT dependency with non-SNAPSHOT library version: $dependency" 219*fa44fe6aSInna Palant ) 220*fa44fe6aSInna Palant } 221*fa44fe6aSInna Palant } 222*fa44fe6aSInna Palant } 223*fa44fe6aSInna Palant } 224*fa44fe6aSInna Palant } 225*fa44fe6aSInna Palant} 226