From 26bcf23f688e3d3a41b69d54321c180f94858b3d Mon Sep 17 00:00:00 2001 From: Dale Hawkins <107309+dkhawk@users.noreply.github.com> Date: Thu, 3 Sep 2026 15:29:19 -0600 Subject: [PATCH] feat(attribution): register usage attribution with Places SDK and remove legacy library module --- library/.gitignore | 1 - library/build.gradle.kts | 93 ------------------- library/consumer-rules.pro | 0 library/src/main/AndroidManifest.xml | 31 ------- places-compose-demo/build.gradle.kts | 1 - places-compose/build.gradle.kts | 41 ++++++++ places-compose/src/main/AndroidManifest.xml | 15 ++- .../attribution/AttributionIdInitializer.kt | 19 ++-- .../AttributionIdInitializerTest.kt | 27 +++--- settings.gradle.kts | 1 - 10 files changed, 79 insertions(+), 150 deletions(-) delete mode 100644 library/.gitignore delete mode 100644 library/build.gradle.kts delete mode 100644 library/consumer-rules.pro delete mode 100644 library/src/main/AndroidManifest.xml rename {library/src/main/java/com/google/android/libraries/places/compose/library => places-compose/src/main/java/com/google/android/libraries/places/compose/autocomplete}/utils/attribution/AttributionIdInitializer.kt (63%) rename {library/src/test/java/com/google/android/libraries/places/compose/library => places-compose/src/test/java/com/google/android/libraries/places/compose/autocomplete}/utils/attribution/AttributionIdInitializerTest.kt (65%) diff --git a/library/.gitignore b/library/.gitignore deleted file mode 100644 index 796b96d..0000000 --- a/library/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/library/build.gradle.kts b/library/build.gradle.kts deleted file mode 100644 index 6bdff5c..0000000 --- a/library/build.gradle.kts +++ /dev/null @@ -1,93 +0,0 @@ -import org.jetbrains.kotlin.gradle.dsl.JvmTarget - -plugins { - alias(libs.plugins.androidLibrary) - alias(libs.plugins.kotlin.android) -} - -android { - namespace = "com.google.android.libraries.places.compose.library" - compileSdk { - version = release(libs.versions.compileSdk.get().toInt()) - } - - defaultConfig { - minSdk = libs.versions.minimumSdk.get().toInt() - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - - java { - toolchain { - languageVersion.set(JavaLanguageVersion.of(17)) - } - } - - kotlin { - compilerOptions { - jvmTarget.set(JvmTarget.JVM_17) - } - } - -} - -dependencies { - implementation(libs.androidx.appcompat) - implementation(libs.androidx.core.ktx) - implementation(libs.material) - implementation(libs.play.services.maps) - implementation(libs.startup.runtime) - testImplementation(libs.junit) - testImplementation(libs.robolectric) - testImplementation(libs.mockk) - testImplementation(libs.core.ktx) -} - -abstract class GenerateArtifactIdTask : DefaultTask() { - @get:OutputDirectory - abstract val outputDir: DirectoryProperty - - @get:Input - abstract val version: Property - - @TaskAction - fun generate() { - val dir = outputDir.get().asFile - val packageName = "com.google.android.libraries.places.compose.library.utils.meta" - val packagePath = packageName.replace('.', '/') - val outputFile = File(dir, "$packagePath/ArtifactId.kt") - outputFile.parentFile.mkdirs() - val attributionId = "gmp_git_androidplacescompose_v${version.get()}" - outputFile.writeText( - """ - package $packageName - - /** - * Automatically generated object containing the library's attribution ID. - * This is used to track library usage for analytics. - */ - public object AttributionId { - public const val VALUE: String = "$attributionId" - } - """.trimIndent() - ) - } -} - -val generateArtifactIdFile = tasks.register("generateArtifactIdFile") { - outputDir.set(layout.buildDirectory.dir("generated/source/artifactId")) - version.set(project.version.toString()) -} - -androidComponents { - onVariants { variant -> - variant.sources.java?.addGeneratedSourceDirectory( - generateArtifactIdFile, - GenerateArtifactIdTask::outputDir - ) - } -} diff --git a/library/consumer-rules.pro b/library/consumer-rules.pro deleted file mode 100644 index e69de29..0000000 diff --git a/library/src/main/AndroidManifest.xml b/library/src/main/AndroidManifest.xml deleted file mode 100644 index 863ae4b..0000000 --- a/library/src/main/AndroidManifest.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - diff --git a/places-compose-demo/build.gradle.kts b/places-compose-demo/build.gradle.kts index 4c38acc..5d27189 100644 --- a/places-compose-demo/build.gradle.kts +++ b/places-compose-demo/build.gradle.kts @@ -95,7 +95,6 @@ dependencies { implementation(libs.kotlin.reflect) implementation(libs.androidx.navigation.compose) implementation(libs.androidx.lifecycle.viewmodel.compose) - implementation(project(":library")) // Hilt implementation(libs.dagger) ksp(libs.hilt.android.compiler) diff --git a/places-compose/build.gradle.kts b/places-compose/build.gradle.kts index 86b3ae4..7069ce3 100644 --- a/places-compose/build.gradle.kts +++ b/places-compose/build.gradle.kts @@ -49,6 +49,13 @@ android { } } + sourceSets { + getByName("main") { + java.directories.add("build/generated/source/artifactId") + kotlin.directories.add("build/generated/source/artifactId") + } + } + buildFeatures { buildConfig = true compose = true @@ -62,12 +69,46 @@ android { } } +// Artifact ID logic for usage attribution +val attributionId = "gmp_git_androidplacescompose_v$version" + +val generateArtifactIdFile = tasks.register("generateArtifactIdFile") { + val outputDir = layout.buildDirectory.dir("generated/source/artifactId") + val packageName = "com.google.android.libraries.places.compose.autocomplete.utils.meta" + val packagePath = packageName.replace('.', '/') + val outputFile = outputDir.get().file("$packagePath/ArtifactId.kt").asFile + + outputs.file(outputFile) + + doLast { + outputFile.parentFile.mkdirs() + outputFile.writeText( + """ + package $packageName + + /** + * Automatically generated object containing the library's attribution ID. + * This is used to track library usage for analytics. + */ + public object AttributionId { + public const val VALUE: String = "$attributionId" + } + """.trimIndent() + ) + } +} + +tasks.named("preBuild") { + dependsOn(generateArtifactIdFile) +} + dependencies { implementation(libs.androidx.core.ktx) implementation(libs.androidx.appcompat) implementation(libs.material) implementation(libs.places) + implementation(libs.startup.runtime) testImplementation(libs.junit) testImplementation(libs.androidx.ui.test.android) androidTestImplementation(libs.androidx.junit) diff --git a/places-compose/src/main/AndroidManifest.xml b/places-compose/src/main/AndroidManifest.xml index 5cb6777..b96b189 100644 --- a/places-compose/src/main/AndroidManifest.xml +++ b/places-compose/src/main/AndroidManifest.xml @@ -14,7 +14,20 @@ See the License for the specific language governing permissions and limitations under the License. --> - + + + + + + + \ No newline at end of file diff --git a/library/src/main/java/com/google/android/libraries/places/compose/library/utils/attribution/AttributionIdInitializer.kt b/places-compose/src/main/java/com/google/android/libraries/places/compose/autocomplete/utils/attribution/AttributionIdInitializer.kt similarity index 63% rename from library/src/main/java/com/google/android/libraries/places/compose/library/utils/attribution/AttributionIdInitializer.kt rename to places-compose/src/main/java/com/google/android/libraries/places/compose/autocomplete/utils/attribution/AttributionIdInitializer.kt index 1214b67..729263d 100644 --- a/library/src/main/java/com/google/android/libraries/places/compose/library/utils/attribution/AttributionIdInitializer.kt +++ b/places-compose/src/main/java/com/google/android/libraries/places/compose/autocomplete/utils/attribution/AttributionIdInitializer.kt @@ -13,28 +13,25 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.libraries.places.compose.library.utils.attribution + +package com.google.android.libraries.places.compose.autocomplete.utils.attribution import android.content.Context import androidx.annotation.Keep import androidx.startup.Initializer -import com.google.android.gms.maps.MapsApiSettings -import com.google.android.libraries.places.compose.library.utils.meta.AttributionId +import com.google.android.libraries.places.api.Places +import com.google.android.libraries.places.compose.autocomplete.utils.meta.AttributionId /** - * Adds a usage attribution ID to the initializer, which helps Google understand which libraries - * and samples are helpful to developers, such as usage of this library. + * Adds a usage attribution ID to the Places SDK initializer, which helps Google understand + * which libraries and samples are helpful to developers, such as usage of this library. + * * To opt out of sending the usage attribution ID, please remove this initializer from your manifest. */ @Keep internal class AttributionIdInitializer : Initializer { override fun create(context: Context) { - MapsApiSettings.addInternalUsageAttributionId( - // context = - context, - // internalUsageAttributionId = - AttributionId.VALUE, - ) + Places.addInternalUsageAttributionId(AttributionId.VALUE) } override fun dependencies(): List>> = emptyList() diff --git a/library/src/test/java/com/google/android/libraries/places/compose/library/utils/attribution/AttributionIdInitializerTest.kt b/places-compose/src/test/java/com/google/android/libraries/places/compose/autocomplete/utils/attribution/AttributionIdInitializerTest.kt similarity index 65% rename from library/src/test/java/com/google/android/libraries/places/compose/library/utils/attribution/AttributionIdInitializerTest.kt rename to places-compose/src/test/java/com/google/android/libraries/places/compose/autocomplete/utils/attribution/AttributionIdInitializerTest.kt index 880ba2e..83e422c 100644 --- a/library/src/test/java/com/google/android/libraries/places/compose/library/utils/attribution/AttributionIdInitializerTest.kt +++ b/places-compose/src/test/java/com/google/android/libraries/places/compose/autocomplete/utils/attribution/AttributionIdInitializerTest.kt @@ -13,12 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.libraries.places.compose.library.utils.attribution + +package com.google.android.libraries.places.compose.autocomplete.utils.attribution import android.content.Context import androidx.test.core.app.ApplicationProvider -import com.google.android.gms.maps.MapsApiSettings -import com.google.android.libraries.places.compose.library.utils.meta.AttributionId +import com.google.android.libraries.places.api.Places +import com.google.android.libraries.places.compose.autocomplete.utils.meta.AttributionId +import com.google.common.truth.Truth.assertThat import io.mockk.every import io.mockk.just import io.mockk.mockkStatic @@ -35,27 +37,30 @@ import org.robolectric.RobolectricTestRunner class AttributionIdInitializerTest { @Before fun setUp() { - mockkStatic(MapsApiSettings::class) - every { MapsApiSettings.addInternalUsageAttributionId(any(), any()) } just runs + mockkStatic(Places::class) + every { Places.addInternalUsageAttributionId(any()) } just runs } @After fun tearDown() { - unmockkStatic(MapsApiSettings::class) + unmockkStatic(Places::class) } @Test - fun `create adds internal usage attribution id`() { + fun create_addsInternalUsageAttributionIdToPlaces() { val context = ApplicationProvider.getApplicationContext() val initializer = AttributionIdInitializer() initializer.create(context) verify { - MapsApiSettings.addInternalUsageAttributionId( - context, - AttributionId.VALUE, - ) + Places.addInternalUsageAttributionId(AttributionId.VALUE) } } + + @Test + fun dependencies_returnsEmptyList() { + val initializer = AttributionIdInitializer() + assertThat(initializer.dependencies()).isEmpty() + } } diff --git a/settings.gradle.kts b/settings.gradle.kts index cf53b24..16a2f0f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -26,4 +26,3 @@ dependencyResolutionManagement { rootProject.name = "Android Places Compose" include(":places-compose-demo") include(":places-compose") -include(":library")