Skip to content
3 changes: 2 additions & 1 deletion .github/workflows/dataconnect.yml
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ jobs:

./gradlew \
--profile \
--warning-mode all \
${{ (inputs.gradleInfoLog && '--info') || '' }} \
:firebase-dataconnect:assembleDebugAndroidTest

Expand Down Expand Up @@ -222,7 +223,7 @@ jobs:
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
disable-animations: true
script: |
set -eux && ./gradlew ${{ (inputs.gradleInfoLog && '--info') || '' }} :firebase-dataconnect:connectedCheck :firebase-dataconnect:connectors:connectedCheck
set -eux && ./gradlew --warning-mode all ${{ (inputs.gradleInfoLog && '--info') || '' }} :firebase-dataconnect:connectedCheck :firebase-dataconnect:connectors:connectedCheck

- name: Upload Log Files
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/dataconnect_demo_app.yml
Original file line number Diff line number Diff line change
Expand Up @@ -108,13 +108,15 @@ jobs:
--project-dir firebase-dataconnect/demo \
${{ (inputs.gradleInfoLog && '--info') || '' }} \
--profile \
--warning-mode all \
-PdataConnect.demo.firebaseCommand=${{ env.FDC_FIREBASE_COMMAND }} \
assemble test

- name: gradle dokkaGeneratePublicationHtml
run: |
set -x
firebase-dataconnect/demo/gradlew \
--warning-mode all \
--project-dir firebase-dataconnect/demo \
${{ (inputs.gradleInfoLog && '--info') || '' }} \
dokkaGeneratePublicationHtml
Expand Down Expand Up @@ -176,6 +178,7 @@ jobs:
run: |
set -x
firebase-dataconnect/demo/gradlew \
--warning-mode all \
--project-dir firebase-dataconnect/demo \
--no-daemon \
${{ (inputs.gradleInfoLog && '--info') || '' }} \
Expand Down
19 changes: 12 additions & 7 deletions firebase-dataconnect/androidTestutil/androidTestutil.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.jetbrains.kotlin.gradle.dsl.JvmTarget

