From 01694b41ec09da755276396fa2618cc6805d18ef Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Fri, 13 Jun 2025 11:18:57 -0400 Subject: [PATCH 1/6] dataconnect: demo: build.gradle.kts: update dependencies --- firebase-dataconnect/demo/build.gradle.kts | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/firebase-dataconnect/demo/build.gradle.kts b/firebase-dataconnect/demo/build.gradle.kts index 7c00d7d0445..baad45dda7c 100644 --- a/firebase-dataconnect/demo/build.gradle.kts +++ b/firebase-dataconnect/demo/build.gradle.kts @@ -19,10 +19,10 @@ import java.nio.charset.StandardCharsets plugins { // Use whichever versions of these dependencies suit your application. - // The versions shown here were the latest versions as of May 09, 2025. + // The versions shown here were the latest versions as of June 10, 2025. // Note, however, that the version of kotlin("plugin.serialization") _must_, // in general, match the version of kotlin("android"). - id("com.android.application") version "8.9.2" + id("com.android.application") version "8.10.1" id("com.google.gms.google-services") version "4.4.2" val kotlinVersion = "2.1.10" kotlin("android") version kotlinVersion @@ -35,14 +35,17 @@ plugins { dependencies { // Use whichever versions of these dependencies suit your application. - // The versions shown here were the latest versions as of May 09, 2025. - implementation("com.google.firebase:firebase-dataconnect:16.0.1") + // The versions shown here were the latest versions as of June 10, 2025. + + // Data Connect + implementation(platform("com.google.firebase:firebase-bom:33.15.0")) + implementation("com.google.firebase:firebase-dataconnect") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.1") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.1") - implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0") - implementation("androidx.appcompat:appcompat:1.7.0") + implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.1") + implementation("androidx.appcompat:appcompat:1.7.1") implementation("androidx.activity:activity-ktx:1.10.1") - implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.9.0") + implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.9.1") implementation("com.google.android.material:material:1.12.0") // The following code in this "dependencies" block can be omitted from customer From a0fc463222c1ff2a5e7f2ff9208c05101b8cdb15 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Fri, 13 Jun 2025 11:51:43 -0400 Subject: [PATCH 2/6] dataconnect: demo: build.gradle.kts: add ability to specify the Data Connect emulator executable to use. --- firebase-dataconnect/demo/build.gradle.kts | 23 +++++++++++++++++++-- firebase-dataconnect/demo/gradle.properties | 18 ++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/firebase-dataconnect/demo/build.gradle.kts b/firebase-dataconnect/demo/build.gradle.kts index baad45dda7c..fe22a91d2d1 100644 --- a/firebase-dataconnect/demo/build.gradle.kts +++ b/firebase-dataconnect/demo/build.gradle.kts @@ -124,6 +124,11 @@ abstract class DataConnectGenerateSourcesTask : DefaultTask() { @get:Input @get:Optional abstract val nodeExecutableDirectory: Property + @get:InputFile + @get:Optional + @get:PathSensitive(PathSensitivity.ABSOLUTE) + abstract val dataConnectEmulatorExecutable: RegularFileProperty + @get:OutputDirectory abstract val outputDirectory: DirectoryProperty @get:Internal abstract val workDirectory: DirectoryProperty @@ -140,6 +145,7 @@ abstract class DataConnectGenerateSourcesTask : DefaultTask() { val firebaseToolsVersion: String = firebaseToolsVersion.get() val firebaseCommand: String = firebaseCommand.get() val nodeExecutableDirectory: String? = nodeExecutableDirectory.orNull + val dataConnectEmulatorExecutable: File? = dataConnectEmulatorExecutable.orNull?.asFile val outputDirectory: File = outputDirectory.get().asFile val workDirectory: File = workDirectory.get().asFile @@ -147,6 +153,7 @@ abstract class DataConnectGenerateSourcesTask : DefaultTask() { logger.info("firebaseToolsVersion: {}", firebaseToolsVersion) logger.info("firebaseCommand: {}", firebaseCommand) logger.info("nodeExecutableDirectory: {}", nodeExecutableDirectory) + logger.info("dataConnectEmulatorExecutable: {}", dataConnectEmulatorExecutable) logger.info("outputDirectory: {}", outputDirectory.absolutePath) logger.info("workDirectory: {}", workDirectory.absolutePath) @@ -170,6 +177,7 @@ abstract class DataConnectGenerateSourcesTask : DefaultTask() { this, firebaseCommand = firebaseCommand, nodeExecutableDirectory = nodeExecutableDirectory, + dataConnectEmulatorExecutable = dataConnectEmulatorExecutable, path = providerFactory.environmentVariable("PATH").orNull, ) args("--debug", "dataconnect:sdk:generate") @@ -197,6 +205,7 @@ abstract class DataConnectGenerateSourcesTask : DefaultTask() { execSpec: ExecSpec, firebaseCommand: String, nodeExecutableDirectory: String?, + dataConnectEmulatorExecutable: File?, path: String?, ) { execSpec.setCommandLine(firebaseCommand) @@ -215,6 +224,10 @@ abstract class DataConnectGenerateSourcesTask : DefaultTask() { if (newPath !== null) { execSpec.environment("PATH", newPath) } + + if (dataConnectEmulatorExecutable !== null) { + execSpec.environment("DATACONNECT_EMULATOR_BINARY_PATH", dataConnectEmulatorExecutable) + } } } } @@ -265,14 +278,19 @@ run { firebaseCommand = project.providers - .gradleProperty("dataConnect.minimalApp.firebaseCommand") + .gradleProperty("dataConnect.demo.firebaseCommand") .orElse("firebase") nodeExecutableDirectory = - project.providers.gradleProperty("dataConnect.minimalApp.nodeExecutableDirectory").map { + project.providers.gradleProperty("dataConnect.demo.nodeExecutableDirectory").map { projectDirectory.dir(it).asFile.absolutePath } + dataConnectEmulatorExecutable = + project.providers + .gradleProperty("dataConnect.demo.dataConnectEmulatorExecutable") + .map { projectDirectory.file(it) } + val path = providers.environmentVariable("PATH") firebaseToolsVersion = providers @@ -281,6 +299,7 @@ run { this, firebaseCommand = firebaseCommand.get(), nodeExecutableDirectory = nodeExecutableDirectory.orNull, + dataConnectEmulatorExecutable = dataConnectEmulatorExecutable.orNull?.asFile, path = path.orNull, ) args("--version") diff --git a/firebase-dataconnect/demo/gradle.properties b/firebase-dataconnect/demo/gradle.properties index 12a9a7c6e9c..cab63a85bad 100644 --- a/firebase-dataconnect/demo/gradle.properties +++ b/firebase-dataconnect/demo/gradle.properties @@ -5,3 +5,21 @@ org.gradle.caching=true android.useAndroidX=true org.gradle.jvmargs=-Xmx2g + +// The path of the "firebase" command to use. +// If not specified, then "firebase" is used, resolved using the PATH environment variable. +// See build.gradle.kts for details. +//dataConnect.demo.firebaseCommand=/path/to/firebase + +// The path of the directory containing the "node" and "npm" commands. +// This directory will be prepended to the PATH before running the "firebase" command +// and may be useful to override the "node" and "npm" executables that get used by it. +// See build.gradle.kts for details. +//dataConnect.demo.nodeExecutableDirectory=/path/to/node/bin + +// The Data Connect emulator executable to use. +// If set, the `DATACONNECT_EMULATOR_BINARY_PATH` environment variable will be set before calling +// the "firebase" command to instruct it to use the specified Data Connect emulator rather than +// downloading an official version and using it. +// See build.gradle.kts for details. +//dataConnect.demo.dataConnectEmulatorExecutable=/path/to/cli From 64d583bed08fb9511a8ec3083e1cb51f3a3e1157 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Fri, 13 Jun 2025 11:57:07 -0400 Subject: [PATCH 3/6] gradle spotlessApply --- firebase-dataconnect/demo/build.gradle.kts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/firebase-dataconnect/demo/build.gradle.kts b/firebase-dataconnect/demo/build.gradle.kts index fe22a91d2d1..80e76382d5f 100644 --- a/firebase-dataconnect/demo/build.gradle.kts +++ b/firebase-dataconnect/demo/build.gradle.kts @@ -277,9 +277,7 @@ run { outputDirectory = layout.buildDirectory.dir("dataConnect/generatedSources") firebaseCommand = - project.providers - .gradleProperty("dataConnect.demo.firebaseCommand") - .orElse("firebase") + project.providers.gradleProperty("dataConnect.demo.firebaseCommand").orElse("firebase") nodeExecutableDirectory = project.providers.gradleProperty("dataConnect.demo.nodeExecutableDirectory").map { @@ -287,9 +285,9 @@ run { } dataConnectEmulatorExecutable = - project.providers - .gradleProperty("dataConnect.demo.dataConnectEmulatorExecutable") - .map { projectDirectory.file(it) } + project.providers.gradleProperty("dataConnect.demo.dataConnectEmulatorExecutable").map { + projectDirectory.file(it) + } val path = providers.environmentVariable("PATH") firebaseToolsVersion = From b142ccf65dac7af44c75f9e58f330414797331a2 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Fri, 13 Jun 2025 12:03:25 -0400 Subject: [PATCH 4/6] dataconnect_demo_app.yml: fix "minimalApp" to "demo" --- .github/workflows/dataconnect_demo_app.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dataconnect_demo_app.yml b/.github/workflows/dataconnect_demo_app.yml index 24a5434bd57..ccbc005ba1d 100644 --- a/.github/workflows/dataconnect_demo_app.yml +++ b/.github/workflows/dataconnect_demo_app.yml @@ -109,7 +109,7 @@ jobs: --no-daemon \ ${{ (inputs.gradleInfoLog && '--info') || '' }} \ --profile \ - -PdataConnect.minimalApp.firebaseCommand=${{ env.FDC_FIREBASE_COMMAND }} \ + -PdataConnect.demo.firebaseCommand=${{ env.FDC_FIREBASE_COMMAND }} \ assemble test - uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 From ced6fc84fe34ec04fd76a8f7aac814c44d921d04 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Fri, 13 Jun 2025 12:04:58 -0400 Subject: [PATCH 5/6] dataconnect: demo: add "dokka" to generate ktdoc --- .github/workflows/dataconnect_demo_app.yml | 16 +++++++++++++++- firebase-dataconnect/demo/build.gradle.kts | 9 +++++++++ firebase-dataconnect/demo/gradle.properties | 3 +++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/.github/workflows/dataconnect_demo_app.yml b/.github/workflows/dataconnect_demo_app.yml index ccbc005ba1d..cc00b5379cc 100644 --- a/.github/workflows/dataconnect_demo_app.yml +++ b/.github/workflows/dataconnect_demo_app.yml @@ -106,12 +106,19 @@ jobs: set -x firebase-dataconnect/demo/gradlew \ --project-dir firebase-dataconnect/demo \ - --no-daemon \ ${{ (inputs.gradleInfoLog && '--info') || '' }} \ --profile \ -PdataConnect.demo.firebaseCommand=${{ env.FDC_FIREBASE_COMMAND }} \ assemble test + - name: gradle dokkaGeneratePublicationHtml + run: | + set -x + firebase-dataconnect/demo/gradlew \ + --project-dir firebase-dataconnect/demo \ + ${{ (inputs.gradleInfoLog && '--info') || '' }} \ + dokkaGeneratePublicationHtml + - uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 with: name: apks @@ -126,6 +133,13 @@ jobs: if-no-files-found: warn compression-level: 9 + - uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 + with: + name: ktdoc + path: firebase-dataconnect/demo/build/dokka/html + if-no-files-found: warn + compression-level: 9 + spotlessCheck: continue-on-error: false runs-on: ubuntu-latest diff --git a/firebase-dataconnect/demo/build.gradle.kts b/firebase-dataconnect/demo/build.gradle.kts index 80e76382d5f..5fc5d51bb5d 100644 --- a/firebase-dataconnect/demo/build.gradle.kts +++ b/firebase-dataconnect/demo/build.gradle.kts @@ -31,6 +31,8 @@ plugins { // The following code in this "plugins" block can be omitted from customer // facing documentation as it is an implementation detail of this application. id("com.diffplug.spotless") version "7.0.0.BETA4" + + id("org.jetbrains.dokka") version "2.0.0" } dependencies { @@ -55,6 +57,13 @@ dependencies { implementation("io.kotest.extensions:kotest-property-arbs:2.1.2") } +dokka { + moduleName.set("Data Connect Demo") + dokkaSourceSets.main { + sourceRoots.from(layout.buildDirectory.dir("dataConnect/generatedSources/").get()) + } +} + // The remaining code in this file can be omitted from customer facing // documentation. It's here just to make things compile and/or configure // optional components of the build (e.g. spotless code formatting). diff --git a/firebase-dataconnect/demo/gradle.properties b/firebase-dataconnect/demo/gradle.properties index cab63a85bad..7dbd8447c27 100644 --- a/firebase-dataconnect/demo/gradle.properties +++ b/firebase-dataconnect/demo/gradle.properties @@ -6,6 +6,9 @@ android.useAndroidX=true org.gradle.jvmargs=-Xmx2g +org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled +org.jetbrains.dokka.experimental.gradle.pluginMode.noWarn=true + // The path of the "firebase" command to use. // If not specified, then "firebase" is used, resolved using the PATH environment variable. // See build.gradle.kts for details. From ebe431057e8b4c2dc29fea6498fb36fbcb4902cb Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Fri, 13 Jun 2025 12:35:57 -0400 Subject: [PATCH 6/6] build.gradle.kts: use `dataConnectEmulatorExecutable.absolutePath` instead of just `dataConnectEmulatorExecutable` --- firebase-dataconnect/demo/build.gradle.kts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/firebase-dataconnect/demo/build.gradle.kts b/firebase-dataconnect/demo/build.gradle.kts index 80e76382d5f..73204c49651 100644 --- a/firebase-dataconnect/demo/build.gradle.kts +++ b/firebase-dataconnect/demo/build.gradle.kts @@ -226,7 +226,10 @@ abstract class DataConnectGenerateSourcesTask : DefaultTask() { } if (dataConnectEmulatorExecutable !== null) { - execSpec.environment("DATACONNECT_EMULATOR_BINARY_PATH", dataConnectEmulatorExecutable) + execSpec.environment( + "DATACONNECT_EMULATOR_BINARY_PATH", + dataConnectEmulatorExecutable.absolutePath, + ) } } }