Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion library/.gitignore

This file was deleted.

93 changes: 0 additions & 93 deletions library/build.gradle.kts

This file was deleted.

Empty file removed library/consumer-rules.pro
Empty file.
31 changes: 0 additions & 31 deletions library/src/main/AndroidManifest.xml

This file was deleted.

1 change: 0 additions & 1 deletion places-compose-demo/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
41 changes: 41 additions & 0 deletions places-compose/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)
Expand Down
15 changes: 14 additions & 1 deletion places-compose/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,20 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<application>
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="com.google.android.libraries.places.compose.autocomplete.utils.attribution.AttributionIdInitializer"
android:value="androidx.startup" />
</provider>
</application>
</manifest>
Original file line number Diff line number Diff line change
Expand Up @@ -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<Unit> {
override fun create(context: Context) {
MapsApiSettings.addInternalUsageAttributionId(
// context =
context,
// internalUsageAttributionId =
AttributionId.VALUE,
)
Places.addInternalUsageAttributionId(AttributionId.VALUE)
}

override fun dependencies(): List<Class<out Initializer<*>>> = emptyList()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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<Context>()
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()
}
}
1 change: 0 additions & 1 deletion settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,3 @@ dependencyResolutionManagement {
rootProject.name = "Android Places Compose"
include(":places-compose-demo")
include(":places-compose")
include(":library")