plugins {
id("com.android.library")
Expand All @@ -31,14 +31,16 @@ android {
compileSdk = compileSdkVersion
defaultConfig {
minSdk = minSdkVersion
targetSdk = targetSdkVersion
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions { jvmTarget = "1.8" }

@Suppress("UnstableApiUsage") testOptions { targetSdk = targetSdkVersion }

lint { targetSdk = targetSdkVersion }

packaging {
resources {
Expand All @@ -48,6 +50,13 @@ android {
}
}

kotlin {
compilerOptions {
jvmTarget = JvmTarget.JVM_1_8
optIn.add("kotlin.RequiresOptIn")
}
}

dependencies {
implementation(project(":firebase-dataconnect"))
implementation(project(":firebase-dataconnect:testutil"))
Expand All @@ -66,7 +75,3 @@ dependencies {
implementation(libs.truth)
implementation(libs.turbine)
}

tasks.withType<KotlinCompile>().all {
kotlinOptions { freeCompilerArgs = listOf("-opt-in=kotlin.RequiresOptIn") }
}
26 changes: 15 additions & 11 deletions firebase-dataconnect/connectors/connectors.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@
*/

import com.google.firebase.dataconnect.gradle.plugin.UpdateDataConnectExecutableVersionsTask
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.gradle.kotlin.dsl.withType
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile

plugins {
id("com.android.library")
Expand All @@ -33,23 +35,24 @@ android {
compileSdk = compileSdkVersion
defaultConfig {
minSdk = minSdkVersion
targetSdk = targetSdkVersion
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions { jvmTarget = "1.8" }

@Suppress("UnstableApiUsage")
testOptions {
targetSdk = targetSdkVersion
unitTests {
isIncludeAndroidResources = true
isReturnDefaultValues = true
}
}

lint { targetSdk = targetSdkVersion }

packaging {
resources {
excludes.add("META-INF/LICENSE.md")
Expand All @@ -63,6 +66,13 @@ android {
}
}

kotlin {
compilerOptions {
jvmTarget = JvmTarget.JVM_1_8
optIn.add("kotlin.RequiresOptIn")
}
}

dependencies {
implementation(project(":firebase-dataconnect"))
implementation(libs.kotlinx.coroutines.core)
Expand Down Expand Up @@ -92,21 +102,15 @@ dependencies {
androidTestImplementation(libs.turbine)
}

tasks.withType<KotlinCompile>().all {
kotlinOptions { freeCompilerArgs = listOf("-opt-in=kotlin.RequiresOptIn") }
}

// Enable Kotlin "Explicit API Mode". This causes the Kotlin compiler to fail if any
// classes, methods, or properties have implicit `public` visibility. This check helps
// avoid accidentally leaking elements into the public API, requiring that any public
// element be explicitly declared as `public`.
// https://github.com/Kotlin/KEEP/blob/master/proposals/explicit-api-mode.md
// https://chao2zhang.medium.com/explicit-api-mode-for-kotlin-on-android-b8264fdd76d1
tasks.withType<KotlinCompile>().all {
tasks.withType<KotlinJvmCompile>().configureEach {
if (!name.contains("test", ignoreCase = true)) {
if (!kotlinOptions.freeCompilerArgs.contains("-Xexplicit-api=strict")) {
kotlinOptions.freeCompilerArgs += "-Xexplicit-api=strict"
}
compilerOptions.freeCompilerArgs.add("-Xexplicit-api=strict")
}
}

Expand Down
11 changes: 9 additions & 2 deletions firebase-dataconnect/demo/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

import com.android.build.api.variant.ApplicationAndroidComponentsExtension
import java.nio.charset.StandardCharsets
import org.jetbrains.kotlin.gradle.dsl.JvmTarget

plugins {
// Use whichever versions of these dependencies suit your application.
Expand Down Expand Up @@ -83,7 +84,13 @@ android {
isCoreLibraryDesugaringEnabled = true
}
buildFeatures.viewBinding = true
kotlinOptions.jvmTarget = "1.8"
}

kotlin {
compilerOptions {
jvmTarget = JvmTarget.JVM_1_8
optIn.add("kotlin.RequiresOptIn")
}
}

spotless {
Expand Down Expand Up @@ -115,7 +122,7 @@ spotless {
target("**/*.xml")
targetExclude("build/")
trimTrailingWhitespace()
indentWithSpaces(2)
leadingTabsToSpaces(2)
endWithNewline()
}
}
Expand Down
23 changes: 12 additions & 11 deletions firebase-dataconnect/firebase-dataconnect.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@
* limitations under the License.
*/

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.gradle.kotlin.dsl.withType
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile

plugins {
id("firebase-library")
Expand Down Expand Up @@ -43,15 +45,13 @@ android {
compileSdk = compileSdkVersion
defaultConfig {
minSdk = minSdkVersion
targetSdk = targetSdkVersion
multiDexEnabled = true
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions { jvmTarget = "1.8" }

@Suppress("UnstableApiUsage")
testOptions {
Expand All @@ -72,6 +72,13 @@ android {
}
}

kotlin {
compilerOptions {
jvmTarget = JvmTarget.JVM_1_8
optIn.add("kotlin.RequiresOptIn")
}
}

protobuf {
protoc { artifact = "${libs.protoc.get()}" }
plugins {
Expand Down Expand Up @@ -144,20 +151,14 @@ dependencies {
androidTestImplementation(libs.turbine)
}

tasks.withType<KotlinCompile>().all {
kotlinOptions { freeCompilerArgs = listOf("-opt-in=kotlin.RequiresOptIn") }
}

// Enable Kotlin "Explicit API Mode". This causes the Kotlin compiler to fail if any
// classes, methods, or properties have implicit `public` visibility. This check helps
// avoid accidentally leaking elements into the public API, requiring that any public
// element be explicitly declared as `public`.
// https://github.com/Kotlin/KEEP/blob/master/proposals/explicit-api-mode.md
// https://chao2zhang.medium.com/explicit-api-mode-for-kotlin-on-android-b8264fdd76d1
tasks.withType<KotlinCompile>().all {
tasks.withType<KotlinJvmCompile>().configureEach {
if (!name.contains("test", ignoreCase = true)) {
if (!kotlinOptions.freeCompilerArgs.contains("-Xexplicit-api=strict")) {
kotlinOptions.freeCompilerArgs += "-Xexplicit-api=strict"
}
compilerOptions.freeCompilerArgs.add("-Xexplicit-api=strict")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,14 @@ import java.net.HttpURLConnection
import java.net.URL
import java.security.MessageDigest
import java.util.regex.Pattern
import javax.inject.Inject
import kotlin.time.Duration.Companion.seconds
import kotlin.time.DurationUnit
import kotlin.time.toDuration
import org.gradle.api.DefaultTask
import org.gradle.api.Task
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.FileSystemOperations
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.provider.Property
import org.gradle.api.tasks.Input
Expand All @@ -34,6 +36,7 @@ import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
import org.gradle.process.ExecOperations

abstract class DataConnectExecutableDownloadTask : DefaultTask() {

Expand All @@ -47,6 +50,10 @@ abstract class DataConnectExecutableDownloadTask : DefaultTask() {

@get:OutputFile abstract val outputFile: RegularFileProperty

@get:Inject abstract val fileSystemOperations: FileSystemOperations

@get:Inject abstract val execOperations: ExecOperations

@TaskAction
fun run() {
val inputFile: File? = inputFile.orNull?.asFile
Expand All @@ -62,7 +69,7 @@ abstract class DataConnectExecutableDownloadTask : DefaultTask() {
logger.info("outputFile: {}", outputFile)

logger.info("Deleting build directory: {}", buildDirectory)
project.delete(buildDirectory)
fileSystemOperations.delete { it.delete(buildDirectory) }

if (inputFile !== null && version !== null) {
throw DataConnectGradleException(
Expand All @@ -74,7 +81,7 @@ abstract class DataConnectExecutableDownloadTask : DefaultTask() {
} else if (inputFile !== null) {
runWithFile(inputFile = inputFile, outputFile = outputFile)
} else if (version !== null) {
downloadDataConnectExecutable(version, operatingSystem, outputFile)
downloadDataConnectExecutable(version, operatingSystem, outputFile, execOperations)
verifyOutputFile(outputFile, operatingSystem, version)
} else {
throw DataConnectGradleException(
Expand Down Expand Up @@ -184,7 +191,7 @@ abstract class DataConnectExecutableDownloadTask : DefaultTask() {
}

logger.info("Copying {} to {}", inputFile, outputFile)
project.copy {
fileSystemOperations.copy {
it.from(inputFile)
it.into(outputFile.parentFile)
it.rename(Pattern.quote(inputFile.name), Pattern.quote(outputFile.name))
Expand All @@ -195,7 +202,8 @@ abstract class DataConnectExecutableDownloadTask : DefaultTask() {
fun Task.downloadDataConnectExecutable(
version: String,
operatingSystem: OperatingSystem,
outputFile: File
outputFile: File,
execOperations: ExecOperations
) {
val osName =
when (operatingSystem) {
Expand All @@ -208,7 +216,7 @@ abstract class DataConnectExecutableDownloadTask : DefaultTask() {
URL("https://storage.googleapis.com/firemat-preview-drop/emulator/$downloadFileName")

logger.info("Downloading {} to {}", url, outputFile)
project.mkdir(outputFile.parentFile)
outputFile.parentFile.mkdirs()

val connection = url.openConnection() as HttpURLConnection
connection.requestMethod = "GET"
Expand Down Expand Up @@ -251,7 +259,7 @@ abstract class DataConnectExecutableDownloadTask : DefaultTask() {
}

if (operatingSystem != OperatingSystem.Windows) {
project.exec { execSpec ->
execOperations.exec { execSpec ->
execSpec.run {
executable = "chmod"
args = listOf("a+x", outputFile.absolutePath)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ package com.google.firebase.dataconnect.gradle.plugin

import java.io.File
import org.gradle.api.Task
import org.gradle.process.ExecOperations

interface DataConnectExecutableConfig {
var outputDirectory: File?
Expand All @@ -33,6 +34,7 @@ fun Task.runDataConnectExecutable(
dataConnectExecutable: File,
subCommand: List<String>,
configDirectory: File,
execOperations: ExecOperations,
configure: DataConnectExecutableConfig.() -> Unit,
) {
val config =
Expand All @@ -48,11 +50,11 @@ fun Task.runDataConnectExecutable(
}
.apply(configure)

val logFile = config.logFile?.also { project.mkdir(it.parentFile) }
val logFile = config.logFile?.also { it.parentFile.mkdirs() }
val logFileStream = logFile?.outputStream()

try {
project.exec { execSpec ->
execOperations.exec { execSpec ->
execSpec.run {
executable(dataConnectExecutable)
isIgnoreExitValue = false
Expand Down
Loading
Loading